[Bf-blender-cvs] [8f6ff3adfae] blender2.8: GPUShader: Add name for debugging & identifying shaders.

Clément Foucault noreply at git.blender.org
Thu Aug 2 18:36:41 CEST 2018


Commit: 8f6ff3adfae7b7f14e0bab293efd0c8231982c89
Author: Clément Foucault
Date:   Thu Aug 2 18:31:38 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB8f6ff3adfae7b7f14e0bab293efd0c8231982c89

GPUShader: Add name for debugging & identifying shaders.

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

M	source/blender/draw/intern/draw_manager_shader.c
M	source/blender/gpu/GPU_material.h
M	source/blender/gpu/GPU_shader.h
M	source/blender/gpu/intern/gpu_basic_shader.c
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/intern/gpu_shader.c
M	source/blender/gpu/intern/gpu_shader_private.h

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

diff --git a/source/blender/draw/intern/draw_manager_shader.c b/source/blender/draw/intern/draw_manager_shader.c
index b85e6267687..7aa40b0ce04 100644
--- a/source/blender/draw/intern/draw_manager_shader.c
+++ b/source/blender/draw/intern/draw_manager_shader.c
@@ -257,7 +257,7 @@ void DRW_deferred_shader_remove(GPUMaterial *mat)
 
 GPUShader *DRW_shader_create(const char *vert, const char *geom, const char *frag, const char *defines)
 {
-	return GPU_shader_create(vert, frag, geom, NULL, defines);
+	return GPU_shader_create(vert, frag, geom, NULL, defines, __func__);
 }
 
 GPUShader *DRW_shader_create_with_lib(
@@ -274,7 +274,7 @@ GPUShader *DRW_shader_create_with_lib(
 		geom_with_lib = BLI_string_joinN(lib, geom);
 	}
 
-	sh = GPU_shader_create(vert_with_lib, frag_with_lib, geom_with_lib, NULL, defines);
+	sh = GPU_shader_create(vert_with_lib, frag_with_lib, geom_with_lib, NULL, defines, __func__);
 
 	MEM_freeN(vert_with_lib);
 	MEM_freeN(frag_with_lib);
@@ -290,22 +290,22 @@ GPUShader *DRW_shader_create_with_transform_feedback(
         const GPUShaderTFBType prim_type, const char **varying_names, const int varying_count)
 {
 	return GPU_shader_create_ex(vert, NULL, geom, NULL, defines, GPU_SHADER_FLAGS_NONE,
-	                            prim_type, varying_names, varying_count);
+	                            prim_type, varying_names, varying_count, __func__);
 }
 
 GPUShader *DRW_shader_create_2D(const char *frag, const char *defines)
 {
-	return GPU_shader_create(datatoc_gpu_shader_2D_vert_glsl, frag, NULL, NULL, defines);
+	return GPU_shader_create(datatoc_gpu_shader_2D_vert_glsl, frag, NULL, NULL, defines, __func__);
 }
 
 GPUShader *DRW_shader_create_3D(const char *frag, const char *defines)
 {
-	return GPU_shader_create(datatoc_gpu_shader_3D_vert_glsl, frag, NULL, NULL, defines);
+	return GPU_shader_create(datatoc_gpu_shader_3D_vert_glsl, frag, NULL, NULL, defines, __func__);
 }
 
 GPUShader *DRW_shader_create_fullscreen(const char *frag, const char *defines)
 {
-	return GPU_shader_create(datatoc_common_fullscreen_vert_glsl, frag, NULL, NULL, defines);
+	return GPU_shader_create(datatoc_common_fullscreen_vert_glsl, frag, NULL, NULL, defines, __func__);
 }
 
 GPUShader *DRW_shader_create_3D_depth_only(void)
