From 08427e8f198945908dce9dd48e06ba20af07b966 Mon Sep 17 00:00:00 2001 From: Rinnegatamante Date: Wed, 7 Oct 2020 10:09:24 +0200 Subject: [PATCH] Separate mempools for immediate draws. --- src/gl/gl3device.cpp | 5 +++++ src/gl/gl3immed.cpp | 43 +++++++++++++++---------------------------- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/gl/gl3device.cpp b/src/gl/gl3device.cpp index 5dcb588..c867872 100644 --- a/src/gl/gl3device.cpp +++ b/src/gl/gl3device.cpp @@ -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" diff --git a/src/gl/gl3immed.cpp b/src/gl/gl3immed.cpp index 41f4167..2822e61 100644 --- a/src/gl/gl3immed.cpp +++ b/src/gl/gl3immed.cpp @@ -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);