diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-12-05 04:07:23 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-12-05 04:51:48 +0300 |
commit | 7ffde286be0774e24ea04b4acaad6c6e4ae16bfe (patch) | |
tree | 2c4a3891df3438b24480651f157e07632f9cf15f /source/blender/draw/engines/workbench/workbench_forward.c | |
parent | 53685404316e05879bc9ff46837dd224ba3cce4f (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.c | 61 |
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. */ |