You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
2.0 KiB
60 lines
2.0 KiB
|
|
#define VFX_GPU_EVENT_ELEMENT_COUNT_OFFSET 0u
|
|
#define VFX_GPU_EVENT_TOTAL_COUNT_OFFSET 1u
|
|
#define VFX_GPU_EVENT_PREFIX_SUM_OFFSET 2u
|
|
#define VFX_GPU_EVENT_SOURCE_INDEX_OFFSET 3u
|
|
|
|
|
|
uint VFXGetEventListBufferIndex(uint offset, uint instanceIndex, uint instanceSize, uint index)
|
|
{
|
|
#if VFX_USE_INSTANCING
|
|
return instancingBatchSize * offset + instanceIndex * instanceSize + index;
|
|
#else
|
|
return offset + index;
|
|
#endif
|
|
}
|
|
|
|
uint VFXGetEventListBufferIndex(uint offset, uint instanceIndex)
|
|
{
|
|
return VFXGetEventListBufferIndex(offset, instanceIndex, 1u, 0u);
|
|
}
|
|
|
|
uint VFXGetEventListBufferElementCountIndex(uint instanceIndex)
|
|
{
|
|
return VFXGetEventListBufferIndex(VFX_GPU_EVENT_ELEMENT_COUNT_OFFSET, instanceIndex);
|
|
}
|
|
|
|
uint VFXGetEventListBufferTotalCountIndex(uint instanceIndex)
|
|
{
|
|
return VFXGetEventListBufferIndex(VFX_GPU_EVENT_TOTAL_COUNT_OFFSET, instanceIndex);
|
|
}
|
|
|
|
uint VFXGetEventListBufferPrefixSumIndex(uint instanceActiveIndex)
|
|
{
|
|
return VFXGetEventListBufferIndex(VFX_GPU_EVENT_PREFIX_SUM_OFFSET, instanceActiveIndex);
|
|
}
|
|
|
|
uint VFXGetEventListBufferSourceIndex(uint instanceIndex, uint instanceSize, uint index)
|
|
{
|
|
return VFXGetEventListBufferIndex(VFX_GPU_EVENT_SOURCE_INDEX_OFFSET, instanceIndex, instanceSize, index);
|
|
}
|
|
|
|
void AppendEventTotalCount(RWStructuredBuffer<uint> outputBuffer, uint totalCount, uint instanceIndex)
|
|
{
|
|
uint totalCountIndex = VFXGetEventListBufferTotalCountIndex(instanceIndex);
|
|
InterlockedAdd(outputBuffer[totalCountIndex], totalCount);
|
|
}
|
|
|
|
void AppendEventBuffer(RWStructuredBuffer<uint> outputBuffer, uint sourceIndex, uint outputCapacity, uint instanceIndex)
|
|
{
|
|
uint eventIndex;
|
|
uint elementCountIndex = VFXGetEventListBufferElementCountIndex(instanceIndex);
|
|
InterlockedAdd(outputBuffer[elementCountIndex], 1u, eventIndex);
|
|
|
|
[branch]
|
|
if (eventIndex < outputCapacity)
|
|
{
|
|
eventIndex = VFXGetEventListBufferSourceIndex(instanceIndex, outputCapacity, eventIndex);
|
|
outputBuffer[eventIndex] = sourceIndex;
|
|
}
|
|
}
|