From f23e3099ef8ccf2a9c28dd4a24671d0228a53d12 Mon Sep 17 00:00:00 2001 From: Bogdan Nagirniak Date: Fri, 28 Jul 2023 01:53:14 +0300 Subject: [PATCH 1/5] Make viewport with GPU context to render into separate framebuffer --- .../render/hydra/render_task_delegate.cc | 13 ++++ .../render/hydra/render_task_delegate.h | 1 + .../blender/render/hydra/viewport_engine.cc | 64 +++++++++++++------ 3 files changed, 60 insertions(+), 18 deletions(-) diff --git a/source/blender/render/hydra/render_task_delegate.cc b/source/blender/render/hydra/render_task_delegate.cc index 02d2392ddf00..450cc5fc4c2c 100644 --- a/source/blender/render/hydra/render_task_delegate.cc +++ b/source/blender/render/hydra/render_task_delegate.cc @@ -105,6 +105,7 @@ void RenderTaskDelegate::add_aov(pxr::TfToken const &aov_key) binding.aovName = aov_key; binding.renderBufferId = buf_id; binding.aovSettings = aov_desc.aovSettings; + binding.clearValue = pxr::VtValue(pxr::GfVec4f(0)); task_params_.aovBindings.push_back(binding); render_index.GetChangeTracker().MarkTaskDirty(task_id_, pxr::HdChangeTracker::DirtyParams); } @@ -237,6 +238,18 @@ void GPURenderTaskDelegate::read_aov(pxr::TfToken const &aov_key, GPUTexture *te MEM_freeN(tex_data); } +GPUTexture *GPURenderTaskDelegate::aov_texture(pxr::TfToken const &aov_key) const +{ + GPUTexture *tex = nullptr; + if (aov_key == pxr::HdAovTokens->color) { + tex = tex_color_; + } + else if (aov_key == pxr::HdAovTokens->depth) { + tex = tex_depth_; + } + return tex; +} + void GPURenderTaskDelegate::bind() { if (!framebuffer_) { diff --git a/source/blender/render/hydra/render_task_delegate.h b/source/blender/render/hydra/render_task_delegate.h index 5952b8f86859..5fe7afe9b933 100644 --- a/source/blender/render/hydra/render_task_delegate.h +++ b/source/blender/render/hydra/render_task_delegate.h @@ -57,6 +57,7 @@ class GPURenderTaskDelegate : public RenderTaskDelegate { void add_aov(pxr::TfToken const &aov_key) override; void read_aov(pxr::TfToken const &aov_key, void *data) override; void read_aov(pxr::TfToken const &aov_key, GPUTexture *texture) override; + GPUTexture *aov_texture(pxr::TfToken const &aov_key) const; void bind() override; void unbind() override; }; diff --git a/source/blender/render/hydra/viewport_engine.cc b/source/blender/render/hydra/viewport_engine.cc index 4438e7bce56d..b1ed6dffbbcd 100644 --- a/source/blender/render/hydra/viewport_engine.cc +++ b/source/blender/render/hydra/viewport_engine.cc @@ -183,7 +183,7 @@ void DrawTexture::write_data(int width, int height, const void *data) width, height, 1, - GPU_RGBA16F, + GPU_RGBA32F, GPU_TEXTURE_USAGE_GENERAL, (float *)data); } @@ -237,20 +237,15 @@ void ViewportEngine::render(Depsgraph *depsgraph, bContext *context) light_tasks_delegate_->set_viewport(viewport); } - if ((bl_engine_->type->flag & RE_USE_GPU_CONTEXT) == 0) { - render_task_delegate_->add_aov(pxr::HdAovTokens->color); - } + render_task_delegate_->add_aov(pxr::HdAovTokens->color); + render_task_delegate_->add_aov(pxr::HdAovTokens->depth); - /* Workaround missing/buggy VAOs in hgiGL and hdSt. For OpenGL compatibility - * profile this is not a problem, but for core profile it is. */ - GLuint VAO; - if (GPU_backend_get_type() == GPU_BACKEND_OPENGL) { - glGenVertexArrays(1, &VAO); - glBindVertexArray(VAO); - } + //if ((bl_engine_->type->flag & RE_USE_GPU_CONTEXT) == 0) { + //render_task_delegate_->bind(); + //} - GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_IMAGE); - GPU_shader_bind(shader); + ///* Workaround missing/buggy VAOs in hgiGL and hdSt. For OpenGL compatibility + // * profile this is not a problem, but for core profile it is. */ pxr::HdTaskSharedPtrVector tasks; if (light_tasks_delegate_) { @@ -260,19 +255,52 @@ void ViewportEngine::render(Depsgraph *depsgraph, bContext *context) tasks.push_back(light_tasks_delegate_->simple_task()); } tasks.push_back(render_task_delegate_->task()); + + GPUFrameBuffer *prev_fb = GPU_framebuffer_active_get(); + GPUFrameBuffer *framebuffer = nullptr; + GLuint VAO; + if (bl_engine_->type->flag & RE_USE_GPU_CONTEXT) { + GPURenderTaskDelegate *r = dynamic_cast(render_task_delegate_.get()); + framebuffer = GPU_framebuffer_create("fb_render_hydra"); + GPU_framebuffer_ensure_config( + &framebuffer, + {GPU_ATTACHMENT_TEXTURE(r->aov_texture(pxr::HdAovTokens->depth)), + GPU_ATTACHMENT_TEXTURE(r->aov_texture(pxr::HdAovTokens->color))}); + GPU_framebuffer_bind(framebuffer); + float clear_color[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + GPU_framebuffer_clear_color_depth(framebuffer, clear_color, 1.0f); + if (GPU_backend_get_type() == GPU_BACKEND_OPENGL) { + glGenVertexArrays(1, &VAO); + glBindVertexArray(VAO); + } + } + engine_->Execute(render_index_.get(), &tasks); - if ((bl_engine_->type->flag & RE_USE_GPU_CONTEXT) == 0) { + if (bl_engine_->type->flag & RE_USE_GPU_CONTEXT) { + if (GPU_backend_get_type() == GPU_BACKEND_OPENGL) { + glDeleteVertexArrays(1, &VAO); + } + GPU_framebuffer_free(framebuffer); + } + + //if ((bl_engine_->type->flag & RE_USE_GPU_CONTEXT) == 0) { draw_texture_.write_data(view_settings.width(), view_settings.height(), nullptr); render_task_delegate_->read_aov(pxr::HdAovTokens->color, draw_texture_.texture()); + + GPU_framebuffer_bind(prev_fb); + GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_IMAGE); + GPU_shader_bind(shader); + draw_texture_.draw(shader, viewport); - } + //} GPU_shader_unbind(); - if (GPU_backend_get_type() == GPU_BACKEND_OPENGL) { - glDeleteVertexArrays(1, &VAO); - } + //if (GPU_backend_get_type() == GPU_BACKEND_OPENGL) { + // glDeleteVertexArrays(1, &VAO); + //} + //render_task_delegate_->unbind(); if (renderer_percent_done() == 0.0f) { time_begin_ = PIL_check_seconds_timer(); -- 2.30.2 From 6ba2f8dbb4b2ed0c045af2aebabcbfb8f43ff888 Mon Sep 17 00:00:00 2001 From: Bogdan Nagirniak Date: Fri, 28 Jul 2023 02:32:38 +0300 Subject: [PATCH 2/5] Fix read_aov() to texture by checking data format --- source/blender/render/hydra/render_task_delegate.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/blender/render/hydra/render_task_delegate.cc b/source/blender/render/hydra/render_task_delegate.cc index 450cc5fc4c2c..f8590223517f 100644 --- a/source/blender/render/hydra/render_task_delegate.cc +++ b/source/blender/render/hydra/render_task_delegate.cc @@ -131,8 +131,11 @@ void RenderTaskDelegate::read_aov(pxr::TfToken const &aov_key, GPUTexture *textu if (!buffer) { return; } + eGPUDataFormat format = buffer->GetFormat() == pxr::HdFormat::HdFormatFloat16Vec4 ? + GPU_DATA_HALF_FLOAT : + GPU_DATA_FLOAT; void *buf_data = buffer->Map(); - GPU_texture_update(texture, GPU_DATA_FLOAT, buf_data); + GPU_texture_update(texture, format, buf_data); buffer->Unmap(); } -- 2.30.2 From 4d8d9ae681dd3be079590aff46b86b2580801068 Mon Sep 17 00:00:00 2001 From: Bogdan Nagirniak Date: Fri, 28 Jul 2023 09:53:32 +0300 Subject: [PATCH 3/5] Fixes and code improvements --- source/blender/render/hydra/final_engine.cc | 5 +- .../render/hydra/render_task_delegate.cc | 32 +++++------ .../render/hydra/render_task_delegate.h | 2 +- .../blender/render/hydra/viewport_engine.cc | 53 ++++--------------- 4 files changed, 25 insertions(+), 67 deletions(-) diff --git a/source/blender/render/hydra/final_engine.cc b/source/blender/render/hydra/final_engine.cc index 12fe44325d62..d70a3371ec20 100644 --- a/source/blender/render/hydra/final_engine.cc +++ b/source/blender/render/hydra/final_engine.cc @@ -57,8 +57,6 @@ void FinalEngine::render(Depsgraph *depsgraph) render_task_delegate_->add_aov(pxr::HdAovTokens->color); render_task_delegate_->add_aov(pxr::HdAovTokens->depth); - render_task_delegate_->bind(); - pxr::HdTaskSharedPtrVector tasks; if (light_tasks_delegate_) { if (scene->r.alphamode != R_ALPHAPREMUL) { @@ -67,6 +65,9 @@ void FinalEngine::render(Depsgraph *depsgraph) tasks.push_back(light_tasks_delegate_->simple_task()); } tasks.push_back(render_task_delegate_->task()); + + render_task_delegate_->bind(); + engine_->Execute(render_index_.get(), &tasks); char elapsed_time[32]; diff --git a/source/blender/render/hydra/render_task_delegate.cc b/source/blender/render/hydra/render_task_delegate.cc index f8590223517f..79ef78a6628a 100644 --- a/source/blender/render/hydra/render_task_delegate.cc +++ b/source/blender/render/hydra/render_task_delegate.cc @@ -148,6 +148,16 @@ pxr::SdfPath RenderTaskDelegate::buffer_id(pxr::TfToken const &aov_key) const return GetDelegateID().AppendElementString("aov_" + aov_key.GetString()); } +GPURenderTaskDelegate::~GPURenderTaskDelegate() +{ + if (tex_color_) { + GPU_texture_free(tex_color_); + } + if (tex_depth_) { + GPU_texture_free(tex_depth_); + } +} + void GPURenderTaskDelegate::set_viewport(pxr::GfVec4d const &viewport) { if (task_params_.viewport == viewport) { @@ -241,23 +251,9 @@ void GPURenderTaskDelegate::read_aov(pxr::TfToken const &aov_key, GPUTexture *te MEM_freeN(tex_data); } -GPUTexture *GPURenderTaskDelegate::aov_texture(pxr::TfToken const &aov_key) const -{ - GPUTexture *tex = nullptr; - if (aov_key == pxr::HdAovTokens->color) { - tex = tex_color_; - } - else if (aov_key == pxr::HdAovTokens->depth) { - tex = tex_depth_; - } - return tex; -} - void GPURenderTaskDelegate::bind() { - if (!framebuffer_) { - framebuffer_ = GPU_framebuffer_create("fb_render_hydra"); - } + framebuffer_ = GPU_framebuffer_create("fb_render_hydra"); GPU_framebuffer_ensure_config( &framebuffer_, {GPU_ATTACHMENT_TEXTURE(tex_depth_), GPU_ATTACHMENT_TEXTURE(tex_color_)}); GPU_framebuffer_bind(framebuffer_); @@ -268,9 +264,7 @@ void GPURenderTaskDelegate::bind() /* Workaround missing/buggy VAOs in hgiGL and hdSt. For OpenGL compatibility * profile this is not a problem, but for core profile it is. */ if (GPU_backend_get_type() == GPU_BACKEND_OPENGL) { - if (VAO_ == 0) { - glGenVertexArrays(1, &VAO_); - } + glGenVertexArrays(1, &VAO_); glBindVertexArray(VAO_); } } @@ -281,8 +275,6 @@ void GPURenderTaskDelegate::unbind() glDeleteVertexArrays(1, &VAO_); } GPU_framebuffer_free(framebuffer_); - GPU_texture_free(tex_color_); - GPU_texture_free(tex_depth_); } } // namespace blender::render::hydra diff --git a/source/blender/render/hydra/render_task_delegate.h b/source/blender/render/hydra/render_task_delegate.h index 5fe7afe9b933..d61d6e93a4e3 100644 --- a/source/blender/render/hydra/render_task_delegate.h +++ b/source/blender/render/hydra/render_task_delegate.h @@ -52,12 +52,12 @@ class GPURenderTaskDelegate : public RenderTaskDelegate { public: using RenderTaskDelegate::RenderTaskDelegate; + ~GPURenderTaskDelegate() override; void set_viewport(pxr::GfVec4d const &viewport) override; void add_aov(pxr::TfToken const &aov_key) override; void read_aov(pxr::TfToken const &aov_key, void *data) override; void read_aov(pxr::TfToken const &aov_key, GPUTexture *texture) override; - GPUTexture *aov_texture(pxr::TfToken const &aov_key) const; void bind() override; void unbind() override; }; diff --git a/source/blender/render/hydra/viewport_engine.cc b/source/blender/render/hydra/viewport_engine.cc index b1ed6dffbbcd..ee0df57a2e8c 100644 --- a/source/blender/render/hydra/viewport_engine.cc +++ b/source/blender/render/hydra/viewport_engine.cc @@ -240,13 +240,6 @@ void ViewportEngine::render(Depsgraph *depsgraph, bContext *context) render_task_delegate_->add_aov(pxr::HdAovTokens->color); render_task_delegate_->add_aov(pxr::HdAovTokens->depth); - //if ((bl_engine_->type->flag & RE_USE_GPU_CONTEXT) == 0) { - //render_task_delegate_->bind(); - //} - - ///* Workaround missing/buggy VAOs in hgiGL and hdSt. For OpenGL compatibility - // * profile this is not a problem, but for core profile it is. */ - pxr::HdTaskSharedPtrVector tasks; if (light_tasks_delegate_) { if (scene->r.alphamode != R_ALPHAPREMUL) { @@ -256,52 +249,24 @@ void ViewportEngine::render(Depsgraph *depsgraph, bContext *context) } tasks.push_back(render_task_delegate_->task()); - GPUFrameBuffer *prev_fb = GPU_framebuffer_active_get(); - GPUFrameBuffer *framebuffer = nullptr; - GLuint VAO; - if (bl_engine_->type->flag & RE_USE_GPU_CONTEXT) { - GPURenderTaskDelegate *r = dynamic_cast(render_task_delegate_.get()); - framebuffer = GPU_framebuffer_create("fb_render_hydra"); - GPU_framebuffer_ensure_config( - &framebuffer, - {GPU_ATTACHMENT_TEXTURE(r->aov_texture(pxr::HdAovTokens->depth)), - GPU_ATTACHMENT_TEXTURE(r->aov_texture(pxr::HdAovTokens->color))}); - GPU_framebuffer_bind(framebuffer); - float clear_color[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - GPU_framebuffer_clear_color_depth(framebuffer, clear_color, 1.0f); - if (GPU_backend_get_type() == GPU_BACKEND_OPENGL) { - glGenVertexArrays(1, &VAO); - glBindVertexArray(VAO); - } - } + GPUFrameBuffer *view_framebuffer = GPU_framebuffer_active_get(); + render_task_delegate_->bind(); engine_->Execute(render_index_.get(), &tasks); - if (bl_engine_->type->flag & RE_USE_GPU_CONTEXT) { - if (GPU_backend_get_type() == GPU_BACKEND_OPENGL) { - glDeleteVertexArrays(1, &VAO); - } - GPU_framebuffer_free(framebuffer); - } + render_task_delegate_->unbind(); - //if ((bl_engine_->type->flag & RE_USE_GPU_CONTEXT) == 0) { - draw_texture_.write_data(view_settings.width(), view_settings.height(), nullptr); - render_task_delegate_->read_aov(pxr::HdAovTokens->color, draw_texture_.texture()); + draw_texture_.write_data(view_settings.width(), view_settings.height(), nullptr); + render_task_delegate_->read_aov(pxr::HdAovTokens->color, draw_texture_.texture()); - GPU_framebuffer_bind(prev_fb); - GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_IMAGE); - GPU_shader_bind(shader); + GPU_framebuffer_bind(view_framebuffer); + GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_IMAGE); + GPU_shader_bind(shader); - draw_texture_.draw(shader, viewport); - //} + draw_texture_.draw(shader, viewport); GPU_shader_unbind(); - //if (GPU_backend_get_type() == GPU_BACKEND_OPENGL) { - // glDeleteVertexArrays(1, &VAO); - //} - //render_task_delegate_->unbind(); - if (renderer_percent_done() == 0.0f) { time_begin_ = PIL_check_seconds_timer(); } -- 2.30.2 From 33c76373a48191a48d9ecd81ba39e35898061b5f Mon Sep 17 00:00:00 2001 From: Bogdan Nagirniak Date: Fri, 28 Jul 2023 16:41:42 +0300 Subject: [PATCH 4/5] Optimized viewport render for Storm by drawing rendered texture to viewport directly. --- .../render/hydra/render_task_delegate.cc | 11 +++++++++ .../render/hydra/render_task_delegate.h | 1 + .../blender/render/hydra/viewport_engine.cc | 24 +++++++++++-------- source/blender/render/hydra/viewport_engine.h | 3 +-- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/source/blender/render/hydra/render_task_delegate.cc b/source/blender/render/hydra/render_task_delegate.cc index 79ef78a6628a..1b2d7a4985b5 100644 --- a/source/blender/render/hydra/render_task_delegate.cc +++ b/source/blender/render/hydra/render_task_delegate.cc @@ -277,4 +277,15 @@ void GPURenderTaskDelegate::unbind() GPU_framebuffer_free(framebuffer_); } +GPUTexture *GPURenderTaskDelegate::aov_texture(pxr::TfToken const &aov_key) +{ + if (aov_key == pxr::HdAovTokens->color) { + return tex_color_; + } + if (aov_key == pxr::HdAovTokens->depth) { + return tex_depth_; + } + return nullptr; +} + } // namespace blender::render::hydra diff --git a/source/blender/render/hydra/render_task_delegate.h b/source/blender/render/hydra/render_task_delegate.h index d61d6e93a4e3..82a006889ebd 100644 --- a/source/blender/render/hydra/render_task_delegate.h +++ b/source/blender/render/hydra/render_task_delegate.h @@ -60,6 +60,7 @@ class GPURenderTaskDelegate : public RenderTaskDelegate { void read_aov(pxr::TfToken const &aov_key, GPUTexture *texture) override; void bind() override; void unbind() override; + GPUTexture *aov_texture(pxr::TfToken const &aov_key); }; } // namespace blender::render::hydra diff --git a/source/blender/render/hydra/viewport_engine.cc b/source/blender/render/hydra/viewport_engine.cc index ee0df57a2e8c..10fc69862c52 100644 --- a/source/blender/render/hydra/viewport_engine.cc +++ b/source/blender/render/hydra/viewport_engine.cc @@ -188,13 +188,11 @@ void DrawTexture::write_data(int width, int height, const void *data) (float *)data); } -void DrawTexture::draw(GPUShader *shader, const pxr::GfVec4d &viewport) -{ - draw(shader, texture_, viewport); -} - -void DrawTexture::draw(GPUShader *shader, GPUTexture *tex, const pxr::GfVec4d &viewport) +void DrawTexture::draw(GPUShader *shader, const pxr::GfVec4d &viewport, GPUTexture *tex) { + if (!tex) { + tex = texture_; + } int slot = GPU_shader_get_sampler_binding(shader, "image"); GPU_texture_bind(tex, slot); GPU_shader_uniform_1i(shader, "image", slot); @@ -256,14 +254,20 @@ void ViewportEngine::render(Depsgraph *depsgraph, bContext *context) render_task_delegate_->unbind(); - draw_texture_.write_data(view_settings.width(), view_settings.height(), nullptr); - render_task_delegate_->read_aov(pxr::HdAovTokens->color, draw_texture_.texture()); - GPU_framebuffer_bind(view_framebuffer); GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_IMAGE); GPU_shader_bind(shader); - draw_texture_.draw(shader, viewport); + GPURenderTaskDelegate *gpu_task = dynamic_cast( + render_task_delegate_.get()); + if (gpu_task) { + draw_texture_.draw(shader, viewport, gpu_task->aov_texture(pxr::HdAovTokens->color)); + } + else { + draw_texture_.write_data(view_settings.width(), view_settings.height(), nullptr); + render_task_delegate_->read_aov(pxr::HdAovTokens->color, draw_texture_.texture()); + draw_texture_.draw(shader, viewport); + } GPU_shader_unbind(); diff --git a/source/blender/render/hydra/viewport_engine.h b/source/blender/render/hydra/viewport_engine.h index 60b889846284..dab01863196b 100644 --- a/source/blender/render/hydra/viewport_engine.h +++ b/source/blender/render/hydra/viewport_engine.h @@ -23,8 +23,7 @@ class DrawTexture { ~DrawTexture(); void write_data(int width, int height, const void *data); - void draw(GPUShader *shader, const pxr::GfVec4d &viewport); - void draw(GPUShader *shader, GPUTexture *tex, const pxr::GfVec4d &viewport); + void draw(GPUShader *shader, const pxr::GfVec4d &viewport, GPUTexture *tex = nullptr); GPUTexture *texture() const; private: -- 2.30.2 From 23605083da0a867e60012b87131c6fa116d691f7 Mon Sep 17 00:00:00 2001 From: Bogdan Nagirniak Date: Sat, 29 Jul 2023 12:34:55 +0300 Subject: [PATCH 5/5] Added more stability to GPURenderTaskDelegate code --- .../blender/render/hydra/render_task_delegate.cc | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/source/blender/render/hydra/render_task_delegate.cc b/source/blender/render/hydra/render_task_delegate.cc index 1b2d7a4985b5..8c6997f03b03 100644 --- a/source/blender/render/hydra/render_task_delegate.cc +++ b/source/blender/render/hydra/render_task_delegate.cc @@ -150,6 +150,7 @@ pxr::SdfPath RenderTaskDelegate::buffer_id(pxr::TfToken const &aov_key) const GPURenderTaskDelegate::~GPURenderTaskDelegate() { + unbind(); if (tex_color_) { GPU_texture_free(tex_color_); } @@ -253,7 +254,9 @@ void GPURenderTaskDelegate::read_aov(pxr::TfToken const &aov_key, GPUTexture *te void GPURenderTaskDelegate::bind() { - framebuffer_ = GPU_framebuffer_create("fb_render_hydra"); + if (!framebuffer_) { + framebuffer_ = GPU_framebuffer_create("fb_render_hydra"); + } GPU_framebuffer_ensure_config( &framebuffer_, {GPU_ATTACHMENT_TEXTURE(tex_depth_), GPU_ATTACHMENT_TEXTURE(tex_color_)}); GPU_framebuffer_bind(framebuffer_); @@ -263,7 +266,7 @@ void GPURenderTaskDelegate::bind() /* Workaround missing/buggy VAOs in hgiGL and hdSt. For OpenGL compatibility * profile this is not a problem, but for core profile it is. */ - if (GPU_backend_get_type() == GPU_BACKEND_OPENGL) { + if (VAO_ == 0 && GPU_backend_get_type() == GPU_BACKEND_OPENGL) { glGenVertexArrays(1, &VAO_); glBindVertexArray(VAO_); } @@ -271,10 +274,14 @@ void GPURenderTaskDelegate::bind() void GPURenderTaskDelegate::unbind() { - if (GPU_backend_get_type() == GPU_BACKEND_OPENGL) { + if (VAO_) { glDeleteVertexArrays(1, &VAO_); + VAO_ = 0; + } + if (framebuffer_) { + GPU_framebuffer_free(framebuffer_); + framebuffer_ = nullptr; } - GPU_framebuffer_free(framebuffer_); } GPUTexture *GPURenderTaskDelegate::aov_texture(pxr::TfToken const &aov_key) -- 2.30.2