xref: /aosp_15_r20/external/deqp/external/vulkancts/framework/vulkan/vkRefUtil.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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