[Bf-blender-cvs] [e868b459bb8] blender2.8: Eevee: World nodetree gpumaterial compatibility.

Clément Foucault noreply at git.blender.org
Mon May 1 18:11:28 CEST 2017


Commit: e868b459bb8efc35012b2364762f3d25d96b8b0d
Author: Clément Foucault
Date:   Thu Apr 27 22:27:09 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBe868b459bb8efc35012b2364762f3d25d96b8b0d

Eevee: World nodetree gpumaterial compatibility.

- Unify GPUMaterial creation (world/mesh).
- Support for multiple shader variations (not used for now).
- Convert GPUInputs to DRWUniforms to be used with the draw manager.
- Nodetree Update is not supported. The only way to refresh the shaders is to change render engine.
- Cleanup in GPUPass.
- Add new temporary Node Compatibility type. Compatibility types should be removed in the future.

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
M	source/blender/draw/engines/eevee/shaders/default_frag.glsl
M	source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
M	source/blender/draw/engines/eevee/shaders/probe_geom.glsl
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/gpu/GPU_material.h
M	source/blender/gpu/intern/gpu_codegen.c
M	source/blender/gpu/intern/gpu_codegen.h
M	source/blender/gpu/intern/gpu_material.c
M	source/blender/gpu/shaders/gpu_shader_material.glsl
M	source/blender/makesrna/intern/rna_world.c
M	source/blender/nodes/shader/nodes/node_shader_tex_environment.c

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 01d93d98540..219bca0a1a9 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -253,6 +253,7 @@ typedef struct bNodeType {
 /* nodetype->compatibility */
 #define NODE_OLD_SHADING	1
 #define NODE_NEW_SHADING	2
+#define NODE_NEWER_SHADING	3
 
 /* node resize directions */
 #define NODE_RESIZE_TOP		1
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 6fa99b37ced..5f7c7787cfc 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -29,6 +29,8 @@
 
 #include "BLI_dynstr.h"
 #include "BLI_rand.h"
+
+#include "GPU_material.h"
 #include "GPU_glew.h"
 
 #include "eevee_engine.h"
@@ -39,6 +41,8 @@
 
 /* *********** STATIC *********** */
 static struct {
+	char *frag_shader_lib;
+
 	struct GPUShader *default_lit;
 	struct GPUShader *default_world;
 	struct GPUShader *depth_sh;
@@ -214,6 +218,16 @@ static void EEVEE_engine_init(void *ved)
 	                    (int)viewport_size[0], (int)viewport_size[1],
 	                    &tex, 1);
 
+	if (!e_data.frag_shader_lib) {
+		DynStr *ds_frag = BLI_dynstr_new();
+		BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_ltc_lib_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_lit_surface_frag_glsl);
+		e_data.frag_shader_lib = BLI_dynstr_get_cstring(ds_frag);
+		BLI_dynstr_free(ds_frag);
+	}
+
 	if (!e_data.depth_sh) {
 		e_data.depth_sh = DRW_shader_create_3D_depth_only();
 	}
@@ -222,10 +236,7 @@ static void EEVEE_engine_init(void *ved)
 		char *frag_str = NULL;
 
 		DynStr *ds_frag = BLI_dynstr_new();
-		BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_ltc_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl);
-		BLI_dynstr_append(ds_frag, datatoc_lit_surface_frag_glsl);
+		BLI_dynstr_append(ds_frag, e_data.frag_shader_lib);
 		BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl);
 		frag_str = BLI_dynstr_get_cstring(ds_frag);
 		BLI_dynstr_free(ds_frag);
