Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2018-03-09 21:52:37 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-03-10 04:18:25 +0300
commit8444aaaa693a9b9e613d801612ea46dfd9b82dba (patch)
tree41cd1badc74798d29a2bb007b6100940d0820c19 /source/blender/draw/intern
parent4540bd226dce454573242c40a8b2de79ca1bffa5 (diff)
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.
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r--source/blender/draw/intern/DRW_render.h2
-rw-r--r--source/blender/draw/intern/draw_manager.c9
-rw-r--r--source/blender/draw/intern/draw_manager.h13
-rw-r--r--source/blender/draw/intern/draw_manager_data.c57
-rw-r--r--source/blender/draw/intern/draw_manager_exec.c17
5 files changed, 61 insertions, 37 deletions
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);