1 /*-------------------------------------------------------------------------
2 * Vulkan CTS Framework
3 * --------------------
4 *
5 * Copyright (c) 2015 Google Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Vulkan object reference holder utilities.
22 *//*--------------------------------------------------------------------*/
23
24 #include "vkRefUtil.hpp"
25
26 namespace vk
27 {
28
29 #include "vkRefUtilImpl.inl"
30
createGraphicsPipeline(const DeviceInterface & vk,VkDevice device,VkPipelineCache pipelineCache,const VkGraphicsPipelineCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator)31 Move<VkPipeline> createGraphicsPipeline(const DeviceInterface &vk, VkDevice device, VkPipelineCache pipelineCache,
32 const VkGraphicsPipelineCreateInfo *pCreateInfo,
33 const VkAllocationCallbacks *pAllocator)
34 {
35 VkPipeline object = 0;
36 VK_CHECK(vk.createGraphicsPipelines(device, pipelineCache, 1u, pCreateInfo, pAllocator, &object));
37 return Move<VkPipeline>(check<VkPipeline>(object), Deleter<VkPipeline>(vk, device, pAllocator));
38 }
39
createComputePipeline(const DeviceInterface & vk,VkDevice device,VkPipelineCache pipelineCache,const VkComputePipelineCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator)40 Move<VkPipeline> createComputePipeline(const DeviceInterface &vk, VkDevice device, VkPipelineCache pipelineCache,
41 const VkComputePipelineCreateInfo *pCreateInfo,
42 const VkAllocationCallbacks *pAllocator)
43 {
44 VkPipeline object = 0;
45 VK_CHECK(vk.createComputePipelines(device, pipelineCache, 1u, pCreateInfo, pAllocator, &object));
46 return Move<VkPipeline>(check<VkPipeline>(object), Deleter<VkPipeline>(vk, device, pAllocator));
47 }
48
49 #ifndef CTS_USES_VULKANSC
50
createRayTracingPipelineNV(const DeviceInterface & vk,VkDevice device,VkPipelineCache pipelineCache,const VkRayTracingPipelineCreateInfoNV * pCreateInfo,const VkAllocationCallbacks * pAllocator)51 Move<VkPipeline> createRayTracingPipelineNV(const DeviceInterface &vk, VkDevice device, VkPipelineCache pipelineCache,
52 const VkRayTracingPipelineCreateInfoNV *pCreateInfo,
53 const VkAllocationCallbacks *pAllocator)
54 {
55 VkPipeline object = 0;
56 VK_CHECK(vk.createRayTracingPipelinesNV(device, pipelineCache, 1u, pCreateInfo, pAllocator, &object));
57 return Move<VkPipeline>(check<VkPipeline>(object), Deleter<VkPipeline>(vk, device, pAllocator));
58 }
59
createRayTracingPipelineKHR(const DeviceInterface & vk,VkDevice device,VkDeferredOperationKHR deferredOperation,VkPipelineCache pipelineCache,const VkRayTracingPipelineCreateInfoKHR * pCreateInfo,const VkAllocationCallbacks * pAllocator)60 Move<VkPipeline> createRayTracingPipelineKHR(const DeviceInterface &vk, VkDevice device,
61 VkDeferredOperationKHR deferredOperation, VkPipelineCache pipelineCache,
62 const VkRayTracingPipelineCreateInfoKHR *pCreateInfo,
63 const VkAllocationCallbacks *pAllocator)
64 {
65 VkPipeline object = 0;
66 VK_CHECK(vk.createRayTracingPipelinesKHR(device, deferredOperation, pipelineCache, 1u, pCreateInfo, pAllocator,
67 &object));
68 return Move<VkPipeline>(check<VkPipeline>(object), Deleter<VkPipeline>(vk, device, pAllocator));
69 }
70
71 #endif // CTS_USES_VULKANSC
72
allocateCommandBuffer(const DeviceInterface & vk,VkDevice device,const VkCommandBufferAllocateInfo * pAllocateInfo)73 Move<VkCommandBuffer> allocateCommandBuffer(const DeviceInterface &vk, VkDevice device,
74 const VkCommandBufferAllocateInfo *pAllocateInfo)
75 {
76 VkCommandBuffer object = 0;
77 DE_ASSERT(pAllocateInfo->commandBufferCount == 1u);
78 VK_CHECK(vk.allocateCommandBuffers(device, pAllocateInfo, &object));
79 return Move<VkCommandBuffer>(check<VkCommandBuffer>(object),
80 Deleter<VkCommandBuffer>(vk, device, pAllocateInfo->commandPool));
81 }
82
allocateCommandBuffers(const DeviceInterface & vk,VkDevice device,const VkCommandBufferAllocateInfo * pAllocateInfo,Move<VkCommandBuffer> * pCommandBuffers)83 void allocateCommandBuffers(const DeviceInterface &vk, VkDevice device,
84 const VkCommandBufferAllocateInfo *pAllocateInfo, Move<VkCommandBuffer> *pCommandBuffers)
85 {
86 VkCommandBufferAllocateInfo allocateInfoCopy = *pAllocateInfo;
87 allocateInfoCopy.commandBufferCount = 1;
88 for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; ++i)
89 {
90 VkCommandBuffer object = 0;
91 VK_CHECK(vk.allocateCommandBuffers(device, &allocateInfoCopy, &object));
92 pCommandBuffers[i] = Move<VkCommandBuffer>(check<VkCommandBuffer>(object),
93 Deleter<VkCommandBuffer>(vk, device, pAllocateInfo->commandPool));
94 }
95 }
96
allocateDescriptorSet(const DeviceInterface & vk,VkDevice device,const VkDescriptorSetAllocateInfo * pAllocateInfo)97 Move<VkDescriptorSet> allocateDescriptorSet(const DeviceInterface &vk, VkDevice device,
98 const VkDescriptorSetAllocateInfo *pAllocateInfo)
99 {
100 VkDescriptorSet object = 0;
101 DE_ASSERT(pAllocateInfo->descriptorSetCount == 1u);
102 VK_CHECK(vk.allocateDescriptorSets(device, pAllocateInfo, &object));
103 return Move<VkDescriptorSet>(check<VkDescriptorSet>(object),
104 Deleter<VkDescriptorSet>(vk, device, pAllocateInfo->descriptorPool));
105 }
106
createSemaphore(const DeviceInterface & vk,VkDevice device,VkSemaphoreCreateFlags flags,const VkAllocationCallbacks * pAllocator)107 Move<VkSemaphore> createSemaphore(const DeviceInterface &vk, VkDevice device, VkSemaphoreCreateFlags flags,
108 const VkAllocationCallbacks *pAllocator)
109 {
110 const VkSemaphoreCreateInfo createInfo = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, DE_NULL, flags};
111
112 return createSemaphore(vk, device, &createInfo, pAllocator);
113 }
114
createSemaphoreType(const DeviceInterface & vk,VkDevice device,VkSemaphoreType type,VkSemaphoreCreateFlags flags,const uint64_t initialValue,const VkAllocationCallbacks * pAllocator)115 Move<VkSemaphore> createSemaphoreType(const DeviceInterface &vk, VkDevice device, VkSemaphoreType type,
116 VkSemaphoreCreateFlags flags, const uint64_t initialValue,
117 const VkAllocationCallbacks *pAllocator)
118 {
119 const VkSemaphoreTypeCreateInfo createTypeInfo = {
120 VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
121 DE_NULL,
122
123 type,
124 initialValue,
125 };
126 const VkSemaphoreCreateInfo createInfo = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, &createTypeInfo,
127
128 flags};
129
130 return createSemaphore(vk, device, &createInfo, pAllocator);
131 }
132
createFence(const DeviceInterface & vk,VkDevice device,VkFenceCreateFlags flags,const VkAllocationCallbacks * pAllocator)133 Move<VkFence> createFence(const DeviceInterface &vk, VkDevice device, VkFenceCreateFlags flags,
134 const VkAllocationCallbacks *pAllocator)
135 {
136 const VkFenceCreateInfo createInfo = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, DE_NULL,
137
138 flags};
139
140 return createFence(vk, device, &createInfo, pAllocator);
141 }
142
createCommandPool(const DeviceInterface & vk,VkDevice device,VkCommandPoolCreateFlags flags,uint32_t queueFamilyIndex,const VkAllocationCallbacks * pAllocator)143 Move<VkCommandPool> createCommandPool(const DeviceInterface &vk, VkDevice device, VkCommandPoolCreateFlags flags,
144 uint32_t queueFamilyIndex, const VkAllocationCallbacks *pAllocator)
145 {
146 const VkCommandPoolCreateInfo createInfo = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, DE_NULL,
147
148 flags, queueFamilyIndex};
149
150 return createCommandPool(vk, device, &createInfo, pAllocator);
151 }
152
allocateCommandBuffer(const DeviceInterface & vk,VkDevice device,VkCommandPool commandPool,VkCommandBufferLevel level)153 Move<VkCommandBuffer> allocateCommandBuffer(const DeviceInterface &vk, VkDevice device, VkCommandPool commandPool,
154 VkCommandBufferLevel level)
155 {
156 const VkCommandBufferAllocateInfo allocInfo = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, DE_NULL,
157
158 commandPool, level, 1};
159
160 return allocateCommandBuffer(vk, device, &allocInfo);
161 }
162
createEvent(const DeviceInterface & vk,VkDevice device,VkEventCreateFlags flags,const VkAllocationCallbacks * pAllocateInfo)163 Move<VkEvent> createEvent(const DeviceInterface &vk, VkDevice device, VkEventCreateFlags flags,
164 const VkAllocationCallbacks *pAllocateInfo)
165 {
166 const VkEventCreateInfo createInfo = {VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, DE_NULL,
167
168 flags};
169
170 return createEvent(vk, device, &createInfo, pAllocateInfo);
171 }
172
173 #ifdef CTS_USES_VULKANSC
174
175 // add missing function in Vulkan SC, so that we are able to hack into shader module creation
176
createShaderModule(const DeviceInterface & vk,VkDevice device,const VkShaderModuleCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator)177 Move<VkShaderModule> createShaderModule(const DeviceInterface &vk, VkDevice device,
178 const VkShaderModuleCreateInfo *pCreateInfo,
179 const VkAllocationCallbacks *pAllocator)
180 {
181 VkShaderModule object = 0;
182 VK_CHECK(vk.createShaderModule(device, pCreateInfo, pAllocator, &object));
183 return Move<VkShaderModule>(check<VkShaderModule>(object), Deleter<VkShaderModule>(vk, device, pAllocator));
184 }
185
186 // stubs for functions removed in Vulkan SC
187
188 namespace refdetails
189 {
190
191 template <>
operator ()(VkDeviceMemory obj) const192 void Deleter<VkDeviceMemory>::operator()(VkDeviceMemory obj) const
193 {
194 DE_UNREF(obj);
195 }
196
197 template <>
operator ()(VkShaderModule obj) const198 void Deleter<VkShaderModule>::operator()(VkShaderModule obj) const
199 {
200 DE_UNREF(obj);
201 }
202
203 template <>
operator ()(VkQueryPool obj) const204 void Deleter<VkQueryPool>::operator()(VkQueryPool obj) const
205 {
206 DE_UNREF(obj);
207 }
208
209 template <>
operator ()(VkDescriptorPool obj) const210 void Deleter<VkDescriptorPool>::operator()(VkDescriptorPool obj) const
211 {
212 // vkDestroyDescriptorPool is unsupported in VulkanSC. Instead, reset the descriptor pool
213 // so that any sets allocated from it will be implicitly freed (similar to if it were being
214 // destroyed). Lots of tests rely on sets being implicitly freed.
215 m_deviceIface->resetDescriptorPool(m_device, obj, 0);
216 }
217
218 template <>
operator ()(VkCommandPool obj) const219 void Deleter<VkCommandPool>::operator()(VkCommandPool obj) const
220 {
221 DE_UNREF(obj);
222 }
223
224 template <>
operator ()(VkSwapchainKHR obj) const225 void Deleter<VkSwapchainKHR>::operator()(VkSwapchainKHR obj) const
226 {
227 DE_UNREF(obj);
228 }
229
230 template <>
operator ()(VkSemaphoreSciSyncPoolNV obj) const231 void Deleter<VkSemaphoreSciSyncPoolNV>::operator()(VkSemaphoreSciSyncPoolNV obj) const
232 {
233 DE_UNREF(obj);
234 }
235
236 } // namespace refdetails
237
238 #endif // CTS_USES_VULKANSC
239
240 } // namespace vk
241