[Bf-blender-cvs] [dbd7f36da8e] master: GPU: refactor clipped drawing from DRW into GPU

Campbell Barton noreply at git.blender.org
Wed Feb 6 00:11:11 CET 2019


Commit: dbd7f36da8ec3ac1c2898aee346beecb86aac8a2
Author: Campbell Barton
Date:   Wed Feb 6 09:15:16 2019 +1100
Branches: master
https://developer.blender.org/rBdbd7f36da8ec3ac1c2898aee346beecb86aac8a2

GPU: refactor clipped drawing from DRW into GPU

Needed to fix T61196, supporting clipped back-buffer in the 3D view
which is done outside the draw module.

It was also inconvenient having DRW_shader_* versions of GPU_shader_*
API calls.

- Clipping distances are now supported as a shader configuration
  for builtin shaders.
- Add shader config argument when accessing builtin shaders.
- Move GPU_shader_create_from_arrays() from DRW to GPU.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/basic/basic_engine.c
M	source/blender/draw/engines/external/external_engine.c
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/intern/DRW_render.h
D	source/blender/draw/intern/draw_builtin_shader.c
D	source/blender/draw/intern/draw_builtin_shader.h
M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/intern/draw_common.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_manager_shader.c
M	source/blender/draw/modes/edit_lattice_mode.c
M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/draw/modes/object_mode.c
M	source/blender/draw/modes/overlay_mode.c
M	source/blender/draw/modes/paint_vertex_mode.c
M	source/blender/draw/modes/paint_weight_mode.c
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/GPU_shader.h
M	source/blender/gpu/intern/gpu_shader.c
R100	source/blender/draw/modes/shaders/common_world_clip_lib.glsl	source/blender/gpu/shaders/gpu_shader_cfg_world_clip_lib.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 1b7c2a15cc3..74a9b3ae21e 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -50,7 +50,6 @@ set(INC_SYS
 set(SRC
 	intern/draw_anim_viz.c
 	intern/draw_armature.c
-	intern/draw_builtin_shader.c
 	intern/draw_cache.c
 	intern/draw_cache_impl_curve.c
 	intern/draw_cache_impl_displist.c
@@ -130,7 +129,6 @@ set(SRC
 
 	DRW_engine.h
 	intern/DRW_render.h
-	intern/draw_builtin_shader.h
 	intern/draw_cache.h
 	intern/draw_cache_impl.h
 	intern/draw_common.h
@@ -248,7 +246,6 @@ data_to_c_simple(modes/shaders/common_hair_refine_vert.glsl SRC)
 data_to_c_simple(modes/shaders/common_view_lib.glsl SRC)
 data_to_c_simple(modes/shaders/common_fxaa_lib.glsl SRC)
 data_to_c_simple(modes/shaders/common_fullscreen_vert.glsl SRC)
-data_to_c_simple(modes/shaders/common_world_clip_lib.glsl SRC)
 data_to_c_simple(modes/shaders/animviz_mpath_lines_vert.glsl SRC)
 data_to_c_simple(modes/shaders/animviz_mpath_lines_geom.glsl SRC)
 data_to_c_simple(modes/shaders/animviz_mpath_points_vert.glsl SRC)
diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c
index d22f4ccb86c..cdc625fc297 100644
--- a/source/blender/draw/engines/basic/basic_engine.c
+++ b/source/blender/draw/engines/basic/basic_engine.c
@@ -65,7 +65,7 @@ typedef struct BASIC_Shaders {
 /* *********** STATIC *********** */
 
 static struct {
-	BASIC_Shaders sh_data[DRW_SHADER_SLOT_LEN];
+	BASIC_Shaders sh_data[GPU_SHADER_CFG_LEN];
 } e_data = {NULL}; /* Engine data */
 
 typedef struct BASIC_PrivateData {
@@ -79,11 +79,11 @@ typedef struct BASIC_PrivateData {
 static void basic_engine_init(void *UNUSED(vedata))
 {
 	const DRWContextState *draw_ctx = DRW_context_state_get();
-	BASIC_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot];
+	BASIC_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_cfg];
 
 	/* Depth prepass */
 	if (!sh_data->depth) {
-		sh_data->depth = DRW_shader_create_3D_depth_only(draw_ctx->shader_slot);
+		sh_data->depth = DRW_shader_create_3D_depth_only(draw_ctx->shader_cfg);
 	}
 }
 
@@ -93,7 +93,7 @@ static void basic_cache_init(void *vedata)
 	BASIC_StorageList *stl = ((BASIC_Data *)vedata)->stl;
 
 	const DRWContextState *draw_ctx = DRW_context_state_get();
-	BASIC_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot];
+	BASIC_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_cfg];
 	const RegionView3D *rv3d = draw_ctx->rv3d;
 	const bool is_clip = (rv3d->rflag & RV3D_CLIPPING) != 0;
 
diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c
index d7e290917aa..d4930889449 100644
--- a/source/blender/draw/engines/external/external_engine.c
+++ b/source/blender/draw/engines/external/external_engine.c
@@ -91,7 +91,7 @@ static void external_engine_init(void *UNUSED(vedata))
 {
 	/* Depth prepass */
 	if (!e_data.depth_sh) {
-		e_data.depth_sh = DRW_shader_create_3D_depth_only(DRW_SHADER_SLOT_DEFAULT);
+		e_data.depth_sh = DRW_shader_create_3D_depth_only(GPU_SHADER_CFG_DEFAULT);
 	}
 }
 
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 18b4712cc86..0991546e74b 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -88,7 +88,7 @@ static struct {
 
 /* Shaders */
 extern char datatoc_common_hair_lib_glsl[];
-extern char datatoc_common_world_clip_lib_glsl[];
+extern char datatoc_gpu_shader_cfg_world_clip_lib_glsl[];
 
 extern char datatoc_workbench_prepass_vert_glsl[];
 extern char datatoc_workbench_prepass_frag_glsl[];
@@ -160,14 +160,14 @@ static char *workbench_build_prepass_vert(bool is_hair)
 	char *str = NULL;
 	if (!is_hair) {
 		return BLI_string_joinN(
-		        datatoc_common_world_clip_lib_glsl,
+		        datatoc_gpu_shader_cfg_world_clip_lib_glsl,
 		        datatoc_workbench_prepass_vert_glsl);
 	}
 
 	DynStr *ds = BLI_dynstr_new();
 
 	BLI_dynstr_append(ds, datatoc_common_hair_lib_glsl);
-	BLI_dynstr_append(ds, datatoc_common_world_clip_lib_glsl);
+	BLI_dynstr_append(ds, datatoc_gpu_shader_cfg_world_clip_lib_glsl);
 	BLI_dynstr_append(ds, datatoc_workbench_prepass_vert_glsl);
 
 	str = BLI_dynstr_get_cstring(ds);
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index 1f3d14102a6..10dfbb44418 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -61,7 +61,7 @@ static struct {
 } e_data = {{NULL}};
 
 /* Shaders */
-extern char datatoc_common_world_clip_lib_glsl[];
+extern char datatoc_gpu_shader_cfg_world_clip_lib_glsl[];
 extern char datatoc_common_hair_lib_glsl[];
 
 extern char datatoc_workbench_forward_composite_frag_glsl[];
@@ -82,14 +82,14 @@ static char *workbench_build_forward_vert(bool is_hair)
 	char *str = NULL;
 	if (!is_hair) {
 		return BLI_string_joinN(
-		        datatoc_common_world_clip_lib_glsl,
+		        datatoc_gpu_shader_cfg_world_clip_lib_glsl,
 		        datatoc_workbench_prepass_vert_glsl);
 	}
 
 	DynStr *ds = BLI_dynstr_new();
 
 	BLI_dynstr_append(ds, datatoc_common_hair_lib_glsl);
-	BLI_dynstr_append(ds, datatoc_common_world_clip_lib_glsl);
+	BLI_dynstr_append(ds, datatoc_gpu_shader_cfg_world_clip_lib_glsl);
 	BLI_dynstr_append(ds, datatoc_workbench_prepass_vert_glsl);
 
 	str = BLI_dynstr_get_cstring(ds);
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 87a1add4e81..d9b2e893354 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -240,11 +240,6 @@ void DRW_multisamples_resolve(
 /* Shaders */
 struct GPUShader *DRW_shader_create(
         const char *vert, const char *geom, const char *frag, const char *defines);
-struct DRW_ShaderCreateFromArray_Params { const char **vert, **geom, **frag, **defs; };
-struct GPUShader *DRW_shader_create_from_arrays_impl(
-        const struct DRW_ShaderCreateFromArray_Params *params);
-#define DRW_shader_create_from_arrays(...) \
-	DRW_shader_create_from_arrays_impl(&(const struct DRW_ShaderCreateFromArray_Params)__VA_ARGS__)
 struct GPUShader *DRW_shader_create_with_lib(
         const char *vert, const char *geom, const char *frag, const char *lib, const char *defines);
 struct GPUShader *DRW_shader_create_with_transform_feedback(
@@ -253,7 +248,7 @@ struct GPUShader *DRW_shader_create_with_transform_feedback(
 struct GPUShader *DRW_shader_create_2D(const char *frag, const char *defines);
 struct GPUShader *DRW_shader_create_3D(const char *frag, const char *defines);
 struct GPUShader *DRW_shader_create_fullscreen(const char *frag, const char *defines);
-struct GPUShader *DRW_shader_create_3D_depth_only(eDRW_ShaderSlot slot);
+struct GPUShader *DRW_shader_create_3D_depth_only(eGPUShaderConfig slot);
 struct GPUMaterial *DRW_shader_find_from_world(struct World *wo, const void *engine_type, int options, bool deferred);
 struct GPUMaterial *DRW_shader_find_from_material(struct Material *ma, const void *engine_type, int options, bool deferred);
 struct GPUMaterial *DRW_shader_create_from_world(
@@ -584,7 +579,7 @@ typedef struct DRWContextState {
 
 	eObjectMode object_mode;
 
-	eDRW_ShaderSlot shader_slot;
+	eGPUShaderConfig shader_cfg;
 
 	/** Last resort (some functions take this as an arg so we can't easily avoid).
 	 * May be NULL when used for selection or depth buffer. */
diff --git a/source/blender/draw/intern/draw_builtin_shader.c b/source/blender/draw/intern/draw_builtin_shader.c
deleted file mode 100644
index 5da2271cf16..00000000000
--- a/source/blender/draw/intern/draw_builtin_shader.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-/** \file draw_builtin_shader.c
- *  \ingroup draw
- * Draw manager versions of #eGPUBuiltinShader, see #GPU_shader_get_builtin_shader.
- *
- * Allows for modifications to shaders (currently only clipping support).
- * Follow GPU_shader.h conventions to avoid annoyance.
- */
-
-#include "BLI_utildefines.h"
-
-#include "GPU_shader.h"
-
-#include "DRW_render.h"
-
-#include "draw_builtin_shader.h"  /* own include */
-
-
-extern char datatoc_common_world_clip_lib_glsl[];
-
-/* Add shaders to this list when support is added. */
-#define GPU_SHADER_IS_SUPPORTED(shader_id) \
-	ELEM(shader_id, \
-	     GPU_SHADER_3D_UNIFORM_COLOR, \
-	     GPU_SHADER_3D_SMOOTH_COLOR, \
-	     GPU_SHADER_3D_DEPTH_ONLY, \
-	     GPU_SHADER_CAMERA, \
-	     GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE, \
-	     GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SCALE, \
-	     GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA, \
-	     GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA, \
-	     GPU_SHADER_3D_SCREENSPACE_VARIYING_COLOR, \
-	     GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED, \
-	     GPU_SHADER_3D_GROUNDLINE, \
-	     GPU_SHADER_3D_GROUNDPOINT, \
-	     GPU_SHADER_DISTANCE_LINES, \
-	     GPU_SHADER_INSTANCE_EDGES_VARIYING_COLOR)
-
-/* cache of built-in shaders (each is created on first use) */
-static struct {
-	GPUShader *builtin_shaders[GPU_NUM_BUILTIN_SHADERS];
-} g_sh_data[DRW_SHADER_SLOT_LEN - 1] = {{{NULL}}};
-
-static GPUShader *drw_shader_get_builtin_shader_clipped(eGPUBuiltinShader shader_id)
-{
-	const char *world_clip_lib = datatoc_common_world_clip_lib_glsl;
-	const char

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list