From 14cc4cc6cb18b78c5cc7ea43a2836a71788a49d3 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Fri, 20 Jul 2018 23:40:31 -0500 Subject: [PATCH] OpenGL2: Fix world VAO cache drawing when glIndex_t is unsigned short OpenGL ES is only required to support unsigned short for element buffer values. R_DrawElements() firstIndex argument was glIndex_t which caused element indexes to wrap around to 0 when glIndex_t is an unsigned short. (glIndex_t is an index into the vertexes buffer, not element buffer.) Change it to 'int' like tess.firstIndex which is passed to R_DrawElements(). World VAO cache buffer size allowed storing more vertexes than unsigned short glIndex_t could reference. This resulted in the vertex indexes in the element buffer wrapping around to 0. --- code/renderergl2/tr_local.h | 2 +- code/renderergl2/tr_shade.c | 2 +- code/renderergl2/tr_vbo.c | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/code/renderergl2/tr_local.h b/code/renderergl2/tr_local.h index c83f65de..d9c76717 100644 --- a/code/renderergl2/tr_local.h +++ b/code/renderergl2/tr_local.h @@ -2016,7 +2016,7 @@ void RB_EndSurface(void); void RB_CheckOverflow( int verts, int indexes ); #define RB_CHECKOVERFLOW(v,i) if (tess.numVertexes + (v) >= SHADER_MAX_VERTEXES || tess.numIndexes + (i) >= SHADER_MAX_INDEXES ) {RB_CheckOverflow(v,i);} -void R_DrawElements( int numIndexes, glIndex_t firstIndex ); +void R_DrawElements( int numIndexes, int firstIndex ); void RB_StageIteratorGeneric( void ); void RB_StageIteratorSky( void ); void RB_StageIteratorVertexLitTexture( void ); diff --git a/code/renderergl2/tr_shade.c b/code/renderergl2/tr_shade.c index 04eaa755..219efbfd 100644 --- a/code/renderergl2/tr_shade.c +++ b/code/renderergl2/tr_shade.c @@ -38,7 +38,7 @@ R_DrawElements ================== */ -void R_DrawElements( int numIndexes, glIndex_t firstIndex) +void R_DrawElements( int numIndexes, int firstIndex ) { qglDrawElements(GL_TRIANGLES, numIndexes, GL_INDEX_TYPE, BUFFER_OFFSET(firstIndex * sizeof(glIndex_t))); } diff --git a/code/renderergl2/tr_vbo.c b/code/renderergl2/tr_vbo.c index 89e99112..bc37ff02 100644 --- a/code/renderergl2/tr_vbo.c +++ b/code/renderergl2/tr_vbo.c @@ -687,8 +687,13 @@ vcq; // srfVert_t is 60 bytes // assuming each vert is referenced 4 times, need 16 bytes (4 glIndex_t) per vert // -> need about 4/15ths the space for indexes as vertexes +#if GL_INDEX_TYPE == GL_UNSIGNED_SHORT +#define VAOCACHE_VERTEX_BUFFER_SIZE (sizeof(srfVert_t) * USHRT_MAX) +#define VAOCACHE_INDEX_BUFFER_SIZE (sizeof(glIndex_t) * USHRT_MAX * 4) +#else // GL_UNSIGNED_INT #define VAOCACHE_VERTEX_BUFFER_SIZE (16 * 1024 * 1024) #define VAOCACHE_INDEX_BUFFER_SIZE (5 * 1024 * 1024) +#endif typedef struct buffered_s {