[Bf-blender-cvs] [8444aaaa693] blender2.8: DRW: Put all view-only dependant uniform in a UBO.

Clément Foucault noreply at git.blender.org
Sat Mar 10 02:48:58 CET 2018


Commit: 8444aaaa693a9b9e613d801612ea46dfd9b82dba
Author: Clément Foucault
Date:   Fri Mar 9 19:52:37 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB8444aaaa693a9b9e613d801612ea46dfd9b82dba

DRW: Put all view-only dependant uniform in a UBO.

This leads to less lookups to the GWNShaderInterface and less uniform upload.

We still keep a legacy path so that Builtin uniforms can still work. We might restrict this path to Builtin shader only in the future.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_manager.h
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/intern/draw_manager_exec.c
A	source/blender/draw/modes/shaders/common_view_lib.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index ba2aa0448fd..6618aaea4f4 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -203,6 +203,7 @@ data_to_c_simple(engines/eevee/shaders/volumetric_scatter_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/volumetric_integration_frag.glsl SRC)
 
 data_to_c_simple(modes/shaders/common_globals_lib.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/edit_mesh_overlay_frag.glsl SRC)
 data_to_c_simple(modes/shaders/edit_mesh_overlay_vert.glsl SRC)
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 9f0c06a2886..7a8fc5ff3c1 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -413,7 +413,7 @@ typedef enum {
 	DRW_MAT_COUNT, // Don't use this.
 } DRWViewportMatrixType;
 
-typedef struct DRWMatrixState{
+typedef struct DRWMatrixState {
 	float mat[DRW_MAT_COUNT][4][4];
 } DRWMatrixState;
 
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 856e40da345..703aad2ec39 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -90,6 +90,8 @@ DRWManager DST = {NULL};
 
 ListBase DRW_engines = {NULL, NULL};
 
+extern struct GPUUniformBuffer *view_ubo; /* draw_manager_exec.c */
+
 /* -------------------------------------------------------------------- */
 
 void DRW_draw_callbacks_pre_scene(void)
@@ -437,8 +439,12 @@ static void drw_viewport_var_init(void)
 		DST.RST.bound_tex_slots = MEM_callocN(sizeof(bool) * GPU_max_textures(), "Bound Texture Slots");
 	}
 
+	if (view_ubo == NULL) {
+		view_ubo = DRW_uniformbuffer_create(sizeof(ViewUboStorage), NULL);
+	}
+
 	DST.override_mat = 0;
-	DST.dirty_mat = false;
+	DST.dirty_mat = true;
 	DST.state_cache_id = 1;
 
 	DST.clipping.updated = false;
@@ -1936,6 +1942,7 @@ void DRW_engines_free(void)
 	}
 
 	DRW_UBO_FREE_SAFE(globals_ubo);
+	DRW_UBO_FREE_SAFE(view_ubo);
 	DRW_TEXTURE_FREE_SAFE(globals_ramp);
 	MEM_SAFE_FREE(g_pos_format);
 
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index 1afa0ff2402..689b19a81ff 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -246,6 +246,12 @@ struct DRWPass {
 	char name[MAX_PASS_NAME];
 };
 
+typedef struct ViewUboStorage {
+	DRWMatrixState matstate;
+	float viewcamtexcofac[4];
+	float clipplanes[2][4];
+} ViewUboStorage;
+
 /* ------------- DRAW MANAGER ------------ */
 
 #define MAX_CLIP_PLANES 6 /* GL_MAX_CLIP_PLANES is at least 6 */
