[Bf-blender-cvs] [2a0a7cd73d9] blender2.8: Eevee: Fix missing UBO bound if using a muted Shader to RGB node with SSS

Clément Foucault noreply at git.blender.org
Tue Nov 6 12:05:31 CET 2018


Commit: 2a0a7cd73d99340b348a0298cc709a9c3f663ee9
Author: Clément Foucault
Date:   Mon Nov 5 20:09:04 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB2a0a7cd73d99340b348a0298cc709a9c3f663ee9

Eevee: Fix missing UBO bound if using a muted Shader to RGB node with SSS

This is a nasty bug. Because the node does not get properlly tagged as SSS
(sss_id is 0) but is still evaluated (so tagging the GPUMaterial as having
SSS). The sssProfile UBO is still declared and we need to bind something
to it.

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

M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/gpu/GPU_material.h
M	source/blender/gpu/intern/gpu_material.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index db3a6ec50cb..eee1e716da1 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -66,6 +66,8 @@ static struct {
 	struct GPUTexture *util_tex;
 	struct GPUTexture *noise_tex;
 
+	struct GPUUniformBuffer *dummy_sss_profile;
+
 	uint sss_count;
 
 	float alpha_hash_offset;
@@ -433,6 +435,11 @@ static void create_default_shader(int options)
 	MEM_freeN(frag_str);
 }
 
+static void eevee_init_dummys(void)
+{
+	e_data.dummy_sss_profile = GPU_material_create_sss_profile_ubo();
+}
+
 static void eevee_init_noise_texture(void)
 {
 	e_data.noise_tex = DRW_texture_create_2D(64, 64, GPU_RGBA16F, 0, (float *)blue_noise);
@@ -621,6 +628,7 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata, EEVEE_StorageList *stl, E
 
 		eevee_init_util_texture();
 		eevee_init_noise_texture();
+		eevee_init_dummys();
 	}
 
 	if (!DRW_state_is_image_render() &&
@@ -1245,6 +1253,19 @@ static void material_opaque(
 							printf("Error: Too many different Subsurface shader in the scene.\n");
 						}
 					}
+					else {
+						if (use_translucency) {
+							/* NOTE: This is a nasty workaround, because the sss profile might not have been generated
+							 * but the UBO is still declared in this case even if not used. But rendering without a
+							 * bound UBO might result in crashes on certain platform. */
+							DRW_shgroup_uniform_block(*shgrp, "sssProfile", e_data.dummy_sss_profile);
+						}
+					}
+				}
+				else {
+					if (use_translucency) {
+						DRW_shgroup_uniform_block(*shgrp, "sssProfile", e_data.dummy_sss_profile);
+					}
 				}
 				break;
 			}
@@ -1776,6 +1797,7 @@ void EEVEE_materials_free(void)
 	DRW_SHADER_FREE_SAFE(e_data.update_noise_sh);
 	DRW_TEXTURE_FREE_SAFE(e_data.util_tex);
 	DRW_TEXTURE_FREE_SAFE(e_data.noise_tex);
+	DRW_UBO_FREE_SAFE(e_data.dummy_sss_profile);
 }
 
 void EEVEE_draw_default_passes(EEVEE_PassList *psl)
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index b724299935b..265ba15dc39 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -194,6 +194,7 @@ GPUMaterialStatus GPU_material_status(GPUMaterial *mat);
 
 struct GPUUniformBuffer *GPU_material_uniform_buffer_get(GPUMaterial *material);
 void GPU_material_uniform_buffer_create(GPUMaterial *material, ListBase *inputs);
+struct GPUUniformBuffer *GPU_material_create_sss_profile_ubo(void);
 
 void GPU_material_vertex_attributes(
         GPUMaterial *material,
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 986003c99e6..fa267102088 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -568,6 +568,11 @@ struct GPUUniformBuffer *GPU_material_sss_profile_get(GPUMaterial *material, int
 	return material->sss_profile;
 }
 
+struct GPUUniformBuffer *GPU_material_create_sss_profile_ubo(void)
+{
+	return GPU_uniformbuffer_create(sizeof(GPUSssKernelData), NULL, NULL);
+}
+
 #undef SSS_EXPONENT
 #undef SSS_SAMPLES



More information about the Bf-blender-cvs mailing list