yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Yong HeAllow LHS of `where` to be any type. (#6333)74852ceb6

master
3.7 KiB91 linesraw
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////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////