@@ -304,11 +310,8 @@ typedef struct DRWManager {
 	int num_clip_planes;         /* Number of active clipplanes. */
 	bool dirty_mat;
 
-	struct {
-		DRWMatrixState matstate;
-		float viewcamtexcofac[4];
-		float clip_planes_eq[MAX_CLIP_PLANES][4];
-	} view_data;
+	/* keep in sync with viewBlock */
+	ViewUboStorage view_data;
 
 	struct {
 		float frustum_planes[6][4];
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 8a644005484..1283ab5de45 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -43,6 +43,8 @@
 
 struct Gwn_VertFormat *g_pos_format = NULL;
 
+extern struct GPUUniformBuffer *view_ubo; /* draw_manager_exec.c */
+
 /* -------------------------------------------------------------------- */
 
 /** \name Uniform Buffer Object (DRW_uniformbuffer)
@@ -70,17 +72,12 @@ void DRW_uniformbuffer_free(GPUUniformBuffer *ubo)
 /** \name Uniforms (DRW_shgroup_uniform)
  * \{ */
 
-static void drw_interface_builtin_uniform(
-        DRWShadingGroup *shgroup, int builtin, const void *value, int length, int arraysize)
+static void drw_interface_uniform_create_ex(DRWShadingGroup *shgroup, int loc,
+                                            DRWUniformType type, const void *value, int length, int arraysize)
 {
-	int loc = GPU_shader_get_builtin_uniform(shgroup->shader, builtin);
-
-	if (loc == -1)
-		return;
-
 	DRWUniform *uni = BLI_mempool_alloc(DST.vmempool->uniforms);
 	uni->location = loc;
-	uni->type = DRW_UNIFORM_FLOAT;
+	uni->type = type;
 	uni->value = value;
 	uni->length = length;
 	uni->arraysize = arraysize;
@@ -88,6 +85,16 @@ static void drw_interface_builtin_uniform(
 	BLI_LINKS_PREPEND(shgroup->uniforms, uni);
 }
 
+static void drw_interface_builtin_uniform(
+        DRWShadingGroup *shgroup, int builtin, const void *value, int length, int arraysize)
+{
+	int loc = GPU_shader_get_builtin_uniform(shgroup->shader, builtin);
+
+	if (loc != -1) {
+		drw_interface_uniform_create_ex(shgroup, loc, DRW_UNIFORM_FLOAT, value, length, arraysize);
+	}
+}
+
 static void drw_interface_uniform(DRWShadingGroup *shgroup, const char *name,
                                   DRWUniformType type, const void *value, int length, int arraysize)
 {
@@ -107,18 +114,10 @@ static void drw_interface_uniform(DRWShadingGroup *shgroup, const char *name,
 		return;
 	}
 
-	DRWUniform *uni = BLI_mempool_alloc(DST.vmempool->uniforms);
-
 	BLI_assert(arraysize > 0 && arraysize <= 16);
 	BLI_assert(length >= 0 && length <= 16);
 
-	uni->location = location;
-	uni->type = type;
-	uni->value = value;
-	uni->length = length;
-	uni->arraysize = arraysize;
-
-	BLI_LINKS_PREPEND(shgroup->uniforms, uni);
+	drw_interface_uniform_create_ex(shgroup, location, type, value, length, arraysize);
 }
 
 void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const GPUTexture *tex)
@@ -457,15 +456,21 @@ static void drw_interface_init(DRWShadingGroup *shgroup, GPUShader *shader)
 	shgroup->attribs_count = 0;
 #endif
 
-	/* TODO : They should be grouped inside a UBO updated once per redraw. */
-	drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_VIEW, DST.view_data.matstate.mat[DRW_MAT_VIEW], 16, 1);
-	drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_VIEW_INV, DST.view_data.matstate.mat[DRW_MAT_VIEWINV], 16, 1);
-	drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_VIEWPROJECTION, DST.view_data.matstate.mat[DRW_MAT_PERS], 16, 1);
-	drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_VIEWPROJECTION_INV, DST.view_data.matstate.mat[DRW_MAT_PERSINV], 16, 1);
-	drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_PROJECTION, DST.view_data.matstate.mat[DRW_MAT_WIN], 16, 1);
-	drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_PROJECTION_INV, DST.view_data.matstate.mat[DRW_MAT_WININV], 16, 1);
-	drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_CAMERATEXCO, DST.view_data.viewcamtexcofac, 3, 2);
-	drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_CLIPPLANES, DST.view_data.clip_planes_eq, 4, DST.num_clip_planes); /* TO REMOVE */
+	int view_ubo_location = GPU_shader_get_uniform_block(shader, "viewBlock");
+
+	if (view_ubo_location != -1) {
+		drw_interface_uniform_create_ex(shgroup, view_ubo_location, DRW_UNIFORM_BLOCK, view_ubo, 0, 1);
+	}
+	else {
+		/* Only here to support builtin shaders. This should not be used by engines. */
+		drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_VIEW, DST.view_data.matstate.mat[DRW_MAT_VIEW], 16, 1);
+		drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_VIEW_INV, DST.view_data.matstate.mat[DRW_MAT_VIEWINV], 16, 1);
+		drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_VIEWPROJECTION, DST.view_data.matstate.mat[DRW_MAT_PERS], 16, 1);
+		drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_VIEWPROJECTION_INV, DST.view_data.matstate.mat[DRW_MAT_PERSINV], 16, 1);
+		drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_PROJECTION, DST.view_data.matstate.mat[DRW_MAT_WIN], 16, 1);
+		drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_PROJECTION_INV, DST.view_data.matstate.mat[DRW_MAT_WININV], 16, 1);
+		drw_interface_builtin_uniform(shgroup, GWN_UNIFORM_CAMERATEXCO, DST.view_data.viewcamtexcofac, 3, 2);
+	}
 
 	shgroup->model = GPU_shader_get_builtin_uniform(shader, GWN_UNIFORM_MODEL);
 	shgroup->modelinverse = GPU_shader_get_builtin_uniform(shader, GWN_UNIFORM_MODEL_INV);
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 27a94ae064b..49bb9f114a7 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -49,6 +49,8 @@ void DRW_select_load_id(unsigned int id)
 }
 #endif
 
