diff --git a/source/blender/draw/engines/eevee_next/eevee_engine.cc b/source/blender/draw/engines/eevee_next/eevee_engine.cc index 40a2f1f57be..ee4e0758249 100644 --- a/source/blender/draw/engines/eevee_next/eevee_engine.cc +++ b/source/blender/draw/engines/eevee_next/eevee_engine.cc @@ -103,8 +103,12 @@ static void eevee_engine_init(void *vedata) static void eevee_draw_scene(void *vedata) { EEVEE_Data *ved = reinterpret_cast(vedata); - DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); - ved->instance->draw_viewport(dfbl); + if (DRW_state_is_viewport_image_render()) { + ved->instance->draw_viewport_image_render(); + } + else { + ved->instance->draw_viewport(); + } STRNCPY(ved->info, ved->instance->info.c_str()); /* Reset view for other following engines. */ DRW_view_set_active(nullptr); diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.cc b/source/blender/draw/engines/eevee_next/eevee_instance.cc index ac6c409ae7d..224b7958cea 100644 --- a/source/blender/draw/engines/eevee_next/eevee_instance.cc +++ b/source/blender/draw/engines/eevee_next/eevee_instance.cc @@ -493,9 +493,8 @@ void Instance::render_frame(RenderLayer *render_layer, const char *view_name) this->render_read_result(render_layer, view_name); } -void Instance::draw_viewport(DefaultFramebufferList *dfbl) +void Instance::draw_viewport() { - UNUSED_VARS(dfbl); render_sample(); velocity.step_swap(); @@ -518,6 +517,14 @@ void Instance::draw_viewport(DefaultFramebufferList *dfbl) } } +void Instance::draw_viewport_image_render() +{ + while (!sampling.finished_viewport()) { + this->render_sample(); + } + velocity.step_swap(); +} + void Instance::store_metadata(RenderResult *render_result) { cryptomatte.store_metadata(render_result); diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.hh b/source/blender/draw/engines/eevee_next/eevee_instance.hh index a4812cc098c..1aa1fc87a9a 100644 --- a/source/blender/draw/engines/eevee_next/eevee_instance.hh +++ b/source/blender/draw/engines/eevee_next/eevee_instance.hh @@ -180,7 +180,8 @@ class Instance { /* Viewport. */ - void draw_viewport(DefaultFramebufferList *dfbl); + void draw_viewport(); + void draw_viewport_image_render(); /* Light bake. */ @@ -199,6 +200,11 @@ class Instance { return render == nullptr && !is_baking(); } + bool is_viewport_image_render() const + { + return DRW_state_is_viewport_image_render(); + } + bool is_baking() const { return is_light_bake; diff --git a/source/blender/draw/engines/eevee_next/eevee_sampling.cc b/source/blender/draw/engines/eevee_next/eevee_sampling.cc index 344deff93a4..2ad6ac1fb6e 100644 --- a/source/blender/draw/engines/eevee_next/eevee_sampling.cc +++ b/source/blender/draw/engines/eevee_next/eevee_sampling.cc @@ -75,7 +75,8 @@ void Sampling::end_sync() interactive_mode_ = viewport_sample_ < interactive_mode_threshold; - bool interactive_mode_disabled = (inst_.scene->eevee.flag & SCE_EEVEE_TAA_REPROJECTION) == 0; + bool interactive_mode_disabled = (inst_.scene->eevee.flag & SCE_EEVEE_TAA_REPROJECTION) == 0 || + inst_.is_viewport_image_render(); if (interactive_mode_disabled) { interactive_mode_ = false; sample_ = viewport_sample_;