From 35cfc71b95d1a2b0c6d0da7e5e82fdc46eea9d35 Mon Sep 17 00:00:00 2001 From: Miguel Pozo Date: Fri, 7 Jun 2024 18:53:59 +0200 Subject: [PATCH] EEVEE: Parallel specialization constants compilation Convert `Renderbuffers::sync` into `RenderBuffers::init`. Use `GPU_shaders_precompile_specializations` in EEVEE. Pull Request: https://projects.blender.org/blender/blender/pulls/122798 --- .../draw/engines/eevee_next/eevee_instance.cc | 3 ++- .../draw/engines/eevee_next/eevee_pipeline.cc | 24 +++++++++++++++++++ .../engines/eevee_next/eevee_renderbuffers.cc | 2 +- .../engines/eevee_next/eevee_renderbuffers.hh | 2 +- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.cc b/source/blender/draw/engines/eevee_next/eevee_instance.cc index 9b3525c1854..c210a0039fe 100644 --- a/source/blender/draw/engines/eevee_next/eevee_instance.cc +++ b/source/blender/draw/engines/eevee_next/eevee_instance.cc @@ -95,6 +95,7 @@ void Instance::init(const int2 &output_res, sampling.init(scene); camera.init(); film.init(output_res, output_rect); + render_buffers.init(); ambient_occlusion.init(); velocity.init(); raytracing.init(); @@ -135,6 +136,7 @@ void Instance::init_light_bake(Depsgraph *depsgraph, draw::Manager *manager) /* Film isn't used but init to avoid side effects in other module. */ rcti empty_rect{0, 0, 0, 0}; film.init(int2(1), &empty_rect); + render_buffers.init(); velocity.init(); depth_of_field.init(); shadows.init(); @@ -207,7 +209,6 @@ void Instance::begin_sync() hiz_buffer.sync(); main_view.sync(); film.sync(); - render_buffers.sync(); ambient_occlusion.sync(); volume_probes.sync(); lookdev.sync(); diff --git a/source/blender/draw/engines/eevee_next/eevee_pipeline.cc b/source/blender/draw/engines/eevee_next/eevee_pipeline.cc index 871ece23dd7..98aa6f436e3 100644 --- a/source/blender/draw/engines/eevee_next/eevee_pipeline.cc +++ b/source/blender/draw/engines/eevee_next/eevee_pipeline.cc @@ -501,6 +501,30 @@ void DeferredLayerBase::gbuffer_pass_sync(Instance &inst) void DeferredLayer::begin_sync() { + if (GPU_use_parallel_compilation()) { + /* Pre-compile specialization constants in parallel. */ + Vector specializations; + for (int i = 0; i < 3; i++) { + GPUShader *sh = inst_.shaders.static_shader_get(eShaderType(DEFERRED_LIGHT_SINGLE + i)); + for (bool use_split_indirect : {false, true}) { + for (bool use_lightprobe_eval : {false, true}) { + for (bool use_transmission : {false, true}) { + specializations.append( + {sh, + {{"render_pass_shadow_id", inst_.render_buffers.data.shadow_id}, + {"use_split_indirect", use_split_indirect}, + {"use_lightprobe_eval", use_lightprobe_eval}, + {"use_transmission", use_transmission}, + {"shadow_ray_count", inst_.shadows.get_data().ray_count}, + {"shadow_ray_step_count", inst_.shadows.get_data().step_count}}}); + } + } + } + } + + GPU_shaders_precompile_specializations(specializations); + } + { prepass_ps_.init(); /* Textures. */ diff --git a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc index 583f95339e8..e7a594107d0 100644 --- a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc +++ b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc @@ -24,7 +24,7 @@ namespace blender::eevee { -void RenderBuffers::sync() +void RenderBuffers::init() { const eViewLayerEEVEEPassType enabled_passes = inst_.film.enabled_passes_get(); diff --git a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.hh b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.hh index 067a2a85b0f..89171b589a1 100644 --- a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.hh +++ b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.hh @@ -63,7 +63,7 @@ class RenderBuffers { } } - void sync(); + void init(); /* Acquires (also ensures) the render buffer before rendering to them. */ void acquire(int2 extent);