yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
74852ceb6
master
1//TEST:SIMPLE(filecheck=CHECK): -target spirv 2// CHECK: OpEntryPoint 3 4//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 5[ForceInline] 6__generic<T : __BuiltinFloatingPointType> 7public T accumulateSample(uint64_t pSampleIdx, T pOldValue, T pNewValue) { 8 T lTmp = isfinite(pOldValue) ? pOldValue : T(0); 9 return lTmp + (pNewValue - lTmp) / T(pSampleIdx + 1); 10} 11[ForceInline] 12__generic<T : __BuiltinFloatingPointType, let N : int> 13public vector<T, N> accumulateSample(uint64_t pSampleIdx, vector<T, N> pOldValue, vector<T, N> pNewValue) { 14 vector<T, N> lTmp = select(isfinite(pOldValue), pOldValue, T(0)); 15 return lTmp + (pNewValue - lTmp) / vector<T, N>(pSampleIdx + 1); 16} 17//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 18 19//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 20public struct RenderBuffer2D<T : ITexelElement> { 21 public Texture2D<T> handle; 22 public uint16_t2 offset; 23 public uint16_t2 size; 24 25 public __init() { 26 handle = {}; 27 offset = {}; 28 size = {}; 29 } 30 31 [ForceInline] public bool isValid() { return size[0] > 0u && size[1] > 0u; } 32 [ForceInline] public uint64_t getPixelCount() { return (uint64_t)(size[0]) * (uint64_t)(size[1]); } 33} 34 35public struct RWRenderBuffer2D<T : ITexelElement> { 36 public RWTexture2D<T> handle; 37 public uint16_t2 offset; 38 public uint16_t2 size; 39 40 public __init() { 41 handle = {}; 42 offset = {}; 43 size = {}; 44 } 45 46 [ForceInline] public bool isValid() { return size[0] > 0u && size[1] > 0u; } 47 [ForceInline] public uint64_t getPixelCount() { return (uint64_t)(size[0]) * (uint64_t)(size[1]); } 48} 49 50__generic<T : __BuiltinFloatingPointType> 51public extension RWRenderBuffer2D<T> where T : ITexelElement { 52 [ForceInline] 53 public void accumulate(uint32_t2 pDestIdx, uint64_t pSampleIdx, T pSampleValue) { 54 uint32_t2 lIndex = offset + pDestIdx; 55 handle[lIndex] = accumulateSample(pSampleIdx, handle[lIndex], pSampleValue); 56 } 57} 58__generic<T : __BuiltinFloatingPointType, let N : int> 59public extension RWRenderBuffer2D<vector<T, N>> where vector<T,N>:ITexelElement { 60 [ForceInline] 61 public void accumulate(uint32_t2 pDestIdx, uint64_t pSampleIdx, vector<T, N> pSampleValue) { 62 uint32_t2 lIndex = offset + pDestIdx; 63 handle[lIndex] = accumulateSample(pSampleIdx, handle[lIndex], pSampleValue); 64 } 65} 66//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 67 68//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 69// Global Parameters 70public uniform uint32_t gSampleIdx; 71public uniform RenderBuffer2D<float4> gInput; 72public uniform RWRenderBuffer2D<float4> gOutput; 73//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 74 75//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 76[shader("compute")] 77[numthreads(16, 16, 1)] 78void refineImage(uint3 pDispatchThreadIdx: SV_DispatchThreadID) { 79 const uint2 lPixelCoordinates = { pDispatchThreadIdx.x, pDispatchThreadIdx.y }; 80 81 // Some sanity checks. 82 if (!gInput.isValid() || any(lPixelCoordinates >= gInput.size)) { 83 return; 84 } 85 if (!gOutput.isValid() || any(lPixelCoordinates >= gOutput.size)) { 86 return; 87 } 88 89 gOutput.accumulate(lPixelCoordinates, gSampleIdx, gInput.handle[lPixelCoordinates]); 90} 91////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////