diff options
| author | Yong He <yonghe@outlook.com> | 2025-02-12 14:58:00 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-12 14:58:00 -0800 |
| commit | 74852ceb6b3bcc018042aba3e30933b7b6fc09ef (patch) | |
| tree | b77dd62f0e74510fae0d2af8b7afa260ce9d49b8 /tests/bugs | |
| parent | 3f102afe1038882f336dc052a9954811150fa700 (diff) | |
Allow LHS of `where` to be any type. (#6333)
* Allow LHS of `where` to be any type.
* Register free-form extensions when loading precompiled module.
* Fix test.
* Fix.
* Fix `as<IRType>`.
* try fix precompiled module test.
Diffstat (limited to 'tests/bugs')
| -rw-r--r-- | tests/bugs/gh-6331.slang | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/tests/bugs/gh-6331.slang b/tests/bugs/gh-6331.slang new file mode 100644 index 000000000..c3f786cfc --- /dev/null +++ b/tests/bugs/gh-6331.slang @@ -0,0 +1,91 @@ +//TEST:SIMPLE(filecheck=CHECK): -target spirv +// CHECK: OpEntryPoint + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +[ForceInline] +__generic<T : __BuiltinFloatingPointType> +public T accumulateSample(uint64_t pSampleIdx, T pOldValue, T pNewValue) { + T lTmp = isfinite(pOldValue) ? pOldValue : T(0); + return lTmp + (pNewValue - lTmp) / T(pSampleIdx + 1); +} +[ForceInline] +__generic<T : __BuiltinFloatingPointType, let N : int> +public vector<T, N> accumulateSample(uint64_t pSampleIdx, vector<T, N> pOldValue, vector<T, N> pNewValue) { + vector<T, N> lTmp = select(isfinite(pOldValue), pOldValue, T(0)); + return lTmp + (pNewValue - lTmp) / vector<T, N>(pSampleIdx + 1); +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +public struct RenderBuffer2D<T : ITexelElement> { + public Texture2D<T> handle; + public uint16_t2 offset; + public uint16_t2 size; + + public __init() { + handle = {}; + offset = {}; + size = {}; + } + + [ForceInline] public bool isValid() { return size[0] > 0u && size[1] > 0u; } + [ForceInline] public uint64_t getPixelCount() { return (uint64_t)(size[0]) * (uint64_t)(size[1]); } +} + +public struct RWRenderBuffer2D<T : ITexelElement> { + public RWTexture2D<T> handle; + public uint16_t2 offset; + public uint16_t2 size; + + public __init() { + handle = {}; + offset = {}; + size = {}; + } + + [ForceInline] public bool isValid() { return size[0] > 0u && size[1] > 0u; } + [ForceInline] public uint64_t getPixelCount() { return (uint64_t)(size[0]) * (uint64_t)(size[1]); } +} + +__generic<T : __BuiltinFloatingPointType> +public extension RWRenderBuffer2D<T> where T : ITexelElement { + [ForceInline] + public void accumulate(uint32_t2 pDestIdx, uint64_t pSampleIdx, T pSampleValue) { + uint32_t2 lIndex = offset + pDestIdx; + handle[lIndex] = accumulateSample(pSampleIdx, handle[lIndex], pSampleValue); + } +} +__generic<T : __BuiltinFloatingPointType, let N : int> +public extension RWRenderBuffer2D<vector<T, N>> where vector<T,N>:ITexelElement { + [ForceInline] + public void accumulate(uint32_t2 pDestIdx, uint64_t pSampleIdx, vector<T, N> pSampleValue) { + uint32_t2 lIndex = offset + pDestIdx; + handle[lIndex] = accumulateSample(pSampleIdx, handle[lIndex], pSampleValue); + } +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Global Parameters +public uniform uint32_t gSampleIdx; +public uniform RenderBuffer2D<float4> gInput; +public uniform RWRenderBuffer2D<float4> gOutput; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +[shader("compute")] +[numthreads(16, 16, 1)] +void refineImage(uint3 pDispatchThreadIdx: SV_DispatchThreadID) { + const uint2 lPixelCoordinates = { pDispatchThreadIdx.x, pDispatchThreadIdx.y }; + + // Some sanity checks. + if (!gInput.isValid() || any(lPixelCoordinates >= gInput.size)) { + return; + } + if (!gOutput.isValid() || any(lPixelCoordinates >= gOutput.size)) { + return; + } + + gOutput.accumulate(lPixelCoordinates, gSampleIdx, gInput.handle[lPixelCoordinates]); +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
