Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2015-08-26 13:04:25 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-08-26 13:07:38 +0300
commitbcc0d2fb1d66d5191276dcbe17621d50ae0fab35 (patch)
treeb2aeae947c4c37ac8ca2bd175362fc07fd096dcc /intern/opensubdiv
parent77ce7eb5418e4f0adc5b5d9ac6d67a610f636b59 (diff)
OpenSubdiv: Fix/workaround bad shading on AMD devices
Uniform block data layout was different on CPU and GPU which caused wrong data being used from shader. In theory using layout(std140) is what we need to do, but for some reason such layout specifier is being ignored. This is probably caused by the way how we exploit extensions from older version of glsl. For until we've upgraded our glsl pipeline used different approach which is basically about removing unused fields form the struct manual in hope that it'll keep memory layout consistent for both CPU and GPU. This seems to work so far for both NVidia GTX580 and AMD FirePro W8000 here in the studio.
Diffstat (limited to 'intern/opensubdiv')
-rw-r--r--intern/opensubdiv/gpu_shader_opensubd_display.glsl4
-rw-r--r--intern/opensubdiv/opensubdiv_gpu_capi.cc6
2 files changed, 7 insertions, 3 deletions
diff --git a/intern/opensubdiv/gpu_shader_opensubd_display.glsl b/intern/opensubdiv/gpu_shader_opensubd_display.glsl
index ffc8e3dcaa4..f0f0bb783e6 100644
--- a/intern/opensubdiv/gpu_shader_opensubd_display.glsl
+++ b/intern/opensubdiv/gpu_shader_opensubd_display.glsl
@@ -198,15 +198,17 @@ struct LightSource {
vec4 diffuse;
vec4 specular;
vec4 spotDirection;
+#ifdef SUPPORT_COLOR_MATERIAL
float constantAttenuation;
float linearAttenuation;
float quadraticAttenuation;
float spotCutoff;
float spotExponent;
float spotCosCutoff;
+#endif
};
-uniform Lighting {
+layout(std140) uniform Lighting {
LightSource lightSource[MAX_LIGHTS];
int num_enabled_lights;
};
diff --git a/intern/opensubdiv/opensubdiv_gpu_capi.cc b/intern/opensubdiv/opensubdiv_gpu_capi.cc
index 7a57f50d623..f21a8a523e6 100644
--- a/intern/opensubdiv/opensubdiv_gpu_capi.cc
+++ b/intern/opensubdiv/opensubdiv_gpu_capi.cc
@@ -59,19 +59,19 @@ typedef struct Light {
float diffuse[4];
float specular[4];
float spot_direction[4];
+#ifdef SUPPORT_COLOR_MATERIAL
float constant_attenuation;
float linear_attenuation;
float quadratic_attenuation;
float spot_cutoff;
float spot_exponent;
float spot_cos_cutoff;
- float pad[2];
+#endif
} Light;
typedef struct Lighting {
Light lights[MAX_LIGHTS];
int num_enabled;
- int pad[3];
} Lighting;
typedef struct Transform {
@@ -444,6 +444,7 @@ void openSubdiv_osdGLMeshDisplayPrepare(int use_osd_glsl,
glGetLightfv(GL_LIGHT0 + i,
GL_SPOT_DIRECTION,
g_lighting_data.lights[i].spot_direction);
+#ifdef SUPPORT_COLOR_MATERIAL
glGetLightfv(GL_LIGHT0 + i,
GL_CONSTANT_ATTENUATION,
&g_lighting_data.lights[i].constant_attenuation);
@@ -461,6 +462,7 @@ void openSubdiv_osdGLMeshDisplayPrepare(int use_osd_glsl,
&g_lighting_data.lights[i].spot_exponent);
g_lighting_data.lights[i].spot_cos_cutoff =
cos(g_lighting_data.lights[i].spot_cutoff);
+#endif
}
}