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-12-05 04:07:23 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-12-05 04:51:48 +0300
commit7ffde286be0774e24ea04b4acaad6c6e4ae16bfe (patch)
tree2c4a3891df3438b24480651f157e07632f9cf15f /source/blender/draw/engines/workbench/workbench_forward.c
parent53685404316e05879bc9ff46837dd224ba3cce4f (diff)
Workbench: Cleanups and reduce shader variations
Also optimize deferred engine by only outputing material data if needed. This make the bare flat shading mode (no effects) only a depth prepass.
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_forward.c')
-rw-r--r--source/blender/draw/engines/workbench/workbench_forward.c61
1 files changed, 30 insertions, 31 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index 36f94a6929a..70e26f79076 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -49,8 +49,8 @@
/* *********** STATIC *********** */
static struct {
- struct GPUShader *composite_sh_cache[MAX_SHADERS];
- struct GPUShader *transparent_accum_sh_cache[MAX_SHADERS];
+ struct GPUShader *composite_sh_cache[2];
+ struct GPUShader *transparent_accum_sh_cache[MAX_ACCUM_SHADERS];
struct GPUShader *object_outline_sh;
struct GPUShader *object_outline_texture_sh;
struct GPUShader *object_outline_hair_sh;
@@ -176,7 +176,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1);
}
- workbench_material_shgroup_uniform(wpd, grp, material, ob, false);
+ workbench_material_shgroup_uniform(wpd, grp, material, ob, false, false);
material->shgrp = grp;
/* Depth */
@@ -197,16 +197,9 @@ static WORKBENCH_MaterialData *get_or_create_material_data(
return material;
}
-static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, bool is_hair)
+static GPUShader *ensure_forward_accum_shaders(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair)
{
- if (e_data.composite_sh_cache[index] == NULL && !use_textures && !is_hair) {
- char *defines = workbench_material_build_defines(wpd, use_textures, is_hair);
- char *composite_frag = workbench_build_forward_composite_frag();
- e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines);
- MEM_freeN(composite_frag);
- MEM_freeN(defines);
- }
-
+ int index = workbench_material_get_accum_shader_index(wpd, use_textures, is_hair);
if (e_data.transparent_accum_sh_cache[index] == NULL) {
char *defines = workbench_material_build_defines(wpd, use_textures, is_hair);
char *transparent_accum_vert = workbench_build_forward_vert(is_hair);
@@ -218,25 +211,29 @@ static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, bool u
MEM_freeN(transparent_accum_frag);
MEM_freeN(defines);
}
+ return e_data.transparent_accum_sh_cache[index];
+}
+
+static GPUShader *ensure_forward_composite_shaders(WORKBENCH_PrivateData *wpd)
+{
+ int index = OBJECT_OUTLINE_ENABLED(wpd) ? 1 : 0;
+ if (e_data.composite_sh_cache[index] == NULL) {
+ char *defines = workbench_material_build_defines(wpd, false, false);
+ char *composite_frag = workbench_build_forward_composite_frag();
+ e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines);
+ MEM_freeN(composite_frag);
+ MEM_freeN(defines);
+ }
+ return e_data.composite_sh_cache[index];
}
static void select_forward_shaders(WORKBENCH_PrivateData *wpd)
{
- int index_solid = workbench_material_get_shader_index(wpd, false, false);
- int index_solid_hair = workbench_material_get_shader_index(wpd, false, true);
- int index_texture = workbench_material_get_shader_index(wpd, true, false);
- int index_texture_hair = workbench_material_get_shader_index(wpd, true, true);
-
- ensure_forward_shaders(wpd, index_solid, false, false);
- ensure_forward_shaders(wpd, index_solid_hair, false, true);
- ensure_forward_shaders(wpd, index_texture, true, false);
- ensure_forward_shaders(wpd, index_texture_hair, true, true);
-
- wpd->composite_sh = e_data.composite_sh_cache[index_solid];
- wpd->transparent_accum_sh = e_data.transparent_accum_sh_cache[index_solid];
- wpd->transparent_accum_hair_sh = e_data.transparent_accum_sh_cache[index_solid_hair];
- wpd->transparent_accum_texture_sh = e_data.transparent_accum_sh_cache[index_texture];
- wpd->transparent_accum_texture_hair_sh = e_data.transparent_accum_sh_cache[index_texture_hair];
+ wpd->composite_sh = ensure_forward_composite_shaders(wpd);
+ wpd->transparent_accum_sh = ensure_forward_accum_shaders(wpd, false, false);
+ wpd->transparent_accum_hair_sh = ensure_forward_accum_shaders(wpd, false, true);
+ wpd->transparent_accum_texture_sh = ensure_forward_accum_shaders(wpd, true, false);
+ wpd->transparent_accum_texture_hair_sh = ensure_forward_accum_shaders(wpd, true, true);
}
/* public functions */
@@ -264,8 +261,8 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
if (!e_data.next_object_id) {
e_data.next_object_id = 1;
- memset(e_data.composite_sh_cache, 0x00, sizeof(struct GPUShader *) * MAX_SHADERS);
- memset(e_data.transparent_accum_sh_cache, 0x00, sizeof(struct GPUShader *) * MAX_SHADERS);
+ memset(e_data.composite_sh_cache, 0x00, sizeof(e_data.composite_sh_cache));
+ memset(e_data.transparent_accum_sh_cache, 0x00, sizeof(e_data.transparent_accum_sh_cache));
char *defines = workbench_material_build_defines(wpd, false, false);
char *defines_texture = workbench_material_build_defines(wpd, true, false);
@@ -391,8 +388,10 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
void workbench_forward_engine_free()
{
- for (int index = 0; index < MAX_SHADERS; index++) {
+ for (int index = 0; index < 2; index++) {
DRW_SHADER_FREE_SAFE(e_data.composite_sh_cache[index]);
+ }
+ for (int index = 0; index < MAX_ACCUM_SHADERS; index++) {
DRW_SHADER_FREE_SAFE(e_data.transparent_accum_sh_cache[index]);
}
DRW_SHADER_FREE_SAFE(e_data.object_outline_sh);
@@ -444,7 +443,7 @@ static void workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, O
psl->transparent_accum_pass,
shader);
DRW_shgroup_uniform_block(shgrp, "world_block", wpd->world_ubo);
- workbench_material_shgroup_uniform(wpd, shgrp, material, ob, false);
+ workbench_material_shgroup_uniform(wpd, shgrp, material, ob, false, false);
DRW_shgroup_uniform_vec4(shgrp, "viewvecs[0]", (float *)wpd->viewvecs, 3);
/* Hairs have lots of layer and can rapidly become the most prominent surface.
* So lower their alpha artificially. */