1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2021 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker
15*03ce13f7SAndroid Build Coastguard Worker #include "Device.hpp"
16*03ce13f7SAndroid Build Coastguard Worker #include "Driver.hpp"
17*03ce13f7SAndroid Build Coastguard Worker
18*03ce13f7SAndroid Build Coastguard Worker #include "gmock/gmock.h"
19*03ce13f7SAndroid Build Coastguard Worker #include "gtest/gtest.h"
20*03ce13f7SAndroid Build Coastguard Worker
21*03ce13f7SAndroid Build Coastguard Worker #include "spirv-tools/libspirv.hpp"
22*03ce13f7SAndroid Build Coastguard Worker
23*03ce13f7SAndroid Build Coastguard Worker #include <cstring>
24*03ce13f7SAndroid Build Coastguard Worker #include <sstream>
25*03ce13f7SAndroid Build Coastguard Worker
26*03ce13f7SAndroid Build Coastguard Worker namespace {
alignUp(size_t val,size_t alignment)27*03ce13f7SAndroid Build Coastguard Worker size_t alignUp(size_t val, size_t alignment)
28*03ce13f7SAndroid Build Coastguard Worker {
29*03ce13f7SAndroid Build Coastguard Worker return alignment * ((val + alignment - 1) / alignment);
30*03ce13f7SAndroid Build Coastguard Worker }
31*03ce13f7SAndroid Build Coastguard Worker } // anonymous namespace
32*03ce13f7SAndroid Build Coastguard Worker
33*03ce13f7SAndroid Build Coastguard Worker struct ComputeParams
34*03ce13f7SAndroid Build Coastguard Worker {
35*03ce13f7SAndroid Build Coastguard Worker size_t numElements;
36*03ce13f7SAndroid Build Coastguard Worker int localSizeX;
37*03ce13f7SAndroid Build Coastguard Worker int localSizeY;
38*03ce13f7SAndroid Build Coastguard Worker int localSizeZ;
39*03ce13f7SAndroid Build Coastguard Worker
operator <<(std::ostream & os,const ComputeParams & params)40*03ce13f7SAndroid Build Coastguard Worker friend std::ostream &operator<<(std::ostream &os, const ComputeParams ¶ms)
41*03ce13f7SAndroid Build Coastguard Worker {
42*03ce13f7SAndroid Build Coastguard Worker return os << "ComputeParams{"
43*03ce13f7SAndroid Build Coastguard Worker << "numElements: " << params.numElements << ", "
44*03ce13f7SAndroid Build Coastguard Worker << "localSizeX: " << params.localSizeX << ", "
45*03ce13f7SAndroid Build Coastguard Worker << "localSizeY: " << params.localSizeY << ", "
46*03ce13f7SAndroid Build Coastguard Worker << "localSizeZ: " << params.localSizeZ << "}";
47*03ce13f7SAndroid Build Coastguard Worker }
48*03ce13f7SAndroid Build Coastguard Worker };
49*03ce13f7SAndroid Build Coastguard Worker
50*03ce13f7SAndroid Build Coastguard Worker class ComputeTest : public testing::TestWithParam<ComputeParams>
51*03ce13f7SAndroid Build Coastguard Worker {
52*03ce13f7SAndroid Build Coastguard Worker protected:
53*03ce13f7SAndroid Build Coastguard Worker static Driver driver;
54*03ce13f7SAndroid Build Coastguard Worker
SetUpTestSuite()55*03ce13f7SAndroid Build Coastguard Worker static void SetUpTestSuite()
56*03ce13f7SAndroid Build Coastguard Worker {
57*03ce13f7SAndroid Build Coastguard Worker ASSERT_TRUE(driver.loadSwiftShader());
58*03ce13f7SAndroid Build Coastguard Worker }
59*03ce13f7SAndroid Build Coastguard Worker
TearDownTestSuite()60*03ce13f7SAndroid Build Coastguard Worker static void TearDownTestSuite()
61*03ce13f7SAndroid Build Coastguard Worker {
62*03ce13f7SAndroid Build Coastguard Worker driver.unload();
63*03ce13f7SAndroid Build Coastguard Worker }
64*03ce13f7SAndroid Build Coastguard Worker };
65*03ce13f7SAndroid Build Coastguard Worker
66*03ce13f7SAndroid Build Coastguard Worker Driver ComputeTest::driver;
67*03ce13f7SAndroid Build Coastguard Worker
compileSpirv(const char * assembly)68*03ce13f7SAndroid Build Coastguard Worker std::vector<uint32_t> compileSpirv(const char *assembly)
69*03ce13f7SAndroid Build Coastguard Worker {
70*03ce13f7SAndroid Build Coastguard Worker spvtools::SpirvTools core(SPV_ENV_VULKAN_1_0);
71*03ce13f7SAndroid Build Coastguard Worker
72*03ce13f7SAndroid Build Coastguard Worker core.SetMessageConsumer([](spv_message_level_t, const char *, const spv_position_t &p, const char *m) {
73*03ce13f7SAndroid Build Coastguard Worker FAIL() << p.line << ":" << p.column << ": " << m;
74*03ce13f7SAndroid Build Coastguard Worker });
75*03ce13f7SAndroid Build Coastguard Worker
76*03ce13f7SAndroid Build Coastguard Worker std::vector<uint32_t> spirv;
77*03ce13f7SAndroid Build Coastguard Worker EXPECT_TRUE(core.Assemble(assembly, &spirv));
78*03ce13f7SAndroid Build Coastguard Worker EXPECT_TRUE(core.Validate(spirv));
79*03ce13f7SAndroid Build Coastguard Worker
80*03ce13f7SAndroid Build Coastguard Worker // Warn if the disassembly does not match the source assembly.
81*03ce13f7SAndroid Build Coastguard Worker // We do this as debugging tests in the debugger is often made much harder
82*03ce13f7SAndroid Build Coastguard Worker // if the SSA names (%X) in the debugger do not match the source.
83*03ce13f7SAndroid Build Coastguard Worker std::string disassembled;
84*03ce13f7SAndroid Build Coastguard Worker core.Disassemble(spirv, &disassembled, SPV_BINARY_TO_TEXT_OPTION_NO_HEADER);
85*03ce13f7SAndroid Build Coastguard Worker if(disassembled != assembly)
86*03ce13f7SAndroid Build Coastguard Worker {
87*03ce13f7SAndroid Build Coastguard Worker printf("-- WARNING: Disassembly does not match assembly: ---\n\n");
88*03ce13f7SAndroid Build Coastguard Worker
89*03ce13f7SAndroid Build Coastguard Worker auto splitLines = [](const std::string &str) -> std::vector<std::string> {
90*03ce13f7SAndroid Build Coastguard Worker std::stringstream ss(str);
91*03ce13f7SAndroid Build Coastguard Worker std::vector<std::string> out;
92*03ce13f7SAndroid Build Coastguard Worker std::string line;
93*03ce13f7SAndroid Build Coastguard Worker while(std::getline(ss, line, '\n')) { out.push_back(line); }
94*03ce13f7SAndroid Build Coastguard Worker return out;
95*03ce13f7SAndroid Build Coastguard Worker };
96*03ce13f7SAndroid Build Coastguard Worker
97*03ce13f7SAndroid Build Coastguard Worker auto srcLines = splitLines(std::string(assembly));
98*03ce13f7SAndroid Build Coastguard Worker auto disLines = splitLines(disassembled);
99*03ce13f7SAndroid Build Coastguard Worker
100*03ce13f7SAndroid Build Coastguard Worker for(size_t line = 0; line < srcLines.size() && line < disLines.size(); line++)
101*03ce13f7SAndroid Build Coastguard Worker {
102*03ce13f7SAndroid Build Coastguard Worker auto srcLine = (line < srcLines.size()) ? srcLines[line] : "<missing>";
103*03ce13f7SAndroid Build Coastguard Worker auto disLine = (line < disLines.size()) ? disLines[line] : "<missing>";
104*03ce13f7SAndroid Build Coastguard Worker if(srcLine != disLine)
105*03ce13f7SAndroid Build Coastguard Worker {
106*03ce13f7SAndroid Build Coastguard Worker printf("%zu: '%s' != '%s'\n", line, srcLine.c_str(), disLine.c_str());
107*03ce13f7SAndroid Build Coastguard Worker }
108*03ce13f7SAndroid Build Coastguard Worker }
109*03ce13f7SAndroid Build Coastguard Worker printf("\n\n---\nExpected:\n\n%s", disassembled.c_str());
110*03ce13f7SAndroid Build Coastguard Worker }
111*03ce13f7SAndroid Build Coastguard Worker
112*03ce13f7SAndroid Build Coastguard Worker return spirv;
113*03ce13f7SAndroid Build Coastguard Worker }
114*03ce13f7SAndroid Build Coastguard Worker
115*03ce13f7SAndroid Build Coastguard Worker #define VK_ASSERT(x) ASSERT_EQ(x, VK_SUCCESS)
116*03ce13f7SAndroid Build Coastguard Worker
117*03ce13f7SAndroid Build Coastguard Worker // Base class for compute tests that read from an input buffer and write to an
118*03ce13f7SAndroid Build Coastguard Worker // output buffer of same length.
119*03ce13f7SAndroid Build Coastguard Worker class SwiftShaderVulkanBufferToBufferComputeTest : public ComputeTest
120*03ce13f7SAndroid Build Coastguard Worker {
121*03ce13f7SAndroid Build Coastguard Worker public:
122*03ce13f7SAndroid Build Coastguard Worker void test(const std::string &shader,
123*03ce13f7SAndroid Build Coastguard Worker std::function<uint32_t(uint32_t idx)> input,
124*03ce13f7SAndroid Build Coastguard Worker std::function<uint32_t(uint32_t idx)> expected);
125*03ce13f7SAndroid Build Coastguard Worker };
126*03ce13f7SAndroid Build Coastguard Worker
test(const std::string & shader,std::function<uint32_t (uint32_t idx)> input,std::function<uint32_t (uint32_t idx)> expected)127*03ce13f7SAndroid Build Coastguard Worker void SwiftShaderVulkanBufferToBufferComputeTest::test(
128*03ce13f7SAndroid Build Coastguard Worker const std::string &shader,
129*03ce13f7SAndroid Build Coastguard Worker std::function<uint32_t(uint32_t idx)> input,
130*03ce13f7SAndroid Build Coastguard Worker std::function<uint32_t(uint32_t idx)> expected)
131*03ce13f7SAndroid Build Coastguard Worker {
132*03ce13f7SAndroid Build Coastguard Worker auto code = compileSpirv(shader.c_str());
133*03ce13f7SAndroid Build Coastguard Worker
134*03ce13f7SAndroid Build Coastguard Worker const VkInstanceCreateInfo createInfo = {
135*03ce13f7SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType
136*03ce13f7SAndroid Build Coastguard Worker nullptr, // pNext
137*03ce13f7SAndroid Build Coastguard Worker 0, // flags
138*03ce13f7SAndroid Build Coastguard Worker nullptr, // pApplicationInfo
139*03ce13f7SAndroid Build Coastguard Worker 0, // enabledLayerCount
140*03ce13f7SAndroid Build Coastguard Worker nullptr, // ppEnabledLayerNames
141*03ce13f7SAndroid Build Coastguard Worker 0, // enabledExtensionCount
142*03ce13f7SAndroid Build Coastguard Worker nullptr, // ppEnabledExtensionNames
143*03ce13f7SAndroid Build Coastguard Worker };
144*03ce13f7SAndroid Build Coastguard Worker
145*03ce13f7SAndroid Build Coastguard Worker VkInstance instance = VK_NULL_HANDLE;
146*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(driver.vkCreateInstance(&createInfo, nullptr, &instance));
147*03ce13f7SAndroid Build Coastguard Worker
148*03ce13f7SAndroid Build Coastguard Worker ASSERT_TRUE(driver.resolve(instance));
149*03ce13f7SAndroid Build Coastguard Worker
150*03ce13f7SAndroid Build Coastguard Worker std::unique_ptr<Device> device;
151*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(Device::CreateComputeDevice(&driver, instance, device));
152*03ce13f7SAndroid Build Coastguard Worker ASSERT_TRUE(device->IsValid());
153*03ce13f7SAndroid Build Coastguard Worker
154*03ce13f7SAndroid Build Coastguard Worker // struct Buffers
155*03ce13f7SAndroid Build Coastguard Worker // {
156*03ce13f7SAndroid Build Coastguard Worker // uint32_t pad0[63];
157*03ce13f7SAndroid Build Coastguard Worker // uint32_t magic0;
158*03ce13f7SAndroid Build Coastguard Worker // uint32_t in[NUM_ELEMENTS]; // Aligned to 0x100
159*03ce13f7SAndroid Build Coastguard Worker // uint32_t magic1;
160*03ce13f7SAndroid Build Coastguard Worker // uint32_t pad1[N];
161*03ce13f7SAndroid Build Coastguard Worker // uint32_t magic2;
162*03ce13f7SAndroid Build Coastguard Worker // uint32_t out[NUM_ELEMENTS]; // Aligned to 0x100
163*03ce13f7SAndroid Build Coastguard Worker // uint32_t magic3;
164*03ce13f7SAndroid Build Coastguard Worker // };
165*03ce13f7SAndroid Build Coastguard Worker static constexpr uint32_t magic0 = 0x01234567;
166*03ce13f7SAndroid Build Coastguard Worker static constexpr uint32_t magic1 = 0x89abcdef;
167*03ce13f7SAndroid Build Coastguard Worker static constexpr uint32_t magic2 = 0xfedcba99;
168*03ce13f7SAndroid Build Coastguard Worker static constexpr uint32_t magic3 = 0x87654321;
169*03ce13f7SAndroid Build Coastguard Worker size_t numElements = GetParam().numElements;
170*03ce13f7SAndroid Build Coastguard Worker size_t alignElements = 0x100 / sizeof(uint32_t);
171*03ce13f7SAndroid Build Coastguard Worker size_t magic0Offset = alignElements - 1;
172*03ce13f7SAndroid Build Coastguard Worker size_t inOffset = 1 + magic0Offset;
173*03ce13f7SAndroid Build Coastguard Worker size_t magic1Offset = numElements + inOffset;
174*03ce13f7SAndroid Build Coastguard Worker size_t magic2Offset = alignUp(magic1Offset + 1, alignElements) - 1;
175*03ce13f7SAndroid Build Coastguard Worker size_t outOffset = 1 + magic2Offset;
176*03ce13f7SAndroid Build Coastguard Worker size_t magic3Offset = numElements + outOffset;
177*03ce13f7SAndroid Build Coastguard Worker size_t buffersTotalElements = alignUp(1 + magic3Offset, alignElements);
178*03ce13f7SAndroid Build Coastguard Worker size_t buffersSize = sizeof(uint32_t) * buffersTotalElements;
179*03ce13f7SAndroid Build Coastguard Worker
180*03ce13f7SAndroid Build Coastguard Worker VkDeviceMemory memory;
181*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->AllocateMemory(buffersSize,
182*03ce13f7SAndroid Build Coastguard Worker VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
183*03ce13f7SAndroid Build Coastguard Worker &memory));
184*03ce13f7SAndroid Build Coastguard Worker
185*03ce13f7SAndroid Build Coastguard Worker uint32_t *buffers;
186*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->MapMemory(memory, 0, buffersSize, 0, (void **)&buffers));
187*03ce13f7SAndroid Build Coastguard Worker
188*03ce13f7SAndroid Build Coastguard Worker memset(buffers, 0, buffersSize);
189*03ce13f7SAndroid Build Coastguard Worker
190*03ce13f7SAndroid Build Coastguard Worker buffers[magic0Offset] = magic0;
191*03ce13f7SAndroid Build Coastguard Worker buffers[magic1Offset] = magic1;
192*03ce13f7SAndroid Build Coastguard Worker buffers[magic2Offset] = magic2;
193*03ce13f7SAndroid Build Coastguard Worker buffers[magic3Offset] = magic3;
194*03ce13f7SAndroid Build Coastguard Worker
195*03ce13f7SAndroid Build Coastguard Worker for(size_t i = 0; i < numElements; i++)
196*03ce13f7SAndroid Build Coastguard Worker {
197*03ce13f7SAndroid Build Coastguard Worker buffers[inOffset + i] = input((uint32_t)i);
198*03ce13f7SAndroid Build Coastguard Worker }
199*03ce13f7SAndroid Build Coastguard Worker
200*03ce13f7SAndroid Build Coastguard Worker device->UnmapMemory(memory);
201*03ce13f7SAndroid Build Coastguard Worker buffers = nullptr;
202*03ce13f7SAndroid Build Coastguard Worker
203*03ce13f7SAndroid Build Coastguard Worker VkBuffer bufferIn;
204*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->CreateStorageBuffer(memory,
205*03ce13f7SAndroid Build Coastguard Worker sizeof(uint32_t) * numElements,
206*03ce13f7SAndroid Build Coastguard Worker sizeof(uint32_t) * inOffset,
207*03ce13f7SAndroid Build Coastguard Worker &bufferIn));
208*03ce13f7SAndroid Build Coastguard Worker
209*03ce13f7SAndroid Build Coastguard Worker VkBuffer bufferOut;
210*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->CreateStorageBuffer(memory,
211*03ce13f7SAndroid Build Coastguard Worker sizeof(uint32_t) * numElements,
212*03ce13f7SAndroid Build Coastguard Worker sizeof(uint32_t) * outOffset,
213*03ce13f7SAndroid Build Coastguard Worker &bufferOut));
214*03ce13f7SAndroid Build Coastguard Worker
215*03ce13f7SAndroid Build Coastguard Worker VkShaderModule shaderModule;
216*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->CreateShaderModule(code, &shaderModule));
217*03ce13f7SAndroid Build Coastguard Worker
218*03ce13f7SAndroid Build Coastguard Worker std::vector<VkDescriptorSetLayoutBinding> descriptorSetLayoutBindings = {
219*03ce13f7SAndroid Build Coastguard Worker {
220*03ce13f7SAndroid Build Coastguard Worker 0, // binding
221*03ce13f7SAndroid Build Coastguard Worker VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, // descriptorType
222*03ce13f7SAndroid Build Coastguard Worker 1, // descriptorCount
223*03ce13f7SAndroid Build Coastguard Worker VK_SHADER_STAGE_COMPUTE_BIT, // stageFlags
224*03ce13f7SAndroid Build Coastguard Worker 0, // pImmutableSamplers
225*03ce13f7SAndroid Build Coastguard Worker },
226*03ce13f7SAndroid Build Coastguard Worker {
227*03ce13f7SAndroid Build Coastguard Worker 1, // binding
228*03ce13f7SAndroid Build Coastguard Worker VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, // descriptorType
229*03ce13f7SAndroid Build Coastguard Worker 1, // descriptorCount
230*03ce13f7SAndroid Build Coastguard Worker VK_SHADER_STAGE_COMPUTE_BIT, // stageFlags
231*03ce13f7SAndroid Build Coastguard Worker 0, // pImmutableSamplers
232*03ce13f7SAndroid Build Coastguard Worker }
233*03ce13f7SAndroid Build Coastguard Worker };
234*03ce13f7SAndroid Build Coastguard Worker
235*03ce13f7SAndroid Build Coastguard Worker VkDescriptorSetLayout descriptorSetLayout;
236*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->CreateDescriptorSetLayout(descriptorSetLayoutBindings, &descriptorSetLayout));
237*03ce13f7SAndroid Build Coastguard Worker
238*03ce13f7SAndroid Build Coastguard Worker VkPipelineLayout pipelineLayout;
239*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->CreatePipelineLayout(descriptorSetLayout, &pipelineLayout));
240*03ce13f7SAndroid Build Coastguard Worker
241*03ce13f7SAndroid Build Coastguard Worker VkPipeline pipeline;
242*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->CreateComputePipeline(shaderModule, pipelineLayout, &pipeline));
243*03ce13f7SAndroid Build Coastguard Worker
244*03ce13f7SAndroid Build Coastguard Worker VkDescriptorPool descriptorPool;
245*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->CreateStorageBufferDescriptorPool(2, &descriptorPool));
246*03ce13f7SAndroid Build Coastguard Worker
247*03ce13f7SAndroid Build Coastguard Worker VkDescriptorSet descriptorSet;
248*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->AllocateDescriptorSet(descriptorPool, descriptorSetLayout, &descriptorSet));
249*03ce13f7SAndroid Build Coastguard Worker
250*03ce13f7SAndroid Build Coastguard Worker std::vector<VkDescriptorBufferInfo> descriptorBufferInfos = {
251*03ce13f7SAndroid Build Coastguard Worker {
252*03ce13f7SAndroid Build Coastguard Worker bufferIn, // buffer
253*03ce13f7SAndroid Build Coastguard Worker 0, // offset
254*03ce13f7SAndroid Build Coastguard Worker VK_WHOLE_SIZE, // range
255*03ce13f7SAndroid Build Coastguard Worker },
256*03ce13f7SAndroid Build Coastguard Worker {
257*03ce13f7SAndroid Build Coastguard Worker bufferOut, // buffer
258*03ce13f7SAndroid Build Coastguard Worker 0, // offset
259*03ce13f7SAndroid Build Coastguard Worker VK_WHOLE_SIZE, // range
260*03ce13f7SAndroid Build Coastguard Worker }
261*03ce13f7SAndroid Build Coastguard Worker };
262*03ce13f7SAndroid Build Coastguard Worker device->UpdateStorageBufferDescriptorSets(descriptorSet, descriptorBufferInfos);
263*03ce13f7SAndroid Build Coastguard Worker
264*03ce13f7SAndroid Build Coastguard Worker VkCommandPool commandPool;
265*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->CreateCommandPool(&commandPool));
266*03ce13f7SAndroid Build Coastguard Worker
267*03ce13f7SAndroid Build Coastguard Worker VkCommandBuffer commandBuffer;
268*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->AllocateCommandBuffer(commandPool, &commandBuffer));
269*03ce13f7SAndroid Build Coastguard Worker
270*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->BeginCommandBuffer(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, commandBuffer));
271*03ce13f7SAndroid Build Coastguard Worker
272*03ce13f7SAndroid Build Coastguard Worker driver.vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline);
273*03ce13f7SAndroid Build Coastguard Worker
274*03ce13f7SAndroid Build Coastguard Worker driver.vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelineLayout, 0, 1, &descriptorSet,
275*03ce13f7SAndroid Build Coastguard Worker 0, nullptr);
276*03ce13f7SAndroid Build Coastguard Worker
277*03ce13f7SAndroid Build Coastguard Worker driver.vkCmdDispatch(commandBuffer, (uint32_t)(numElements / GetParam().localSizeX), 1, 1);
278*03ce13f7SAndroid Build Coastguard Worker
279*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(driver.vkEndCommandBuffer(commandBuffer));
280*03ce13f7SAndroid Build Coastguard Worker
281*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->QueueSubmitAndWait(commandBuffer));
282*03ce13f7SAndroid Build Coastguard Worker
283*03ce13f7SAndroid Build Coastguard Worker VK_ASSERT(device->MapMemory(memory, 0, buffersSize, 0, (void **)&buffers));
284*03ce13f7SAndroid Build Coastguard Worker
285*03ce13f7SAndroid Build Coastguard Worker for(size_t i = 0; i < numElements; ++i)
286*03ce13f7SAndroid Build Coastguard Worker {
287*03ce13f7SAndroid Build Coastguard Worker auto got = buffers[i + outOffset];
288*03ce13f7SAndroid Build Coastguard Worker EXPECT_EQ(expected((uint32_t)i), got) << "Unexpected output at " << i;
289*03ce13f7SAndroid Build Coastguard Worker }
290*03ce13f7SAndroid Build Coastguard Worker
291*03ce13f7SAndroid Build Coastguard Worker // Check for writes outside of bounds.
292*03ce13f7SAndroid Build Coastguard Worker EXPECT_EQ(buffers[magic0Offset], magic0);
293*03ce13f7SAndroid Build Coastguard Worker EXPECT_EQ(buffers[magic1Offset], magic1);
294*03ce13f7SAndroid Build Coastguard Worker EXPECT_EQ(buffers[magic2Offset], magic2);
295*03ce13f7SAndroid Build Coastguard Worker EXPECT_EQ(buffers[magic3Offset], magic3);
296*03ce13f7SAndroid Build Coastguard Worker
297*03ce13f7SAndroid Build Coastguard Worker device->UnmapMemory(memory);
298*03ce13f7SAndroid Build Coastguard Worker buffers = nullptr;
299*03ce13f7SAndroid Build Coastguard Worker
300*03ce13f7SAndroid Build Coastguard Worker device->FreeCommandBuffer(commandPool, commandBuffer);
301*03ce13f7SAndroid Build Coastguard Worker device->FreeMemory(memory);
302*03ce13f7SAndroid Build Coastguard Worker device->DestroyPipeline(pipeline);
303*03ce13f7SAndroid Build Coastguard Worker device->DestroyCommandPool(commandPool);
304*03ce13f7SAndroid Build Coastguard Worker device->DestroyPipelineLayout(pipelineLayout);
305*03ce13f7SAndroid Build Coastguard Worker device->DestroyDescriptorSetLayout(descriptorSetLayout);
306*03ce13f7SAndroid Build Coastguard Worker device->DestroyDescriptorPool(descriptorPool);
307*03ce13f7SAndroid Build Coastguard Worker device->DestroyBuffer(bufferIn);
308*03ce13f7SAndroid Build Coastguard Worker device->DestroyBuffer(bufferOut);
309*03ce13f7SAndroid Build Coastguard Worker device->DestroyShaderModule(shaderModule);
310*03ce13f7SAndroid Build Coastguard Worker device.reset(nullptr);
311*03ce13f7SAndroid Build Coastguard Worker driver.vkDestroyInstance(instance, nullptr);
312*03ce13f7SAndroid Build Coastguard Worker }
313*03ce13f7SAndroid Build Coastguard Worker
314*03ce13f7SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(ComputeParams, SwiftShaderVulkanBufferToBufferComputeTest, testing::Values(ComputeParams{ 512, 1, 1, 1 }, ComputeParams{ 512, 2, 1, 1 }, ComputeParams{ 512, 4, 1, 1 }, ComputeParams{ 512, 8, 1, 1 }, ComputeParams{ 512, 16, 1, 1 }, ComputeParams{ 512, 32, 1, 1 },
315*03ce13f7SAndroid Build Coastguard Worker
316*03ce13f7SAndroid Build Coastguard Worker // Non-multiple of SIMD-lane.
317*03ce13f7SAndroid Build Coastguard Worker ComputeParams{ 3, 1, 1, 1 }, ComputeParams{ 2, 1, 1, 1 }));
318*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,Memcpy)319*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, Memcpy)
320*03ce13f7SAndroid Build Coastguard Worker {
321*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
322*03ce13f7SAndroid Build Coastguard Worker // #version 450
323*03ce13f7SAndroid Build Coastguard Worker // layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
324*03ce13f7SAndroid Build Coastguard Worker // layout(binding = 0, std430) buffer InBuffer
325*03ce13f7SAndroid Build Coastguard Worker // {
326*03ce13f7SAndroid Build Coastguard Worker // int Data[];
327*03ce13f7SAndroid Build Coastguard Worker // } In;
328*03ce13f7SAndroid Build Coastguard Worker // layout(binding = 1, std430) buffer OutBuffer
329*03ce13f7SAndroid Build Coastguard Worker // {
330*03ce13f7SAndroid Build Coastguard Worker // int Data[];
331*03ce13f7SAndroid Build Coastguard Worker // } Out;
332*03ce13f7SAndroid Build Coastguard Worker // void main()
333*03ce13f7SAndroid Build Coastguard Worker // {
334*03ce13f7SAndroid Build Coastguard Worker // Out.Data[gl_GlobalInvocationID.x] = In.Data[gl_GlobalInvocationID.x];
335*03ce13f7SAndroid Build Coastguard Worker // }
336*03ce13f7SAndroid Build Coastguard Worker // clang-format off
337*03ce13f7SAndroid Build Coastguard Worker src <<
338*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
339*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
340*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
341*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
342*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
343*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
344*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
345*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
346*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
347*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
348*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
349*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
350*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
351*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
352*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
353*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
354*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
355*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
356*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
357*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
358*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
359*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
360*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %11 Uniform\n" // struct{ int32[] }* in
361*03ce13f7SAndroid Build Coastguard Worker "%12 = OpConstant %9 0\n" // int32(0)
362*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %10 0\n" // uint32(0)
363*03ce13f7SAndroid Build Coastguard Worker "%14 = OpTypeVector %10 3\n" // vec3<int32>
364*03ce13f7SAndroid Build Coastguard Worker "%15 = OpTypePointer Input %14\n" // vec3<int32>*
365*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %15 Input\n" // gl_GlobalInvocationId
366*03ce13f7SAndroid Build Coastguard Worker "%16 = OpTypePointer Input %10\n" // uint32*
367*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %11 Uniform\n" // struct{ int32[] }* out
368*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypePointer Uniform %9\n" // int32*
369*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
370*03ce13f7SAndroid Build Coastguard Worker "%18 = OpLabel\n"
371*03ce13f7SAndroid Build Coastguard Worker "%19 = OpAccessChain %16 %2 %13\n" // &gl_GlobalInvocationId.x
372*03ce13f7SAndroid Build Coastguard Worker "%20 = OpLoad %10 %19\n" // gl_GlobalInvocationId.x
373*03ce13f7SAndroid Build Coastguard Worker "%21 = OpAccessChain %17 %6 %12 %20\n" // &in.arr[gl_GlobalInvocationId.x]
374*03ce13f7SAndroid Build Coastguard Worker "%22 = OpLoad %9 %21\n" // in.arr[gl_GlobalInvocationId.x]
375*03ce13f7SAndroid Build Coastguard Worker "%23 = OpAccessChain %17 %5 %12 %20\n" // &out.arr[gl_GlobalInvocationId.x]
376*03ce13f7SAndroid Build Coastguard Worker "OpStore %23 %22\n" // out.arr[gl_GlobalInvocationId.x] = in[gl_GlobalInvocationId.x]
377*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
378*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
379*03ce13f7SAndroid Build Coastguard Worker // clang-format on
380*03ce13f7SAndroid Build Coastguard Worker
381*03ce13f7SAndroid Build Coastguard Worker test(
382*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i; });
383*03ce13f7SAndroid Build Coastguard Worker }
384*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,GlobalInvocationId)385*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, GlobalInvocationId)
386*03ce13f7SAndroid Build Coastguard Worker {
387*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
388*03ce13f7SAndroid Build Coastguard Worker // clang-format off
389*03ce13f7SAndroid Build Coastguard Worker src <<
390*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
391*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
392*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
393*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
394*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
395*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
396*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
397*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
398*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
399*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
400*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
401*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
402*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
403*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
404*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
405*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
406*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
407*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
408*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
409*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
410*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
411*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
412*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %11 Uniform\n" // struct{ int32[] }* in
413*03ce13f7SAndroid Build Coastguard Worker "%12 = OpConstant %9 0\n" // int32(0)
414*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 1\n" // int32(1)
415*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %10 0\n" // uint32(0)
416*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %10 1\n" // uint32(1)
417*03ce13f7SAndroid Build Coastguard Worker "%16 = OpConstant %10 2\n" // uint32(2)
418*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypeVector %10 3\n" // vec3<int32>
419*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %17\n" // vec3<int32>*
420*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %18 Input\n" // gl_GlobalInvocationId
421*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Input %10\n" // uint32*
422*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %11 Uniform\n" // struct{ int32[] }* out
423*03ce13f7SAndroid Build Coastguard Worker "%20 = OpTypePointer Uniform %9\n" // int32*
424*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
425*03ce13f7SAndroid Build Coastguard Worker "%21 = OpLabel\n"
426*03ce13f7SAndroid Build Coastguard Worker "%22 = OpAccessChain %19 %2 %14\n" // &gl_GlobalInvocationId.x
427*03ce13f7SAndroid Build Coastguard Worker "%23 = OpAccessChain %19 %2 %15\n" // &gl_GlobalInvocationId.y
428*03ce13f7SAndroid Build Coastguard Worker "%24 = OpAccessChain %19 %2 %16\n" // &gl_GlobalInvocationId.z
429*03ce13f7SAndroid Build Coastguard Worker "%25 = OpLoad %10 %22\n" // gl_GlobalInvocationId.x
430*03ce13f7SAndroid Build Coastguard Worker "%26 = OpLoad %10 %23\n" // gl_GlobalInvocationId.y
431*03ce13f7SAndroid Build Coastguard Worker "%27 = OpLoad %10 %24\n" // gl_GlobalInvocationId.z
432*03ce13f7SAndroid Build Coastguard Worker "%28 = OpAccessChain %20 %6 %12 %25\n" // &in.arr[gl_GlobalInvocationId.x]
433*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLoad %9 %28\n" // out.arr[gl_GlobalInvocationId.x]
434*03ce13f7SAndroid Build Coastguard Worker "%30 = OpIAdd %9 %29 %26\n" // in[gl_GlobalInvocationId.x] + gl_GlobalInvocationId.y
435*03ce13f7SAndroid Build Coastguard Worker "%31 = OpIAdd %9 %30 %27\n" // in[gl_GlobalInvocationId.x] + gl_GlobalInvocationId.y + gl_GlobalInvocationId.z
436*03ce13f7SAndroid Build Coastguard Worker "%32 = OpAccessChain %20 %5 %12 %25\n" // &out.arr[gl_GlobalInvocationId.x]
437*03ce13f7SAndroid Build Coastguard Worker "OpStore %32 %31\n" // out.arr[gl_GlobalInvocationId.x] = in[gl_GlobalInvocationId.x] + gl_GlobalInvocationId.y + gl_GlobalInvocationId.z
438*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
439*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
440*03ce13f7SAndroid Build Coastguard Worker // clang-format on
441*03ce13f7SAndroid Build Coastguard Worker
442*03ce13f7SAndroid Build Coastguard Worker // gl_GlobalInvocationId.y and gl_GlobalInvocationId.z should both be zero.
443*03ce13f7SAndroid Build Coastguard Worker test(
444*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i; });
445*03ce13f7SAndroid Build Coastguard Worker }
446*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,BranchSimple)447*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchSimple)
448*03ce13f7SAndroid Build Coastguard Worker {
449*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
450*03ce13f7SAndroid Build Coastguard Worker // clang-format off
451*03ce13f7SAndroid Build Coastguard Worker src <<
452*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
453*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
454*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
455*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
456*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
457*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
458*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
459*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
460*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
461*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
462*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
463*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
464*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
465*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
466*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
467*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
468*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
469*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
470*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
471*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
472*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
473*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
474*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %11 Uniform\n" // struct{ int32[] }* in
475*03ce13f7SAndroid Build Coastguard Worker "%12 = OpConstant %9 0\n" // int32(0)
476*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %10 0\n" // uint32(0)
477*03ce13f7SAndroid Build Coastguard Worker "%14 = OpTypeVector %10 3\n" // vec3<int32>
478*03ce13f7SAndroid Build Coastguard Worker "%15 = OpTypePointer Input %14\n" // vec3<int32>*
479*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %15 Input\n" // gl_GlobalInvocationId
480*03ce13f7SAndroid Build Coastguard Worker "%16 = OpTypePointer Input %10\n" // uint32*
481*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %11 Uniform\n" // struct{ int32[] }* out
482*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypePointer Uniform %9\n" // int32*
483*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
484*03ce13f7SAndroid Build Coastguard Worker "%18 = OpLabel\n"
485*03ce13f7SAndroid Build Coastguard Worker "%19 = OpAccessChain %16 %2 %13\n" // &gl_GlobalInvocationId.x
486*03ce13f7SAndroid Build Coastguard Worker "%20 = OpLoad %10 %19\n" // gl_GlobalInvocationId.x
487*03ce13f7SAndroid Build Coastguard Worker "%21 = OpAccessChain %17 %6 %12 %20\n" // &in.arr[gl_GlobalInvocationId.x]
488*03ce13f7SAndroid Build Coastguard Worker "%22 = OpLoad %9 %21\n" // in.arr[gl_GlobalInvocationId.x]
489*03ce13f7SAndroid Build Coastguard Worker "%23 = OpAccessChain %17 %5 %12 %20\n" // &out.arr[gl_GlobalInvocationId.x]
490*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
491*03ce13f7SAndroid Build Coastguard Worker // %22 = in value
492*03ce13f7SAndroid Build Coastguard Worker "OpBranch %24\n"
493*03ce13f7SAndroid Build Coastguard Worker "%24 = OpLabel\n"
494*03ce13f7SAndroid Build Coastguard Worker "OpBranch %25\n"
495*03ce13f7SAndroid Build Coastguard Worker "%25 = OpLabel\n"
496*03ce13f7SAndroid Build Coastguard Worker "OpBranch %26\n"
497*03ce13f7SAndroid Build Coastguard Worker "%26 = OpLabel\n"
498*03ce13f7SAndroid Build Coastguard Worker // %22 = out value
499*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
500*03ce13f7SAndroid Build Coastguard Worker "OpStore %23 %22\n"
501*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
502*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
503*03ce13f7SAndroid Build Coastguard Worker // clang-format on
504*03ce13f7SAndroid Build Coastguard Worker
505*03ce13f7SAndroid Build Coastguard Worker test(
506*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i; });
507*03ce13f7SAndroid Build Coastguard Worker }
508*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,BranchDeclareSSA)509*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchDeclareSSA)
510*03ce13f7SAndroid Build Coastguard Worker {
511*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
512*03ce13f7SAndroid Build Coastguard Worker // clang-format off
513*03ce13f7SAndroid Build Coastguard Worker src <<
514*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
515*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
516*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
517*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
518*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
519*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
520*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
521*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
522*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
523*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
524*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
525*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
526*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
527*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
528*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
529*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
530*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
531*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
532*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
533*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
534*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
535*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
536*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %11 Uniform\n" // struct{ int32[] }* in
537*03ce13f7SAndroid Build Coastguard Worker "%12 = OpConstant %9 0\n" // int32(0)
538*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %10 0\n" // uint32(0)
539*03ce13f7SAndroid Build Coastguard Worker "%14 = OpTypeVector %10 3\n" // vec3<int32>
540*03ce13f7SAndroid Build Coastguard Worker "%15 = OpTypePointer Input %14\n" // vec3<int32>*
541*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %15 Input\n" // gl_GlobalInvocationId
542*03ce13f7SAndroid Build Coastguard Worker "%16 = OpTypePointer Input %10\n" // uint32*
543*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %11 Uniform\n" // struct{ int32[] }* out
544*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypePointer Uniform %9\n" // int32*
545*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
546*03ce13f7SAndroid Build Coastguard Worker "%18 = OpLabel\n"
547*03ce13f7SAndroid Build Coastguard Worker "%19 = OpAccessChain %16 %2 %13\n" // &gl_GlobalInvocationId.x
548*03ce13f7SAndroid Build Coastguard Worker "%20 = OpLoad %10 %19\n" // gl_GlobalInvocationId.x
549*03ce13f7SAndroid Build Coastguard Worker "%21 = OpAccessChain %17 %6 %12 %20\n" // &in.arr[gl_GlobalInvocationId.x]
550*03ce13f7SAndroid Build Coastguard Worker "%22 = OpLoad %9 %21\n" // in.arr[gl_GlobalInvocationId.x]
551*03ce13f7SAndroid Build Coastguard Worker "%23 = OpAccessChain %17 %5 %12 %20\n" // &out.arr[gl_GlobalInvocationId.x]
552*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
553*03ce13f7SAndroid Build Coastguard Worker // %22 = in value
554*03ce13f7SAndroid Build Coastguard Worker "OpBranch %24\n"
555*03ce13f7SAndroid Build Coastguard Worker "%24 = OpLabel\n"
556*03ce13f7SAndroid Build Coastguard Worker "%25 = OpIAdd %9 %22 %22\n" // %25 = in*2
557*03ce13f7SAndroid Build Coastguard Worker "OpBranch %26\n"
558*03ce13f7SAndroid Build Coastguard Worker "%26 = OpLabel\n"
559*03ce13f7SAndroid Build Coastguard Worker "OpBranch %27\n"
560*03ce13f7SAndroid Build Coastguard Worker "%27 = OpLabel\n"
561*03ce13f7SAndroid Build Coastguard Worker // %25 = out value
562*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
563*03ce13f7SAndroid Build Coastguard Worker "OpStore %23 %25\n" // use SSA value from previous block
564*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
565*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
566*03ce13f7SAndroid Build Coastguard Worker // clang-format on
567*03ce13f7SAndroid Build Coastguard Worker
568*03ce13f7SAndroid Build Coastguard Worker test(
569*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i * 2; });
570*03ce13f7SAndroid Build Coastguard Worker }
571*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,BranchConditionalSimple)572*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalSimple)
573*03ce13f7SAndroid Build Coastguard Worker {
574*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
575*03ce13f7SAndroid Build Coastguard Worker // clang-format off
576*03ce13f7SAndroid Build Coastguard Worker src <<
577*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
578*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
579*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
580*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
581*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
582*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
583*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
584*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
585*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
586*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
587*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
588*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
589*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
590*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
591*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
592*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
593*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
594*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
595*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
596*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeBool\n"
597*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
598*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
599*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
600*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %12 Uniform\n" // struct{ int32[] }* in
601*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 0\n" // int32(0)
602*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %9 2\n" // int32(2)
603*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %10 0\n" // uint32(0)
604*03ce13f7SAndroid Build Coastguard Worker "%16 = OpTypeVector %10 3\n" // vec4<int32>
605*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypePointer Input %16\n" // vec4<int32>*
606*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %17 Input\n" // gl_GlobalInvocationId
607*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %10\n" // uint32*
608*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %12 Uniform\n" // struct{ int32[] }* out
609*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Uniform %9\n" // int32*
610*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
611*03ce13f7SAndroid Build Coastguard Worker "%20 = OpLabel\n"
612*03ce13f7SAndroid Build Coastguard Worker "%21 = OpAccessChain %18 %2 %15\n" // &gl_GlobalInvocationId.x
613*03ce13f7SAndroid Build Coastguard Worker "%22 = OpLoad %10 %21\n" // gl_GlobalInvocationId.x
614*03ce13f7SAndroid Build Coastguard Worker "%23 = OpAccessChain %19 %6 %13 %22\n" // &in.arr[gl_GlobalInvocationId.x]
615*03ce13f7SAndroid Build Coastguard Worker "%24 = OpLoad %9 %23\n" // in.arr[gl_GlobalInvocationId.x]
616*03ce13f7SAndroid Build Coastguard Worker "%25 = OpAccessChain %19 %5 %13 %22\n" // &out.arr[gl_GlobalInvocationId.x]
617*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
618*03ce13f7SAndroid Build Coastguard Worker // %24 = in value
619*03ce13f7SAndroid Build Coastguard Worker "%26 = OpSMod %9 %24 %14\n" // in % 2
620*03ce13f7SAndroid Build Coastguard Worker "%27 = OpIEqual %11 %26 %13\n" // (in % 2) == 0
621*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %28 None\n"
622*03ce13f7SAndroid Build Coastguard Worker "OpBranchConditional %27 %28 %28\n" // Both go to %28
623*03ce13f7SAndroid Build Coastguard Worker "%28 = OpLabel\n"
624*03ce13f7SAndroid Build Coastguard Worker // %26 = out value
625*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
626*03ce13f7SAndroid Build Coastguard Worker "OpStore %25 %26\n" // use SSA value from previous block
627*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
628*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
629*03ce13f7SAndroid Build Coastguard Worker // clang-format on
630*03ce13f7SAndroid Build Coastguard Worker
631*03ce13f7SAndroid Build Coastguard Worker test(
632*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i % 2; });
633*03ce13f7SAndroid Build Coastguard Worker }
634*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,BranchConditionalTwoEmptyBlocks)635*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalTwoEmptyBlocks)
636*03ce13f7SAndroid Build Coastguard Worker {
637*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
638*03ce13f7SAndroid Build Coastguard Worker // clang-format off
639*03ce13f7SAndroid Build Coastguard Worker src <<
640*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
641*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
642*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
643*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
644*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
645*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
646*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
647*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
648*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
649*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
650*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
651*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
652*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
653*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
654*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
655*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
656*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
657*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
658*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
659*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeBool\n"
660*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
661*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
662*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
663*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %12 Uniform\n" // struct{ int32[] }* in
664*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 0\n" // int32(0)
665*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %9 2\n" // int32(2)
666*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %10 0\n" // uint32(0)
667*03ce13f7SAndroid Build Coastguard Worker "%16 = OpTypeVector %10 3\n" // vec4<int32>
668*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypePointer Input %16\n" // vec4<int32>*
669*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %17 Input\n" // gl_GlobalInvocationId
670*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %10\n" // uint32*
671*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %12 Uniform\n" // struct{ int32[] }* out
672*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Uniform %9\n" // int32*
673*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
674*03ce13f7SAndroid Build Coastguard Worker "%20 = OpLabel\n"
675*03ce13f7SAndroid Build Coastguard Worker "%21 = OpAccessChain %18 %2 %15\n" // &gl_GlobalInvocationId.x
676*03ce13f7SAndroid Build Coastguard Worker "%22 = OpLoad %10 %21\n" // gl_GlobalInvocationId.x
677*03ce13f7SAndroid Build Coastguard Worker "%23 = OpAccessChain %19 %6 %13 %22\n" // &in.arr[gl_GlobalInvocationId.x]
678*03ce13f7SAndroid Build Coastguard Worker "%24 = OpLoad %9 %23\n" // in.arr[gl_GlobalInvocationId.x]
679*03ce13f7SAndroid Build Coastguard Worker "%25 = OpAccessChain %19 %5 %13 %22\n" // &out.arr[gl_GlobalInvocationId.x]
680*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
681*03ce13f7SAndroid Build Coastguard Worker // %24 = in value
682*03ce13f7SAndroid Build Coastguard Worker "%26 = OpSMod %9 %24 %14\n" // in % 2
683*03ce13f7SAndroid Build Coastguard Worker "%27 = OpIEqual %11 %26 %13\n" // (in % 2) == 0
684*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %28 None\n"
685*03ce13f7SAndroid Build Coastguard Worker "OpBranchConditional %27 %29 %30\n"
686*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLabel\n" // (in % 2) == 0
687*03ce13f7SAndroid Build Coastguard Worker "OpBranch %28\n"
688*03ce13f7SAndroid Build Coastguard Worker "%30 = OpLabel\n" // (in % 2) != 0
689*03ce13f7SAndroid Build Coastguard Worker "OpBranch %28\n"
690*03ce13f7SAndroid Build Coastguard Worker "%28 = OpLabel\n"
691*03ce13f7SAndroid Build Coastguard Worker // %26 = out value
692*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
693*03ce13f7SAndroid Build Coastguard Worker "OpStore %25 %26\n" // use SSA value from previous block
694*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
695*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
696*03ce13f7SAndroid Build Coastguard Worker // clang-format on
697*03ce13f7SAndroid Build Coastguard Worker
698*03ce13f7SAndroid Build Coastguard Worker test(
699*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i % 2; });
700*03ce13f7SAndroid Build Coastguard Worker }
701*03ce13f7SAndroid Build Coastguard Worker
702*03ce13f7SAndroid Build Coastguard Worker // TODO: Test for parallel assignment
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,BranchConditionalStore)703*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalStore)
704*03ce13f7SAndroid Build Coastguard Worker {
705*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
706*03ce13f7SAndroid Build Coastguard Worker // clang-format off
707*03ce13f7SAndroid Build Coastguard Worker src <<
708*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
709*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
710*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
711*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
712*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
713*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
714*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
715*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
716*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
717*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
718*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
719*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
720*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
721*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
722*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
723*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
724*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
725*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
726*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
727*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeBool\n"
728*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
729*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
730*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
731*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %12 Uniform\n" // struct{ int32[] }* in
732*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 0\n" // int32(0)
733*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %9 1\n" // int32(1)
734*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %9 2\n" // int32(2)
735*03ce13f7SAndroid Build Coastguard Worker "%16 = OpConstant %10 0\n" // uint32(0)
736*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypeVector %10 3\n" // vec4<int32>
737*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %17\n" // vec4<int32>*
738*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %18 Input\n" // gl_GlobalInvocationId
739*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Input %10\n" // uint32*
740*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %12 Uniform\n" // struct{ int32[] }* out
741*03ce13f7SAndroid Build Coastguard Worker "%20 = OpTypePointer Uniform %9\n" // int32*
742*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
743*03ce13f7SAndroid Build Coastguard Worker "%21 = OpLabel\n"
744*03ce13f7SAndroid Build Coastguard Worker "%22 = OpAccessChain %19 %2 %16\n" // &gl_GlobalInvocationId.x
745*03ce13f7SAndroid Build Coastguard Worker "%23 = OpLoad %10 %22\n" // gl_GlobalInvocationId.x
746*03ce13f7SAndroid Build Coastguard Worker "%24 = OpAccessChain %20 %6 %13 %23\n" // &in.arr[gl_GlobalInvocationId.x]
747*03ce13f7SAndroid Build Coastguard Worker "%25 = OpLoad %9 %24\n" // in.arr[gl_GlobalInvocationId.x]
748*03ce13f7SAndroid Build Coastguard Worker "%26 = OpAccessChain %20 %5 %13 %23\n" // &out.arr[gl_GlobalInvocationId.x]
749*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
750*03ce13f7SAndroid Build Coastguard Worker // %25 = in value
751*03ce13f7SAndroid Build Coastguard Worker "%27 = OpSMod %9 %25 %15\n" // in % 2
752*03ce13f7SAndroid Build Coastguard Worker "%28 = OpIEqual %11 %27 %13\n" // (in % 2) == 0
753*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %29 None\n"
754*03ce13f7SAndroid Build Coastguard Worker "OpBranchConditional %28 %30 %31\n"
755*03ce13f7SAndroid Build Coastguard Worker "%30 = OpLabel\n" // (in % 2) == 0
756*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %14\n" // write 1
757*03ce13f7SAndroid Build Coastguard Worker "OpBranch %29\n"
758*03ce13f7SAndroid Build Coastguard Worker "%31 = OpLabel\n" // (in % 2) != 0
759*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %15\n" // write 2
760*03ce13f7SAndroid Build Coastguard Worker "OpBranch %29\n"
761*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLabel\n"
762*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
763*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
764*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
765*03ce13f7SAndroid Build Coastguard Worker // clang-format on
766*03ce13f7SAndroid Build Coastguard Worker
767*03ce13f7SAndroid Build Coastguard Worker test(
768*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 0 ? 1 : 2; });
769*03ce13f7SAndroid Build Coastguard Worker }
770*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,BranchConditionalReturnTrue)771*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalReturnTrue)
772*03ce13f7SAndroid Build Coastguard Worker {
773*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
774*03ce13f7SAndroid Build Coastguard Worker // clang-format off
775*03ce13f7SAndroid Build Coastguard Worker src <<
776*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
777*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
778*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
779*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
780*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
781*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
782*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
783*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
784*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
785*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
786*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
787*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
788*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
789*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
790*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
791*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
792*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
793*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
794*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
795*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeBool\n"
796*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
797*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
798*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
799*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %12 Uniform\n" // struct{ int32[] }* in
800*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 0\n" // int32(0)
801*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %9 1\n" // int32(1)
802*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %9 2\n" // int32(2)
803*03ce13f7SAndroid Build Coastguard Worker "%16 = OpConstant %10 0\n" // uint32(0)
804*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypeVector %10 3\n" // vec4<int32>
805*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %17\n" // vec4<int32>*
806*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %18 Input\n" // gl_GlobalInvocationId
807*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Input %10\n" // uint32*
808*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %12 Uniform\n" // struct{ int32[] }* out
809*03ce13f7SAndroid Build Coastguard Worker "%20 = OpTypePointer Uniform %9\n" // int32*
810*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
811*03ce13f7SAndroid Build Coastguard Worker "%21 = OpLabel\n"
812*03ce13f7SAndroid Build Coastguard Worker "%22 = OpAccessChain %19 %2 %16\n" // &gl_GlobalInvocationId.x
813*03ce13f7SAndroid Build Coastguard Worker "%23 = OpLoad %10 %22\n" // gl_GlobalInvocationId.x
814*03ce13f7SAndroid Build Coastguard Worker "%24 = OpAccessChain %20 %6 %13 %23\n" // &in.arr[gl_GlobalInvocationId.x]
815*03ce13f7SAndroid Build Coastguard Worker "%25 = OpLoad %9 %24\n" // in.arr[gl_GlobalInvocationId.x]
816*03ce13f7SAndroid Build Coastguard Worker "%26 = OpAccessChain %20 %5 %13 %23\n" // &out.arr[gl_GlobalInvocationId.x]
817*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
818*03ce13f7SAndroid Build Coastguard Worker // %25 = in value
819*03ce13f7SAndroid Build Coastguard Worker "%27 = OpSMod %9 %25 %15\n" // in % 2
820*03ce13f7SAndroid Build Coastguard Worker "%28 = OpIEqual %11 %27 %13\n" // (in % 2) == 0
821*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %29 None\n"
822*03ce13f7SAndroid Build Coastguard Worker "OpBranchConditional %28 %30 %29\n"
823*03ce13f7SAndroid Build Coastguard Worker "%30 = OpLabel\n" // (in % 2) == 0
824*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
825*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLabel\n" // merge
826*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %15\n" // write 2
827*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
828*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
829*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
830*03ce13f7SAndroid Build Coastguard Worker // clang-format on
831*03ce13f7SAndroid Build Coastguard Worker
832*03ce13f7SAndroid Build Coastguard Worker test(
833*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 0 ? 0 : 2; });
834*03ce13f7SAndroid Build Coastguard Worker }
835*03ce13f7SAndroid Build Coastguard Worker
836*03ce13f7SAndroid Build Coastguard Worker // TODO: Test for parallel assignment
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,BranchConditionalPhi)837*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalPhi)
838*03ce13f7SAndroid Build Coastguard Worker {
839*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
840*03ce13f7SAndroid Build Coastguard Worker // clang-format off
841*03ce13f7SAndroid Build Coastguard Worker src <<
842*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
843*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
844*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
845*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
846*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
847*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
848*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
849*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
850*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
851*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
852*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
853*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
854*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
855*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
856*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
857*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
858*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
859*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
860*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
861*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeBool\n"
862*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
863*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
864*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
865*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %12 Uniform\n" // struct{ int32[] }* in
866*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 0\n" // int32(0)
867*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %9 1\n" // int32(1)
868*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %9 2\n" // int32(2)
869*03ce13f7SAndroid Build Coastguard Worker "%16 = OpConstant %10 0\n" // uint32(0)
870*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypeVector %10 3\n" // vec4<int32>
871*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %17\n" // vec4<int32>*
872*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %18 Input\n" // gl_GlobalInvocationId
873*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Input %10\n" // uint32*
874*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %12 Uniform\n" // struct{ int32[] }* out
875*03ce13f7SAndroid Build Coastguard Worker "%20 = OpTypePointer Uniform %9\n" // int32*
876*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
877*03ce13f7SAndroid Build Coastguard Worker "%21 = OpLabel\n"
878*03ce13f7SAndroid Build Coastguard Worker "%22 = OpAccessChain %19 %2 %16\n" // &gl_GlobalInvocationId.x
879*03ce13f7SAndroid Build Coastguard Worker "%23 = OpLoad %10 %22\n" // gl_GlobalInvocationId.x
880*03ce13f7SAndroid Build Coastguard Worker "%24 = OpAccessChain %20 %6 %13 %23\n" // &in.arr[gl_GlobalInvocationId.x]
881*03ce13f7SAndroid Build Coastguard Worker "%25 = OpLoad %9 %24\n" // in.arr[gl_GlobalInvocationId.x]
882*03ce13f7SAndroid Build Coastguard Worker "%26 = OpAccessChain %20 %5 %13 %23\n" // &out.arr[gl_GlobalInvocationId.x]
883*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
884*03ce13f7SAndroid Build Coastguard Worker // %25 = in value
885*03ce13f7SAndroid Build Coastguard Worker "%27 = OpSMod %9 %25 %15\n" // in % 2
886*03ce13f7SAndroid Build Coastguard Worker "%28 = OpIEqual %11 %27 %13\n" // (in % 2) == 0
887*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %29 None\n"
888*03ce13f7SAndroid Build Coastguard Worker "OpBranchConditional %28 %30 %31\n"
889*03ce13f7SAndroid Build Coastguard Worker "%30 = OpLabel\n" // (in % 2) == 0
890*03ce13f7SAndroid Build Coastguard Worker "OpBranch %29\n"
891*03ce13f7SAndroid Build Coastguard Worker "%31 = OpLabel\n" // (in % 2) != 0
892*03ce13f7SAndroid Build Coastguard Worker "OpBranch %29\n"
893*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLabel\n"
894*03ce13f7SAndroid Build Coastguard Worker "%32 = OpPhi %9 %14 %30 %15 %31\n" // (in % 2) == 0 ? 1 : 2
895*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
896*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %32\n"
897*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
898*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
899*03ce13f7SAndroid Build Coastguard Worker // clang-format on
900*03ce13f7SAndroid Build Coastguard Worker
901*03ce13f7SAndroid Build Coastguard Worker test(
902*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 0 ? 1 : 2; });
903*03ce13f7SAndroid Build Coastguard Worker }
904*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,SwitchEmptyCases)905*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchEmptyCases)
906*03ce13f7SAndroid Build Coastguard Worker {
907*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
908*03ce13f7SAndroid Build Coastguard Worker // clang-format off
909*03ce13f7SAndroid Build Coastguard Worker src <<
910*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
911*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
912*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
913*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
914*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
915*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
916*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
917*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
918*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
919*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
920*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
921*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
922*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
923*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
924*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
925*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
926*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
927*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
928*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
929*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeBool\n"
930*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
931*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
932*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
933*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %12 Uniform\n" // struct{ int32[] }* in
934*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 0\n" // int32(0)
935*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %9 2\n" // int32(2)
936*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %10 0\n" // uint32(0)
937*03ce13f7SAndroid Build Coastguard Worker "%16 = OpTypeVector %10 3\n" // vec4<int32>
938*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypePointer Input %16\n" // vec4<int32>*
939*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %17 Input\n" // gl_GlobalInvocationId
940*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %10\n" // uint32*
941*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %12 Uniform\n" // struct{ int32[] }* out
942*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Uniform %9\n" // int32*
943*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
944*03ce13f7SAndroid Build Coastguard Worker "%20 = OpLabel\n"
945*03ce13f7SAndroid Build Coastguard Worker "%21 = OpAccessChain %18 %2 %15\n" // &gl_GlobalInvocationId.x
946*03ce13f7SAndroid Build Coastguard Worker "%22 = OpLoad %10 %21\n" // gl_GlobalInvocationId.x
947*03ce13f7SAndroid Build Coastguard Worker "%23 = OpAccessChain %19 %6 %13 %22\n" // &in.arr[gl_GlobalInvocationId.x]
948*03ce13f7SAndroid Build Coastguard Worker "%24 = OpLoad %9 %23\n" // in.arr[gl_GlobalInvocationId.x]
949*03ce13f7SAndroid Build Coastguard Worker "%25 = OpAccessChain %19 %5 %13 %22\n" // &out.arr[gl_GlobalInvocationId.x]
950*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
951*03ce13f7SAndroid Build Coastguard Worker // %24 = in value
952*03ce13f7SAndroid Build Coastguard Worker "%26 = OpSMod %9 %24 %14\n" // in % 2
953*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %27 None\n"
954*03ce13f7SAndroid Build Coastguard Worker "OpSwitch %26 %27 0 %28 1 %29\n"
955*03ce13f7SAndroid Build Coastguard Worker "%28 = OpLabel\n" // (in % 2) == 0
956*03ce13f7SAndroid Build Coastguard Worker "OpBranch %27\n"
957*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLabel\n" // (in % 2) == 1
958*03ce13f7SAndroid Build Coastguard Worker "OpBranch %27\n"
959*03ce13f7SAndroid Build Coastguard Worker "%27 = OpLabel\n"
960*03ce13f7SAndroid Build Coastguard Worker // %26 = out value
961*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
962*03ce13f7SAndroid Build Coastguard Worker "OpStore %25 %26\n" // use SSA value from previous block
963*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
964*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
965*03ce13f7SAndroid Build Coastguard Worker // clang-format on
966*03ce13f7SAndroid Build Coastguard Worker
967*03ce13f7SAndroid Build Coastguard Worker test(
968*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i % 2; });
969*03ce13f7SAndroid Build Coastguard Worker }
970*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,SwitchStore)971*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchStore)
972*03ce13f7SAndroid Build Coastguard Worker {
973*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
974*03ce13f7SAndroid Build Coastguard Worker // clang-format off
975*03ce13f7SAndroid Build Coastguard Worker src <<
976*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
977*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
978*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
979*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
980*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
981*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
982*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
983*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
984*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
985*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
986*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
987*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
988*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
989*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
990*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
991*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
992*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
993*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
994*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
995*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeBool\n"
996*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
997*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
998*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
999*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %12 Uniform\n" // struct{ int32[] }* in
1000*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 0\n" // int32(0)
1001*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %9 1\n" // int32(1)
1002*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %9 2\n" // int32(2)
1003*03ce13f7SAndroid Build Coastguard Worker "%16 = OpConstant %10 0\n" // uint32(0)
1004*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypeVector %10 3\n" // vec4<int32>
1005*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %17\n" // vec4<int32>*
1006*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %18 Input\n" // gl_GlobalInvocationId
1007*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Input %10\n" // uint32*
1008*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %12 Uniform\n" // struct{ int32[] }* out
1009*03ce13f7SAndroid Build Coastguard Worker "%20 = OpTypePointer Uniform %9\n" // int32*
1010*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
1011*03ce13f7SAndroid Build Coastguard Worker "%21 = OpLabel\n"
1012*03ce13f7SAndroid Build Coastguard Worker "%22 = OpAccessChain %19 %2 %16\n" // &gl_GlobalInvocationId.x
1013*03ce13f7SAndroid Build Coastguard Worker "%23 = OpLoad %10 %22\n" // gl_GlobalInvocationId.x
1014*03ce13f7SAndroid Build Coastguard Worker "%24 = OpAccessChain %20 %6 %13 %23\n" // &in.arr[gl_GlobalInvocationId.x]
1015*03ce13f7SAndroid Build Coastguard Worker "%25 = OpLoad %9 %24\n" // in.arr[gl_GlobalInvocationId.x]
1016*03ce13f7SAndroid Build Coastguard Worker "%26 = OpAccessChain %20 %5 %13 %23\n" // &out.arr[gl_GlobalInvocationId.x]
1017*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
1018*03ce13f7SAndroid Build Coastguard Worker // %25 = in value
1019*03ce13f7SAndroid Build Coastguard Worker "%27 = OpSMod %9 %25 %15\n" // in % 2
1020*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %28 None\n"
1021*03ce13f7SAndroid Build Coastguard Worker "OpSwitch %27 %28 0 %29 1 %30\n"
1022*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLabel\n" // (in % 2) == 0
1023*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %15\n" // write 2
1024*03ce13f7SAndroid Build Coastguard Worker "OpBranch %28\n"
1025*03ce13f7SAndroid Build Coastguard Worker "%30 = OpLabel\n" // (in % 2) == 1
1026*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %14\n" // write 1
1027*03ce13f7SAndroid Build Coastguard Worker "OpBranch %28\n"
1028*03ce13f7SAndroid Build Coastguard Worker "%28 = OpLabel\n"
1029*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
1030*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
1031*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
1032*03ce13f7SAndroid Build Coastguard Worker // clang-format on
1033*03ce13f7SAndroid Build Coastguard Worker
1034*03ce13f7SAndroid Build Coastguard Worker test(
1035*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 0 ? 2 : 1; });
1036*03ce13f7SAndroid Build Coastguard Worker }
1037*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,SwitchCaseReturn)1038*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchCaseReturn)
1039*03ce13f7SAndroid Build Coastguard Worker {
1040*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
1041*03ce13f7SAndroid Build Coastguard Worker // clang-format off
1042*03ce13f7SAndroid Build Coastguard Worker src <<
1043*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
1044*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
1045*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
1046*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
1047*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
1048*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
1049*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
1050*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
1051*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
1052*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
1053*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
1054*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
1055*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
1056*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
1057*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
1058*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
1059*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
1060*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
1061*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
1062*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeBool\n"
1063*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
1064*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
1065*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
1066*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %12 Uniform\n" // struct{ int32[] }* in
1067*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 0\n" // int32(0)
1068*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %9 1\n" // int32(1)
1069*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %9 2\n" // int32(2)
1070*03ce13f7SAndroid Build Coastguard Worker "%16 = OpConstant %10 0\n" // uint32(0)
1071*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypeVector %10 3\n" // vec4<int32>
1072*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %17\n" // vec4<int32>*
1073*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %18 Input\n" // gl_GlobalInvocationId
1074*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Input %10\n" // uint32*
1075*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %12 Uniform\n" // struct{ int32[] }* out
1076*03ce13f7SAndroid Build Coastguard Worker "%20 = OpTypePointer Uniform %9\n" // int32*
1077*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
1078*03ce13f7SAndroid Build Coastguard Worker "%21 = OpLabel\n"
1079*03ce13f7SAndroid Build Coastguard Worker "%22 = OpAccessChain %19 %2 %16\n" // &gl_GlobalInvocationId.x
1080*03ce13f7SAndroid Build Coastguard Worker "%23 = OpLoad %10 %22\n" // gl_GlobalInvocationId.x
1081*03ce13f7SAndroid Build Coastguard Worker "%24 = OpAccessChain %20 %6 %13 %23\n" // &in.arr[gl_GlobalInvocationId.x]
1082*03ce13f7SAndroid Build Coastguard Worker "%25 = OpLoad %9 %24\n" // in.arr[gl_GlobalInvocationId.x]
1083*03ce13f7SAndroid Build Coastguard Worker "%26 = OpAccessChain %20 %5 %13 %23\n" // &out.arr[gl_GlobalInvocationId.x]
1084*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
1085*03ce13f7SAndroid Build Coastguard Worker // %25 = in value
1086*03ce13f7SAndroid Build Coastguard Worker "%27 = OpSMod %9 %25 %15\n" // in % 2
1087*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %28 None\n"
1088*03ce13f7SAndroid Build Coastguard Worker "OpSwitch %27 %28 0 %29 1 %30\n"
1089*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLabel\n" // (in % 2) == 0
1090*03ce13f7SAndroid Build Coastguard Worker "OpBranch %28\n"
1091*03ce13f7SAndroid Build Coastguard Worker "%30 = OpLabel\n" // (in % 2) == 1
1092*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
1093*03ce13f7SAndroid Build Coastguard Worker "%28 = OpLabel\n"
1094*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %14\n" // write 1
1095*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
1096*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
1097*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
1098*03ce13f7SAndroid Build Coastguard Worker // clang-format on
1099*03ce13f7SAndroid Build Coastguard Worker
1100*03ce13f7SAndroid Build Coastguard Worker test(
1101*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 1 ? 0 : 1; });
1102*03ce13f7SAndroid Build Coastguard Worker }
1103*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,SwitchDefaultReturn)1104*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchDefaultReturn)
1105*03ce13f7SAndroid Build Coastguard Worker {
1106*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
1107*03ce13f7SAndroid Build Coastguard Worker // clang-format off
1108*03ce13f7SAndroid Build Coastguard Worker src <<
1109*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
1110*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
1111*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
1112*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
1113*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
1114*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
1115*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
1116*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
1117*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
1118*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
1119*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
1120*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
1121*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
1122*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
1123*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
1124*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
1125*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
1126*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
1127*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
1128*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeBool\n"
1129*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
1130*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
1131*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
1132*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %12 Uniform\n" // struct{ int32[] }* in
1133*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 0\n" // int32(0)
1134*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %9 1\n" // int32(1)
1135*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %9 2\n" // int32(2)
1136*03ce13f7SAndroid Build Coastguard Worker "%16 = OpConstant %10 0\n" // uint32(0)
1137*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypeVector %10 3\n" // vec4<int32>
1138*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %17\n" // vec4<int32>*
1139*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %18 Input\n" // gl_GlobalInvocationId
1140*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Input %10\n" // uint32*
1141*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %12 Uniform\n" // struct{ int32[] }* out
1142*03ce13f7SAndroid Build Coastguard Worker "%20 = OpTypePointer Uniform %9\n" // int32*
1143*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
1144*03ce13f7SAndroid Build Coastguard Worker "%21 = OpLabel\n"
1145*03ce13f7SAndroid Build Coastguard Worker "%22 = OpAccessChain %19 %2 %16\n" // &gl_GlobalInvocationId.x
1146*03ce13f7SAndroid Build Coastguard Worker "%23 = OpLoad %10 %22\n" // gl_GlobalInvocationId.x
1147*03ce13f7SAndroid Build Coastguard Worker "%24 = OpAccessChain %20 %6 %13 %23\n" // &in.arr[gl_GlobalInvocationId.x]
1148*03ce13f7SAndroid Build Coastguard Worker "%25 = OpLoad %9 %24\n" // in.arr[gl_GlobalInvocationId.x]
1149*03ce13f7SAndroid Build Coastguard Worker "%26 = OpAccessChain %20 %5 %13 %23\n" // &out.arr[gl_GlobalInvocationId.x]
1150*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
1151*03ce13f7SAndroid Build Coastguard Worker // %25 = in value
1152*03ce13f7SAndroid Build Coastguard Worker "%27 = OpSMod %9 %25 %15\n" // in % 2
1153*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %28 None\n"
1154*03ce13f7SAndroid Build Coastguard Worker "OpSwitch %27 %29 1 %30\n"
1155*03ce13f7SAndroid Build Coastguard Worker "%30 = OpLabel\n" // (in % 2) == 1
1156*03ce13f7SAndroid Build Coastguard Worker "OpBranch %28\n"
1157*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLabel\n" // (in % 2) != 1
1158*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
1159*03ce13f7SAndroid Build Coastguard Worker "%28 = OpLabel\n" // merge
1160*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %14\n" // write 1
1161*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
1162*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
1163*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
1164*03ce13f7SAndroid Build Coastguard Worker // clang-format on
1165*03ce13f7SAndroid Build Coastguard Worker
1166*03ce13f7SAndroid Build Coastguard Worker test(
1167*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 1 ? 1 : 0; });
1168*03ce13f7SAndroid Build Coastguard Worker }
1169*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,SwitchCaseFallthrough)1170*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchCaseFallthrough)
1171*03ce13f7SAndroid Build Coastguard Worker {
1172*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
1173*03ce13f7SAndroid Build Coastguard Worker // clang-format off
1174*03ce13f7SAndroid Build Coastguard Worker src <<
1175*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
1176*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
1177*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
1178*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
1179*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
1180*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
1181*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
1182*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
1183*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
1184*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
1185*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
1186*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
1187*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
1188*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
1189*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
1190*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
1191*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
1192*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
1193*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
1194*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeBool\n"
1195*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
1196*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
1197*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
1198*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %12 Uniform\n" // struct{ int32[] }* in
1199*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 0\n" // int32(0)
1200*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %9 1\n" // int32(1)
1201*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %9 2\n" // int32(2)
1202*03ce13f7SAndroid Build Coastguard Worker "%16 = OpConstant %10 0\n" // uint32(0)
1203*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypeVector %10 3\n" // vec4<int32>
1204*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %17\n" // vec4<int32>*
1205*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %18 Input\n" // gl_GlobalInvocationId
1206*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Input %10\n" // uint32*
1207*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %12 Uniform\n" // struct{ int32[] }* out
1208*03ce13f7SAndroid Build Coastguard Worker "%20 = OpTypePointer Uniform %9\n" // int32*
1209*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
1210*03ce13f7SAndroid Build Coastguard Worker "%21 = OpLabel\n"
1211*03ce13f7SAndroid Build Coastguard Worker "%22 = OpAccessChain %19 %2 %16\n" // &gl_GlobalInvocationId.x
1212*03ce13f7SAndroid Build Coastguard Worker "%23 = OpLoad %10 %22\n" // gl_GlobalInvocationId.x
1213*03ce13f7SAndroid Build Coastguard Worker "%24 = OpAccessChain %20 %6 %13 %23\n" // &in.arr[gl_GlobalInvocationId.x]
1214*03ce13f7SAndroid Build Coastguard Worker "%25 = OpLoad %9 %24\n" // in.arr[gl_GlobalInvocationId.x]
1215*03ce13f7SAndroid Build Coastguard Worker "%26 = OpAccessChain %20 %5 %13 %23\n" // &out.arr[gl_GlobalInvocationId.x]
1216*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
1217*03ce13f7SAndroid Build Coastguard Worker // %25 = in value
1218*03ce13f7SAndroid Build Coastguard Worker "%27 = OpSMod %9 %25 %15\n" // in % 2
1219*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %28 None\n"
1220*03ce13f7SAndroid Build Coastguard Worker "OpSwitch %27 %29 0 %30 1 %31\n"
1221*03ce13f7SAndroid Build Coastguard Worker "%30 = OpLabel\n" // (in % 2) == 0
1222*03ce13f7SAndroid Build Coastguard Worker "%32 = OpIAdd %9 %27 %14\n" // generate an intermediate
1223*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %32\n" // write a value (overwritten later)
1224*03ce13f7SAndroid Build Coastguard Worker "OpBranch %31\n" // fallthrough
1225*03ce13f7SAndroid Build Coastguard Worker "%31 = OpLabel\n" // (in % 2) == 1
1226*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %15\n" // write 2
1227*03ce13f7SAndroid Build Coastguard Worker "OpBranch %28\n"
1228*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLabel\n" // unreachable
1229*03ce13f7SAndroid Build Coastguard Worker "OpUnreachable\n"
1230*03ce13f7SAndroid Build Coastguard Worker "%28 = OpLabel\n" // merge
1231*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
1232*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
1233*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
1234*03ce13f7SAndroid Build Coastguard Worker // clang-format on
1235*03ce13f7SAndroid Build Coastguard Worker
1236*03ce13f7SAndroid Build Coastguard Worker test(
1237*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return 2; });
1238*03ce13f7SAndroid Build Coastguard Worker }
1239*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,SwitchDefaultFallthrough)1240*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchDefaultFallthrough)
1241*03ce13f7SAndroid Build Coastguard Worker {
1242*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
1243*03ce13f7SAndroid Build Coastguard Worker // clang-format off
1244*03ce13f7SAndroid Build Coastguard Worker src <<
1245*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
1246*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
1247*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
1248*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
1249*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
1250*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
1251*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
1252*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
1253*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
1254*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
1255*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
1256*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
1257*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
1258*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
1259*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
1260*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
1261*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
1262*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
1263*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
1264*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeBool\n"
1265*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
1266*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
1267*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
1268*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %12 Uniform\n" // struct{ int32[] }* in
1269*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 0\n" // int32(0)
1270*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %9 1\n" // int32(1)
1271*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %9 2\n" // int32(2)
1272*03ce13f7SAndroid Build Coastguard Worker "%16 = OpConstant %10 0\n" // uint32(0)
1273*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypeVector %10 3\n" // vec4<int32>
1274*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %17\n" // vec4<int32>*
1275*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %18 Input\n" // gl_GlobalInvocationId
1276*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Input %10\n" // uint32*
1277*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %12 Uniform\n" // struct{ int32[] }* out
1278*03ce13f7SAndroid Build Coastguard Worker "%20 = OpTypePointer Uniform %9\n" // int32*
1279*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
1280*03ce13f7SAndroid Build Coastguard Worker "%21 = OpLabel\n"
1281*03ce13f7SAndroid Build Coastguard Worker "%22 = OpAccessChain %19 %2 %16\n" // &gl_GlobalInvocationId.x
1282*03ce13f7SAndroid Build Coastguard Worker "%23 = OpLoad %10 %22\n" // gl_GlobalInvocationId.x
1283*03ce13f7SAndroid Build Coastguard Worker "%24 = OpAccessChain %20 %6 %13 %23\n" // &in.arr[gl_GlobalInvocationId.x]
1284*03ce13f7SAndroid Build Coastguard Worker "%25 = OpLoad %9 %24\n" // in.arr[gl_GlobalInvocationId.x]
1285*03ce13f7SAndroid Build Coastguard Worker "%26 = OpAccessChain %20 %5 %13 %23\n" // &out.arr[gl_GlobalInvocationId.x]
1286*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
1287*03ce13f7SAndroid Build Coastguard Worker // %25 = in value
1288*03ce13f7SAndroid Build Coastguard Worker "%27 = OpSMod %9 %25 %15\n" // in % 2
1289*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %28 None\n"
1290*03ce13f7SAndroid Build Coastguard Worker "OpSwitch %27 %29 0 %30 1 %31\n"
1291*03ce13f7SAndroid Build Coastguard Worker "%30 = OpLabel\n" // (in % 2) == 0
1292*03ce13f7SAndroid Build Coastguard Worker "%32 = OpIAdd %9 %27 %14\n" // generate an intermediate
1293*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %32\n" // write a value (overwritten later)
1294*03ce13f7SAndroid Build Coastguard Worker "OpBranch %29\n" // fallthrough
1295*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLabel\n" // default
1296*03ce13f7SAndroid Build Coastguard Worker "%33 = OpIAdd %9 %27 %14\n" // generate an intermediate
1297*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %33\n" // write a value (overwritten later)
1298*03ce13f7SAndroid Build Coastguard Worker "OpBranch %31\n" // fallthrough
1299*03ce13f7SAndroid Build Coastguard Worker "%31 = OpLabel\n" // (in % 2) == 1
1300*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %15\n" // write 2
1301*03ce13f7SAndroid Build Coastguard Worker "OpBranch %28\n"
1302*03ce13f7SAndroid Build Coastguard Worker "%28 = OpLabel\n" // merge
1303*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
1304*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
1305*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
1306*03ce13f7SAndroid Build Coastguard Worker // clang-format on
1307*03ce13f7SAndroid Build Coastguard Worker
1308*03ce13f7SAndroid Build Coastguard Worker test(
1309*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return 2; });
1310*03ce13f7SAndroid Build Coastguard Worker }
1311*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,SwitchPhi)1312*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchPhi)
1313*03ce13f7SAndroid Build Coastguard Worker {
1314*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
1315*03ce13f7SAndroid Build Coastguard Worker // clang-format off
1316*03ce13f7SAndroid Build Coastguard Worker src <<
1317*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
1318*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
1319*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %1 \"main\" %2\n"
1320*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %1 LocalSize " <<
1321*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
1322*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
1323*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
1324*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 ArrayStride 4\n"
1325*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %4 0 Offset 0\n"
1326*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 BufferBlock\n"
1327*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 DescriptorSet 0\n"
1328*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 Binding 1\n"
1329*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %2 BuiltIn GlobalInvocationId\n"
1330*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
1331*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
1332*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeVoid\n"
1333*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeFunction %7\n" // void()
1334*03ce13f7SAndroid Build Coastguard Worker "%9 = OpTypeInt 32 1\n" // int32
1335*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeInt 32 0\n" // uint32
1336*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeBool\n"
1337*03ce13f7SAndroid Build Coastguard Worker "%3 = OpTypeRuntimeArray %9\n" // int32[]
1338*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeStruct %3\n" // struct{ int32[] }
1339*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypePointer Uniform %4\n" // struct{ int32[] }*
1340*03ce13f7SAndroid Build Coastguard Worker "%5 = OpVariable %12 Uniform\n" // struct{ int32[] }* in
1341*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %9 0\n" // int32(0)
1342*03ce13f7SAndroid Build Coastguard Worker "%14 = OpConstant %9 1\n" // int32(1)
1343*03ce13f7SAndroid Build Coastguard Worker "%15 = OpConstant %9 2\n" // int32(2)
1344*03ce13f7SAndroid Build Coastguard Worker "%16 = OpConstant %10 0\n" // uint32(0)
1345*03ce13f7SAndroid Build Coastguard Worker "%17 = OpTypeVector %10 3\n" // vec4<int32>
1346*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %17\n" // vec4<int32>*
1347*03ce13f7SAndroid Build Coastguard Worker "%2 = OpVariable %18 Input\n" // gl_GlobalInvocationId
1348*03ce13f7SAndroid Build Coastguard Worker "%19 = OpTypePointer Input %10\n" // uint32*
1349*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %12 Uniform\n" // struct{ int32[] }* out
1350*03ce13f7SAndroid Build Coastguard Worker "%20 = OpTypePointer Uniform %9\n" // int32*
1351*03ce13f7SAndroid Build Coastguard Worker "%1 = OpFunction %7 None %8\n" // -- Function begin --
1352*03ce13f7SAndroid Build Coastguard Worker "%21 = OpLabel\n"
1353*03ce13f7SAndroid Build Coastguard Worker "%22 = OpAccessChain %19 %2 %16\n" // &gl_GlobalInvocationId.x
1354*03ce13f7SAndroid Build Coastguard Worker "%23 = OpLoad %10 %22\n" // gl_GlobalInvocationId.x
1355*03ce13f7SAndroid Build Coastguard Worker "%24 = OpAccessChain %20 %6 %13 %23\n" // &in.arr[gl_GlobalInvocationId.x]
1356*03ce13f7SAndroid Build Coastguard Worker "%25 = OpLoad %9 %24\n" // in.arr[gl_GlobalInvocationId.x]
1357*03ce13f7SAndroid Build Coastguard Worker "%26 = OpAccessChain %20 %5 %13 %23\n" // &out.arr[gl_GlobalInvocationId.x]
1358*03ce13f7SAndroid Build Coastguard Worker // Start of branch logic
1359*03ce13f7SAndroid Build Coastguard Worker // %25 = in value
1360*03ce13f7SAndroid Build Coastguard Worker "%27 = OpSMod %9 %25 %15\n" // in % 2
1361*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %28 None\n"
1362*03ce13f7SAndroid Build Coastguard Worker "OpSwitch %27 %29 1 %30\n"
1363*03ce13f7SAndroid Build Coastguard Worker "%30 = OpLabel\n" // (in % 2) == 1
1364*03ce13f7SAndroid Build Coastguard Worker "OpBranch %28\n"
1365*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLabel\n" // (in % 2) != 1
1366*03ce13f7SAndroid Build Coastguard Worker "OpBranch %28\n"
1367*03ce13f7SAndroid Build Coastguard Worker "%28 = OpLabel\n" // merge
1368*03ce13f7SAndroid Build Coastguard Worker "%31 = OpPhi %9 %14 %30 %15 %29\n" // (in % 2) == 1 ? 1 : 2
1369*03ce13f7SAndroid Build Coastguard Worker "OpStore %26 %31\n"
1370*03ce13f7SAndroid Build Coastguard Worker // End of branch logic
1371*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
1372*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
1373*03ce13f7SAndroid Build Coastguard Worker // clang-format on
1374*03ce13f7SAndroid Build Coastguard Worker
1375*03ce13f7SAndroid Build Coastguard Worker test(
1376*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 1 ? 1 : 2; });
1377*03ce13f7SAndroid Build Coastguard Worker }
1378*03ce13f7SAndroid Build Coastguard Worker
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest,LoopDivergentMergePhi)1379*03ce13f7SAndroid Build Coastguard Worker TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, LoopDivergentMergePhi)
1380*03ce13f7SAndroid Build Coastguard Worker {
1381*03ce13f7SAndroid Build Coastguard Worker // #version 450
1382*03ce13f7SAndroid Build Coastguard Worker // layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
1383*03ce13f7SAndroid Build Coastguard Worker // layout(binding = 0, std430) buffer InBuffer
1384*03ce13f7SAndroid Build Coastguard Worker // {
1385*03ce13f7SAndroid Build Coastguard Worker // int Data[];
1386*03ce13f7SAndroid Build Coastguard Worker // } In;
1387*03ce13f7SAndroid Build Coastguard Worker // layout(binding = 1, std430) buffer OutBuffer
1388*03ce13f7SAndroid Build Coastguard Worker // {
1389*03ce13f7SAndroid Build Coastguard Worker // int Data[];
1390*03ce13f7SAndroid Build Coastguard Worker // } Out;
1391*03ce13f7SAndroid Build Coastguard Worker // void main()
1392*03ce13f7SAndroid Build Coastguard Worker // {
1393*03ce13f7SAndroid Build Coastguard Worker // int phi = 0;
1394*03ce13f7SAndroid Build Coastguard Worker // uint lane = gl_GlobalInvocationID.x % 4;
1395*03ce13f7SAndroid Build Coastguard Worker // for (uint i = 0; i < 4; i++)
1396*03ce13f7SAndroid Build Coastguard Worker // {
1397*03ce13f7SAndroid Build Coastguard Worker // if (lane == i)
1398*03ce13f7SAndroid Build Coastguard Worker // {
1399*03ce13f7SAndroid Build Coastguard Worker // phi = In.Data[gl_GlobalInvocationID.x];
1400*03ce13f7SAndroid Build Coastguard Worker // break;
1401*03ce13f7SAndroid Build Coastguard Worker // }
1402*03ce13f7SAndroid Build Coastguard Worker // }
1403*03ce13f7SAndroid Build Coastguard Worker // Out.Data[gl_GlobalInvocationID.x] = phi;
1404*03ce13f7SAndroid Build Coastguard Worker // }
1405*03ce13f7SAndroid Build Coastguard Worker std::stringstream src;
1406*03ce13f7SAndroid Build Coastguard Worker // clang-format off
1407*03ce13f7SAndroid Build Coastguard Worker src <<
1408*03ce13f7SAndroid Build Coastguard Worker "OpCapability Shader\n"
1409*03ce13f7SAndroid Build Coastguard Worker "%1 = OpExtInstImport \"GLSL.std.450\"\n"
1410*03ce13f7SAndroid Build Coastguard Worker "OpMemoryModel Logical GLSL450\n"
1411*03ce13f7SAndroid Build Coastguard Worker "OpEntryPoint GLCompute %2 \"main\" %3\n"
1412*03ce13f7SAndroid Build Coastguard Worker "OpExecutionMode %2 LocalSize " <<
1413*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeX << " " <<
1414*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeY << " " <<
1415*03ce13f7SAndroid Build Coastguard Worker GetParam().localSizeZ << "\n" <<
1416*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %3 BuiltIn GlobalInvocationId\n"
1417*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %4 ArrayStride 4\n"
1418*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %5 0 Offset 0\n"
1419*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %5 BufferBlock\n"
1420*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 DescriptorSet 0\n"
1421*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %6 Binding 0\n"
1422*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %7 ArrayStride 4\n"
1423*03ce13f7SAndroid Build Coastguard Worker "OpMemberDecorate %8 0 Offset 0\n"
1424*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %8 BufferBlock\n"
1425*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %9 DescriptorSet 0\n"
1426*03ce13f7SAndroid Build Coastguard Worker "OpDecorate %9 Binding 1\n"
1427*03ce13f7SAndroid Build Coastguard Worker "%10 = OpTypeVoid\n"
1428*03ce13f7SAndroid Build Coastguard Worker "%11 = OpTypeFunction %10\n"
1429*03ce13f7SAndroid Build Coastguard Worker "%12 = OpTypeInt 32 1\n"
1430*03ce13f7SAndroid Build Coastguard Worker "%13 = OpConstant %12 0\n"
1431*03ce13f7SAndroid Build Coastguard Worker "%14 = OpTypeInt 32 0\n"
1432*03ce13f7SAndroid Build Coastguard Worker "%15 = OpTypeVector %14 3\n"
1433*03ce13f7SAndroid Build Coastguard Worker "%16 = OpTypePointer Input %15\n"
1434*03ce13f7SAndroid Build Coastguard Worker "%3 = OpVariable %16 Input\n"
1435*03ce13f7SAndroid Build Coastguard Worker "%17 = OpConstant %14 0\n"
1436*03ce13f7SAndroid Build Coastguard Worker "%18 = OpTypePointer Input %14\n"
1437*03ce13f7SAndroid Build Coastguard Worker "%19 = OpConstant %14 4\n"
1438*03ce13f7SAndroid Build Coastguard Worker "%20 = OpTypeBool\n"
1439*03ce13f7SAndroid Build Coastguard Worker "%4 = OpTypeRuntimeArray %12\n"
1440*03ce13f7SAndroid Build Coastguard Worker "%5 = OpTypeStruct %4\n"
1441*03ce13f7SAndroid Build Coastguard Worker "%21 = OpTypePointer Uniform %5\n"
1442*03ce13f7SAndroid Build Coastguard Worker "%6 = OpVariable %21 Uniform\n"
1443*03ce13f7SAndroid Build Coastguard Worker "%22 = OpTypePointer Uniform %12\n"
1444*03ce13f7SAndroid Build Coastguard Worker "%23 = OpConstant %12 1\n"
1445*03ce13f7SAndroid Build Coastguard Worker "%7 = OpTypeRuntimeArray %12\n"
1446*03ce13f7SAndroid Build Coastguard Worker "%8 = OpTypeStruct %7\n"
1447*03ce13f7SAndroid Build Coastguard Worker "%24 = OpTypePointer Uniform %8\n"
1448*03ce13f7SAndroid Build Coastguard Worker "%9 = OpVariable %24 Uniform\n"
1449*03ce13f7SAndroid Build Coastguard Worker "%2 = OpFunction %10 None %11\n"
1450*03ce13f7SAndroid Build Coastguard Worker "%25 = OpLabel\n"
1451*03ce13f7SAndroid Build Coastguard Worker "%26 = OpAccessChain %18 %3 %17\n"
1452*03ce13f7SAndroid Build Coastguard Worker "%27 = OpLoad %14 %26\n"
1453*03ce13f7SAndroid Build Coastguard Worker "%28 = OpUMod %14 %27 %19\n"
1454*03ce13f7SAndroid Build Coastguard Worker "OpBranch %29\n"
1455*03ce13f7SAndroid Build Coastguard Worker "%29 = OpLabel\n"
1456*03ce13f7SAndroid Build Coastguard Worker "%30 = OpPhi %14 %17 %25 %31 %32\n"
1457*03ce13f7SAndroid Build Coastguard Worker "%33 = OpULessThan %20 %30 %19\n"
1458*03ce13f7SAndroid Build Coastguard Worker "OpLoopMerge %34 %32 None\n"
1459*03ce13f7SAndroid Build Coastguard Worker "OpBranchConditional %33 %35 %34\n"
1460*03ce13f7SAndroid Build Coastguard Worker "%35 = OpLabel\n"
1461*03ce13f7SAndroid Build Coastguard Worker "%36 = OpIEqual %20 %28 %30\n"
1462*03ce13f7SAndroid Build Coastguard Worker "OpSelectionMerge %37 None\n"
1463*03ce13f7SAndroid Build Coastguard Worker "OpBranchConditional %36 %38 %37\n"
1464*03ce13f7SAndroid Build Coastguard Worker "%38 = OpLabel\n"
1465*03ce13f7SAndroid Build Coastguard Worker "%39 = OpAccessChain %22 %6 %13 %27\n"
1466*03ce13f7SAndroid Build Coastguard Worker "%40 = OpLoad %12 %39\n"
1467*03ce13f7SAndroid Build Coastguard Worker "OpBranch %34\n"
1468*03ce13f7SAndroid Build Coastguard Worker "%37 = OpLabel\n"
1469*03ce13f7SAndroid Build Coastguard Worker "OpBranch %32\n"
1470*03ce13f7SAndroid Build Coastguard Worker "%32 = OpLabel\n"
1471*03ce13f7SAndroid Build Coastguard Worker "%31 = OpIAdd %14 %30 %23\n"
1472*03ce13f7SAndroid Build Coastguard Worker "OpBranch %29\n"
1473*03ce13f7SAndroid Build Coastguard Worker "%34 = OpLabel\n"
1474*03ce13f7SAndroid Build Coastguard Worker "%41 = OpPhi %12 %13 %29 %40 %38\n" // %40: phi
1475*03ce13f7SAndroid Build Coastguard Worker "%42 = OpAccessChain %22 %9 %13 %27\n"
1476*03ce13f7SAndroid Build Coastguard Worker "OpStore %42 %41\n"
1477*03ce13f7SAndroid Build Coastguard Worker "OpReturn\n"
1478*03ce13f7SAndroid Build Coastguard Worker "OpFunctionEnd\n";
1479*03ce13f7SAndroid Build Coastguard Worker // clang-format on
1480*03ce13f7SAndroid Build Coastguard Worker
1481*03ce13f7SAndroid Build Coastguard Worker test(
1482*03ce13f7SAndroid Build Coastguard Worker src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i; });
1483*03ce13f7SAndroid Build Coastguard Worker }
1484