xref: /aosp_15_r20/external/vulkan-validation-layers/tests/vktestbinding.h (revision b7893ccf7851cd6a48cc5a1e965257d8a5cdcc70)
1*b7893ccfSSadaf Ebrahimi /*
2*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2016, 2019 The Khronos Group Inc.
3*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2016, 2019 Valve Corporation
4*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2016, 2019 LunarG, Inc.
5*b7893ccfSSadaf Ebrahimi  *
6*b7893ccfSSadaf Ebrahimi  * Licensed under the Apache License, Version 2.0 (the "License");
7*b7893ccfSSadaf Ebrahimi  * you may not use this file except in compliance with the License.
8*b7893ccfSSadaf Ebrahimi  * You may obtain a copy of the License at
9*b7893ccfSSadaf Ebrahimi  *
10*b7893ccfSSadaf Ebrahimi  *     http://www.apache.org/licenses/LICENSE-2.0
11*b7893ccfSSadaf Ebrahimi  *
12*b7893ccfSSadaf Ebrahimi  * Unless required by applicable law or agreed to in writing, software
13*b7893ccfSSadaf Ebrahimi  * distributed under the License is distributed on an "AS IS" BASIS,
14*b7893ccfSSadaf Ebrahimi  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*b7893ccfSSadaf Ebrahimi  * See the License for the specific language governing permissions and
16*b7893ccfSSadaf Ebrahimi  * limitations under the License.
17*b7893ccfSSadaf Ebrahimi  *
18*b7893ccfSSadaf Ebrahimi  * Author: Courtney Goeltzenleuchter <[email protected]>
19*b7893ccfSSadaf Ebrahimi  * Author: Cody Northrop <[email protected]>
20*b7893ccfSSadaf Ebrahimi  * Author: John Zulauf <[email protected]>
21*b7893ccfSSadaf Ebrahimi  */
22*b7893ccfSSadaf Ebrahimi 
23*b7893ccfSSadaf Ebrahimi #ifndef VKTESTBINDING_H
24*b7893ccfSSadaf Ebrahimi #define VKTESTBINDING_H
25*b7893ccfSSadaf Ebrahimi 
26*b7893ccfSSadaf Ebrahimi #include <algorithm>
27*b7893ccfSSadaf Ebrahimi #include <assert.h>
28*b7893ccfSSadaf Ebrahimi #include <iterator>
29*b7893ccfSSadaf Ebrahimi #include <memory>
30*b7893ccfSSadaf Ebrahimi #include <vector>
31*b7893ccfSSadaf Ebrahimi 
32*b7893ccfSSadaf Ebrahimi #include "vulkan/vulkan.h"
33*b7893ccfSSadaf Ebrahimi 
34*b7893ccfSSadaf Ebrahimi namespace vk_testing {
35*b7893ccfSSadaf Ebrahimi 
36*b7893ccfSSadaf Ebrahimi template <class Dst, class Src>
MakeVkHandles(const std::vector<Src> & v)37*b7893ccfSSadaf Ebrahimi std::vector<Dst> MakeVkHandles(const std::vector<Src> &v) {
38*b7893ccfSSadaf Ebrahimi     std::vector<Dst> handles;
39*b7893ccfSSadaf Ebrahimi     handles.reserve(v.size());
40*b7893ccfSSadaf Ebrahimi     std::transform(v.begin(), v.end(), std::back_inserter(handles), [](const Src &o) { return o.handle(); });
41*b7893ccfSSadaf Ebrahimi     return handles;
42*b7893ccfSSadaf Ebrahimi }
43*b7893ccfSSadaf Ebrahimi 
44*b7893ccfSSadaf Ebrahimi template <class Dst, class Src>
MakeVkHandles(const std::vector<Src * > & v)45*b7893ccfSSadaf Ebrahimi std::vector<Dst> MakeVkHandles(const std::vector<Src *> &v) {
46*b7893ccfSSadaf Ebrahimi     std::vector<Dst> handles;
47*b7893ccfSSadaf Ebrahimi     handles.reserve(v.size());
48*b7893ccfSSadaf Ebrahimi     std::transform(v.begin(), v.end(), std::back_inserter(handles), [](const Src *o) { return o->handle(); });
49*b7893ccfSSadaf Ebrahimi     return handles;
50*b7893ccfSSadaf Ebrahimi }
51*b7893ccfSSadaf Ebrahimi 
52*b7893ccfSSadaf Ebrahimi typedef void (*ErrorCallback)(const char *expr, const char *file, unsigned int line, const char *function);
53*b7893ccfSSadaf Ebrahimi void set_error_callback(ErrorCallback callback);
54*b7893ccfSSadaf Ebrahimi 
55*b7893ccfSSadaf Ebrahimi class PhysicalDevice;
56*b7893ccfSSadaf Ebrahimi class Device;
57*b7893ccfSSadaf Ebrahimi class Queue;
58*b7893ccfSSadaf Ebrahimi class DeviceMemory;
59*b7893ccfSSadaf Ebrahimi class Fence;
60*b7893ccfSSadaf Ebrahimi class Semaphore;
61*b7893ccfSSadaf Ebrahimi class Event;
62*b7893ccfSSadaf Ebrahimi class QueryPool;
63*b7893ccfSSadaf Ebrahimi class Buffer;
64*b7893ccfSSadaf Ebrahimi class BufferView;
65*b7893ccfSSadaf Ebrahimi class Image;
66*b7893ccfSSadaf Ebrahimi class ImageView;
67*b7893ccfSSadaf Ebrahimi class DepthStencilView;
68*b7893ccfSSadaf Ebrahimi class Shader;
69*b7893ccfSSadaf Ebrahimi class Pipeline;
70*b7893ccfSSadaf Ebrahimi class PipelineDelta;
71*b7893ccfSSadaf Ebrahimi class Sampler;
72*b7893ccfSSadaf Ebrahimi class DescriptorSetLayout;
73*b7893ccfSSadaf Ebrahimi class PipelineLayout;
74*b7893ccfSSadaf Ebrahimi class DescriptorSetPool;
75*b7893ccfSSadaf Ebrahimi class DescriptorSet;
76*b7893ccfSSadaf Ebrahimi class CommandBuffer;
77*b7893ccfSSadaf Ebrahimi class CommandPool;
78*b7893ccfSSadaf Ebrahimi 
79*b7893ccfSSadaf Ebrahimi std::vector<VkLayerProperties> GetGlobalLayers();
80*b7893ccfSSadaf Ebrahimi std::vector<VkExtensionProperties> GetGlobalExtensions();
81*b7893ccfSSadaf Ebrahimi std::vector<VkExtensionProperties> GetGlobalExtensions(const char *pLayerName);
82*b7893ccfSSadaf Ebrahimi 
83*b7893ccfSSadaf Ebrahimi namespace internal {
84*b7893ccfSSadaf Ebrahimi 
85*b7893ccfSSadaf Ebrahimi template <typename T>
86*b7893ccfSSadaf Ebrahimi class Handle {
87*b7893ccfSSadaf Ebrahimi    public:
handle()88*b7893ccfSSadaf Ebrahimi     const T &handle() const { return handle_; }
initialized()89*b7893ccfSSadaf Ebrahimi     bool initialized() const { return (handle_ != T{}); }
90*b7893ccfSSadaf Ebrahimi 
91*b7893ccfSSadaf Ebrahimi    protected:
92*b7893ccfSSadaf Ebrahimi     typedef T handle_type;
93*b7893ccfSSadaf Ebrahimi 
Handle()94*b7893ccfSSadaf Ebrahimi     explicit Handle() : handle_{} {}
Handle(T handle)95*b7893ccfSSadaf Ebrahimi     explicit Handle(T handle) : handle_(handle) {}
96*b7893ccfSSadaf Ebrahimi 
97*b7893ccfSSadaf Ebrahimi     // handles are non-copyable
98*b7893ccfSSadaf Ebrahimi     Handle(const Handle &) = delete;
99*b7893ccfSSadaf Ebrahimi     Handle &operator=(const Handle &) = delete;
100*b7893ccfSSadaf Ebrahimi 
101*b7893ccfSSadaf Ebrahimi     // handles can be moved out
Handle(Handle && src)102*b7893ccfSSadaf Ebrahimi     Handle(Handle &&src) NOEXCEPT : handle_{src.handle_} { src.handle_ = {}; }
103*b7893ccfSSadaf Ebrahimi     Handle &operator=(Handle &&src) NOEXCEPT {
104*b7893ccfSSadaf Ebrahimi         handle_ = src.handle_;
105*b7893ccfSSadaf Ebrahimi         src.handle_ = {};
106*b7893ccfSSadaf Ebrahimi         return *this;
107*b7893ccfSSadaf Ebrahimi     }
108*b7893ccfSSadaf Ebrahimi 
init(T handle)109*b7893ccfSSadaf Ebrahimi     void init(T handle) {
110*b7893ccfSSadaf Ebrahimi         assert(!initialized());
111*b7893ccfSSadaf Ebrahimi         handle_ = handle;
112*b7893ccfSSadaf Ebrahimi     }
113*b7893ccfSSadaf Ebrahimi 
114*b7893ccfSSadaf Ebrahimi    private:
115*b7893ccfSSadaf Ebrahimi     T handle_;
116*b7893ccfSSadaf Ebrahimi };
117*b7893ccfSSadaf Ebrahimi 
118*b7893ccfSSadaf Ebrahimi template <typename T>
119*b7893ccfSSadaf Ebrahimi class NonDispHandle : public Handle<T> {
120*b7893ccfSSadaf Ebrahimi    protected:
NonDispHandle()121*b7893ccfSSadaf Ebrahimi     explicit NonDispHandle() : Handle<T>(), dev_handle_(VK_NULL_HANDLE) {}
NonDispHandle(VkDevice dev,T handle)122*b7893ccfSSadaf Ebrahimi     explicit NonDispHandle(VkDevice dev, T handle) : Handle<T>(handle), dev_handle_(dev) {}
123*b7893ccfSSadaf Ebrahimi 
NonDispHandle(NonDispHandle && src)124*b7893ccfSSadaf Ebrahimi     NonDispHandle(NonDispHandle &&src) : Handle<T>(std::move(src)) {
125*b7893ccfSSadaf Ebrahimi         dev_handle_ = src.dev_handle_;
126*b7893ccfSSadaf Ebrahimi         src.dev_handle_ = VK_NULL_HANDLE;
127*b7893ccfSSadaf Ebrahimi     }
128*b7893ccfSSadaf Ebrahimi     NonDispHandle &operator=(NonDispHandle &&src) {
129*b7893ccfSSadaf Ebrahimi         Handle<T>::operator=(std::move(src));
130*b7893ccfSSadaf Ebrahimi         dev_handle_ = src.dev_handle_;
131*b7893ccfSSadaf Ebrahimi         src.dev_handle_ = VK_NULL_HANDLE;
132*b7893ccfSSadaf Ebrahimi         return *this;
133*b7893ccfSSadaf Ebrahimi     }
134*b7893ccfSSadaf Ebrahimi 
device()135*b7893ccfSSadaf Ebrahimi     const VkDevice &device() const { return dev_handle_; }
136*b7893ccfSSadaf Ebrahimi 
init(VkDevice dev,T handle)137*b7893ccfSSadaf Ebrahimi     void init(VkDevice dev, T handle) {
138*b7893ccfSSadaf Ebrahimi         assert(!Handle<T>::initialized() && dev_handle_ == VK_NULL_HANDLE);
139*b7893ccfSSadaf Ebrahimi         Handle<T>::init(handle);
140*b7893ccfSSadaf Ebrahimi         dev_handle_ = dev;
141*b7893ccfSSadaf Ebrahimi     }
142*b7893ccfSSadaf Ebrahimi 
143*b7893ccfSSadaf Ebrahimi    private:
144*b7893ccfSSadaf Ebrahimi     VkDevice dev_handle_;
145*b7893ccfSSadaf Ebrahimi };
146*b7893ccfSSadaf Ebrahimi 
147*b7893ccfSSadaf Ebrahimi }  // namespace internal
148*b7893ccfSSadaf Ebrahimi 
149*b7893ccfSSadaf Ebrahimi class PhysicalDevice : public internal::Handle<VkPhysicalDevice> {
150*b7893ccfSSadaf Ebrahimi    public:
PhysicalDevice(VkPhysicalDevice phy)151*b7893ccfSSadaf Ebrahimi     explicit PhysicalDevice(VkPhysicalDevice phy) : Handle(phy) {
152*b7893ccfSSadaf Ebrahimi         memory_properties_ = memory_properties();
153*b7893ccfSSadaf Ebrahimi         device_properties_ = properties();
154*b7893ccfSSadaf Ebrahimi     }
155*b7893ccfSSadaf Ebrahimi 
156*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceProperties properties() const;
157*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceMemoryProperties memory_properties() const;
158*b7893ccfSSadaf Ebrahimi     std::vector<VkQueueFamilyProperties> queue_properties() const;
159*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceFeatures features() const;
160*b7893ccfSSadaf Ebrahimi 
161*b7893ccfSSadaf Ebrahimi     bool set_memory_type(const uint32_t type_bits, VkMemoryAllocateInfo *info, const VkMemoryPropertyFlags properties,
162*b7893ccfSSadaf Ebrahimi                          const VkMemoryPropertyFlags forbid = 0) const;
163*b7893ccfSSadaf Ebrahimi 
164*b7893ccfSSadaf Ebrahimi     // vkEnumerateDeviceExtensionProperties()
165*b7893ccfSSadaf Ebrahimi     std::vector<VkExtensionProperties> extensions() const;
166*b7893ccfSSadaf Ebrahimi     std::vector<VkExtensionProperties> extensions(const char *pLayerName) const;
167*b7893ccfSSadaf Ebrahimi 
168*b7893ccfSSadaf Ebrahimi     // vkEnumerateLayers()
169*b7893ccfSSadaf Ebrahimi     std::vector<VkLayerProperties> layers() const;
170*b7893ccfSSadaf Ebrahimi 
171*b7893ccfSSadaf Ebrahimi    private:
172*b7893ccfSSadaf Ebrahimi     void add_extension_dependencies(uint32_t dependency_count, VkExtensionProperties *depencency_props,
173*b7893ccfSSadaf Ebrahimi                                     std::vector<VkExtensionProperties> &ext_list);
174*b7893ccfSSadaf Ebrahimi 
175*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceMemoryProperties memory_properties_;
176*b7893ccfSSadaf Ebrahimi 
177*b7893ccfSSadaf Ebrahimi     VkPhysicalDeviceProperties device_properties_;
178*b7893ccfSSadaf Ebrahimi };
179*b7893ccfSSadaf Ebrahimi 
180*b7893ccfSSadaf Ebrahimi class QueueCreateInfoArray {
181*b7893ccfSSadaf Ebrahimi    private:
182*b7893ccfSSadaf Ebrahimi     std::vector<VkDeviceQueueCreateInfo> queue_info_;
183*b7893ccfSSadaf Ebrahimi     std::vector<std::vector<float>> queue_priorities_;
184*b7893ccfSSadaf Ebrahimi 
185*b7893ccfSSadaf Ebrahimi    public:
186*b7893ccfSSadaf Ebrahimi     QueueCreateInfoArray(const std::vector<VkQueueFamilyProperties> &queue_props);
size()187*b7893ccfSSadaf Ebrahimi     size_t size() const { return queue_info_.size(); }
data()188*b7893ccfSSadaf Ebrahimi     const VkDeviceQueueCreateInfo *data() const { return queue_info_.data(); }
189*b7893ccfSSadaf Ebrahimi };
190*b7893ccfSSadaf Ebrahimi 
191*b7893ccfSSadaf Ebrahimi class Device : public internal::Handle<VkDevice> {
192*b7893ccfSSadaf Ebrahimi    public:
Device(VkPhysicalDevice phy)193*b7893ccfSSadaf Ebrahimi     explicit Device(VkPhysicalDevice phy) : phy_(phy) {}
194*b7893ccfSSadaf Ebrahimi     ~Device();
195*b7893ccfSSadaf Ebrahimi 
196*b7893ccfSSadaf Ebrahimi     // vkCreateDevice()
197*b7893ccfSSadaf Ebrahimi     void init(const VkDeviceCreateInfo &info);
198*b7893ccfSSadaf Ebrahimi     void init(std::vector<const char *> &extensions, VkPhysicalDeviceFeatures *features = nullptr,
199*b7893ccfSSadaf Ebrahimi               void *create_device_pnext = nullptr);  // all queues, all extensions, etc
init()200*b7893ccfSSadaf Ebrahimi     void init() {
201*b7893ccfSSadaf Ebrahimi         std::vector<const char *> extensions;
202*b7893ccfSSadaf Ebrahimi         init(extensions);
203*b7893ccfSSadaf Ebrahimi     };
204*b7893ccfSSadaf Ebrahimi 
phy()205*b7893ccfSSadaf Ebrahimi     const PhysicalDevice &phy() const { return phy_; }
206*b7893ccfSSadaf Ebrahimi 
GetEnabledExtensions()207*b7893ccfSSadaf Ebrahimi     std::vector<const char *> GetEnabledExtensions() { return enabled_extensions_; }
208*b7893ccfSSadaf Ebrahimi     bool IsEnabledExtension(const char *extension);
209*b7893ccfSSadaf Ebrahimi 
210*b7893ccfSSadaf Ebrahimi     // vkGetDeviceProcAddr()
get_proc(const char * name)211*b7893ccfSSadaf Ebrahimi     PFN_vkVoidFunction get_proc(const char *name) const { return vkGetDeviceProcAddr(handle(), name); }
212*b7893ccfSSadaf Ebrahimi 
213*b7893ccfSSadaf Ebrahimi     // vkGetDeviceQueue()
graphics_queues()214*b7893ccfSSadaf Ebrahimi     const std::vector<Queue *> &graphics_queues() const { return queues_[GRAPHICS]; }
compute_queues()215*b7893ccfSSadaf Ebrahimi     const std::vector<Queue *> &compute_queues() { return queues_[COMPUTE]; }
dma_queues()216*b7893ccfSSadaf Ebrahimi     const std::vector<Queue *> &dma_queues() { return queues_[DMA]; }
217*b7893ccfSSadaf Ebrahimi 
218*b7893ccfSSadaf Ebrahimi     typedef std::vector<std::unique_ptr<Queue>> QueueFamilyQueues;
219*b7893ccfSSadaf Ebrahimi     typedef std::vector<QueueFamilyQueues> QueueFamilies;
220*b7893ccfSSadaf Ebrahimi     const QueueFamilyQueues &queue_family_queues(uint32_t queue_family) const;
221*b7893ccfSSadaf Ebrahimi 
222*b7893ccfSSadaf Ebrahimi     uint32_t graphics_queue_node_index_;
223*b7893ccfSSadaf Ebrahimi 
224*b7893ccfSSadaf Ebrahimi     struct Format {
225*b7893ccfSSadaf Ebrahimi         VkFormat format;
226*b7893ccfSSadaf Ebrahimi         VkImageTiling tiling;
227*b7893ccfSSadaf Ebrahimi         VkFlags features;
228*b7893ccfSSadaf Ebrahimi     };
229*b7893ccfSSadaf Ebrahimi     // vkGetFormatInfo()
230*b7893ccfSSadaf Ebrahimi     VkFormatProperties format_properties(VkFormat format);
formats()231*b7893ccfSSadaf Ebrahimi     const std::vector<Format> &formats() const { return formats_; }
232*b7893ccfSSadaf Ebrahimi 
233*b7893ccfSSadaf Ebrahimi     // vkDeviceWaitIdle()
234*b7893ccfSSadaf Ebrahimi     void wait();
235*b7893ccfSSadaf Ebrahimi 
236*b7893ccfSSadaf Ebrahimi     // vkWaitForFences()
237*b7893ccfSSadaf Ebrahimi     VkResult wait(const std::vector<const Fence *> &fences, bool wait_all, uint64_t timeout);
wait(const Fence & fence)238*b7893ccfSSadaf Ebrahimi     VkResult wait(const Fence &fence) { return wait(std::vector<const Fence *>(1, &fence), true, (uint64_t)-1); }
239*b7893ccfSSadaf Ebrahimi 
240*b7893ccfSSadaf Ebrahimi     // vkUpdateDescriptorSets()
241*b7893ccfSSadaf Ebrahimi     void update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes, const std::vector<VkCopyDescriptorSet> &copies);
update_descriptor_sets(const std::vector<VkWriteDescriptorSet> & writes)242*b7893ccfSSadaf Ebrahimi     void update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes) {
243*b7893ccfSSadaf Ebrahimi         return update_descriptor_sets(writes, std::vector<VkCopyDescriptorSet>());
244*b7893ccfSSadaf Ebrahimi     }
245*b7893ccfSSadaf Ebrahimi 
246*b7893ccfSSadaf Ebrahimi     static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
247*b7893ccfSSadaf Ebrahimi                                                      VkDescriptorType type, uint32_t count,
248*b7893ccfSSadaf Ebrahimi                                                      const VkDescriptorImageInfo *image_info);
249*b7893ccfSSadaf Ebrahimi     static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
250*b7893ccfSSadaf Ebrahimi                                                      VkDescriptorType type, uint32_t count,
251*b7893ccfSSadaf Ebrahimi                                                      const VkDescriptorBufferInfo *buffer_info);
252*b7893ccfSSadaf Ebrahimi     static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
253*b7893ccfSSadaf Ebrahimi                                                      VkDescriptorType type, uint32_t count, const VkBufferView *buffer_views);
254*b7893ccfSSadaf Ebrahimi     static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
255*b7893ccfSSadaf Ebrahimi                                                      VkDescriptorType type, const std::vector<VkDescriptorImageInfo> &image_info);
256*b7893ccfSSadaf Ebrahimi     static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
257*b7893ccfSSadaf Ebrahimi                                                      VkDescriptorType type, const std::vector<VkDescriptorBufferInfo> &buffer_info);
258*b7893ccfSSadaf Ebrahimi     static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
259*b7893ccfSSadaf Ebrahimi                                                      VkDescriptorType type, const std::vector<VkBufferView> &buffer_views);
260*b7893ccfSSadaf Ebrahimi 
261*b7893ccfSSadaf Ebrahimi     static VkCopyDescriptorSet copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding, uint32_t src_array_element,
262*b7893ccfSSadaf Ebrahimi                                                    const DescriptorSet &dst_set, uint32_t dst_binding, uint32_t dst_array_element,
263*b7893ccfSSadaf Ebrahimi                                                    uint32_t count);
264*b7893ccfSSadaf Ebrahimi 
265*b7893ccfSSadaf Ebrahimi    private:
266*b7893ccfSSadaf Ebrahimi     enum QueueIndex {
267*b7893ccfSSadaf Ebrahimi         GRAPHICS,
268*b7893ccfSSadaf Ebrahimi         COMPUTE,
269*b7893ccfSSadaf Ebrahimi         DMA,
270*b7893ccfSSadaf Ebrahimi         QUEUE_COUNT,
271*b7893ccfSSadaf Ebrahimi     };
272*b7893ccfSSadaf Ebrahimi 
273*b7893ccfSSadaf Ebrahimi     void init_queues();
274*b7893ccfSSadaf Ebrahimi     void init_formats();
275*b7893ccfSSadaf Ebrahimi 
276*b7893ccfSSadaf Ebrahimi     PhysicalDevice phy_;
277*b7893ccfSSadaf Ebrahimi 
278*b7893ccfSSadaf Ebrahimi     std::vector<const char *> enabled_extensions_;
279*b7893ccfSSadaf Ebrahimi 
280*b7893ccfSSadaf Ebrahimi     QueueFamilies queue_families_;
281*b7893ccfSSadaf Ebrahimi     std::vector<Queue *> queues_[QUEUE_COUNT];
282*b7893ccfSSadaf Ebrahimi     std::vector<Format> formats_;
283*b7893ccfSSadaf Ebrahimi };
284*b7893ccfSSadaf Ebrahimi 
285*b7893ccfSSadaf Ebrahimi class Queue : public internal::Handle<VkQueue> {
286*b7893ccfSSadaf Ebrahimi    public:
Queue(VkQueue queue,int index)287*b7893ccfSSadaf Ebrahimi     explicit Queue(VkQueue queue, int index) : Handle(queue) { family_index_ = index; }
288*b7893ccfSSadaf Ebrahimi 
289*b7893ccfSSadaf Ebrahimi     // vkQueueSubmit()
290*b7893ccfSSadaf Ebrahimi     VkResult submit(const std::vector<const CommandBuffer *> &cmds, const Fence &fence, bool expect_success = true);
291*b7893ccfSSadaf Ebrahimi     VkResult submit(const CommandBuffer &cmd, const Fence &fence, bool expect_success = true);
292*b7893ccfSSadaf Ebrahimi     VkResult submit(const CommandBuffer &cmd, bool expect_success = true);
293*b7893ccfSSadaf Ebrahimi 
294*b7893ccfSSadaf Ebrahimi     // vkQueueWaitIdle()
295*b7893ccfSSadaf Ebrahimi     VkResult wait();
296*b7893ccfSSadaf Ebrahimi 
get_family_index()297*b7893ccfSSadaf Ebrahimi     int get_family_index() { return family_index_; }
298*b7893ccfSSadaf Ebrahimi 
299*b7893ccfSSadaf Ebrahimi    private:
300*b7893ccfSSadaf Ebrahimi     int family_index_;
301*b7893ccfSSadaf Ebrahimi };
302*b7893ccfSSadaf Ebrahimi 
303*b7893ccfSSadaf Ebrahimi class DeviceMemory : public internal::NonDispHandle<VkDeviceMemory> {
304*b7893ccfSSadaf Ebrahimi    public:
305*b7893ccfSSadaf Ebrahimi     ~DeviceMemory();
306*b7893ccfSSadaf Ebrahimi 
307*b7893ccfSSadaf Ebrahimi     // vkAllocateMemory()
308*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkMemoryAllocateInfo &info);
309*b7893ccfSSadaf Ebrahimi 
310*b7893ccfSSadaf Ebrahimi     // vkMapMemory()
311*b7893ccfSSadaf Ebrahimi     const void *map(VkFlags flags) const;
312*b7893ccfSSadaf Ebrahimi     void *map(VkFlags flags);
map()313*b7893ccfSSadaf Ebrahimi     const void *map() const { return map(0); }
map()314*b7893ccfSSadaf Ebrahimi     void *map() { return map(0); }
315*b7893ccfSSadaf Ebrahimi 
316*b7893ccfSSadaf Ebrahimi     // vkUnmapMemory()
317*b7893ccfSSadaf Ebrahimi     void unmap() const;
318*b7893ccfSSadaf Ebrahimi 
319*b7893ccfSSadaf Ebrahimi     static VkMemoryAllocateInfo alloc_info(VkDeviceSize size, uint32_t memory_type_index);
320*b7893ccfSSadaf Ebrahimi     static VkMemoryAllocateInfo get_resource_alloc_info(const vk_testing::Device &dev, const VkMemoryRequirements &reqs,
321*b7893ccfSSadaf Ebrahimi                                                         VkMemoryPropertyFlags mem_props);
322*b7893ccfSSadaf Ebrahimi };
323*b7893ccfSSadaf Ebrahimi 
324*b7893ccfSSadaf Ebrahimi class Fence : public internal::NonDispHandle<VkFence> {
325*b7893ccfSSadaf Ebrahimi    public:
326*b7893ccfSSadaf Ebrahimi     ~Fence();
327*b7893ccfSSadaf Ebrahimi 
328*b7893ccfSSadaf Ebrahimi     // vkCreateFence()
329*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkFenceCreateInfo &info);
330*b7893ccfSSadaf Ebrahimi 
331*b7893ccfSSadaf Ebrahimi     // vkGetFenceStatus()
status()332*b7893ccfSSadaf Ebrahimi     VkResult status() const { return vkGetFenceStatus(device(), handle()); }
333*b7893ccfSSadaf Ebrahimi     VkResult wait(VkBool32 wait_all, uint64_t timeout) const;
334*b7893ccfSSadaf Ebrahimi 
335*b7893ccfSSadaf Ebrahimi     static VkFenceCreateInfo create_info(VkFenceCreateFlags flags);
336*b7893ccfSSadaf Ebrahimi     static VkFenceCreateInfo create_info();
337*b7893ccfSSadaf Ebrahimi };
338*b7893ccfSSadaf Ebrahimi 
339*b7893ccfSSadaf Ebrahimi class Semaphore : public internal::NonDispHandle<VkSemaphore> {
340*b7893ccfSSadaf Ebrahimi    public:
341*b7893ccfSSadaf Ebrahimi     ~Semaphore();
342*b7893ccfSSadaf Ebrahimi 
343*b7893ccfSSadaf Ebrahimi     // vkCreateSemaphore()
344*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkSemaphoreCreateInfo &info);
345*b7893ccfSSadaf Ebrahimi 
346*b7893ccfSSadaf Ebrahimi     static VkSemaphoreCreateInfo create_info(VkFlags flags);
347*b7893ccfSSadaf Ebrahimi };
348*b7893ccfSSadaf Ebrahimi 
349*b7893ccfSSadaf Ebrahimi class Event : public internal::NonDispHandle<VkEvent> {
350*b7893ccfSSadaf Ebrahimi    public:
351*b7893ccfSSadaf Ebrahimi     ~Event();
352*b7893ccfSSadaf Ebrahimi 
353*b7893ccfSSadaf Ebrahimi     // vkCreateEvent()
354*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkEventCreateInfo &info);
355*b7893ccfSSadaf Ebrahimi 
356*b7893ccfSSadaf Ebrahimi     // vkGetEventStatus()
357*b7893ccfSSadaf Ebrahimi     // vkSetEvent()
358*b7893ccfSSadaf Ebrahimi     // vkResetEvent()
status()359*b7893ccfSSadaf Ebrahimi     VkResult status() const { return vkGetEventStatus(device(), handle()); }
360*b7893ccfSSadaf Ebrahimi     void set();
361*b7893ccfSSadaf Ebrahimi     void reset();
362*b7893ccfSSadaf Ebrahimi 
363*b7893ccfSSadaf Ebrahimi     static VkEventCreateInfo create_info(VkFlags flags);
364*b7893ccfSSadaf Ebrahimi };
365*b7893ccfSSadaf Ebrahimi 
366*b7893ccfSSadaf Ebrahimi class QueryPool : public internal::NonDispHandle<VkQueryPool> {
367*b7893ccfSSadaf Ebrahimi    public:
368*b7893ccfSSadaf Ebrahimi     ~QueryPool();
369*b7893ccfSSadaf Ebrahimi 
370*b7893ccfSSadaf Ebrahimi     // vkCreateQueryPool()
371*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkQueryPoolCreateInfo &info);
372*b7893ccfSSadaf Ebrahimi 
373*b7893ccfSSadaf Ebrahimi     // vkGetQueryPoolResults()
374*b7893ccfSSadaf Ebrahimi     VkResult results(uint32_t first, uint32_t count, size_t size, void *data, size_t stride);
375*b7893ccfSSadaf Ebrahimi 
376*b7893ccfSSadaf Ebrahimi     static VkQueryPoolCreateInfo create_info(VkQueryType type, uint32_t slot_count);
377*b7893ccfSSadaf Ebrahimi };
378*b7893ccfSSadaf Ebrahimi 
379*b7893ccfSSadaf Ebrahimi class Buffer : public internal::NonDispHandle<VkBuffer> {
380*b7893ccfSSadaf Ebrahimi    public:
Buffer()381*b7893ccfSSadaf Ebrahimi     explicit Buffer() : NonDispHandle() {}
Buffer(const Device & dev,const VkBufferCreateInfo & info)382*b7893ccfSSadaf Ebrahimi     explicit Buffer(const Device &dev, const VkBufferCreateInfo &info) { init(dev, info); }
Buffer(const Device & dev,VkDeviceSize size)383*b7893ccfSSadaf Ebrahimi     explicit Buffer(const Device &dev, VkDeviceSize size) { init(dev, size); }
384*b7893ccfSSadaf Ebrahimi 
385*b7893ccfSSadaf Ebrahimi     ~Buffer();
386*b7893ccfSSadaf Ebrahimi 
387*b7893ccfSSadaf Ebrahimi     // vkCreateBuffer()
388*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkBufferCreateInfo &info, VkMemoryPropertyFlags mem_props);
init(const Device & dev,const VkBufferCreateInfo & info)389*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkBufferCreateInfo &info) { init(dev, info, 0); }
390*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags mem_props,
391*b7893ccfSSadaf Ebrahimi               VkBufferUsageFlags usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, const std::vector<uint32_t> &queue_families = {}) {
392*b7893ccfSSadaf Ebrahimi         init(dev, create_info(size, usage, &queue_families), mem_props);
393*b7893ccfSSadaf Ebrahimi     }
init(const Device & dev,VkDeviceSize size)394*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, VkDeviceSize size) { init(dev, size, 0); }
395*b7893ccfSSadaf Ebrahimi     void init_as_src(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs,
396*b7893ccfSSadaf Ebrahimi                      const std::vector<uint32_t> *queue_families = nullptr) {
397*b7893ccfSSadaf Ebrahimi         init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, queue_families), reqs);
398*b7893ccfSSadaf Ebrahimi     }
399*b7893ccfSSadaf Ebrahimi     void init_as_dst(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs,
400*b7893ccfSSadaf Ebrahimi                      const std::vector<uint32_t> *queue_families = nullptr) {
401*b7893ccfSSadaf Ebrahimi         init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_DST_BIT, queue_families), reqs);
402*b7893ccfSSadaf Ebrahimi     }
403*b7893ccfSSadaf Ebrahimi     void init_as_src_and_dst(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs,
404*b7893ccfSSadaf Ebrahimi                              const std::vector<uint32_t> *queue_families = nullptr, bool memory = true) {
405*b7893ccfSSadaf Ebrahimi         if (memory)
406*b7893ccfSSadaf Ebrahimi             init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, queue_families), reqs);
407*b7893ccfSSadaf Ebrahimi         else
408*b7893ccfSSadaf Ebrahimi             init_no_mem(dev,
409*b7893ccfSSadaf Ebrahimi                         create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, queue_families));
410*b7893ccfSSadaf Ebrahimi     }
411*b7893ccfSSadaf Ebrahimi     void init_no_mem(const Device &dev, const VkBufferCreateInfo &info);
412*b7893ccfSSadaf Ebrahimi 
413*b7893ccfSSadaf Ebrahimi     // get the internal memory
memory()414*b7893ccfSSadaf Ebrahimi     const DeviceMemory &memory() const { return internal_mem_; }
memory()415*b7893ccfSSadaf Ebrahimi     DeviceMemory &memory() { return internal_mem_; }
416*b7893ccfSSadaf Ebrahimi 
417*b7893ccfSSadaf Ebrahimi     // vkGetObjectMemoryRequirements()
418*b7893ccfSSadaf Ebrahimi     VkMemoryRequirements memory_requirements() const;
419*b7893ccfSSadaf Ebrahimi 
420*b7893ccfSSadaf Ebrahimi     // vkBindObjectMemory()
421*b7893ccfSSadaf Ebrahimi     void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
422*b7893ccfSSadaf Ebrahimi 
create_info()423*b7893ccfSSadaf Ebrahimi     const VkBufferCreateInfo &create_info() const { return create_info_; }
424*b7893ccfSSadaf Ebrahimi     static VkBufferCreateInfo create_info(VkDeviceSize size, VkFlags usage, const std::vector<uint32_t> *queue_families = nullptr);
425*b7893ccfSSadaf Ebrahimi 
buffer_memory_barrier(VkFlags output_mask,VkFlags input_mask,VkDeviceSize offset,VkDeviceSize size)426*b7893ccfSSadaf Ebrahimi     VkBufferMemoryBarrier buffer_memory_barrier(VkFlags output_mask, VkFlags input_mask, VkDeviceSize offset,
427*b7893ccfSSadaf Ebrahimi                                                 VkDeviceSize size) const {
428*b7893ccfSSadaf Ebrahimi         VkBufferMemoryBarrier barrier = {};
429*b7893ccfSSadaf Ebrahimi         barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
430*b7893ccfSSadaf Ebrahimi         barrier.buffer = handle();
431*b7893ccfSSadaf Ebrahimi         barrier.srcAccessMask = output_mask;
432*b7893ccfSSadaf Ebrahimi         barrier.dstAccessMask = input_mask;
433*b7893ccfSSadaf Ebrahimi         barrier.offset = offset;
434*b7893ccfSSadaf Ebrahimi         barrier.size = size;
435*b7893ccfSSadaf Ebrahimi         if (create_info_.sharingMode == VK_SHARING_MODE_CONCURRENT) {
436*b7893ccfSSadaf Ebrahimi             barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
437*b7893ccfSSadaf Ebrahimi             barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
438*b7893ccfSSadaf Ebrahimi         }
439*b7893ccfSSadaf Ebrahimi         return barrier;
440*b7893ccfSSadaf Ebrahimi     }
441*b7893ccfSSadaf Ebrahimi 
442*b7893ccfSSadaf Ebrahimi    private:
443*b7893ccfSSadaf Ebrahimi     VkBufferCreateInfo create_info_;
444*b7893ccfSSadaf Ebrahimi 
445*b7893ccfSSadaf Ebrahimi     DeviceMemory internal_mem_;
446*b7893ccfSSadaf Ebrahimi };
447*b7893ccfSSadaf Ebrahimi 
448*b7893ccfSSadaf Ebrahimi class BufferView : public internal::NonDispHandle<VkBufferView> {
449*b7893ccfSSadaf Ebrahimi    public:
450*b7893ccfSSadaf Ebrahimi     ~BufferView();
451*b7893ccfSSadaf Ebrahimi 
452*b7893ccfSSadaf Ebrahimi     // vkCreateBufferView()
453*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkBufferViewCreateInfo &info);
454*b7893ccfSSadaf Ebrahimi     static VkBufferViewCreateInfo createInfo(VkBuffer buffer, VkFormat format, VkDeviceSize offset = 0,
455*b7893ccfSSadaf Ebrahimi                                              VkDeviceSize range = VK_WHOLE_SIZE);
456*b7893ccfSSadaf Ebrahimi };
457*b7893ccfSSadaf Ebrahimi 
createInfo(VkBuffer buffer,VkFormat format,VkDeviceSize offset,VkDeviceSize range)458*b7893ccfSSadaf Ebrahimi inline VkBufferViewCreateInfo BufferView::createInfo(VkBuffer buffer, VkFormat format, VkDeviceSize offset, VkDeviceSize range) {
459*b7893ccfSSadaf Ebrahimi     VkBufferViewCreateInfo info = {};
460*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
461*b7893ccfSSadaf Ebrahimi     info.pNext = nullptr;
462*b7893ccfSSadaf Ebrahimi     info.flags = VkFlags(0);
463*b7893ccfSSadaf Ebrahimi     info.buffer = buffer;
464*b7893ccfSSadaf Ebrahimi     info.format = format;
465*b7893ccfSSadaf Ebrahimi     info.offset = offset;
466*b7893ccfSSadaf Ebrahimi     info.range = range;
467*b7893ccfSSadaf Ebrahimi     return info;
468*b7893ccfSSadaf Ebrahimi }
469*b7893ccfSSadaf Ebrahimi 
470*b7893ccfSSadaf Ebrahimi class Image : public internal::NonDispHandle<VkImage> {
471*b7893ccfSSadaf Ebrahimi    public:
Image()472*b7893ccfSSadaf Ebrahimi     explicit Image() : NonDispHandle(), format_features_(0) {}
Image(const Device & dev,const VkImageCreateInfo & info)473*b7893ccfSSadaf Ebrahimi     explicit Image(const Device &dev, const VkImageCreateInfo &info) : format_features_(0) { init(dev, info); }
474*b7893ccfSSadaf Ebrahimi 
475*b7893ccfSSadaf Ebrahimi     ~Image();
476*b7893ccfSSadaf Ebrahimi 
477*b7893ccfSSadaf Ebrahimi     // vkCreateImage()
478*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkImageCreateInfo &info, VkMemoryPropertyFlags mem_props);
init(const Device & dev,const VkImageCreateInfo & info)479*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkImageCreateInfo &info) { init(dev, info, 0); }
480*b7893ccfSSadaf Ebrahimi     void init_no_mem(const Device &dev, const VkImageCreateInfo &info);
481*b7893ccfSSadaf Ebrahimi 
482*b7893ccfSSadaf Ebrahimi     // get the internal memory
memory()483*b7893ccfSSadaf Ebrahimi     const DeviceMemory &memory() const { return internal_mem_; }
memory()484*b7893ccfSSadaf Ebrahimi     DeviceMemory &memory() { return internal_mem_; }
485*b7893ccfSSadaf Ebrahimi 
486*b7893ccfSSadaf Ebrahimi     // vkGetObjectMemoryRequirements()
487*b7893ccfSSadaf Ebrahimi     VkMemoryRequirements memory_requirements() const;
488*b7893ccfSSadaf Ebrahimi 
489*b7893ccfSSadaf Ebrahimi     // vkBindObjectMemory()
490*b7893ccfSSadaf Ebrahimi     void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
491*b7893ccfSSadaf Ebrahimi 
492*b7893ccfSSadaf Ebrahimi     // vkGetImageSubresourceLayout()
493*b7893ccfSSadaf Ebrahimi     VkSubresourceLayout subresource_layout(const VkImageSubresource &subres) const;
494*b7893ccfSSadaf Ebrahimi     VkSubresourceLayout subresource_layout(const VkImageSubresourceLayers &subres) const;
495*b7893ccfSSadaf Ebrahimi 
496*b7893ccfSSadaf Ebrahimi     bool transparent() const;
copyable()497*b7893ccfSSadaf Ebrahimi     bool copyable() const { return (format_features_ & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT); }
498*b7893ccfSSadaf Ebrahimi 
subresource_range(VkImageAspectFlags aspect)499*b7893ccfSSadaf Ebrahimi     VkImageSubresourceRange subresource_range(VkImageAspectFlags aspect) const { return subresource_range(create_info_, aspect); }
extent()500*b7893ccfSSadaf Ebrahimi     VkExtent3D extent() const { return create_info_.extent; }
extent(uint32_t mip_level)501*b7893ccfSSadaf Ebrahimi     VkExtent3D extent(uint32_t mip_level) const { return extent(create_info_.extent, mip_level); }
format()502*b7893ccfSSadaf Ebrahimi     VkFormat format() const { return create_info_.format; }
usage()503*b7893ccfSSadaf Ebrahimi     VkImageUsageFlags usage() const { return create_info_.usage; }
sharing_mode()504*b7893ccfSSadaf Ebrahimi     VkSharingMode sharing_mode() const { return create_info_.sharingMode; }
505*b7893ccfSSadaf Ebrahimi     VkImageMemoryBarrier image_memory_barrier(VkFlags output_mask, VkFlags input_mask, VkImageLayout old_layout,
506*b7893ccfSSadaf Ebrahimi                                               VkImageLayout new_layout, const VkImageSubresourceRange &range,
507*b7893ccfSSadaf Ebrahimi                                               uint32_t srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
508*b7893ccfSSadaf Ebrahimi                                               uint32_t dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED) const {
509*b7893ccfSSadaf Ebrahimi         VkImageMemoryBarrier barrier = {};
510*b7893ccfSSadaf Ebrahimi         barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
511*b7893ccfSSadaf Ebrahimi         barrier.srcAccessMask = output_mask;
512*b7893ccfSSadaf Ebrahimi         barrier.dstAccessMask = input_mask;
513*b7893ccfSSadaf Ebrahimi         barrier.oldLayout = old_layout;
514*b7893ccfSSadaf Ebrahimi         barrier.newLayout = new_layout;
515*b7893ccfSSadaf Ebrahimi         barrier.image = handle();
516*b7893ccfSSadaf Ebrahimi         barrier.subresourceRange = range;
517*b7893ccfSSadaf Ebrahimi         barrier.srcQueueFamilyIndex = srcQueueFamilyIndex;
518*b7893ccfSSadaf Ebrahimi         barrier.dstQueueFamilyIndex = dstQueueFamilyIndex;
519*b7893ccfSSadaf Ebrahimi         return barrier;
520*b7893ccfSSadaf Ebrahimi     }
521*b7893ccfSSadaf Ebrahimi 
522*b7893ccfSSadaf Ebrahimi     static VkImageCreateInfo create_info();
523*b7893ccfSSadaf Ebrahimi     static VkImageSubresource subresource(VkImageAspectFlags aspect, uint32_t mip_level, uint32_t array_layer);
524*b7893ccfSSadaf Ebrahimi     static VkImageSubresource subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer);
525*b7893ccfSSadaf Ebrahimi     static VkImageSubresourceLayers subresource(VkImageAspectFlags aspect, uint32_t mip_level, uint32_t array_layer,
526*b7893ccfSSadaf Ebrahimi                                                 uint32_t array_size);
527*b7893ccfSSadaf Ebrahimi     static VkImageSubresourceLayers subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer,
528*b7893ccfSSadaf Ebrahimi                                                 uint32_t array_size);
529*b7893ccfSSadaf Ebrahimi     static VkImageSubresourceRange subresource_range(VkImageAspectFlags aspect_mask, uint32_t base_mip_level, uint32_t mip_levels,
530*b7893ccfSSadaf Ebrahimi                                                      uint32_t base_array_layer, uint32_t num_layers);
531*b7893ccfSSadaf Ebrahimi     static VkImageSubresourceRange subresource_range(const VkImageCreateInfo &info, VkImageAspectFlags aspect_mask);
532*b7893ccfSSadaf Ebrahimi     static VkImageSubresourceRange subresource_range(const VkImageSubresource &subres);
533*b7893ccfSSadaf Ebrahimi 
534*b7893ccfSSadaf Ebrahimi     static VkExtent2D extent(int32_t width, int32_t height);
535*b7893ccfSSadaf Ebrahimi     static VkExtent2D extent(const VkExtent2D &extent, uint32_t mip_level);
536*b7893ccfSSadaf Ebrahimi     static VkExtent2D extent(const VkExtent3D &extent);
537*b7893ccfSSadaf Ebrahimi 
538*b7893ccfSSadaf Ebrahimi     static VkExtent3D extent(int32_t width, int32_t height, int32_t depth);
539*b7893ccfSSadaf Ebrahimi     static VkExtent3D extent(const VkExtent3D &extent, uint32_t mip_level);
540*b7893ccfSSadaf Ebrahimi 
541*b7893ccfSSadaf Ebrahimi    private:
542*b7893ccfSSadaf Ebrahimi     void init_info(const Device &dev, const VkImageCreateInfo &info);
543*b7893ccfSSadaf Ebrahimi 
544*b7893ccfSSadaf Ebrahimi     VkImageCreateInfo create_info_;
545*b7893ccfSSadaf Ebrahimi     VkFlags format_features_;
546*b7893ccfSSadaf Ebrahimi 
547*b7893ccfSSadaf Ebrahimi     DeviceMemory internal_mem_;
548*b7893ccfSSadaf Ebrahimi };
549*b7893ccfSSadaf Ebrahimi 
550*b7893ccfSSadaf Ebrahimi class ImageView : public internal::NonDispHandle<VkImageView> {
551*b7893ccfSSadaf Ebrahimi    public:
552*b7893ccfSSadaf Ebrahimi     ~ImageView();
553*b7893ccfSSadaf Ebrahimi 
554*b7893ccfSSadaf Ebrahimi     // vkCreateImageView()
555*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkImageViewCreateInfo &info);
556*b7893ccfSSadaf Ebrahimi };
557*b7893ccfSSadaf Ebrahimi 
558*b7893ccfSSadaf Ebrahimi class AccelerationStructure : public internal::NonDispHandle<VkAccelerationStructureNV> {
559*b7893ccfSSadaf Ebrahimi    public:
560*b7893ccfSSadaf Ebrahimi     explicit AccelerationStructure(const Device &dev, const VkAccelerationStructureCreateInfoNV &info, bool init_memory = true) {
561*b7893ccfSSadaf Ebrahimi         init(dev, info, init_memory);
562*b7893ccfSSadaf Ebrahimi     }
563*b7893ccfSSadaf Ebrahimi     ~AccelerationStructure();
564*b7893ccfSSadaf Ebrahimi 
565*b7893ccfSSadaf Ebrahimi     // vkCreateAccelerationStructureNV
566*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkAccelerationStructureCreateInfoNV &info, bool init_memory = true);
567*b7893ccfSSadaf Ebrahimi 
568*b7893ccfSSadaf Ebrahimi     // vkGetAccelerationStructureMemoryRequirementsNV()
569*b7893ccfSSadaf Ebrahimi     VkMemoryRequirements2 memory_requirements() const;
570*b7893ccfSSadaf Ebrahimi     VkMemoryRequirements2 build_scratch_memory_requirements() const;
571*b7893ccfSSadaf Ebrahimi 
opaque_handle()572*b7893ccfSSadaf Ebrahimi     uint64_t opaque_handle() const { return opaque_handle_; }
573*b7893ccfSSadaf Ebrahimi 
info()574*b7893ccfSSadaf Ebrahimi     const VkAccelerationStructureInfoNV &info() const { return info_; }
575*b7893ccfSSadaf Ebrahimi 
dev()576*b7893ccfSSadaf Ebrahimi     const VkDevice &dev() const { return device(); }
577*b7893ccfSSadaf Ebrahimi 
578*b7893ccfSSadaf Ebrahimi     void create_scratch_buffer(const Device &dev, Buffer *buffer);
579*b7893ccfSSadaf Ebrahimi 
580*b7893ccfSSadaf Ebrahimi    private:
581*b7893ccfSSadaf Ebrahimi     VkAccelerationStructureInfoNV info_;
582*b7893ccfSSadaf Ebrahimi     DeviceMemory memory_;
583*b7893ccfSSadaf Ebrahimi     uint64_t opaque_handle_;
584*b7893ccfSSadaf Ebrahimi };
585*b7893ccfSSadaf Ebrahimi 
586*b7893ccfSSadaf Ebrahimi class ShaderModule : public internal::NonDispHandle<VkShaderModule> {
587*b7893ccfSSadaf Ebrahimi    public:
588*b7893ccfSSadaf Ebrahimi     ~ShaderModule();
589*b7893ccfSSadaf Ebrahimi 
590*b7893ccfSSadaf Ebrahimi     // vkCreateShaderModule()
591*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkShaderModuleCreateInfo &info);
592*b7893ccfSSadaf Ebrahimi     VkResult init_try(const Device &dev, const VkShaderModuleCreateInfo &info);
593*b7893ccfSSadaf Ebrahimi 
594*b7893ccfSSadaf Ebrahimi     static VkShaderModuleCreateInfo create_info(size_t code_size, const uint32_t *code, VkFlags flags);
595*b7893ccfSSadaf Ebrahimi };
596*b7893ccfSSadaf Ebrahimi 
597*b7893ccfSSadaf Ebrahimi class Pipeline : public internal::NonDispHandle<VkPipeline> {
598*b7893ccfSSadaf Ebrahimi    public:
599*b7893ccfSSadaf Ebrahimi     ~Pipeline();
600*b7893ccfSSadaf Ebrahimi 
601*b7893ccfSSadaf Ebrahimi     // vkCreateGraphicsPipeline()
602*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
603*b7893ccfSSadaf Ebrahimi     // vkCreateGraphicsPipelineDerivative()
604*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info, const VkPipeline basePipeline);
605*b7893ccfSSadaf Ebrahimi     // vkCreateComputePipeline()
606*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkComputePipelineCreateInfo &info);
607*b7893ccfSSadaf Ebrahimi     // vkLoadPipeline()
608*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, size_t size, const void *data);
609*b7893ccfSSadaf Ebrahimi     // vkLoadPipelineDerivative()
610*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, size_t size, const void *data, VkPipeline basePipeline);
611*b7893ccfSSadaf Ebrahimi 
612*b7893ccfSSadaf Ebrahimi     // vkCreateGraphicsPipeline with error return
613*b7893ccfSSadaf Ebrahimi     VkResult init_try(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
614*b7893ccfSSadaf Ebrahimi 
615*b7893ccfSSadaf Ebrahimi     // vkStorePipeline()
616*b7893ccfSSadaf Ebrahimi     size_t store(size_t size, void *data);
617*b7893ccfSSadaf Ebrahimi };
618*b7893ccfSSadaf Ebrahimi 
619*b7893ccfSSadaf Ebrahimi class PipelineLayout : public internal::NonDispHandle<VkPipelineLayout> {
620*b7893ccfSSadaf Ebrahimi    public:
PipelineLayout()621*b7893ccfSSadaf Ebrahimi     PipelineLayout() NOEXCEPT : NonDispHandle(){};
622*b7893ccfSSadaf Ebrahimi     ~PipelineLayout();
623*b7893ccfSSadaf Ebrahimi 
624*b7893ccfSSadaf Ebrahimi     // Move constructor for Visual Studio 2013
PipelineLayout(PipelineLayout && src)625*b7893ccfSSadaf Ebrahimi     PipelineLayout(PipelineLayout &&src) : NonDispHandle(std::move(src)){};
626*b7893ccfSSadaf Ebrahimi 
627*b7893ccfSSadaf Ebrahimi     PipelineLayout &operator=(PipelineLayout &&src) {
628*b7893ccfSSadaf Ebrahimi         this->~PipelineLayout();
629*b7893ccfSSadaf Ebrahimi         this->NonDispHandle::operator=(std::move(src));
630*b7893ccfSSadaf Ebrahimi         return *this;
631*b7893ccfSSadaf Ebrahimi     };
632*b7893ccfSSadaf Ebrahimi 
633*b7893ccfSSadaf Ebrahimi     // vCreatePipelineLayout()
634*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, VkPipelineLayoutCreateInfo &info, const std::vector<const DescriptorSetLayout *> &layouts);
635*b7893ccfSSadaf Ebrahimi };
636*b7893ccfSSadaf Ebrahimi 
637*b7893ccfSSadaf Ebrahimi class Sampler : public internal::NonDispHandle<VkSampler> {
638*b7893ccfSSadaf Ebrahimi    public:
639*b7893ccfSSadaf Ebrahimi     ~Sampler();
640*b7893ccfSSadaf Ebrahimi 
641*b7893ccfSSadaf Ebrahimi     // vkCreateSampler()
642*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkSamplerCreateInfo &info);
643*b7893ccfSSadaf Ebrahimi };
644*b7893ccfSSadaf Ebrahimi 
645*b7893ccfSSadaf Ebrahimi class DescriptorSetLayout : public internal::NonDispHandle<VkDescriptorSetLayout> {
646*b7893ccfSSadaf Ebrahimi    public:
DescriptorSetLayout()647*b7893ccfSSadaf Ebrahimi     DescriptorSetLayout() NOEXCEPT : NonDispHandle(){};
648*b7893ccfSSadaf Ebrahimi     ~DescriptorSetLayout();
649*b7893ccfSSadaf Ebrahimi 
650*b7893ccfSSadaf Ebrahimi     // Move constructor for Visual Studio 2013
DescriptorSetLayout(DescriptorSetLayout && src)651*b7893ccfSSadaf Ebrahimi     DescriptorSetLayout(DescriptorSetLayout &&src) : NonDispHandle(std::move(src)){};
652*b7893ccfSSadaf Ebrahimi 
653*b7893ccfSSadaf Ebrahimi     DescriptorSetLayout &operator=(DescriptorSetLayout &&src) NOEXCEPT {
654*b7893ccfSSadaf Ebrahimi         this->~DescriptorSetLayout();
655*b7893ccfSSadaf Ebrahimi         this->NonDispHandle::operator=(std::move(src));
656*b7893ccfSSadaf Ebrahimi         return *this;
657*b7893ccfSSadaf Ebrahimi     }
658*b7893ccfSSadaf Ebrahimi 
659*b7893ccfSSadaf Ebrahimi     // vkCreateDescriptorSetLayout()
660*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info);
661*b7893ccfSSadaf Ebrahimi };
662*b7893ccfSSadaf Ebrahimi 
663*b7893ccfSSadaf Ebrahimi class DescriptorPool : public internal::NonDispHandle<VkDescriptorPool> {
664*b7893ccfSSadaf Ebrahimi    public:
665*b7893ccfSSadaf Ebrahimi     ~DescriptorPool();
666*b7893ccfSSadaf Ebrahimi 
667*b7893ccfSSadaf Ebrahimi     // Descriptor sets allocated from this pool will need access to the original
668*b7893ccfSSadaf Ebrahimi     // object
GetObj()669*b7893ccfSSadaf Ebrahimi     VkDescriptorPool GetObj() { return pool_; }
670*b7893ccfSSadaf Ebrahimi 
671*b7893ccfSSadaf Ebrahimi     // vkCreateDescriptorPool()
672*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkDescriptorPoolCreateInfo &info);
673*b7893ccfSSadaf Ebrahimi 
674*b7893ccfSSadaf Ebrahimi     // vkResetDescriptorPool()
675*b7893ccfSSadaf Ebrahimi     void reset();
676*b7893ccfSSadaf Ebrahimi 
677*b7893ccfSSadaf Ebrahimi     // vkFreeDescriptorSet()
setDynamicUsage(bool isDynamic)678*b7893ccfSSadaf Ebrahimi     void setDynamicUsage(bool isDynamic) { dynamic_usage_ = isDynamic; }
getDynamicUsage()679*b7893ccfSSadaf Ebrahimi     bool getDynamicUsage() { return dynamic_usage_; }
680*b7893ccfSSadaf Ebrahimi 
681*b7893ccfSSadaf Ebrahimi     // vkAllocateDescriptorSets()
682*b7893ccfSSadaf Ebrahimi     std::vector<DescriptorSet *> alloc_sets(const Device &dev, const std::vector<const DescriptorSetLayout *> &layouts);
683*b7893ccfSSadaf Ebrahimi     std::vector<DescriptorSet *> alloc_sets(const Device &dev, const DescriptorSetLayout &layout, uint32_t count);
684*b7893ccfSSadaf Ebrahimi     DescriptorSet *alloc_sets(const Device &dev, const DescriptorSetLayout &layout);
685*b7893ccfSSadaf Ebrahimi 
686*b7893ccfSSadaf Ebrahimi     template <typename PoolSizes>
687*b7893ccfSSadaf Ebrahimi     static VkDescriptorPoolCreateInfo create_info(VkDescriptorPoolCreateFlags flags, uint32_t max_sets,
688*b7893ccfSSadaf Ebrahimi                                                   const PoolSizes &pool_sizes);
689*b7893ccfSSadaf Ebrahimi 
690*b7893ccfSSadaf Ebrahimi    private:
691*b7893ccfSSadaf Ebrahimi     VkDescriptorPool pool_;
692*b7893ccfSSadaf Ebrahimi 
693*b7893ccfSSadaf Ebrahimi     // Track whether this pool's usage is VK_DESCRIPTOR_POOL_USAGE_DYNAMIC
694*b7893ccfSSadaf Ebrahimi     bool dynamic_usage_;
695*b7893ccfSSadaf Ebrahimi };
696*b7893ccfSSadaf Ebrahimi 
697*b7893ccfSSadaf Ebrahimi template <typename PoolSizes>
create_info(VkDescriptorPoolCreateFlags flags,uint32_t max_sets,const PoolSizes & pool_sizes)698*b7893ccfSSadaf Ebrahimi inline VkDescriptorPoolCreateInfo DescriptorPool::create_info(VkDescriptorPoolCreateFlags flags, uint32_t max_sets,
699*b7893ccfSSadaf Ebrahimi                                                               const PoolSizes &pool_sizes) {
700*b7893ccfSSadaf Ebrahimi     VkDescriptorPoolCreateInfo info{};
701*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
702*b7893ccfSSadaf Ebrahimi     info.pNext = nullptr;
703*b7893ccfSSadaf Ebrahimi     info.flags = flags;
704*b7893ccfSSadaf Ebrahimi     info.maxSets = max_sets;
705*b7893ccfSSadaf Ebrahimi     info.poolSizeCount = pool_sizes.size();
706*b7893ccfSSadaf Ebrahimi     info.pPoolSizes = (info.poolSizeCount) ? pool_sizes.data() : nullptr;
707*b7893ccfSSadaf Ebrahimi     return info;
708*b7893ccfSSadaf Ebrahimi }
709*b7893ccfSSadaf Ebrahimi 
710*b7893ccfSSadaf Ebrahimi class DescriptorSet : public internal::NonDispHandle<VkDescriptorSet> {
711*b7893ccfSSadaf Ebrahimi    public:
712*b7893ccfSSadaf Ebrahimi     ~DescriptorSet();
713*b7893ccfSSadaf Ebrahimi 
DescriptorSet()714*b7893ccfSSadaf Ebrahimi     explicit DescriptorSet() : NonDispHandle() {}
DescriptorSet(const Device & dev,DescriptorPool * pool,VkDescriptorSet set)715*b7893ccfSSadaf Ebrahimi     explicit DescriptorSet(const Device &dev, DescriptorPool *pool, VkDescriptorSet set) : NonDispHandle(dev.handle(), set) {
716*b7893ccfSSadaf Ebrahimi         containing_pool_ = pool;
717*b7893ccfSSadaf Ebrahimi     }
718*b7893ccfSSadaf Ebrahimi 
719*b7893ccfSSadaf Ebrahimi    private:
720*b7893ccfSSadaf Ebrahimi     DescriptorPool *containing_pool_;
721*b7893ccfSSadaf Ebrahimi };
722*b7893ccfSSadaf Ebrahimi 
723*b7893ccfSSadaf Ebrahimi class CommandPool : public internal::NonDispHandle<VkCommandPool> {
724*b7893ccfSSadaf Ebrahimi    public:
725*b7893ccfSSadaf Ebrahimi     ~CommandPool();
726*b7893ccfSSadaf Ebrahimi 
CommandPool()727*b7893ccfSSadaf Ebrahimi     explicit CommandPool() : NonDispHandle() {}
CommandPool(const Device & dev,const VkCommandPoolCreateInfo & info)728*b7893ccfSSadaf Ebrahimi     explicit CommandPool(const Device &dev, const VkCommandPoolCreateInfo &info) { init(dev, info); }
729*b7893ccfSSadaf Ebrahimi 
730*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkCommandPoolCreateInfo &info);
731*b7893ccfSSadaf Ebrahimi 
732*b7893ccfSSadaf Ebrahimi     static VkCommandPoolCreateInfo create_info(uint32_t queue_family_index, VkCommandPoolCreateFlags flags);
733*b7893ccfSSadaf Ebrahimi };
734*b7893ccfSSadaf Ebrahimi 
create_info(uint32_t queue_family_index,VkCommandPoolCreateFlags flags)735*b7893ccfSSadaf Ebrahimi inline VkCommandPoolCreateInfo CommandPool::create_info(uint32_t queue_family_index, VkCommandPoolCreateFlags flags) {
736*b7893ccfSSadaf Ebrahimi     VkCommandPoolCreateInfo info = {};
737*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
738*b7893ccfSSadaf Ebrahimi     info.queueFamilyIndex = queue_family_index;
739*b7893ccfSSadaf Ebrahimi     info.flags = flags;
740*b7893ccfSSadaf Ebrahimi     return info;
741*b7893ccfSSadaf Ebrahimi }
742*b7893ccfSSadaf Ebrahimi 
743*b7893ccfSSadaf Ebrahimi class CommandBuffer : public internal::Handle<VkCommandBuffer> {
744*b7893ccfSSadaf Ebrahimi    public:
745*b7893ccfSSadaf Ebrahimi     ~CommandBuffer();
746*b7893ccfSSadaf Ebrahimi 
CommandBuffer()747*b7893ccfSSadaf Ebrahimi     explicit CommandBuffer() : Handle() {}
CommandBuffer(const Device & dev,const VkCommandBufferAllocateInfo & info)748*b7893ccfSSadaf Ebrahimi     explicit CommandBuffer(const Device &dev, const VkCommandBufferAllocateInfo &info) { init(dev, info); }
749*b7893ccfSSadaf Ebrahimi 
750*b7893ccfSSadaf Ebrahimi     // vkAllocateCommandBuffers()
751*b7893ccfSSadaf Ebrahimi     void init(const Device &dev, const VkCommandBufferAllocateInfo &info);
752*b7893ccfSSadaf Ebrahimi 
753*b7893ccfSSadaf Ebrahimi     // vkBeginCommandBuffer()
754*b7893ccfSSadaf Ebrahimi     void begin(const VkCommandBufferBeginInfo *info);
755*b7893ccfSSadaf Ebrahimi     void begin();
756*b7893ccfSSadaf Ebrahimi 
757*b7893ccfSSadaf Ebrahimi     // vkEndCommandBuffer()
758*b7893ccfSSadaf Ebrahimi     // vkResetCommandBuffer()
759*b7893ccfSSadaf Ebrahimi     void end();
760*b7893ccfSSadaf Ebrahimi     void reset(VkCommandBufferResetFlags flags);
reset()761*b7893ccfSSadaf Ebrahimi     void reset() { reset(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); }
762*b7893ccfSSadaf Ebrahimi 
763*b7893ccfSSadaf Ebrahimi     static VkCommandBufferAllocateInfo create_info(VkCommandPool const &pool);
764*b7893ccfSSadaf Ebrahimi 
765*b7893ccfSSadaf Ebrahimi    private:
766*b7893ccfSSadaf Ebrahimi     VkDevice dev_handle_;
767*b7893ccfSSadaf Ebrahimi     VkCommandPool cmd_pool_;
768*b7893ccfSSadaf Ebrahimi };
769*b7893ccfSSadaf Ebrahimi 
alloc_info(VkDeviceSize size,uint32_t memory_type_index)770*b7893ccfSSadaf Ebrahimi inline VkMemoryAllocateInfo DeviceMemory::alloc_info(VkDeviceSize size, uint32_t memory_type_index) {
771*b7893ccfSSadaf Ebrahimi     VkMemoryAllocateInfo info = {};
772*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
773*b7893ccfSSadaf Ebrahimi     info.allocationSize = size;
774*b7893ccfSSadaf Ebrahimi     info.memoryTypeIndex = memory_type_index;
775*b7893ccfSSadaf Ebrahimi     return info;
776*b7893ccfSSadaf Ebrahimi }
777*b7893ccfSSadaf Ebrahimi 
create_info(VkDeviceSize size,VkFlags usage,const std::vector<uint32_t> * queue_families)778*b7893ccfSSadaf Ebrahimi inline VkBufferCreateInfo Buffer::create_info(VkDeviceSize size, VkFlags usage, const std::vector<uint32_t> *queue_families) {
779*b7893ccfSSadaf Ebrahimi     VkBufferCreateInfo info = {};
780*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
781*b7893ccfSSadaf Ebrahimi     info.size = size;
782*b7893ccfSSadaf Ebrahimi     info.usage = usage;
783*b7893ccfSSadaf Ebrahimi 
784*b7893ccfSSadaf Ebrahimi     if (queue_families && queue_families->size() > 1) {
785*b7893ccfSSadaf Ebrahimi         info.sharingMode = VK_SHARING_MODE_CONCURRENT;
786*b7893ccfSSadaf Ebrahimi         info.queueFamilyIndexCount = static_cast<uint32_t>(queue_families->size());
787*b7893ccfSSadaf Ebrahimi         info.pQueueFamilyIndices = queue_families->data();
788*b7893ccfSSadaf Ebrahimi     }
789*b7893ccfSSadaf Ebrahimi 
790*b7893ccfSSadaf Ebrahimi     return info;
791*b7893ccfSSadaf Ebrahimi }
792*b7893ccfSSadaf Ebrahimi 
create_info(VkFenceCreateFlags flags)793*b7893ccfSSadaf Ebrahimi inline VkFenceCreateInfo Fence::create_info(VkFenceCreateFlags flags) {
794*b7893ccfSSadaf Ebrahimi     VkFenceCreateInfo info = {};
795*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
796*b7893ccfSSadaf Ebrahimi     info.flags = flags;
797*b7893ccfSSadaf Ebrahimi     return info;
798*b7893ccfSSadaf Ebrahimi }
799*b7893ccfSSadaf Ebrahimi 
create_info()800*b7893ccfSSadaf Ebrahimi inline VkFenceCreateInfo Fence::create_info() {
801*b7893ccfSSadaf Ebrahimi     VkFenceCreateInfo info = {};
802*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
803*b7893ccfSSadaf Ebrahimi     return info;
804*b7893ccfSSadaf Ebrahimi }
805*b7893ccfSSadaf Ebrahimi 
create_info(VkFlags flags)806*b7893ccfSSadaf Ebrahimi inline VkSemaphoreCreateInfo Semaphore::create_info(VkFlags flags) {
807*b7893ccfSSadaf Ebrahimi     VkSemaphoreCreateInfo info = {};
808*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
809*b7893ccfSSadaf Ebrahimi     info.flags = flags;
810*b7893ccfSSadaf Ebrahimi     return info;
811*b7893ccfSSadaf Ebrahimi }
812*b7893ccfSSadaf Ebrahimi 
create_info(VkFlags flags)813*b7893ccfSSadaf Ebrahimi inline VkEventCreateInfo Event::create_info(VkFlags flags) {
814*b7893ccfSSadaf Ebrahimi     VkEventCreateInfo info = {};
815*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
816*b7893ccfSSadaf Ebrahimi     info.flags = flags;
817*b7893ccfSSadaf Ebrahimi     return info;
818*b7893ccfSSadaf Ebrahimi }
819*b7893ccfSSadaf Ebrahimi 
create_info(VkQueryType type,uint32_t slot_count)820*b7893ccfSSadaf Ebrahimi inline VkQueryPoolCreateInfo QueryPool::create_info(VkQueryType type, uint32_t slot_count) {
821*b7893ccfSSadaf Ebrahimi     VkQueryPoolCreateInfo info = {};
822*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
823*b7893ccfSSadaf Ebrahimi     info.queryType = type;
824*b7893ccfSSadaf Ebrahimi     info.queryCount = slot_count;
825*b7893ccfSSadaf Ebrahimi     return info;
826*b7893ccfSSadaf Ebrahimi }
827*b7893ccfSSadaf Ebrahimi 
create_info()828*b7893ccfSSadaf Ebrahimi inline VkImageCreateInfo Image::create_info() {
829*b7893ccfSSadaf Ebrahimi     VkImageCreateInfo info = {};
830*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
831*b7893ccfSSadaf Ebrahimi     info.extent.width = 1;
832*b7893ccfSSadaf Ebrahimi     info.extent.height = 1;
833*b7893ccfSSadaf Ebrahimi     info.extent.depth = 1;
834*b7893ccfSSadaf Ebrahimi     info.mipLevels = 1;
835*b7893ccfSSadaf Ebrahimi     info.arrayLayers = 1;
836*b7893ccfSSadaf Ebrahimi     info.samples = VK_SAMPLE_COUNT_1_BIT;
837*b7893ccfSSadaf Ebrahimi     return info;
838*b7893ccfSSadaf Ebrahimi }
839*b7893ccfSSadaf Ebrahimi 
subresource(VkImageAspectFlags aspect,uint32_t mip_level,uint32_t array_layer)840*b7893ccfSSadaf Ebrahimi inline VkImageSubresource Image::subresource(VkImageAspectFlags aspect, uint32_t mip_level, uint32_t array_layer) {
841*b7893ccfSSadaf Ebrahimi     VkImageSubresource subres = {};
842*b7893ccfSSadaf Ebrahimi     if (aspect == 0) {
843*b7893ccfSSadaf Ebrahimi         assert(!"Invalid VkImageAspectFlags");
844*b7893ccfSSadaf Ebrahimi     }
845*b7893ccfSSadaf Ebrahimi     subres.aspectMask = aspect;
846*b7893ccfSSadaf Ebrahimi     subres.mipLevel = mip_level;
847*b7893ccfSSadaf Ebrahimi     subres.arrayLayer = array_layer;
848*b7893ccfSSadaf Ebrahimi     return subres;
849*b7893ccfSSadaf Ebrahimi }
850*b7893ccfSSadaf Ebrahimi 
subresource(const VkImageSubresourceRange & range,uint32_t mip_level,uint32_t array_layer)851*b7893ccfSSadaf Ebrahimi inline VkImageSubresource Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer) {
852*b7893ccfSSadaf Ebrahimi     return subresource(range.aspectMask, range.baseMipLevel + mip_level, range.baseArrayLayer + array_layer);
853*b7893ccfSSadaf Ebrahimi }
854*b7893ccfSSadaf Ebrahimi 
subresource(VkImageAspectFlags aspect,uint32_t mip_level,uint32_t array_layer,uint32_t array_size)855*b7893ccfSSadaf Ebrahimi inline VkImageSubresourceLayers Image::subresource(VkImageAspectFlags aspect, uint32_t mip_level, uint32_t array_layer,
856*b7893ccfSSadaf Ebrahimi                                                    uint32_t array_size) {
857*b7893ccfSSadaf Ebrahimi     VkImageSubresourceLayers subres = {};
858*b7893ccfSSadaf Ebrahimi     switch (aspect) {
859*b7893ccfSSadaf Ebrahimi         case VK_IMAGE_ASPECT_COLOR_BIT:
860*b7893ccfSSadaf Ebrahimi         case VK_IMAGE_ASPECT_DEPTH_BIT:
861*b7893ccfSSadaf Ebrahimi         case VK_IMAGE_ASPECT_STENCIL_BIT:
862*b7893ccfSSadaf Ebrahimi         case VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT:
863*b7893ccfSSadaf Ebrahimi             /* valid */
864*b7893ccfSSadaf Ebrahimi             break;
865*b7893ccfSSadaf Ebrahimi         default:
866*b7893ccfSSadaf Ebrahimi             assert(!"Invalid VkImageAspectFlags");
867*b7893ccfSSadaf Ebrahimi     }
868*b7893ccfSSadaf Ebrahimi     subres.aspectMask = aspect;
869*b7893ccfSSadaf Ebrahimi     subres.mipLevel = mip_level;
870*b7893ccfSSadaf Ebrahimi     subres.baseArrayLayer = array_layer;
871*b7893ccfSSadaf Ebrahimi     subres.layerCount = array_size;
872*b7893ccfSSadaf Ebrahimi     return subres;
873*b7893ccfSSadaf Ebrahimi }
874*b7893ccfSSadaf Ebrahimi 
subresource(const VkImageSubresourceRange & range,uint32_t mip_level,uint32_t array_layer,uint32_t array_size)875*b7893ccfSSadaf Ebrahimi inline VkImageSubresourceLayers Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer,
876*b7893ccfSSadaf Ebrahimi                                                    uint32_t array_size) {
877*b7893ccfSSadaf Ebrahimi     return subresource(range.aspectMask, range.baseMipLevel + mip_level, range.baseArrayLayer + array_layer, array_size);
878*b7893ccfSSadaf Ebrahimi }
879*b7893ccfSSadaf Ebrahimi 
subresource_range(VkImageAspectFlags aspect_mask,uint32_t base_mip_level,uint32_t mip_levels,uint32_t base_array_layer,uint32_t num_layers)880*b7893ccfSSadaf Ebrahimi inline VkImageSubresourceRange Image::subresource_range(VkImageAspectFlags aspect_mask, uint32_t base_mip_level,
881*b7893ccfSSadaf Ebrahimi                                                         uint32_t mip_levels, uint32_t base_array_layer, uint32_t num_layers) {
882*b7893ccfSSadaf Ebrahimi     VkImageSubresourceRange range = {};
883*b7893ccfSSadaf Ebrahimi     if (aspect_mask == 0) {
884*b7893ccfSSadaf Ebrahimi         assert(!"Invalid VkImageAspectFlags");
885*b7893ccfSSadaf Ebrahimi     }
886*b7893ccfSSadaf Ebrahimi     range.aspectMask = aspect_mask;
887*b7893ccfSSadaf Ebrahimi     range.baseMipLevel = base_mip_level;
888*b7893ccfSSadaf Ebrahimi     range.levelCount = mip_levels;
889*b7893ccfSSadaf Ebrahimi     range.baseArrayLayer = base_array_layer;
890*b7893ccfSSadaf Ebrahimi     range.layerCount = num_layers;
891*b7893ccfSSadaf Ebrahimi     return range;
892*b7893ccfSSadaf Ebrahimi }
893*b7893ccfSSadaf Ebrahimi 
subresource_range(const VkImageCreateInfo & info,VkImageAspectFlags aspect_mask)894*b7893ccfSSadaf Ebrahimi inline VkImageSubresourceRange Image::subresource_range(const VkImageCreateInfo &info, VkImageAspectFlags aspect_mask) {
895*b7893ccfSSadaf Ebrahimi     return subresource_range(aspect_mask, 0, info.mipLevels, 0, info.arrayLayers);
896*b7893ccfSSadaf Ebrahimi }
897*b7893ccfSSadaf Ebrahimi 
subresource_range(const VkImageSubresource & subres)898*b7893ccfSSadaf Ebrahimi inline VkImageSubresourceRange Image::subresource_range(const VkImageSubresource &subres) {
899*b7893ccfSSadaf Ebrahimi     return subresource_range(subres.aspectMask, subres.mipLevel, 1, subres.arrayLayer, 1);
900*b7893ccfSSadaf Ebrahimi }
901*b7893ccfSSadaf Ebrahimi 
extent(int32_t width,int32_t height)902*b7893ccfSSadaf Ebrahimi inline VkExtent2D Image::extent(int32_t width, int32_t height) {
903*b7893ccfSSadaf Ebrahimi     VkExtent2D extent = {};
904*b7893ccfSSadaf Ebrahimi     extent.width = width;
905*b7893ccfSSadaf Ebrahimi     extent.height = height;
906*b7893ccfSSadaf Ebrahimi     return extent;
907*b7893ccfSSadaf Ebrahimi }
908*b7893ccfSSadaf Ebrahimi 
extent(const VkExtent2D & extent,uint32_t mip_level)909*b7893ccfSSadaf Ebrahimi inline VkExtent2D Image::extent(const VkExtent2D &extent, uint32_t mip_level) {
910*b7893ccfSSadaf Ebrahimi     const int32_t width = (extent.width >> mip_level) ? extent.width >> mip_level : 1;
911*b7893ccfSSadaf Ebrahimi     const int32_t height = (extent.height >> mip_level) ? extent.height >> mip_level : 1;
912*b7893ccfSSadaf Ebrahimi     return Image::extent(width, height);
913*b7893ccfSSadaf Ebrahimi }
914*b7893ccfSSadaf Ebrahimi 
extent(const VkExtent3D & extent)915*b7893ccfSSadaf Ebrahimi inline VkExtent2D Image::extent(const VkExtent3D &extent) { return Image::extent(extent.width, extent.height); }
916*b7893ccfSSadaf Ebrahimi 
extent(int32_t width,int32_t height,int32_t depth)917*b7893ccfSSadaf Ebrahimi inline VkExtent3D Image::extent(int32_t width, int32_t height, int32_t depth) {
918*b7893ccfSSadaf Ebrahimi     VkExtent3D extent = {};
919*b7893ccfSSadaf Ebrahimi     extent.width = width;
920*b7893ccfSSadaf Ebrahimi     extent.height = height;
921*b7893ccfSSadaf Ebrahimi     extent.depth = depth;
922*b7893ccfSSadaf Ebrahimi     return extent;
923*b7893ccfSSadaf Ebrahimi }
924*b7893ccfSSadaf Ebrahimi 
extent(const VkExtent3D & extent,uint32_t mip_level)925*b7893ccfSSadaf Ebrahimi inline VkExtent3D Image::extent(const VkExtent3D &extent, uint32_t mip_level) {
926*b7893ccfSSadaf Ebrahimi     const int32_t width = (extent.width >> mip_level) ? extent.width >> mip_level : 1;
927*b7893ccfSSadaf Ebrahimi     const int32_t height = (extent.height >> mip_level) ? extent.height >> mip_level : 1;
928*b7893ccfSSadaf Ebrahimi     const int32_t depth = (extent.depth >> mip_level) ? extent.depth >> mip_level : 1;
929*b7893ccfSSadaf Ebrahimi     return Image::extent(width, height, depth);
930*b7893ccfSSadaf Ebrahimi }
931*b7893ccfSSadaf Ebrahimi 
create_info(size_t code_size,const uint32_t * code,VkFlags flags)932*b7893ccfSSadaf Ebrahimi inline VkShaderModuleCreateInfo ShaderModule::create_info(size_t code_size, const uint32_t *code, VkFlags flags) {
933*b7893ccfSSadaf Ebrahimi     VkShaderModuleCreateInfo info = {};
934*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
935*b7893ccfSSadaf Ebrahimi     info.codeSize = code_size;
936*b7893ccfSSadaf Ebrahimi     info.pCode = code;
937*b7893ccfSSadaf Ebrahimi     info.flags = flags;
938*b7893ccfSSadaf Ebrahimi     return info;
939*b7893ccfSSadaf Ebrahimi }
940*b7893ccfSSadaf Ebrahimi 
write_descriptor_set(const DescriptorSet & set,uint32_t binding,uint32_t array_element,VkDescriptorType type,uint32_t count,const VkDescriptorImageInfo * image_info)941*b7893ccfSSadaf Ebrahimi inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
942*b7893ccfSSadaf Ebrahimi                                                          VkDescriptorType type, uint32_t count,
943*b7893ccfSSadaf Ebrahimi                                                          const VkDescriptorImageInfo *image_info) {
944*b7893ccfSSadaf Ebrahimi     VkWriteDescriptorSet write = {};
945*b7893ccfSSadaf Ebrahimi     write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
946*b7893ccfSSadaf Ebrahimi     write.dstSet = set.handle();
947*b7893ccfSSadaf Ebrahimi     write.dstBinding = binding;
948*b7893ccfSSadaf Ebrahimi     write.dstArrayElement = array_element;
949*b7893ccfSSadaf Ebrahimi     write.descriptorCount = count;
950*b7893ccfSSadaf Ebrahimi     write.descriptorType = type;
951*b7893ccfSSadaf Ebrahimi     write.pImageInfo = image_info;
952*b7893ccfSSadaf Ebrahimi     return write;
953*b7893ccfSSadaf Ebrahimi }
954*b7893ccfSSadaf Ebrahimi 
write_descriptor_set(const DescriptorSet & set,uint32_t binding,uint32_t array_element,VkDescriptorType type,uint32_t count,const VkDescriptorBufferInfo * buffer_info)955*b7893ccfSSadaf Ebrahimi inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
956*b7893ccfSSadaf Ebrahimi                                                          VkDescriptorType type, uint32_t count,
957*b7893ccfSSadaf Ebrahimi                                                          const VkDescriptorBufferInfo *buffer_info) {
958*b7893ccfSSadaf Ebrahimi     VkWriteDescriptorSet write = {};
959*b7893ccfSSadaf Ebrahimi     write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
960*b7893ccfSSadaf Ebrahimi     write.dstSet = set.handle();
961*b7893ccfSSadaf Ebrahimi     write.dstBinding = binding;
962*b7893ccfSSadaf Ebrahimi     write.dstArrayElement = array_element;
963*b7893ccfSSadaf Ebrahimi     write.descriptorCount = count;
964*b7893ccfSSadaf Ebrahimi     write.descriptorType = type;
965*b7893ccfSSadaf Ebrahimi     write.pBufferInfo = buffer_info;
966*b7893ccfSSadaf Ebrahimi     return write;
967*b7893ccfSSadaf Ebrahimi }
968*b7893ccfSSadaf Ebrahimi 
write_descriptor_set(const DescriptorSet & set,uint32_t binding,uint32_t array_element,VkDescriptorType type,uint32_t count,const VkBufferView * buffer_views)969*b7893ccfSSadaf Ebrahimi inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
970*b7893ccfSSadaf Ebrahimi                                                          VkDescriptorType type, uint32_t count, const VkBufferView *buffer_views) {
971*b7893ccfSSadaf Ebrahimi     VkWriteDescriptorSet write = {};
972*b7893ccfSSadaf Ebrahimi     write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
973*b7893ccfSSadaf Ebrahimi     write.dstSet = set.handle();
974*b7893ccfSSadaf Ebrahimi     write.dstBinding = binding;
975*b7893ccfSSadaf Ebrahimi     write.dstArrayElement = array_element;
976*b7893ccfSSadaf Ebrahimi     write.descriptorCount = count;
977*b7893ccfSSadaf Ebrahimi     write.descriptorType = type;
978*b7893ccfSSadaf Ebrahimi     write.pTexelBufferView = buffer_views;
979*b7893ccfSSadaf Ebrahimi     return write;
980*b7893ccfSSadaf Ebrahimi }
981*b7893ccfSSadaf Ebrahimi 
write_descriptor_set(const DescriptorSet & set,uint32_t binding,uint32_t array_element,VkDescriptorType type,const std::vector<VkDescriptorImageInfo> & image_info)982*b7893ccfSSadaf Ebrahimi inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
983*b7893ccfSSadaf Ebrahimi                                                          VkDescriptorType type,
984*b7893ccfSSadaf Ebrahimi                                                          const std::vector<VkDescriptorImageInfo> &image_info) {
985*b7893ccfSSadaf Ebrahimi     return write_descriptor_set(set, binding, array_element, type, image_info.size(), &image_info[0]);
986*b7893ccfSSadaf Ebrahimi }
987*b7893ccfSSadaf Ebrahimi 
write_descriptor_set(const DescriptorSet & set,uint32_t binding,uint32_t array_element,VkDescriptorType type,const std::vector<VkDescriptorBufferInfo> & buffer_info)988*b7893ccfSSadaf Ebrahimi inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
989*b7893ccfSSadaf Ebrahimi                                                          VkDescriptorType type,
990*b7893ccfSSadaf Ebrahimi                                                          const std::vector<VkDescriptorBufferInfo> &buffer_info) {
991*b7893ccfSSadaf Ebrahimi     return write_descriptor_set(set, binding, array_element, type, buffer_info.size(), &buffer_info[0]);
992*b7893ccfSSadaf Ebrahimi }
993*b7893ccfSSadaf Ebrahimi 
write_descriptor_set(const DescriptorSet & set,uint32_t binding,uint32_t array_element,VkDescriptorType type,const std::vector<VkBufferView> & buffer_views)994*b7893ccfSSadaf Ebrahimi inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
995*b7893ccfSSadaf Ebrahimi                                                          VkDescriptorType type, const std::vector<VkBufferView> &buffer_views) {
996*b7893ccfSSadaf Ebrahimi     return write_descriptor_set(set, binding, array_element, type, buffer_views.size(), &buffer_views[0]);
997*b7893ccfSSadaf Ebrahimi }
998*b7893ccfSSadaf Ebrahimi 
copy_descriptor_set(const DescriptorSet & src_set,uint32_t src_binding,uint32_t src_array_element,const DescriptorSet & dst_set,uint32_t dst_binding,uint32_t dst_array_element,uint32_t count)999*b7893ccfSSadaf Ebrahimi inline VkCopyDescriptorSet Device::copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding,
1000*b7893ccfSSadaf Ebrahimi                                                        uint32_t src_array_element, const DescriptorSet &dst_set,
1001*b7893ccfSSadaf Ebrahimi                                                        uint32_t dst_binding, uint32_t dst_array_element, uint32_t count) {
1002*b7893ccfSSadaf Ebrahimi     VkCopyDescriptorSet copy = {};
1003*b7893ccfSSadaf Ebrahimi     copy.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
1004*b7893ccfSSadaf Ebrahimi     copy.srcSet = src_set.handle();
1005*b7893ccfSSadaf Ebrahimi     copy.srcBinding = src_binding;
1006*b7893ccfSSadaf Ebrahimi     copy.srcArrayElement = src_array_element;
1007*b7893ccfSSadaf Ebrahimi     copy.dstSet = dst_set.handle();
1008*b7893ccfSSadaf Ebrahimi     copy.dstBinding = dst_binding;
1009*b7893ccfSSadaf Ebrahimi     copy.dstArrayElement = dst_array_element;
1010*b7893ccfSSadaf Ebrahimi     copy.descriptorCount = count;
1011*b7893ccfSSadaf Ebrahimi 
1012*b7893ccfSSadaf Ebrahimi     return copy;
1013*b7893ccfSSadaf Ebrahimi }
1014*b7893ccfSSadaf Ebrahimi 
create_info(VkCommandPool const & pool)1015*b7893ccfSSadaf Ebrahimi inline VkCommandBufferAllocateInfo CommandBuffer::create_info(VkCommandPool const &pool) {
1016*b7893ccfSSadaf Ebrahimi     VkCommandBufferAllocateInfo info = {};
1017*b7893ccfSSadaf Ebrahimi     info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1018*b7893ccfSSadaf Ebrahimi     info.commandPool = pool;
1019*b7893ccfSSadaf Ebrahimi     info.commandBufferCount = 1;
1020*b7893ccfSSadaf Ebrahimi     return info;
1021*b7893ccfSSadaf Ebrahimi }
1022*b7893ccfSSadaf Ebrahimi 
1023*b7893ccfSSadaf Ebrahimi }  // namespace vk_testing
1024*b7893ccfSSadaf Ebrahimi 
1025*b7893ccfSSadaf Ebrahimi #endif  // VKTESTBINDING_H
1026