Commit: d34b0faa65f9585d7013a120523e9b87a22c60bd
Author: Jeroen Bakker
Date:   Fri Jun 29 08:25:23 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBd34b0faa65f9585d7013a120523e9b87a22c60bd

Workbench: Removed MaterialData UBO

Most of the times the materials differ due to the object_id. This was an
overhead and resulted in instabilities on Intel graphical cards. This
commit will revert the Material Data UBO and replace it with normal
uniform.

===================================================================

M       source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
M       
source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
M       
source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
M       source/blender/draw/engines/workbench/workbench_data.c
M       source/blender/draw/engines/workbench/workbench_deferred.c
M       source/blender/draw/engines/workbench/workbench_forward.c
M       source/blender/draw/engines/workbench/workbench_materials.c
M       source/blender/draw/engines/workbench/workbench_private.h

===================================================================

diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
index 2d913c63b00..99bacea4b27 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -15,9 +15,3 @@ struct WorldData {
        float background_alpha;
        int pad[1];
 };
-
-struct MaterialData {
-       vec4 diffuse_color;
-       vec4 specular_color;
-       float roughness;
-};
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
 
b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
index c21dd2af684..110b5a51fa5 100644
--- 
a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
+++ 
b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
@@ -7,6 +7,10 @@ uniform float alpha = 0.5;
 uniform vec2 invertedViewportSize;
 uniform vec4 viewvecs[3];
 
+uniform vec4 materialDiffuseColor;
+uniform vec4 materialSpecularColor;
+uniform float materialRoughness;
+
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
 in vec3 normal_viewport;
 #endif /* NORMAL_VIEWPORT_PASS_ENABLED */
@@ -21,10 +25,6 @@ layout(std140) uniform world_block {
        WorldData world_data;
 };
 
-layout(std140) uniform material_block {
-       MaterialData material_data;
-};
-
 layout(location=0) out vec4 transparentAccum;
 layout(location=1) out float revealageAccum; /* revealage actually stored in 
transparentAccum.a */
 
@@ -36,7 +36,7 @@ void main()
 #ifdef V3D_SHADING_TEXTURE_COLOR
        diffuse_color = texture(image, uv_interp);
 #else
-       diffuse_color = material_data.diffuse_color;
+       diffuse_color = materialDiffuseColor;
 #endif /* V3D_SHADING_TEXTURE_COLOR */
 
        vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
@@ -53,7 +53,7 @@ void main()
 #endif
 
 #ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
-       vec3 specular_color = get_world_specular_lights(world_data, 
vec4(material_data.specular_color.rgb, material_data.roughness), nor, I_vs);
+       vec3 specular_color = get_world_specular_lights(world_data, 
vec4(materialSpecularColor.rgb, materialRoughness), nor, I_vs);
 #else
        vec3 specular_color = vec3(0.0);
 #endif
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index 6aeb912377c..8752afb09c1 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -1,8 +1,8 @@
 uniform int object_id = 0;
 
-layout(std140) uniform material_block {
-       MaterialData material_data;
-};
+uniform vec4 materialDiffuseColor;
+uniform vec4 materialSpecularColor;
+uniform float materialRoughness;
 
 #ifdef V3D_SHADING_TEXTURE_COLOR
 uniform sampler2D image;
@@ -43,9 +43,9 @@ void main()
 #ifdef V3D_SHADING_TEXTURE_COLOR
        diffuseColor = texture(image, uv_interp);
 #else
-       diffuseColor = vec4(material_data.diffuse_color.rgb, 0.0);
+       diffuseColor = vec4(materialDiffuseColor.rgb, 0.0);
 #  ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL
-       specularColor = vec4(material_data.diffuse_color.rgb, 0.0);
+       specularColor = vec4(materialDiffuseColor.rgb, 0.0);
 
 #  endif
 #endif /* V3D_SHADING_TEXTURE_COLOR */
@@ -56,7 +56,7 @@ void main()
 #endif
 
 #ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
-       specularColor = vec4(material_data.specular_color.rgb, 
material_data.roughness);
+       specularColor = vec4(materialSpecularColor.rgb, materialRoughness);
 #  ifdef HAIR_SHADER
        specularColor.rgb = clamp(specularColor.rgb - hair_color_variation, 
0.0, 1.0);
 #  endif
diff --git a/source/blender/draw/engines/workbench/workbench_data.c 
b/source/blender/draw/engines/workbench/workbench_data.c
index cab26ae015d..0f0d879aae8 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -159,15 +159,8 @@ void 
workbench_private_data_get_light_direction(WORKBENCH_PrivateData *wpd, floa
        DRW_uniformbuffer_update(wpd->world_ubo, wd);
 }
 
