mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-05 03:24:56 +08:00
ref: gl: fix crash in gl2_shim caused by MapBufferRange returning NULL
This commit is contained in:
@@ -465,8 +465,35 @@ static void GL2_InitTriQuads( void )
|
|||||||
rpglBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, 0 );
|
rpglBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GL2_InitIncrementalBuffer( int i, GLuint size )
|
static void GL2_FreeIncrementalBufferAttr( int i, int valid_mappings )
|
||||||
{
|
{
|
||||||
|
if( gl2wrap.attrbufobj[i] )
|
||||||
|
{
|
||||||
|
if( gl2wrap_config.buf_storage )
|
||||||
|
{
|
||||||
|
for( int j = 0; j < valid_mappings; j++ )
|
||||||
|
{
|
||||||
|
rpglBindBufferARB( GL_ARRAY_BUFFER_ARB, gl2wrap.attrbufobj[i][j] );
|
||||||
|
pglUnmapBufferARB( GL_ARRAY_BUFFER_ARB );
|
||||||
|
}
|
||||||
|
|
||||||
|
rpglBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
pglDeleteBuffersARB( gl2wrap_config.cycle_buffers, gl2wrap.attrbufobj[i] );
|
||||||
|
Mem_Free( gl2wrap.attrbufobj[i] );
|
||||||
|
gl2wrap.attrbufobj[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mem_Free( gl2wrap.mappings[i] );
|
||||||
|
gl2wrap.mappings[i] = NULL;
|
||||||
|
gl2wrap.attrbuf[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static qboolean GL2_InitIncrementalBuffer( int i, GLuint size )
|
||||||
|
{
|
||||||
|
int valid_j = 0;
|
||||||
|
|
||||||
gl2wrap.attrbufobj[i] = Mem_Calloc( r_temppool, gl2wrap_config.cycle_buffers * sizeof( GLuint ));
|
gl2wrap.attrbufobj[i] = Mem_Calloc( r_temppool, gl2wrap_config.cycle_buffers * sizeof( GLuint ));
|
||||||
if( gl2wrap_config.buf_storage )
|
if( gl2wrap_config.buf_storage )
|
||||||
gl2wrap.mappings[i] = Mem_Calloc( r_temppool, gl2wrap_config.cycle_buffers * sizeof( void * ));
|
gl2wrap.mappings[i] = Mem_Calloc( r_temppool, gl2wrap_config.cycle_buffers * sizeof( void * ));
|
||||||
@@ -481,12 +508,23 @@ static void GL2_InitIncrementalBuffer( int i, GLuint size )
|
|||||||
GL_MAP_PERSISTENT_BIT | MB( gl2wrap_config.coherent, COHERENT );
|
GL_MAP_PERSISTENT_BIT | MB( gl2wrap_config.coherent, COHERENT );
|
||||||
pglBufferStorage( GL_ARRAY_BUFFER_ARB, size, NULL, GL_MAP_WRITE_BIT | MB( gl2wrap_config.coherent, COHERENT ) | GL_MAP_PERSISTENT_BIT );
|
pglBufferStorage( GL_ARRAY_BUFFER_ARB, size, NULL, GL_MAP_WRITE_BIT | MB( gl2wrap_config.coherent, COHERENT ) | GL_MAP_PERSISTENT_BIT );
|
||||||
gl2wrap.mappings[i][j] = pglMapBufferRange( GL_ARRAY_BUFFER_ARB, 0, size, flags );
|
gl2wrap.mappings[i][j] = pglMapBufferRange( GL_ARRAY_BUFFER_ARB, 0, size, flags );
|
||||||
|
if( !gl2wrap.mappings[i][j] )
|
||||||
|
{
|
||||||
|
gEngfuncs.Con_Printf( S_ERROR "%s: pglMapBufferRange failed for attr %d, buffer %d\n", __func__, i, j );
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
valid_j = j + 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
pglBufferDataARB( GL_ARRAY_BUFFER_ARB, size, NULL, GL_STREAM_DRAW_ARB );
|
pglBufferDataARB( GL_ARRAY_BUFFER_ARB, size, NULL, GL_STREAM_DRAW_ARB );
|
||||||
}
|
}
|
||||||
if( gl2wrap_config.buf_storage )
|
if( gl2wrap_config.buf_storage )
|
||||||
gl2wrap.attrbuf[i] = gl2wrap.mappings[i][0];
|
gl2wrap.attrbuf[i] = gl2wrap.mappings[i][0];
|
||||||
|
return true;
|
||||||
|
|
||||||
|
err:
|
||||||
|
GL2_FreeIncrementalBufferAttr( i, valid_j );
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -601,6 +639,7 @@ int GL2_ShimInit( void )
|
|||||||
|
|
||||||
total = 0;
|
total = 0;
|
||||||
|
|
||||||
|
init_attrbufs:
|
||||||
for( int i = 0; i < GL2_ATTR_MAX; ++i )
|
for( int i = 0; i < GL2_ATTR_MAX; ++i )
|
||||||
{
|
{
|
||||||
GLuint size = GL2_MAX_VERTS * gl2wrap_attr_size[i] * sizeof( GLfloat );
|
GLuint size = GL2_MAX_VERTS * gl2wrap_attr_size[i] * sizeof( GLfloat );
|
||||||
@@ -611,7 +650,20 @@ int GL2_ShimInit( void )
|
|||||||
|
|
||||||
if( gl2wrap_config.incremental )
|
if( gl2wrap_config.incremental )
|
||||||
{
|
{
|
||||||
GL2_InitIncrementalBuffer( i, size );
|
if( !GL2_InitIncrementalBuffer( i, size ))
|
||||||
|
{
|
||||||
|
for( int k = 0; k < i; k++ )
|
||||||
|
GL2_FreeIncrementalBufferAttr( k, gl2wrap_config.cycle_buffers );
|
||||||
|
gEngfuncs.Con_Printf( S_WARN "%s: falling back without buf_storage/incremental\n", __func__ );
|
||||||
|
gl2wrap_config.buf_storage = false;
|
||||||
|
gl2wrap_config.incremental = false;
|
||||||
|
if( !gEngfuncs.Sys_CheckParm( "-vao" ) && glConfig.context != CONTEXT_TYPE_GL_CORE ) // keep vao_mandatory for users who requested VAO
|
||||||
|
gl2wrap_config.vao_mandatory = false;
|
||||||
|
if( !gl2wrap_config.vao_mandatory )
|
||||||
|
gl2wrap_config.cycle_buffers = 1;
|
||||||
|
total = 0;
|
||||||
|
goto init_attrbufs;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user