A game about forced loneliness, made by TACStudios
at master 49 lines 2.2 kB view raw
1#pragma exclude_renderers gles 2 3#pragma kernel MainCopyInstances 4 5//#pragma enable_d3d11_debug_symbols 6 7int _InputValidComponentCounts; 8int _InstanceOffset; 9int _InstanceCounts; 10int _OutputInstanceOffset; 11ByteAddressBuffer _ValidComponentIndices; 12ByteAddressBuffer _ComponentByteCounts; 13ByteAddressBuffer _InputComponentAddresses; 14ByteAddressBuffer _InputComponentInstanceIndexRanges; 15ByteAddressBuffer _OutputComponentAddresses; 16ByteAddressBuffer _OutputComponentInstanceIndexRanges; 17ByteAddressBuffer _InputBuffer; 18RWByteAddressBuffer _OutputBuffer; 19 20[numthreads(64,1,1)] 21void MainCopyInstances(uint3 dispatchThreadID : SV_DispatchThreadID) 22{ 23 if (dispatchThreadID.x >= (uint) _InstanceCounts) 24 return; 25 26 uint instanceIndex = _InstanceOffset + dispatchThreadID.x; 27 uint instanceOutputIndex = _OutputInstanceOffset + dispatchThreadID.x; 28 29 [loop] 30 for (int validComponentIndex = 0; validComponentIndex < _InputValidComponentCounts; ++validComponentIndex) 31 { 32 uint componentIndex = _ValidComponentIndices.Load(validComponentIndex << 2); 33 uint instanceInputIndexBegin = _InputComponentInstanceIndexRanges.Load(componentIndex * 8); 34 uint instanceInputIndexEnd = _InputComponentInstanceIndexRanges.Load(componentIndex * 8 + 4); 35 if (instanceIndex < instanceInputIndexBegin || instanceIndex >= instanceInputIndexEnd) 36 continue; 37 uint inputComponentAddress = _InputComponentAddresses.Load(componentIndex << 2); 38 uint outputComponentAddress = _OutputComponentAddresses.Load(componentIndex << 2); 39 uint componentByteSize = _ComponentByteCounts.Load(componentIndex << 2); 40 for (uint uintIndex = 0; uintIndex < componentByteSize / 4u; ++uintIndex) 41 { 42 uint byteOffsetInput = instanceIndex * componentByteSize + uintIndex * 4; 43 uint byteOffsetOutput = instanceOutputIndex * componentByteSize + uintIndex * 4; 44 uint inputAddress = inputComponentAddress + byteOffsetInput; 45 uint outputAddress = outputComponentAddress + byteOffsetOutput; 46 _OutputBuffer.Store(outputAddress, _InputBuffer.Load(inputAddress)); 47 } 48 } 49}