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()) {