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