From 58345443ca89719dd6b7b51da7e37592af5fe252 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Wed, 7 Feb 2024 09:00:17 +0100 Subject: [PATCH] renderer: implement ivec_t and the ability to send integer vectors to GLSL --- src/engine/qcommon/q_shared.h | 6 +- src/engine/renderer/gl_shader.h | 121 ++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 1 deletion(-) diff --git a/src/engine/qcommon/q_shared.h b/src/engine/qcommon/q_shared.h index e27ab18326..bf7b574420 100644 --- a/src/engine/qcommon/q_shared.h +++ b/src/engine/qcommon/q_shared.h @@ -227,7 +227,6 @@ void Com_Free_Aligned( void *ptr ); using vec_t = float; using vec2_t = vec_t[2]; - using vec3_t = vec_t[3]; using vec4_t = vec_t[4]; @@ -236,6 +235,11 @@ void Com_Free_Aligned( void *ptr ); using matrix_t = vec_t[4 * 4]; using quat_t = vec_t[4]; + using ivec_t = int; + using ivec2_t = ivec_t[2]; + using ivec3_t = ivec_t[3]; + using ivec4_t = ivec_t[4]; + // A transform_t represents a product of basic // transformations, which are a rotation about an arbitrary // axis, a uniform scale or a translation. Any a product can diff --git a/src/engine/renderer/gl_shader.h b/src/engine/renderer/gl_shader.h index 80c0fa21e4..cb919e4fce 100644 --- a/src/engine/renderer/gl_shader.h +++ b/src/engine/renderer/gl_shader.h @@ -418,6 +418,127 @@ class GLUniform1i : protected GLUniform } }; +class GLUniform2i : protected GLUniform +{ +protected: + GLUniform2i( GLShader *shader, const char *name ) : + GLUniform( shader, name ) + { + } + + inline void SetValue( const ivec2_t v ) + { + shaderProgram_t *p = _shader->GetProgram(); + + ASSERT_EQ(p, glState.currentProgram); + +#if defined( LOG_GLSL_UNIFORMS ) + if ( r_logFile->integer ) + { + GLimp_LogComment( va( "GLSL_SetUniform2i( %s, shader: %s, value: [ %d, %d ] ) ---\n", + this->GetName(), _shader->GetName().c_str(), v[ 0 ], v[ 1 ] ) ); + } +#endif +#if defined( USE_UNIFORM_FIREWALL ) + ivec2_t *firewall = ( ivec2_t * ) &p->uniformFirewall[ _firewallIndex ]; + + if ( !memcmp( *firewall, v, sizeof( *firewall ) ) ) + { + return; + } + + ( *firewall )[ 0 ] = v[ 0 ]; + ( *firewall )[ 1 ] = v[ 1 ]; +#endif + glUniform2i( p->uniformLocations[ _locationIndex ], v[ 0 ], v[ 1 ] ); + } + + size_t GetSize() override + { + return sizeof( ivec2_t ); + } +}; + +class GLUniform3i : protected GLUniform +{ +protected: + GLUniform3i( GLShader *shader, const char *name ) : + GLUniform( shader, name ) + { + } + + inline void SetValue( const ivec3_t v ) + { + shaderProgram_t *p = _shader->GetProgram(); + + ASSERT_EQ(p, glState.currentProgram); + +#if defined( LOG_GLSL_UNIFORMS ) + if ( r_logFile->integer ) + { + GLimp_LogComment( va( "GLSL_SetUniform3i( %s, shader: %s, value: [ %d, %d, %d ] ) ---\n", + this->GetName(), _shader->GetName().c_str(), v[ 0 ], v[ 1 ], v[ 2 ] ) ); + } +#endif +#if defined( USE_UNIFORM_FIREWALL ) + ivec3_t *firewall = ( ivec3_t * ) &p->uniformFirewall[ _firewallIndex ]; + + if ( !memcmp( *firewall, v, sizeof( *firewall ) ) ) + { + return; + } + + VectorCopy( v, *firewall ); +#endif + glUniform3i( p->uniformLocations[ _locationIndex ], v[ 0 ], v[ 1 ], v[ 2 ] ); + } +public: + size_t GetSize() override + { + return sizeof( ivec3_t ); + } +}; + +class GLUniform4i : protected GLUniform +{ +protected: + GLUniform4i( GLShader *shader, const char *name ) : + GLUniform( shader, name ) + { + } + + inline void SetValue( const ivec4_t v ) + { + shaderProgram_t *p = _shader->GetProgram(); + + ASSERT_EQ(p, glState.currentProgram); + +#if defined( LOG_GLSL_UNIFORMS ) + if ( r_logFile->integer ) + { + GLimp_LogComment( va( "GLSL_SetUniform4i( %s, shader: %s, value: [ %d, %d, %d, %d ] ) ---\n", + this->GetName(), _shader->GetName().c_str(), v[ 0 ], v[ 1 ], v[ 2 ], v[ 3 ] ) ); + } +#endif +#if defined( USE_UNIFORM_FIREWALL ) + ivec4_t *firewall = ( ivec4_t * ) &p->uniformFirewall[ _firewallIndex ]; + + if ( !memcmp( *firewall, v, sizeof( *firewall ) ) ) + { + return; + } + + Vector4Copy( v, *firewall ); +#endif + glUniform4i( p->uniformLocations[ _locationIndex ], v[ 0 ], v[ 1 ], v[ 2 ], v[ 3 ] ); + } +public: + size_t GetSize() override + { + return sizeof( ivec4_t ); + } +}; + class GLUniform1f : protected GLUniform { protected: