10#include <pxr/base/gf/vec3i.h>
11#include <pxr/base/gf/vec4f.h>
25 HdRenderBuffer::Finalize(renderParam);
30 if (dimensions[2] != 1) {
31 TF_RUNTIME_ERROR(
"HdCyclesRenderBuffer::Allocate called with dimensions that are not 2D.");
35 const size_t oldSize = _dataSize;
36 const size_t newSize = dimensions[0] * dimensions[1] * HdDataSizeOfFormat(
format);
37 if (oldSize == newSize) {
42 TF_RUNTIME_ERROR(
"HdCyclesRenderBuffer::Allocate called while buffer is mapped.");
46 _width = dimensions[0];
47 _height = dimensions[1];
50 _resourceUsed =
false;
55void HdCyclesRenderBuffer::_Deallocate()
59 _format = HdFormatInvalid;
62 _data.shrink_to_fit();
65 _resource = VtValue();
71 if (!_resource.IsEmpty()) {
75 if (_data.size() != _dataSize) {
76 _data.resize(_dataSize);
103 _converged = converged;
108 return _resourceUsed;
113 TF_UNUSED(multiSampled);
115 _resourceUsed =
true;
122 _resource = resource;
127struct SimpleConversion {
128 static float convert(
float value)
136 return static_cast<int32_t>(value) - 1;
139struct UInt8Conversion {
142 return static_cast<uint8_t>(value * 255.f);
145struct SInt8Conversion {
148 return static_cast<int8_t>(value * 127.f);
151struct HalfConversion {
158template<
typename SrcT,
typename DstT,
typename Convertor = SimpleConversion>
159void writePixels(
const SrcT *srcPtr,
160 const GfVec2i &srcSize,
163 const GfVec2i &dstSize,
165 const Convertor &convertor = {})
167 const auto writeSize = GfVec2i(GfMin(srcSize[0], dstSize[0]), GfMin(srcSize[1], dstSize[1]));
168 const auto writeChannelCount = GfMin(srcChannelCount, dstChannelCount);
170 for (
int y = 0; y < writeSize[1]; ++
y) {
171 for (
int x = 0; x < writeSize[0]; ++
x) {
172 for (
int c = 0; c < writeChannelCount; ++c) {
173 dstPtr[x * dstChannelCount + c] = convertor.convert(srcPtr[x * srcChannelCount + c]);
176 srcPtr += srcSize[0] * srcChannelCount;
177 dstPtr += dstSize[0] * dstChannelCount;
184 const PXR_NS::GfVec2i &srcOffset,
185 const GfVec2i &srcDims,
189 uint8_t *dstPixels = _data.data();
191 const size_t formatSize = HdDataSizeOfFormat(_format);
192 dstPixels += srcOffset[1] * (formatSize * _width) + srcOffset[0] * formatSize;
196 case HdFormatUNorm8Vec2:
197 case HdFormatUNorm8Vec3:
198 case HdFormatUNorm8Vec4:
199 writePixels(srcPixels,
203 GfVec2i(_width, _height),
204 1 + (_format - HdFormatUNorm8),
209 case HdFormatSNorm8Vec2:
210 case HdFormatSNorm8Vec3:
211 case HdFormatSNorm8Vec4:
212 writePixels(srcPixels,
216 GfVec2i(_width, _height),
217 1 + (_format - HdFormatSNorm8),
221 case HdFormatFloat16:
222 case HdFormatFloat16Vec2:
223 case HdFormatFloat16Vec3:
224 case HdFormatFloat16Vec4:
225 writePixels(srcPixels,
228 reinterpret_cast<half *
>(dstPixels),
229 GfVec2i(_width, _height),
230 1 + (_format - HdFormatFloat16),
234 case HdFormatFloat32:
235 case HdFormatFloat32Vec2:
236 case HdFormatFloat32Vec3:
237 case HdFormatFloat32Vec4:
238 writePixels(srcPixels,
241 reinterpret_cast<float *
>(dstPixels),
242 GfVec2i(_width, _height),
243 1 + (_format - HdFormatFloat32));
249 writePixels(srcPixels,
252 reinterpret_cast<int *
>(dstPixels),
253 GfVec2i(_width, _height),
258 writePixels(srcPixels,
261 reinterpret_cast<int *
>(dstPixels),
262 GfVec2i(_width, _height),
266 case HdFormatInt32Vec2:
267 case HdFormatInt32Vec3:
268 case HdFormatInt32Vec4:
269 writePixels(srcPixels,
272 reinterpret_cast<int *
>(dstPixels),
273 GfVec2i(_width, _height),
274 1 + (_format - HdFormatInt32));
278 TF_RUNTIME_ERROR(
"HdCyclesRenderBuffer::WritePixels called with unsupported format.");
bool IsConverged() const override
void SetConverged(bool converged)
HdCyclesRenderBuffer(const PXR_NS::SdfPath &bprimId)
bool IsResourceUsed() const
bool Allocate(const PXR_NS::GfVec3i &dimensions, PXR_NS::HdFormat format, bool multiSampled) override
~HdCyclesRenderBuffer() override
bool IsMapped() const override
void SetResource(const PXR_NS::VtValue &resource)
void Finalize(PXR_NS::HdRenderParam *renderParam) override
void WritePixels(const float *pixels, const PXR_NS::GfVec2i &offset, const PXR_NS::GfVec2i &dims, int channels, bool isId=false)
PXR_NS::VtValue GetResource(bool multiSampled=false) const override
ccl_device_inline half float_to_half_image(float f)
#define HDCYCLES_NAMESPACE_CLOSE_SCOPE
void convert(SignedNormalized< StorageType > &dst, const F32 &src)