@@ -351,7 +351,7 @@ GPUMaterial *DRW_shader_create_from_world(
 	if (mat == NULL) {
 		mat = GPU_material_from_nodetree(
 		        scene, wo->nodetree, &wo->gpumaterial, engine_type, options,
-		        vert, geom, frag_lib, defines);
+		        vert, geom, frag_lib, defines, wo->id.name);
 	}
 
 	if (GPU_material_status(mat) == GPU_MAT_QUEUED) {
@@ -373,7 +373,7 @@ GPUMaterial *DRW_shader_create_from_material(
 	if (mat == NULL) {
 		mat = GPU_material_from_nodetree(
 		        scene, ma->nodetree, &ma->gpumaterial, engine_type, options,
-		        vert, geom, frag_lib, defines);
+		        vert, geom, frag_lib, defines, ma->id.name);
 	}
 
 	if (GPU_material_status(mat) == GPU_MAT_QUEUED) {
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index 9fea9eaf4e1..5945621cb65 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -247,7 +247,7 @@ GPUMaterial *GPU_material_from_nodetree_find(
         struct ListBase *gpumaterials, const void *engine_type, int options);
 GPUMaterial *GPU_material_from_nodetree(
         struct Scene *scene, struct bNodeTree *ntree, struct ListBase *gpumaterials, const void *engine_type, int options,
-        const char *vert_code, const char *geom_code, const char *frag_lib, const char *defines);
+        const char *vert_code, const char *geom_code, const char *frag_lib, const char *defines, const char *name);
 void GPU_material_compile(GPUMaterial *mat);
 void GPU_material_free(struct ListBase *gpumaterial);
 
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index 704abdb13a1..ec5ffc0f354 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -62,7 +62,8 @@ GPUShader *GPU_shader_create(
         const char *fragcode,
         const char *geocode,
         const char *libcode,
-        const char *defines);
+        const char *defines,
+        const char *shader_name);
 GPUShader *GPU_shader_create_ex(
         const char *vertexcode,
         const char *fragcode,
@@ -72,7 +73,8 @@ GPUShader *GPU_shader_create_ex(
         const int flags,
         const GPUShaderTFBType tf_type,
         const char **tf_names,
-        const int tf_count);
+        const int tf_count,
+        const char *shader_name);
 void GPU_shader_free(GPUShader *shader);
 
 void GPU_shader_bind(GPUShader *shader);
diff --git a/source/blender/gpu/intern/gpu_basic_shader.c b/source/blender/gpu/intern/gpu_basic_shader.c
index 61e8cf87038..1b7b1ecf85a 100644
--- a/source/blender/gpu/intern/gpu_basic_shader.c
+++ b/source/blender/gpu/intern/gpu_basic_shader.c
@@ -243,7 +243,8 @@ static GPUShader *gpu_basic_shader(int options)
 			datatoc_gpu_shader_basic_frag_glsl,
 			geom_glsl,
 			NULL,
-			defines);
+			defines,
+			__func__);
 
 		if (shader) {
 			/* set texture map to first texture unit */
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 3b9d2e08769..c6cf0c55594 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -1993,7 +1993,7 @@ GPUPass *GPU_generate_pass_new(
 	return pass;
 }
 
-void GPU_pass_compile(GPUPass *pass)
+void GPU_pass_compile(GPUPass *pass, const char *shname)
 {
 	if (!pass->compiled) {
 		pass->shader = GPU_shader_create(
@@ -2001,7 +2001,8 @@ void GPU_pass_compile(GPUPass *pass)
 		        pass->fragmentcode,
 		        pass->geometrycode,
 		        NULL,
-		        pass->defines);
+		        pass->defines,
+		        shname);
 		pass->compiled = true;
 	}
 }
diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h
index 278843fc948..4af87c6a226 100644
--- a/source/blender/gpu/intern/gpu_codegen.h
+++ b/source/blender/gpu/intern/gpu_codegen.h
@@ -184,7 +184,7 @@ void GPU_nodes_extract_dynamic_inputs(struct GPUShader *shader, ListBase *inputs
 void GPU_nodes_get_vertex_attributes(ListBase *nodes, struct GPUVertexAttribs *attribs);
 void GPU_nodes_prune(ListBase *nodes, struct GPUNodeLink *outlink);
 
-void GPU_pass_compile(GPUPass *pass);
+void GPU_pass_compile(GPUPass *pass, const char *shname);
 void GPU_pass_release(GPUPass *pass);
 void GPU_pass_free_nodes(ListBase *nodes);
 
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 5e0d9275aa2..9859f56c1db 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -43,6 +43,7 @@
 #include "BLI_math.h"
 #include "BLI_listbase.h"
 #include "BLI_utildefines.h"
+#include "BLI_string.h"
 
 #include "BKE_main.h"
 #include "BKE_node.h"
@@ -120,6 +121,10 @@ struct GPUMaterial {
 	short int sss_falloff;
 	float sss_sharpness;
 	bool sss_dirty;
+
+#ifndef NDEBUG
+	char name[64];
+#endif
 };
 
 enum {
@@ -581,7 +586,7 @@ GPUMaterial *GPU_material_from_nodetree_find(
  */
 GPUMaterial *GPU_material_from_nodetree(
         Scene *scene, struct bNodeTree *ntree, ListBase *gpumaterials, const void *engine_type, int options,
-        const char *vert_code, const char *geom_code, const char *frag_lib, const char *defines)
+        const char *vert_code, const char *geom_code, const char *frag_lib, const char *defines, const char *name)
 {
 	LinkData *link;
 	bool has_volume_output, has_surface_output;
@@ -594,6 +599,11 @@ GPUMaterial *GPU_material_from_nodetree(
 	mat->scene = scene;
 	mat->engine_type = engine_type;
 	mat->options = options;
+#ifndef NDEBUG
+	BLI_snprintf(mat->name, sizeof(mat->name), "%s", name);
+#else
+	UNUSED_VARS(name);
+#endif
 
 	/* localize tree to create links for reroute and mute */
 	bNodeTree *localtree = ntreeLocalize(ntree);
@@ -666,7 +676,12 @@ void GPU_material_compile(GPUMaterial *mat)
 
 	/* NOTE: The shader may have already been compiled here since we are
 	 * sharing GPUShader across GPUMaterials. In this case it's a no-op. */
-	GPU_pass_compile(mat->pass);
+#ifndef NDEBUG
+	GPU_pass_compile(mat->pass, mat->name);
+#else
+	GPU_pass_compile(mat->pass, __func__);
+#endif
+
 	GPUShader *sh = GPU_pass_shader_get(mat->pass);
 
 	if (sh != NULL) {
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 5346d3f1aee..3a6ad04b69a 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -31,6 +31,7 @@
 #include "BLI_math_base.h"
 #include "BLI_math_vector.h"
 #include "BLI_path_util.h"
+#include "BLI_string.h"
 
 #include "BKE_appdir.h"
 #include "BKE_global.h"
@@ -172,6 +173,8 @@ extern char datatoc_gpu_shader_gpencil_fill_frag_glsl[];
 /* cache of built-in shaders (each is created on first use) */
 static GPUShader *builtin_shaders[GPU_NUM_BUILTIN_SHADERS] = { NULL };
 
+static uint g_shaderid = 0;
+
 typedef struct {
 	const char *vert;
 	const char *frag;
@@ -272,7 +275,8 @@ GPUShader *GPU_shader_create(
         const char *fragcode,
         const char *geocode,
         const char *libcode,
-        const char *defines)
+        const char *defines,
+        const char *shname)
 {
 	return GPU_shader_create_ex(
 	        vertexcode,
@@ -283,7 +287,8 @@ GPUShader *GPU_shader_create(
 	        GPU_SHADER_FLAGS_NONE,
 	        GPU_SHADER_TFB_NONE,
 	        NULL,
-	        0);
+	        0,
+	        shname);
 }
 
 #define DEBUG_SHADER_NONE ""
@@ -342,7 +347,8 @@ GPUShader *GPU_shader_create_ex(
         const int flags,
         const GPUShaderTFBType tf_type,
         const char **tf_names,
-        const int tf_count)
+        const int tf_count,
+        const char *shname)
 {
 #ifdef WITH_OPENSUBDIV
 	bool use_opensubdiv = (flags & GPU_SHADER_FLAGS_SPECIAL_OPENSUBDIV) != 0;
@@ -360,6 +366,12 @@ GPUShader *GPU_shader_create_ex(
 	shader = MEM_callocN(sizeof(GPUShader), "GPUShader");
 	gpu_dump_shaders(NULL, 0, DEBUG_SHADER_NONE);
 
+#ifndef NDEBUG
+	BLI_snprintf(shader->name, sizeof(shader->name), "%s_%u", shname, g_shaderid++);
+#else
+	UNUSED_VARS(shname);
+#endif
+
 	if (vertexcode)
 		shader-

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list