From 49beb6b74bce839f414b6ea9ad655f4a0c72a801 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Thu, 9 Apr 2026 23:39:28 -0500 Subject: [PATCH] gl: Fix GL vertex array client state handling --- src/hardware/r_opengl/r_opengl.cpp | 47 ++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.cpp b/src/hardware/r_opengl/r_opengl.cpp index de017cc60..25efbd526 100644 --- a/src/hardware/r_opengl/r_opengl.cpp +++ b/src/hardware/r_opengl/r_opengl.cpp @@ -1385,6 +1385,14 @@ void SetStates(void) pglLoadIdentity(); pglScalef(1.0f, 1.0f, -1.0f); pglGetFloatv(GL_MODELVIEW_MATRIX, modelMatrix); // added for new coronas' code (without depth buffer) + + pglBindBuffer(GL_ARRAY_BUFFER, 0); + pglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + pglDisableClientState(GL_VERTEX_ARRAY); + pglDisableClientState(GL_TEXTURE_COORD_ARRAY); + pglDisableClientState(GL_NORMAL_ARRAY); + pglDisableClientState(GL_COLOR_ARRAY); + SetShader(SHADER_NONE); } @@ -1646,12 +1654,14 @@ EXPORT void HWRAPI(Draw2DLine) (F2DCoord * v1, p[6] = v2->x + dx; p[7] = -(v2->y - dy); p[8] = 1; p[9] = v1->x + dx; p[10] = -(v1->y - dy); p[11] = 1; - pglDisableClientState(GL_TEXTURE_COORD_ARRAY); pglColor4ubv((GLubyte*)&Color.s); pglVertexPointer(3, GL_FLOAT, 0, p); - pglDrawArrays(GL_TRIANGLE_FAN, 0, 4); - pglEnableClientState(GL_TEXTURE_COORD_ARRAY); + pglEnableClientState(GL_VERTEX_ARRAY); + pglBindBuffer(GL_ARRAY_BUFFER, 0); + pglDrawArrays(GL_TRIANGLE_FAN, 0, 4); + pglDisableClientState(GL_VERTEX_ARRAY); + pglEnable(GL_TEXTURE_2D); } @@ -2472,7 +2482,14 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUI pglVertexPointer(3, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].x); pglTexCoordPointer(2, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].s); + + pglEnableClientState(GL_VERTEX_ARRAY); + pglEnableClientState(GL_TEXTURE_COORD_ARRAY); + pglBindBuffer(GL_ARRAY_BUFFER, 0); + pglDrawArrays(PolyFlags & PF_WireFrame ? GL_LINES : GL_TRIANGLE_FAN, 0, iNumPts); + pglDisableClientState(GL_VERTEX_ARRAY); + pglDisableClientState(GL_TEXTURE_COORD_ARRAY); if (PolyFlags & PF_RemoveYWrap) pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); @@ -2490,7 +2507,14 @@ EXPORT void HWRAPI(DrawIndexedTriangles) (FSurfaceInfo *pSurf, FOutVector *pOutV pglVertexPointer(3, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].x); pglTexCoordPointer(2, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].s); + + pglEnableClientState(GL_VERTEX_ARRAY); + pglEnableClientState(GL_TEXTURE_COORD_ARRAY); + pglBindBuffer(GL_ARRAY_BUFFER, 0); + pglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); pglDrawElements(GL_TRIANGLES, iNumPts, GL_UNSIGNED_INT, IndexArray); + pglDisableClientState(GL_VERTEX_ARRAY); + pglDisableClientState(GL_TEXTURE_COORD_ARRAY); // the DrawPolygon variant of this has some code about polyflags and wrapping here but havent noticed any problems from omitting it? } @@ -2542,7 +2566,9 @@ EXPORT void HWRAPI(RenderSkyDome) (gl_sky_t *sky) pglTexCoordPointer(2, GL_FLOAT, sizeof(sky->data[0]), sky_vbo_u); pglColorPointer(4, GL_UNSIGNED_BYTE, sizeof(sky->data[0]), sky_vbo_r); - // activate color arrays + // activate client states + pglEnableClientState(GL_VERTEX_ARRAY); + pglEnableClientState(GL_TEXTURE_COORD_ARRAY); pglEnableClientState(GL_COLOR_ARRAY); // set transforms @@ -2582,7 +2608,9 @@ EXPORT void HWRAPI(RenderSkyDome) (gl_sky_t *sky) if (gl_ext_arb_vertex_buffer_object) pglBindBuffer(GL_ARRAY_BUFFER, 0); - // deactivate color array + // deactivate client states + pglDisableClientState(GL_VERTEX_ARRAY); + pglDisableClientState(GL_TEXTURE_COORD_ARRAY); pglDisableClientState(GL_COLOR_ARRAY); } @@ -3000,6 +3028,8 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, float duration, float memcmp(&(model->vbo_max_t), &(model->max_t), sizeof(model->max_t)) != 0) useVBO = false; + pglEnableClientState(GL_VERTEX_ARRAY); + pglEnableClientState(GL_TEXTURE_COORD_ARRAY); pglEnableClientState(GL_NORMAL_ARRAY); for (i = 0; i < model->numMeshes; i++) @@ -3019,6 +3049,7 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, float duration, float if (useVBO) { pglBindBuffer(GL_ARRAY_BUFFER, frame->vboID); + pglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); pglVertexPointer(3, GL_SHORT, sizeof(vbotiny_t), BUFFER_OFFSET(0)); pglNormalPointer(GL_BYTE, sizeof(vbotiny_t), BUFFER_OFFSET(sizeof(short)*3)); pglTexCoordPointer(2, GL_FLOAT, sizeof(vbotiny_t), BUFFER_OFFSET(sizeof(short) * 3 + sizeof(char) * 6)); @@ -3028,6 +3059,8 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, float duration, float } else { + pglBindBuffer(GL_ARRAY_BUFFER, 0); + pglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); pglVertexPointer(3, GL_SHORT, 0, frame->vertices); pglNormalPointer(GL_BYTE, 0, frame->normals); pglTexCoordPointer(2, GL_FLOAT, 0, mesh->uvs); @@ -3052,6 +3085,8 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, float duration, float *normPtr++ = (char)(frame->normals[j] + (pol * (nextframe->normals[j] - frame->normals[j]))); } + pglBindBuffer(GL_ARRAY_BUFFER, 0); + pglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); pglVertexPointer(3, GL_SHORT, 0, vertTinyBuffer); pglNormalPointer(GL_BYTE, 0, normTinyBuffer); pglTexCoordPointer(2, GL_FLOAT, 0, mesh->uvs); @@ -3115,6 +3150,8 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, float duration, float } } + pglDisableClientState(GL_VERTEX_ARRAY); + pglDisableClientState(GL_TEXTURE_COORD_ARRAY); pglDisableClientState(GL_NORMAL_ARRAY); pglPopMatrix(); // should be the same as glLoadIdentity