blob: e22933e59b191e24708307b8c16db376981ce471 [file] [log] [blame]
Karl Schultz99e9d1d2016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and/or associated documentation files (the "Materials"), to
8 * deal in the Materials without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Materials, and to permit persons to whom the Materials are
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice(s) and this permission notice shall be included in
14 * all copies or substantial portions of the Materials.
15 *
Karl Schultz99e9d1d2016-02-02 17:17:23 -070016 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 *
20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
21 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
22 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
23 * USE OR OTHER DEALINGS IN THE MATERIALS.
24 *
25 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
26 * Author: Cody Northrop <cody@lunarg.com>
27 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060028
29#ifndef VKTESTBINDING_H
30#define VKTESTBINDING_H
31
32#include <vector>
Chia-I Wua10be9d2015-07-03 10:13:26 +080033#include <assert.h>
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060034
David Pinedo329ca9e2015-11-06 12:54:48 -070035#include "vulkan/vulkan.h"
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060036
37namespace vk_testing {
38
Karl Schultz99e9d1d2016-02-02 17:17:23 -070039typedef void (*ErrorCallback)(const char *expr, const char *file,
40 unsigned int line, const char *function);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060041void set_error_callback(ErrorCallback callback);
42
Chia-I Wuf5fb1092015-07-03 10:32:05 +080043class PhysicalDevice;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060044class Device;
45class Queue;
Chia-I Wuba0836f2015-07-03 10:58:57 +080046class DeviceMemory;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060047class Fence;
48class Semaphore;
49class Event;
50class QueryPool;
51class Buffer;
52class BufferView;
53class Image;
54class ImageView;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060055class DepthStencilView;
56class Shader;
57class Pipeline;
58class PipelineDelta;
59class Sampler;
60class DescriptorSetLayout;
Mark Lobodzinski556f7212015-04-17 14:11:39 -050061class PipelineLayout;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060062class DescriptorSetPool;
63class DescriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +080064class CommandBuffer;
65class CommandPool;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060066
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -060067std::vector<VkLayerProperties> GetGlobalLayers();
68std::vector<VkExtensionProperties> GetGlobalExtensions();
69std::vector<VkExtensionProperties> GetGlobalExtensions(const char *pLayerName);
70
Chia-I Wua10be9d2015-07-03 10:13:26 +080071namespace internal {
72
Karl Schultz99e9d1d2016-02-02 17:17:23 -070073template <typename T> class Handle {
74 public:
Chia-I Wua10be9d2015-07-03 10:13:26 +080075 const T &handle() const { return handle_; }
76 bool initialized() const { return (handle_ != VK_NULL_HANDLE); }
77
Karl Schultz99e9d1d2016-02-02 17:17:23 -070078 protected:
Chia-I Wua10be9d2015-07-03 10:13:26 +080079 typedef T handle_type;
80
81 explicit Handle() : handle_(VK_NULL_HANDLE) {}
82 explicit Handle(T handle) : handle_(handle) {}
83
Karl Schultz99e9d1d2016-02-02 17:17:23 -070084 void init(T handle) {
Chia-I Wua10be9d2015-07-03 10:13:26 +080085 assert(!initialized());
86 handle_ = handle;
87 }
88
Karl Schultz99e9d1d2016-02-02 17:17:23 -070089 private:
Chia-I Wua10be9d2015-07-03 10:13:26 +080090 // handles are non-copyable
91 Handle(const Handle &);
92 Handle &operator=(const Handle &);
93
94 T handle_;
95};
96
Karl Schultz99e9d1d2016-02-02 17:17:23 -070097template <typename T> class NonDispHandle : public Handle<T> {
98 protected:
Chia-I Wua10be9d2015-07-03 10:13:26 +080099 explicit NonDispHandle() : Handle<T>(), dev_handle_(VK_NULL_HANDLE) {}
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700100 explicit NonDispHandle(VkDevice dev, T handle)
101 : Handle<T>(handle), dev_handle_(dev) {}
Chia-I Wua10be9d2015-07-03 10:13:26 +0800102
103 const VkDevice &device() const { return dev_handle_; }
104
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700105 void init(VkDevice dev, T handle) {
Chia-I Wua10be9d2015-07-03 10:13:26 +0800106 assert(!Handle<T>::initialized() && dev_handle_ == VK_NULL_HANDLE);
107 Handle<T>::init(handle);
108 dev_handle_ = dev;
109 }
110
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700111 private:
Chia-I Wua10be9d2015-07-03 10:13:26 +0800112 VkDevice dev_handle_;
113};
114
115} // namespace internal
116
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800117class PhysicalDevice : public internal::Handle<VkPhysicalDevice> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700118 public:
119 explicit PhysicalDevice(VkPhysicalDevice phy) : Handle(phy) {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600120 memory_properties_ = memory_properties();
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600121 device_properties_ = properties();
Mark Lobodzinski72346292015-07-02 16:49:40 -0600122 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600123
Tony Barbour8205d902015-04-16 15:59:00 -0600124 VkPhysicalDeviceProperties properties() const;
Tony Barbour8205d902015-04-16 15:59:00 -0600125 VkPhysicalDeviceMemoryProperties memory_properties() const;
Cody Northropef72e2a2015-08-03 17:04:53 -0600126 std::vector<VkQueueFamilyProperties> queue_properties() const;
Chris Forbes90479f42016-04-04 17:22:42 +1200127 VkPhysicalDeviceFeatures features() const;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600128
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700129 bool set_memory_type(const uint32_t type_bits, VkMemoryAllocateInfo *info,
130 const VkMemoryPropertyFlags properties,
131 const VkMemoryPropertyFlags forbid = 0) const;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600132
Courtney Goeltzenleuchter74c4ce92015-09-14 17:22:16 -0600133 // vkEnumerateDeviceExtensionProperties()
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600134 std::vector<VkExtensionProperties> extensions() const;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700135 std::vector<VkExtensionProperties> extensions(const char *pLayerName) const;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600136
137 // vkEnumerateLayers()
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600138 std::vector<VkLayerProperties> layers() const;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600139
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700140 private:
141 void
142 add_extension_dependencies(uint32_t dependency_count,
143 VkExtensionProperties *depencency_props,
144 std::vector<VkExtensionProperties> &ext_list);
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800145
Mark Lobodzinski72346292015-07-02 16:49:40 -0600146 VkPhysicalDeviceMemoryProperties memory_properties_;
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600147
148 VkPhysicalDeviceProperties device_properties_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600149};
150
Chia-I Wua2636292015-07-03 10:41:20 +0800151class Device : public internal::Handle<VkDevice> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700152 public:
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800153 explicit Device(VkPhysicalDevice phy) : phy_(phy) {}
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600154 ~Device();
155
156 // vkCreateDevice()
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600157 void init(const VkDeviceCreateInfo &info);
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700158 void init(std::vector<const char *> &layers,
159 std::vector<const char *> &
160 extensions); // all queues, all extensions, etc
161 void init() {
162 std::vector<const char *> layers;
163 std::vector<const char *> extensions;
164 init(layers, extensions);
165 };
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600166
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800167 const PhysicalDevice &phy() const { return phy_; }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600168
Jon Ashburn1245cec2015-05-18 13:20:15 -0600169 // vkGetDeviceProcAddr()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700170 PFN_vkVoidFunction get_proc(const char *name) const {
171 return vkGetDeviceProcAddr(handle(), name);
172 }
Jon Ashburn1245cec2015-05-18 13:20:15 -0600173
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600174 // vkGetDeviceQueue()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700175 const std::vector<Queue *> &graphics_queues() const {
176 return queues_[GRAPHICS];
177 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600178 const std::vector<Queue *> &compute_queues() { return queues_[COMPUTE]; }
179 const std::vector<Queue *> &dma_queues() { return queues_[DMA]; }
180 uint32_t graphics_queue_node_index_;
181
182 struct Format {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600183 VkFormat format;
184 VkImageTiling tiling;
185 VkFlags features;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600186 };
187 // vkGetFormatInfo()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600188 VkFormatProperties format_properties(VkFormat format);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600189 const std::vector<Format> &formats() const { return formats_; }
190
191 // vkDeviceWaitIdle()
192 void wait();
193
194 // vkWaitForFences()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700195 VkResult wait(const std::vector<const Fence *> &fences, bool wait_all,
196 uint64_t timeout);
197 VkResult wait(const Fence &fence) {
198 return wait(std::vector<const Fence *>(1, &fence), true, (uint64_t)-1);
199 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600200
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800201 // vkUpdateDescriptorSets()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700202 void update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes,
203 const std::vector<VkCopyDescriptorSet> &copies);
204 void
205 update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes) {
206 return update_descriptor_sets(writes,
207 std::vector<VkCopyDescriptorSet>());
208 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800209
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700210 static VkWriteDescriptorSet
211 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
212 uint32_t array_element, VkDescriptorType type,
213 uint32_t count,
214 const VkDescriptorImageInfo *image_info);
215 static VkWriteDescriptorSet
216 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
217 uint32_t array_element, VkDescriptorType type,
218 uint32_t count,
219 const VkDescriptorBufferInfo *buffer_info);
220 static VkWriteDescriptorSet
221 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
222 uint32_t array_element, VkDescriptorType type,
223 uint32_t count, const VkBufferView *buffer_views);
224 static VkWriteDescriptorSet
225 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
226 uint32_t array_element, VkDescriptorType type,
227 const std::vector<VkDescriptorImageInfo> &image_info);
228 static VkWriteDescriptorSet write_descriptor_set(
229 const DescriptorSet &set, uint32_t binding, uint32_t array_element,
230 VkDescriptorType type,
231 const std::vector<VkDescriptorBufferInfo> &buffer_info);
232 static VkWriteDescriptorSet
233 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
234 uint32_t array_element, VkDescriptorType type,
235 const std::vector<VkBufferView> &buffer_views);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800236
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700237 static VkCopyDescriptorSet
238 copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding,
239 uint32_t src_array_element,
240 const DescriptorSet &dst_set, uint32_t dst_binding,
241 uint32_t dst_array_element, uint32_t count);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800242
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700243 private:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600244 enum QueueIndex {
245 GRAPHICS,
246 COMPUTE,
247 DMA,
248 QUEUE_COUNT,
249 };
250
251 void init_queues();
252 void init_formats();
253
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800254 PhysicalDevice phy_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600255
256 std::vector<Queue *> queues_[QUEUE_COUNT];
257 std::vector<Format> formats_;
258};
259
Chia-I Wuf2862c72015-07-03 10:53:18 +0800260class Queue : public internal::Handle<VkQueue> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700261 public:
262 explicit Queue(VkQueue queue, int index) : Handle(queue) {
263 family_index_ = index;
264 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600265
266 // vkQueueSubmit()
Chia-I Wu1f851912015-10-27 18:04:07 +0800267 void submit(const std::vector<const CommandBuffer *> &cmds, Fence &fence);
268 void submit(const CommandBuffer &cmd, Fence &fence);
269 void submit(const CommandBuffer &cmd);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600270
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600271 // vkQueueWaitIdle()
272 void wait();
273
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700274 int get_family_index() { return family_index_; }
Tony Barbour0caa94f2015-07-23 10:35:30 -0600275
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700276 private:
Tony Barbour0caa94f2015-07-23 10:35:30 -0600277 int family_index_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600278};
279
Chia-I Wuba0836f2015-07-03 10:58:57 +0800280class DeviceMemory : public internal::NonDispHandle<VkDeviceMemory> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700281 public:
Chia-I Wuba0836f2015-07-03 10:58:57 +0800282 ~DeviceMemory();
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600283
Chia-I Wu1f851912015-10-27 18:04:07 +0800284 // vkAllocateMemory()
285 void init(const Device &dev, const VkMemoryAllocateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600286
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600287 // vkMapMemory()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600288 const void *map(VkFlags flags) const;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700289 void *map(VkFlags flags);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600290 const void *map() const { return map(0); }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700291 void *map() { return map(0); }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600292
293 // vkUnmapMemory()
294 void unmap() const;
295
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700296 static VkMemoryAllocateInfo alloc_info(VkDeviceSize size,
297 uint32_t memory_type_index);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600298};
299
Chia-I Wua4992342015-07-03 11:45:55 +0800300class Fence : public internal::NonDispHandle<VkFence> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700301 public:
Chia-I Wua4992342015-07-03 11:45:55 +0800302 ~Fence();
303
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600304 // vkCreateFence()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600305 void init(const Device &dev, const VkFenceCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600306
307 // vkGetFenceStatus()
Chia-I Wua4992342015-07-03 11:45:55 +0800308 VkResult status() const { return vkGetFenceStatus(device(), handle()); }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600309
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600310 static VkFenceCreateInfo create_info(VkFenceCreateFlags flags);
311 static VkFenceCreateInfo create_info();
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600312};
313
Chia-I Wu2454b922015-07-03 11:49:42 +0800314class Semaphore : public internal::NonDispHandle<VkSemaphore> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700315 public:
Chia-I Wu2454b922015-07-03 11:49:42 +0800316 ~Semaphore();
317
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600318 // vkCreateSemaphore()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600319 void init(const Device &dev, const VkSemaphoreCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600320
Tony Barbour864fd382015-06-26 12:56:09 -0600321 static VkSemaphoreCreateInfo create_info(VkFlags flags);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600322};
323
Chia-I Wu9b6db1d2015-07-03 11:49:42 +0800324class Event : public internal::NonDispHandle<VkEvent> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700325 public:
Chia-I Wu9b6db1d2015-07-03 11:49:42 +0800326 ~Event();
327
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600328 // vkCreateEvent()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600329 void init(const Device &dev, const VkEventCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600330
331 // vkGetEventStatus()
332 // vkSetEvent()
333 // vkResetEvent()
Chia-I Wu9b6db1d2015-07-03 11:49:42 +0800334 VkResult status() const { return vkGetEventStatus(device(), handle()); }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600335 void set();
336 void reset();
337
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600338 static VkEventCreateInfo create_info(VkFlags flags);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600339};
340
Chia-I Wufd0ce992015-07-03 11:49:42 +0800341class QueryPool : public internal::NonDispHandle<VkQueryPool> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700342 public:
Chia-I Wufd0ce992015-07-03 11:49:42 +0800343 ~QueryPool();
344
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600345 // vkCreateQueryPool()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600346 void init(const Device &dev, const VkQueryPoolCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600347
348 // vkGetQueryPoolResults()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700349 VkResult results(uint32_t first, uint32_t count, size_t size, void *data,
350 size_t stride);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600351
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700352 static VkQueryPoolCreateInfo create_info(VkQueryType type,
353 uint32_t slot_count);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600354};
355
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800356class Buffer : public internal::NonDispHandle<VkBuffer> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700357 public:
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800358 explicit Buffer() : NonDispHandle() {}
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700359 explicit Buffer(const Device &dev, const VkBufferCreateInfo &info) {
360 init(dev, info);
361 }
Tony Barbour8205d902015-04-16 15:59:00 -0600362 explicit Buffer(const Device &dev, VkDeviceSize size) { init(dev, size); }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600363
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800364 ~Buffer();
365
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600366 // vkCreateBuffer()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700367 void init(const Device &dev, const VkBufferCreateInfo &info,
368 VkMemoryPropertyFlags mem_props);
369 void init(const Device &dev, const VkBufferCreateInfo &info) {
370 init(dev, info, 0);
371 }
372 void init(const Device &dev, VkDeviceSize size,
373 VkMemoryPropertyFlags mem_props) {
374 init(dev, create_info(size, 0), mem_props);
375 }
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800376 void init(const Device &dev, VkDeviceSize size) { init(dev, size, 0); }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700377 void init_as_src(const Device &dev, VkDeviceSize size,
378 VkMemoryPropertyFlags &reqs) {
379 init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT), reqs);
380 }
381 void init_as_dst(const Device &dev, VkDeviceSize size,
382 VkMemoryPropertyFlags &reqs) {
383 init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_DST_BIT), reqs);
384 }
385 void init_as_src_and_dst(const Device &dev, VkDeviceSize size,
386 VkMemoryPropertyFlags &reqs) {
387 init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
388 VK_BUFFER_USAGE_TRANSFER_DST_BIT),
389 reqs);
390 }
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600391 void init_no_mem(const Device &dev, const VkBufferCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600392
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800393 // get the internal memory
394 const DeviceMemory &memory() const { return internal_mem_; }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700395 DeviceMemory &memory() { return internal_mem_; }
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800396
397 // vkGetObjectMemoryRequirements()
398 VkMemoryRequirements memory_requirements() const;
399
400 // vkBindObjectMemory()
401 void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
Mark Lobodzinskifb9f5642015-05-11 17:21:15 -0500402
Tony Barbour8205d902015-04-16 15:59:00 -0600403 static VkBufferCreateInfo create_info(VkDeviceSize size, VkFlags usage);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600404
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700405 VkBufferMemoryBarrier buffer_memory_barrier(VkFlags output_mask,
406 VkFlags input_mask,
407 VkDeviceSize offset,
408 VkDeviceSize size) const {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600409 VkBufferMemoryBarrier barrier = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600410 barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800411 barrier.buffer = handle();
Chia-I Wu989de842015-10-27 19:54:37 +0800412 barrier.srcAccessMask = output_mask;
413 barrier.dstAccessMask = input_mask;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600414 barrier.offset = offset;
415 barrier.size = size;
416 return barrier;
417 }
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800418
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700419 private:
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600420 VkBufferCreateInfo create_info_;
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800421
422 DeviceMemory internal_mem_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600423};
424
Chia-I Wu76ab1ff2015-07-03 11:49:42 +0800425class BufferView : public internal::NonDispHandle<VkBufferView> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700426 public:
Chia-I Wu76ab1ff2015-07-03 11:49:42 +0800427 ~BufferView();
428
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600429 // vkCreateBufferView()
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600430 void init(const Device &dev, const VkBufferViewCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600431};
432
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800433class Image : public internal::NonDispHandle<VkImage> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700434 public:
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800435 explicit Image() : NonDispHandle(), format_features_(0) {}
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700436 explicit Image(const Device &dev, const VkImageCreateInfo &info)
437 : format_features_(0) {
438 init(dev, info);
439 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600440
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800441 ~Image();
442
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600443 // vkCreateImage()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700444 void init(const Device &dev, const VkImageCreateInfo &info,
445 VkMemoryPropertyFlags mem_props);
446 void init(const Device &dev, const VkImageCreateInfo &info) {
447 init(dev, info, 0);
448 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600449 void init_no_mem(const Device &dev, const VkImageCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600450
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800451 // get the internal memory
452 const DeviceMemory &memory() const { return internal_mem_; }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700453 DeviceMemory &memory() { return internal_mem_; }
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800454
455 // vkGetObjectMemoryRequirements()
456 VkMemoryRequirements memory_requirements() const;
457
458 // vkBindObjectMemory()
459 void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600460
Tony Barbour426b9052015-06-24 16:06:58 -0600461 // vkGetImageSubresourceLayout()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700462 VkSubresourceLayout
463 subresource_layout(const VkImageSubresource &subres) const;
464 VkSubresourceLayout
465 subresource_layout(const VkImageSubresourceLayers &subres) const;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600466
467 bool transparent() const;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700468 bool copyable() const {
469 return (format_features_ & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
470 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600471
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700472 VkImageSubresourceRange
473 subresource_range(VkImageAspectFlagBits aspect) const {
474 return subresource_range(create_info_, aspect);
475 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600476 VkExtent3D extent() const { return create_info_.extent; }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700477 VkExtent3D extent(uint32_t mip_level) const {
478 return extent(create_info_.extent, mip_level);
479 }
480 VkFormat format() const { return create_info_.format; }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600481
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700482 VkImageMemoryBarrier
483 image_memory_barrier(VkFlags output_mask, VkFlags input_mask,
484 VkImageLayout old_layout, VkImageLayout new_layout,
485 const VkImageSubresourceRange &range) const {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600486 VkImageMemoryBarrier barrier = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600487 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Chia-I Wu989de842015-10-27 19:54:37 +0800488 barrier.srcAccessMask = output_mask;
489 barrier.dstAccessMask = input_mask;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600490 barrier.oldLayout = old_layout;
491 barrier.newLayout = new_layout;
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800492 barrier.image = handle();
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600493 barrier.subresourceRange = range;
494 return barrier;
495 }
496
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600497 static VkImageCreateInfo create_info();
Karl Schultz8da60b02016-03-29 12:41:24 -0600498 static VkImageSubresource subresource(VkImageAspectFlags aspect,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700499 uint32_t mip_level,
500 uint32_t array_layer);
501 static VkImageSubresource subresource(const VkImageSubresourceRange &range,
502 uint32_t mip_level,
503 uint32_t array_layer);
Karl Schultz8da60b02016-03-29 12:41:24 -0600504 static VkImageSubresourceLayers subresource(VkImageAspectFlags aspect,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700505 uint32_t mip_level,
506 uint32_t array_layer,
507 uint32_t array_size);
508 static VkImageSubresourceLayers
509 subresource(const VkImageSubresourceRange &range, uint32_t mip_level,
510 uint32_t array_layer, uint32_t array_size);
511 static VkImageSubresourceRange
512 subresource_range(VkImageAspectFlags aspect_mask, uint32_t base_mip_level,
513 uint32_t mip_levels, uint32_t base_array_layer,
514 uint32_t num_layers);
515 static VkImageSubresourceRange
516 subresource_range(const VkImageCreateInfo &info,
517 VkImageAspectFlags aspect_mask);
518 static VkImageSubresourceRange
519 subresource_range(const VkImageSubresource &subres);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600520
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600521 static VkExtent2D extent(int32_t width, int32_t height);
522 static VkExtent2D extent(const VkExtent2D &extent, uint32_t mip_level);
523 static VkExtent2D extent(const VkExtent3D &extent);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600524
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600525 static VkExtent3D extent(int32_t width, int32_t height, int32_t depth);
526 static VkExtent3D extent(const VkExtent3D &extent, uint32_t mip_level);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600527
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700528 private:
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600529 void init_info(const Device &dev, const VkImageCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600530
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600531 VkImageCreateInfo create_info_;
532 VkFlags format_features_;
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800533
534 DeviceMemory internal_mem_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600535};
536
Chia-I Wu76ab1ff2015-07-03 11:49:42 +0800537class ImageView : public internal::NonDispHandle<VkImageView> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700538 public:
Chia-I Wu76ab1ff2015-07-03 11:49:42 +0800539 ~ImageView();
540
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600541 // vkCreateImageView()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600542 void init(const Device &dev, const VkImageViewCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600543};
544
Chia-I Wub48eddb2015-07-03 11:49:42 +0800545class ShaderModule : public internal::NonDispHandle<VkShaderModule> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700546 public:
Chia-I Wub48eddb2015-07-03 11:49:42 +0800547 ~ShaderModule();
548
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -0600549 // vkCreateShaderModule()
550 void init(const Device &dev, const VkShaderModuleCreateInfo &info);
551 VkResult init_try(const Device &dev, const VkShaderModuleCreateInfo &info);
552
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700553 static VkShaderModuleCreateInfo
554 create_info(size_t code_size, const uint32_t *code, VkFlags flags);
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -0600555};
556
Chia-I Wu2b1d4d02015-07-03 11:49:42 +0800557class Pipeline : public internal::NonDispHandle<VkPipeline> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700558 public:
Chia-I Wu2b1d4d02015-07-03 11:49:42 +0800559 ~Pipeline();
560
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600561 // vkCreateGraphicsPipeline()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600562 void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600563 // vkCreateGraphicsPipelineDerivative()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700564 void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info,
565 const VkPipeline basePipeline);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600566 // vkCreateComputePipeline()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600567 void init(const Device &dev, const VkComputePipelineCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600568 // vkLoadPipeline()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700569 void init(const Device &dev, size_t size, const void *data);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600570 // vkLoadPipelineDerivative()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700571 void init(const Device &dev, size_t size, const void *data,
572 VkPipeline basePipeline);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600573
Chris Forbesdc2188c2015-05-25 11:13:26 +1200574 // vkCreateGraphicsPipeline with error return
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700575 VkResult init_try(const Device &dev,
576 const VkGraphicsPipelineCreateInfo &info);
Chris Forbesdc2188c2015-05-25 11:13:26 +1200577
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600578 // vkStorePipeline()
579 size_t store(size_t size, void *data);
580};
581
Chia-I Wudeb99132015-07-03 11:49:42 +0800582class PipelineLayout : public internal::NonDispHandle<VkPipelineLayout> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700583 public:
Chia-I Wudeb99132015-07-03 11:49:42 +0800584 ~PipelineLayout();
585
586 // vCreatePipelineLayout()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700587 void init(const Device &dev, VkPipelineLayoutCreateInfo &info,
588 const std::vector<const DescriptorSetLayout *> &layouts);
Chia-I Wudeb99132015-07-03 11:49:42 +0800589};
590
Chia-I Wu6abe35d2015-07-03 11:49:42 +0800591class Sampler : public internal::NonDispHandle<VkSampler> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700592 public:
Chia-I Wu6abe35d2015-07-03 11:49:42 +0800593 ~Sampler();
594
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600595 // vkCreateSampler()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600596 void init(const Device &dev, const VkSamplerCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600597};
598
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700599class DescriptorSetLayout
600 : public internal::NonDispHandle<VkDescriptorSetLayout> {
601 public:
Chia-I Wu55a871f2015-07-03 11:49:42 +0800602 ~DescriptorSetLayout();
603
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600604 // vkCreateDescriptorSetLayout()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600605 void init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600606};
607
Chia-I Wu55a871f2015-07-03 11:49:42 +0800608class DescriptorPool : public internal::NonDispHandle<VkDescriptorPool> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700609 public:
Chia-I Wu55a871f2015-07-03 11:49:42 +0800610 ~DescriptorPool();
611
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700612 // Descriptor sets allocated from this pool will need access to the original
613 // object
Cody Northrop35ce7e62015-10-08 11:39:25 -0600614 VkDescriptorPool GetObj() { return pool_; }
615
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600616 // vkCreateDescriptorPool()
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -0600617 void init(const Device &dev, const VkDescriptorPoolCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600618
619 // vkResetDescriptorPool()
620 void reset();
621
Cody Northrop35ce7e62015-10-08 11:39:25 -0600622 // vkFreeDescriptorSet()
623 void setDynamicUsage(bool isDynamic) { dynamic_usage_ = isDynamic; }
624 bool getDynamicUsage() { return dynamic_usage_; }
625
Chia-I Wu1f851912015-10-27 18:04:07 +0800626 // vkAllocateDescriptorSets()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700627 std::vector<DescriptorSet *>
628 alloc_sets(const Device &dev,
629 const std::vector<const DescriptorSetLayout *> &layouts);
630 std::vector<DescriptorSet *> alloc_sets(const Device &dev,
631 const DescriptorSetLayout &layout,
632 uint32_t count);
633 DescriptorSet *alloc_sets(const Device &dev,
634 const DescriptorSetLayout &layout);
Cody Northrop35ce7e62015-10-08 11:39:25 -0600635
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700636 private:
Cody Northrop35ce7e62015-10-08 11:39:25 -0600637 VkDescriptorPool pool_;
638
639 // Track whether this pool's usage is VK_DESCRIPTOR_POOL_USAGE_DYNAMIC
640 bool dynamic_usage_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600641};
642
Chia-I Wu55a871f2015-07-03 11:49:42 +0800643class DescriptorSet : public internal::NonDispHandle<VkDescriptorSet> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700644 public:
Chia-I Wu55a871f2015-07-03 11:49:42 +0800645 ~DescriptorSet();
646
647 explicit DescriptorSet() : NonDispHandle() {}
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700648 explicit DescriptorSet(const Device &dev, DescriptorPool *pool,
649 VkDescriptorSet set)
650 : NonDispHandle(dev.handle(), set) {
651 containing_pool_ = pool;
652 }
Tony Barboure84a8d62015-07-10 14:10:27 -0600653
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700654 private:
655 DescriptorPool *containing_pool_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600656};
657
Chia-I Wu1f851912015-10-27 18:04:07 +0800658class CommandPool : public internal::NonDispHandle<VkCommandPool> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700659 public:
Chia-I Wu1f851912015-10-27 18:04:07 +0800660 ~CommandPool();
Courtney Goeltzenleuchter902d0812015-07-10 19:50:17 -0600661
Chia-I Wu1f851912015-10-27 18:04:07 +0800662 explicit CommandPool() : NonDispHandle() {}
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700663 explicit CommandPool(const Device &dev,
664 const VkCommandPoolCreateInfo &info) {
665 init(dev, info);
666 }
Courtney Goeltzenleuchter902d0812015-07-10 19:50:17 -0600667
Chia-I Wu1f851912015-10-27 18:04:07 +0800668 void init(const Device &dev, const VkCommandPoolCreateInfo &info);
Courtney Goeltzenleuchter902d0812015-07-10 19:50:17 -0600669
Chia-I Wu1f851912015-10-27 18:04:07 +0800670 static VkCommandPoolCreateInfo create_info(uint32_t queue_family_index);
Courtney Goeltzenleuchter902d0812015-07-10 19:50:17 -0600671};
672
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700673inline VkCommandPoolCreateInfo
674CommandPool::create_info(uint32_t queue_family_index) {
Chia-I Wu1f851912015-10-27 18:04:07 +0800675 VkCommandPoolCreateInfo info = {};
676 info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
Courtney Goeltzenleuchter902d0812015-07-10 19:50:17 -0600677 info.queueFamilyIndex = queue_family_index;
Tobin Ehlis4c8381e2015-12-14 13:46:38 -0700678 info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Courtney Goeltzenleuchter902d0812015-07-10 19:50:17 -0600679 return info;
680}
681
Chia-I Wu1f851912015-10-27 18:04:07 +0800682class CommandBuffer : public internal::Handle<VkCommandBuffer> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700683 public:
Chia-I Wu1f851912015-10-27 18:04:07 +0800684 ~CommandBuffer();
Chia-I Wu78c2a352015-07-03 11:49:42 +0800685
Chia-I Wu1f851912015-10-27 18:04:07 +0800686 explicit CommandBuffer() : Handle() {}
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700687 explicit CommandBuffer(const Device &dev,
688 const VkCommandBufferAllocateInfo &info) {
689 init(dev, info);
690 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600691
Chia-I Wu1f851912015-10-27 18:04:07 +0800692 // vkAllocateCommandBuffers()
693 void init(const Device &dev, const VkCommandBufferAllocateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600694
695 // vkBeginCommandBuffer()
Chia-I Wu1f851912015-10-27 18:04:07 +0800696 void begin(const VkCommandBufferBeginInfo *info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600697 void begin();
698
699 // vkEndCommandBuffer()
700 // vkResetCommandBuffer()
701 void end();
Chia-I Wu1f851912015-10-27 18:04:07 +0800702 void reset(VkCommandBufferResetFlags flags);
703 void reset() { reset(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600704
Chia-I Wu1f851912015-10-27 18:04:07 +0800705 static VkCommandBufferAllocateInfo create_info(VkCommandPool const &pool);
Chia-I Wu78c2a352015-07-03 11:49:42 +0800706
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700707 private:
Chia-I Wu78c2a352015-07-03 11:49:42 +0800708 VkDevice dev_handle_;
Chia-I Wu1f851912015-10-27 18:04:07 +0800709 VkCommandPool cmd_pool_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600710};
711
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700712inline VkMemoryAllocateInfo
713DeviceMemory::alloc_info(VkDeviceSize size, uint32_t memory_type_index) {
Chia-I Wu1f851912015-10-27 18:04:07 +0800714 VkMemoryAllocateInfo info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +0800715 info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Chia-I Wuba0836f2015-07-03 10:58:57 +0800716 info.allocationSize = size;
717 info.memoryTypeIndex = memory_type_index;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600718 return info;
719}
720
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700721inline VkBufferCreateInfo Buffer::create_info(VkDeviceSize size,
722 VkFlags usage) {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600723 VkBufferCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600724 info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
725 info.size = size;
726 info.usage = usage;
727 return info;
728}
729
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700730inline VkFenceCreateInfo Fence::create_info(VkFenceCreateFlags flags) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600731 VkFenceCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600732 info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
733 info.flags = flags;
734 return info;
735}
736
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700737inline VkFenceCreateInfo Fence::create_info() {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600738 VkFenceCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600739 info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
740 return info;
741}
742
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700743inline VkSemaphoreCreateInfo Semaphore::create_info(VkFlags flags) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600744 VkSemaphoreCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600745 info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600746 info.flags = flags;
747 return info;
748}
749
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700750inline VkEventCreateInfo Event::create_info(VkFlags flags) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600751 VkEventCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600752 info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
753 info.flags = flags;
754 return info;
755}
756
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700757inline VkQueryPoolCreateInfo QueryPool::create_info(VkQueryType type,
758 uint32_t slot_count) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600759 VkQueryPoolCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600760 info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
761 info.queryType = type;
Jon Ashburna4ae48b2016-01-11 13:12:43 -0700762 info.queryCount = slot_count;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600763 return info;
764}
765
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700766inline VkImageCreateInfo Image::create_info() {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600767 VkImageCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600768 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
769 info.extent.width = 1;
770 info.extent.height = 1;
771 info.extent.depth = 1;
772 info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -0600773 info.arrayLayers = 1;
Chia-I Wu3138d6a2015-10-31 00:31:16 +0800774 info.samples = VK_SAMPLE_COUNT_1_BIT;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600775 return info;
776}
777
Karl Schultz8da60b02016-03-29 12:41:24 -0600778inline VkImageSubresource Image::subresource(VkImageAspectFlags aspect,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700779 uint32_t mip_level,
780 uint32_t array_layer) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600781 VkImageSubresource subres = {};
Karl Schultz8da60b02016-03-29 12:41:24 -0600782 if (aspect == 0) {
783 assert(!"Invalid VkImageAspectFlags");
784 }
Chia-I Wu195c9e12015-10-27 19:55:05 +0800785 subres.aspectMask = aspect;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600786 subres.mipLevel = mip_level;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600787 subres.arrayLayer = array_layer;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600788 return subres;
789}
790
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700791inline VkImageSubresource
792Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level,
793 uint32_t array_layer) {
Karl Schultz8da60b02016-03-29 12:41:24 -0600794 return subresource(range.aspectMask,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700795 range.baseMipLevel + mip_level,
796 range.baseArrayLayer + array_layer);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600797}
798
Karl Schultz8da60b02016-03-29 12:41:24 -0600799inline VkImageSubresourceLayers Image::subresource(VkImageAspectFlags aspect,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700800 uint32_t mip_level,
801 uint32_t array_layer,
802 uint32_t array_size) {
Chia-I Wuc51b1212015-10-27 19:25:11 +0800803 VkImageSubresourceLayers subres = {};
Karl Schultz8da60b02016-03-29 12:41:24 -0600804 switch (aspect) {
805 case VK_IMAGE_ASPECT_COLOR_BIT:
806 case VK_IMAGE_ASPECT_DEPTH_BIT:
807 case VK_IMAGE_ASPECT_STENCIL_BIT:
808 case VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT:
809 /* valid */
810 break;
811 default:
812 assert(!"Invalid VkImageAspectFlags");
813 }
Chia-I Wu4291d882015-10-27 19:00:15 +0800814 subres.aspectMask = aspect;
Courtney Goeltzenleuchterbd7f5922015-09-10 16:41:13 -0600815 subres.mipLevel = mip_level;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600816 subres.baseArrayLayer = array_layer;
Chia-I Wu1f851912015-10-27 18:04:07 +0800817 subres.layerCount = array_size;
Courtney Goeltzenleuchterbd7f5922015-09-10 16:41:13 -0600818 return subres;
819}
820
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700821inline VkImageSubresourceLayers
822Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level,
823 uint32_t array_layer, uint32_t array_size) {
Karl Schultz8da60b02016-03-29 12:41:24 -0600824 return subresource(range.aspectMask,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700825 range.baseMipLevel + mip_level,
826 range.baseArrayLayer + array_layer, array_size);
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -0600827}
828
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700829inline VkImageSubresourceRange
830Image::subresource_range(VkImageAspectFlags aspect_mask,
831 uint32_t base_mip_level, uint32_t mip_levels,
832 uint32_t base_array_layer, uint32_t num_layers) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600833 VkImageSubresourceRange range = {};
Karl Schultz8da60b02016-03-29 12:41:24 -0600834 if (aspect_mask == 0) {
835 assert(!"Invalid VkImageAspectFlags");
836 }
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -0600837 range.aspectMask = aspect_mask;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600838 range.baseMipLevel = base_mip_level;
Chia-I Wu1f851912015-10-27 18:04:07 +0800839 range.levelCount = mip_levels;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600840 range.baseArrayLayer = base_array_layer;
Chia-I Wu1f851912015-10-27 18:04:07 +0800841 range.layerCount = num_layers;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600842 return range;
843}
844
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700845inline VkImageSubresourceRange
846Image::subresource_range(const VkImageCreateInfo &info,
847 VkImageAspectFlags aspect_mask) {
848 return subresource_range(aspect_mask, 0, info.mipLevels, 0,
849 info.arrayLayers);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600850}
851
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700852inline VkImageSubresourceRange
853Image::subresource_range(const VkImageSubresource &subres) {
854 return subresource_range(subres.aspectMask, subres.mipLevel, 1,
855 subres.arrayLayer, 1);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600856}
857
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700858inline VkExtent2D Image::extent(int32_t width, int32_t height) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600859 VkExtent2D extent = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600860 extent.width = width;
861 extent.height = height;
862 return extent;
863}
864
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700865inline VkExtent2D Image::extent(const VkExtent2D &extent, uint32_t mip_level) {
866 const int32_t width =
867 (extent.width >> mip_level) ? extent.width >> mip_level : 1;
868 const int32_t height =
869 (extent.height >> mip_level) ? extent.height >> mip_level : 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600870 return Image::extent(width, height);
871}
872
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700873inline VkExtent2D Image::extent(const VkExtent3D &extent) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600874 return Image::extent(extent.width, extent.height);
875}
876
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700877inline VkExtent3D Image::extent(int32_t width, int32_t height, int32_t depth) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600878 VkExtent3D extent = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600879 extent.width = width;
880 extent.height = height;
881 extent.depth = depth;
882 return extent;
883}
884
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700885inline VkExtent3D Image::extent(const VkExtent3D &extent, uint32_t mip_level) {
886 const int32_t width =
887 (extent.width >> mip_level) ? extent.width >> mip_level : 1;
888 const int32_t height =
889 (extent.height >> mip_level) ? extent.height >> mip_level : 1;
890 const int32_t depth =
891 (extent.depth >> mip_level) ? extent.depth >> mip_level : 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600892 return Image::extent(width, height, depth);
893}
894
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700895inline VkShaderModuleCreateInfo ShaderModule::create_info(size_t code_size,
896 const uint32_t *code,
897 VkFlags flags) {
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -0600898 VkShaderModuleCreateInfo info = {};
899 info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
900 info.codeSize = code_size;
901 info.pCode = code;
902 info.flags = flags;
903 return info;
904}
905
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700906inline VkWriteDescriptorSet
907Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
908 uint32_t array_element, VkDescriptorType type,
909 uint32_t count,
910 const VkDescriptorImageInfo *image_info) {
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800911 VkWriteDescriptorSet write = {};
912 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu1f851912015-10-27 18:04:07 +0800913 write.dstSet = set.handle();
914 write.dstBinding = binding;
915 write.dstArrayElement = array_element;
Chia-I Wu763a7492015-10-26 20:48:51 +0800916 write.descriptorCount = count;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800917 write.descriptorType = type;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600918 write.pImageInfo = image_info;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800919 return write;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600920}
921
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700922inline VkWriteDescriptorSet
923Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
924 uint32_t array_element, VkDescriptorType type,
925 uint32_t count,
926 const VkDescriptorBufferInfo *buffer_info) {
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600927 VkWriteDescriptorSet write = {};
928 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu1f851912015-10-27 18:04:07 +0800929 write.dstSet = set.handle();
930 write.dstBinding = binding;
931 write.dstArrayElement = array_element;
Chia-I Wu763a7492015-10-26 20:48:51 +0800932 write.descriptorCount = count;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600933 write.descriptorType = type;
934 write.pBufferInfo = buffer_info;
935 return write;
936}
937
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700938inline VkWriteDescriptorSet
939Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
940 uint32_t array_element, VkDescriptorType type,
941 uint32_t count, const VkBufferView *buffer_views) {
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600942 VkWriteDescriptorSet write = {};
943 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu1f851912015-10-27 18:04:07 +0800944 write.dstSet = set.handle();
945 write.dstBinding = binding;
946 write.dstArrayElement = array_element;
Chia-I Wu763a7492015-10-26 20:48:51 +0800947 write.descriptorCount = count;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600948 write.descriptorType = type;
949 write.pTexelBufferView = buffer_views;
950 return write;
951}
952
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700953inline VkWriteDescriptorSet Device::write_descriptor_set(
954 const DescriptorSet &set, uint32_t binding, uint32_t array_element,
955 VkDescriptorType type,
956 const std::vector<VkDescriptorImageInfo> &image_info) {
957 return write_descriptor_set(set, binding, array_element, type,
958 image_info.size(), &image_info[0]);
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600959}
960
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700961inline VkWriteDescriptorSet Device::write_descriptor_set(
962 const DescriptorSet &set, uint32_t binding, uint32_t array_element,
963 VkDescriptorType type,
964 const std::vector<VkDescriptorBufferInfo> &buffer_info) {
965 return write_descriptor_set(set, binding, array_element, type,
966 buffer_info.size(), &buffer_info[0]);
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600967}
968
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700969inline VkWriteDescriptorSet
970Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
971 uint32_t array_element, VkDescriptorType type,
972 const std::vector<VkBufferView> &buffer_views) {
973 return write_descriptor_set(set, binding, array_element, type,
974 buffer_views.size(), &buffer_views[0]);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600975}
976
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700977inline VkCopyDescriptorSet
978Device::copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding,
979 uint32_t src_array_element,
980 const DescriptorSet &dst_set, uint32_t dst_binding,
981 uint32_t dst_array_element, uint32_t count) {
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800982 VkCopyDescriptorSet copy = {};
983 copy.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
Chia-I Wu55a871f2015-07-03 11:49:42 +0800984 copy.srcSet = src_set.handle();
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800985 copy.srcBinding = src_binding;
986 copy.srcArrayElement = src_array_element;
Chia-I Wu1f851912015-10-27 18:04:07 +0800987 copy.dstSet = dst_set.handle();
988 copy.dstBinding = dst_binding;
989 copy.dstArrayElement = dst_array_element;
Chia-I Wu763a7492015-10-26 20:48:51 +0800990 copy.descriptorCount = count;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600991
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800992 return copy;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600993}
994
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700995inline VkCommandBufferAllocateInfo
996CommandBuffer::create_info(VkCommandPool const &pool) {
Chia-I Wu1f851912015-10-27 18:04:07 +0800997 VkCommandBufferAllocateInfo info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +0800998 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Chia-I Wu1f851912015-10-27 18:04:07 +0800999 info.commandPool = pool;
Jon Ashburna4ae48b2016-01-11 13:12:43 -07001000 info.commandBufferCount = 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001001 return info;
1002}
1003
1004}; // namespace vk_testing
1005
1006#endif // VKTESTBINDING_H