diff --git a/src/engine/renderer/glsl_source/vertexSkinning_vp.glsl b/src/engine/renderer/glsl_source/vertexSkinning_vp.glsl index 71121ef2d3..bff3d05648 100644 --- a/src/engine/renderer/glsl_source/vertexSkinning_vp.glsl +++ b/src/engine/renderer/glsl_source/vertexSkinning_vp.glsl @@ -39,10 +39,17 @@ void VertexFetch(out vec4 position, out vec2 lmCoord) { const float scale = 1.0 / 256.0; + const float weightScale = 1.0 / 255.0; localBasis inLB; - ivec4 idx = 2 * ( ivec4(attr_BoneFactors) >> 8 ); - vec4 weights = ( ivec4(attr_BoneFactors) & 0xFF ) / 255.0; + // Unpack data from "bone factors". This used to have the index in the high byte and the weight + // in the low byte, which may seem a bit more logical, but it triggered issues with some + // Nvidia shader compilers (https://github.com/DaemonEngine/Daemon/issues/472). + vec4 ipart = floor( attr_BoneFactors * scale ); + vec4 fpart = attr_BoneFactors * scale - ipart; + // idx = 2 times the original bone index (the index input to boneFactor) + ivec4 idx = ivec4( fpart * 512.0 ); + vec4 weights = ipart * weightScale; vec4 quat = u_Bones[ idx.x ]; vec4 trans = u_Bones[ idx.x + 1 ]; diff --git a/src/engine/renderer/tr_backend.cpp b/src/engine/renderer/tr_backend.cpp index b69f698309..420b71a4c9 100644 --- a/src/engine/renderer/tr_backend.cpp +++ b/src/engine/renderer/tr_backend.cpp @@ -1368,7 +1368,7 @@ static void RB_SetupLightForShadowing( trRefLight_t *light, int index, tr.shadowCubeFBOImage[ light->shadowLOD ]->texnum, 0 ); } - if ( !r_ignoreGLErrors->integer ) + if ( checkGLErrors() ) { R_CheckFBO( tr.shadowMapFBO[ light->shadowLOD ] ); } @@ -1488,7 +1488,7 @@ static void RB_SetupLightForShadowing( trRefLight_t *light, int index, R_AttachFBOTexture2D( GL_TEXTURE_2D, tr.shadowMapFBOImage[ light->shadowLOD ]->texnum, 0 ); } - if ( !r_ignoreGLErrors->integer ) + if ( checkGLErrors() ) { R_CheckFBO( tr.shadowMapFBO[ light->shadowLOD ] ); } @@ -1540,7 +1540,7 @@ static void RB_SetupLightForShadowing( trRefLight_t *light, int index, R_AttachFBOTextureDepth( tr.sunShadowMapFBOImage[ splitFrustumIndex ]->texnum ); } - if ( !r_ignoreGLErrors->integer ) + if ( checkGLErrors() ) { R_CheckFBO( tr.sunShadowMapFBO[ splitFrustumIndex ] ); } @@ -1983,7 +1983,7 @@ static void RB_BlurShadowMap( const trRefLight_t *light, int i ) R_BindFBO( fbos[ index ] ); R_AttachFBOTexture2D( images[ index + MAX_SHADOWMAPS ]->type, images[ index + MAX_SHADOWMAPS ]->texnum, 0 ); - if ( !r_ignoreGLErrors->integer ) + if ( checkGLErrors() ) { R_CheckFBO( fbos[ index ] ); } diff --git a/src/engine/renderer/tr_cmds.cpp b/src/engine/renderer/tr_cmds.cpp index be572cce6a..541cde1c40 100644 --- a/src/engine/renderer/tr_cmds.cpp +++ b/src/engine/renderer/tr_cmds.cpp @@ -811,7 +811,7 @@ void RE_BeginFrame() } // check for errors - if ( !r_ignoreGLErrors->integer ) + if ( checkGLErrors() ) { R_SyncRenderThread(); GL_CheckErrors_( __FILE__, __LINE__ ); diff --git a/src/engine/renderer/tr_init.cpp b/src/engine/renderer/tr_init.cpp index 17a74d22a2..3c0823373e 100644 --- a/src/engine/renderer/tr_init.cpp +++ b/src/engine/renderer/tr_init.cpp @@ -98,7 +98,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA cvar_t *r_arb_texture_gather; cvar_t *r_arb_gpu_shader5; - cvar_t *r_ignoreGLErrors; + cvar_t *r_checkGLErrors; cvar_t *r_logFile; cvar_t *r_stencilbits; @@ -379,7 +379,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA int err; char s[ 128 ]; - if ( r_ignoreGLErrors->integer ) + if ( !checkGLErrors() ) { return; } @@ -1106,7 +1106,7 @@ ScreenshotCmd screenshotPNGRegistration("screenshotPNG", ssFormat_t::SSF_PNG, "p r_lodBias = ri.Cvar_Get( "r_lodBias", "0", 0 ); r_znear = ri.Cvar_Get( "r_znear", "3", CVAR_CHEAT ); r_zfar = ri.Cvar_Get( "r_zfar", "0", CVAR_CHEAT ); - r_ignoreGLErrors = ri.Cvar_Get( "r_ignoreGLErrors", "0", 0 ); + r_checkGLErrors = ri.Cvar_Get( "r_checkGLErrors", "-1", 0 ); r_fastsky = ri.Cvar_Get( "r_fastsky", "0", CVAR_ARCHIVE ); r_drawSun = ri.Cvar_Get( "r_drawSun", "0", 0 ); r_finish = ri.Cvar_Get( "r_finish", "0", CVAR_CHEAT ); diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 7d560a943d..ca24db6a80 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -2973,7 +2973,7 @@ static inline void halfToFloat( const f16vec4_t in, vec4_t out ) extern cvar_t *r_skipBackEnd; extern cvar_t *r_skipLightBuffer; - extern cvar_t *r_ignoreGLErrors; + extern cvar_t *r_checkGLErrors; extern cvar_t *r_debugSurface; extern cvar_t *r_simpleMipMaps; @@ -3033,6 +3033,19 @@ static inline void halfToFloat( const f16vec4_t in, vec4_t out ) //==================================================================== +/* r_checkGLErrors values: +- -1: check for GL errors on debug build only +- 0: never check for GL errors +- 1: always check for GL errors */ +inline bool checkGLErrors() +{ +#ifdef DEBUG_BUILD + return r_checkGLErrors->integer != 0; +#else + return r_checkGLErrors->integer > 0; +#endif +} + #define IMAGE_FILE_HASH_SIZE 4096 extern image_t *r_imageHashTable[ IMAGE_FILE_HASH_SIZE ]; diff --git a/src/engine/renderer/tr_vbo.cpp b/src/engine/renderer/tr_vbo.cpp index e51185d5ac..6ac4340028 100644 --- a/src/engine/renderer/tr_vbo.cpp +++ b/src/engine/renderer/tr_vbo.cpp @@ -305,10 +305,10 @@ static void R_SetVBOAttributeLayouts( VBO_t *vbo ) } // index has to be in range 0-255, weight has to be >= 0 and <= 1 -static inline unsigned short +static unsigned short boneFactor( int index, float weight ) { int scaledWeight = lrintf( weight * 255.0 ); - return (unsigned short)( ( index << 8 ) | scaledWeight ); + return (unsigned short)( ( scaledWeight << 8 ) | index ); } static void R_CopyVertexData( VBO_t *vbo, byte *outData, vboData_t inData )