yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
ae1a5e408
master
1//TEST:SIMPLE(filecheck=CHECK_GLSL): -allow-glsl -stage compute -entry computeMain -target glsl 2//TEST:SIMPLE(filecheck=CHECK_SPV): -allow-glsl -stage compute -entry computeMain -target spirv -emit-spirv-directly 3//TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=BUF):-vk -compute -entry computeMain -allow-glsl 4//TEST(compute, vulkan):COMPARE_COMPUTE(filecheck-buffer=BUF):-vk -compute -entry computeMain -allow-glsl -emit-spirv-directly 5#version 460 6 7// CHECK_GLSL: void main( 8// CHECK_SPV: OpEntryPoint 9 10//TEST_INPUT:ubuffer(data=[2 2 2 2], stride=4):out,name=raceCondition 11buffer MyBlockName1 12{ 13 uint data[]; 14} raceCondition; 15 16groupshared uint raceConditionShared; 17 18//TEST_INPUT: set raceConditionImage = RWTexture1D(format=R32Sint, size=4, content=one, mipMaps = 1) 19uniform layout(binding=0,r32i) iimage1D raceConditionImage; 20 21//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer 22buffer MyBlockName2 23{ 24 uint data[]; 25} outputBuffer; 26 27layout(local_size_x = 32) in; 28 29bool testMemoryBarrier() 30{ 31 for (int i = 0; i < 4; i++) 32 { 33 raceCondition.data[0] = gl_GlobalInvocationID.x; 34 memoryBarrier(); 35 raceCondition.data[0] = 1; 36 memoryBarrier(); 37 if (raceCondition.data[0] != 1) 38 return false; 39 } 40 return true 41 && raceCondition.data[0] == 1 42 ; 43} 44bool testMemoryBarrierAtomicCounter() 45{ 46 for (int i = 0; i < 4; i++) 47 { 48 atomicExchange(raceCondition.data[1], 2); 49 memoryBarrierAtomicCounter(); 50 atomicExchange(raceCondition.data[1], 1); 51 memoryBarrierAtomicCounter(); 52 if (raceCondition.data[1] != 1) 53 return false; 54 } 55 return true 56 && raceCondition.data[1] == 1 57 ; 58} 59bool testMemoryBarrierBuffer() 60{ 61 for (int i = 0; i < 4; i++) 62 { 63 raceCondition.data[2] = gl_GlobalInvocationID.x; 64 memoryBarrierBuffer(); 65 raceCondition.data[2] = 1; 66 memoryBarrierBuffer(); 67 if (raceCondition.data[2] != 1) 68 return false; 69 } 70 return true 71 && raceCondition.data[2] == 1 72 ; 73} 74bool testMemoryBarrierShared() 75{ 76 for (int i = 0; i < 4; i++) 77 { 78 raceConditionShared = 2; 79 memoryBarrierShared(); 80 raceConditionShared = 1; 81 memoryBarrierShared(); 82 if (raceConditionShared != 1) 83 return false; 84 } 85 return true 86 && raceConditionShared == 1 87 ; 88} 89bool testMemoryBarrierImage() 90{ 91 for (int i = 0; i < 4; i++) 92 { 93 imageStore(raceConditionImage, 0, 2); 94 memoryBarrierShared(); 95 imageStore(raceConditionImage, 0, 1); 96 memoryBarrierShared(); 97 if (imageLoad(raceConditionImage, 0).x != 1) 98 return false; 99 } 100 return true 101 && imageLoad(raceConditionImage, 0).x == 1 102 ; 103} 104bool testGroupMemoryBarrier() 105{ 106 for (int i = 0; i < 4; i++) 107 { 108 raceCondition.data[3] = gl_GlobalInvocationID.x; 109 groupMemoryBarrier(); 110 raceCondition.data[3] = 1; 111 groupMemoryBarrier(); 112 if (raceCondition.data[3] != 1) 113 return false; 114 } 115 return true 116 && raceCondition.data[3] == 1 117 ; 118} 119bool testMemoryBarriers() 120{ 121 return true 122 && testMemoryBarrier() 123 && testMemoryBarrierAtomicCounter() 124 && testMemoryBarrierBuffer() 125 && testMemoryBarrierShared() 126 && testMemoryBarrierImage() 127 && testGroupMemoryBarrier() 128 ; 129} 130 131void computeMain() 132{ 133 outputBuffer.data[0] = true 134 && testMemoryBarriers() 135 ; 136 // BUF: 1 137}