47 lines
1.3 KiB
Plaintext
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);
|
|
}
|