1
1
/* **************************************************************************
2
- # Copyright (c) 2015-23 , NVIDIA CORPORATION. All rights reserved.
2
+ # Copyright (c) 2015-24 , NVIDIA CORPORATION. All rights reserved.
3
3
#
4
4
# Redistribution and use in source and binary forms, with or without
5
5
# modification, are permitted provided that the following conditions
28
28
#include " Buffer.h"
29
29
#include " Device.h"
30
30
#include " GFXAPI.h"
31
+ #include " GFXHelpers.h"
31
32
#include " NativeHandleTraits.h"
32
33
#include " PythonHelpers.h"
33
34
#include " Core/Error.h"
@@ -47,9 +48,18 @@ namespace Falcor
47
48
// TODO: Replace with include?
48
49
void getGFXResourceState (ResourceBindFlags flags, gfx::ResourceState& defaultState, gfx::ResourceStateSet& allowedStates);
49
50
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
+ )
51
59
{
52
60
bufDesc.sizeInBytes = size;
61
+ bufDesc.elementSize = elementSize;
62
+ bufDesc.format = getGFXFormat (format);
53
63
switch (memoryType)
54
64
{
55
65
case MemoryType::DeviceLocal:
@@ -74,6 +84,8 @@ Slang::ComPtr<gfx::IBufferResource> createBufferResource(
74
84
ref<Device> pDevice,
75
85
Buffer::State initState,
76
86
size_t size,
87
+ size_t elementSize,
88
+ ResourceFormat format,
77
89
ResourceBindFlags bindFlags,
78
90
MemoryType memoryType
79
91
)
@@ -82,7 +94,7 @@ Slang::ComPtr<gfx::IBufferResource> createBufferResource(
82
94
83
95
// Create the buffer
84
96
gfx::IBufferResource::Desc bufDesc = {};
85
- prepareGFXBufferDesc (bufDesc, size, bindFlags, memoryType);
97
+ prepareGFXBufferDesc (bufDesc, size, elementSize, format, bindFlags, memoryType);
86
98
87
99
Slang::ComPtr<gfx::IBufferResource> pApiHandle;
88
100
FALCOR_GFX_CALL (pDevice->getGfxDevice ()->createBufferResource (bufDesc, nullptr , pApiHandle.writeRef ()));
@@ -91,24 +103,31 @@ Slang::ComPtr<gfx::IBufferResource> createBufferResource(
91
103
return pApiHandle;
92
104
}
93
105
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
+ )
95
115
: Resource(pDevice, Type::Buffer, bindFlags, size), mMemoryType (memoryType)
96
116
{
97
117
FALCOR_CHECK (size > 0 , " Can't create GPU buffer of size zero" );
98
118
99
119
// Check that buffer size is within 4GB limit. Larger buffers are currently not well supported in D3D12.
100
120
// 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);
105
122
106
123
if (mMemoryType != MemoryType::DeviceLocal && is_set (mBindFlags , ResourceBindFlags::Shared))
107
124
{
108
125
FALCOR_THROW (" Can't create shared resource with CPU access other than 'None'." );
109
126
}
110
127
111
128
mSize = align_to (mpDevice->getBufferDataAlignment (bindFlags), mSize );
129
+ mStructSize = structSize;
130
+ mFormat = format;
112
131
113
132
if (mMemoryType == MemoryType::DeviceLocal)
114
133
{
@@ -125,14 +144,18 @@ Buffer::Buffer(ref<Device> pDevice, size_t size, ResourceBindFlags bindFlags, Me
125
144
mState .global = Resource::State::CopyDest;
126
145
}
127
146
128
- mGfxBufferResource = createBufferResource (mpDevice, mState .global , mSize , mBindFlags , mMemoryType );
147
+ mGfxBufferResource = createBufferResource (mpDevice, mState .global , mSize , mStructSize , mFormat , mBindFlags , mMemoryType );
129
148
130
149
if (pInitData)
131
150
setBlob (pInitData, 0 , size);
132
151
133
152
mElementCount = uint32_t (size);
134
153
}
135
154
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
+
136
159
Buffer::Buffer (
137
160
ref<Device> pDevice,
138
161
ResourceFormat format,
@@ -141,9 +164,8 @@ Buffer::Buffer(
141
164
MemoryType memoryType,
142
165
const void * pInitData
143
166
)
144
- : Buffer(pDevice, (size_t )getFormatBytesPerBlock(format) * elementCount, bindFlags, memoryType, pInitData)
167
+ : Buffer(pDevice, (size_t )getFormatBytesPerBlock(format) * elementCount, 0 , format, bindFlags, memoryType, pInitData)
145
168
{
146
- mFormat = format;
147
169
mElementCount = elementCount;
148
170
}
149
171
@@ -156,20 +178,28 @@ Buffer::Buffer(
156
178
const void * pInitData,
157
179
bool createCounter
158
180
)
159
- : Buffer(pDevice, (size_t )structSize * elementCount, bindFlags, memoryType, pInitData)
181
+ : Buffer(pDevice, (size_t )structSize * elementCount, structSize, ResourceFormat::Unknown, bindFlags, memoryType, pInitData)
160
182
{
161
183
mElementCount = elementCount;
162
- mStructSize = structSize;
163
184
static const uint32_t zero = 0 ;
164
185
if (createCounter)
165
186
{
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
+ );
167
197
}
168
198
}
169
199
170
200
// TODO: Its wasteful to create a buffer just to replace it afterwards with the supplied one!
171
201
Buffer::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 )
173
203
{
174
204
FALCOR_ASSERT (pResource);
175
205
mGfxBufferResource = pResource;
@@ -184,7 +214,7 @@ inline Slang::ComPtr<gfx::IBufferResource> gfxResourceFromNativeHandle(
184
214
)
185
215
{
186
216
gfx::IBufferResource::Desc bufDesc = {};
187
- prepareGFXBufferDesc (bufDesc, size, bindFlags, memoryType);
217
+ prepareGFXBufferDesc (bufDesc, size, 0 , ResourceFormat::Unknown, bindFlags, memoryType);
188
218
189
219
gfx::InteropHandle gfxNativeHandle = {};
190
220
#if FALCOR_HAS_D3D12
@@ -225,12 +255,12 @@ gfx::IResource* Buffer::getGfxResource() const
225
255
return mGfxBufferResource ;
226
256
}
227
257
228
- ref<ShaderResourceView> Buffer::getSRV (uint32_t firstElement, uint32_t elementCount )
258
+ ref<ShaderResourceView> Buffer::getSRV (uint64_t offset, uint64_t size )
229
259
{
230
- ResourceViewInfo view = ResourceViewInfo (firstElement, elementCount );
260
+ ResourceViewInfo view = ResourceViewInfo (offset, size );
231
261
232
262
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 );
234
264
235
265
return mSrvs [view];
236
266
}
@@ -240,12 +270,12 @@ ref<ShaderResourceView> Buffer::getSRV()
240
270
return getSRV (0 );
241
271
}
242
272
243
- ref<UnorderedAccessView> Buffer::getUAV (uint32_t firstElement, uint32_t elementCount )
273
+ ref<UnorderedAccessView> Buffer::getUAV (uint64_t offset, uint64_t size )
244
274
{
245
- ResourceViewInfo view = ResourceViewInfo (firstElement, elementCount );
275
+ ResourceViewInfo view = ResourceViewInfo (offset, size );
246
276
247
277
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 );
249
279
250
280
return mUavs [view];
251
281
}
@@ -323,16 +353,6 @@ void Buffer::unmap() const
323
353
}
324
354
}
325
355
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
-
336
356
bool Buffer::adjustSizeOffsetParams (size_t & size, size_t & offset) const
337
357
{
338
358
if (offset >= mSize )
@@ -455,7 +475,6 @@ FALCOR_SCRIPT_BINDING(Buffer)
455
475
buffer.def_property_readonly (" is_typed" , &Buffer::isTyped);
456
476
buffer.def_property_readonly (" is_structured" , &Buffer::isStructured);
457
477
buffer.def_property_readonly (" format" , &Buffer::getFormat);
458
- buffer.def_property_readonly (" element_size" , &Buffer::getElementSize);
459
478
buffer.def_property_readonly (" element_count" , &Buffer::getElementCount);
460
479
buffer.def_property_readonly (" struct_size" , &Buffer::getStructSize);
461
480
0 commit comments