yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
063cbeaae
master
1//TEST:COMPARE_COMPUTE(filecheck-buffer=BUF): -cuda -compute 2//TEST:SIMPLE(filecheck=CUDA): -stage compute -entry computeMain -target cuda -O3 3 4struct Data 5{ 6 int val; 7 8 9 __init(int val) 10 { 11 this.val = val; 12 } 13}; 14 15struct DataWrapped 16{ 17 Data field; 18 Data element[2]; 19 20 __init(int val) 21 { 22 field.val = val; 23 element[0].val = val; 24 element[1].val = val; 25 } 26} 27 28//TEST_INPUT:uniform(data=[1]):name=globalData 29uniform Data globalData; 30 31//TEST_INPUT: set input = ubuffer(data=[1 2 3 4], stride=4) 32RWStructuredBuffer<int> input; 33 34//TEST_INPUT: set output = out ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0], stride=4) 35RWStructuredBuffer<int> output; 36 37// CUDA: addCopyElision{{.*}}Data{{.*}}*{{.*}}data 38int addCopyElision(Data data, int val) 39{ 40 // ensure we do not introduce a temporary 41 // CUDA-NOT: Data{{.*}}; 42 return data.val + val; 43} 44 45// CUDA: nested{{.*}}Data{{.*}}*{{.*}}data 46int nested(Data data, int val) 47{ 48 49 return addCopyElision(data, val); 50} 51 52// CUDA: addCopyElision{{.*}}FixedArray{{.*}}*{{.*}}data 53int addCopyElision(int data[10], int val) 54{ 55// ensure we do not introduce a temporary 56// CUDA-NOT: {{.*}}FixedArray{{.*}}; 57 return data[1] + val; 58} 59 60// CUDA: nested{{.*}}Array{{.*}}*{{.*}}data 61int nested(int data[10], int val) 62{ 63 return addCopyElision(data, val); 64} 65 66void modify(inout int data[10]) 67{ 68 data[1] = input[0]; 69} 70// CUDA: notDirectlyUsingParam{{.*}}Array{{.*}}*{{.*}}data 71int notDirectlyUsingParam(int data[10], int val) 72{ 73// ensure we create a temporary for the array 74// CUDA: FixedArray{{.*}}; 75 modify(data); 76 return data[1] + val; 77} 78 79 80// CUDA:computeMain 81[shader("compute")] 82[numthreads(1, 1, 1)] 83void computeMain() 84{ 85 86 // struct 87 Data data = Data(input[0]); 88 int structVal = addCopyElision(data, input[1]); 89 90 // struct which is globalParam 91 int globalParamStructVal = addCopyElision(globalData, input[1]); 92 93 // passing nested struct 94 int nestedStructVal = nested(data, input[1]); 95 96 // field 97 DataWrapped dataWrapped = DataWrapped(input[0]); 98 int fieldVal = addCopyElision(dataWrapped.field, input[1]); 99 100 // element 101 int elementVal = addCopyElision(dataWrapped.element[0], input[1]); 102 103 // A non-variable 104 int nonVariableVal = addCopyElision(Data(input[0]), input[1]); 105 106 // array 107 int val[10]; 108 val[1] = input[0]; 109 int arrayVal = addCopyElision(val, input[1]); 110 111 // passing nested array 112 int nestedArrayVal = nested(val, input[1]); 113 114 // not directly using param 115 int notDirectlyUsingParamVal = notDirectlyUsingParam(val, input[1]); 116 117 output[0] = 118 structVal == 3 && 119 globalParamStructVal == 3 && 120 nestedStructVal == 3 && 121 fieldVal == 3 && 122 elementVal == 3 && 123 nonVariableVal == 3 && 124 arrayVal == 3 && 125 nestedArrayVal == 3 && 126 notDirectlyUsingParamVal == 3 127 ? 1 : 0; 128 129 // For debugging 130 //output[1] = structVal; 131 //output[2] = globalParamStructVal; 132 //output[3] = nestedStructVal; 133 //output[4] = fieldVal; 134 //output[5] = elementVal; 135 //output[6] = nonVariableVal; 136 //output[7] = arrayVal; 137 //output[8] = nestedArrayVal; 138 //output[9] = notDirectlyUsingParamVal; 139} 140 141//BUF: 1