-static void workbench_private_material_free(void *data)
-{
-       WORKBENCH_MaterialData *material_data = data;
-       DRW_UBO_FREE_SAFE(material_data->material_ubo);
-       MEM_freeN(material_data);
-}
-
 void workbench_private_data_free(WORKBENCH_PrivateData *wpd)
 {
-       BLI_ghash_free(wpd->material_hash, NULL, 
workbench_private_material_free);
+       BLI_ghash_free(wpd->material_hash, NULL, MEM_freeN);
        DRW_UBO_FREE_SAFE(wpd->world_ubo);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c 
b/source/blender/draw/engines/workbench/workbench_deferred.c
index 3b73154846f..c680fd5864c 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -580,18 +580,14 @@ static WORKBENCH_MaterialData 
*get_or_create_material_data(
                material = MEM_mallocN(sizeof(WORKBENCH_MaterialData), 
__func__);
                material->shgrp = DRW_shgroup_create(
                        color_type == V3D_SHADING_TEXTURE_COLOR ? 
wpd->prepass_texture_sh: wpd->prepass_solid_sh, psl->prepass_pass);
+               workbench_material_copy(material, &material_template);
                DRW_shgroup_stencil_mask(material->shgrp, 0xFF);
-               material->object_id = material_template.object_id;
-               copy_v4_v4(material->material_data.diffuse_color, 
material_template.material_data.diffuse_color);
-               copy_v4_v4(material->material_data.specular_color, 
material_template.material_data.specular_color);
-               material->material_data.roughness = 
material_template.material_data.roughness;
+               DRW_shgroup_uniform_int(material->shgrp, "object_id", 
&material->object_id, 1);
+               workbench_material_shgroup_uniform(material->shgrp, material);
                if (color_type == V3D_SHADING_TEXTURE_COLOR) {
                        GPUTexture *tex = GPU_texture_from_blender(ima, NULL, 
GL_TEXTURE_2D, false, 0.0);
                        DRW_shgroup_uniform_texture(material->shgrp, "image", 
tex);
                }
-               DRW_shgroup_uniform_int(material->shgrp, "object_id", 
&material->object_id, 1);
-               material->material_ubo = 
DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_Material), 
&material->material_data);
-               DRW_shgroup_uniform_block(material->shgrp, "material_block", 
material->material_ubo);
 
                BLI_ghash_insert(wpd->material_hash, SET_UINT_IN_POINTER(hash), 
material);
        }
@@ -637,7 +633,7 @@ static void 
workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *o
                                shader);
                        DRW_shgroup_stencil_mask(shgrp, 0xFF);
                        DRW_shgroup_uniform_int(shgrp, "object_id", 
&material->object_id, 1);
-                       DRW_shgroup_uniform_block(shgrp, "material_block", 
material->material_ubo);
+                       workbench_material_shgroup_uniform(shgrp, material);
                        if (image) {
                                GPUTexture *tex = 
GPU_texture_from_blender(image, NULL, GL_TEXTURE_2D, false, 0.0f);
                                DRW_shgroup_uniform_texture(shgrp, "image", 
tex);
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c 
b/source/blender/draw/engines/workbench/workbench_forward.c
index 41d16780d33..1a8a5461e13 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -177,11 +177,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
                DRW_shgroup_uniform_float(grp, "alpha", 
&wpd->shading.xray_alpha, 1);
                DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float 
*)wpd->viewvecs, 3);
                workbench_material_set_normal_world_matrix(grp, wpd, 
e_data.normal_world_matrix);
-               material->object_id = engine_object_data->object_id;
-               copy_v4_v4(material->material_data.diffuse_color, 
material_template.material_data.diffuse_color);
-               copy_v4_v4(material->material_data.specular_color, 
material_template.material_data.specular_color);
-               material->material_data.roughness = 
material_template.material_data.roughness;
-
+               workbench_material_copy(material, &material_template);
                if (color_type == V3D_SHADING_TEXTURE_COLOR) {
                        GPUTexture *tex = GPU_texture_from_blender(ima, NULL, 
GL_TEXTURE_2D, false, 0.0f);
                        DRW_shgroup_uniform_texture(grp, "image", tex);
@@ -194,8 +190,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
                        DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", 
DRW_viewport_invert_size_get(), 1);
                }
 
-               material->material_ubo = 
DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_Material), 
&material->material_data);
-               DRW_shgroup_uniform_block(grp, "material_block", 
material->material_ubo);
+               workbench_material_shgroup_uniform(grp, material);
                material->shgrp = grp;
 
                /* Depth */
@@ -431,7 +426,7 @@ static void 
workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, O
                                                        shader);
                        workbench_material_set_normal_world_matrix(shgrp, wpd, 
e_data.normal_world_matrix);
                        DRW_shgroup_uniform_block(shgrp, "world_block", 
wpd->world_ubo);
-                       DRW_shgroup_uniform_block(shgrp, "material_block", 
material->material_ubo);
+                       workbench_material_shgroup_uniform(shgrp, material);
                        DRW_shgroup_uniform_vec4(shgrp, "viewvecs[0]", (float 
*)wpd->viewvecs, 3);
                        /* Hairs have lots of layer and can rapidly become the 
most prominent surface.
                         * So lower their alpha artificially. */
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c 
b/source/blender/draw/engines/workbench/workbench_materials.c
index d7d1505b2d0..bddfa7048a0 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -13,12 +13,12 @@ void workbench_material_update_data(WORKBENCH_PrivateData 
*wpd, Object *ob, Mate
        int color_type = wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR ? 
V3D_SHADING_MATERIAL_COLOR : wpd->shading.color_type;
        static float default_diffuse_color[] = {0.8f, 0.8f, 0.8f, 1.0f};
        static float default_specular_color[] = {0.5f, 0.5f, 0.5f, 0.5f};
-       copy_v4_v4(data->material_data.diffuse_color, default_diffuse_color);
-       copy_v4_v4(data->material_data.specular_color, default_specular_color);
-       data->material_data.roughness = 0.5f;
+       copy_v4_v4(data->diffuse_color, default_diffuse_color);
+       copy_v4_v4(data->specular_color, default_specular_color);
+       data->roughness = 0.5f;
 
        

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to