From c8e36bd128a29654b2ec145038da9e132330581b Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Thu, 14 Mar 2019 16:21:03 -0400 Subject: Hotfix/bool fix (#907) * * Handle ! for bool vector in glsl * Handle operators that have a boolean return value * || or && take bool * * Add comment in bool-op.slang test about doing || or && on vector types not supported for GLSL targets --- tests/bugs/bool-op.slang | 77 +++++++++++++++++++++++++++++++++++ tests/bugs/bool-op.slang.expected.txt | 16 ++++++++ 2 files changed, 93 insertions(+) create mode 100644 tests/bugs/bool-op.slang create mode 100644 tests/bugs/bool-op.slang.expected.txt (limited to 'tests') diff --git a/tests/bugs/bool-op.slang b/tests/bugs/bool-op.slang new file mode 100644 index 000000000..1388ef8f1 --- /dev/null +++ b/tests/bugs/bool-op.slang @@ -0,0 +1,77 @@ +// enum.slang +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute + +// Confirm operations that produce bools - such as comparisons, or && ||, ! work correctly + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):dxbinding(0),glbinding(0),out +RWStructuredBuffer outputBuffer; + +[numthreads(16, 1, 1)] +void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + uint tid = dispatchThreadID.x;; + + uint uv = tid; + int iv = int(tid); + + bool2 bv2 = { tid & 1, tid > 10 }; + + float2 f2 = { float(tid), float(tid + 1) }; + + bool bv = tid > 6; + let not_bv2 = !bv2; + + int r = 0; + if (bv) + { + r |= 0x0001; + } + if (!bv) + { + r |= 0x0002; + } + + if (iv) + { + r|= 0x0004; + } + if (!iv) + { + r|= 0x0008; + } + + if (uv) + { + r |= 0x0010; + } + if (!uv) + { + r |= 0x0020; + } + + if (all(bv2)) + { + r |= 0x0040; + } + if (all(not_bv2)) + { + r |= 0x0080; + } + + if (any(!f2)) + { + r |= 0x0100; + } + + // TODO(JS): Support on GLSL targets + // This doesn't currently work on GLSL targets, and because there + // do not appear to be any vector bitwise operations. Could be achieved + // by deconstructing, and reconstructing the vec result + /* if (all(f2 || bv2)) + { + r |= 0x0200; + } */ + + outputBuffer[tid] = r; +} \ No newline at end of file diff --git a/tests/bugs/bool-op.slang.expected.txt b/tests/bugs/bool-op.slang.expected.txt new file mode 100644 index 000000000..08b720347 --- /dev/null +++ b/tests/bugs/bool-op.slang.expected.txt @@ -0,0 +1,16 @@ +1AA +16 +96 +16 +96 +16 +96 +15 +95 +15 +95 +55 +15 +55 +15 +55 -- cgit v1.2.3