11#include <pxr/imaging/hd/renderBuffer.h>
12#include <pxr/imaging/hd/renderDelegate.h>
13#include <pxr/imaging/hdx/renderTask.h>
24 pxr::SdfPath
const &delegate_id)
25 : pxr::HdSceneDelegate(parent_index, delegate_id)
27 task_id_ = GetDelegateID().AppendElementString(
"task");
28 GetRenderIndex().InsertTask<pxr::HdxRenderTask>(
this,
task_id_);
44 if (key == pxr::HdTokens->
params) {
47 if (key == pxr::HdTokens->collection) {
48 return pxr::VtValue(pxr::HdRprimCollection(
49 pxr::HdTokens->
geometry, pxr::HdReprSelector(pxr::HdReprTokens->smoothHull)));
51 return pxr::VtValue();
58 return {pxr::HdRenderTagTokens->geometry};
70 return GetRenderIndex().GetTask(
task_id_);
79 GetRenderIndex().GetChangeTracker().MarkTaskDirty(
task_id_, pxr::HdChangeTracker::DirtyParams);
84 return static_cast<pxr::HdxRenderTask *
>(
task().get())->IsConverged();
92 auto &render_index = GetRenderIndex();
94 render_index.GetChangeTracker().MarkTaskDirty(
task_id_, pxr::HdChangeTracker::DirtyParams);
96 int w = viewport[2] - viewport[0];
97 int h = viewport[3] - viewport[1];
99 it.second.dimensions = pxr::GfVec3i(
w, h, 1);
100 render_index.GetChangeTracker().MarkBprimDirty(it.first,
101 pxr::HdRenderBuffer::DirtyDescription);
107 pxr::SdfPath buf_id =
buffer_id(aov_key);
111 auto &render_index = GetRenderIndex();
112 pxr::HdAovDescriptor aov_desc = render_index.GetRenderDelegate()->GetDefaultAovDescriptor(
115 if (aov_desc.format == pxr::HdFormatInvalid) {
120 pxr::HdGetComponentFormat(aov_desc.format), pxr::HdFormatFloat32, pxr::HdFormatFloat16))
123 "Unsupported data format %s for AOV %s",
124 pxr::TfEnum::GetName(aov_desc.format).c_str(),
131 render_index.InsertBprim(pxr::HdPrimTypeTokens->renderBuffer,
this, buf_id);
133 pxr::GfVec3i(
w, h, 1), aov_desc.format, aov_desc.multiSampled);
135 pxr::HdRenderPassAovBinding binding;
136 binding.aovName = aov_key;
137 binding.renderBufferId = buf_id;
138 binding.aovSettings = aov_desc.aovSettings;
139 binding.clearValue = aov_desc.clearValue;
141 render_index.GetChangeTracker().MarkTaskDirty(
task_id_, pxr::HdChangeTracker::DirtyParams);
148 pxr::HdRenderBuffer *buffer =
static_cast<pxr::HdRenderBuffer *
>(
149 GetRenderIndex().GetBprim(pxr::HdPrimTypeTokens->renderBuffer,
buffer_id(aov_key)));
154 pxr::HdFormat
format = buffer->GetFormat();
155 size_t len = buffer->GetWidth() * buffer->GetHeight() * pxr::HdGetComponentCount(
format);
156 if (pxr::HdGetComponentFormat(
format) == pxr::HdFormatFloat32) {
157 void *buf_data = buffer->Map();
158 memcpy(
data, buf_data,
len *
sizeof(
float));
161 else if (pxr::HdGetComponentFormat(
format) == pxr::HdFormatFloat16) {
162 Eigen::half *buf_data = (Eigen::half *)buffer->Map();
163 float *fdata = (
float *)
data;
164 for (
size_t i = 0;
i <
len; ++
i) {
165 fdata[
i] = buf_data[
i];
176 return (pxr::HdRenderBuffer *)GetRenderIndex().GetBprim(pxr::HdPrimTypeTokens->renderBuffer,
186 return GetDelegateID().AppendElementString(
"aov_" + aov_key.GetString());
205 auto &render_index = GetRenderIndex();
207 render_index.GetChangeTracker().MarkTaskDirty(
task_id_, pxr::HdChangeTracker::DirtyParams);
211 tex_color_ =
nullptr;
216 tex_depth_ =
nullptr;
217 add_aov(pxr::HdAovTokens->depth);
225 if (aov_key == pxr::HdAovTokens->
color) {
226 format = blender::gpu::TextureFormat::SFLOAT_32_32_32_32;
229 else if (aov_key == pxr::HdAovTokens->depth) {
230 format = blender::gpu::TextureFormat::SFLOAT_32_DEPTH;
257 if (aov_key == pxr::HdAovTokens->
color) {
261 else if (aov_key == pxr::HdAovTokens->depth) {
271 memcpy(
data, tex_data,
sizeof(
float) *
w * h * c);
284 float clear_color[4] = {0.0f, 0.0f, 0.0f, 0.0f};
290 glGenVertexArrays(1, &VAO_);
291 glBindVertexArray(VAO_);
299 glDeleteVertexArrays(1, &VAO_);
304 framebuffer_ =
nullptr;
311 if (aov_key == pxr::HdAovTokens->
color) {
314 if (aov_key == pxr::HdAovTokens->depth) {
#define BLI_assert_unreachable()
#define CLOG_ERROR(clg_ref,...)
#define CLOG_DEBUG(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
GPUBackendType GPU_backend_get_type()
blender::gpu::FrameBuffer * GPU_framebuffer_create(const char *name)
#define GPU_ATTACHMENT_TEXTURE(_texture)
void GPU_framebuffer_free(blender::gpu::FrameBuffer *fb)
#define GPU_framebuffer_ensure_config(_fb,...)
void GPU_framebuffer_clear_color_depth(blender::gpu::FrameBuffer *fb, const float clear_col[4], float clear_depth)
void GPU_framebuffer_bind(blender::gpu::FrameBuffer *fb)
int GPU_texture_height(const blender::gpu::Texture *texture)
int GPU_texture_width(const blender::gpu::Texture *texture)
@ GPU_TEXTURE_USAGE_GENERAL
void * GPU_texture_read(blender::gpu::Texture *texture, eGPUDataFormat data_format, int mip_level)
blender::gpu::Texture * GPU_texture_create_2d(const char *name, int width, int height, int mip_len, blender::gpu::TextureFormat format, eGPUTextureUsage usage, const float *data)
void GPU_texture_free(blender::gpu::Texture *texture)
Read Guarded memory(de)allocation.
BMesh const char void * data
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
void add_aov(pxr::TfToken const &aov_key) override
void set_viewport(pxr::GfVec4d const &viewport) override
blender::gpu::Texture * get_aov_texture(pxr::TfToken const &aov_key)
void read_aov(pxr::TfToken const &aov_key, void *data) override
~GPURenderTaskDelegate() override
pxr::HdRenderBuffer * get_aov_buffer(pxr::TfToken const &aov_key)
pxr::TfTokenVector GetTaskRenderTags(pxr::SdfPath const &id) override
pxr::HdTaskSharedPtr task()
RenderTaskDelegate(pxr::HdRenderIndex *parent_index, pxr::SdfPath const &delegate_id)
pxr::HdxRenderTaskParams task_params_
virtual void set_viewport(pxr::GfVec4d const &viewport)
pxr::VtValue Get(pxr::SdfPath const &id, pxr::TfToken const &key) override
virtual void add_aov(pxr::TfToken const &aov_key)
pxr::SdfPath buffer_id(pxr::TfToken const &aov_key) const
void set_camera(pxr::SdfPath const &camera_id)
virtual void read_aov(pxr::TfToken const &aov_key, void *data)
pxr::HdRenderBufferDescriptor GetRenderBufferDescriptor(pxr::SdfPath const &id) override
pxr::TfHashMap< pxr::SdfPath, pxr::HdRenderBufferDescriptor, pxr::SdfPath::Hash > buffer_descriptors_
void MEM_freeN(void *vmemh)
struct CLG_LogRef * LOG_HYDRA_RENDER