yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
57567778b
master
1//TEST:COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -output-using-type -compute 2 3// Test IEEE 754 NaN comparison behavior 4// According to IEEE 754 standard: 5// - Any comparison with NaN (except !=) should return false 6// - The != comparison with NaN should return true 7 8static const float fNAN = 0.0f / 0.0f; 9static const float fPOSITIVE_INFINITY = 1.0f / 0.0f; 10static const float fNEGATIVE_INFINITY = -1.0f / 0.0f; 11static const float fZERO = 0.0f; 12static const float fONE = 1.0f; 13static const float fNEG_ONE = -1.0f; 14 15//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer 16RWStructuredBuffer<uint> outputBuffer; 17 18[numthreads(1, 1, 1)] 19void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) 20{ 21 uint testIndex = 0; 22 23 // Test 1: NaN == NaN should be false 24 // CHECK: 0 25 outputBuffer[testIndex++] = (fNAN == fNAN) ? 1u : 0u; 26 27 // Test 2: NaN != NaN should be true 28 // CHECK: 1 29 outputBuffer[testIndex++] = (fNAN != fNAN) ? 1u : 0u; 30 31 // Test 3: NaN > NaN should be false 32 // CHECK: 0 33 outputBuffer[testIndex++] = (fNAN > fNAN) ? 1u : 0u; 34 35 // Test 4: NaN < NaN should be false 36 // CHECK: 0 37 outputBuffer[testIndex++] = (fNAN < fNAN) ? 1u : 0u; 38 39 // Test 5: NaN >= NaN should be false 40 // CHECK: 0 41 outputBuffer[testIndex++] = (fNAN >= fNAN) ? 1u : 0u; 42 43 // Test 6: NaN <= NaN should be false 44 // CHECK: 0 45 outputBuffer[testIndex++] = (fNAN <= fNAN) ? 1u : 0u; 46 47 // Test 7: NaN == 0.0 should be false 48 // CHECK: 0 49 outputBuffer[testIndex++] = (fNAN == fZERO) ? 1u : 0u; 50 51 // Test 8: NaN != 0.0 should be true 52 // CHECK: 1 53 outputBuffer[testIndex++] = (fNAN != fZERO) ? 1u : 0u; 54 55 // Test 9: NaN > 0.0 should be false 56 // CHECK: 0 57 outputBuffer[testIndex++] = (fNAN > fZERO) ? 1u : 0u; 58 59 // Test 10: NaN < 0.0 should be false 60 // CHECK: 0 61 outputBuffer[testIndex++] = (fNAN < fZERO) ? 1u : 0u; 62 63 // Test 11: NaN >= 0.0 should be false 64 // CHECK: 0 65 outputBuffer[testIndex++] = (fNAN >= fZERO) ? 1u : 0u; 66 67 // Test 12: NaN <= 0.0 should be false 68 // CHECK: 0 69 outputBuffer[testIndex++] = (fNAN <= fZERO) ? 1u : 0u; 70 71 // Test 13: 0.0 == NaN should be false 72 // CHECK: 0 73 outputBuffer[testIndex++] = (fZERO == fNAN) ? 1u : 0u; 74 75 // Test 14: 0.0 != NaN should be true 76 // CHECK: 1 77 outputBuffer[testIndex++] = (fZERO != fNAN) ? 1u : 0u; 78 79 // Test 15: 0.0 > NaN should be false 80 // CHECK: 0 81 outputBuffer[testIndex++] = (fZERO > fNAN) ? 1u : 0u; 82 83 // Test 16: 0.0 < NaN should be false 84 // CHECK: 0 85 outputBuffer[testIndex++] = (fZERO < fNAN) ? 1u : 0u; 86 87 // Test 17: 0.0 >= NaN should be false 88 // CHECK: 0 89 outputBuffer[testIndex++] = (fZERO >= fNAN) ? 1u : 0u; 90 91 // Test 18: 0.0 <= NaN should be false 92 // CHECK: 0 93 outputBuffer[testIndex++] = (fZERO <= fNAN) ? 1u : 0u; 94 95 // Test 19: NaN == +infinity should be false 96 // CHECK: 0 97 outputBuffer[testIndex++] = (fNAN == fPOSITIVE_INFINITY) ? 1u : 0u; 98 99 // Test 20: NaN != +infinity should be true 100 // CHECK: 1 101 outputBuffer[testIndex++] = (fNAN != fPOSITIVE_INFINITY) ? 1u : 0u; 102 103 // Test 21: NaN > +infinity should be false 104 // CHECK: 0 105 outputBuffer[testIndex++] = (fNAN > fPOSITIVE_INFINITY) ? 1u : 0u; 106 107 // Test 22: NaN < +infinity should be false 108 // CHECK: 0 109 outputBuffer[testIndex++] = (fNAN < fPOSITIVE_INFINITY) ? 1u : 0u; 110 111 // Test 23: NaN >= +infinity should be false 112 // CHECK: 0 113 outputBuffer[testIndex++] = (fNAN >= fPOSITIVE_INFINITY) ? 1u : 0u; 114 115 // Test 24: NaN <= +infinity should be false 116 // CHECK: 0 117 outputBuffer[testIndex++] = (fNAN <= fPOSITIVE_INFINITY) ? 1u : 0u; 118 119 // Test 25: NaN == -infinity should be false 120 // CHECK: 0 121 outputBuffer[testIndex++] = (fNAN == fNEGATIVE_INFINITY) ? 1u : 0u; 122 123 // Test 26: NaN != -infinity should be true 124 // CHECK: 1 125 outputBuffer[testIndex++] = (fNAN != fNEGATIVE_INFINITY) ? 1u : 0u; 126 127 // Test 27: NaN > -infinity should be false 128 // CHECK: 0 129 outputBuffer[testIndex++] = (fNAN > fNEGATIVE_INFINITY) ? 1u : 0u; 130 131 // Test 28: NaN < -infinity should be false 132 // CHECK: 0 133 outputBuffer[testIndex++] = (fNAN < fNEGATIVE_INFINITY) ? 1u : 0u; 134 135 // Test 29: NaN >= -infinity should be false 136 // CHECK: 0 137 outputBuffer[testIndex++] = (fNAN >= fNEGATIVE_INFINITY) ? 1u : 0u; 138 139 // Test 30: NaN <= -infinity should be false 140 // CHECK: 0 141 outputBuffer[testIndex++] = (fNAN <= fNEGATIVE_INFINITY) ? 1u : 0u; 142 143 // Test 31: NaN == 1.0 should be false 144 // CHECK: 0 145 outputBuffer[testIndex++] = (fNAN == fONE) ? 1u : 0u; 146 147 // Test 32: NaN != 1.0 should be true 148 // CHECK: 1 149 outputBuffer[testIndex++] = (fNAN != fONE) ? 1u : 0u; 150}