29#include "NvFlowContext.h"
30#include "NvFlowArray.h"
32#define NV_FLOW_DISPATCH_BATCH_SIZE 32768u
37 NvFlowBufferTransient* globalTransient =
nullptr;
38 NvFlowUint blockIdxOffset = 0u;
39 NvFlowUint blockCount = 0u;
44NV_FLOW_INLINE
void NvFlowDispatchBatches_init_custom(
NvFlowDispatchBatches* ptr, NvFlowUint totalBlockCount, NvFlowUint batchSize)
47 for (NvFlowUint blockIdxOffset = 0u; blockIdxOffset < totalBlockCount; blockIdxOffset += batchSize)
50 batch.globalTransient =
nullptr;
51 batch.blockIdxOffset = blockIdxOffset;
52 batch.blockCount = totalBlockCount - blockIdxOffset;
53 if (batch.blockCount > batchSize)
55 batch.blockCount = batchSize;
63 NvFlowDispatchBatches_init_custom(ptr, totalBlockCount, NV_FLOW_DISPATCH_BATCH_SIZE);
68 NvFlowUint64 mappedIdx = ~0llu;
69 NvFlowUint64 frontIdx = ~0llu;
73NV_FLOW_INLINE NvFlowUint64 NvFlowBufferVersioning_map(
NvFlowBufferVersioning* ptr, NvFlowUint64 lastFenceCompleted)
75 NvFlowUint64 index = ptr->frontIdx + 1u;
76 for (; index < ptr->recycleFenceValues.size; index++)
78 if (ptr->recycleFenceValues[index] <= lastFenceCompleted)
83 if (index == ptr->recycleFenceValues.size)
85 for (index = 0; index < ptr->frontIdx; index++)
87 if (ptr->recycleFenceValues[index] <= lastFenceCompleted)
93 if (!(index < ptr->recycleFenceValues.size && ptr->recycleFenceValues[index] <= lastFenceCompleted))
95 index = ptr->recycleFenceValues.allocateBack();
97 ptr->recycleFenceValues[index] = ~0llu;
98 ptr->mappedIdx = index;
99 return ptr->mappedIdx;
104 if (ptr->frontIdx < ptr->recycleFenceValues.size)
106 ptr->recycleFenceValues[ptr->frontIdx] = nextFenceValue;
108 ptr->frontIdx = ptr->mappedIdx;
114 NvFlowBuffer*(NV_FLOW_ABI* createBuffer)(NvFlowContext*
context, NvFlowMemoryType memoryType,
const NvFlowBufferDesc* desc,
void* userdata) =
nullptr;
116 void* userdata =
nullptr;
117 NvFlowBufferUsageFlags flags = 0u;
118 NvFlowFormat format = eNvFlowFormat_unknown;
119 NvFlowUint structureStride = 0u;
125 NvFlowBuffer* deviceBuffer =
nullptr;
126 NvFlowUint64 deviceNumBytes = 0llu;
129NV_FLOW_INLINE
void NvFlowUploadBuffer_init_custom(
132 NvFlowBufferUsageFlags flags, NvFlowFormat format, NvFlowUint structureStride,
133 NvFlowBuffer*(NV_FLOW_ABI* createBuffer)(NvFlowContext*
context, NvFlowMemoryType memoryType,
const NvFlowBufferDesc* desc,
void* userdata),
138 ptr->contextInterface = contextInterface;
139 ptr->createBuffer = createBuffer;
140 ptr->addPassCopyBuffer = addPassCopyBuffer;
141 ptr->userdata = userdata;
144 ptr->format = format;
145 ptr->structureStride = structureStride;
148NV_FLOW_INLINE NvFlowBuffer* NvFlowUploadBuffer_createBuffer(NvFlowContext*
context, NvFlowMemoryType memoryType,
const NvFlowBufferDesc* desc,
void* userdata)
151 return ptr->contextInterface->createBuffer(
context, memoryType, desc);
157 ptr->contextInterface->addPassCopyBuffer(
context, params);
162 NvFlowUploadBuffer_init_custom(contextInterface,
context, ptr, flags, format, structureStride, NvFlowUploadBuffer_createBuffer, NvFlowUploadBuffer_addPassCopyBuffer, ptr);
167 for (NvFlowUint64 idx = 0u; idx < ptr->buffers.size; idx++)
169 if (ptr->buffers[idx])
171 ptr->contextInterface->destroyBuffer(
context, ptr->buffers[idx]);
172 ptr->buffers[idx] =
nullptr;
175 ptr->buffers.size = 0u;
176 ptr->bufferSizes.size = 0u;
178 if (ptr->deviceBuffer)
180 ptr->contextInterface->destroyBuffer(
context, ptr->deviceBuffer);
181 ptr->deviceBuffer =
nullptr;
185NV_FLOW_INLINE NvFlowUint64 NvFlowUploadBuffer_computeBufferSize(NvFlowUint64 requested)
187 NvFlowUint64 bufferSize = 65536u;
188 while (bufferSize < requested)
197 NvFlowUint64 instanceIdx = NvFlowBufferVersioning_map(&ptr->versioning, ptr->contextInterface->getLastFrameCompleted(
context));
198 while (instanceIdx >= ptr->buffers.size)
200 ptr->buffers.pushBack(
nullptr);
201 ptr->bufferSizes.pushBack(0llu);
204 if (ptr->buffers[instanceIdx] && ptr->bufferSizes[instanceIdx] < numBytes)
206 ptr->contextInterface->destroyBuffer(
context, ptr->buffers[instanceIdx]);
207 ptr->buffers[instanceIdx] =
nullptr;
210 if (!ptr->buffers[instanceIdx])
213 bufDesc.format = ptr->format;
214 bufDesc.usageFlags = ptr->flags;
215 bufDesc.structureStride = ptr->structureStride;
216 bufDesc.sizeInBytes = NvFlowUploadBuffer_computeBufferSize(numBytes);
218 ptr->bufferSizes[instanceIdx] = bufDesc.sizeInBytes;
219 ptr->buffers[instanceIdx] = ptr->contextInterface->createBuffer(
context, eNvFlowMemoryType_upload, &bufDesc);
222 return ptr->contextInterface->mapBuffer(
context, ptr->buffers[instanceIdx]);
227 ptr->contextInterface->unmapBuffer(
context, ptr->buffers[ptr->versioning.mappedIdx]);
229 NvFlowBufferVersioning_unmap(&ptr->versioning, ptr->contextInterface->getCurrentFrame(
context));
231 return ptr->contextInterface->registerBufferAsTransient(
context, ptr->buffers[ptr->versioning.frontIdx]);
237 NvFlowUint64 numBytes;
240NV_FLOW_INLINE NvFlowBufferTransient* NvFlowUploadBuffer_getDevice(NvFlowContext*
context,
NvFlowUploadBuffer* ptr, NvFlowUint64 numBytes)
242 NvFlowUint64 srcNumBytes = NvFlowUploadBuffer_computeBufferSize(numBytes);
244 if (ptr->deviceBuffer && ptr->deviceNumBytes < srcNumBytes)
246 ptr->contextInterface->destroyBuffer(
context, ptr->deviceBuffer);
247 ptr->deviceBuffer =
nullptr;
248 ptr->deviceNumBytes = 0llu;
250 if (!ptr->deviceBuffer)
253 bufDesc.format = ptr->format;
254 bufDesc.usageFlags = ptr->flags | eNvFlowBufferUsage_bufferCopyDst;
255 bufDesc.structureStride = ptr->structureStride;
256 bufDesc.sizeInBytes = srcNumBytes;
258 ptr->deviceBuffer = ptr->createBuffer(
context, eNvFlowMemoryType_device, &bufDesc, ptr->userdata);
259 ptr->deviceNumBytes = srcNumBytes;
262 return ptr->contextInterface->registerBufferAsTransient(
context, ptr->deviceBuffer);
267 NvFlowBufferTransient* src = NvFlowUploadBuffer_unmap(
context, ptr);
269 NvFlowUint64 srcNumBytes = ptr->bufferSizes[ptr->versioning.frontIdx];
271 NvFlowBufferTransient* dst = NvFlowUploadBuffer_getDevice(
context, ptr, srcNumBytes);
273 NvFlowUint activeCopyCount = 0u;
274 for (NvFlowUint64 copyRangeIdx = 0u; copyRangeIdx < copyRangeCount; copyRangeIdx++)
277 copyParams.srcOffset = copyRanges[copyRangeIdx].offset;
278 copyParams.dstOffset = copyRanges[copyRangeIdx].offset;
279 copyParams.numBytes = copyRanges[copyRangeIdx].numBytes;
280 copyParams.src = src;
281 copyParams.dst = dst;
283 copyParams.debugLabel = debugName ? debugName :
"UploadBufferUnmapDevice";
285 if (copyParams.numBytes > 0u)
287 ptr->addPassCopyBuffer(
context, ©Params, ptr->userdata);
292 if (activeCopyCount == 0u)
295 copyParams.srcOffset = 0llu;
296 copyParams.dstOffset = 0llu;
297 copyParams.numBytes = 0llu;
298 copyParams.src = src;
299 copyParams.dst = dst;
301 copyParams.debugLabel = debugName ? debugName :
"UploadBufferUnmapDevice";
303 ptr->addPassCopyBuffer(
context, ©Params, ptr->userdata);
309NV_FLOW_INLINE NvFlowBufferTransient* NvFlowUploadBuffer_unmapDevice(NvFlowContext*
context,
NvFlowUploadBuffer* ptr, NvFlowUint64 offset, NvFlowUint64 numBytes,
const char* debugName)
312 return NvFlowUploadBuffer_unmapDeviceN(
context, ptr, ©Range, 1u, debugName);
Definition NvFlowArray.h:36
Definition NvFlowContext.h:96
Definition NvFlowUploadBuffer.h:67
Definition NvFlowContext.h:362
Definition NvFlowUploadBuffer.h:36
Definition NvFlowContext.h:300
Definition NvFlowUploadBuffer.h:235
Definition NvFlowUploadBuffer.h:112