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.
49 lines
2.1 KiB
49 lines
2.1 KiB
#pragma exclude_renderers gles
|
|
|
|
#pragma kernel MainCopyInstances
|
|
|
|
//#pragma enable_d3d11_debug_symbols
|
|
|
|
int _InputValidComponentCounts;
|
|
int _InstanceOffset;
|
|
int _InstanceCounts;
|
|
int _OutputInstanceOffset;
|
|
ByteAddressBuffer _ValidComponentIndices;
|
|
ByteAddressBuffer _ComponentByteCounts;
|
|
ByteAddressBuffer _InputComponentAddresses;
|
|
ByteAddressBuffer _InputComponentInstanceIndexRanges;
|
|
ByteAddressBuffer _OutputComponentAddresses;
|
|
ByteAddressBuffer _OutputComponentInstanceIndexRanges;
|
|
ByteAddressBuffer _InputBuffer;
|
|
RWByteAddressBuffer _OutputBuffer;
|
|
|
|
[numthreads(64,1,1)]
|
|
void MainCopyInstances(uint3 dispatchThreadID : SV_DispatchThreadID)
|
|
{
|
|
if (dispatchThreadID.x >= (uint) _InstanceCounts)
|
|
return;
|
|
|
|
uint instanceIndex = _InstanceOffset + dispatchThreadID.x;
|
|
uint instanceOutputIndex = _OutputInstanceOffset + dispatchThreadID.x;
|
|
|
|
[loop]
|
|
for (int validComponentIndex = 0; validComponentIndex < _InputValidComponentCounts; ++validComponentIndex)
|
|
{
|
|
uint componentIndex = _ValidComponentIndices.Load(validComponentIndex << 2);
|
|
uint instanceInputIndexBegin = _InputComponentInstanceIndexRanges.Load(componentIndex * 8);
|
|
uint instanceInputIndexEnd = _InputComponentInstanceIndexRanges.Load(componentIndex * 8 + 4);
|
|
if (instanceIndex < instanceInputIndexBegin || instanceIndex >= instanceInputIndexEnd)
|
|
continue;
|
|
uint inputComponentAddress = _InputComponentAddresses.Load(componentIndex << 2);
|
|
uint outputComponentAddress = _OutputComponentAddresses.Load(componentIndex << 2);
|
|
uint componentByteSize = _ComponentByteCounts.Load(componentIndex << 2);
|
|
for (uint uintIndex = 0; uintIndex < componentByteSize / 4u; ++uintIndex)
|
|
{
|
|
uint byteOffsetInput = instanceIndex * componentByteSize + uintIndex * 4;
|
|
uint byteOffsetOutput = instanceOutputIndex * componentByteSize + uintIndex * 4;
|
|
uint inputAddress = inputComponentAddress + byteOffsetInput;
|
|
uint outputAddress = outputComponentAddress + byteOffsetOutput;
|
|
_OutputBuffer.Store(outputAddress, _InputBuffer.Load(inputAddress));
|
|
}
|
|
}
|
|
}
|