blob: ac0760c09a09fa93c32bb1f5cffad2d2718fc1aa [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
sfricke-samsung6fc3e322022-02-15 22:41:29 -08002 * Copyright (c) 2015-2016, 2020-2022 The Khronos Group Inc.
3 * Copyright (c) 2015-2016, 2020-2022 Valve Corporation
4 * Copyright (c) 2015-2016, 2020-2022 LunarG, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07005 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -07009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Karl Schultz6addd812016-02-02 17:17:23 -070017 *
18 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
19 * Author: Cody Northrop <cody@lunarg.com>
John Zulaufcde9d7d2018-01-18 16:53:07 -070020 * Author: John Zulauf <jzulauf@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070021 */
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060022
23#ifndef VKTESTBINDING_H
24#define VKTESTBINDING_H
25
Petr Kraus858bacd2017-12-01 23:10:08 +010026#include <algorithm>
Petr Krausc3aee2e2019-09-06 00:26:06 +020027#include <cassert>
Petr Kraus858bacd2017-12-01 23:10:08 +010028#include <iterator>
John Zulauf5abdf122018-03-27 10:12:37 -060029#include <memory>
Mark Lobodzinski722841d2016-09-07 16:34:56 -060030#include <vector>
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060031
Mark Lobodzinskic7a5fcf2019-09-27 14:09:58 -060032#include "lvt_function_pointers.h"
Petr Krausc3aee2e2019-09-06 00:26:06 +020033#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060034
35namespace vk_testing {
36
Petr Kraus858bacd2017-12-01 23:10:08 +010037template <class Dst, class Src>
38std::vector<Dst> MakeVkHandles(const std::vector<Src> &v) {
39 std::vector<Dst> handles;
40 handles.reserve(v.size());
41 std::transform(v.begin(), v.end(), std::back_inserter(handles), [](const Src &o) { return o.handle(); });
42 return handles;
43}
44
45template <class Dst, class Src>
46std::vector<Dst> MakeVkHandles(const std::vector<Src *> &v) {
47 std::vector<Dst> handles;
48 handles.reserve(v.size());
Nathaniel Cesarioc19c8b72022-03-10 23:01:21 -070049 std::transform(v.begin(), v.end(), std::back_inserter(handles),
50 [](const Src *o) { return (o) ? o->handle() : VK_NULL_HANDLE; });
Petr Kraus858bacd2017-12-01 23:10:08 +010051 return handles;
52}
53
Mark Lobodzinski722841d2016-09-07 16:34:56 -060054typedef void (*ErrorCallback)(const char *expr, const char *file, unsigned int line, const char *function);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060055void set_error_callback(ErrorCallback callback);
56
Chia-I Wu999f0482015-07-03 10:32:05 +080057class PhysicalDevice;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060058class Device;
59class Queue;
Chia-I Wuf8f074f2015-07-03 10:58:57 +080060class DeviceMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060061class Fence;
62class Semaphore;
63class Event;
64class QueryPool;
65class Buffer;
66class BufferView;
67class Image;
68class ImageView;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060069class DepthStencilView;
70class Shader;
71class Pipeline;
72class PipelineDelta;
73class Sampler;
74class DescriptorSetLayout;
Mark Lobodzinski0fadf5f2015-04-17 14:11:39 -050075class PipelineLayout;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060076class DescriptorSetPool;
77class DescriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080078class CommandBuffer;
79class CommandPool;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060080
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -060081std::vector<VkLayerProperties> GetGlobalLayers();
82std::vector<VkExtensionProperties> GetGlobalExtensions();
83std::vector<VkExtensionProperties> GetGlobalExtensions(const char *pLayerName);
84
Chia-I Wub0ed7d42015-07-03 10:13:26 +080085namespace internal {
86
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070087template <typename T>
88class Handle {
Petr Kraus4ed81e32019-09-02 23:41:19 +020089 public:
Jeremy Gebbena4fc6742022-09-15 14:57:30 -060090 const T &handle() const noexcept { return handle_; }
91 bool initialized() const noexcept { return (handle_ != T{}); }
Chia-I Wub0ed7d42015-07-03 10:13:26 +080092
Petr Kraus4ed81e32019-09-02 23:41:19 +020093 protected:
Chia-I Wub0ed7d42015-07-03 10:13:26 +080094 typedef T handle_type;
95
Jeremy Gebbena4fc6742022-09-15 14:57:30 -060096 explicit Handle() noexcept : handle_{} {}
97 explicit Handle(T handle) noexcept : handle_(handle) {}
Chia-I Wub0ed7d42015-07-03 10:13:26 +080098
Petr Krausb3d2c822017-12-01 23:09:19 +010099 // handles are non-copyable
100 Handle(const Handle &) = delete;
101 Handle &operator=(const Handle &) = delete;
102
103 // handles can be moved out
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600104 Handle(Handle &&src) noexcept : handle_{src.handle_} { src.handle_ = {}; }
105 Handle &operator=(Handle &&src) noexcept {
Petr Krausb3d2c822017-12-01 23:09:19 +0100106 handle_ = src.handle_;
107 src.handle_ = {};
108 return *this;
109 }
110
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600111 void init(T handle) noexcept {
Chia-I Wub0ed7d42015-07-03 10:13:26 +0800112 assert(!initialized());
113 handle_ = handle;
114 }
115
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -0600116 protected:
Chia-I Wub0ed7d42015-07-03 10:13:26 +0800117 T handle_;
118};
119
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700120template <typename T>
121class NonDispHandle : public Handle<T> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200122 protected:
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600123 explicit NonDispHandle() noexcept : Handle<T>(), dev_handle_(VK_NULL_HANDLE) {}
124 explicit NonDispHandle(VkDevice dev, T handle) noexcept : Handle<T>(handle), dev_handle_(dev) {}
Chia-I Wub0ed7d42015-07-03 10:13:26 +0800125
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600126 NonDispHandle(NonDispHandle &&src) noexcept : Handle<T>(std::move(src)) {
Mike Schuchardt0bc8e7a2018-01-02 14:39:51 -0700127 dev_handle_ = src.dev_handle_;
128 src.dev_handle_ = VK_NULL_HANDLE;
129 }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600130 NonDispHandle &operator=(NonDispHandle &&src) noexcept {
Mike Schuchardt0bc8e7a2018-01-02 14:39:51 -0700131 Handle<T>::operator=(std::move(src));
132 dev_handle_ = src.dev_handle_;
133 src.dev_handle_ = VK_NULL_HANDLE;
134 return *this;
135 }
Petr Krausb3d2c822017-12-01 23:09:19 +0100136
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600137 const VkDevice &device() const noexcept { return dev_handle_; }
Chia-I Wub0ed7d42015-07-03 10:13:26 +0800138
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600139 void init(VkDevice dev, T handle) noexcept {
Chia-I Wub0ed7d42015-07-03 10:13:26 +0800140 assert(!Handle<T>::initialized() && dev_handle_ == VK_NULL_HANDLE);
141 Handle<T>::init(handle);
142 dev_handle_ = dev;
143 }
144
Petr Kraus4ed81e32019-09-02 23:41:19 +0200145 private:
Chia-I Wub0ed7d42015-07-03 10:13:26 +0800146 VkDevice dev_handle_;
147};
148
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700149} // namespace internal
Chia-I Wub0ed7d42015-07-03 10:13:26 +0800150
Chia-I Wu999f0482015-07-03 10:32:05 +0800151class PhysicalDevice : public internal::Handle<VkPhysicalDevice> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200152 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700153 explicit PhysicalDevice(VkPhysicalDevice phy) : Handle(phy) {
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600154 memory_properties_ = memory_properties();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600155 device_properties_ = properties();
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600156 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600157
Tony Barbourd1c35722015-04-16 15:59:00 -0600158 VkPhysicalDeviceProperties properties() const;
Tony Barbourd1c35722015-04-16 15:59:00 -0600159 VkPhysicalDeviceMemoryProperties memory_properties() const;
Cody Northropd0802882015-08-03 17:04:53 -0600160 std::vector<VkQueueFamilyProperties> queue_properties() const;
Chris Forbesf9cfe182016-04-04 17:22:42 +1200161 VkPhysicalDeviceFeatures features() const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600162
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600163 bool set_memory_type(const uint32_t type_bits, VkMemoryAllocateInfo *info, const VkMemoryPropertyFlags properties,
Karl Schultz6addd812016-02-02 17:17:23 -0700164 const VkMemoryPropertyFlags forbid = 0) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600165
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -0600166 // vkEnumerateDeviceExtensionProperties()
Petr Kraus43bba7b2020-04-02 19:55:31 +0200167 std::vector<VkExtensionProperties> extensions(const char *pLayerName = nullptr) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600168
169 // vkEnumerateLayers()
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600170 std::vector<VkLayerProperties> layers() const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600171
Petr Kraus4ed81e32019-09-02 23:41:19 +0200172 private:
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600173 void add_extension_dependencies(uint32_t dependency_count, VkExtensionProperties *depencency_props,
174 std::vector<VkExtensionProperties> &ext_list);
Chia-I Wu999f0482015-07-03 10:32:05 +0800175
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600176 VkPhysicalDeviceMemoryProperties memory_properties_;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600177
178 VkPhysicalDeviceProperties device_properties_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600179};
180
John Zulauf01da3ee2017-10-18 18:13:37 -0600181class QueueCreateInfoArray {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200182 private:
John Zulauf01da3ee2017-10-18 18:13:37 -0600183 std::vector<VkDeviceQueueCreateInfo> queue_info_;
184 std::vector<std::vector<float>> queue_priorities_;
185
Petr Kraus4ed81e32019-09-02 23:41:19 +0200186 public:
John Zulauf01da3ee2017-10-18 18:13:37 -0600187 QueueCreateInfoArray(const std::vector<VkQueueFamilyProperties> &queue_props);
188 size_t size() const { return queue_info_.size(); }
189 const VkDeviceQueueCreateInfo *data() const { return queue_info_.data(); }
190};
191
Chia-I Wuf368b602015-07-03 10:41:20 +0800192class Device : public internal::Handle<VkDevice> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200193 public:
Chia-I Wu999f0482015-07-03 10:32:05 +0800194 explicit Device(VkPhysicalDevice phy) : phy_(phy) {}
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600195 ~Device() noexcept;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600196
197 // vkCreateDevice()
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600198 void init(const VkDeviceCreateInfo &info);
Jeff Bolzfdf96072018-04-10 14:32:18 -0500199 void init(std::vector<const char *> &extensions, VkPhysicalDeviceFeatures *features = nullptr,
Tony-LunarG58c59b42019-01-03 13:19:11 -0700200 void *create_device_pnext = nullptr); // all queues, all extensions, etc
Karl Schultz6addd812016-02-02 17:17:23 -0700201 void init() {
Karl Schultz6addd812016-02-02 17:17:23 -0700202 std::vector<const char *> extensions;
Tony Barbour4c70d102016-08-08 16:06:56 -0600203 init(extensions);
Karl Schultz6addd812016-02-02 17:17:23 -0700204 };
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600205
Chia-I Wu999f0482015-07-03 10:32:05 +0800206 const PhysicalDevice &phy() const { return phy_; }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600207
Petr Krausb9659a02017-12-11 01:17:46 +0100208 std::vector<const char *> GetEnabledExtensions() { return enabled_extensions_; }
Cort Stratton72f89aa2018-05-27 10:40:27 -0700209 bool IsEnabledExtension(const char *extension);
Petr Krausb9659a02017-12-11 01:17:46 +0100210
Jon Ashburn8d1b0b52015-05-18 13:20:15 -0600211 // vkGetDeviceProcAddr()
Mark Lobodzinskic7a5fcf2019-09-27 14:09:58 -0600212 PFN_vkVoidFunction get_proc(const char *name) const { return vk::GetDeviceProcAddr(handle(), name); }
Jon Ashburn8d1b0b52015-05-18 13:20:15 -0600213
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600214 // vkGetDeviceQueue()
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600215 const std::vector<Queue *> &graphics_queues() const { return queues_[GRAPHICS]; }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600216 const std::vector<Queue *> &compute_queues() { return queues_[COMPUTE]; }
217 const std::vector<Queue *> &dma_queues() { return queues_[DMA]; }
John Zulauf5abdf122018-03-27 10:12:37 -0600218
219 typedef std::vector<std::unique_ptr<Queue>> QueueFamilyQueues;
220 typedef std::vector<QueueFamilyQueues> QueueFamilies;
221 const QueueFamilyQueues &queue_family_queues(uint32_t queue_family) const;
222
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600223 uint32_t graphics_queue_node_index_;
224
225 struct Format {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600226 VkFormat format;
227 VkImageTiling tiling;
228 VkFlags features;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600229 };
230 // vkGetFormatInfo()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600231 VkFormatProperties format_properties(VkFormat format);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600232 const std::vector<Format> &formats() const { return formats_; }
233
234 // vkDeviceWaitIdle()
235 void wait();
236
237 // vkWaitForFences()
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600238 VkResult wait(const std::vector<const Fence *> &fences, bool wait_all, uint64_t timeout);
239 VkResult wait(const Fence &fence) { return wait(std::vector<const Fence *>(1, &fence), true, (uint64_t)-1); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600240
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800241 // vkUpdateDescriptorSets()
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600242 void update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes, const std::vector<VkCopyDescriptorSet> &copies);
243 void update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes) {
244 return update_descriptor_sets(writes, std::vector<VkCopyDescriptorSet>());
Karl Schultz6addd812016-02-02 17:17:23 -0700245 }
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800246
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600247 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
248 VkDescriptorType type, uint32_t count,
249 const VkDescriptorImageInfo *image_info);
250 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
251 VkDescriptorType type, uint32_t count,
252 const VkDescriptorBufferInfo *buffer_info);
253 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
254 VkDescriptorType type, uint32_t count, const VkBufferView *buffer_views);
255 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
256 VkDescriptorType type, const std::vector<VkDescriptorImageInfo> &image_info);
257 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
258 VkDescriptorType type, const std::vector<VkDescriptorBufferInfo> &buffer_info);
259 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
260 VkDescriptorType type, const std::vector<VkBufferView> &buffer_views);
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800261
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600262 static VkCopyDescriptorSet copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding, uint32_t src_array_element,
263 const DescriptorSet &dst_set, uint32_t dst_binding, uint32_t dst_array_element,
264 uint32_t count);
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800265
Petr Kraus4ed81e32019-09-02 23:41:19 +0200266 private:
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600267 enum QueueIndex {
268 GRAPHICS,
269 COMPUTE,
270 DMA,
271 QUEUE_COUNT,
272 };
273
Jeremy Gebbenc7af14b2021-10-22 11:16:48 -0600274 void init_queues(const VkDeviceCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600275 void init_formats();
276
Chia-I Wu999f0482015-07-03 10:32:05 +0800277 PhysicalDevice phy_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600278
Petr Krausb9659a02017-12-11 01:17:46 +0100279 std::vector<const char *> enabled_extensions_;
280
John Zulauf5abdf122018-03-27 10:12:37 -0600281 QueueFamilies queue_families_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600282 std::vector<Queue *> queues_[QUEUE_COUNT];
283 std::vector<Format> formats_;
284};
285
Chia-I Wudf12ffd2015-07-03 10:53:18 +0800286class Queue : public internal::Handle<VkQueue> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200287 public:
John Zulaufbd0a45c2022-05-25 15:17:14 -0600288 explicit Queue(VkQueue queue, uint32_t index) : Handle(queue) { family_index_ = index; }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600289
290 // vkQueueSubmit()
John Zulauf71095472018-03-26 14:45:12 -0600291 VkResult submit(const std::vector<const CommandBuffer *> &cmds, const Fence &fence, bool expect_success = true);
292 VkResult submit(const CommandBuffer &cmd, const Fence &fence, bool expect_success = true);
293 VkResult submit(const CommandBuffer &cmd, bool expect_success = true);
sjfrickea143ec22022-08-02 21:46:04 +0900294 // vkQueueSubmit2()
295 VkResult submit2(const std::vector<const CommandBuffer *> &cmds, const Fence &fence, bool expect_success = true);
296 VkResult submit2(const CommandBuffer &cmd, const Fence &fence, bool expect_success = true);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600297
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600298 // vkQueueWaitIdle()
John Zulauf71095472018-03-26 14:45:12 -0600299 VkResult wait();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600300
John Zulauf6df2d5c2022-05-28 13:02:21 -0600301 uint32_t get_family_index() const { return family_index_; }
Tony Barbourfb21ea32015-07-23 10:35:30 -0600302
Petr Kraus4ed81e32019-09-02 23:41:19 +0200303 private:
John Zulaufbd0a45c2022-05-25 15:17:14 -0600304 uint32_t family_index_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600305};
306
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800307class DeviceMemory : public internal::NonDispHandle<VkDeviceMemory> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200308 public:
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -0600309 DeviceMemory() = default;
310 DeviceMemory(const Device &dev, const VkMemoryAllocateInfo &info) { init(dev, info); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600311 ~DeviceMemory() noexcept;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600312
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800313 // vkAllocateMemory()
314 void init(const Device &dev, const VkMemoryAllocateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600315
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600316 // vkMapMemory()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600317 const void *map(VkFlags flags) const;
Karl Schultz6addd812016-02-02 17:17:23 -0700318 void *map(VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600319 const void *map() const { return map(0); }
Karl Schultz6addd812016-02-02 17:17:23 -0700320 void *map() { return map(0); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600321
322 // vkUnmapMemory()
323 void unmap() const;
324
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600325 static VkMemoryAllocateInfo alloc_info(VkDeviceSize size, uint32_t memory_type_index);
Mike Schuchardt8cacbb02017-10-26 14:06:38 -0600326 static VkMemoryAllocateInfo get_resource_alloc_info(const vk_testing::Device &dev, const VkMemoryRequirements &reqs,
327 VkMemoryPropertyFlags mem_props);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600328};
329
Chia-I Wud9e8e822015-07-03 11:45:55 +0800330class Fence : public internal::NonDispHandle<VkFence> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200331 public:
Jeremy Gebbenacaac9f2022-09-16 12:14:21 -0600332#ifdef _WIN32
333 using ExternalHandle = HANDLE;
334#else
335 using ExternalHandle = int;
336#endif
337
paul-lunargde56bc12022-06-27 18:57:48 +0200338 Fence() = default;
339 Fence(const Device &dev, const VkFenceCreateInfo &info) { init(dev, info); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600340 ~Fence() noexcept;
paul-lunargde56bc12022-06-27 18:57:48 +0200341
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600342 // vkCreateFence()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600343 void init(const Device &dev, const VkFenceCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600344
345 // vkGetFenceStatus()
Mark Lobodzinskic7a5fcf2019-09-27 14:09:58 -0600346 VkResult status() const { return vk::GetFenceStatus(device(), handle()); }
Petr Kraus70fc4652020-04-25 20:10:49 +0200347 VkResult wait(uint64_t timeout) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600348
Jeremy Gebbenacaac9f2022-09-16 12:14:21 -0600349 VkResult reset();
350
351 VkResult export_handle(ExternalHandle &handle, VkExternalFenceHandleTypeFlagBits handle_type);
352 VkResult import_handle(ExternalHandle handle, VkExternalFenceHandleTypeFlagBits handle_type, VkFenceImportFlags flags = 0);
353
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600354 static VkFenceCreateInfo create_info(VkFenceCreateFlags flags);
355 static VkFenceCreateInfo create_info();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600356};
357
Chia-I Wu6b1c2482015-07-03 11:49:42 +0800358class Semaphore : public internal::NonDispHandle<VkSemaphore> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200359 public:
Jeremy Gebbenacaac9f2022-09-16 12:14:21 -0600360#ifdef _WIN32
361 using ExternalHandle = HANDLE;
362#else
363 using ExternalHandle = int;
364#endif
365
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -0600366 Semaphore() = default;
Nathaniel Cesario13da77b2022-07-15 14:51:12 -0600367 Semaphore(const Device &dev) { init(dev, LvlInitStruct<VkSemaphoreCreateInfo>()); }
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -0600368 Semaphore(const Device &dev, const VkSemaphoreCreateInfo &info) { init(dev, info); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600369 ~Semaphore() noexcept;
Chia-I Wu6b1c2482015-07-03 11:49:42 +0800370
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600371 // vkCreateSemaphore()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600372 void init(const Device &dev, const VkSemaphoreCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600373
Jeremy Gebbenacaac9f2022-09-16 12:14:21 -0600374 VkResult export_handle(ExternalHandle &ext_handle, VkExternalSemaphoreHandleTypeFlagBits handle_type);
375 VkResult import_handle(ExternalHandle ext_handle, VkExternalSemaphoreHandleTypeFlagBits handle_type,
376 VkSemaphoreImportFlags flags = 0);
377
Tony Barbouraf892a12015-06-26 12:56:09 -0600378 static VkSemaphoreCreateInfo create_info(VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600379};
380
Chia-I Wuc5c97992015-07-03 11:49:42 +0800381class Event : public internal::NonDispHandle<VkEvent> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200382 public:
Nathaniel Cesario079b1b92022-07-06 15:56:26 -0600383 Event() = default;
Nathaniel Cesario13da77b2022-07-15 14:51:12 -0600384 Event(const Device &dev) { init(dev, LvlInitStruct<VkEventCreateInfo>()); }
Nathaniel Cesario079b1b92022-07-06 15:56:26 -0600385 Event(const Device &dev, const VkEventCreateInfo &info) { init(dev, info); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600386 ~Event() noexcept;
Chia-I Wuc5c97992015-07-03 11:49:42 +0800387
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600388 // vkCreateEvent()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600389 void init(const Device &dev, const VkEventCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600390
391 // vkGetEventStatus()
392 // vkSetEvent()
393 // vkResetEvent()
Mark Lobodzinskic7a5fcf2019-09-27 14:09:58 -0600394 VkResult status() const { return vk::GetEventStatus(device(), handle()); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600395 void set();
John Zulauf77019312020-12-15 09:04:32 -0700396 void cmd_set(const CommandBuffer &cmd, VkPipelineStageFlags stage_mask);
397 void cmd_reset(const CommandBuffer &cmd, VkPipelineStageFlags stage_mask);
John Zulaufb66ee052022-06-10 16:52:28 -0600398 void cmd_wait(const CommandBuffer &cmd, VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask,
399 const std::vector<VkMemoryBarrier> &memory_barriers, const std::vector<VkBufferMemoryBarrier> &buffer_barriers,
400 const std::vector<VkImageMemoryBarrier> &image_barriers);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600401 void reset();
402
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600403 static VkEventCreateInfo create_info(VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600404};
405
Chia-I Wu1b7d4762015-07-03 11:49:42 +0800406class QueryPool : public internal::NonDispHandle<VkQueryPool> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200407 public:
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -0600408 QueryPool() = default;
409 QueryPool(const Device &dev, const VkQueryPoolCreateInfo &info) { init(dev, info); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600410 ~QueryPool() noexcept;
Chia-I Wu1b7d4762015-07-03 11:49:42 +0800411
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600412 // vkCreateQueryPool()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600413 void init(const Device &dev, const VkQueryPoolCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600414
415 // vkGetQueryPoolResults()
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600416 VkResult results(uint32_t first, uint32_t count, size_t size, void *data, size_t stride);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600417
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600418 static VkQueryPoolCreateInfo create_info(VkQueryType type, uint32_t slot_count);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600419};
420
Nathaniel Cesario079b1b92022-07-06 15:56:26 -0600421struct NoMemT {};
422static constexpr NoMemT no_mem{};
423
Chia-I Wu681d7a02015-07-03 13:44:34 +0800424class Buffer : public internal::NonDispHandle<VkBuffer> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200425 public:
Chia-I Wu681d7a02015-07-03 13:44:34 +0800426 explicit Buffer() : NonDispHandle() {}
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600427 explicit Buffer(const Device &dev, const VkBufferCreateInfo &info) { init(dev, info); }
Nathaniel Cesario079b1b92022-07-06 15:56:26 -0600428 explicit Buffer(const Device &dev, const VkBufferCreateInfo &info, NoMemT) { init_no_mem(dev, info); }
Tony Barbourd1c35722015-04-16 15:59:00 -0600429 explicit Buffer(const Device &dev, VkDeviceSize size) { init(dev, size); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600430
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600431 ~Buffer() noexcept;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800432
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600433 // vkCreateBuffer()
Tony-LunarGc7cd9b32022-07-12 14:25:39 -0600434 void init(const Device &dev, const VkBufferCreateInfo &info, VkMemoryPropertyFlags mem_props, void *alloc_info_pnext = nullptr);
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600435 void init(const Device &dev, const VkBufferCreateInfo &info) { init(dev, info, 0); }
unknown11b2e802019-06-03 11:47:40 -0600436 void init(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags mem_props,
Jason Macnakaabfa9b2019-07-17 15:20:22 -0700437 VkBufferUsageFlags usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, const std::vector<uint32_t> &queue_families = {}) {
438 init(dev, create_info(size, usage, &queue_families), mem_props);
unknown11b2e802019-06-03 11:47:40 -0600439 }
Tony-LunarGc7cd9b32022-07-12 14:25:39 -0600440 void init(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags mem_props, VkBufferUsageFlags usage,
441 void *alloc_info_pnext) {
442 init(dev, create_info(size, usage), mem_props, alloc_info_pnext);
443 }
Chia-I Wu681d7a02015-07-03 13:44:34 +0800444 void init(const Device &dev, VkDeviceSize size) { init(dev, size, 0); }
John Zulauf3d92b722018-01-16 11:15:15 -0700445 void init_as_src(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs,
446 const std::vector<uint32_t> *queue_families = nullptr) {
447 init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, queue_families), reqs);
Karl Schultz6addd812016-02-02 17:17:23 -0700448 }
John Zulauf3d92b722018-01-16 11:15:15 -0700449 void init_as_dst(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs,
450 const std::vector<uint32_t> *queue_families = nullptr) {
451 init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_DST_BIT, queue_families), reqs);
Karl Schultz6addd812016-02-02 17:17:23 -0700452 }
John Zulauf3d92b722018-01-16 11:15:15 -0700453 void init_as_src_and_dst(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs,
unknown11b2e802019-06-03 11:47:40 -0600454 const std::vector<uint32_t> *queue_families = nullptr, bool memory = true) {
455 if (memory)
456 init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, queue_families), reqs);
457 else
458 init_no_mem(dev,
459 create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, queue_families));
Karl Schultz6addd812016-02-02 17:17:23 -0700460 }
Tony-LunarGedde6752020-08-28 13:41:30 -0600461 void init_as_storage(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs,
462 const std::vector<uint32_t> *queue_families = nullptr) {
463 init(dev, create_info(size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, queue_families), reqs);
464 }
465
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600466 void init_no_mem(const Device &dev, const VkBufferCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600467
Chia-I Wu681d7a02015-07-03 13:44:34 +0800468 // get the internal memory
469 const DeviceMemory &memory() const { return internal_mem_; }
Karl Schultz6addd812016-02-02 17:17:23 -0700470 DeviceMemory &memory() { return internal_mem_; }
Chia-I Wu681d7a02015-07-03 13:44:34 +0800471
472 // vkGetObjectMemoryRequirements()
473 VkMemoryRequirements memory_requirements() const;
474
475 // vkBindObjectMemory()
476 void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -0600477 // Bind to internal_mem_ reference
478 void bind_memory(const Device &dev, VkMemoryPropertyFlags mem_props, VkDeviceSize mem_offset);
Mark Lobodzinski942b1722015-05-11 17:21:15 -0500479
John Zulauf065ca132018-02-20 12:19:28 -0700480 const VkBufferCreateInfo &create_info() const { return create_info_; }
John Zulauf3d92b722018-01-16 11:15:15 -0700481 static VkBufferCreateInfo create_info(VkDeviceSize size, VkFlags usage, const std::vector<uint32_t> *queue_families = nullptr);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600482
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600483 VkBufferMemoryBarrier buffer_memory_barrier(VkFlags output_mask, VkFlags input_mask, VkDeviceSize offset,
Karl Schultz6addd812016-02-02 17:17:23 -0700484 VkDeviceSize size) const {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800485 VkBufferMemoryBarrier barrier = LvlInitStruct<VkBufferMemoryBarrier>();
Chia-I Wu681d7a02015-07-03 13:44:34 +0800486 barrier.buffer = handle();
Chia-I Wua4594202015-10-27 19:54:37 +0800487 barrier.srcAccessMask = output_mask;
488 barrier.dstAccessMask = input_mask;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600489 barrier.offset = offset;
490 barrier.size = size;
John Zulauf3d92b722018-01-16 11:15:15 -0700491 if (create_info_.sharingMode == VK_SHARING_MODE_CONCURRENT) {
492 barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
493 barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
494 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600495 return barrier;
496 }
Chia-I Wu681d7a02015-07-03 13:44:34 +0800497
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700498 VkBufferMemoryBarrier2KHR buffer_memory_barrier(VkPipelineStageFlags2KHR src_stage, VkPipelineStageFlags2KHR dst_stage,
499 VkAccessFlags2KHR src_access, VkAccessFlags2KHR dst_access, VkDeviceSize offset,
500 VkDeviceSize size) const {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800501 VkBufferMemoryBarrier2KHR barrier = LvlInitStruct<VkBufferMemoryBarrier2KHR>();
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700502 barrier.buffer = handle();
503 barrier.srcStageMask = src_stage;
504 barrier.dstStageMask = dst_stage;
505 barrier.srcAccessMask = src_access;
506 barrier.dstAccessMask = dst_access;
507 barrier.offset = offset;
508 barrier.size = size;
509 if (create_info_.sharingMode == VK_SHARING_MODE_CONCURRENT) {
510 barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
511 barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
512 }
513 return barrier;
514 }
515
Petr Kraus4ed81e32019-09-02 23:41:19 +0200516 private:
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600517 VkBufferCreateInfo create_info_;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800518
519 DeviceMemory internal_mem_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600520};
521
Chia-I Wu3158bf32015-07-03 11:49:42 +0800522class BufferView : public internal::NonDispHandle<VkBufferView> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200523 public:
Nathaniel Cesariocabaf442022-07-21 14:57:41 -0600524 BufferView() = default;
525 BufferView(const Device &dev, const VkBufferViewCreateInfo &info) { init(dev, info); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600526 ~BufferView() noexcept;
Chia-I Wu3158bf32015-07-03 11:49:42 +0800527
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600528 // vkCreateBufferView()
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600529 void init(const Device &dev, const VkBufferViewCreateInfo &info);
John Zulaufcde9d7d2018-01-18 16:53:07 -0700530 static VkBufferViewCreateInfo createInfo(VkBuffer buffer, VkFormat format, VkDeviceSize offset = 0,
531 VkDeviceSize range = VK_WHOLE_SIZE);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600532};
533
John Zulaufcde9d7d2018-01-18 16:53:07 -0700534inline VkBufferViewCreateInfo BufferView::createInfo(VkBuffer buffer, VkFormat format, VkDeviceSize offset, VkDeviceSize range) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800535 VkBufferViewCreateInfo info = LvlInitStruct<VkBufferViewCreateInfo>();
John Zulaufcde9d7d2018-01-18 16:53:07 -0700536 info.flags = VkFlags(0);
537 info.buffer = buffer;
538 info.format = format;
539 info.offset = offset;
540 info.range = range;
541 return info;
542}
543
Chia-I Wu681d7a02015-07-03 13:44:34 +0800544class Image : public internal::NonDispHandle<VkImage> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200545 public:
Chia-I Wu681d7a02015-07-03 13:44:34 +0800546 explicit Image() : NonDispHandle(), format_features_(0) {}
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600547 explicit Image(const Device &dev, const VkImageCreateInfo &info) : format_features_(0) { init(dev, info); }
Nathaniel Cesario079b1b92022-07-06 15:56:26 -0600548 explicit Image(const Device &dev, const VkImageCreateInfo &info, NoMemT) : format_features_(0) { init_no_mem(dev, info); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600549
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600550 ~Image() noexcept;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800551
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600552 // vkCreateImage()
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600553 void init(const Device &dev, const VkImageCreateInfo &info, VkMemoryPropertyFlags mem_props);
554 void init(const Device &dev, const VkImageCreateInfo &info) { init(dev, info, 0); }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600555 void init_no_mem(const Device &dev, const VkImageCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600556
Chia-I Wu681d7a02015-07-03 13:44:34 +0800557 // get the internal memory
558 const DeviceMemory &memory() const { return internal_mem_; }
Karl Schultz6addd812016-02-02 17:17:23 -0700559 DeviceMemory &memory() { return internal_mem_; }
Chia-I Wu681d7a02015-07-03 13:44:34 +0800560
561 // vkGetObjectMemoryRequirements()
562 VkMemoryRequirements memory_requirements() const;
563
564 // vkBindObjectMemory()
565 void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600566
Tony Barbour59a47322015-06-24 16:06:58 -0600567 // vkGetImageSubresourceLayout()
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600568 VkSubresourceLayout subresource_layout(const VkImageSubresource &subres) const;
569 VkSubresourceLayout subresource_layout(const VkImageSubresourceLayers &subres) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600570
571 bool transparent() const;
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600572 bool copyable() const { return (format_features_ & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600573
John Zulauf5e01c4a2022-07-25 18:00:18 -0600574 VkImageAspectFlags aspect_mask() const { return aspect_mask(create_info_.format); }
575
576 VkImageSubresourceRange subresource_range() const { return subresource_range(create_info_, aspect_mask()); }
John Zulauf567887d2019-04-16 09:04:57 -0600577 VkImageSubresourceRange subresource_range(VkImageAspectFlags aspect) const { return subresource_range(create_info_, aspect); }
John Zulauf5e01c4a2022-07-25 18:00:18 -0600578
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600579 VkExtent3D extent() const { return create_info_.extent; }
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600580 VkExtent3D extent(uint32_t mip_level) const { return extent(create_info_.extent, mip_level); }
Karl Schultz6addd812016-02-02 17:17:23 -0700581 VkFormat format() const { return create_info_.format; }
Mike Weiblene6e01172017-03-07 22:18:40 -0700582 VkImageUsageFlags usage() const { return create_info_.usage; }
John Zulauf3d92b722018-01-16 11:15:15 -0700583 VkSharingMode sharing_mode() const { return create_info_.sharingMode; }
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600584 VkImageMemoryBarrier image_memory_barrier(VkFlags output_mask, VkFlags input_mask, VkImageLayout old_layout,
unknown11b2e802019-06-03 11:47:40 -0600585 VkImageLayout new_layout, const VkImageSubresourceRange &range,
586 uint32_t srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
587 uint32_t dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED) const {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800588 VkImageMemoryBarrier barrier = LvlInitStruct<VkImageMemoryBarrier>();
Chia-I Wua4594202015-10-27 19:54:37 +0800589 barrier.srcAccessMask = output_mask;
590 barrier.dstAccessMask = input_mask;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600591 barrier.oldLayout = old_layout;
592 barrier.newLayout = new_layout;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800593 barrier.image = handle();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600594 barrier.subresourceRange = range;
unknown11b2e802019-06-03 11:47:40 -0600595 barrier.srcQueueFamilyIndex = srcQueueFamilyIndex;
596 barrier.dstQueueFamilyIndex = dstQueueFamilyIndex;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600597 return barrier;
598 }
599
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700600 VkImageMemoryBarrier2KHR image_memory_barrier(VkPipelineStageFlags2KHR src_stage, VkPipelineStageFlags2KHR dst_stage,
601 VkAccessFlags2KHR src_access, VkAccessFlags2KHR dst_access,
602 VkImageLayout old_layout, VkImageLayout new_layout,
603 const VkImageSubresourceRange &range,
604 uint32_t srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
605 uint32_t dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED) const {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800606 VkImageMemoryBarrier2KHR barrier = LvlInitStruct<VkImageMemoryBarrier2KHR>();
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700607 barrier.srcStageMask = src_stage;
608 barrier.dstStageMask = dst_stage;
609 barrier.srcAccessMask = src_access;
610 barrier.dstAccessMask = dst_access;
611 barrier.oldLayout = old_layout;
612 barrier.newLayout = new_layout;
613 barrier.image = handle();
614 barrier.subresourceRange = range;
615 barrier.srcQueueFamilyIndex = srcQueueFamilyIndex;
616 barrier.dstQueueFamilyIndex = dstQueueFamilyIndex;
617 return barrier;
618 }
619
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600620 static VkImageCreateInfo create_info();
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600621 static VkImageSubresource subresource(VkImageAspectFlags aspect, uint32_t mip_level, uint32_t array_layer);
622 static VkImageSubresource subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer);
623 static VkImageSubresourceLayers subresource(VkImageAspectFlags aspect, uint32_t mip_level, uint32_t array_layer,
Karl Schultz6addd812016-02-02 17:17:23 -0700624 uint32_t array_size);
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600625 static VkImageSubresourceLayers subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer,
626 uint32_t array_size);
627 static VkImageSubresourceRange subresource_range(VkImageAspectFlags aspect_mask, uint32_t base_mip_level, uint32_t mip_levels,
628 uint32_t base_array_layer, uint32_t num_layers);
629 static VkImageSubresourceRange subresource_range(const VkImageCreateInfo &info, VkImageAspectFlags aspect_mask);
630 static VkImageSubresourceRange subresource_range(const VkImageSubresource &subres);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600631
John Zulauf5e01c4a2022-07-25 18:00:18 -0600632 static VkImageAspectFlags aspect_mask(VkFormat format);
633
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600634 static VkExtent2D extent(int32_t width, int32_t height);
635 static VkExtent2D extent(const VkExtent2D &extent, uint32_t mip_level);
636 static VkExtent2D extent(const VkExtent3D &extent);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600637
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600638 static VkExtent3D extent(int32_t width, int32_t height, int32_t depth);
639 static VkExtent3D extent(const VkExtent3D &extent, uint32_t mip_level);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600640
Petr Kraus4ed81e32019-09-02 23:41:19 +0200641 private:
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600642 void init_info(const Device &dev, const VkImageCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600643
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600644 VkImageCreateInfo create_info_;
645 VkFlags format_features_;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800646
647 DeviceMemory internal_mem_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600648};
649
Chia-I Wu3158bf32015-07-03 11:49:42 +0800650class ImageView : public internal::NonDispHandle<VkImageView> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200651 public:
Nathaniel Cesario2bb759a2021-10-28 18:16:54 -0600652 explicit ImageView() = default;
653 explicit ImageView(const Device &dev, const VkImageViewCreateInfo &info) { init(dev, info); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600654 ~ImageView() noexcept;
Chia-I Wu3158bf32015-07-03 11:49:42 +0800655
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600656 // vkCreateImageView()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600657 void init(const Device &dev, const VkImageViewCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600658};
659
Jason Macnakd218cba2019-07-09 15:47:02 -0700660class AccelerationStructure : public internal::NonDispHandle<VkAccelerationStructureNV> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200661 public:
Jason Macnakd218cba2019-07-09 15:47:02 -0700662 explicit AccelerationStructure(const Device &dev, const VkAccelerationStructureCreateInfoNV &info, bool init_memory = true) {
663 init(dev, info, init_memory);
664 }
665 ~AccelerationStructure();
666
667 // vkCreateAccelerationStructureNV
668 void init(const Device &dev, const VkAccelerationStructureCreateInfoNV &info, bool init_memory = true);
Jason Macnakd218cba2019-07-09 15:47:02 -0700669 // vkGetAccelerationStructureMemoryRequirementsNV()
sourav parmarbb9d8f82020-07-17 13:01:41 -0700670 VkMemoryRequirements2 memory_requirements() const;
Jason Macnakd218cba2019-07-09 15:47:02 -0700671 VkMemoryRequirements2 build_scratch_memory_requirements() const;
672
Jason Macnake4b41ca2019-07-11 11:05:31 -0700673 uint64_t opaque_handle() const { return opaque_handle_; }
674
Jason Macnakd218cba2019-07-09 15:47:02 -0700675 const VkAccelerationStructureInfoNV &info() const { return info_; }
676
677 const VkDevice &dev() const { return device(); }
678
Tony-LunarG2c0a9722022-07-13 15:17:17 -0600679 void create_scratch_buffer(const Device &dev, Buffer *buffer, VkBufferCreateInfo *pCreateInfo = NULL,
680 bool buffer_device_address = false);
Jason Macnakd218cba2019-07-09 15:47:02 -0700681
Petr Kraus4ed81e32019-09-02 23:41:19 +0200682 private:
Jason Macnakd218cba2019-07-09 15:47:02 -0700683 VkAccelerationStructureInfoNV info_;
684 DeviceMemory memory_;
Jason Macnake4b41ca2019-07-11 11:05:31 -0700685 uint64_t opaque_handle_;
sourav parmarbb9d8f82020-07-17 13:01:41 -0700686};
687
688class AccelerationStructureKHR : public internal::NonDispHandle<VkAccelerationStructureKHR> {
689 public:
690 explicit AccelerationStructureKHR(const Device &dev, const VkAccelerationStructureCreateInfoKHR &info,
691 bool init_memory = true) {
692 init(dev, info, init_memory);
693 }
694 ~AccelerationStructureKHR();
695 // vkCreateAccelerationStructureNV
696 void init(const Device &dev, const VkAccelerationStructureCreateInfoKHR &info, bool init_memory = true);
697 uint64_t opaque_handle() const { return opaque_handle_; }
698
699 const VkAccelerationStructureCreateInfoKHR &info() const { return info_; }
700
701 const VkDevice &dev() const { return device(); }
702
Tony-LunarG2c0a9722022-07-13 15:17:17 -0600703 void create_scratch_buffer(const Device &dev, Buffer *buffer, VkBufferCreateInfo *pCreateInfo = NULL,
704 bool buffer_device_address = false);
sourav parmarbb9d8f82020-07-17 13:01:41 -0700705
706 private:
707 VkAccelerationStructureCreateInfoKHR info_;
708 DeviceMemory memory_;
709 uint64_t opaque_handle_;
Jason Macnakd218cba2019-07-09 15:47:02 -0700710};
711
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800712class ShaderModule : public internal::NonDispHandle<VkShaderModule> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200713 public:
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600714 ~ShaderModule() noexcept;
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800715
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600716 // vkCreateShaderModule()
717 void init(const Device &dev, const VkShaderModuleCreateInfo &info);
718 VkResult init_try(const Device &dev, const VkShaderModuleCreateInfo &info);
719
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600720 static VkShaderModuleCreateInfo create_info(size_t code_size, const uint32_t *code, VkFlags flags);
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600721};
722
Chia-I Wu2ff72fd2015-07-03 11:49:42 +0800723class Pipeline : public internal::NonDispHandle<VkPipeline> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200724 public:
Nathaniel Cesarioc8c11c12022-02-16 17:23:50 -0700725 Pipeline() = default;
726 Pipeline(const Device &dev, const VkGraphicsPipelineCreateInfo &info) { init(dev, info); }
727 Pipeline(const Device &dev, const VkGraphicsPipelineCreateInfo &info, const VkPipeline basePipeline) {
728 init(dev, info, basePipeline);
729 }
730 Pipeline(const Device &dev, const VkComputePipelineCreateInfo &info) { init(dev, info); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600731 ~Pipeline() noexcept;
Chia-I Wu2ff72fd2015-07-03 11:49:42 +0800732
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600733 // vkCreateGraphicsPipeline()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600734 void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600735 // vkCreateGraphicsPipelineDerivative()
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600736 void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info, const VkPipeline basePipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600737 // vkCreateComputePipeline()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600738 void init(const Device &dev, const VkComputePipelineCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600739 // vkLoadPipeline()
Karl Schultz6addd812016-02-02 17:17:23 -0700740 void init(const Device &dev, size_t size, const void *data);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600741 // vkLoadPipelineDerivative()
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600742 void init(const Device &dev, size_t size, const void *data, VkPipeline basePipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600743
Chris Forbes95292b12015-05-25 11:13:26 +1200744 // vkCreateGraphicsPipeline with error return
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600745 VkResult init_try(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
Chris Forbes95292b12015-05-25 11:13:26 +1200746
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600747 // vkStorePipeline()
748 size_t store(size_t size, void *data);
749};
750
Chia-I Wufd46e7d2015-07-03 11:49:42 +0800751class PipelineLayout : public internal::NonDispHandle<VkPipelineLayout> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200752 public:
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600753 PipelineLayout() noexcept : NonDispHandle() {}
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -0600754 PipelineLayout(const Device &dev, VkPipelineLayoutCreateInfo &info,
755 const std::vector<const DescriptorSetLayout *> &layouts = {}) {
Nathaniel Cesarioc19c8b72022-03-10 23:01:21 -0700756 init(dev, info, layouts);
757 }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600758 ~PipelineLayout() noexcept;
Chia-I Wufd46e7d2015-07-03 11:49:42 +0800759
Mike Schuchardt0bc8e7a2018-01-02 14:39:51 -0700760 // Move constructor for Visual Studio 2013
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600761 PipelineLayout(PipelineLayout &&src) noexcept : NonDispHandle(std::move(src)){};
Mike Schuchardt0bc8e7a2018-01-02 14:39:51 -0700762
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600763 PipelineLayout &operator=(PipelineLayout &&src) noexcept {
Petr Kraus65ccc882017-12-03 15:36:03 +0100764 this->~PipelineLayout();
765 this->NonDispHandle::operator=(std::move(src));
766 return *this;
767 };
768
Chia-I Wufd46e7d2015-07-03 11:49:42 +0800769 // vCreatePipelineLayout()
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600770 void init(const Device &dev, VkPipelineLayoutCreateInfo &info, const std::vector<const DescriptorSetLayout *> &layouts);
Chia-I Wufd46e7d2015-07-03 11:49:42 +0800771};
772
Chia-I Wu8c721c62015-07-03 11:49:42 +0800773class Sampler : public internal::NonDispHandle<VkSampler> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200774 public:
Nathaniel Cesario5ce41fe2022-06-07 13:37:08 -0600775 Sampler() = default;
776 Sampler(const Device &dev, const VkSamplerCreateInfo &info) { init(dev, info); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600777 ~Sampler() noexcept;
Chia-I Wu8c721c62015-07-03 11:49:42 +0800778
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600779 // vkCreateSampler()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600780 void init(const Device &dev, const VkSamplerCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600781};
782
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600783class DescriptorSetLayout : public internal::NonDispHandle<VkDescriptorSetLayout> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200784 public:
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600785 DescriptorSetLayout() noexcept : NonDispHandle(){};
Nathaniel Cesarioc19c8b72022-03-10 23:01:21 -0700786 DescriptorSetLayout(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info) { init(dev, info); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600787 ~DescriptorSetLayout() noexcept;
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800788
Mike Schuchardt0bc8e7a2018-01-02 14:39:51 -0700789 // Move constructor for Visual Studio 2013
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600790 DescriptorSetLayout(DescriptorSetLayout &&src) noexcept : NonDispHandle(std::move(src)){};
Mike Schuchardt0bc8e7a2018-01-02 14:39:51 -0700791
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600792 DescriptorSetLayout &operator=(DescriptorSetLayout &&src) noexcept {
Petr Kraus32ea6082017-12-02 01:02:59 +0100793 this->~DescriptorSetLayout();
794 this->NonDispHandle::operator=(std::move(src));
795 return *this;
796 }
797
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600798 // vkCreateDescriptorSetLayout()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600799 void init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600800};
801
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800802class DescriptorPool : public internal::NonDispHandle<VkDescriptorPool> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200803 public:
Nathaniel Cesario079b1b92022-07-06 15:56:26 -0600804 DescriptorPool() = default;
805 DescriptorPool(const Device &dev, const VkDescriptorPoolCreateInfo &info) { init(dev, info); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600806 ~DescriptorPool() noexcept;
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800807
Karl Schultz6addd812016-02-02 17:17:23 -0700808 // Descriptor sets allocated from this pool will need access to the original
809 // object
Cody Northropcdc72a42015-10-08 11:39:25 -0600810 VkDescriptorPool GetObj() { return pool_; }
811
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600812 // vkCreateDescriptorPool()
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -0600813 void init(const Device &dev, const VkDescriptorPoolCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600814
815 // vkResetDescriptorPool()
816 void reset();
817
Cody Northropcdc72a42015-10-08 11:39:25 -0600818 // vkFreeDescriptorSet()
819 void setDynamicUsage(bool isDynamic) { dynamic_usage_ = isDynamic; }
820 bool getDynamicUsage() { return dynamic_usage_; }
821
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800822 // vkAllocateDescriptorSets()
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600823 std::vector<DescriptorSet *> alloc_sets(const Device &dev, const std::vector<const DescriptorSetLayout *> &layouts);
824 std::vector<DescriptorSet *> alloc_sets(const Device &dev, const DescriptorSetLayout &layout, uint32_t count);
825 DescriptorSet *alloc_sets(const Device &dev, const DescriptorSetLayout &layout);
Cody Northropcdc72a42015-10-08 11:39:25 -0600826
John Zulaufcde9d7d2018-01-18 16:53:07 -0700827 template <typename PoolSizes>
828 static VkDescriptorPoolCreateInfo create_info(VkDescriptorPoolCreateFlags flags, uint32_t max_sets,
829 const PoolSizes &pool_sizes);
830
Petr Kraus4ed81e32019-09-02 23:41:19 +0200831 private:
Cody Northropcdc72a42015-10-08 11:39:25 -0600832 VkDescriptorPool pool_;
833
834 // Track whether this pool's usage is VK_DESCRIPTOR_POOL_USAGE_DYNAMIC
835 bool dynamic_usage_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600836};
837
John Zulaufcde9d7d2018-01-18 16:53:07 -0700838template <typename PoolSizes>
839inline VkDescriptorPoolCreateInfo DescriptorPool::create_info(VkDescriptorPoolCreateFlags flags, uint32_t max_sets,
840 const PoolSizes &pool_sizes) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800841 VkDescriptorPoolCreateInfo info = LvlInitStruct<VkDescriptorPoolCreateInfo>();
John Zulaufcde9d7d2018-01-18 16:53:07 -0700842 info.flags = flags;
843 info.maxSets = max_sets;
844 info.poolSizeCount = pool_sizes.size();
845 info.pPoolSizes = (info.poolSizeCount) ? pool_sizes.data() : nullptr;
846 return info;
847}
848
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800849class DescriptorSet : public internal::NonDispHandle<VkDescriptorSet> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200850 public:
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600851 ~DescriptorSet() noexcept;
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800852
853 explicit DescriptorSet() : NonDispHandle() {}
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600854 explicit DescriptorSet(const Device &dev, DescriptorPool *pool, VkDescriptorSet set) : NonDispHandle(dev.handle(), set) {
Karl Schultz6addd812016-02-02 17:17:23 -0700855 containing_pool_ = pool;
856 }
Tony Barbour67e99152015-07-10 14:10:27 -0600857
Petr Kraus4ed81e32019-09-02 23:41:19 +0200858 private:
Karl Schultz6addd812016-02-02 17:17:23 -0700859 DescriptorPool *containing_pool_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600860};
861
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800862class CommandPool : public internal::NonDispHandle<VkCommandPool> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200863 public:
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600864 ~CommandPool() noexcept;
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600865
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800866 explicit CommandPool() : NonDispHandle() {}
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600867 explicit CommandPool(const Device &dev, const VkCommandPoolCreateInfo &info) { init(dev, info); }
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600868
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800869 void init(const Device &dev, const VkCommandPoolCreateInfo &info);
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600870
Mike Schuchardt06304c22017-03-01 17:09:09 -0700871 static VkCommandPoolCreateInfo create_info(uint32_t queue_family_index, VkCommandPoolCreateFlags flags);
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600872};
873
Mike Schuchardt06304c22017-03-01 17:09:09 -0700874inline VkCommandPoolCreateInfo CommandPool::create_info(uint32_t queue_family_index, VkCommandPoolCreateFlags flags) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800875 VkCommandPoolCreateInfo info = LvlInitStruct<VkCommandPoolCreateInfo>();
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600876 info.queueFamilyIndex = queue_family_index;
Mike Schuchardt06304c22017-03-01 17:09:09 -0700877 info.flags = flags;
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600878 return info;
879}
880
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800881class CommandBuffer : public internal::Handle<VkCommandBuffer> {
Petr Kraus4ed81e32019-09-02 23:41:19 +0200882 public:
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600883 ~CommandBuffer() noexcept;
Chia-I Wube2b9172015-07-03 11:49:42 +0800884
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800885 explicit CommandBuffer() : Handle() {}
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600886 explicit CommandBuffer(const Device &dev, const VkCommandBufferAllocateInfo &info) { init(dev, info); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600887
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800888 // vkAllocateCommandBuffers()
889 void init(const Device &dev, const VkCommandBufferAllocateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600890
891 // vkBeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800892 void begin(const VkCommandBufferBeginInfo *info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600893 void begin();
894
895 // vkEndCommandBuffer()
896 // vkResetCommandBuffer()
897 void end();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800898 void reset(VkCommandBufferResetFlags flags);
899 void reset() { reset(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600900
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800901 static VkCommandBufferAllocateInfo create_info(VkCommandPool const &pool);
Chia-I Wube2b9172015-07-03 11:49:42 +0800902
Petr Kraus4ed81e32019-09-02 23:41:19 +0200903 private:
Chia-I Wube2b9172015-07-03 11:49:42 +0800904 VkDevice dev_handle_;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800905 VkCommandPool cmd_pool_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600906};
907
Jeremy Gebben76d2de32021-08-13 13:26:59 -0600908class RenderPass : public internal::NonDispHandle<VkRenderPass> {
909 public:
Nathaniel Cesariob3f17dc2021-08-17 12:52:22 -0600910 RenderPass() = default;
911 RenderPass(const Device &dev, const VkRenderPassCreateInfo &info) { init(dev, info); }
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -0600912 RenderPass(const Device &dev, const VkRenderPassCreateInfo2 &info, bool khr = false) { init(dev, info, khr); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600913 ~RenderPass() noexcept;
Jeremy Gebben76d2de32021-08-13 13:26:59 -0600914
915 // vkCreateRenderPass()
916 void init(const Device &dev, const VkRenderPassCreateInfo &info);
ziga-lunarg2fd0e8f2022-05-09 20:59:11 +0200917 // vkCreateRenderPass2()
Nathaniel Cesario0d50bcf2022-06-21 10:30:04 -0600918 void init(const Device &dev, const VkRenderPassCreateInfo2 &info, bool khr = false);
Jeremy Gebben76d2de32021-08-13 13:26:59 -0600919};
920
921
922class Framebuffer : public internal::NonDispHandle<VkFramebuffer> {
923 public:
Nathaniel Cesariob3f17dc2021-08-17 12:52:22 -0600924 Framebuffer() = default;
925 Framebuffer(const Device &dev, const VkFramebufferCreateInfo &info) { init(dev, info); }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600926 ~Framebuffer() noexcept;
Jeremy Gebben76d2de32021-08-13 13:26:59 -0600927
928 // vkCreateFramebuffer()
929 void init(const Device &dev, const VkFramebufferCreateInfo &info);
930};
931
paul-lunargb6454132022-07-13 10:00:39 -0600932class SamplerYcbcrConversion : public internal::NonDispHandle<VkSamplerYcbcrConversion> {
933 public:
934 SamplerYcbcrConversion() = default;
935 SamplerYcbcrConversion(const Device &dev, VkFormat format, bool khr) : khr_(khr) {
936 init(dev, DefaultConversionInfo(format), khr);
937 }
938 SamplerYcbcrConversion(const Device &dev, const VkSamplerYcbcrConversionCreateInfo &info, bool khr) : khr_(khr) {
939 init(dev, info, khr);
940 }
Jeremy Gebbena4fc6742022-09-15 14:57:30 -0600941 ~SamplerYcbcrConversion() noexcept;
paul-lunargb6454132022-07-13 10:00:39 -0600942
943 void init(const Device &dev, const VkSamplerYcbcrConversionCreateInfo &info, bool khr);
944 VkSamplerYcbcrConversionInfo ConversionInfo();
945
946 static VkSamplerYcbcrConversionCreateInfo DefaultConversionInfo(VkFormat format);
947
948 bool khr_ = false;
949};
950
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600951inline VkMemoryAllocateInfo DeviceMemory::alloc_info(VkDeviceSize size, uint32_t memory_type_index) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800952 VkMemoryAllocateInfo info = LvlInitStruct<VkMemoryAllocateInfo>();
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800953 info.allocationSize = size;
954 info.memoryTypeIndex = memory_type_index;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600955 return info;
956}
957
John Zulauf3d92b722018-01-16 11:15:15 -0700958inline VkBufferCreateInfo Buffer::create_info(VkDeviceSize size, VkFlags usage, const std::vector<uint32_t> *queue_families) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800959 VkBufferCreateInfo info = LvlInitStruct<VkBufferCreateInfo>();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600960 info.size = size;
961 info.usage = usage;
John Zulauf3d92b722018-01-16 11:15:15 -0700962
963 if (queue_families && queue_families->size() > 1) {
964 info.sharingMode = VK_SHARING_MODE_CONCURRENT;
965 info.queueFamilyIndexCount = static_cast<uint32_t>(queue_families->size());
966 info.pQueueFamilyIndices = queue_families->data();
967 }
968
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600969 return info;
970}
971
Karl Schultz6addd812016-02-02 17:17:23 -0700972inline VkFenceCreateInfo Fence::create_info(VkFenceCreateFlags flags) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800973 VkFenceCreateInfo info = LvlInitStruct<VkFenceCreateInfo>();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600974 info.flags = flags;
975 return info;
976}
977
Karl Schultz6addd812016-02-02 17:17:23 -0700978inline VkFenceCreateInfo Fence::create_info() {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800979 VkFenceCreateInfo info = LvlInitStruct<VkFenceCreateInfo>();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600980 return info;
981}
982
Karl Schultz6addd812016-02-02 17:17:23 -0700983inline VkSemaphoreCreateInfo Semaphore::create_info(VkFlags flags) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800984 VkSemaphoreCreateInfo info = LvlInitStruct<VkSemaphoreCreateInfo>();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600985 info.flags = flags;
986 return info;
987}
988
Karl Schultz6addd812016-02-02 17:17:23 -0700989inline VkEventCreateInfo Event::create_info(VkFlags flags) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800990 VkEventCreateInfo info = LvlInitStruct<VkEventCreateInfo>();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600991 info.flags = flags;
992 return info;
993}
994
Mark Lobodzinski722841d2016-09-07 16:34:56 -0600995inline VkQueryPoolCreateInfo QueryPool::create_info(VkQueryType type, uint32_t slot_count) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -0800996 VkQueryPoolCreateInfo info = LvlInitStruct<VkQueryPoolCreateInfo>();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600997 info.queryType = type;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700998 info.queryCount = slot_count;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600999 return info;
1000}
1001
Karl Schultz6addd812016-02-02 17:17:23 -07001002inline VkImageCreateInfo Image::create_info() {
sfricke-samsung6fc3e322022-02-15 22:41:29 -08001003 VkImageCreateInfo info = LvlInitStruct<VkImageCreateInfo>();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001004 info.extent.width = 1;
1005 info.extent.height = 1;
1006 info.extent.depth = 1;
1007 info.mipLevels = 1;
Courtney Goeltzenleuchter5d2aed42015-10-21 17:57:31 -06001008 info.arrayLayers = 1;
Chia-I Wu5c17c962015-10-31 00:31:16 +08001009 info.samples = VK_SAMPLE_COUNT_1_BIT;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001010 return info;
1011}
1012
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001013inline VkImageSubresource Image::subresource(VkImageAspectFlags aspect, uint32_t mip_level, uint32_t array_layer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001014 VkImageSubresource subres = {};
Karl Schultz0ab73f82016-03-29 12:41:24 -06001015 if (aspect == 0) {
Nathaniel Cesario7e351292022-05-12 14:47:07 -06001016 assert(false && "Invalid VkImageAspectFlags");
Karl Schultz0ab73f82016-03-29 12:41:24 -06001017 }
Chia-I Wu52b07e72015-10-27 19:55:05 +08001018 subres.aspectMask = aspect;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001019 subres.mipLevel = mip_level;
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -06001020 subres.arrayLayer = array_layer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001021 return subres;
1022}
1023
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001024inline VkImageSubresource Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer) {
1025 return subresource(range.aspectMask, range.baseMipLevel + mip_level, range.baseArrayLayer + array_layer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001026}
1027
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001028inline VkImageSubresourceLayers Image::subresource(VkImageAspectFlags aspect, uint32_t mip_level, uint32_t array_layer,
Karl Schultz6addd812016-02-02 17:17:23 -07001029 uint32_t array_size) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +08001030 VkImageSubresourceLayers subres = {};
Karl Schultz0ab73f82016-03-29 12:41:24 -06001031 switch (aspect) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001032 case VK_IMAGE_ASPECT_COLOR_BIT:
1033 case VK_IMAGE_ASPECT_DEPTH_BIT:
1034 case VK_IMAGE_ASPECT_STENCIL_BIT:
1035 case VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT:
1036 /* valid */
1037 break;
1038 default:
Nathaniel Cesario7e351292022-05-12 14:47:07 -06001039 assert(false && "Invalid VkImageAspectFlags");
Karl Schultz0ab73f82016-03-29 12:41:24 -06001040 }
Chia-I Wuab83a0e2015-10-27 19:00:15 +08001041 subres.aspectMask = aspect;
Courtney Goeltzenleuchter01ee1ca2015-09-10 16:41:13 -06001042 subres.mipLevel = mip_level;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -06001043 subres.baseArrayLayer = array_layer;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001044 subres.layerCount = array_size;
Courtney Goeltzenleuchter01ee1ca2015-09-10 16:41:13 -06001045 return subres;
1046}
1047
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001048inline VkImageSubresourceLayers Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer,
1049 uint32_t array_size) {
1050 return subresource(range.aspectMask, range.baseMipLevel + mip_level, range.baseArrayLayer + array_layer, array_size);
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -06001051}
1052
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001053inline VkImageSubresourceRange Image::subresource_range(VkImageAspectFlags aspect_mask, uint32_t base_mip_level,
1054 uint32_t mip_levels, uint32_t base_array_layer, uint32_t num_layers) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001055 VkImageSubresourceRange range = {};
Karl Schultz0ab73f82016-03-29 12:41:24 -06001056 if (aspect_mask == 0) {
Nathaniel Cesario7e351292022-05-12 14:47:07 -06001057 assert(false && "Invalid VkImageAspectFlags");
Karl Schultz0ab73f82016-03-29 12:41:24 -06001058 }
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -06001059 range.aspectMask = aspect_mask;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001060 range.baseMipLevel = base_mip_level;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001061 range.levelCount = mip_levels;
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -06001062 range.baseArrayLayer = base_array_layer;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001063 range.layerCount = num_layers;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001064 return range;
1065}
1066
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001067inline VkImageSubresourceRange Image::subresource_range(const VkImageCreateInfo &info, VkImageAspectFlags aspect_mask) {
1068 return subresource_range(aspect_mask, 0, info.mipLevels, 0, info.arrayLayers);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001069}
1070
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001071inline VkImageSubresourceRange Image::subresource_range(const VkImageSubresource &subres) {
1072 return subresource_range(subres.aspectMask, subres.mipLevel, 1, subres.arrayLayer, 1);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001073}
1074
Karl Schultz6addd812016-02-02 17:17:23 -07001075inline VkExtent2D Image::extent(int32_t width, int32_t height) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001076 VkExtent2D extent = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001077 extent.width = width;
1078 extent.height = height;
1079 return extent;
1080}
1081
Karl Schultz6addd812016-02-02 17:17:23 -07001082inline VkExtent2D Image::extent(const VkExtent2D &extent, uint32_t mip_level) {
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001083 const int32_t width = (extent.width >> mip_level) ? extent.width >> mip_level : 1;
1084 const int32_t height = (extent.height >> mip_level) ? extent.height >> mip_level : 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001085 return Image::extent(width, height);
1086}
1087
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001088inline VkExtent2D Image::extent(const VkExtent3D &extent) { return Image::extent(extent.width, extent.height); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001089
Karl Schultz6addd812016-02-02 17:17:23 -07001090inline VkExtent3D Image::extent(int32_t width, int32_t height, int32_t depth) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001091 VkExtent3D extent = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001092 extent.width = width;
1093 extent.height = height;
1094 extent.depth = depth;
1095 return extent;
1096}
1097
Karl Schultz6addd812016-02-02 17:17:23 -07001098inline VkExtent3D Image::extent(const VkExtent3D &extent, uint32_t mip_level) {
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001099 const int32_t width = (extent.width >> mip_level) ? extent.width >> mip_level : 1;
1100 const int32_t height = (extent.height >> mip_level) ? extent.height >> mip_level : 1;
1101 const int32_t depth = (extent.depth >> mip_level) ? extent.depth >> mip_level : 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001102 return Image::extent(width, height, depth);
1103}
1104
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001105inline VkShaderModuleCreateInfo ShaderModule::create_info(size_t code_size, const uint32_t *code, VkFlags flags) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -08001106 VkShaderModuleCreateInfo info = LvlInitStruct<VkShaderModuleCreateInfo>();
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -06001107 info.codeSize = code_size;
1108 info.pCode = code;
1109 info.flags = flags;
1110 return info;
1111}
1112
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001113inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
1114 VkDescriptorType type, uint32_t count,
1115 const VkDescriptorImageInfo *image_info) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -08001116 VkWriteDescriptorSet write = LvlInitStruct<VkWriteDescriptorSet>();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001117 write.dstSet = set.handle();
1118 write.dstBinding = binding;
1119 write.dstArrayElement = array_element;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001120 write.descriptorCount = count;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08001121 write.descriptorType = type;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06001122 write.pImageInfo = image_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08001123 return write;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001124}
1125
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001126inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
1127 VkDescriptorType type, uint32_t count,
1128 const VkDescriptorBufferInfo *buffer_info) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -08001129 VkWriteDescriptorSet write = LvlInitStruct<VkWriteDescriptorSet>();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001130 write.dstSet = set.handle();
1131 write.dstBinding = binding;
1132 write.dstArrayElement = array_element;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001133 write.descriptorCount = count;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06001134 write.descriptorType = type;
1135 write.pBufferInfo = buffer_info;
1136 return write;
1137}
1138
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001139inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
1140 VkDescriptorType type, uint32_t count, const VkBufferView *buffer_views) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -08001141 VkWriteDescriptorSet write = LvlInitStruct<VkWriteDescriptorSet>();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001142 write.dstSet = set.handle();
1143 write.dstBinding = binding;
1144 write.dstArrayElement = array_element;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001145 write.descriptorCount = count;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06001146 write.descriptorType = type;
1147 write.pTexelBufferView = buffer_views;
1148 return write;
1149}
1150
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001151inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
1152 VkDescriptorType type,
1153 const std::vector<VkDescriptorImageInfo> &image_info) {
1154 return write_descriptor_set(set, binding, array_element, type, image_info.size(), &image_info[0]);
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06001155}
1156
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001157inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
1158 VkDescriptorType type,
1159 const std::vector<VkDescriptorBufferInfo> &buffer_info) {
1160 return write_descriptor_set(set, binding, array_element, type, buffer_info.size(), &buffer_info[0]);
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06001161}
1162
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001163inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
1164 VkDescriptorType type, const std::vector<VkBufferView> &buffer_views) {
1165 return write_descriptor_set(set, binding, array_element, type, buffer_views.size(), &buffer_views[0]);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001166}
1167
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001168inline VkCopyDescriptorSet Device::copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding,
1169 uint32_t src_array_element, const DescriptorSet &dst_set,
1170 uint32_t dst_binding, uint32_t dst_array_element, uint32_t count) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -08001171 VkCopyDescriptorSet copy = LvlInitStruct<VkCopyDescriptorSet>();
Chia-I Wuafdfd7f2015-07-03 11:49:42 +08001172 copy.srcSet = src_set.handle();
Chia-I Wu9d00ed72015-05-25 16:27:55 +08001173 copy.srcBinding = src_binding;
1174 copy.srcArrayElement = src_array_element;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001175 copy.dstSet = dst_set.handle();
1176 copy.dstBinding = dst_binding;
1177 copy.dstArrayElement = dst_array_element;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001178 copy.descriptorCount = count;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001179
Chia-I Wu9d00ed72015-05-25 16:27:55 +08001180 return copy;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001181}
1182
Mark Lobodzinski722841d2016-09-07 16:34:56 -06001183inline VkCommandBufferAllocateInfo CommandBuffer::create_info(VkCommandPool const &pool) {
sfricke-samsung6fc3e322022-02-15 22:41:29 -08001184 VkCommandBufferAllocateInfo info = LvlInitStruct<VkCommandBufferAllocateInfo>();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001185 info.commandPool = pool;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001186 info.commandBufferCount = 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001187 return info;
1188}
1189
Petr Kraus13c98a62017-12-09 00:22:39 +01001190} // namespace vk_testing
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001191
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001192#endif // VKTESTBINDING_H