@@ -345,6 +356,8 @@ static DRWShadingGroup *eevee_cascade_shadow_shgroup(
 
 static void EEVEE_cache_init(void *vedata)
 {
+	static int zero = 0;
+
 	EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
 	EEVEE_TextureList *txl = ((EEVEE_Data *)vedata)->txl;
 	EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
@@ -373,26 +386,48 @@ static void EEVEE_cache_init(void *vedata)
 		psl->probe_background = DRW_pass_create("Probe Background Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR);
 
 		struct Batch *geom = DRW_cache_fullscreen_quad_get();
-		DRWShadingGroup *grp;
+		DRWShadingGroup *grp = NULL;
 
 		const DRWContextState *draw_ctx = DRW_context_state_get();
 		Scene *scene = draw_ctx->scene;
 		World *wo = scene->world;
 
-		if (false) { /* TODO check for world nodetree */
-			// GPUMaterial *gpumat = GPU_material_from_nodetree(struct bNodeTree *ntree, ListBase *gpumaterials, void *engine_type, int options)
+		float *col = ts.colorBackground;
+		if (wo) {
+			col = &wo->horr;
 		}
-		else {
-			float *col = ts.colorBackground;
-			static int zero = 0;
 
-			if (wo) {
-				col = &wo->horr;
+		if (wo && wo->use_nodes && wo->nodetree) {
+			struct GPUMaterial *gpumat = GPU_material_from_nodetree(
+				wo->nodetree, &wo->gpumaterial, &DRW_engine_viewport_eevee_type, 0,
+			    datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, e_data.frag_shader_lib,
+			    "#define PROBE_CAPTURE\n"
+			    "#define MAX_LIGHT 128\n"
+			    "#define MAX_SHADOW_CUBE 42\n"
+			    "#define MAX_SHADOW_MAP 64\n"
+			    "#define MAX_SHADOW_CASCADE 8\n"
+			    "#define MAX_CASCADE_NUM 4\n");
+
+			grp = DRW_shgroup_material_instance_create(gpumat, psl->probe_background, geom);
+
+			if (grp) {
+				DRW_shgroup_uniform_int(grp, "Layer", &zero, 1);
+
+				for (int i = 0; i < 6; ++i)
+					DRW_shgroup_call_dynamic_add_empty(grp);
+			}
+			else {
+				/* Shader failed : pink background */
+				static float pink[3] = {1.0f, 0.0f, 1.0f};
+				col = pink;
 			}
+		}
 
+		/* Fallback if shader fails or if not using nodetree. */
+		if (grp == NULL) {
 			grp = eevee_cube_shgroup(e_data.default_world, psl->probe_background, geom);
-			DRW_shgroup_uniform_int(grp, "Layer", &zero, 1);
 			DRW_shgroup_uniform_vec3(grp, "color", col, 1);
+			DRW_shgroup_uniform_int(grp, "Layer", &zero, 1);
 		}
 	}
 
@@ -591,6 +626,7 @@ static void EEVEE_draw_scene(void *vedata)
 
 static void EEVEE_engine_free(void)
 {
+	MEM_SAFE_FREE(e_data.frag_shader_lib);
 	DRW_SHADER_FREE_SAFE(e_data.default_lit);
 	DRW_SHADER_FREE_SAFE(e_data.shadow_sh);
 	DRW_SHADER_FREE_SAFE(e_data.default_world);
@@ -628,7 +664,7 @@ DrawEngineType draw_engine_eevee_type = {
 
 RenderEngineType DRW_engine_viewport_eevee_type = {
 	NULL, NULL,
-	EEVEE_ENGINE, N_("Eevee"), RE_INTERNAL | RE_USE_OGL_PIPELINE,
+	EEVEE_ENGINE, N_("Eevee"), RE_INTERNAL | RE_USE_OGL_PIPELINE | RE_USE_SHADING_NODES,
 	NULL, NULL, NULL, NULL, NULL, NULL, &EEVEE_collection_settings_create,
 	&draw_engine_eevee_type,
 	{NULL, NULL, NULL}
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
index fddc9c54cb2..ef8af646ec1 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
@@ -54,7 +54,7 @@ struct ShadowMapData {
 #define sh_map_bias   near_far_bias.z
 
 #ifndef MAX_CASCADE_NUM
-#define MAX_CASCADE_NUM 1
+#define MAX_CASCADE_NUM 4
 #endif
 
 struct ShadowCascadeData {
@@ -94,8 +94,6 @@ vec4 saturate(vec4 a) { return vec4(saturate(a.x), saturate(a.y), saturate(a.z),
 float distance_squared(vec2 a, vec2 b) { a -= b; return dot(a, a); }
 float distance_squared(vec3 a, vec3 b) { a -= b; return dot(a, a); }
 
-float hypot(float x, float y) { return sqrt(x*x + y*y); }
-
 float inverse_distance(vec3 V) { return max( 1 / length(V), 1e-8); }
 
 float line_plane_intersect_dist(vec3 lineorigin, vec3 linedirection, vec3 planeorigin, vec3 planenormal)
diff --git a/source/blender/draw/engines/eevee/shaders/default_frag.glsl b/source/blender/draw/engines/eevee/shaders/default_frag.glsl
index 4cb229e392b..8d4a1e6d523 100644
--- a/source/blender/draw/engines/eevee/shaders/default_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/default_frag.glsl
@@ -3,9 +3,11 @@ uniform vec3 diffuse_col;
 uniform vec3 specular_col;
 uniform int hardness;
 
+out vec4 FragColor;
+
 void main()
 {
 	float roughness = 1.0 - float(hardness) / 511.0;
 	roughness *= roughness;
-	fragColor = vec4(eevee_surface_lit(worldNormal, diffuse_col, specular_col, roughness), 1.0);
+	FragColor = vec4(eevee_surface_lit(worldNormal, diffuse_col, specular_col, roughness), 1.0);
 }
diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
index 7a0a7b8da91..10d9ce7c4c0 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
@@ -28,8 +28,6 @@ layout(std140) uniform shadow_block {
 in vec3 worldPosition;
 in vec3 worldNormal;
 
-out vec4 fragColor;
-
 /* type */
 #define POINT    0.0
 #define SUN      1.0
diff --git a/source/blender/draw/engines/eevee/shaders/probe_geom.glsl b/source/blender/draw/engines/eevee/shaders/probe_geom.glsl
index ad112977e9f..5f79e1c6eb8 100644
--- a/source/blender/draw/engines/eevee/shaders/probe_geom.glsl
+++ b/source/blender/draw/engines/eevee/shaders/probe_geom.glsl
@@ -8,7 +8,7 @@ in vec4 vPos[];
 in int face[];
 
 out vec3 worldPosition;
-out vec3 worldNormal;
+out vec3 worldNormal; /* Required. otherwise generate linking error on AMD. */
 
 const vec3 maj_axes[6] = vec3[6](vec3(1.0,  0.0,  0.0), vec3(-1.0,  0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, -1.0,  0.0), vec3( 0.0,  0.0, 1.0), vec3( 0.0,  0.0, -1.0));
 const vec3 x_axis[6]   = vec3[6](vec3(0.0,  0.0, -1.0), vec3( 0.0,  0.0, 1.0), vec3(1.0, 0.0, 0.0), vec3(1.0,  0.0,  0.0), vec3( 1.0,  0.0, 0.0), vec3(-1.0,  0.0,  0.0));
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 39b8e23db80..29295e8f06d 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -56,6 +56,7 @@
 struct bContext;
 struct GPUFrameBuffer;
 struct GPUShader;
+struct GPUMaterial;
 struct GPUTexture;
 struct GPUUniformBuffer;
 struct Object;
@@ -245,6 +246,8 @@ typedef enum {
 } DRWState;
 
 DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass);
+DRWShadingGroup *DRW_shgroup_material_create(struct GPUMaterial *material, DRWPass *pass);
+DRWShadingGroup *DRW_shgroup_material_instance_create(struct GPUMaterial *material, DRWPass *pass, struct Batch *geom);
 DRWShadingGroup *DRW_shgroup_instance_create(struct GPUShader *shader, DRWPass *pass, struct Batch *geom);
 DRWShadingGroup *DRW_shgroup_point_batch_create(struct GPUShader *shader, DRWPass *pass);
 DRWShadingGroup *DRW_shgroup_line_batch_create(struct GPUShader *shader, DRWPass *pass);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 97cd1102406..059ebc6eab3 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -47,11 +47,13 @@
 #include "ED_space_api.h"
 #include "ED_screen.h"
 
+#include "intern/gpu_codegen.h"
 #include "GPU_batch.h"
 #include "GPU_draw.h"
 #include "GPU_extensions.h"
 #include "GPU_framebuffer.h"
 #include "GPU_lamp.h"
+#include "GPU_material.h"
 #include "GPU_shader.h"
 #include "GPU_texture.h"
 #include "GPU_uniformbuffer.h"
@@ -614,6 +616,80 @@ DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass)
 	return shgroup;
 }
 
+DRWShadingGroup *DRW_shgroup_material_create(struct GPUMaterial *material, DRWPass *pass)
+{
+	double time = 0.0; /* TODO make time variable */
+	const int max_tex = GPU_max_textures() - 1;
+
+	/* TODO : Ideally we should not convert. But si

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list