diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-11-30 03:53:50 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-11-30 04:02:36 +0300 |
commit | 6a4f5f6eb44b3dacff51ae8c152689e8ddf6e7b2 (patch) | |
tree | 1fb36d73470fa35a7029c0bd4fe8a9cc3ca992ff /source/blender/draw/engines/workbench/workbench_deferred.c | |
parent | e1023014f4d28bd74dc2f44845ed04669b51caa5 (diff) |
Workbench: Cleanups & Simplifications
* Move the curvature computation to the cavity pass: One can argue it's not
the best performance wise (it gets a tiny perf pernalty if it is done
alone without the ssao), but it make the code cleaner and reduce
considerably the number of shader variation possible.
* Lower shader variation to 2^8 instead of 2^12
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_deferred.c')
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_deferred.c | 97 |
1 files changed, 63 insertions, 34 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c index b801181e1fc..1ca76da672a 100644 --- a/source/blender/draw/engines/workbench/workbench_deferred.c +++ b/source/blender/draw/engines/workbench/workbench_deferred.c @@ -59,7 +59,7 @@ static struct { struct GPUShader *prepass_sh_cache[MAX_SHADERS]; struct GPUShader *composite_sh_cache[MAX_SHADERS]; - struct GPUShader *cavity_sh; + struct GPUShader *cavity_sh[MAX_CAVITY_SHADERS]; struct GPUShader *ghost_resolve_sh; struct GPUShader *shadow_fail_sh; struct GPUShader *shadow_fail_manifold_sh; @@ -167,13 +167,23 @@ static char *workbench_build_prepass_vert(bool is_hair) return str; } -static char *workbench_build_cavity_frag(void) +static char *workbench_build_cavity_frag(bool cavity, bool curvature, bool high_dpi) { char *str = NULL; DynStr *ds = BLI_dynstr_new(); + if (cavity) { + BLI_dynstr_append(ds, "#define USE_CAVITY\n"); + } + if (curvature) { + BLI_dynstr_append(ds, "#define USE_CURVATURE\n"); + } + if (high_dpi) { + BLI_dynstr_append(ds, "#define CURVATURE_OFFSET 2\n"); + } BLI_dynstr_append(ds, datatoc_workbench_common_lib_glsl); + BLI_dynstr_append(ds, datatoc_workbench_curvature_lib_glsl); BLI_dynstr_append(ds, datatoc_workbench_cavity_frag_glsl); BLI_dynstr_append(ds, datatoc_workbench_cavity_lib_glsl); @@ -182,6 +192,23 @@ static char *workbench_build_cavity_frag(void) return str; } +static GPUShader *workbench_cavity_shader_get(bool cavity, bool curvature) +{ + const bool high_dpi = (U.pixelsize > 1.5f); + int index = 0; + SET_FLAG_FROM_TEST(index, cavity, 1 << 0); + SET_FLAG_FROM_TEST(index, curvature, 1 << 1); + SET_FLAG_FROM_TEST(index, high_dpi, 1 << 2); + + GPUShader **sh = &e_data.cavity_sh[index]; + if (*sh == NULL) { + char *cavity_frag = workbench_build_cavity_frag(cavity, curvature, high_dpi); + *sh = DRW_shader_create_fullscreen(cavity_frag, NULL); + MEM_freeN(cavity_frag); + } + return *sh; +} + static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, bool is_hair) { if (e_data.prepass_sh_cache[index] == NULL) { @@ -303,6 +330,7 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata) #else const char *shadow_frag = datatoc_gpu_shader_depth_only_frag_glsl; #endif + /* TODO only compile on demand */ e_data.shadow_pass_sh = DRW_shader_create( datatoc_workbench_shadow_vert_glsl, datatoc_workbench_shadow_geom_glsl, @@ -337,10 +365,6 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata) shadow_frag, "#define SHADOW_FAIL\n"); - char *cavity_frag = workbench_build_cavity_frag(); - e_data.cavity_sh = DRW_shader_create_fullscreen(cavity_frag, NULL); - MEM_freeN(cavity_frag); - e_data.ghost_resolve_sh = DRW_shader_create_fullscreen(datatoc_workbench_ghost_resolve_frag_glsl, NULL); } workbench_volume_engine_init(); @@ -353,21 +377,13 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata) { const float *viewport_size = DRW_viewport_size_get(); const int size[2] = {(int)viewport_size[0], (int)viewport_size[1]}; + const GPUTextureFormat nor_tex_format = NORMAL_ENCODING_ENABLED() ? GPU_RG16 : GPU_RGBA32F; e_data.object_id_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_R32UI, &draw_engine_workbench_solid); e_data.color_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA8, &draw_engine_workbench_solid); - e_data.cavity_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RG16, &draw_engine_workbench_solid); + e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], nor_tex_format, &draw_engine_workbench_solid); + e_data.cavity_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_R16, &draw_engine_workbench_solid); e_data.specular_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA8, &draw_engine_workbench_solid); - e_data.composite_buffer_tx = DRW_texture_pool_query_2D( - size[0], size[1], GPU_RGBA16F, &draw_engine_workbench_solid); - - if (NORMAL_ENCODING_ENABLED()) { - e_data.normal_buffer_tx = DRW_texture_pool_query_2D( - size[0], size[1], GPU_RG16, &draw_engine_workbench_solid); - } - else { - e_data.normal_buffer_tx = DRW_texture_pool_query_2D( - size[0], size[1], GPU_RGBA32F, &draw_engine_workbench_solid); - } + e_data.composite_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA16F, &draw_engine_workbench_solid); GPU_framebuffer_ensure_config(&fbl->prepass_fb, { GPU_ATTACHMENT_TEXTURE(dtxl->depth), @@ -438,21 +454,30 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata) workbench_aa_create_pass(vedata, &e_data.color_buffer_tx); } - { + if (SSAO_ENABLED(wpd) || CURVATURE_ENABLED(wpd)) { int state = DRW_STATE_WRITE_COLOR; + GPUShader *shader = workbench_cavity_shader_get(SSAO_ENABLED(wpd), CURVATURE_ENABLED(wpd)); psl->cavity_pass = DRW_pass_create("Cavity", state); - DRWShadingGroup *grp = DRW_shgroup_create(e_data.cavity_sh, psl->cavity_pass); - DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &e_data.color_buffer_tx); + DRWShadingGroup *grp = DRW_shgroup_create(shader, psl->cavity_pass); DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &e_data.normal_buffer_tx); - - DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1); - DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)wpd->viewvecs, 3); - DRW_shgroup_uniform_vec4(grp, "ssao_params", wpd->ssao_params, 1); - DRW_shgroup_uniform_vec4(grp, "ssao_settings", wpd->ssao_settings, 1); - DRW_shgroup_uniform_mat4(grp, "WinMatrix", wpd->winmat); - DRW_shgroup_uniform_texture(grp, "ssao_jitter", e_data.jitter_tx); DRW_shgroup_uniform_block(grp, "samples_block", e_data.sampling_ubo); + + if (SSAO_ENABLED(wpd)) { + DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); + DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &e_data.color_buffer_tx); + DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1); + DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)wpd->viewvecs, 3); + DRW_shgroup_uniform_vec4(grp, "ssao_params", wpd->ssao_params, 1); + DRW_shgroup_uniform_vec4(grp, "ssao_settings", wpd->ssao_settings, 1); + DRW_shgroup_uniform_mat4(grp, "WinMatrix", wpd->winmat); + DRW_shgroup_uniform_texture(grp, "ssao_jitter", e_data.jitter_tx); + } + + if (CURVATURE_ENABLED(wpd)) { + DRW_shgroup_uniform_texture_ref(grp, "objectId", &e_data.object_id_tx); + DRW_shgroup_uniform_vec2(grp, "curvature_settings", &wpd->world_data.curvature_ridge, 1); + } + DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL); } } @@ -478,7 +503,9 @@ void workbench_deferred_engine_free(void) DRW_SHADER_FREE_SAFE(e_data.prepass_sh_cache[index]); DRW_SHADER_FREE_SAFE(e_data.composite_sh_cache[index]); } - DRW_SHADER_FREE_SAFE(e_data.cavity_sh); + for (int index = 0; index < MAX_CAVITY_SHADERS; ++index) { + DRW_SHADER_FREE_SAFE(e_data.cavity_sh[index]); + } DRW_SHADER_FREE_SAFE(e_data.ghost_resolve_sh); DRW_UBO_FREE_SAFE(e_data.sampling_ubo); DRW_TEXTURE_FREE_SAFE(e_data.jitter_tx); @@ -502,11 +529,13 @@ static void workbench_composite_uniforms(WORKBENCH_PrivateData *wpd, DRWShadingG if (NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd)) { DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &e_data.normal_buffer_tx); } - if (SSAO_ENABLED(wpd)) { + if (SSAO_ENABLED(wpd) || CURVATURE_ENABLED(wpd)) { DRW_shgroup_uniform_texture_ref(grp, "cavityBuffer", &e_data.cavity_buffer_tx); } - if (SPECULAR_HIGHLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) { + if (SPECULAR_HIGHLIGHT_ENABLED(wpd)) { DRW_shgroup_uniform_texture_ref(grp, "specularBuffer", &e_data.specular_buffer_tx); + } + if (SPECULAR_HIGHLIGHT_ENABLED(wpd) || STUDIOLIGHT_TYPE_MATCAP_ENABLED(wpd)) { DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)wpd->viewvecs, 3); } DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo); @@ -514,7 +543,7 @@ static void workbench_composite_uniforms(WORKBENCH_PrivateData *wpd, DRWShadingG if (STUDIOLIGHT_TYPE_MATCAP_ENABLED(wpd)) { BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_EQUIRECT_RADIANCE_GPUTEXTURE); - DRW_shgroup_uniform_texture(grp, "matcapImage", wpd->studio_light->equirect_radiance_gputexture ); + DRW_shgroup_uniform_texture(grp, "matcapImage", wpd->studio_light->equirect_radiance_gputexture); } } @@ -902,7 +931,7 @@ void workbench_deferred_draw_scene(WORKBENCH_Data *vedata) DRW_draw_pass(psl->ghost_resolve_pass); } - if (SSAO_ENABLED(wpd)) { + if (SSAO_ENABLED(wpd) || CURVATURE_ENABLED(wpd)) { GPU_framebuffer_bind(fbl->cavity_fb); DRW_draw_pass(psl->cavity_pass); } |