mirror of
https://github.com/YGGverse/xash3d-fwgs.git
synced 2025-01-12 08:08:02 +00:00
ref_gl: workaround freezes on adreno with vbo on dlighted decals
This commit is contained in:
parent
b290046503
commit
a488f79852
@ -2348,11 +2348,14 @@ static void R_SetupVBOArrayDlight( vboarray_t *vbo, texture_t *texture )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SPARSE_DECALS_UPLOAD 0
|
||||||
|
|
||||||
|
static void R_SetupVBOArrayDecalDlight( int decalcount )
|
||||||
static void R_SetupVBOArrayDecalDlight( void )
|
|
||||||
{
|
{
|
||||||
pglBindBufferARB( GL_ARRAY_BUFFER_ARB, vbos.decal_dlight_vbo );
|
pglBindBufferARB( GL_ARRAY_BUFFER_ARB, vbos.decal_dlight_vbo );
|
||||||
|
#if !SPARSE_DECALS_UPLOAD
|
||||||
|
pglBufferDataARB( GL_ARRAY_BUFFER_ARB, sizeof( vbovertex_t ) * DECAL_VERTS_MAX * decalcount, vbos.decal_dlight , GL_STREAM_DRAW_ARB );
|
||||||
|
#endif
|
||||||
R_SetDecalMode( true );
|
R_SetDecalMode( true );
|
||||||
// hack: fix decal dlights on gl_vbo_details == 2 (wrong state??)
|
// hack: fix decal dlights on gl_vbo_details == 2 (wrong state??)
|
||||||
/*if( mtst.details_enabled && mtst.tmu_dt != -1 )
|
/*if( mtst.details_enabled && mtst.tmu_dt != -1 )
|
||||||
@ -2464,7 +2467,7 @@ static void R_DrawDlightedDecals( vboarray_t *vbo, msurface_t *newsurf, msurface
|
|||||||
if( RI.currententity->curstate.rendermode == kRenderTransAlpha )
|
if( RI.currententity->curstate.rendermode == kRenderTransAlpha )
|
||||||
pglDisable( GL_ALPHA_TEST );
|
pglDisable( GL_ALPHA_TEST );
|
||||||
|
|
||||||
R_SetupVBOArrayDecalDlight();
|
R_SetupVBOArrayDecalDlight( decalcount );
|
||||||
|
|
||||||
for( decalsurf = newsurf; ( decali < decalcount ) && (!surf ||( decalsurf != surf )); decalsurf = decalsurf->info->lightmapchain )
|
for( decalsurf = newsurf; ( decali < decalcount ) && (!surf ||( decalsurf != surf )); decalsurf = decalsurf->info->lightmapchain )
|
||||||
{
|
{
|
||||||
@ -2502,8 +2505,10 @@ static void R_DrawDlightedDecals( vboarray_t *vbo, msurface_t *newsurf, msurface
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if SPARSE_DECALS_UPLOAD
|
||||||
if( vbos.decal_dlight_vbo )
|
if( vbos.decal_dlight_vbo )
|
||||||
pglBufferDataARB( GL_ARRAY_BUFFER_ARB, sizeof( vbos.decal_dlight ), NULL, GL_STREAM_DRAW_ARB );
|
pglBufferDataARB( GL_ARRAY_BUFFER_ARB, sizeof( vbos.decal_dlight ), NULL, GL_STREAM_DRAW_ARB );
|
||||||
|
#endif
|
||||||
|
|
||||||
// restore states pointers for next dynamic lightmap
|
// restore states pointers for next dynamic lightmap
|
||||||
pglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
|
pglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
|
||||||
@ -2550,11 +2555,17 @@ static void R_FlushDlights( vboarray_t *vbo, int min_index, int max_index, int d
|
|||||||
pglDrawElements( GL_TRIANGLES, dlightindex, GL_VBOINDEX_TYPE, dlightarray );
|
pglDrawElements( GL_TRIANGLES, dlightindex, GL_VBOINDEX_TYPE, dlightarray );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void R_AddSurfaceDecalsDlight( msurface_t *surf, int *pdecalcount )
|
static void R_AddSurfaceDecalsDlight( msurface_t *surf, int *pdecalcount )
|
||||||
{
|
{
|
||||||
decal_t *pdecal;
|
decal_t *pdecal;
|
||||||
int decalcount = *pdecalcount;
|
int decalcount = *pdecalcount;
|
||||||
|
#if SPARSE_DECALS_UPLOAD
|
||||||
|
if( decalcount == 0 )
|
||||||
|
{
|
||||||
|
pglBindBufferARB( GL_ARRAY_BUFFER_ARB, vbos.decal_dlight_vbo );
|
||||||
|
pglBufferDataARB( GL_ARRAY_BUFFER_ARB, sizeof( vbos.decal_dlight ), NULL, GL_STREAM_DRAW_ARB );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
for( pdecal = surf->pdecals; pdecal; pdecal = pdecal->pnext )
|
for( pdecal = surf->pdecals; pdecal; pdecal = pdecal->pnext )
|
||||||
{
|
{
|
||||||
int decalindex = pdecal - &gDecalPool[0];
|
int decalindex = pdecal - &gDecalPool[0];
|
||||||
@ -2587,11 +2598,13 @@ static void R_AddSurfaceDecalsDlight( msurface_t *surf, int *pdecalcount )
|
|||||||
vbos.decal_dlight[decalcount * DECAL_VERTS_MAX + i].lm_tc[1] = vbos.decaldata->decalarray[decalindex * DECAL_VERTS_CUT + i].lm_tc[1] - ( surf->light_t - surf->info->dlight_t ) * ( 1.0f / (float)BLOCK_SIZE );
|
vbos.decal_dlight[decalcount * DECAL_VERTS_MAX + i].lm_tc[1] = vbos.decaldata->decalarray[decalindex * DECAL_VERTS_CUT + i].lm_tc[1] - ( surf->light_t - surf->info->dlight_t ) * ( 1.0f / (float)BLOCK_SIZE );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if SPARSE_DECALS_UPLOAD
|
||||||
if( vbos.dlight_vbo )
|
if( vbos.dlight_vbo )
|
||||||
{
|
{
|
||||||
pglBindBufferARB( GL_ARRAY_BUFFER_ARB, vbos.decal_dlight_vbo );
|
pglBindBufferARB( GL_ARRAY_BUFFER_ARB, vbos.decal_dlight_vbo );
|
||||||
pglBufferSubDataARB( GL_ARRAY_BUFFER_ARB, sizeof( vbovertex_t ) * decalcount * DECAL_VERTS_MAX, sizeof( vbovertex_t )* numVerts, vbos.decal_dlight + decalcount * DECAL_VERTS_MAX );
|
pglBufferSubDataARB( GL_ARRAY_BUFFER_ARB, sizeof( vbovertex_t ) * decalcount * DECAL_VERTS_MAX, sizeof( vbovertex_t )* numVerts, vbos.decal_dlight + decalcount * DECAL_VERTS_MAX );
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
vbos.decal_numverts[decalcount] = numVerts;
|
vbos.decal_numverts[decalcount] = numVerts;
|
||||||
decalcount++;
|
decalcount++;
|
||||||
|
Loading…
Reference in New Issue
Block a user