From 2dab8f427efc98b054a1d0b4498080918c6545a5 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Tue, 20 Jul 2021 08:59:26 +1000 Subject: [PATCH] Make OpenGL 1.5/1.2+VBO backend almost work with 1.1 too, just slower --- src/Graphics_GL.c | 63 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/src/Graphics_GL.c b/src/Graphics_GL.c index f4a936b5e..263dfb6a7 100644 --- a/src/Graphics_GL.c +++ b/src/Graphics_GL.c @@ -1103,13 +1103,54 @@ void Gfx_DrawVb_IndexedTris(int verticesCount) { glDrawElements(GL_TRIANGLES, ICOUNT(verticesCount), GL_UNSIGNED_SHORT, IB_PTR); } -#ifndef CC_BUILD_GL11 +#ifdef CC_BUILD_GL11 +void Gfx_DrawIndexedTris_T2fC4b(int list, int ignored) { glCallList(list); } + +static void GL_CheckSupport(void) { MakeIndices(gl_indices, GFX_MAX_INDICES); } +#else void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { cc_uint32 offset = startVertex * SIZEOF_VERTEX_TEXTURED; - glVertexPointer(3, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(offset)); - glColorPointer(4, GL_UNSIGNED_BYTE, SIZEOF_VERTEX_TEXTURED, (void*)(offset + 12)); - glTexCoordPointer(2, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(offset + 16)); - glDrawElements(GL_TRIANGLES, ICOUNT(verticesCount), GL_UNSIGNED_SHORT, NULL); + glVertexPointer(3, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + offset)); + glColorPointer(4, GL_UNSIGNED_BYTE, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + offset + 12)); + glTexCoordPointer(2, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + offset + 16)); + glDrawElements(GL_TRIANGLES, ICOUNT(verticesCount), GL_UNSIGNED_SHORT, IB_PTR); +} + + +/*########################################################################################################################* +*-------------------------------------------------------Compatibility-----------------------------------------------------* +*#########################################################################################################################*/ +/* fake vertex buffer objects with client side pointers */ +typedef struct fake_buffer { cc_uint8* data; } fake_buffer; +static fake_buffer* cur_ib; +static fake_buffer* cur_vb; +#define fake_GetBuffer(target) (target == _GL_ELEMENT_ARRAY_BUFFER ? &cur_ib : &cur_vb); + +static void APIENTRY fake_glBindBuffer(GLenum target, GLuint src) { + fake_buffer** buffer = fake_GetBuffer(target); + *buffer = (fake_buffer*)src; +} + +static void APIENTRY fake_glDeleteBuffers(GLsizei n, const GLuint *buffers) { + Mem_Free((void*)buffers[0]); +} + +static void APIENTRY fake_glGenBuffers(GLsizei n, GLuint *buffers) { + fake_buffer* buffer = (fake_buffer*)Mem_TryAlloc(1, sizeof(fake_buffer)); + buffer->data = NULL; + buffers[0] = (GLuint)buffer; +} + +static void APIENTRY fake_glBufferData(GLenum target, cc_uintptr size, const GLvoid* data, GLenum usage) { + fake_buffer* buffer = *fake_GetBuffer(target); + Mem_Free(buffer->data); + + buffer->data = Mem_TryAlloc(size, 1); + if (data) Mem_Copy(buffer->data, data, size); +} +static void APIENTRY fake_glBufferSubData(GLenum target, cc_uintptr offset, cc_uintptr size, const GLvoid* data) { + fake_buffer* buffer = *fake_GetBuffer(target); + Mem_Copy(buffer->data, data, size); } static void GL_CheckSupport(void) { @@ -1138,15 +1179,13 @@ static void GL_CheckSupport(void) { } else { Logger_Abort("Only OpenGL 1.1 supported.\n\n" \ "Compile the game with CC_BUILD_GL11, or ask on the ClassiCube forums for it"); + + _glBindBuffer = fake_glBindBuffer; _glDeleteBuffers = fake_glDeleteBuffers; + _glGenBuffers = fake_glGenBuffers; _glBufferData = fake_glBufferData; + _glBufferSubData = fake_glBufferSubData; } customMipmapsLevels = true; } -#else -void Gfx_DrawIndexedTris_T2fC4b(int list, int ignored) { glCallList(list); } - -static void GL_CheckSupport(void) { - MakeIndices(gl_indices, GFX_MAX_INDICES); -} -#endif /* CC_BUILD_GL11 */ +#endif /* !CC_BUILD_GL11 */ #endif /* !CC_BUILD_GLMODERN */ #endif