11/* **************************************************************************
2- # Copyright (c) 2015-23 , NVIDIA CORPORATION. All rights reserved.
2+ # Copyright (c) 2015-24 , NVIDIA CORPORATION. All rights reserved.
33 #
44 # Redistribution and use in source and binary forms, with or without
55 # modification, are permitted provided that the following conditions
2828#include " Buffer.h"
2929#include " Device.h"
3030#include " GFXAPI.h"
31+ #include " GFXHelpers.h"
3132#include " NativeHandleTraits.h"
3233#include " PythonHelpers.h"
3334#include " Core/Error.h"
@@ -47,9 +48,18 @@ namespace Falcor
4748// TODO: Replace with include?
4849void getGFXResourceState (ResourceBindFlags flags, gfx::ResourceState& defaultState, gfx::ResourceStateSet& allowedStates);
4950
50- static void prepareGFXBufferDesc (gfx::IBufferResource::Desc& bufDesc, size_t size, ResourceBindFlags bindFlags, MemoryType memoryType)
51+ static void prepareGFXBufferDesc (
52+ gfx::IBufferResource::Desc& bufDesc,
53+ size_t size,
54+ size_t elementSize,
55+ ResourceFormat format,
56+ ResourceBindFlags bindFlags,
57+ MemoryType memoryType
58+ )
5159{
5260 bufDesc.sizeInBytes = size;
61+ bufDesc.elementSize = elementSize;
62+ bufDesc.format = getGFXFormat (format);
5363 switch (memoryType)
5464 {
5565 case MemoryType::DeviceLocal:
@@ -74,6 +84,8 @@ Slang::ComPtr<gfx::IBufferResource> createBufferResource(
7484 ref<Device> pDevice,
7585 Buffer::State initState,
7686 size_t size,
87+ size_t elementSize,
88+ ResourceFormat format,
7789 ResourceBindFlags bindFlags,
7890 MemoryType memoryType
7991)
@@ -82,7 +94,7 @@ Slang::ComPtr<gfx::IBufferResource> createBufferResource(
8294
8395 // Create the buffer
8496 gfx::IBufferResource::Desc bufDesc = {};
85- prepareGFXBufferDesc (bufDesc, size, bindFlags, memoryType);
97+ prepareGFXBufferDesc (bufDesc, size, elementSize, format, bindFlags, memoryType);
8698
8799 Slang::ComPtr<gfx::IBufferResource> pApiHandle;
88100 FALCOR_GFX_CALL (pDevice->getGfxDevice ()->createBufferResource (bufDesc, nullptr , pApiHandle.writeRef ()));
@@ -91,24 +103,31 @@ Slang::ComPtr<gfx::IBufferResource> createBufferResource(
91103 return pApiHandle;
92104}
93105
94- Buffer::Buffer (ref<Device> pDevice, size_t size, ResourceBindFlags bindFlags, MemoryType memoryType, const void * pInitData)
106+ Buffer::Buffer (
107+ ref<Device> pDevice,
108+ size_t size,
109+ size_t structSize,
110+ ResourceFormat format,
111+ ResourceBindFlags bindFlags,
112+ MemoryType memoryType,
113+ const void * pInitData
114+ )
95115 : Resource(pDevice, Type::Buffer, bindFlags, size), mMemoryType (memoryType)
96116{
97117 FALCOR_CHECK (size > 0 , " Can't create GPU buffer of size zero" );
98118
99119 // Check that buffer size is within 4GB limit. Larger buffers are currently not well supported in D3D12.
100120 // TODO: Revisit this check in the future.
101- if (size > (1ull << 32 ))
102- {
103- logWarning (" Creating GPU buffer of size {} bytes. Buffers above 4GB are not currently well supported." , size);
104- }
121+ FALCOR_CHECK (size <= (1ull << 32 ), " Creating GPU buffer of size {} bytes. Buffers above 4GB are not currently well supported." , size);
105122
106123 if (mMemoryType != MemoryType::DeviceLocal && is_set (mBindFlags , ResourceBindFlags::Shared))
107124 {
108125 FALCOR_THROW (" Can't create shared resource with CPU access other than 'None'." );
109126 }
110127
111128 mSize = align_to (mpDevice->getBufferDataAlignment (bindFlags), mSize );
129+ mStructSize = structSize;
130+ mFormat = format;
112131
113132 if (mMemoryType == MemoryType::DeviceLocal)
114133 {
@@ -125,14 +144,18 @@ Buffer::Buffer(ref<Device> pDevice, size_t size, ResourceBindFlags bindFlags, Me
125144 mState .global = Resource::State::CopyDest;
126145 }
127146
128- mGfxBufferResource = createBufferResource (mpDevice, mState .global , mSize , mBindFlags , mMemoryType );
147+ mGfxBufferResource = createBufferResource (mpDevice, mState .global , mSize , mStructSize , mFormat , mBindFlags , mMemoryType );
129148
130149 if (pInitData)
131150 setBlob (pInitData, 0 , size);
132151
133152 mElementCount = uint32_t (size);
134153}
135154
155+ Buffer::Buffer (ref<Device> pDevice, size_t size, ResourceBindFlags bindFlags, MemoryType memoryType, const void * pInitData)
156+ : Buffer(pDevice, size, 0 , ResourceFormat::Unknown, bindFlags, memoryType, pInitData)
157+ {}
158+
136159Buffer::Buffer (
137160 ref<Device> pDevice,
138161 ResourceFormat format,
@@ -141,9 +164,8 @@ Buffer::Buffer(
141164 MemoryType memoryType,
142165 const void * pInitData
143166)
144- : Buffer(pDevice, (size_t )getFormatBytesPerBlock(format) * elementCount, bindFlags, memoryType, pInitData)
167+ : Buffer(pDevice, (size_t )getFormatBytesPerBlock(format) * elementCount, 0 , format, bindFlags, memoryType, pInitData)
145168{
146- mFormat = format;
147169 mElementCount = elementCount;
148170}
149171
@@ -156,20 +178,28 @@ Buffer::Buffer(
156178 const void * pInitData,
157179 bool createCounter
158180)
159- : Buffer(pDevice, (size_t )structSize * elementCount, bindFlags, memoryType, pInitData)
181+ : Buffer(pDevice, (size_t )structSize * elementCount, structSize, ResourceFormat::Unknown, bindFlags, memoryType, pInitData)
160182{
161183 mElementCount = elementCount;
162- mStructSize = structSize;
163184 static const uint32_t zero = 0 ;
164185 if (createCounter)
165186 {
166- mpUAVCounter = make_ref<Buffer>(mpDevice, sizeof (uint32_t ), ResourceBindFlags::UnorderedAccess, MemoryType::DeviceLocal, &zero);
187+ FALCOR_CHECK (mStructSize > 0 , " Can't create a counter buffer with struct size of 0." );
188+ mpUAVCounter = make_ref<Buffer>(
189+ mpDevice,
190+ sizeof (uint32_t ),
191+ sizeof (uint32_t ),
192+ ResourceFormat::Unknown,
193+ ResourceBindFlags::UnorderedAccess,
194+ MemoryType::DeviceLocal,
195+ &zero
196+ );
167197 }
168198}
169199
170200// TODO: Its wasteful to create a buffer just to replace it afterwards with the supplied one!
171201Buffer::Buffer (ref<Device> pDevice, gfx::IBufferResource* pResource, size_t size, ResourceBindFlags bindFlags, MemoryType memoryType)
172- : Buffer(pDevice, size, bindFlags, memoryType, nullptr )
202+ : Buffer(pDevice, size, 0 , ResourceFormat::Unknown, bindFlags, memoryType, nullptr )
173203{
174204 FALCOR_ASSERT (pResource);
175205 mGfxBufferResource = pResource;
@@ -184,7 +214,7 @@ inline Slang::ComPtr<gfx::IBufferResource> gfxResourceFromNativeHandle(
184214)
185215{
186216 gfx::IBufferResource::Desc bufDesc = {};
187- prepareGFXBufferDesc (bufDesc, size, bindFlags, memoryType);
217+ prepareGFXBufferDesc (bufDesc, size, 0 , ResourceFormat::Unknown, bindFlags, memoryType);
188218
189219 gfx::InteropHandle gfxNativeHandle = {};
190220#if FALCOR_HAS_D3D12
@@ -225,12 +255,12 @@ gfx::IResource* Buffer::getGfxResource() const
225255 return mGfxBufferResource ;
226256}
227257
228- ref<ShaderResourceView> Buffer::getSRV (uint32_t firstElement, uint32_t elementCount )
258+ ref<ShaderResourceView> Buffer::getSRV (uint64_t offset, uint64_t size )
229259{
230- ResourceViewInfo view = ResourceViewInfo (firstElement, elementCount );
260+ ResourceViewInfo view = ResourceViewInfo (offset, size );
231261
232262 if (mSrvs .find (view) == mSrvs .end ())
233- mSrvs [view] = ShaderResourceView::create (getDevice ().get (), this , firstElement, elementCount );
263+ mSrvs [view] = ShaderResourceView::create (getDevice ().get (), this , offset, size );
234264
235265 return mSrvs [view];
236266}
@@ -240,12 +270,12 @@ ref<ShaderResourceView> Buffer::getSRV()
240270 return getSRV (0 );
241271}
242272
243- ref<UnorderedAccessView> Buffer::getUAV (uint32_t firstElement, uint32_t elementCount )
273+ ref<UnorderedAccessView> Buffer::getUAV (uint64_t offset, uint64_t size )
244274{
245- ResourceViewInfo view = ResourceViewInfo (firstElement, elementCount );
275+ ResourceViewInfo view = ResourceViewInfo (offset, size );
246276
247277 if (mUavs .find (view) == mUavs .end ())
248- mUavs [view] = UnorderedAccessView::create (getDevice ().get (), this , firstElement, elementCount );
278+ mUavs [view] = UnorderedAccessView::create (getDevice ().get (), this , offset, size );
249279
250280 return mUavs [view];
251281}
@@ -323,16 +353,6 @@ void Buffer::unmap() const
323353 }
324354}
325355
326- uint32_t Buffer::getElementSize () const
327- {
328- if (mStructSize != 0 )
329- return mStructSize ;
330- if (mFormat == ResourceFormat::Unknown)
331- return 1 ;
332-
333- FALCOR_THROW (" Inferring element size from resource format is not implemented" );
334- }
335-
336356bool Buffer::adjustSizeOffsetParams (size_t & size, size_t & offset) const
337357{
338358 if (offset >= mSize )
@@ -455,7 +475,6 @@ FALCOR_SCRIPT_BINDING(Buffer)
455475 buffer.def_property_readonly (" is_typed" , &Buffer::isTyped);
456476 buffer.def_property_readonly (" is_structured" , &Buffer::isStructured);
457477 buffer.def_property_readonly (" format" , &Buffer::getFormat);
458- buffer.def_property_readonly (" element_size" , &Buffer::getElementSize);
459478 buffer.def_property_readonly (" element_count" , &Buffer::getElementCount);
460479 buffer.def_property_readonly (" struct_size" , &Buffer::getStructSize);
461480
0 commit comments