xref: /aosp_15_r20/external/swiftshader/tests/VulkanUnitTests/Device.cpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2019 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 
Device()18*03ce13f7SAndroid Build Coastguard Worker Device::Device()
19*03ce13f7SAndroid Build Coastguard Worker     : driver(nullptr)
20*03ce13f7SAndroid Build Coastguard Worker     , device(nullptr)
21*03ce13f7SAndroid Build Coastguard Worker     , physicalDevice(nullptr)
22*03ce13f7SAndroid Build Coastguard Worker     , queueFamilyIndex(0)
23*03ce13f7SAndroid Build Coastguard Worker {}
24*03ce13f7SAndroid Build Coastguard Worker 
Device(const Driver * driver,VkDevice device,VkPhysicalDevice physicalDevice,uint32_t queueFamilyIndex)25*03ce13f7SAndroid Build Coastguard Worker Device::Device(
26*03ce13f7SAndroid Build Coastguard Worker     const Driver *driver, VkDevice device, VkPhysicalDevice physicalDevice,
27*03ce13f7SAndroid Build Coastguard Worker     uint32_t queueFamilyIndex)
28*03ce13f7SAndroid Build Coastguard Worker     : driver(driver)
29*03ce13f7SAndroid Build Coastguard Worker     , device(device)
30*03ce13f7SAndroid Build Coastguard Worker     , physicalDevice(physicalDevice)
31*03ce13f7SAndroid Build Coastguard Worker     , queueFamilyIndex(queueFamilyIndex)
32*03ce13f7SAndroid Build Coastguard Worker {}
33*03ce13f7SAndroid Build Coastguard Worker 
~Device()34*03ce13f7SAndroid Build Coastguard Worker Device::~Device()
35*03ce13f7SAndroid Build Coastguard Worker {
36*03ce13f7SAndroid Build Coastguard Worker 	if(device != nullptr)
37*03ce13f7SAndroid Build Coastguard Worker 	{
38*03ce13f7SAndroid Build Coastguard Worker 		driver->vkDeviceWaitIdle(device);
39*03ce13f7SAndroid Build Coastguard Worker 		driver->vkDestroyDevice(device, nullptr);
40*03ce13f7SAndroid Build Coastguard Worker 	}
41*03ce13f7SAndroid Build Coastguard Worker }
42*03ce13f7SAndroid Build Coastguard Worker 
IsValid() const43*03ce13f7SAndroid Build Coastguard Worker bool Device::IsValid() const
44*03ce13f7SAndroid Build Coastguard Worker {
45*03ce13f7SAndroid Build Coastguard Worker 	return device != nullptr;
46*03ce13f7SAndroid Build Coastguard Worker }
47*03ce13f7SAndroid Build Coastguard Worker 
CreateComputeDevice(const Driver * driver,VkInstance instance,std::unique_ptr<Device> & out)48*03ce13f7SAndroid Build Coastguard Worker VkResult Device::CreateComputeDevice(
49*03ce13f7SAndroid Build Coastguard Worker     const Driver *driver, VkInstance instance, std::unique_ptr<Device> &out)
50*03ce13f7SAndroid Build Coastguard Worker {
51*03ce13f7SAndroid Build Coastguard Worker 	VkResult result;
52*03ce13f7SAndroid Build Coastguard Worker 
53*03ce13f7SAndroid Build Coastguard Worker 	// Gather all physical devices
54*03ce13f7SAndroid Build Coastguard Worker 	std::vector<VkPhysicalDevice> physicalDevices;
55*03ce13f7SAndroid Build Coastguard Worker 	result = GetPhysicalDevices(driver, instance, physicalDevices);
56*03ce13f7SAndroid Build Coastguard Worker 	if(result != VK_SUCCESS)
57*03ce13f7SAndroid Build Coastguard Worker 	{
58*03ce13f7SAndroid Build Coastguard Worker 		return result;
59*03ce13f7SAndroid Build Coastguard Worker 	}
60*03ce13f7SAndroid Build Coastguard Worker 
61*03ce13f7SAndroid Build Coastguard Worker 	// Inspect each physical device's queue families for compute support.
62*03ce13f7SAndroid Build Coastguard Worker 	for(auto physicalDevice : physicalDevices)
63*03ce13f7SAndroid Build Coastguard Worker 	{
64*03ce13f7SAndroid Build Coastguard Worker 		int queueFamilyIndex = GetComputeQueueFamilyIndex(driver, physicalDevice);
65*03ce13f7SAndroid Build Coastguard Worker 		if(queueFamilyIndex < 0)
66*03ce13f7SAndroid Build Coastguard Worker 		{
67*03ce13f7SAndroid Build Coastguard Worker 			continue;
68*03ce13f7SAndroid Build Coastguard Worker 		}
69*03ce13f7SAndroid Build Coastguard Worker 
70*03ce13f7SAndroid Build Coastguard Worker 		const float queuePrioritory = 1.0f;
71*03ce13f7SAndroid Build Coastguard Worker 		const VkDeviceQueueCreateInfo deviceQueueCreateInfo = {
72*03ce13f7SAndroid Build Coastguard Worker 			VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,  // sType
73*03ce13f7SAndroid Build Coastguard Worker 			nullptr,                                     // pNext
74*03ce13f7SAndroid Build Coastguard Worker 			0,                                           // flags
75*03ce13f7SAndroid Build Coastguard Worker 			(uint32_t)queueFamilyIndex,                  // queueFamilyIndex
76*03ce13f7SAndroid Build Coastguard Worker 			1,                                           // queueCount
77*03ce13f7SAndroid Build Coastguard Worker 			&queuePrioritory,                            // pQueuePriorities
78*03ce13f7SAndroid Build Coastguard Worker 		};
79*03ce13f7SAndroid Build Coastguard Worker 
80*03ce13f7SAndroid Build Coastguard Worker 		const VkDeviceCreateInfo deviceCreateInfo = {
81*03ce13f7SAndroid Build Coastguard Worker 			VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,  // sType
82*03ce13f7SAndroid Build Coastguard Worker 			nullptr,                               // pNext
83*03ce13f7SAndroid Build Coastguard Worker 			0,                                     // flags
84*03ce13f7SAndroid Build Coastguard Worker 			1,                                     // queueCreateInfoCount
85*03ce13f7SAndroid Build Coastguard Worker 			&deviceQueueCreateInfo,                // pQueueCreateInfos
86*03ce13f7SAndroid Build Coastguard Worker 			0,                                     // enabledLayerCount
87*03ce13f7SAndroid Build Coastguard Worker 			nullptr,                               // ppEnabledLayerNames
88*03ce13f7SAndroid Build Coastguard Worker 			0,                                     // enabledExtensionCount
89*03ce13f7SAndroid Build Coastguard Worker 			nullptr,                               // ppEnabledExtensionNames
90*03ce13f7SAndroid Build Coastguard Worker 			nullptr,                               // pEnabledFeatures
91*03ce13f7SAndroid Build Coastguard Worker 		};
92*03ce13f7SAndroid Build Coastguard Worker 
93*03ce13f7SAndroid Build Coastguard Worker 		VkDevice device;
94*03ce13f7SAndroid Build Coastguard Worker 		result = driver->vkCreateDevice(physicalDevice, &deviceCreateInfo, nullptr, &device);
95*03ce13f7SAndroid Build Coastguard Worker 		if(result != VK_SUCCESS)
96*03ce13f7SAndroid Build Coastguard Worker 		{
97*03ce13f7SAndroid Build Coastguard Worker 			return result;
98*03ce13f7SAndroid Build Coastguard Worker 		}
99*03ce13f7SAndroid Build Coastguard Worker 
100*03ce13f7SAndroid Build Coastguard Worker 		out.reset(new Device(driver, device, physicalDevice, static_cast<uint32_t>(queueFamilyIndex)));
101*03ce13f7SAndroid Build Coastguard Worker 		return VK_SUCCESS;
102*03ce13f7SAndroid Build Coastguard Worker 	}
103*03ce13f7SAndroid Build Coastguard Worker 
104*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
105*03ce13f7SAndroid Build Coastguard Worker }
106*03ce13f7SAndroid Build Coastguard Worker 
GetComputeQueueFamilyIndex(const Driver * driver,VkPhysicalDevice device)107*03ce13f7SAndroid Build Coastguard Worker int Device::GetComputeQueueFamilyIndex(
108*03ce13f7SAndroid Build Coastguard Worker     const Driver *driver, VkPhysicalDevice device)
109*03ce13f7SAndroid Build Coastguard Worker {
110*03ce13f7SAndroid Build Coastguard Worker 	auto properties = GetPhysicalDeviceQueueFamilyProperties(driver, device);
111*03ce13f7SAndroid Build Coastguard Worker 	for(uint32_t i = 0; i < properties.size(); i++)
112*03ce13f7SAndroid Build Coastguard Worker 	{
113*03ce13f7SAndroid Build Coastguard Worker 		if((properties[i].queueFlags & VK_QUEUE_COMPUTE_BIT) != 0)
114*03ce13f7SAndroid Build Coastguard Worker 		{
115*03ce13f7SAndroid Build Coastguard Worker 			return static_cast<int>(i);
116*03ce13f7SAndroid Build Coastguard Worker 		}
117*03ce13f7SAndroid Build Coastguard Worker 	}
118*03ce13f7SAndroid Build Coastguard Worker 	return -1;
119*03ce13f7SAndroid Build Coastguard Worker }
120*03ce13f7SAndroid Build Coastguard Worker 
121*03ce13f7SAndroid Build Coastguard Worker std::vector<VkQueueFamilyProperties>
GetPhysicalDeviceQueueFamilyProperties(const Driver * driver,VkPhysicalDevice device)122*03ce13f7SAndroid Build Coastguard Worker Device::GetPhysicalDeviceQueueFamilyProperties(
123*03ce13f7SAndroid Build Coastguard Worker     const Driver *driver, VkPhysicalDevice device)
124*03ce13f7SAndroid Build Coastguard Worker {
125*03ce13f7SAndroid Build Coastguard Worker 	std::vector<VkQueueFamilyProperties> out;
126*03ce13f7SAndroid Build Coastguard Worker 	uint32_t count = 0;
127*03ce13f7SAndroid Build Coastguard Worker 	driver->vkGetPhysicalDeviceQueueFamilyProperties(device, &count, nullptr);
128*03ce13f7SAndroid Build Coastguard Worker 	out.resize(count);
129*03ce13f7SAndroid Build Coastguard Worker 	driver->vkGetPhysicalDeviceQueueFamilyProperties(device, &count, out.data());
130*03ce13f7SAndroid Build Coastguard Worker 	return out;
131*03ce13f7SAndroid Build Coastguard Worker }
132*03ce13f7SAndroid Build Coastguard Worker 
GetPhysicalDevices(const Driver * driver,VkInstance instance,std::vector<VkPhysicalDevice> & out)133*03ce13f7SAndroid Build Coastguard Worker VkResult Device::GetPhysicalDevices(
134*03ce13f7SAndroid Build Coastguard Worker     const Driver *driver, VkInstance instance,
135*03ce13f7SAndroid Build Coastguard Worker     std::vector<VkPhysicalDevice> &out)
136*03ce13f7SAndroid Build Coastguard Worker {
137*03ce13f7SAndroid Build Coastguard Worker 	uint32_t count = 0;
138*03ce13f7SAndroid Build Coastguard Worker 	VkResult result = driver->vkEnumeratePhysicalDevices(instance, &count, 0);
139*03ce13f7SAndroid Build Coastguard Worker 	if(result != VK_SUCCESS)
140*03ce13f7SAndroid Build Coastguard Worker 	{
141*03ce13f7SAndroid Build Coastguard Worker 		return result;
142*03ce13f7SAndroid Build Coastguard Worker 	}
143*03ce13f7SAndroid Build Coastguard Worker 	out.resize(count);
144*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkEnumeratePhysicalDevices(instance, &count, out.data());
145*03ce13f7SAndroid Build Coastguard Worker }
146*03ce13f7SAndroid Build Coastguard Worker 
CreateStorageBuffer(VkDeviceMemory memory,VkDeviceSize size,VkDeviceSize offset,VkBuffer * out) const147*03ce13f7SAndroid Build Coastguard Worker VkResult Device::CreateStorageBuffer(
148*03ce13f7SAndroid Build Coastguard Worker     VkDeviceMemory memory, VkDeviceSize size,
149*03ce13f7SAndroid Build Coastguard Worker     VkDeviceSize offset, VkBuffer *out) const
150*03ce13f7SAndroid Build Coastguard Worker {
151*03ce13f7SAndroid Build Coastguard Worker 	const VkBufferCreateInfo info = {
152*03ce13f7SAndroid Build Coastguard Worker 		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,  // sType
153*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                               // pNext
154*03ce13f7SAndroid Build Coastguard Worker 		0,                                     // flags
155*03ce13f7SAndroid Build Coastguard Worker 		size,                                  // size
156*03ce13f7SAndroid Build Coastguard Worker 		VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,    // usage
157*03ce13f7SAndroid Build Coastguard Worker 		VK_SHARING_MODE_EXCLUSIVE,             // sharingMode
158*03ce13f7SAndroid Build Coastguard Worker 		0,                                     // queueFamilyIndexCount
159*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                               // pQueueFamilyIndices
160*03ce13f7SAndroid Build Coastguard Worker 	};
161*03ce13f7SAndroid Build Coastguard Worker 
162*03ce13f7SAndroid Build Coastguard Worker 	VkBuffer buffer;
163*03ce13f7SAndroid Build Coastguard Worker 	VkResult result = driver->vkCreateBuffer(device, &info, 0, &buffer);
164*03ce13f7SAndroid Build Coastguard Worker 	if(result != VK_SUCCESS)
165*03ce13f7SAndroid Build Coastguard Worker 	{
166*03ce13f7SAndroid Build Coastguard Worker 		return result;
167*03ce13f7SAndroid Build Coastguard Worker 	}
168*03ce13f7SAndroid Build Coastguard Worker 
169*03ce13f7SAndroid Build Coastguard Worker 	result = driver->vkBindBufferMemory(device, buffer, memory, offset);
170*03ce13f7SAndroid Build Coastguard Worker 	if(result != VK_SUCCESS)
171*03ce13f7SAndroid Build Coastguard Worker 	{
172*03ce13f7SAndroid Build Coastguard Worker 		return result;
173*03ce13f7SAndroid Build Coastguard Worker 	}
174*03ce13f7SAndroid Build Coastguard Worker 
175*03ce13f7SAndroid Build Coastguard Worker 	*out = buffer;
176*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
177*03ce13f7SAndroid Build Coastguard Worker }
178*03ce13f7SAndroid Build Coastguard Worker 
DestroyBuffer(VkBuffer buffer) const179*03ce13f7SAndroid Build Coastguard Worker void Device::DestroyBuffer(VkBuffer buffer) const
180*03ce13f7SAndroid Build Coastguard Worker {
181*03ce13f7SAndroid Build Coastguard Worker 	driver->vkDestroyBuffer(device, buffer, nullptr);
182*03ce13f7SAndroid Build Coastguard Worker }
183*03ce13f7SAndroid Build Coastguard Worker 
CreateShaderModule(const std::vector<uint32_t> & spirv,VkShaderModule * out) const184*03ce13f7SAndroid Build Coastguard Worker VkResult Device::CreateShaderModule(
185*03ce13f7SAndroid Build Coastguard Worker     const std::vector<uint32_t> &spirv, VkShaderModule *out) const
186*03ce13f7SAndroid Build Coastguard Worker {
187*03ce13f7SAndroid Build Coastguard Worker 	VkShaderModuleCreateInfo info = {
188*03ce13f7SAndroid Build Coastguard Worker 		VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,  // sType
189*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                                      // pNext
190*03ce13f7SAndroid Build Coastguard Worker 		0,                                            // flags
191*03ce13f7SAndroid Build Coastguard Worker 		spirv.size() * 4,                             // codeSize
192*03ce13f7SAndroid Build Coastguard Worker 		spirv.data(),                                 // pCode
193*03ce13f7SAndroid Build Coastguard Worker 	};
194*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkCreateShaderModule(device, &info, 0, out);
195*03ce13f7SAndroid Build Coastguard Worker }
196*03ce13f7SAndroid Build Coastguard Worker 
DestroyShaderModule(VkShaderModule shaderModule) const197*03ce13f7SAndroid Build Coastguard Worker void Device::DestroyShaderModule(VkShaderModule shaderModule) const
198*03ce13f7SAndroid Build Coastguard Worker {
199*03ce13f7SAndroid Build Coastguard Worker 	driver->vkDestroyShaderModule(device, shaderModule, nullptr);
200*03ce13f7SAndroid Build Coastguard Worker }
201*03ce13f7SAndroid Build Coastguard Worker 
CreateDescriptorSetLayout(const std::vector<VkDescriptorSetLayoutBinding> & bindings,VkDescriptorSetLayout * out) const202*03ce13f7SAndroid Build Coastguard Worker VkResult Device::CreateDescriptorSetLayout(
203*03ce13f7SAndroid Build Coastguard Worker     const std::vector<VkDescriptorSetLayoutBinding> &bindings,
204*03ce13f7SAndroid Build Coastguard Worker     VkDescriptorSetLayout *out) const
205*03ce13f7SAndroid Build Coastguard Worker {
206*03ce13f7SAndroid Build Coastguard Worker 	VkDescriptorSetLayoutCreateInfo info = {
207*03ce13f7SAndroid Build Coastguard Worker 		VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,  // sType
208*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                                              // pNext
209*03ce13f7SAndroid Build Coastguard Worker 		0,                                                    // flags
210*03ce13f7SAndroid Build Coastguard Worker 		(uint32_t)bindings.size(),                            // bindingCount
211*03ce13f7SAndroid Build Coastguard Worker 		bindings.data(),                                      // pBindings
212*03ce13f7SAndroid Build Coastguard Worker 	};
213*03ce13f7SAndroid Build Coastguard Worker 
214*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkCreateDescriptorSetLayout(device, &info, 0, out);
215*03ce13f7SAndroid Build Coastguard Worker }
216*03ce13f7SAndroid Build Coastguard Worker 
DestroyDescriptorSetLayout(VkDescriptorSetLayout descriptorSetLayout) const217*03ce13f7SAndroid Build Coastguard Worker void Device::DestroyDescriptorSetLayout(VkDescriptorSetLayout descriptorSetLayout) const
218*03ce13f7SAndroid Build Coastguard Worker {
219*03ce13f7SAndroid Build Coastguard Worker 	driver->vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
220*03ce13f7SAndroid Build Coastguard Worker }
221*03ce13f7SAndroid Build Coastguard Worker 
CreatePipelineLayout(VkDescriptorSetLayout layout,VkPipelineLayout * out) const222*03ce13f7SAndroid Build Coastguard Worker VkResult Device::CreatePipelineLayout(
223*03ce13f7SAndroid Build Coastguard Worker     VkDescriptorSetLayout layout, VkPipelineLayout *out) const
224*03ce13f7SAndroid Build Coastguard Worker {
225*03ce13f7SAndroid Build Coastguard Worker 	VkPipelineLayoutCreateInfo info = {
226*03ce13f7SAndroid Build Coastguard Worker 		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,  // sType
227*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                                        // pNext
228*03ce13f7SAndroid Build Coastguard Worker 		0,                                              // flags
229*03ce13f7SAndroid Build Coastguard Worker 		1,                                              // setLayoutCount
230*03ce13f7SAndroid Build Coastguard Worker 		&layout,                                        // pSetLayouts
231*03ce13f7SAndroid Build Coastguard Worker 		0,                                              // pushConstantRangeCount
232*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                                        // pPushConstantRanges
233*03ce13f7SAndroid Build Coastguard Worker 	};
234*03ce13f7SAndroid Build Coastguard Worker 
235*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkCreatePipelineLayout(device, &info, 0, out);
236*03ce13f7SAndroid Build Coastguard Worker }
237*03ce13f7SAndroid Build Coastguard Worker 
DestroyPipelineLayout(VkPipelineLayout pipelineLayout) const238*03ce13f7SAndroid Build Coastguard Worker void Device::DestroyPipelineLayout(VkPipelineLayout pipelineLayout) const
239*03ce13f7SAndroid Build Coastguard Worker {
240*03ce13f7SAndroid Build Coastguard Worker 	driver->vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
241*03ce13f7SAndroid Build Coastguard Worker }
242*03ce13f7SAndroid Build Coastguard Worker 
CreateComputePipeline(VkShaderModule module,VkPipelineLayout pipelineLayout,VkPipeline * out) const243*03ce13f7SAndroid Build Coastguard Worker VkResult Device::CreateComputePipeline(
244*03ce13f7SAndroid Build Coastguard Worker     VkShaderModule module, VkPipelineLayout pipelineLayout,
245*03ce13f7SAndroid Build Coastguard Worker     VkPipeline *out) const
246*03ce13f7SAndroid Build Coastguard Worker {
247*03ce13f7SAndroid Build Coastguard Worker 	VkComputePipelineCreateInfo info = {
248*03ce13f7SAndroid Build Coastguard Worker 		VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,  // sType
249*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                                         // pNext
250*03ce13f7SAndroid Build Coastguard Worker 		0,                                               // flags
251*03ce13f7SAndroid Build Coastguard Worker 		{
252*03ce13f7SAndroid Build Coastguard Worker 		    // stage
253*03ce13f7SAndroid Build Coastguard Worker 		    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,  // sType
254*03ce13f7SAndroid Build Coastguard Worker 		    nullptr,                                              // pNext
255*03ce13f7SAndroid Build Coastguard Worker 		    0,                                                    // flags
256*03ce13f7SAndroid Build Coastguard Worker 		    VK_SHADER_STAGE_COMPUTE_BIT,                          // stage
257*03ce13f7SAndroid Build Coastguard Worker 		    module,                                               // module
258*03ce13f7SAndroid Build Coastguard Worker 		    "main",                                               // pName
259*03ce13f7SAndroid Build Coastguard Worker 		    nullptr,                                              // pSpecializationInfo
260*03ce13f7SAndroid Build Coastguard Worker 		},
261*03ce13f7SAndroid Build Coastguard Worker 		pipelineLayout,  // layout
262*03ce13f7SAndroid Build Coastguard Worker 		0,               // basePipelineHandle
263*03ce13f7SAndroid Build Coastguard Worker 		0,               // basePipelineIndex
264*03ce13f7SAndroid Build Coastguard Worker 	};
265*03ce13f7SAndroid Build Coastguard Worker 
266*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkCreateComputePipelines(device, 0, 1, &info, 0, out);
267*03ce13f7SAndroid Build Coastguard Worker }
268*03ce13f7SAndroid Build Coastguard Worker 
DestroyPipeline(VkPipeline pipeline) const269*03ce13f7SAndroid Build Coastguard Worker void Device::DestroyPipeline(VkPipeline pipeline) const
270*03ce13f7SAndroid Build Coastguard Worker {
271*03ce13f7SAndroid Build Coastguard Worker 	driver->vkDestroyPipeline(device, pipeline, nullptr);
272*03ce13f7SAndroid Build Coastguard Worker }
273*03ce13f7SAndroid Build Coastguard Worker 
CreateStorageBufferDescriptorPool(uint32_t descriptorCount,VkDescriptorPool * out) const274*03ce13f7SAndroid Build Coastguard Worker VkResult Device::CreateStorageBufferDescriptorPool(uint32_t descriptorCount,
275*03ce13f7SAndroid Build Coastguard Worker                                                    VkDescriptorPool *out) const
276*03ce13f7SAndroid Build Coastguard Worker {
277*03ce13f7SAndroid Build Coastguard Worker 	VkDescriptorPoolSize size = {
278*03ce13f7SAndroid Build Coastguard Worker 		VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,  // type
279*03ce13f7SAndroid Build Coastguard Worker 		descriptorCount,                    // descriptorCount
280*03ce13f7SAndroid Build Coastguard Worker 	};
281*03ce13f7SAndroid Build Coastguard Worker 
282*03ce13f7SAndroid Build Coastguard Worker 	VkDescriptorPoolCreateInfo info = {
283*03ce13f7SAndroid Build Coastguard Worker 		VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,  // sType
284*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                                        // pNext
285*03ce13f7SAndroid Build Coastguard Worker 		0,                                              // flags
286*03ce13f7SAndroid Build Coastguard Worker 		1,                                              // maxSets
287*03ce13f7SAndroid Build Coastguard Worker 		1,                                              // poolSizeCount
288*03ce13f7SAndroid Build Coastguard Worker 		&size,                                          // pPoolSizes
289*03ce13f7SAndroid Build Coastguard Worker 	};
290*03ce13f7SAndroid Build Coastguard Worker 
291*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkCreateDescriptorPool(device, &info, 0, out);
292*03ce13f7SAndroid Build Coastguard Worker }
293*03ce13f7SAndroid Build Coastguard Worker 
DestroyDescriptorPool(VkDescriptorPool descriptorPool) const294*03ce13f7SAndroid Build Coastguard Worker void Device::DestroyDescriptorPool(VkDescriptorPool descriptorPool) const
295*03ce13f7SAndroid Build Coastguard Worker {
296*03ce13f7SAndroid Build Coastguard Worker 	driver->vkDestroyDescriptorPool(device, descriptorPool, nullptr);
297*03ce13f7SAndroid Build Coastguard Worker }
298*03ce13f7SAndroid Build Coastguard Worker 
AllocateDescriptorSet(VkDescriptorPool pool,VkDescriptorSetLayout layout,VkDescriptorSet * out) const299*03ce13f7SAndroid Build Coastguard Worker VkResult Device::AllocateDescriptorSet(
300*03ce13f7SAndroid Build Coastguard Worker     VkDescriptorPool pool, VkDescriptorSetLayout layout,
301*03ce13f7SAndroid Build Coastguard Worker     VkDescriptorSet *out) const
302*03ce13f7SAndroid Build Coastguard Worker {
303*03ce13f7SAndroid Build Coastguard Worker 	VkDescriptorSetAllocateInfo info = {
304*03ce13f7SAndroid Build Coastguard Worker 		VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,  // sType
305*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                                         // pNext
306*03ce13f7SAndroid Build Coastguard Worker 		pool,                                            // descriptorPool
307*03ce13f7SAndroid Build Coastguard Worker 		1,                                               // descriptorSetCount
308*03ce13f7SAndroid Build Coastguard Worker 		&layout,                                         // pSetLayouts
309*03ce13f7SAndroid Build Coastguard Worker 	};
310*03ce13f7SAndroid Build Coastguard Worker 
311*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkAllocateDescriptorSets(device, &info, out);
312*03ce13f7SAndroid Build Coastguard Worker }
313*03ce13f7SAndroid Build Coastguard Worker 
UpdateStorageBufferDescriptorSets(VkDescriptorSet descriptorSet,const std::vector<VkDescriptorBufferInfo> & bufferInfos) const314*03ce13f7SAndroid Build Coastguard Worker void Device::UpdateStorageBufferDescriptorSets(
315*03ce13f7SAndroid Build Coastguard Worker     VkDescriptorSet descriptorSet,
316*03ce13f7SAndroid Build Coastguard Worker     const std::vector<VkDescriptorBufferInfo> &bufferInfos) const
317*03ce13f7SAndroid Build Coastguard Worker {
318*03ce13f7SAndroid Build Coastguard Worker 	std::vector<VkWriteDescriptorSet> writes;
319*03ce13f7SAndroid Build Coastguard Worker 	writes.reserve(bufferInfos.size());
320*03ce13f7SAndroid Build Coastguard Worker 	for(uint32_t i = 0; i < bufferInfos.size(); i++)
321*03ce13f7SAndroid Build Coastguard Worker 	{
322*03ce13f7SAndroid Build Coastguard Worker 		writes.push_back(VkWriteDescriptorSet{
323*03ce13f7SAndroid Build Coastguard Worker 		    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,  // sType
324*03ce13f7SAndroid Build Coastguard Worker 		    nullptr,                                 // pNext
325*03ce13f7SAndroid Build Coastguard Worker 		    descriptorSet,                           // dstSet
326*03ce13f7SAndroid Build Coastguard Worker 		    i,                                       // dstBinding
327*03ce13f7SAndroid Build Coastguard Worker 		    0,                                       // dstArrayElement
328*03ce13f7SAndroid Build Coastguard Worker 		    1,                                       // descriptorCount
329*03ce13f7SAndroid Build Coastguard Worker 		    VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,       // descriptorType
330*03ce13f7SAndroid Build Coastguard Worker 		    nullptr,                                 // pImageInfo
331*03ce13f7SAndroid Build Coastguard Worker 		    &bufferInfos[i],                         // pBufferInfo
332*03ce13f7SAndroid Build Coastguard Worker 		    nullptr,                                 // pTexelBufferView
333*03ce13f7SAndroid Build Coastguard Worker 		});
334*03ce13f7SAndroid Build Coastguard Worker 	}
335*03ce13f7SAndroid Build Coastguard Worker 
336*03ce13f7SAndroid Build Coastguard Worker 	driver->vkUpdateDescriptorSets(device, (uint32_t)writes.size(), writes.data(), 0, nullptr);
337*03ce13f7SAndroid Build Coastguard Worker }
338*03ce13f7SAndroid Build Coastguard Worker 
AllocateMemory(size_t size,VkMemoryPropertyFlags flags,VkDeviceMemory * out) const339*03ce13f7SAndroid Build Coastguard Worker VkResult Device::AllocateMemory(size_t size, VkMemoryPropertyFlags flags, VkDeviceMemory *out) const
340*03ce13f7SAndroid Build Coastguard Worker {
341*03ce13f7SAndroid Build Coastguard Worker 	VkPhysicalDeviceMemoryProperties properties;
342*03ce13f7SAndroid Build Coastguard Worker 	driver->vkGetPhysicalDeviceMemoryProperties(physicalDevice, &properties);
343*03ce13f7SAndroid Build Coastguard Worker 
344*03ce13f7SAndroid Build Coastguard Worker 	for(uint32_t type = 0; type < properties.memoryTypeCount; type++)
345*03ce13f7SAndroid Build Coastguard Worker 	{
346*03ce13f7SAndroid Build Coastguard Worker 		if((flags & properties.memoryTypes[type].propertyFlags) == 0)
347*03ce13f7SAndroid Build Coastguard Worker 		{
348*03ce13f7SAndroid Build Coastguard Worker 			continue;  // Type mismatch
349*03ce13f7SAndroid Build Coastguard Worker 		}
350*03ce13f7SAndroid Build Coastguard Worker 
351*03ce13f7SAndroid Build Coastguard Worker 		if(size > properties.memoryHeaps[properties.memoryTypes[type].heapIndex].size)
352*03ce13f7SAndroid Build Coastguard Worker 		{
353*03ce13f7SAndroid Build Coastguard Worker 			continue;  // Too small.
354*03ce13f7SAndroid Build Coastguard Worker 		}
355*03ce13f7SAndroid Build Coastguard Worker 
356*03ce13f7SAndroid Build Coastguard Worker 		const VkMemoryAllocateInfo info = {
357*03ce13f7SAndroid Build Coastguard Worker 			VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,  // sType
358*03ce13f7SAndroid Build Coastguard Worker 			nullptr,                                 // pNext
359*03ce13f7SAndroid Build Coastguard Worker 			size,                                    // allocationSize
360*03ce13f7SAndroid Build Coastguard Worker 			type,                                    // memoryTypeIndex
361*03ce13f7SAndroid Build Coastguard Worker 		};
362*03ce13f7SAndroid Build Coastguard Worker 
363*03ce13f7SAndroid Build Coastguard Worker 		return driver->vkAllocateMemory(device, &info, 0, out);
364*03ce13f7SAndroid Build Coastguard Worker 	}
365*03ce13f7SAndroid Build Coastguard Worker 
366*03ce13f7SAndroid Build Coastguard Worker 	return VK_ERROR_OUT_OF_DEVICE_MEMORY;  // TODO: Change to something not made up?
367*03ce13f7SAndroid Build Coastguard Worker }
368*03ce13f7SAndroid Build Coastguard Worker 
FreeMemory(VkDeviceMemory memory) const369*03ce13f7SAndroid Build Coastguard Worker void Device::FreeMemory(VkDeviceMemory memory) const
370*03ce13f7SAndroid Build Coastguard Worker {
371*03ce13f7SAndroid Build Coastguard Worker 	driver->vkFreeMemory(device, memory, nullptr);
372*03ce13f7SAndroid Build Coastguard Worker }
373*03ce13f7SAndroid Build Coastguard Worker 
MapMemory(VkDeviceMemory memory,VkDeviceSize offset,VkDeviceSize size,VkMemoryMapFlags flags,void ** ppData) const374*03ce13f7SAndroid Build Coastguard Worker VkResult Device::MapMemory(VkDeviceMemory memory, VkDeviceSize offset,
375*03ce13f7SAndroid Build Coastguard Worker                            VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) const
376*03ce13f7SAndroid Build Coastguard Worker {
377*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkMapMemory(device, memory, offset, size, flags, ppData);
378*03ce13f7SAndroid Build Coastguard Worker }
379*03ce13f7SAndroid Build Coastguard Worker 
UnmapMemory(VkDeviceMemory memory) const380*03ce13f7SAndroid Build Coastguard Worker void Device::UnmapMemory(VkDeviceMemory memory) const
381*03ce13f7SAndroid Build Coastguard Worker {
382*03ce13f7SAndroid Build Coastguard Worker 	driver->vkUnmapMemory(device, memory);
383*03ce13f7SAndroid Build Coastguard Worker }
384*03ce13f7SAndroid Build Coastguard Worker 
CreateCommandPool(VkCommandPool * out) const385*03ce13f7SAndroid Build Coastguard Worker VkResult Device::CreateCommandPool(VkCommandPool *out) const
386*03ce13f7SAndroid Build Coastguard Worker {
387*03ce13f7SAndroid Build Coastguard Worker 	VkCommandPoolCreateInfo info = {
388*03ce13f7SAndroid Build Coastguard Worker 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,  // sType
389*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                                     // pNext
390*03ce13f7SAndroid Build Coastguard Worker 		0,                                           // flags
391*03ce13f7SAndroid Build Coastguard Worker 		queueFamilyIndex,                            // queueFamilyIndex
392*03ce13f7SAndroid Build Coastguard Worker 	};
393*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkCreateCommandPool(device, &info, 0, out);
394*03ce13f7SAndroid Build Coastguard Worker }
395*03ce13f7SAndroid Build Coastguard Worker 
DestroyCommandPool(VkCommandPool commandPool) const396*03ce13f7SAndroid Build Coastguard Worker void Device::DestroyCommandPool(VkCommandPool commandPool) const
397*03ce13f7SAndroid Build Coastguard Worker {
398*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkDestroyCommandPool(device, commandPool, nullptr);
399*03ce13f7SAndroid Build Coastguard Worker }
400*03ce13f7SAndroid Build Coastguard Worker 
AllocateCommandBuffer(VkCommandPool pool,VkCommandBuffer * out) const401*03ce13f7SAndroid Build Coastguard Worker VkResult Device::AllocateCommandBuffer(
402*03ce13f7SAndroid Build Coastguard Worker     VkCommandPool pool, VkCommandBuffer *out) const
403*03ce13f7SAndroid Build Coastguard Worker {
404*03ce13f7SAndroid Build Coastguard Worker 	VkCommandBufferAllocateInfo info = {
405*03ce13f7SAndroid Build Coastguard Worker 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,  // sType
406*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                                         // pNext
407*03ce13f7SAndroid Build Coastguard Worker 		pool,                                            // commandPool
408*03ce13f7SAndroid Build Coastguard Worker 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,                 // level
409*03ce13f7SAndroid Build Coastguard Worker 		1,                                               // commandBufferCount
410*03ce13f7SAndroid Build Coastguard Worker 	};
411*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkAllocateCommandBuffers(device, &info, out);
412*03ce13f7SAndroid Build Coastguard Worker }
413*03ce13f7SAndroid Build Coastguard Worker 
FreeCommandBuffer(VkCommandPool pool,VkCommandBuffer buffer)414*03ce13f7SAndroid Build Coastguard Worker void Device::FreeCommandBuffer(VkCommandPool pool, VkCommandBuffer buffer)
415*03ce13f7SAndroid Build Coastguard Worker {
416*03ce13f7SAndroid Build Coastguard Worker 	driver->vkFreeCommandBuffers(device, pool, 1, &buffer);
417*03ce13f7SAndroid Build Coastguard Worker }
418*03ce13f7SAndroid Build Coastguard Worker 
BeginCommandBuffer(VkCommandBufferUsageFlags usage,VkCommandBuffer commandBuffer) const419*03ce13f7SAndroid Build Coastguard Worker VkResult Device::BeginCommandBuffer(
420*03ce13f7SAndroid Build Coastguard Worker     VkCommandBufferUsageFlags usage, VkCommandBuffer commandBuffer) const
421*03ce13f7SAndroid Build Coastguard Worker {
422*03ce13f7SAndroid Build Coastguard Worker 	VkCommandBufferBeginInfo info = {
423*03ce13f7SAndroid Build Coastguard Worker 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,  // sType
424*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                                      // pNext
425*03ce13f7SAndroid Build Coastguard Worker 		usage,                                        // flags
426*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                                      // pInheritanceInfo
427*03ce13f7SAndroid Build Coastguard Worker 	};
428*03ce13f7SAndroid Build Coastguard Worker 
429*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkBeginCommandBuffer(commandBuffer, &info);
430*03ce13f7SAndroid Build Coastguard Worker }
431*03ce13f7SAndroid Build Coastguard Worker 
QueueSubmitAndWait(VkCommandBuffer commandBuffer) const432*03ce13f7SAndroid Build Coastguard Worker VkResult Device::QueueSubmitAndWait(VkCommandBuffer commandBuffer) const
433*03ce13f7SAndroid Build Coastguard Worker {
434*03ce13f7SAndroid Build Coastguard Worker 	VkQueue queue;
435*03ce13f7SAndroid Build Coastguard Worker 	driver->vkGetDeviceQueue(device, queueFamilyIndex, 0, &queue);
436*03ce13f7SAndroid Build Coastguard Worker 
437*03ce13f7SAndroid Build Coastguard Worker 	VkSubmitInfo info = {
438*03ce13f7SAndroid Build Coastguard Worker 		VK_STRUCTURE_TYPE_SUBMIT_INFO,  // sType
439*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                        // pNext
440*03ce13f7SAndroid Build Coastguard Worker 		0,                              // waitSemaphoreCount
441*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                        // pWaitSemaphores
442*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                        // pWaitDstStageMask
443*03ce13f7SAndroid Build Coastguard Worker 		1,                              // commandBufferCount
444*03ce13f7SAndroid Build Coastguard Worker 		&commandBuffer,                 // pCommandBuffers
445*03ce13f7SAndroid Build Coastguard Worker 		0,                              // signalSemaphoreCount
446*03ce13f7SAndroid Build Coastguard Worker 		nullptr,                        // pSignalSemaphores
447*03ce13f7SAndroid Build Coastguard Worker 	};
448*03ce13f7SAndroid Build Coastguard Worker 
449*03ce13f7SAndroid Build Coastguard Worker 	VkResult result = driver->vkQueueSubmit(queue, 1, &info, VK_NULL_HANDLE);
450*03ce13f7SAndroid Build Coastguard Worker 	if(result != VK_SUCCESS)
451*03ce13f7SAndroid Build Coastguard Worker 	{
452*03ce13f7SAndroid Build Coastguard Worker 		return result;
453*03ce13f7SAndroid Build Coastguard Worker 	}
454*03ce13f7SAndroid Build Coastguard Worker 
455*03ce13f7SAndroid Build Coastguard Worker 	return driver->vkQueueWaitIdle(queue);
456*03ce13f7SAndroid Build Coastguard Worker }
457