[Bf-blender-cvs] [1f458895f86] blender2.8: Fix crash when rendering a scene first and then goes to eevee preview modes and cleanup

mano-wii noreply at git.blender.org
Fri Nov 16 17:50:14 CET 2018


Commit: 1f458895f86bbc7eb731f919924da0b32ff14ed3
Author: mano-wii
Date:   Fri Nov 16 13:46:13 2018 -0200
Branches: blender2.8
https://developer.blender.org/rB1f458895f86bbc7eb731f919924da0b32ff14ed3

Fix crash when rendering a scene first and then goes to eevee preview modes and cleanup

The crash only occurs with Intel 3rd generation GPUs.
It occurs because the program needs to be used at least once in the opengl context in which it is created.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee_effects.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_lightprobes.c
M	source/blender/draw/engines/eevee/eevee_lookdev.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/eevee/eevee_private.h
A	source/blender/draw/engines/eevee/eevee_shaders.c
M	source/blender/draw/engines/eevee/eevee_temporal_sampling.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index be742868cd6..2097fb66c8b 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -105,6 +105,7 @@ set(SRC
 	engines/eevee/eevee_occlusion.c
 	engines/eevee/eevee_render.c
 	engines/eevee/eevee_screen_raytrace.c
+	engines/eevee/eevee_shaders.c
 	engines/eevee/eevee_subsurface.c
 	engines/eevee/eevee_temporal_sampling.c
 	engines/eevee/eevee_volumes.c
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 687d5035ea2..48a73ccef18 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -52,9 +52,6 @@ static struct {
 	struct GPUShader *downsample_sh;
 	struct GPUShader *downsample_cube_sh;
 
-	/* Velocity Resolve */
-	struct GPUShader *velocity_resolve_sh;
-
 	/* Theses are just references, not actually allocated */
 	struct GPUTexture *depth_src;
 	struct GPUTexture *color_src;
@@ -66,25 +63,15 @@ static struct {
 extern char datatoc_common_uniforms_lib_glsl[];
 extern char datatoc_common_view_lib_glsl[];
 extern char datatoc_bsdf_common_lib_glsl[];
-extern char datatoc_effect_velocity_resolve_frag_glsl[];
 extern char datatoc_effect_minmaxz_frag_glsl[];
 extern char datatoc_effect_downsample_frag_glsl[];
 extern char datatoc_effect_downsample_cube_frag_glsl[];
 extern char datatoc_lightprobe_vert_glsl[];
 extern char datatoc_lightprobe_geom_glsl[];
 
+
 static void eevee_create_shader_downsample(void)
 {
-	char *frag_str = BLI_string_joinN(
-	    datatoc_common_uniforms_lib_glsl,
-	    datatoc_common_view_lib_glsl,
-	    datatoc_bsdf_common_lib_glsl,
-	    datatoc_effect_velocity_resolve_frag_glsl);
-
-	e_data.velocity_resolve_sh = DRW_shader_create_fullscreen(frag_str, NULL);
-
-	MEM_freeN(frag_str);
-
 	e_data.downsample_sh = DRW_shader_create_fullscreen(datatoc_effect_downsample_frag_glsl, NULL);
 	e_data.downsample_cube_sh = DRW_shader_create(
 	        datatoc_lightprobe_vert_glsl,
@@ -377,7 +364,7 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 		/* This pass compute camera motions to the non moving objects. */
 		psl->velocity_resolve = DRW_pass_create(
 		        "Velocity Resolve", DRW_STATE_WRITE_COLOR);
-		DRWShadingGroup *grp = DRW_shgroup_create(e_data.velocity_resolve_sh, psl->velocity_resolve);
+		DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_velocity_resolve_sh_get(), psl->velocity_resolve);
 		DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src);
 		DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
 		DRW_shgroup_uniform_mat4(grp, "currPersinv", effects->velocity_curr_persinv);
@@ -576,8 +563,6 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
 
 void EEVEE_effects_free(void)
 {
-	DRW_SHADER_FREE_SAFE(e_data.velocity_resolve_sh);
-
 	DRW_SHADER_FREE_SAFE(e_data.downsample_sh);
 	DRW_SHADER_FREE_SAFE(e_data.downsample_cube_sh);
 
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index e9d67b73a0d..aa2cf3fede3 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -436,6 +436,7 @@ static void eevee_render_to_image(void *vedata, RenderEngine *engine, struct Ren
 
 static void eevee_engine_free(void)
 {
+	EEVEE_shaders_free();
 	EEVEE_bloom_free();
 	EEVEE_depth_of_field_free();
 	EEVEE_effects_free();
@@ -447,7 +448,6 @@ static void eevee_engine_free(void)
 	EEVEE_occlusion_free();
 	EEVEE_screen_raytrace_free();
 	EEVEE_subsurface_free();
-	EEVEE_temporal_sampling_free();
 	EEVEE_volumes_free();
 }
 
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 37276987f8d..a636eac8b93 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -54,20 +54,7 @@
 #include "WM_api.h"
 #include "WM_types.h"
 
-#define HAMMERSLEY_SIZE 1024
-
 static struct {
-	struct GPUShader *probe_default_sh;
-	struct GPUShader *probe_default_studiolight_sh;
-	struct GPUShader *probe_filter_glossy_sh;
-	struct GPUShader *probe_filter_diffuse_sh;
-	struct GPUShader *probe_filter_visibility_sh;
-	struct GPUShader *probe_grid_fill_sh;
-	struct GPUShader *probe_grid_display_sh;
-	struct GPUShader *probe_planar_display_sh;
-	struct GPUShader *probe_planar_downsample_sh;
-	struct GPUShader *probe_cube_display_sh;
-
 	struct GPUTexture *hammersley;
 	struct GPUTexture *planar_pool_placeholder;
 	struct GPUTexture *depth_placeholder;
@@ -78,31 +65,6 @@ static struct {
 	struct GPUVertFormat *format_probe_display_planar;
 } e_data = {NULL}; /* Engine data */
 
-extern char datatoc_background_vert_glsl[];
-extern char datatoc_default_world_frag_glsl[];
-extern char datatoc_lightprobe_filter_glossy_frag_glsl[];
-extern char datatoc_lightprobe_filter_diffuse_frag_glsl[];
-extern char datatoc_lightprobe_filter_visibility_frag_glsl[];
-extern char datatoc_lightprobe_geom_glsl[];
-extern char datatoc_lightprobe_vert_glsl[];
-extern char datatoc_lightprobe_planar_display_frag_glsl[];
-extern char datatoc_lightprobe_planar_display_vert_glsl[];
-extern char datatoc_lightprobe_planar_downsample_frag_glsl[];
-extern char datatoc_lightprobe_planar_downsample_geom_glsl[];
-extern char datatoc_lightprobe_planar_downsample_vert_glsl[];
-extern char datatoc_lightprobe_cube_display_frag_glsl[];
-extern char datatoc_lightprobe_cube_display_vert_glsl[];
-extern char datatoc_lightprobe_grid_display_frag_glsl[];
-extern char datatoc_lightprobe_grid_display_vert_glsl[];
-extern char datatoc_lightprobe_grid_fill_frag_glsl[];
-extern char datatoc_irradiance_lib_glsl[];
-extern char datatoc_lightprobe_lib_glsl[];
-extern char datatoc_octahedron_lib_glsl[];
-extern char datatoc_bsdf_common_lib_glsl[];
-extern char datatoc_common_uniforms_lib_glsl[];
-extern char datatoc_common_view_lib_glsl[];
-extern char datatoc_bsdf_sampling_lib_glsl[];
-
 extern GlobalsUboStorage ts;
 
 /* *********** FUNCTIONS *********** */
@@ -185,121 +147,6 @@ static void planar_pool_ensure_alloc(EEVEE_Data *vedata, int num_planar_ref)
 	}
 }
 
-static void lightprobe_shaders_init(void)
-{
-	const char *filter_defines = "#define HAMMERSLEY_SIZE " STRINGIFY(HAMMERSLEY_SIZE) "\n"
-#if defined(IRRADIANCE_SH_L2)
-	                             "#define IRRADIANCE_SH_L2\n"
-#elif defined(IRRADIANCE_CUBEMAP)
-	                             "#define IRRADIANCE_CUBEMAP\n"
-#elif defined(IRRADIANCE_HL2)
-	                             "#define IRRADIANCE_HL2\n"
-#endif
-	                             "#define NOISE_SIZE 64\n";
-
-	char *shader_str = NULL;
-	char *vert_str = NULL;
-
-	shader_str = BLI_string_joinN(
-	        datatoc_common_view_lib_glsl,
-	        datatoc_common_uniforms_lib_glsl,
-	        datatoc_bsdf_common_lib_glsl,
-	        datatoc_bsdf_sampling_lib_glsl,
-	        datatoc_lightprobe_filter_glossy_frag_glsl);
-
-	e_data.probe_filter_glossy_sh = DRW_shader_create(
-	        datatoc_lightprobe_vert_glsl, datatoc_lightprobe_geom_glsl, shader_str, filter_defines);
-
-	e_data.probe_default_sh = DRW_shader_create(
-	        datatoc_background_vert_glsl, NULL, datatoc_default_world_frag_glsl, NULL);
-
-	e_data.probe_default_studiolight_sh = DRW_shader_create(
-	        datatoc_background_vert_glsl, NULL, datatoc_default_world_frag_glsl, "#define LOOKDEV\n");
-
-	MEM_freeN(shader_str);
-
-	shader_str = BLI_string_joinN(
-	        datatoc_common_view_lib_glsl,
-	        datatoc_common_uniforms_lib_glsl,
-	        datatoc_bsdf_common_lib_glsl,
-	        datatoc_bsdf_sampling_lib_glsl,
-	        datatoc_lightprobe_filter_diffuse_frag_glsl);
-
-	e_data.probe_filter_diffuse_sh = DRW_shader_create_fullscreen(shader_str, filter_defines);
-
-	MEM_freeN(shader_str);
-
-	shader_str = BLI_string_joinN(
-	        datatoc_common_view_lib_glsl,
-	        datatoc_common_uniforms_lib_glsl,
-	        datatoc_bsdf_common_lib_glsl,
-	        datatoc_bsdf_sampling_lib_glsl,
-	        datatoc_lightprobe_filter_visibility_frag_glsl);
-
-	e_data.probe_filter_visibility_sh = DRW_shader_create_fullscreen(shader_str, filter_defines);
-
-	MEM_freeN(shader_str);
-
-	shader_str = BLI_string_joinN(
-	        datatoc_octahedron_lib_glsl,
-	        datatoc_common_view_lib_glsl,
-	        datatoc_common_uniforms_lib_glsl,
-	        datatoc_bsdf_common_lib_glsl,
-	        datatoc_irradiance_lib_glsl,
-	        datatoc_lightprobe_lib_glsl,
-	        datatoc_lightprobe_grid_display_frag_glsl);
-
-	vert_str = BLI_string_joinN(
-	        datatoc_common_view_lib_glsl,
-	        datatoc_lightprobe_grid_display_vert_glsl);
-
-	e_data.probe_grid_display_sh = DRW_shader_create(vert_str, NULL, shader_str, filter_defines);
-
-	MEM_freeN(vert_str);
-	MEM_freeN(shader_str);
-
-	e_data.probe_grid_fill_sh = DRW_shader_create_fullscreen(
-	        datatoc_lightprobe_grid_fill_frag_glsl, filter_defines);
-
-	shader_str = BLI_string_joinN(
-	        datatoc_octahedron_lib_glsl,
-	        datatoc_common_view_lib_glsl,
-	        datatoc_common_uniforms_lib_glsl,
-	        datatoc_bsdf_common_lib_glsl,
-	        datatoc_lightprobe_lib_glsl,
-	        datatoc_lightprobe_cube_display_frag_glsl);
-
-	vert_str = BLI_string_joinN(
-	        datatoc_common_view_lib_glsl,
-	        datatoc_lightprobe_cube_display_vert_glsl);
-
-	e_data.probe_cube_display_sh = DRW_shader_create(vert_str, NULL, shader_str, SHADER_DEFINES);
-
-	MEM_freeN(vert_str);
-	MEM_freeN(shader_str);
-
-	vert_str = BLI_string_joinN(
-	        datatoc_common_view_lib_glsl,
-	        datatoc_lightprobe_planar_display_vert_glsl);
-
-	shader_str = BLI_string_joinN(
-	        datatoc_common_view_lib_glsl,
-	        datatoc_lightprobe_planar_display_frag_glsl);
-
-	e_data.probe_planar_display_sh = DRW_shader_create(vert_str, NULL, shader_str, NULL);
-
-	MEM_freeN(vert_str);
-	MEM_freeN(shader_str);
-
-	e_data.probe_planar_downsample_sh = DRW_shader_create(
-	        datatoc_lightprobe_planar_downsample_vert_glsl,
-	        datatoc_lightprobe_planar_downsample_geom_glsl,
-	      

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list