Fix realtime compositor not correctly handling multiple scene render layers

Pull Request: https://projects.blender.org/blender/blender/pulls/108909
This commit is contained in:
Brecht Van Lommel
2023-06-12 19:57:44 +02:00
parent 667d5d5a7e
commit 7a3a4b58e6
4 changed files with 18 additions and 8 deletions

View File

@@ -84,7 +84,9 @@ class Context {
/* Get the texture where the given render pass is stored. This should be called by the Render
* Layer node to populate its outputs. */
virtual GPUTexture *get_input_texture(int view_layer, const char *pass_name) = 0;
virtual GPUTexture *get_input_texture(const Scene *scene,
int view_layer,
const char *pass_name) = 0;
/* Get the name of the view currently being rendered. */
virtual StringRef get_view_name() = 0;

View File

@@ -163,9 +163,12 @@ class Context : public realtime_compositor::Context {
return DRW_viewport_texture_list_get()->color;
}
GPUTexture *get_input_texture(int view_layer, const char *pass_name) override
GPUTexture *get_input_texture(const Scene *scene, int view_layer, const char *pass_name) override
{
if (view_layer == 0 && STREQ(pass_name, RE_PASSNAME_COMBINED)) {
if ((DEG_get_original_id(&scene->id) ==
DEG_get_original_id(&DRW_context_state_get()->scene->id)) &&
view_layer == 0 && STREQ(pass_name, RE_PASSNAME_COMBINED))
{
return get_output_texture();
}
else {

View File

@@ -824,13 +824,15 @@ class RenderLayerOperation : public NodeOperation {
void execute() override
{
const Scene *scene = static_cast<const Scene *>(bnode().id);
const int view_layer = bnode().custom1;
Result &image_result = get_result("Image");
Result &alpha_result = get_result("Alpha");
if (image_result.should_compute() || alpha_result.should_compute()) {
GPUTexture *combined_texture = context().get_input_texture(view_layer, RE_PASSNAME_COMBINED);
GPUTexture *combined_texture = context().get_input_texture(
scene, view_layer, RE_PASSNAME_COMBINED);
if (image_result.should_compute()) {
execute_pass(image_result, combined_texture, "compositor_read_pass_color");
}
@@ -850,7 +852,8 @@ class RenderLayerOperation : public NodeOperation {
continue;
}
GPUTexture *pass_texture = context().get_input_texture(view_layer, output->identifier);
GPUTexture *pass_texture = context().get_input_texture(
scene, view_layer, output->identifier);
if (output->type == SOCK_FLOAT) {
execute_pass(result, pass_texture, "compositor_read_pass_float");
}

View File

@@ -182,9 +182,11 @@ class Context : public realtime_compositor::Context {
return viewer_output_texture_;
}
GPUTexture *get_input_texture(int view_layer_id, const char *pass_name) override
GPUTexture *get_input_texture(const Scene *scene,
int view_layer_id,
const char *pass_name) override
{
Render *re = RE_GetSceneRender(&scene_);
Render *re = RE_GetSceneRender(scene);
RenderResult *rr = nullptr;
GPUTexture *input_texture = nullptr;
@@ -193,7 +195,7 @@ class Context : public realtime_compositor::Context {
}
if (rr) {
ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&scene_.view_layers, view_layer_id);
ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&scene->view_layers, view_layer_id);
if (view_layer) {
RenderLayer *rl = RE_GetRenderLayer(rr, view_layer->name);
if (rl) {