citro3d/source/vbo.c

50 lines
1.0 KiB
C
Raw Normal View History

2014-12-20 21:34:19 +01:00
#include <c3d/buffers.h>
#include <string.h>
#include "context.h"
bool C3D_VBOInit(C3D_VBO* vbo, size_t capacity)
{
if (vbo->data) return false;
vbo->data = linearAlloc(capacity);
if (!vbo->data) return false;
vbo->capacity = capacity;
vbo->size = 0;
vbo->vertexCount = 0;
return true;
}
bool C3D_VBOAddData(C3D_VBO* vbo, const void* data, size_t size, int vertexCount)
{
size_t remaining = vbo->capacity - vbo->size;
if (remaining < size) return false;
memcpy((u8*)vbo->data + vbo->size, data, size);
vbo->size += size;
vbo->vertexCount += vertexCount;
return true;
}
void C3D_VBOFlush(C3D_VBO* vbo)
{
if (vbo->data)
GSPGPU_FlushDataCache(vbo->data, vbo->size);
2014-12-20 21:34:19 +01:00
}
void C3D_VBOBind(C3D_VBO* vbo)
{
C3D_Context* ctx = C3Di_GetContext();
if (!(ctx->flags & C3DiF_Active))
return;
ctx->vboPos = osConvertVirtToPhys((u32)vbo->data);
2015-03-05 18:20:39 +01:00
GPUCMD_AddWrite(GPUREG_ATTRIBBUFFERS_LOC, ctx->vboPos >> 3);
2014-12-20 21:34:19 +01:00
}
void C3D_VBODelete(C3D_VBO* vbo)
{
if (!vbo->data) return;
linearFree(vbo->data);
vbo->data = NULL;
}