yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f02b08490
master
1// byte-address-buffer-aligned.slang 2//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -d3d12 -profile cs_6_0 -shaderobj -output-using-type 3//DISABLED_TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -vk -shaderobj -output-using-type 4//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=CHECK):-slang -compute -cuda -shaderobj -output-using-type 5 6//TEST:SIMPLE(filecheck=CHECK1):-target glsl -entry computeMain -stage compute 7//TEST:SIMPLE(filecheck=CHECK2):-target hlsl -entry computeMain -stage compute 8//TEST:SIMPLE(filecheck=CHECK3):-target spirv -entry computeMain -stage compute 9//TEST:SIMPLE(filecheck=CHECK3):-target spirv -emit-spirv-directly -entry computeMain -stage compute 10//TEST:SIMPLE(filecheck=CHECK_CUDA):-target cuda -entry computeMain -stage compute 11 12// Confirm compilation of `(RW)ByteAddressBuffer` with aligned load / stores to wider data types. 13 14//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=buffer0 15[vk::binding(2, 3)] RWByteAddressBuffer buffer0; 16 17[shader("compute")] 18[numthreads(1,1,1)] 19void computeMain(uint3 threadId : SV_DispatchThreadID) 20{ 21 // CHECK-NOT: warning 22 23 // CHECK1: vec4 {{.*}} = buffer0_{{.*}}.{{.*}} = buffer0_{{.*}}.{{.*}}; 24 // CHECK1: vec4 {{.*}} = buffer0_{{.*}}.{{.*}} = vec4(buffer0_{{.*}}.{{.*}}, buffer0_{{.*}}.{{.*}}, buffer0_{{.*}}.{{.*}}, buffer0_{{.*}}.{{.*}}); 25 // CHECK1: vec4 {{.*}} = buffer0_{{.*}}.{{.*}}; 26 // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = _S3[{{.*}}]; 27 // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = _S3[{{.*}}]; 28 // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = _S3[{{.*}}]; 29 // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = _S3[{{.*}}]; 30 // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}}; 31 // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}}; 32 // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}}; 33 // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = buffer0_{{.*}}.{{.*}}; 34 // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = {{.*}}; 35 // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = {{.*}}; 36 // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = {{.*}}; 37 38 // CHECK2: float4 {{.*}} = (buffer0_0).Load<float4 >(32U); 39 // CHECK2: buffer0_0.Store(32U,{{.*}}); 40 // CHECK2: float {{.*}} = (buffer0_0).Load<float >(8U); 41 // CHECK2: float {{.*}} = (buffer0_0).Load<float >(12U); 42 // CHECK2: float {{.*}} = (buffer0_0).Load<float >(16U); 43 // CHECK2: float {{.*}} = (buffer0_0).Load<float >(20U); 44 // CHECK2: buffer0_0.Store(32U,float4({{.*}}, {{.*}}, {{.*}}, {{.*}})); 45 // CHECK2: float4 {{.*}} = (buffer0_0).Load<float4 >(32U); 46 // CHECK2: buffer0_0.Store(8U,{{.*}}[int(0)]); 47 // CHECK2: buffer0_0.Store(12U,{{.*}}[int(1)]); 48 // CHECK2: buffer0_0.Store(16U,{{.*}}[int(2)]); 49 // CHECK2: buffer0_0.Store(20U,{{.*}}[int(3)]); 50 // CHECK2: float {{.*}} = (buffer0_0).Load<float >(8U); 51 // CHECK2: float {{.*}} = (buffer0_0).Load<float >(12U); 52 // CHECK2: float {{.*}} = (buffer0_0).Load<float >(16U); 53 // CHECK2: float {{.*}} = (buffer0_0).Load<float >(20U); 54 // CHECK2: buffer0_0.Store(8U,{{.*}}); 55 // CHECK2: buffer0_0.Store(12U,{{.*}}); 56 // CHECK2: buffer0_0.Store(16U,{{.*}}); 57 // CHECK2: buffer0_0.Store(20U,{{.*}}); 58 59 // CHECK3-DAG: %[[v4f:[a-zA-Z0-9_]+]] = OpTypeVector %float 4 60 // CHECK3-DAG: %[[SBv4f:[a-zA-Z0-9_]+]] = OpTypePointer StorageBuffer %[[v4f]] 61 // CHECK3-DAG: %[[RTv4f:[a-zA-Z0-9_]+]] = OpTypeRuntimeArray %[[v4f]] 62 // CHECK3-DAG: %[[RWBv4f:[a-zA-Z0-9_]+]] = OpTypeStruct %[[RTv4f]] 63 // CHECK3-DAG: %[[SBRW:[a-zA-Z0-9_]+]] = OpTypePointer StorageBuffer %[[RWBv4f]] 64 // CHECK3-DAG: %[[RTf:[a-zA-Z0-9_]+]] = OpTypeRuntimeArray %float 65 // CHECK3-DAG: %[[RWBf:[a-zA-Z0-9_]+]] = OpTypeStruct %[[RTf]] 66 // CHECK3-DAG: %[[SBRW0:[a-zA-Z0-9_]+]] = OpTypePointer StorageBuffer %[[RWBf]] 67 // CHECK3-DAG: %[[SBf:[a-zA-Z0-9_]+]] = OpTypePointer StorageBuffer %float 68 // CHECK3-DAG: %[[BUF0:[a-zA-Z0-9_]+]] = OpVariable %[[SBRW]] StorageBuffer 69 // CHECK3-DAG: %[[BUF00:[a-zA-Z0-9_]+]] = OpVariable %[[SBRW0]] StorageBuffer 70 // CHECK3-DAG: %[[V0:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBv4f]] %[[BUF0]] %{{.*}} 71 // CHECK3-DAG: %[[V1:[a-zA-Z0-9_]+]] = OpLoad %[[v4f]] %[[V0]] 72 // CHECK3-DAG: %[[V2:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBv4f]] %[[BUF0]] %{{.*}} 73 // CHECK3-DAG: OpStore %[[V2]] %[[V1]] 74 // CHECK3-DAG: %[[V3:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 75 // CHECK3-DAG: %[[V4:[a-zA-Z0-9_]+]] = OpLoad %float %[[V3]] 76 // CHECK3-DAG: %[[V5:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 77 // CHECK3-DAG: %[[V6:[a-zA-Z0-9_]+]] = OpLoad %float %[[V5]] 78 // CHECK3-DAG: %[[V7:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 79 // CHECK3-DAG: %[[V8:[a-zA-Z0-9_]+]] = OpLoad %float %[[V7]] 80 // CHECK3-DAG: %[[V9:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 81 // CHECK3-DAG: %[[V10:[a-zA-Z0-9_]+]] = OpLoad %float %[[V9]] 82 // CHECK3-DAG: %[[V11:[a-zA-Z0-9_]+]] = OpCompositeConstruct %[[v4f]] %[[V4]] %[[V6]] %[[V8]] %[[V10]] 83 // CHECK3-DAG: %[[V12:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBv4f]] %[[BUF0]] 84 // CHECK3-DAG: OpStore %[[V12]] %[[V11]] 85 // CHECK3-DAG: %[[V13:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBv4f]] %[[BUF0]] 86 // CHECK3-DAG: %[[V14:[a-zA-Z0-9_]+]] = OpLoad %[[v4f]] %[[V13]] 87 // CHECK3-DAG: %[[V15:[a-zA-Z0-9_]+]] = OpCompositeExtract %float %[[V14]] 0 88 // CHECK3-DAG: %[[V16:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 89 // CHECK3-DAG: OpStore %[[V16]] %[[V15]] 90 // CHECK3-DAG: %[[V17:[a-zA-Z0-9_]+]] = OpCompositeExtract %float %[[V14]] 1 91 // CHECK3-DAG: %[[V18:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 92 // CHECK3-DAG: OpStore %[[V18]] %[[V17]] 93 // CHECK3-DAG: %[[V19:[a-zA-Z0-9_]+]] = OpCompositeExtract %float %[[V14]] 2 94 // CHECK3-DAG: %[[V20:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 95 // CHECK3-DAG: OpStore %[[V20]] %[[V19]] 96 // CHECK3-DAG: %[[V21:[a-zA-Z0-9_]+]] = OpCompositeExtract %float %[[V14]] 3 97 // CHECK3-DAG: %[[V22:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 98 // CHECK3-DAG: OpStore %[[V22]] %[[V21]] 99 // CHECK3-DAG: %[[V23:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 100 // CHECK3-DAG: %[[V24:[a-zA-Z0-9_]+]] = OpLoad %float %[[V23]] 101 // CHECK3-DAG: %[[V25:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 102 // CHECK3-DAG: %[[V26:[a-zA-Z0-9_]+]] = OpLoad %float %[[V25]] 103 // CHECK3-DAG: %[[V27:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 104 // CHECK3-DAG: %[[V28:[a-zA-Z0-9_]+]] = OpLoad %float %[[V27]] 105 // CHECK3-DAG: %[[V29:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 106 // CHECK3-DAG: %[[V30:[a-zA-Z0-9_]+]] = OpLoad %float %[[V29]] 107 // CHECK3-DAG: %[[V31:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 108 // CHECK3-DAG: OpStore %[[V31]] %[[V24]] 109 // CHECK3-DAG: %[[V32:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 110 // CHECK3-DAG: OpStore %[[V32]] %[[V26]] 111 // CHECK3-DAG: %[[V33:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 112 // CHECK3-DAG: OpStore %[[V33]] %[[V28]] 113 // CHECK3-DAG: %[[V34:[a-zA-Z0-9_]+]] = OpAccessChain %[[SBf]] %[[BUF00]] 114 // CHECK3-DAG: OpStore %[[V34]] %[[V30]] 115 buffer0.StoreAligned(32, buffer0.LoadAligned<float4>(32)); 116 buffer0.StoreAligned(32, buffer0.LoadAligned<float4>(8)); 117 buffer0.StoreAligned(8, buffer0.LoadAligned<float4>(32)); 118 buffer0.StoreAligned(8, buffer0.LoadAligned<float4>(8)); 119} 120 121// CHECK_CUDA: ).Load<float4{{.*}}>(32U); 122// CHECK_CUDA: .Store(32U,{{.*}}); 123// CHECK_CUDA: ).Load<float{{.*}}>(8U); 124// CHECK_CUDA: ).Load<float{{.*}}>(12U); 125// CHECK_CUDA: ).Load<float{{.*}}>(16U); 126// CHECK_CUDA: ).Load<float{{.*}}>(20U); 127// CHECK_CUDA: .Store(32U,make_float4{{.*}}); 128// CHECK_CUDA: ).Load<float4{{.*}}>(32U); 129// CHECK_CUDA: .Store(8U,{{.*}}); 130// CHECK_CUDA: .Store(12U,{{.*}}); 131// CHECK_CUDA: .Store(16U,{{.*}}); 132// CHECK_CUDA: .Store(20U,{{.*}});