10#include <pxr/base/gf/vec3i.h>
11#include <pxr/base/gf/vec4f.h>
25 HdRenderBuffer::Finalize(renderParam);
32 if (dimensions[2] != 1) {
33 TF_RUNTIME_ERROR(
"HdCyclesRenderBuffer::Allocate called with dimensions that are not 2D.");
37 const size_t oldSize = _dataSize;
38 const size_t newSize = dimensions[0] * dimensions[1] * HdDataSizeOfFormat(
format);
39 if (oldSize == newSize) {
44 TF_RUNTIME_ERROR(
"HdCyclesRenderBuffer::Allocate called while buffer is mapped.");
48 _width = dimensions[0];
49 _height = dimensions[1];
52 _resourceUsed =
false;
57void HdCyclesRenderBuffer::_Deallocate()
61 _format = HdFormatInvalid;
64 _data.shrink_to_fit();
67 _resource = VtValue();
73 if (!_resource.IsEmpty()) {
77 if (_data.size() != _dataSize) {
78 _data.resize(_dataSize);
105 _converged = converged;
110 return _resourceUsed;
115 TF_UNUSED(multiSampled);
117 _resourceUsed =
true;
129struct SimpleConversion {
130 static float convert(
const float value)
138 return static_cast<int32_t>(value) - 1;
141struct UInt8Conversion {
144 return static_cast<uint8_t>(value * 255.f);
147struct SInt8Conversion {
150 return static_cast<int8_t>(value * 127.f);
153struct HalfConversion {
160template<
typename SrcT,
typename DstT,
typename Convertor = SimpleConversion>
161void writePixels(
const SrcT *srcPtr,
162 const GfVec2i &srcSize,
163 const int srcChannelCount,
165 const GfVec2i &dstSize,
166 const int dstChannelCount,
167 const Convertor &convertor = {})
169 const auto writeSize = GfVec2i(GfMin(srcSize[0], dstSize[0]), GfMin(srcSize[1], dstSize[1]));
170 const auto writeChannelCount = GfMin(srcChannelCount, dstChannelCount);
172 for (
int y = 0;
y < writeSize[1]; ++
y) {
173 for (
int x = 0;
x < writeSize[0]; ++
x) {
174 for (
int c = 0; c < writeChannelCount; ++c) {
175 dstPtr[
x * dstChannelCount + c] = convertor.convert(srcPtr[
x * srcChannelCount + c]);
178 srcPtr += srcSize[0] * srcChannelCount;
179 dstPtr += dstSize[0] * dstChannelCount;
186 const PXR_NS::GfVec2i &srcOffset,
187 const GfVec2i &srcDims,
188 const int srcChannels,
191 uint8_t *dstPixels = _data.data();
193 const size_t formatSize = HdDataSizeOfFormat(_format);
194 dstPixels += srcOffset[1] * (formatSize * _width) + srcOffset[0] * formatSize;
198 case HdFormatUNorm8Vec2:
199 case HdFormatUNorm8Vec3:
200 case HdFormatUNorm8Vec4:
201 writePixels(srcPixels,
205 GfVec2i(_width, _height),
206 1 + (_format - HdFormatUNorm8),
211 case HdFormatSNorm8Vec2:
212 case HdFormatSNorm8Vec3:
213 case HdFormatSNorm8Vec4:
214 writePixels(srcPixels,
218 GfVec2i(_width, _height),
219 1 + (_format - HdFormatSNorm8),
223 case HdFormatFloat16:
224 case HdFormatFloat16Vec2:
225 case HdFormatFloat16Vec3:
226 case HdFormatFloat16Vec4:
227 writePixels(srcPixels,
230 reinterpret_cast<half *
>(dstPixels),
231 GfVec2i(_width, _height),
232 1 + (_format - HdFormatFloat16),
236 case HdFormatFloat32:
237 case HdFormatFloat32Vec2:
238 case HdFormatFloat32Vec3:
239 case HdFormatFloat32Vec4:
240 writePixels(srcPixels,
243 reinterpret_cast<float *
>(dstPixels),
244 GfVec2i(_width, _height),
245 1 + (_format - HdFormatFloat32));
251 writePixels(srcPixels,
254 reinterpret_cast<int *
>(dstPixels),
255 GfVec2i(_width, _height),
260 writePixels(srcPixels,
263 reinterpret_cast<int *
>(dstPixels),
264 GfVec2i(_width, _height),
268 case HdFormatInt32Vec2:
269 case HdFormatInt32Vec3:
270 case HdFormatInt32Vec4:
271 writePixels(srcPixels,
274 reinterpret_cast<int *
>(dstPixels),
275 GfVec2i(_width, _height),
276 1 + (_format - HdFormatInt32));
280 TF_RUNTIME_ERROR(
"HdCyclesRenderBuffer::WritePixels called with unsupported format.");
void WritePixels(const float *pixels, const PXR_NS::GfVec2i &offset, const PXR_NS::GfVec2i &dims, const int channels, bool isId=false)
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
PXR_NS::VtValue GetResource(bool multiSampled=false) const override
ccl_device_inline half float_to_half_image(const float f)
#define HDCYCLES_NAMESPACE_CLOSE_SCOPE
void convert(SignedNormalized< StorageType > &dst, const F32 &src)