2021-09-09 20:42:29 -04:00

47 lines
1.3 KiB
Plaintext

#pragma kernel CSVFXCopyBuffer
#pragma kernel CSVFXInitDeadListBuffer
#pragma kernel CSVFXZeroInitBuffer
#include "HLSLSupport.cginc"
CBUFFER_START(Uniform)
uint dstOffset;
uint srcOffset;
uint size;
uint dispatchWidth;
CBUFFER_END
ByteAddressBuffer srcBuffer;
RWByteAddressBuffer dstBuffer;
RWStructuredBuffer<uint> dstStructBuffer;
#define NB_THREADS_PER_GROUP 64
[numthreads(NB_THREADS_PER_GROUP,1,1)]
void CSVFXCopyBuffer(uint3 id : SV_DispatchThreadID)
{
if (id.x < size) /* One dword is copied by thread */
{
uint srcAddress = (id.x + srcOffset) << 2;
uint dstAddress = (id.x + dstOffset) << 2;
uint load = srcBuffer.Load(srcAddress);
dstBuffer.Store(dstAddress, load);
}
}
[numthreads(NB_THREADS_PER_GROUP, 1, 1)]
void CSVFXInitDeadListBuffer(uint3 groupId : SV_GroupID, uint3 threadId : SV_DispatchThreadID)
{
uint index = groupId.y * dispatchWidth * NB_THREADS_PER_GROUP + threadId.x;
if (index < size)
dstStructBuffer[index] = size - index - 1u;
}
[numthreads(NB_THREADS_PER_GROUP, 1, 1)]
void CSVFXZeroInitBuffer(uint3 groupId : SV_GroupID, uint3 threadId : SV_DispatchThreadID)
{
uint index = groupId.y * dispatchWidth * NB_THREADS_PER_GROUP + threadId.x;
if (index < size)
dstBuffer.Store(index << 2, 0u);
}