30#include "NvFlowUploadBuffer.h"
37 NvFlowUint64 elementCount;
45 NvFlowUint64 elementCount;
47 NvFlowUint64 firstElement;
56 NvFlowUint64 totalSizeInBytes = 0llu;
59NV_FLOW_INLINE
void NvFlowArrayBuffer_init_custom(
63 NvFlowBufferUsageFlags flags,
65 NvFlowUint structureStride,
66 NvFlowBuffer*(NV_FLOW_ABI* createBuffer)(NvFlowContext*
context, NvFlowMemoryType memoryType,
const NvFlowBufferDesc* desc,
void* userdata),
71 NvFlowUploadBuffer_init_custom(contextInterface,
context, &ptr->uploadBuffer, flags, format, structureStride, createBuffer, addPassCopyBuffer, userdata);
74NV_FLOW_INLINE NvFlowBuffer* NvFlowArrayBuffer_createBuffer(NvFlowContext*
context, NvFlowMemoryType memoryType,
const NvFlowBufferDesc* desc,
void* userdata)
77 return ptr->uploadBuffer.contextInterface->createBuffer(
context, memoryType, desc);
83 ptr->uploadBuffer.contextInterface->addPassCopyBuffer(
context, params);
88 NvFlowArrayBuffer_init_custom(contextInterface,
context, ptr, flags, format, structureStride, NvFlowArrayBuffer_createBuffer, NvFlowArrayBuffer_addPassCopyBuffer, ptr);
93 NvFlowUploadBuffer_destroy(
context, &ptr->uploadBuffer);
95 ptr->copyRanges.size = 0u;
98NV_FLOW_INLINE NvFlowBufferTransient* NvFlowArrayBuffer_update(
102 NvFlowUint64* outFirstElements,
103 NvFlowUint64 arrayCount,
104 NvFlowUint64* outTotalSizeInBytes,
105 const char* debugName
109 bool shouldResetState =
false;
110 if (ptr->state.size != arrayCount)
112 shouldResetState =
true;
115 if (!shouldResetState)
117 for (NvFlowUint64 arrayIdx = 0u; arrayIdx < arrayCount; arrayIdx++)
119 if (ptr->state[arrayIdx].elementCount != arrayDatas[arrayIdx].elementCount)
121 shouldResetState =
true;
125 if (shouldResetState)
127 ptr->state.reserve(arrayCount);
128 ptr->state.size = arrayCount;
129 for (NvFlowUint64 arrayIdx = 0u; arrayIdx < arrayCount; arrayIdx++)
131 ptr->state[arrayIdx].isDirty = NV_FLOW_TRUE;
132 ptr->state[arrayIdx].elementCount = 0llu;
133 ptr->state[arrayIdx].version = 0llu;
134 ptr->state[arrayIdx].firstElement = 0llu;
139 for (NvFlowUint64 arrayIdx = 0u; arrayIdx < arrayCount; arrayIdx++)
141 if (arrayDatas[arrayIdx].elementCount != 0u || ptr->state[arrayIdx].elementCount != 0u)
143 if (arrayDatas[arrayIdx].version == 0llu || arrayDatas[arrayIdx].version != ptr->state[arrayIdx].version)
145 ptr->state[arrayIdx].isDirty = NV_FLOW_TRUE;
150 NvFlowBool32 anyDirty = NV_FLOW_FALSE;
151 for (NvFlowUint64 arrayIdx = 0u; arrayIdx < arrayCount; arrayIdx++)
153 if (ptr->state[arrayIdx].isDirty)
155 anyDirty = NV_FLOW_TRUE;
160 NvFlowUint64 totalSizeInBytes = 0llu;
161 for (NvFlowUint arrayIdx = 0u; arrayIdx < arrayCount; arrayIdx++)
163 totalSizeInBytes += ptr->uploadBuffer.structureStride * arrayDatas[arrayIdx].elementCount;
165 NvFlowUint8* mapped =
nullptr;
168 mapped = (NvFlowUint8*)NvFlowUploadBuffer_map(
context, &ptr->uploadBuffer, totalSizeInBytes);
172 NvFlowUint64 globalFirstElement = 0llu;
173 for (NvFlowUint arrayIdx = 0u; arrayIdx < arrayCount; arrayIdx++)
175 ptr->state[arrayIdx].elementCount = arrayDatas[arrayIdx].elementCount;
176 ptr->state[arrayIdx].version = arrayDatas[arrayIdx].version;
177 ptr->state[arrayIdx].firstElement = globalFirstElement;
179 globalFirstElement += ptr->state[arrayIdx].elementCount;
182 ptr->copyRanges.size = 0u;
183 for (NvFlowUint arrayIdx = 0u; arrayIdx < arrayCount; arrayIdx++)
185 if (ptr->state[arrayIdx].isDirty)
187 NvFlowUint64 offsetInBytes = ptr->uploadBuffer.structureStride * ptr->state[arrayIdx].firstElement;
188 NvFlowUint64 sizeInBytes = ptr->uploadBuffer.structureStride * ptr->state[arrayIdx].elementCount;
191 memcpy(mapped + offsetInBytes, arrayDatas[arrayIdx].data, sizeInBytes);
195 ptr->copyRanges.pushBack(copyRange);
199 NvFlowBufferTransient* bufferTransient =
nullptr;
202 bufferTransient = NvFlowUploadBuffer_unmapDeviceN(
context, &ptr->uploadBuffer, ptr->copyRanges.data, ptr->copyRanges.size, debugName);
206 bufferTransient = NvFlowUploadBuffer_getDevice(
context, &ptr->uploadBuffer, totalSizeInBytes);
209 for (NvFlowUint arrayIdx = 0u; arrayIdx < arrayCount; arrayIdx++)
211 ptr->state[arrayIdx].isDirty = NV_FLOW_FALSE;
214 if (outFirstElements)
216 for (NvFlowUint arrayIdx = 0u; arrayIdx < arrayCount; arrayIdx++)
218 outFirstElements[arrayIdx] = ptr->state[arrayIdx].firstElement;
222 ptr->totalSizeInBytes = totalSizeInBytes;
223 if (outTotalSizeInBytes)
225 *outTotalSizeInBytes = totalSizeInBytes;
228 return bufferTransient;
Definition NvFlowArrayBuffer.h:35
Definition NvFlowArrayBuffer.h:42
Definition NvFlowArrayBuffer.h:51
Definition NvFlowArray.h:36
Definition NvFlowContext.h:96
Definition NvFlowContext.h:362
Definition NvFlowContext.h:300
Definition NvFlowUploadBuffer.h:235
Definition NvFlowUploadBuffer.h:112