From 28d85d7ba356d2cb15a857b13d2127ade027ed88 Mon Sep 17 00:00:00 2001 From: Deve Date: Wed, 1 Feb 2017 21:58:10 +0100 Subject: [PATCH] Use explicit attrib location when the extension is available. It allows to enable it easily in GLES renderer. And we check if this extension is available anyway because it's needed for shadows, so we can use it for other shaders too. --- data/shaders/billboard.vert | 2 +- data/shaders/coloredquad.vert | 4 ++-- data/shaders/colortexturedquad.vert | 2 +- data/shaders/displace.vert | 2 +- data/shaders/flipparticle.vert | 2 +- data/shaders/glow_object.vert | 2 +- data/shaders/grass_pass.vert | 2 +- data/shaders/instanced_grass.vert | 2 +- data/shaders/instanced_grassshadow.vert | 2 +- data/shaders/instanced_object_pass.vert | 2 +- data/shaders/instanced_shadow.vert | 2 +- data/shaders/instanced_skinning.vert | 2 +- data/shaders/instanced_skinning_shadow.vert | 2 +- data/shaders/object_pass.vert | 2 +- data/shaders/particle.vert | 2 +- data/shaders/particlesimheightmap.vert | 2 +- data/shaders/pointemitter.vert | 14 +++++++------- data/shaders/primitive2dlist.vert | 2 +- data/shaders/rsm.vert | 2 +- data/shaders/screenquad.vert | 2 +- data/shaders/shadow.vert | 2 +- data/shaders/shadow_grass.vert | 2 +- data/shaders/skinning.vert | 2 +- data/shaders/skinning_shadow.vert | 2 +- data/shaders/sky.vert | 2 +- data/shaders/texturedquad.vert | 4 ++-- src/graphics/central_settings.cpp | 6 ++++++ src/graphics/shader.cpp | 4 ++-- src/graphics/shader.hpp | 6 +++--- src/graphics/shader_files_manager.cpp | 3 +++ 30 files changed, 48 insertions(+), 39 deletions(-) diff --git a/data/shaders/billboard.vert b/data/shaders/billboard.vert index a6eb64557..06882526d 100644 --- a/data/shaders/billboard.vert +++ b/data/shaders/billboard.vert @@ -2,7 +2,7 @@ uniform mat4 ModelViewMatrix; uniform vec3 Position; uniform vec2 Size; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec2 Corner; layout(location = 3) in vec2 Texcoord; #else diff --git a/data/shaders/coloredquad.vert b/data/shaders/coloredquad.vert index 4f48e98f2..ab0095d52 100644 --- a/data/shaders/coloredquad.vert +++ b/data/shaders/coloredquad.vert @@ -1,7 +1,7 @@ uniform vec2 center; uniform vec2 size; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec2 Position; #else in vec2 Position; @@ -11,4 +11,4 @@ in vec2 Position; void main() { gl_Position = vec4(Position * size + center, 0., 1.); -} \ No newline at end of file +} diff --git a/data/shaders/colortexturedquad.vert b/data/shaders/colortexturedquad.vert index 467fdd080..06bd61b40 100644 --- a/data/shaders/colortexturedquad.vert +++ b/data/shaders/colortexturedquad.vert @@ -3,7 +3,7 @@ uniform vec2 size; uniform vec2 texcenter; uniform vec2 texsize; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location=0) in vec2 Position; layout(location=3) in vec2 Texcoord; layout(location=2) in uvec4 Color; diff --git a/data/shaders/displace.vert b/data/shaders/displace.vert index d82ac8824..e5acc43b5 100644 --- a/data/shaders/displace.vert +++ b/data/shaders/displace.vert @@ -1,6 +1,6 @@ uniform mat4 ModelMatrix; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 3) in vec2 Texcoord; layout(location = 4) in vec2 SecondTexcoord; diff --git a/data/shaders/flipparticle.vert b/data/shaders/flipparticle.vert index 7f43b0763..4c81d8082 100644 --- a/data/shaders/flipparticle.vert +++ b/data/shaders/flipparticle.vert @@ -1,4 +1,4 @@ -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location=0) in vec3 Position; layout(location = 1) in float lifetime; layout(location = 2) in float size; diff --git a/data/shaders/glow_object.vert b/data/shaders/glow_object.vert index 78cd0279a..552c978bc 100644 --- a/data/shaders/glow_object.vert +++ b/data/shaders/glow_object.vert @@ -1,4 +1,4 @@ -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 7) in vec3 Origin; layout(location = 8) in vec3 Orientation; diff --git a/data/shaders/grass_pass.vert b/data/shaders/grass_pass.vert index 08d44fff6..23daa553c 100644 --- a/data/shaders/grass_pass.vert +++ b/data/shaders/grass_pass.vert @@ -2,7 +2,7 @@ uniform vec3 windDir; uniform mat4 ModelMatrix; uniform mat4 InverseModelMatrix; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; layout(location = 2) in vec4 Color; diff --git a/data/shaders/instanced_grass.vert b/data/shaders/instanced_grass.vert index dcfba88a5..57adee847 100644 --- a/data/shaders/instanced_grass.vert +++ b/data/shaders/instanced_grass.vert @@ -1,6 +1,6 @@ uniform vec3 windDir; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; layout(location = 2) in vec4 Color; diff --git a/data/shaders/instanced_grassshadow.vert b/data/shaders/instanced_grassshadow.vert index e8d31d927..5d5e8e6e2 100644 --- a/data/shaders/instanced_grassshadow.vert +++ b/data/shaders/instanced_grassshadow.vert @@ -1,7 +1,7 @@ uniform int layer; uniform vec3 windDir; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 2) in vec4 Color; layout(location = 3) in vec2 Texcoord; diff --git a/data/shaders/instanced_object_pass.vert b/data/shaders/instanced_object_pass.vert index de0befb04..4cffcaeb1 100644 --- a/data/shaders/instanced_object_pass.vert +++ b/data/shaders/instanced_object_pass.vert @@ -1,4 +1,4 @@ -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; layout(location = 2) in vec4 Color; diff --git a/data/shaders/instanced_shadow.vert b/data/shaders/instanced_shadow.vert index 09885f333..6aa25655a 100644 --- a/data/shaders/instanced_shadow.vert +++ b/data/shaders/instanced_shadow.vert @@ -1,6 +1,6 @@ uniform int layer; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 3) in vec2 Texcoord; diff --git a/data/shaders/instanced_skinning.vert b/data/shaders/instanced_skinning.vert index 6802642a4..607bfc4f9 100644 --- a/data/shaders/instanced_skinning.vert +++ b/data/shaders/instanced_skinning.vert @@ -1,4 +1,4 @@ -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; layout(location = 2) in vec4 Color; diff --git a/data/shaders/instanced_skinning_shadow.vert b/data/shaders/instanced_skinning_shadow.vert index 21e4a5294..7f72e56fb 100644 --- a/data/shaders/instanced_skinning_shadow.vert +++ b/data/shaders/instanced_skinning_shadow.vert @@ -1,6 +1,6 @@ uniform int layer; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 3) in vec4 Data1; layout(location = 5) in ivec4 Joint; diff --git a/data/shaders/object_pass.vert b/data/shaders/object_pass.vert index dcd6a3985..124e8c26e 100644 --- a/data/shaders/object_pass.vert +++ b/data/shaders/object_pass.vert @@ -17,7 +17,7 @@ uniform mat4 InverseModelMatrix = uniform vec2 texture_trans = vec2(0., 0.); #endif -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; layout(location = 2) in vec4 Color; diff --git a/data/shaders/particle.vert b/data/shaders/particle.vert index 78d32ef29..d9a7d8659 100644 --- a/data/shaders/particle.vert +++ b/data/shaders/particle.vert @@ -1,7 +1,7 @@ uniform vec3 color_from; uniform vec3 color_to; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location=0) in vec3 Position; layout(location = 1) in float lifetime; layout(location = 2) in float size; diff --git a/data/shaders/particlesimheightmap.vert b/data/shaders/particlesimheightmap.vert index eec3151c1..5095c837b 100644 --- a/data/shaders/particlesimheightmap.vert +++ b/data/shaders/particlesimheightmap.vert @@ -9,7 +9,7 @@ uniform float track_x_len; uniform float track_z_len; uniform samplerBuffer heightmap; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout (location = 4) in vec3 particle_position_initial; layout (location = 5) in float lifetime_initial; layout (location = 6) in vec3 particle_velocity_initial; diff --git a/data/shaders/pointemitter.vert b/data/shaders/pointemitter.vert index 54e5b58ca..60d150b28 100644 --- a/data/shaders/pointemitter.vert +++ b/data/shaders/pointemitter.vert @@ -4,7 +4,7 @@ uniform mat4 sourcematrix; uniform int level; uniform float size_increase_factor; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout (location = 4) in vec3 particle_position_initial; layout (location = 5) in float lifetime_initial; layout (location = 6) in vec3 particle_velocity_initial; @@ -40,14 +40,14 @@ void main(void) { float dt_from_last_frame = fract(updated_lifetime) * lifetime_initial; float coeff = dt_from_last_frame / float(dt); - + vec4 previous_frame_position = previous_frame_sourcematrix * vec4(particle_position_initial, 1.0); vec4 current_frame_position = sourcematrix * vec4(particle_position_initial, 1.0); - + vec4 updated_initialposition = mix(current_frame_position, previous_frame_position, coeff); - + vec4 updated_initial_velocity = mix(sourcematrix * vec4(particle_velocity_initial, 0.0), previous_frame_sourcematrix * vec4(particle_velocity_initial, 0.0), coeff); @@ -56,12 +56,12 @@ void main(void) //But the simple formula ( (current_frame_position - previous_frame_position) / dt ) with a constant speed //between 2 frames creates visual artifacts when the framerate is low, and a more accurate formula would need //more complex computations. - + new_particle_position = updated_initialposition.xyz + dt_from_last_frame * updated_initial_velocity.xyz; new_particle_velocity = updated_initial_velocity.xyz; - + new_lifetime = fract(updated_lifetime); - new_size = mix(size_initial, size_initial * size_increase_factor, fract(updated_lifetime)); + new_size = mix(size_initial, size_initial * size_increase_factor, fract(updated_lifetime)); } else { diff --git a/data/shaders/primitive2dlist.vert b/data/shaders/primitive2dlist.vert index 7a2c65fa0..791647c20 100644 --- a/data/shaders/primitive2dlist.vert +++ b/data/shaders/primitive2dlist.vert @@ -1,4 +1,4 @@ -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; layout(location = 2) in vec4 Color; diff --git a/data/shaders/rsm.vert b/data/shaders/rsm.vert index a02e62b30..6029753ed 100644 --- a/data/shaders/rsm.vert +++ b/data/shaders/rsm.vert @@ -2,7 +2,7 @@ uniform mat4 ModelMatrix; uniform mat4 RSMMatrix; uniform vec2 texture_trans = vec2(0., 0.); -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; layout(location = 2) in vec4 Color; diff --git a/data/shaders/screenquad.vert b/data/shaders/screenquad.vert index 6ece8e050..c77284492 100644 --- a/data/shaders/screenquad.vert +++ b/data/shaders/screenquad.vert @@ -1,4 +1,4 @@ -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec2 Position; layout(location = 3) in vec2 Texcoord; #else diff --git a/data/shaders/shadow.vert b/data/shaders/shadow.vert index 3bbc6c6a5..7ecab2a84 100644 --- a/data/shaders/shadow.vert +++ b/data/shaders/shadow.vert @@ -1,7 +1,7 @@ uniform int layer; uniform mat4 ModelMatrix; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 3) in vec2 Texcoord; #else diff --git a/data/shaders/shadow_grass.vert b/data/shaders/shadow_grass.vert index bf6d7435b..95827b872 100644 --- a/data/shaders/shadow_grass.vert +++ b/data/shaders/shadow_grass.vert @@ -2,7 +2,7 @@ uniform int layer; uniform mat4 ModelMatrix; uniform vec3 windDir; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 2) in vec4 Color; layout(location = 3) in vec2 Texcoord; diff --git a/data/shaders/skinning.vert b/data/shaders/skinning.vert index e74fc508c..192f4247f 100644 --- a/data/shaders/skinning.vert +++ b/data/shaders/skinning.vert @@ -18,7 +18,7 @@ uniform vec2 texture_trans = vec2(0., 0.); #endif uniform int skinning_offset; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; layout(location = 2) in vec4 Color; diff --git a/data/shaders/skinning_shadow.vert b/data/shaders/skinning_shadow.vert index 6e8d8fb3b..eca18ec1a 100644 --- a/data/shaders/skinning_shadow.vert +++ b/data/shaders/skinning_shadow.vert @@ -2,7 +2,7 @@ uniform mat4 ModelMatrix; uniform int skinning_offset; uniform int layer; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; layout(location = 3) in vec4 Data1; layout(location = 5) in ivec4 Joint; diff --git a/data/shaders/sky.vert b/data/shaders/sky.vert index eb254d521..e21bbbf41 100644 --- a/data/shaders/sky.vert +++ b/data/shaders/sky.vert @@ -1,4 +1,4 @@ -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location = 0) in vec3 Position; #else in vec3 Position; diff --git a/data/shaders/texturedquad.vert b/data/shaders/texturedquad.vert index 3299139c0..9637d054a 100644 --- a/data/shaders/texturedquad.vert +++ b/data/shaders/texturedquad.vert @@ -3,7 +3,7 @@ uniform vec2 size; uniform vec2 texcenter; uniform vec2 texsize; -#if __VERSION__ >= 330 +#ifdef Explicit_Attrib_Location_Usable layout(location=0) in vec2 Position; layout(location=3) in vec2 Texcoord; #else @@ -17,4 +17,4 @@ void main() { uv = Texcoord * texsize + texcenter; gl_Position = vec4(Position * size + center, 0., 1.); -} \ No newline at end of file +} diff --git a/src/graphics/central_settings.cpp b/src/graphics/central_settings.cpp index 0851ef82f..54c4fa294 100644 --- a/src/graphics/central_settings.cpp +++ b/src/graphics/central_settings.cpp @@ -238,6 +238,12 @@ void CentralVideoSettings::init() hasTextureStorage = true; hasTextureSwizzle = true; } + + if (!GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_EXPLICIT_ATTRIB_LOCATION) + { + Log::info("GLDriver", "Explicit Attrib Location Present"); + hasExplicitAttribLocation = true; + } if (!GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_TEXTURE_FORMAT_BGRA8888) && (hasGLExtension("GL_IMG_texture_format_BGRA8888") || diff --git a/src/graphics/shader.cpp b/src/graphics/shader.cpp index 89cf135f5..bb5cefe35 100644 --- a/src/graphics/shader.cpp +++ b/src/graphics/shader.cpp @@ -42,7 +42,7 @@ int ShaderBase::loadTFBProgram(const std::string &shader_name, #ifdef USE_GLES2 loadAndAttachShader(GL_FRAGMENT_SHADER, "tfb_dummy.frag"); #endif - if (CVS->getGLSLVersion() < 330) + if (!CVS->isARBExplicitAttribLocationUsable()) setAttribute(PARTICLES_SIM); glTransformFeedbackVaryings(m_program, varying_count, varyings, @@ -74,7 +74,7 @@ void ShaderBase::bypassUBO() const GLint PM = glGetUniformLocation(m_program, "ProjectionMatrix"); glUniformMatrix4fv(PM, 1, GL_FALSE, irr_driver->getProjMatrix().pointer()); - + GLint PVM = glGetUniformLocation(m_program, "ProjectionViewMatrix"); glUniformMatrix4fv(PVM, 1, GL_FALSE, irr_driver->getProjViewMatrix().pointer()); diff --git a/src/graphics/shader.hpp b/src/graphics/shader.hpp index 7df252576..302cc4370 100644 --- a/src/graphics/shader.hpp +++ b/src/graphics/shader.hpp @@ -33,7 +33,7 @@ #include #include -/** A simple non-templated base class. It is used to store some enums used in +/** A simple non-templated base class. It is used to store some enums used in * templates, the actual header for a shader, and a statis list of all kill * functions (which delete all singletons, and therefore forces a reload of all * shaders). @@ -301,7 +301,7 @@ public: * \param index Index of the texture. * \param uniform Uniform name. */ - template + template void assignTextureUnit(GLuint index, const char* uniform, T1... rest) { glUseProgram(m_program); @@ -349,7 +349,7 @@ public: { m_program = glCreateProgram(); loadAndAttachShader(args...); - if (CVS->getGLSLVersion() < 330) + if (!CVS->isARBExplicitAttribLocationUsable()) setAttribute(type); glLinkProgram(m_program); diff --git a/src/graphics/shader_files_manager.cpp b/src/graphics/shader_files_manager.cpp index 01c32b28e..e7b37de05 100644 --- a/src/graphics/shader_files_manager.cpp +++ b/src/graphics/shader_files_manager.cpp @@ -89,7 +89,10 @@ GLuint ShaderFilesManager::loadShader(const std::string &file, unsigned type) code << "#extension GL_AMD_vertex_shader_layer : enable\n"; if (CVS->isARBExplicitAttribLocationUsable()) + { code << "#extension GL_ARB_explicit_attrib_location : enable\n"; + code << "#define Explicit_Attrib_Location_Usable\n"; + } if (CVS->isAZDOEnabled()) {