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)
|
2015-09-06 22:08:28 +02:00
|
|
|
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;
|
|
|
|
}
|