Просмотр исходного кода

OpenGL: Avoid undefined behaviour for UNIFORM_BLOCK_DATA_SIZE

Jannik Vogel 10 лет назад
Родитель
Сommit
c900c092e3

+ 6 - 4
src/video_core/renderer_opengl/gl_rasterizer.h

@@ -316,16 +316,18 @@ private:
         GLfloat dist_atten_scale;
         GLfloat dist_atten_scale;
     };
     };
 
 
-    /// Uniform structure for the Uniform Buffer Object, all members must be 16-byte aligned
+    /// Uniform structure for the Uniform Buffer Object, all vectors must be 16-byte aligned
+    // NOTE: Always keep a vec4 at the end. The GL spec is not clear wether the alignment at
+    //       the end of a uniform block is included in UNIFORM_BLOCK_DATA_SIZE or not.
+    //       Not following that rule will cause problems on some AMD drivers.
     struct UniformData {
     struct UniformData {
-        // A vec4 color for each of the six tev stages
-        GLvec4 const_color[6];
-        GLvec4 tev_combiner_buffer_color;
         GLint alphatest_ref;
         GLint alphatest_ref;
         GLfloat depth_scale;
         GLfloat depth_scale;
         GLfloat depth_offset;
         GLfloat depth_offset;
         alignas(16) GLvec3 lighting_global_ambient;
         alignas(16) GLvec3 lighting_global_ambient;
         LightSrc light_src[8];
         LightSrc light_src[8];
+        alignas(16) GLvec4 const_color[6]; // A vec4 color for each of the six tev stages
+        alignas(16) GLvec4 tev_combiner_buffer_color;
     };
     };
 
 
     static_assert(sizeof(UniformData) == 0x390, "The size of the UniformData structure has changed, update the structure in the shader");
     static_assert(sizeof(UniformData) == 0x390, "The size of the UniformData structure has changed, update the structure in the shader");

+ 2 - 2
src/video_core/renderer_opengl/gl_shader_gen.cpp

@@ -552,13 +552,13 @@ struct LightSrc {
 };
 };
 
 
 layout (std140) uniform shader_data {
 layout (std140) uniform shader_data {
-    vec4 const_color[NUM_TEV_STAGES];
-    vec4 tev_combiner_buffer_color;
     int alphatest_ref;
     int alphatest_ref;
     float depth_scale;
     float depth_scale;
     float depth_offset;
     float depth_offset;
     vec3 lighting_global_ambient;
     vec3 lighting_global_ambient;
     LightSrc light_src[NUM_LIGHTS];
     LightSrc light_src[NUM_LIGHTS];
+    vec4 const_color[NUM_TEV_STAGES];
+    vec4 tev_combiner_buffer_color;
 };
 };
 
 
 uniform sampler2D tex[3];
 uniform sampler2D tex[3];