Windows: Fix crashing with OpenGL 1.1 windows software rasteriser

This commit is contained in:
UnknownShadow200 2021-10-30 23:21:28 +11:00
parent 98a8baddef
commit 092f3cc1e5

View File

@ -190,12 +190,12 @@ static const struct DynamicLibSym coreFuncs[] = {
static void LoadCoreFuncs(void) { static void LoadCoreFuncs(void) {
GLContext_GetAll(coreFuncs, Array_Elems(coreFuncs)); GLContext_GetAll(coreFuncs, Array_Elems(coreFuncs));
} }
#else
#define glColorPointer _glColorPointer #define _glColorPointer glColorPointer
#define glDrawArrays _glDrawArrays #define _glDrawArrays glDrawArrays
#define glDrawElements _glDrawElements #define _glDrawElements glDrawElements
#define glTexCoordPointer _glTexCoordPointer #define _glTexCoordPointer glTexCoordPointer
#define glVertexPointer _glVertexPointer #define _glVertexPointer glVertexPointer
#endif #endif
@ -471,10 +471,6 @@ static void GLBackend_Init(void) { MakeIndices(gl_indices, GFX_MAX_INDICES); }
#if defined CC_BUILD_WIN && defined(_M_IX86) #if defined CC_BUILD_WIN && defined(_M_IX86)
/* On 32 bit windows, can replace the gl function drawing with these 1.1 fallbacks */ /* On 32 bit windows, can replace the gl function drawing with these 1.1 fallbacks */
/* (note that this only works on 32 bit system, as OpenGL IDs are 32 bit integers) */ /* (note that this only works on 32 bit system, as OpenGL IDs are 32 bit integers) */
static void (APIENTRY *real_drawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
static void (APIENTRY *real_colorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
static void (APIENTRY *real_texCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
static void (APIENTRY *real_vertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
/* fake vertex buffer objects with client side pointers */ /* fake vertex buffer objects with client side pointers */
typedef struct fake_buffer { cc_uint8* data; } fake_buffer; typedef struct fake_buffer { cc_uint8* data; } fake_buffer;
@ -509,33 +505,27 @@ static void APIENTRY fake_bufferSubData(GLenum target, cc_uintptr offset, cc_uin
Mem_Copy(buffer->data, data, size); Mem_Copy(buffer->data, data, size);
} }
/* wglGetProcAddress doesn't work with OpenGL 1.1 software rasteriser, so call GL functions directly */
static void APIENTRY fake_drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) { static void APIENTRY fake_drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) {
real_drawElements(mode, count, type, (cc_uintptr)indices + cur_ib->data); glDrawElements(mode, count, type, (cc_uintptr)indices + cur_ib->data);
} }
static void APIENTRY fake_colorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) { static void APIENTRY fake_colorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) {
real_colorPointer(size, type, stride, (cc_uintptr)pointer + cur_vb->data); glColorPointer(size, type, stride, (cc_uintptr)pointer + cur_vb->data);
} }
static void APIENTRY fake_texCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) { static void APIENTRY fake_texCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) {
real_texCoordPointer(size, type, stride, (cc_uintptr)pointer + cur_vb->data); glTexCoordPointer(size, type, stride, (cc_uintptr)pointer + cur_vb->data);
} }
static void APIENTRY fake_vertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) { static void APIENTRY fake_vertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) {
real_vertexPointer(size, type, stride, (cc_uintptr)pointer + cur_vb->data); glVertexPointer(size, type, stride, (cc_uintptr)pointer + cur_vb->data);
} }
static void OpenGL11Fallback(void) { static void OpenGL11Fallback(void) {
Window_ShowDialog("Performance warning",
"Your system only supports only OpenGL 1.1\n" \
"This is usually caused by graphics drivers not being installed\n\n" \
"As such you will likely experience very poor performance");
_glBindBuffer = fake_bindBuffer; _glDeleteBuffers = fake_deleteBuffers; _glBindBuffer = fake_bindBuffer; _glDeleteBuffers = fake_deleteBuffers;
_glGenBuffers = fake_genBuffers; _glBufferData = fake_bufferData; _glGenBuffers = fake_genBuffers; _glBufferData = fake_bufferData;
_glBufferSubData = fake_bufferSubData; _glBufferSubData = fake_bufferSubData;
real_drawElements = _glDrawElements; _glDrawElements = fake_drawElements; _glDrawElements = fake_drawElements; _glColorPointer = fake_colorPointer;
real_colorPointer = _glColorPointer; _glColorPointer = fake_colorPointer; _glTexCoordPointer = fake_texCoordPointer; _glVertexPointer = fake_vertexPointer;
real_texCoordPointer = _glTexCoordPointer; _glTexCoordPointer = fake_texCoordPointer;
real_vertexPointer = _glVertexPointer; _glVertexPointer = fake_vertexPointer;
} }
#else #else
/* No point in even trying for other systems */ /* No point in even trying for other systems */
@ -593,27 +583,27 @@ static void GLBackend_Init(void) {
#endif #endif
static void GL_SetupVbColoured(void) { static void GL_SetupVbColoured(void) {
glVertexPointer(3, GL_FLOAT, SIZEOF_VERTEX_COLOURED, (void*)(VB_PTR + 0)); _glVertexPointer(3, GL_FLOAT, SIZEOF_VERTEX_COLOURED, (void*)(VB_PTR + 0));
glColorPointer(4, GL_UNSIGNED_BYTE, SIZEOF_VERTEX_COLOURED, (void*)(VB_PTR + 12)); _glColorPointer(4, GL_UNSIGNED_BYTE, SIZEOF_VERTEX_COLOURED, (void*)(VB_PTR + 12));
} }
static void GL_SetupVbTextured(void) { static void GL_SetupVbTextured(void) {
glVertexPointer(3, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + 0)); _glVertexPointer(3, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + 0));
glColorPointer(4, GL_UNSIGNED_BYTE, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + 12)); _glColorPointer(4, GL_UNSIGNED_BYTE, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + 12));
glTexCoordPointer(2, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + 16)); _glTexCoordPointer(2, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + 16));
} }
static void GL_SetupVbColoured_Range(int startVertex) { static void GL_SetupVbColoured_Range(int startVertex) {
cc_uint32 offset = startVertex * SIZEOF_VERTEX_COLOURED; cc_uint32 offset = startVertex * SIZEOF_VERTEX_COLOURED;
glVertexPointer(3, GL_FLOAT, SIZEOF_VERTEX_COLOURED, (void*)(VB_PTR + offset)); _glVertexPointer(3, GL_FLOAT, SIZEOF_VERTEX_COLOURED, (void*)(VB_PTR + offset));
glColorPointer(4, GL_UNSIGNED_BYTE, SIZEOF_VERTEX_COLOURED, (void*)(VB_PTR + offset + 12)); _glColorPointer(4, GL_UNSIGNED_BYTE, SIZEOF_VERTEX_COLOURED, (void*)(VB_PTR + offset + 12));
} }
static void GL_SetupVbTextured_Range(int startVertex) { static void GL_SetupVbTextured_Range(int startVertex) {
cc_uint32 offset = startVertex * SIZEOF_VERTEX_TEXTURED; cc_uint32 offset = startVertex * SIZEOF_VERTEX_TEXTURED;
glVertexPointer(3, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + offset)); _glVertexPointer(3, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + offset));
glColorPointer(4, GL_UNSIGNED_BYTE, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + offset + 12)); _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)); _glTexCoordPointer(2, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + offset + 16));
} }
void Gfx_SetVertexFormat(VertexFormat fmt) { void Gfx_SetVertexFormat(VertexFormat fmt) {
@ -634,7 +624,7 @@ void Gfx_SetVertexFormat(VertexFormat fmt) {
void Gfx_DrawVb_Lines(int verticesCount) { void Gfx_DrawVb_Lines(int verticesCount) {
gfx_setupVBFunc(); gfx_setupVBFunc();
glDrawArrays(GL_LINES, 0, verticesCount); _glDrawArrays(GL_LINES, 0, verticesCount);
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) {
@ -642,7 +632,7 @@ void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) {
if (activeList != gl_DYNAMICLISTID) { glCallList(activeList); return; } if (activeList != gl_DYNAMICLISTID) { glCallList(activeList); return; }
#endif #endif
gfx_setupVBRangeFunc(startVertex); gfx_setupVBRangeFunc(startVertex);
glDrawElements(GL_TRIANGLES, ICOUNT(verticesCount), GL_UNSIGNED_SHORT, IB_PTR); _glDrawElements(GL_TRIANGLES, ICOUNT(verticesCount), GL_UNSIGNED_SHORT, IB_PTR);
} }
void Gfx_DrawVb_IndexedTris(int verticesCount) { void Gfx_DrawVb_IndexedTris(int verticesCount) {
@ -650,7 +640,7 @@ void Gfx_DrawVb_IndexedTris(int verticesCount) {
if (activeList != gl_DYNAMICLISTID) { glCallList(activeList); return; } if (activeList != gl_DYNAMICLISTID) { glCallList(activeList); return; }
#endif #endif
gfx_setupVBFunc(); gfx_setupVBFunc();
glDrawElements(GL_TRIANGLES, ICOUNT(verticesCount), GL_UNSIGNED_SHORT, IB_PTR); _glDrawElements(GL_TRIANGLES, ICOUNT(verticesCount), GL_UNSIGNED_SHORT, IB_PTR);
} }
#ifdef CC_BUILD_GL11 #ifdef CC_BUILD_GL11
@ -658,10 +648,10 @@ void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { glCallList
#else #else
void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) {
cc_uint32 offset = startVertex * SIZEOF_VERTEX_TEXTURED; cc_uint32 offset = startVertex * SIZEOF_VERTEX_TEXTURED;
glVertexPointer(3, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + offset)); _glVertexPointer(3, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + offset));
glColorPointer(4, GL_UNSIGNED_BYTE, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + offset + 12)); _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)); _glTexCoordPointer(2, GL_FLOAT, SIZEOF_VERTEX_TEXTURED, (void*)(VB_PTR + offset + 16));
glDrawElements(GL_TRIANGLES, ICOUNT(verticesCount), GL_UNSIGNED_SHORT, IB_PTR); _glDrawElements(GL_TRIANGLES, ICOUNT(verticesCount), GL_UNSIGNED_SHORT, IB_PTR);
} }
#endif /* !CC_BUILD_GL11 */ #endif /* !CC_BUILD_GL11 */
#endif #endif