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_);
30 task_params_.enableLighting =
true;
31 task_params_.alphaThreshold = 0.1f;
40 if (key == pxr::HdTokens->
params) {
43 if (key == pxr::HdTokens->collection) {
44 return pxr::VtValue(pxr::HdRprimCollection(
45 pxr::HdTokens->geometry, pxr::HdReprSelector(pxr::HdReprTokens->smoothHull)));
47 return pxr::VtValue();
54 return {pxr::HdRenderTagTokens->geometry};
66 return GetRenderIndex().GetTask(
task_id_);
75 GetRenderIndex().GetChangeTracker().MarkTaskDirty(
task_id_, pxr::HdChangeTracker::DirtyParams);
80 return static_cast<pxr::HdxRenderTask *
>(
task().get())->IsConverged();
88 auto &render_index = GetRenderIndex();
90 render_index.GetChangeTracker().MarkTaskDirty(
task_id_, pxr::HdChangeTracker::DirtyParams);
92 int w = viewport[2] - viewport[0];
93 int h = viewport[3] - viewport[1];
95 it.second.dimensions = pxr::GfVec3i(
w, h, 1);
96 render_index.GetChangeTracker().MarkBprimDirty(it.first,
97 pxr::HdRenderBuffer::DirtyDescription);
103 pxr::SdfPath buf_id =
buffer_id(aov_key);
107 auto &render_index = GetRenderIndex();
108 pxr::HdAovDescriptor aov_desc = render_index.GetRenderDelegate()->GetDefaultAovDescriptor(
111 if (aov_desc.format == pxr::HdFormatInvalid) {
116 pxr::HdGetComponentFormat(aov_desc.format), pxr::HdFormatFloat32, pxr::HdFormatFloat16))
119 "Unsupported data format %s for AOV %s",
120 pxr::TfEnum::GetName(aov_desc.format).c_str(),
127 render_index.InsertBprim(pxr::HdPrimTypeTokens->renderBuffer,
this, buf_id);
129 pxr::GfVec3i(
w, h, 1), aov_desc.format, aov_desc.multiSampled);
131 pxr::HdRenderPassAovBinding binding;
132 binding.aovName = aov_key;
133 binding.renderBufferId = buf_id;
134 binding.aovSettings = aov_desc.aovSettings;
135 binding.clearValue = aov_desc.clearValue;
137 render_index.GetChangeTracker().MarkTaskDirty(
task_id_, pxr::HdChangeTracker::DirtyParams);
144 pxr::HdRenderBuffer *buffer =
static_cast<pxr::HdRenderBuffer *
>(
145 GetRenderIndex().GetBprim(pxr::HdPrimTypeTokens->renderBuffer,
buffer_id(aov_key)));
150 pxr::HdFormat
format = buffer->GetFormat();
151 size_t len = buffer->GetWidth() * buffer->GetHeight() * pxr::HdGetComponentCount(
format);
152 if (pxr::HdGetComponentFormat(
format) == pxr::HdFormatFloat32) {
153 void *buf_data = buffer->Map();
154 memcpy(data, buf_data,
len *
sizeof(
float));
157 else if (pxr::HdGetComponentFormat(
format) == pxr::HdFormatFloat16) {
158 Eigen::half *buf_data = (Eigen::half *)buffer->Map();
159 float *fdata = (
float *)data;
160 for (
size_t i = 0; i <
len; ++i) {
161 fdata[i] = buf_data[i];
172 pxr::HdRenderBuffer *buffer = (pxr::HdRenderBuffer *)GetRenderIndex().GetBprim(
173 pxr::HdPrimTypeTokens->renderBuffer,
buffer_id(aov_key));
180 void *buf_data = buffer->Map();
191 return GetDelegateID().AppendElementString(
"aov_" + aov_key.GetString());
210 auto &render_index = GetRenderIndex();
212 render_index.GetChangeTracker().MarkTaskDirty(
task_id_, pxr::HdChangeTracker::DirtyParams);
216 tex_color_ =
nullptr;
217 add_aov(pxr::HdAovTokens->color);
221 tex_depth_ =
nullptr;
222 add_aov(pxr::HdAovTokens->depth);
230 if (aov_key == pxr::HdAovTokens->color) {
234 else if (aov_key == pxr::HdAovTokens->depth) {
260 GPUTexture *
tex =
nullptr;
262 if (aov_key == pxr::HdAovTokens->color) {
266 else if (aov_key == pxr::HdAovTokens->depth) {
276 memcpy(data, tex_data,
sizeof(
float) *
w * h * c);
282 GPUTexture *
tex =
nullptr;
283 if (aov_key == pxr::HdAovTokens->color) {
286 else if (aov_key == pxr::HdAovTokens->depth) {
307 float clear_color[4] = {0.0f, 0.0f, 0.0f, 0.0f};
313 glGenVertexArrays(1, &VAO_);
314 glBindVertexArray(VAO_);
322 glDeleteVertexArrays(1, &VAO_);
327 framebuffer_ =
nullptr;
334 if (aov_key == pxr::HdAovTokens->color) {
337 if (aov_key == pxr::HdAovTokens->depth) {
#define BLI_assert_unreachable()
#define CLOG_ERROR(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
#define CLOG_INFO(clg_ref, level,...)
eGPUBackendType GPU_backend_get_type()
GPUFrameBuffer * GPU_framebuffer_create(const char *name)
#define GPU_ATTACHMENT_TEXTURE(_texture)
void GPU_framebuffer_clear_color_depth(GPUFrameBuffer *fb, const float clear_col[4], float clear_depth)
void GPU_framebuffer_bind(GPUFrameBuffer *framebuffer)
#define GPU_framebuffer_ensure_config(_fb,...)
void GPU_framebuffer_free(GPUFrameBuffer *framebuffer)
int GPU_texture_height(const GPUTexture *texture)
GPUTexture * GPU_texture_create_2d(const char *name, int width, int height, int mip_len, eGPUTextureFormat format, eGPUTextureUsage usage, const float *data)
void GPU_texture_free(GPUTexture *texture)
int GPU_texture_width(const GPUTexture *texture)
void * GPU_texture_read(GPUTexture *texture, eGPUDataFormat data_format, int mip_level)
@ GPU_TEXTURE_USAGE_GENERAL
void GPU_texture_update(GPUTexture *texture, eGPUDataFormat data_format, const void *data)
Read Guarded memory(de)allocation.
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
GPUTexture * aov_texture(pxr::TfToken const &aov_key)
void read_aov(pxr::TfToken const &aov_key, void *data) override
~GPURenderTaskDelegate() override
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_
additional_info("compositor_sum_float_shared") .push_constant(Type additional_info("compositor_sum_float_shared") .push_constant(Type GPU_RGBA32F
void MEM_freeN(void *vmemh)
struct CLG_LogRef * LOG_HYDRA_RENDER