Separate mempools for immediate draws.

This commit is contained in:
Rinnegatamante
2020-10-07 10:09:24 +02:00
parent 4b3d9dcd96
commit 08427e8f19
2 changed files with 20 additions and 28 deletions
+5
View File
@@ -22,6 +22,9 @@ extern float *gVertexBuffer;
extern uint16_t *gIndicesPtr;
extern float *gVertexBufferPtr;
float *gVertexBufferIm2D;
uint16_t *gIndicesIm2D;
namespace rw {
namespace gl3 {
#ifndef LIBRW_SDL2
@@ -1382,7 +1385,9 @@ initOpenGL(void)
gVertexBufferPtr = (float*)malloc(0x1800000);
gIndicesPtr = (uint16_t*)malloc(0x600000);
gVertexBuffer = gVertexBufferPtr;
gVertexBufferIm2D = gVertexBufferPtr + 0xC00000;
gIndices = gIndicesPtr;
gIndicesIm2D = gIndicesPtr + 0x300000;
#ifdef RW_GLES2
#include "gl2_shaders/default_vs_gl2.inc"
+15 -28
View File
@@ -16,16 +16,13 @@
#include "rwgl3shader.h"
extern float *gVertexBuffer;
extern float *gVertexBufferIm2D;
extern uint16_t *gIndicesIm2D;
extern uint16_t *gIndices;
namespace rw {
namespace gl3 {
uint32 im2DVbo, im2DIbo;
#ifdef RW_GL_USE_VAOS
uint32 im2DVao;
#endif
Shader *im2dOverrideShader;
static int32 u_xform;
@@ -69,21 +66,11 @@ openIm2D(void)
const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil };
im2dShader = Shader::create(vs, fs);
assert(im2dShader);
glGenBuffers(1, &im2DIbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im2DIbo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, STARTINDICES*2, nil, GL_STREAM_DRAW);
glGenBuffers(1, &im2DVbo);
glBindBuffer(GL_ARRAY_BUFFER, im2DVbo);
glBufferData(GL_ARRAY_BUFFER, STARTVERTICES*sizeof(Im2DVertex), nil, GL_STREAM_DRAW);
}
void
closeIm2D(void)
{
glDeleteBuffers(1, &im2DIbo);
glDeleteBuffers(1, &im2DVbo);
im2dShader->destroy();
im2dShader = nil;
}
@@ -116,9 +103,9 @@ im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices)
Camera *cam;
cam = (Camera*)engine->currentCamera;
memcpy_neon(gVertexBuffer, vertices, numVertices*sizeof(Im2DVertex));
vglVertexPointerMapped(gVertexBuffer);
gVertexBuffer += numVertices*(sizeof(Im2DVertex)/sizeof(float));
memcpy_neon(gVertexBufferIm2D, vertices, numVertices*sizeof(Im2DVertex));
vglVertexPointerMapped(gVertexBufferIm2D);
gVertexBufferIm2D += numVertices*(sizeof(Im2DVertex)/sizeof(float));
xform[0] = 2.0f/cam->frameBuffer->width;
xform[1] = -2.0f/cam->frameBuffer->height;
@@ -147,12 +134,12 @@ im2DRenderIndexedPrimitive(PrimitiveType primType,
cam = (Camera*)engine->currentCamera;
memcpy_neon(gIndices, indices, numIndices * 2);
vglIndexPointerMapped(gIndices);
gIndices += numIndices;
vglIndexPointerMapped(gIndicesIm2D);
gIndicesIm2D += numIndices;
memcpy_neon(gVertexBuffer, vertices, numVertices*(sizeof(Im2DVertex)/sizeof(float)));
vglVertexPointerMapped(gVertexBuffer);
gVertexBuffer += numVertices*(sizeof(Im2DVertex)/sizeof(float));
vglVertexPointerMapped(gVertexBufferIm2D);
gVertexBufferIm2D += numVertices*(sizeof(Im2DVertex)/sizeof(float));
xform[0] = 2.0f/cam->frameBuffer->width;
xform[1] = -2.0f/cam->frameBuffer->height;
@@ -226,9 +213,9 @@ im3DTransform(void *vertices, int32 numVertices, Matrix *world, uint32 flags)
if((flags & im3d::VERTEXUV) == 0)
SetRenderStatePtr(TEXTURERASTER, nil);
memcpy_neon(gVertexBuffer, vertices, numVertices*(sizeof(Im3DVertex)/sizeof(float)));
vglVertexPointerMapped(gVertexBuffer);
gVertexBuffer += numVertices*(sizeof(Im2DVertex)/sizeof(float));
memcpy_neon(gVertexBufferIm2D, vertices, numVertices*(sizeof(Im3DVertex)/sizeof(float)));
vglVertexPointerMapped(gVertexBufferIm2D);
gVertexBufferIm2D += numVertices*(sizeof(Im2DVertex)/sizeof(float));
#ifndef RW_GL_USE_VAOS
setAttribPointers(im3dattribDesc, 3);
@@ -246,9 +233,9 @@ im3DRenderPrimitive(PrimitiveType primType)
void
im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices)
{
memcpy_neon(gIndices, indices, numIndices * 2);
vglIndexPointerMapped(gIndices);
gIndices += numIndices;
memcpy_neon(gIndicesIm2D, indices, numIndices * 2);
vglIndexPointerMapped(gIndicesIm2D);
gIndicesIm2D += numIndices;
flushCache();
vglDrawObjects(primTypeMap[primType], numIndices, GL_FALSE);