[Bf-blender-cvs] [a0ae6d7] blender2.8: OpenGL: manage built-in shaders better

Mike Erwin noreply at git.blender.org
Wed Nov 9 05:54:55 CET 2016


Commit: a0ae6d7116c289335a870b5ff5360f896af327ba
Author: Mike Erwin
Date:   Tue Nov 8 22:53:59 2016 -0600
Branches: blender2.8
https://developer.blender.org/rBa0ae6d7116c289335a870b5ff5360f896af327ba

OpenGL: manage built-in shaders better

As our library of built-in shaders grows, it's important to create, access, and discard them efficiently.

Lookup via GPU_shader_get_builtin is now constant time instead of linear (# of built-in shaders). This is called very often with our new immediate mode.

Creation and discard are unified.

Adding a new shader requires fewer steps.

365 lines shorter  :D

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

M	source/blender/gpu/GPU_shader.h
M	source/blender/gpu/intern/gpu_shader.c

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

diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index cf7e00d..91214c3 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -85,11 +85,11 @@ int GPU_shader_get_attribute(GPUShader *shader, const char *name);
 
 /* Builtin/Non-generated shaders */
 typedef enum GPUBuiltinShader {
-	GPU_SHADER_VSM_STORE         = 0,
-	GPU_SHADER_SEP_GAUSSIAN_BLUR = 1,
-	GPU_SHADER_SMOKE             = 2,
-	GPU_SHADER_SMOKE_FIRE        = 3,
-	GPU_SHADER_SMOKE_COBA        = 4,
+	GPU_SHADER_VSM_STORE,
+	GPU_SHADER_SEP_GAUSSIAN_BLUR,
+	GPU_SHADER_SMOKE,
+	GPU_SHADER_SMOKE_FIRE,
+	GPU_SHADER_SMOKE_COBA,
 
 	/* specialized drawing */
 	GPU_SHADER_TEXT,
@@ -123,6 +123,8 @@ typedef enum GPUBuiltinShader {
 	GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_SMOOTH,
 	GPU_SHADER_3D_POINT_VARYING_SIZE_UNIFORM_COLOR,
 	GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR,
+
+	GPU_NUM_BUILTIN_SHADERS /* (not an actual shader) */
 } GPUBuiltinShader;
 
 GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader);
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 4f6206b..ae5aab2 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -107,50 +107,17 @@ extern char datatoc_gpu_shader_fx_dof_hq_geo_glsl[];
 extern char datatoc_gpu_shader_fx_depth_resolve_glsl[];
 extern char datatoc_gpu_shader_fx_lib_glsl[];
 
-static struct GPUShadersGlobal {
-	struct {
-		GPUShader *vsm_store;
-		GPUShader *sep_gaussian_blur;
-		GPUShader *smoke;
-		GPUShader *smoke_fire;
-		GPUShader *smoke_coba;
-		/* cache for shader fx. Those can exist in combinations so store them here */
-		GPUShader *fx_shaders[MAX_FX_SHADERS * 2];
-		/* specialized drawing */
-		GPUShader *text;
-		GPUShader *edges_front_back_persp;
-		GPUShader *edges_front_back_ortho;
-		GPUShader *edges_overlay_simple;
-		GPUShader *edges_overlay;
-		/* for drawing images */
-		GPUShader *image_mask_uniform_color_2D;
-		GPUShader *image_modulate_alpha_3D;
-		GPUShader *image_rect_modulate_alpha_3D;
-		GPUShader *image_depth_3D;
-		/* for simple 2D drawing */
-		GPUShader *uniform_color_2D;
-		GPUShader *flat_color_2D;
-		GPUShader *smooth_color_2D;
-		/* for simple 3D drawing */
-		GPUShader *uniform_color_3D;
-		GPUShader *flat_color_3D;
-		GPUShader *smooth_color_3D;
-		GPUShader *depth_only_3D;
-		/* points */
-		GPUShader *point_fixed_size_uniform_color_2D;
-		GPUShader *point_varying_size_varying_color_2D;
-		GPUShader *point_uniform_size_uniform_color_smooth_2D;
-		GPUShader *point_uniform_size_uniform_color_outline_smooth_2D;
-		GPUShader *point_uniform_size_varying_color_outline_smooth_2D;
-		GPUShader *point_fixed_size_uniform_color_3D;
-		GPUShader *point_fixed_size_varying_color_3D;
-		GPUShader *point_varying_size_uniform_color_3D;
-		GPUShader *point_varying_size_varying_color_3D;
-		GPUShader *point_uniform_size_uniform_color_smooth_3D;
-		GPUShader *point_uniform_size_uniform_color_outline_smooth_3D;
-	} shaders;
-} GG = {{NULL}};
+/* cache of built-in shaders (each is created on first use) */
+static GPUShader *builtin_shaders[GPU_NUM_BUILTIN_SHADERS] = { NULL };
 
+/* cache for shader fx. Those can exist in combinations so store them here */
+static GPUShader *fx_shaders[MAX_FX_SHADERS * 2] = { NULL };
+
+typedef struct {
+	const char *vert;
+	const char *frag;
+	const char *geom; /* geometry stage runs between vert & frag, but is less common, so it goes last */
+} GPUShaderStages;
 
 static void shader_print_errors(const char *task, const char *log, const char **code, int totcode)
 {
@@ -632,279 +599,100 @@ int GPU_shader_get_attribute(GPUShader *shader, const char *name)
 
 GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
 {
-	GPUShader *retval = NULL;
-
-	switch (shader) {
-		case GPU_SHADER_VSM_STORE:
-			if (!GG.shaders.vsm_store)
-				GG.shaders.vsm_store = GPU_shader_create(
-				        datatoc_gpu_shader_vsm_store_vert_glsl, datatoc_gpu_shader_vsm_store_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.vsm_store;
-			break;
-		case GPU_SHADER_SEP_GAUSSIAN_BLUR:
-			if (!GG.shaders.sep_gaussian_blur)
-				GG.shaders.sep_gaussian_blur = GPU_shader_create(
-				        datatoc_gpu_shader_sep_gaussian_blur_vert_glsl,
-				        datatoc_gpu_shader_sep_gaussian_blur_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.sep_gaussian_blur;
-			break;
-		case GPU_SHADER_SMOKE:
-			if (!GG.shaders.smoke)
-				GG.shaders.smoke = GPU_shader_create(
-				        datatoc_gpu_shader_smoke_vert_glsl, datatoc_gpu_shader_smoke_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.smoke;
-			break;
-		case GPU_SHADER_SMOKE_FIRE:
-			if (!GG.shaders.smoke_fire)
-				GG.shaders.smoke_fire = GPU_shader_create(
-				        datatoc_gpu_shader_smoke_vert_glsl, datatoc_gpu_shader_smoke_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.smoke_fire;
-			break;
-		case GPU_SHADER_SMOKE_COBA:
-			if (!GG.shaders.smoke_coba)
-				GG.shaders.smoke_coba = GPU_shader_create(
-				        datatoc_gpu_shader_smoke_vert_glsl, datatoc_gpu_shader_smoke_frag_glsl,
-				        NULL, NULL, "#define USE_COBA;\n", 0, 0, 0);
-			retval = GG.shaders.smoke_coba;
-			break;
-		case GPU_SHADER_TEXT:
-			if (!GG.shaders.text)
-				GG.shaders.text = GPU_shader_create(
-				        datatoc_gpu_shader_text_vert_glsl,
-				        datatoc_gpu_shader_text_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.text;
-			break;
-		case GPU_SHADER_EDGES_FRONT_BACK_PERSP:
-			if (!GG.shaders.edges_front_back_persp)
-				if (GLEW_VERSION_3_2) {
-					/* this version is magical but slooow */
-					GG.shaders.edges_front_back_persp = GPU_shader_create(
-					        datatoc_gpu_shader_edges_front_back_persp_vert_glsl,
-					        datatoc_gpu_shader_flat_color_frag_glsl,
-					        datatoc_gpu_shader_edges_front_back_persp_geom_glsl,
-					        NULL, NULL, 0, 0, 0);
-				}
-				else {
-					GG.shaders.edges_front_back_persp = GPU_shader_create(
-					        datatoc_gpu_shader_edges_front_back_persp_legacy_vert_glsl,
-					        datatoc_gpu_shader_flat_color_alpha_test_0_frag_glsl,
-					        NULL, NULL, NULL, 0, 0, 0);
-				}
-			retval = GG.shaders.edges_front_back_persp;
-			break;
-		case GPU_SHADER_EDGES_FRONT_BACK_ORTHO:
-			if (!GG.shaders.edges_front_back_ortho)
-				GG.shaders.edges_front_back_ortho = GPU_shader_create(
-				        datatoc_gpu_shader_edges_front_back_ortho_vert_glsl,
-				        datatoc_gpu_shader_flat_color_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.edges_front_back_ortho;
-			break;
-		case GPU_SHADER_EDGES_OVERLAY_SIMPLE:
-			if (!GG.shaders.edges_overlay_simple)
-				GG.shaders.edges_overlay_simple = GPU_shader_create(
-				        datatoc_gpu_shader_3D_vert_glsl,
-				        datatoc_gpu_shader_edges_overlay_frag_glsl,
-				        datatoc_gpu_shader_edges_overlay_simple_geom_glsl,
-				        NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.edges_overlay_simple;
-			break;
-		case GPU_SHADER_EDGES_OVERLAY:
-			if (!GG.shaders.edges_overlay)
-				GG.shaders.edges_overlay = GPU_shader_create(
-				        datatoc_gpu_shader_edges_overlay_vert_glsl,
-				        datatoc_gpu_shader_edges_overlay_frag_glsl,
-				        datatoc_gpu_shader_edges_overlay_geom_glsl,
-				        NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.edges_overlay;
-			break;
-		case GPU_SHADER_2D_IMAGE_MASK_UNIFORM_COLOR:
-			if (!GG.shaders.image_mask_uniform_color_2D)
-				GG.shaders.image_mask_uniform_color_2D = GPU_shader_create(
-				        datatoc_gpu_shader_3D_image_vert_glsl,
-				        datatoc_gpu_shader_image_mask_uniform_color_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.image_mask_uniform_color_2D;
-			break;
-		case GPU_SHADER_3D_IMAGE_MODULATE_ALPHA:
-			if (!GG.shaders.image_modulate_alpha_3D)
-				GG.shaders.image_modulate_alpha_3D = GPU_shader_create(
-				        datatoc_gpu_shader_3D_image_vert_glsl,
-				        datatoc_gpu_shader_image_modulate_alpha_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.image_modulate_alpha_3D;
-			break;
-		case GPU_SHADER_3D_IMAGE_RECT_MODULATE_ALPHA:
-			if (!GG.shaders.image_rect_modulate_alpha_3D)
-				GG.shaders.image_rect_modulate_alpha_3D = GPU_shader_create(
-				datatoc_gpu_shader_3D_image_vert_glsl,
-				datatoc_gpu_shader_image_rect_modulate_alpha_frag_glsl,
-				NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.image_rect_modulate_alpha_3D;
-			break;
-		case GPU_SHADER_3D_IMAGE_DEPTH:
-			if (!GG.shaders.image_depth_3D)
-				GG.shaders.image_depth_3D = GPU_shader_create(
-				        datatoc_gpu_shader_3D_image_vert_glsl,
-				        datatoc_gpu_shader_image_depth_linear_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.image_depth_3D;
-			break;
-		case GPU_SHADER_2D_UNIFORM_COLOR:
-			if (!GG.shaders.uniform_color_2D)
-				GG.shaders.uniform_color_2D = GPU_shader_create(
-				        datatoc_gpu_shader_2D_vert_glsl,
-				        datatoc_gpu_shader_uniform_color_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.uniform_color_2D;
-			break;
-		case GPU_SHADER_2D_FLAT_COLOR:
-			if (!GG.shaders.flat_color_2D)
-				GG.shaders.flat_color_2D = GPU_shader_create(
-				        datatoc_gpu_shader_2D_flat_color_vert_glsl,
-				        datatoc_gpu_shader_flat_color_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.flat_color_2D;
-			break;
-		case GPU_SHADER_2D_SMOOTH_COLOR:
-			if (!GG.shaders.smooth_color_2D)
-				GG.shaders.smooth_color_2D = GPU_shader_create(
-				        datatoc_gpu_shader_2D_smooth_color_vert_glsl,
-				        datatoc_gpu_shader_2D_smooth_color_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-			retval = GG.shaders.smooth_color_2D;
-			break;
-		case GPU_SHADER_3D_UNIFORM_COLOR:
-			if (!GG.shaders.uniform_color_3D)
-				GG.shaders.uniform_color_3D = GPU_shader_create(
-				        datatoc_gpu_shader_3D_vert_glsl,
-				        datatoc_gpu_shader_uniform_color_frag_glsl,
-				        NULL, NULL, NULL, 0, 0, 0);
-	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list