Skip to content

Commit

Permalink
Disable VAO cache under Emscripten
Browse files Browse the repository at this point in the history
The VAO surface cache uses bufferSubData and triggers a very slow path
in some GLES implementations. Specifically I have observed 10x frame
times with ANGLE/Metal on macOS and with Mali on Android.
  • Loading branch information
jdarpinian committed Jul 7, 2024
1 parent e505e34 commit 6385480
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 0 deletions.
4 changes: 4 additions & 0 deletions code/renderergl1/tr_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,8 @@ cvar_t *r_saveFontData;

cvar_t *r_marksOnTriangleMeshes;

cvar_t *r_disableStaticSurfaceVaoCache;

cvar_t *r_aviMotionJpegQuality;
cvar_t *r_screenshotJpegQuality;

Expand Down Expand Up @@ -1146,6 +1148,8 @@ void R_Register( void )

r_marksOnTriangleMeshes = ri.Cvar_Get("r_marksOnTriangleMeshes", "0", CVAR_ARCHIVE);

r_disableStaticSurfaceVaoCache = ri.Cvar_Get("r_disableStaticSurfaceVaoCache", "0", CVAR_ARCHIVE);

r_aviMotionJpegQuality = ri.Cvar_Get("r_aviMotionJpegQuality", "90", CVAR_ARCHIVE);
r_screenshotJpegQuality = ri.Cvar_Get("r_screenshotJpegQuality", "90", CVAR_ARCHIVE);

Expand Down
11 changes: 11 additions & 0 deletions code/renderergl2/tr_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,8 @@ cvar_t *r_saveFontData;

cvar_t *r_marksOnTriangleMeshes;

cvar_t *r_disableStaticSurfaceVaoCache;

cvar_t *r_aviMotionJpegQuality;
cvar_t *r_screenshotJpegQuality;

Expand Down Expand Up @@ -1433,6 +1435,15 @@ void R_Register( void )

r_marksOnTriangleMeshes = ri.Cvar_Get("r_marksOnTriangleMeshes", "0", CVAR_ARCHIVE);

#ifdef __EMSCRIPTEN__
// The vao cache's use of bufferSubData hits pathological slow paths (10x
// slower) in some GLES drivers. Two known examples are ANGLE/Metal on
// macOS and Mali on Android.
r_disableStaticSurfaceVaoCache = ri.Cvar_Get("r_disableStaticSurfaceVaoCache", "1", CVAR_ARCHIVE);
#else
r_disableStaticSurfaceVaoCache = ri.Cvar_Get("r_disableStaticSurfaceVaoCache", "0", CVAR_ARCHIVE);
#endif

r_aviMotionJpegQuality = ri.Cvar_Get("r_aviMotionJpegQuality", "90", CVAR_ARCHIVE);
r_screenshotJpegQuality = ri.Cvar_Get("r_screenshotJpegQuality", "90", CVAR_ARCHIVE);

Expand Down
2 changes: 2 additions & 0 deletions code/renderergl2/tr_local.h
Original file line number Diff line number Diff line change
Expand Up @@ -1848,6 +1848,8 @@ extern cvar_t *r_printShaders;

extern cvar_t *r_marksOnTriangleMeshes;

extern cvar_t *r_disableStaticSurfaceVaoCache;

//====================================================================

static ID_INLINE qboolean ShaderRequiresCPUDeforms(const shader_t * shader)
Expand Down
3 changes: 3 additions & 0 deletions code/renderergl2/tr_surface.c
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,9 @@ static qboolean RB_SurfaceVaoCached(int numVerts, srfVert_t *verts, int numIndex
qboolean recycleIndexBuffer = qfalse;
qboolean endSurface = qfalse;

if (r_disableStaticSurfaceVaoCache->integer)
return qfalse;

if (!(!ShaderRequiresCPUDeforms(tess.shader) && !tess.shader->isSky && !tess.shader->isPortal))
return qfalse;

Expand Down

0 comments on commit 6385480

Please sign in to comment.