+struct GPUUniformBuffer *view_ubo;
+
 /* -------------------------------------------------------------------- */
 
 /** \name Draw State (DRW_state)
@@ -367,7 +369,7 @@ void DRW_state_invert_facing(void)
 void DRW_state_clip_planes_add(float plane_eq[4])
 {
 	BLI_assert(DST.num_clip_planes < MAX_CLIP_PLANES-1);
-	copy_v4_v4(DST.view_data.clip_planes_eq[DST.num_clip_planes++], plane_eq);
+	// copy_v4_v4(DST.view_data.clip_planes_eq[DST.num_clip_planes++], plane_eq);
 }
 
 void DRW_state_clip_planes_reset(void)
@@ -943,14 +945,14 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
 	DRW_state_reset();
 }
 
-static void drw_draw_pass_ex(DRWPass *pass, DRWShadingGroup *start_group, DRWShadingGroup *end_group)
+static void drw_update_view(void)
 {
-	DST.shader = NULL;
-
 	if (DST.dirty_mat) {
 		DST.state_cache_id++;
 		DST.dirty_mat = false;
 
+		DRW_uniformbuffer_update(view_ubo, &DST.view_data);
+
 		/* Catch integer wrap around. */
 		if (UNLIKELY(DST.state_cache_id == 0)) {
 			DST.state_cache_id = 1;
@@ -968,9 +970,16 @@ static void drw_draw_pass_ex(DRWPass *pass, DRWShadingGroup *start_group, DRWSha
 	}
 
 	draw_clipping_setup_from_view();
+}
+
+static void drw_draw_pass_ex(DRWPass *pass, DRWShadingGroup *start_group, DRWShadingGroup *end_group)
+{
+	DST.shader = NULL;
 
 	BLI_assert(DST.buffer_finish_called && "DRW_render_instance_buffer_finish had not been called before drawing");
 
+	drw_update_view();
+
 	drw_state_set(pass->state);
 
 	DRW_stats_query_start(pass->name);
diff --git a/source/blender/draw/modes/shaders/common_view_lib.glsl b/source/blender/draw/modes/shaders/common_view_lib.glsl
new file mode 100644
index 00000000000..d261d263a6f
--- /dev/null
+++ b/source/blend

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list