blob: 7ff4661f9de0fc139f4e1d4b9b1fdce03f523837 [file] [log] [blame]
Karl Schultz6addd812016-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 Schultz6addd812016-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 Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028
29#ifndef VKTESTBINDING_H
30#define VKTESTBINDING_H
31
32#include <vector>
Chia-I Wub0ed7d42015-07-03 10:13:26 +080033#include <assert.h>
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060034
David Pinedo9316d3b2015-11-06 12:54:48 -070035#include "vulkan/vulkan.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060036
37namespace vk_testing {
38
Karl Schultz6addd812016-02-02 17:17:23 -070039typedef void (*ErrorCallback)(const char *expr, const char *file,
40 unsigned int line, const char *function);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060041void set_error_callback(ErrorCallback callback);
42
Chia-I Wu999f0482015-07-03 10:32:05 +080043class PhysicalDevice;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060044class Device;
45class Queue;
Chia-I Wuf8f074f2015-07-03 10:58:57 +080046class DeviceMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060047class Fence;
48class Semaphore;
49class Event;
50class QueryPool;
51class Buffer;
52class BufferView;
53class Image;
54class ImageView;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060055class DepthStencilView;
56class Shader;
57class Pipeline;
58class PipelineDelta;
59class Sampler;
60class DescriptorSetLayout;
Mark Lobodzinski0fadf5f2015-04-17 14:11:39 -050061class PipelineLayout;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060062class DescriptorSetPool;
63class DescriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080064class CommandBuffer;
65class CommandPool;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060066
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -060067std::vector<VkLayerProperties> GetGlobalLayers();
68std::vector<VkExtensionProperties> GetGlobalExtensions();
69std::vector<VkExtensionProperties> GetGlobalExtensions(const char *pLayerName);
70
Chia-I Wub0ed7d42015-07-03 10:13:26 +080071namespace internal {
72
Karl Schultz6addd812016-02-02 17:17:23 -070073template <typename T> class Handle {
74 public:
Chia-I Wub0ed7d42015-07-03 10:13:26 +080075 const T &handle() const { return handle_; }
76 bool initialized() const { return (handle_ != VK_NULL_HANDLE); }
77
Karl Schultz6addd812016-02-02 17:17:23 -070078 protected:
Chia-I Wub0ed7d42015-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 Schultz6addd812016-02-02 17:17:23 -070084 void init(T handle) {
Chia-I Wub0ed7d42015-07-03 10:13:26 +080085 assert(!initialized());
86 handle_ = handle;
87 }
88
Karl Schultz6addd812016-02-02 17:17:23 -070089 private:
Chia-I Wub0ed7d42015-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 Schultz6addd812016-02-02 17:17:23 -070097template <typename T> class NonDispHandle : public Handle<T> {
98 protected:
Chia-I Wub0ed7d42015-07-03 10:13:26 +080099 explicit NonDispHandle() : Handle<T>(), dev_handle_(VK_NULL_HANDLE) {}
Karl Schultz6addd812016-02-02 17:17:23 -0700100 explicit NonDispHandle(VkDevice dev, T handle)
101 : Handle<T>(handle), dev_handle_(dev) {}
Chia-I Wub0ed7d42015-07-03 10:13:26 +0800102
103 const VkDevice &device() const { return dev_handle_; }
104
Karl Schultz6addd812016-02-02 17:17:23 -0700105 void init(VkDevice dev, T handle) {
Chia-I Wub0ed7d42015-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 Schultz6addd812016-02-02 17:17:23 -0700111 private:
Chia-I Wub0ed7d42015-07-03 10:13:26 +0800112 VkDevice dev_handle_;
113};
114
115} // namespace internal
116
Chia-I Wu999f0482015-07-03 10:32:05 +0800117class PhysicalDevice : public internal::Handle<VkPhysicalDevice> {
Karl Schultz6addd812016-02-02 17:17:23 -0700118 public:
119 explicit PhysicalDevice(VkPhysicalDevice phy) : Handle(phy) {
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600120 memory_properties_ = memory_properties();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600121 device_properties_ = properties();
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600122 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600123
Tony Barbourd1c35722015-04-16 15:59:00 -0600124 VkPhysicalDeviceProperties properties() const;
Tony Barbourd1c35722015-04-16 15:59:00 -0600125 VkPhysicalDeviceMemoryProperties memory_properties() const;
Cody Northropd0802882015-08-03 17:04:53 -0600126 std::vector<VkQueueFamilyProperties> queue_properties() const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600127
Karl Schultz6addd812016-02-02 17:17:23 -0700128 bool set_memory_type(const uint32_t type_bits, VkMemoryAllocateInfo *info,
129 const VkMemoryPropertyFlags properties,
130 const VkMemoryPropertyFlags forbid = 0) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600131
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -0600132 // vkEnumerateDeviceExtensionProperties()
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600133 std::vector<VkExtensionProperties> extensions() const;
Karl Schultz6addd812016-02-02 17:17:23 -0700134 std::vector<VkExtensionProperties> extensions(const char *pLayerName) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600135
136 // vkEnumerateLayers()
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600137 std::vector<VkLayerProperties> layers() const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600138
Karl Schultz6addd812016-02-02 17:17:23 -0700139 private:
140 void
141 add_extension_dependencies(uint32_t dependency_count,
142 VkExtensionProperties *depencency_props,
143 std::vector<VkExtensionProperties> &ext_list);
Chia-I Wu999f0482015-07-03 10:32:05 +0800144
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600145 VkPhysicalDeviceMemoryProperties memory_properties_;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600146
147 VkPhysicalDeviceProperties device_properties_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600148};
149
Chia-I Wuf368b602015-07-03 10:41:20 +0800150class Device : public internal::Handle<VkDevice> {
Karl Schultz6addd812016-02-02 17:17:23 -0700151 public:
Chia-I Wu999f0482015-07-03 10:32:05 +0800152 explicit Device(VkPhysicalDevice phy) : phy_(phy) {}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600153 ~Device();
154
155 // vkCreateDevice()
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600156 void init(const VkDeviceCreateInfo &info);
Karl Schultz6addd812016-02-02 17:17:23 -0700157 void init(std::vector<const char *> &layers,
158 std::vector<const char *> &
159 extensions); // all queues, all extensions, etc
160 void init() {
161 std::vector<const char *> layers;
162 std::vector<const char *> extensions;
163 init(layers, extensions);
164 };
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600165
Chia-I Wu999f0482015-07-03 10:32:05 +0800166 const PhysicalDevice &phy() const { return phy_; }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600167
Jon Ashburn8d1b0b52015-05-18 13:20:15 -0600168 // vkGetDeviceProcAddr()
Karl Schultz6addd812016-02-02 17:17:23 -0700169 PFN_vkVoidFunction get_proc(const char *name) const {
170 return vkGetDeviceProcAddr(handle(), name);
171 }
Jon Ashburn8d1b0b52015-05-18 13:20:15 -0600172
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600173 // vkGetDeviceQueue()
Karl Schultz6addd812016-02-02 17:17:23 -0700174 const std::vector<Queue *> &graphics_queues() const {
175 return queues_[GRAPHICS];
176 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600177 const std::vector<Queue *> &compute_queues() { return queues_[COMPUTE]; }
178 const std::vector<Queue *> &dma_queues() { return queues_[DMA]; }
179 uint32_t graphics_queue_node_index_;
180
181 struct Format {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600182 VkFormat format;
183 VkImageTiling tiling;
184 VkFlags features;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600185 };
186 // vkGetFormatInfo()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600187 VkFormatProperties format_properties(VkFormat format);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600188 const std::vector<Format> &formats() const { return formats_; }
189
190 // vkDeviceWaitIdle()
191 void wait();
192
193 // vkWaitForFences()
Karl Schultz6addd812016-02-02 17:17:23 -0700194 VkResult wait(const std::vector<const Fence *> &fences, bool wait_all,
195 uint64_t timeout);
196 VkResult wait(const Fence &fence) {
197 return wait(std::vector<const Fence *>(1, &fence), true, (uint64_t)-1);
198 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600199
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800200 // vkUpdateDescriptorSets()
Karl Schultz6addd812016-02-02 17:17:23 -0700201 void update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes,
202 const std::vector<VkCopyDescriptorSet> &copies);
203 void
204 update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes) {
205 return update_descriptor_sets(writes,
206 std::vector<VkCopyDescriptorSet>());
207 }
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800208
Karl Schultz6addd812016-02-02 17:17:23 -0700209 static VkWriteDescriptorSet
210 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
211 uint32_t array_element, VkDescriptorType type,
212 uint32_t count,
213 const VkDescriptorImageInfo *image_info);
214 static VkWriteDescriptorSet
215 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
216 uint32_t array_element, VkDescriptorType type,
217 uint32_t count,
218 const VkDescriptorBufferInfo *buffer_info);
219 static VkWriteDescriptorSet
220 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
221 uint32_t array_element, VkDescriptorType type,
222 uint32_t count, const VkBufferView *buffer_views);
223 static VkWriteDescriptorSet
224 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
225 uint32_t array_element, VkDescriptorType type,
226 const std::vector<VkDescriptorImageInfo> &image_info);
227 static VkWriteDescriptorSet write_descriptor_set(
228 const DescriptorSet &set, uint32_t binding, uint32_t array_element,
229 VkDescriptorType type,
230 const std::vector<VkDescriptorBufferInfo> &buffer_info);
231 static VkWriteDescriptorSet
232 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
233 uint32_t array_element, VkDescriptorType type,
234 const std::vector<VkBufferView> &buffer_views);
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800235
Karl Schultz6addd812016-02-02 17:17:23 -0700236 static VkCopyDescriptorSet
237 copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding,
238 uint32_t src_array_element,
239 const DescriptorSet &dst_set, uint32_t dst_binding,
240 uint32_t dst_array_element, uint32_t count);
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800241
Karl Schultz6addd812016-02-02 17:17:23 -0700242 private:
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600243 enum QueueIndex {
244 GRAPHICS,
245 COMPUTE,
246 DMA,
247 QUEUE_COUNT,
248 };
249
250 void init_queues();
251 void init_formats();
252
Chia-I Wu999f0482015-07-03 10:32:05 +0800253 PhysicalDevice phy_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600254
255 std::vector<Queue *> queues_[QUEUE_COUNT];
256 std::vector<Format> formats_;
257};
258
Chia-I Wudf12ffd2015-07-03 10:53:18 +0800259class Queue : public internal::Handle<VkQueue> {
Karl Schultz6addd812016-02-02 17:17:23 -0700260 public:
261 explicit Queue(VkQueue queue, int index) : Handle(queue) {
262 family_index_ = index;
263 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600264
265 // vkQueueSubmit()
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800266 void submit(const std::vector<const CommandBuffer *> &cmds, Fence &fence);
267 void submit(const CommandBuffer &cmd, Fence &fence);
268 void submit(const CommandBuffer &cmd);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600269
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600270 // vkQueueWaitIdle()
271 void wait();
272
Karl Schultz6addd812016-02-02 17:17:23 -0700273 int get_family_index() { return family_index_; }
Tony Barbourfb21ea32015-07-23 10:35:30 -0600274
Karl Schultz6addd812016-02-02 17:17:23 -0700275 private:
Tony Barbourfb21ea32015-07-23 10:35:30 -0600276 int family_index_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600277};
278
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800279class DeviceMemory : public internal::NonDispHandle<VkDeviceMemory> {
Karl Schultz6addd812016-02-02 17:17:23 -0700280 public:
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800281 ~DeviceMemory();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600282
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800283 // vkAllocateMemory()
284 void init(const Device &dev, const VkMemoryAllocateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600285
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600286 // vkMapMemory()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600287 const void *map(VkFlags flags) const;
Karl Schultz6addd812016-02-02 17:17:23 -0700288 void *map(VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600289 const void *map() const { return map(0); }
Karl Schultz6addd812016-02-02 17:17:23 -0700290 void *map() { return map(0); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600291
292 // vkUnmapMemory()
293 void unmap() const;
294
Karl Schultz6addd812016-02-02 17:17:23 -0700295 static VkMemoryAllocateInfo alloc_info(VkDeviceSize size,
296 uint32_t memory_type_index);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600297};
298
Chia-I Wud9e8e822015-07-03 11:45:55 +0800299class Fence : public internal::NonDispHandle<VkFence> {
Karl Schultz6addd812016-02-02 17:17:23 -0700300 public:
Chia-I Wud9e8e822015-07-03 11:45:55 +0800301 ~Fence();
302
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600303 // vkCreateFence()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600304 void init(const Device &dev, const VkFenceCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600305
306 // vkGetFenceStatus()
Chia-I Wud9e8e822015-07-03 11:45:55 +0800307 VkResult status() const { return vkGetFenceStatus(device(), handle()); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600308
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600309 static VkFenceCreateInfo create_info(VkFenceCreateFlags flags);
310 static VkFenceCreateInfo create_info();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600311};
312
Chia-I Wu6b1c2482015-07-03 11:49:42 +0800313class Semaphore : public internal::NonDispHandle<VkSemaphore> {
Karl Schultz6addd812016-02-02 17:17:23 -0700314 public:
Chia-I Wu6b1c2482015-07-03 11:49:42 +0800315 ~Semaphore();
316
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600317 // vkCreateSemaphore()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600318 void init(const Device &dev, const VkSemaphoreCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600319
Tony Barbouraf892a12015-06-26 12:56:09 -0600320 static VkSemaphoreCreateInfo create_info(VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600321};
322
Chia-I Wuc5c97992015-07-03 11:49:42 +0800323class Event : public internal::NonDispHandle<VkEvent> {
Karl Schultz6addd812016-02-02 17:17:23 -0700324 public:
Chia-I Wuc5c97992015-07-03 11:49:42 +0800325 ~Event();
326
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600327 // vkCreateEvent()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600328 void init(const Device &dev, const VkEventCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600329
330 // vkGetEventStatus()
331 // vkSetEvent()
332 // vkResetEvent()
Chia-I Wuc5c97992015-07-03 11:49:42 +0800333 VkResult status() const { return vkGetEventStatus(device(), handle()); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600334 void set();
335 void reset();
336
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600337 static VkEventCreateInfo create_info(VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600338};
339
Chia-I Wu1b7d4762015-07-03 11:49:42 +0800340class QueryPool : public internal::NonDispHandle<VkQueryPool> {
Karl Schultz6addd812016-02-02 17:17:23 -0700341 public:
Chia-I Wu1b7d4762015-07-03 11:49:42 +0800342 ~QueryPool();
343
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600344 // vkCreateQueryPool()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600345 void init(const Device &dev, const VkQueryPoolCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600346
347 // vkGetQueryPoolResults()
Karl Schultz6addd812016-02-02 17:17:23 -0700348 VkResult results(uint32_t first, uint32_t count, size_t size, void *data,
349 size_t stride);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600350
Karl Schultz6addd812016-02-02 17:17:23 -0700351 static VkQueryPoolCreateInfo create_info(VkQueryType type,
352 uint32_t slot_count);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600353};
354
Chia-I Wu681d7a02015-07-03 13:44:34 +0800355class Buffer : public internal::NonDispHandle<VkBuffer> {
Karl Schultz6addd812016-02-02 17:17:23 -0700356 public:
Chia-I Wu681d7a02015-07-03 13:44:34 +0800357 explicit Buffer() : NonDispHandle() {}
Karl Schultz6addd812016-02-02 17:17:23 -0700358 explicit Buffer(const Device &dev, const VkBufferCreateInfo &info) {
359 init(dev, info);
360 }
Tony Barbourd1c35722015-04-16 15:59:00 -0600361 explicit Buffer(const Device &dev, VkDeviceSize size) { init(dev, size); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600362
Chia-I Wu681d7a02015-07-03 13:44:34 +0800363 ~Buffer();
364
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600365 // vkCreateBuffer()
Karl Schultz6addd812016-02-02 17:17:23 -0700366 void init(const Device &dev, const VkBufferCreateInfo &info,
367 VkMemoryPropertyFlags mem_props);
368 void init(const Device &dev, const VkBufferCreateInfo &info) {
369 init(dev, info, 0);
370 }
371 void init(const Device &dev, VkDeviceSize size,
372 VkMemoryPropertyFlags mem_props) {
373 init(dev, create_info(size, 0), mem_props);
374 }
Chia-I Wu681d7a02015-07-03 13:44:34 +0800375 void init(const Device &dev, VkDeviceSize size) { init(dev, size, 0); }
Karl Schultz6addd812016-02-02 17:17:23 -0700376 void init_as_src(const Device &dev, VkDeviceSize size,
377 VkMemoryPropertyFlags &reqs) {
378 init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT), reqs);
379 }
380 void init_as_dst(const Device &dev, VkDeviceSize size,
381 VkMemoryPropertyFlags &reqs) {
382 init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_DST_BIT), reqs);
383 }
384 void init_as_src_and_dst(const Device &dev, VkDeviceSize size,
385 VkMemoryPropertyFlags &reqs) {
386 init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
387 VK_BUFFER_USAGE_TRANSFER_DST_BIT),
388 reqs);
389 }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600390 void init_no_mem(const Device &dev, const VkBufferCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600391
Chia-I Wu681d7a02015-07-03 13:44:34 +0800392 // get the internal memory
393 const DeviceMemory &memory() const { return internal_mem_; }
Karl Schultz6addd812016-02-02 17:17:23 -0700394 DeviceMemory &memory() { return internal_mem_; }
Chia-I Wu681d7a02015-07-03 13:44:34 +0800395
396 // vkGetObjectMemoryRequirements()
397 VkMemoryRequirements memory_requirements() const;
398
399 // vkBindObjectMemory()
400 void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
Mark Lobodzinski942b1722015-05-11 17:21:15 -0500401
Tony Barbourd1c35722015-04-16 15:59:00 -0600402 static VkBufferCreateInfo create_info(VkDeviceSize size, VkFlags usage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600403
Karl Schultz6addd812016-02-02 17:17:23 -0700404 VkBufferMemoryBarrier buffer_memory_barrier(VkFlags output_mask,
405 VkFlags input_mask,
406 VkDeviceSize offset,
407 VkDeviceSize size) const {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600408 VkBufferMemoryBarrier barrier = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600409 barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800410 barrier.buffer = handle();
Chia-I Wua4594202015-10-27 19:54:37 +0800411 barrier.srcAccessMask = output_mask;
412 barrier.dstAccessMask = input_mask;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600413 barrier.offset = offset;
414 barrier.size = size;
415 return barrier;
416 }
Chia-I Wu681d7a02015-07-03 13:44:34 +0800417
Karl Schultz6addd812016-02-02 17:17:23 -0700418 private:
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600419 VkBufferCreateInfo create_info_;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800420
421 DeviceMemory internal_mem_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600422};
423
Chia-I Wu3158bf32015-07-03 11:49:42 +0800424class BufferView : public internal::NonDispHandle<VkBufferView> {
Karl Schultz6addd812016-02-02 17:17:23 -0700425 public:
Chia-I Wu3158bf32015-07-03 11:49:42 +0800426 ~BufferView();
427
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600428 // vkCreateBufferView()
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600429 void init(const Device &dev, const VkBufferViewCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600430};
431
Chia-I Wu681d7a02015-07-03 13:44:34 +0800432class Image : public internal::NonDispHandle<VkImage> {
Karl Schultz6addd812016-02-02 17:17:23 -0700433 public:
Chia-I Wu681d7a02015-07-03 13:44:34 +0800434 explicit Image() : NonDispHandle(), format_features_(0) {}
Karl Schultz6addd812016-02-02 17:17:23 -0700435 explicit Image(const Device &dev, const VkImageCreateInfo &info)
436 : format_features_(0) {
437 init(dev, info);
438 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600439
Chia-I Wu681d7a02015-07-03 13:44:34 +0800440 ~Image();
441
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600442 // vkCreateImage()
Karl Schultz6addd812016-02-02 17:17:23 -0700443 void init(const Device &dev, const VkImageCreateInfo &info,
444 VkMemoryPropertyFlags mem_props);
445 void init(const Device &dev, const VkImageCreateInfo &info) {
446 init(dev, info, 0);
447 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600448 void init_no_mem(const Device &dev, const VkImageCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600449
Chia-I Wu681d7a02015-07-03 13:44:34 +0800450 // get the internal memory
451 const DeviceMemory &memory() const { return internal_mem_; }
Karl Schultz6addd812016-02-02 17:17:23 -0700452 DeviceMemory &memory() { return internal_mem_; }
Chia-I Wu681d7a02015-07-03 13:44:34 +0800453
454 // vkGetObjectMemoryRequirements()
455 VkMemoryRequirements memory_requirements() const;
456
457 // vkBindObjectMemory()
458 void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600459
Tony Barbour59a47322015-06-24 16:06:58 -0600460 // vkGetImageSubresourceLayout()
Karl Schultz6addd812016-02-02 17:17:23 -0700461 VkSubresourceLayout
462 subresource_layout(const VkImageSubresource &subres) const;
463 VkSubresourceLayout
464 subresource_layout(const VkImageSubresourceLayers &subres) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600465
466 bool transparent() const;
Karl Schultz6addd812016-02-02 17:17:23 -0700467 bool copyable() const {
468 return (format_features_ & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
469 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600470
Karl Schultz6addd812016-02-02 17:17:23 -0700471 VkImageSubresourceRange
472 subresource_range(VkImageAspectFlagBits aspect) const {
473 return subresource_range(create_info_, aspect);
474 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600475 VkExtent3D extent() const { return create_info_.extent; }
Karl Schultz6addd812016-02-02 17:17:23 -0700476 VkExtent3D extent(uint32_t mip_level) const {
477 return extent(create_info_.extent, mip_level);
478 }
479 VkFormat format() const { return create_info_.format; }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600480
Karl Schultz6addd812016-02-02 17:17:23 -0700481 VkImageMemoryBarrier
482 image_memory_barrier(VkFlags output_mask, VkFlags input_mask,
483 VkImageLayout old_layout, VkImageLayout new_layout,
484 const VkImageSubresourceRange &range) const {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600485 VkImageMemoryBarrier barrier = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600486 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
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.oldLayout = old_layout;
490 barrier.newLayout = new_layout;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800491 barrier.image = handle();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600492 barrier.subresourceRange = range;
493 return barrier;
494 }
495
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600496 static VkImageCreateInfo create_info();
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600497 static VkImageAspectFlagBits image_aspect(VkImageAspectFlags flags);
Karl Schultz6addd812016-02-02 17:17:23 -0700498 static VkImageSubresource subresource(VkImageAspectFlagBits aspect,
499 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);
504 static VkImageSubresourceLayers subresource(VkImageAspectFlagBits aspect,
505 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 Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600520
Courtney Goeltzenleuchterfb4efc62015-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 Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600524
Courtney Goeltzenleuchterfb4efc62015-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 Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600527
Karl Schultz6addd812016-02-02 17:17:23 -0700528 private:
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600529 void init_info(const Device &dev, const VkImageCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600530
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600531 VkImageCreateInfo create_info_;
532 VkFlags format_features_;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800533
534 DeviceMemory internal_mem_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600535};
536
Chia-I Wu3158bf32015-07-03 11:49:42 +0800537class ImageView : public internal::NonDispHandle<VkImageView> {
Karl Schultz6addd812016-02-02 17:17:23 -0700538 public:
Chia-I Wu3158bf32015-07-03 11:49:42 +0800539 ~ImageView();
540
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600541 // vkCreateImageView()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600542 void init(const Device &dev, const VkImageViewCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600543};
544
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800545class ShaderModule : public internal::NonDispHandle<VkShaderModule> {
Karl Schultz6addd812016-02-02 17:17:23 -0700546 public:
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800547 ~ShaderModule();
548
Courtney Goeltzenleuchteree4027d2015-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 Schultz6addd812016-02-02 17:17:23 -0700553 static VkShaderModuleCreateInfo
554 create_info(size_t code_size, const uint32_t *code, VkFlags flags);
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600555};
556
Chia-I Wu2ff72fd2015-07-03 11:49:42 +0800557class Pipeline : public internal::NonDispHandle<VkPipeline> {
Karl Schultz6addd812016-02-02 17:17:23 -0700558 public:
Chia-I Wu2ff72fd2015-07-03 11:49:42 +0800559 ~Pipeline();
560
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600561 // vkCreateGraphicsPipeline()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600562 void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600563 // vkCreateGraphicsPipelineDerivative()
Karl Schultz6addd812016-02-02 17:17:23 -0700564 void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info,
565 const VkPipeline basePipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600566 // vkCreateComputePipeline()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600567 void init(const Device &dev, const VkComputePipelineCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600568 // vkLoadPipeline()
Karl Schultz6addd812016-02-02 17:17:23 -0700569 void init(const Device &dev, size_t size, const void *data);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600570 // vkLoadPipelineDerivative()
Karl Schultz6addd812016-02-02 17:17:23 -0700571 void init(const Device &dev, size_t size, const void *data,
572 VkPipeline basePipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600573
Chris Forbes95292b12015-05-25 11:13:26 +1200574 // vkCreateGraphicsPipeline with error return
Karl Schultz6addd812016-02-02 17:17:23 -0700575 VkResult init_try(const Device &dev,
576 const VkGraphicsPipelineCreateInfo &info);
Chris Forbes95292b12015-05-25 11:13:26 +1200577
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600578 // vkStorePipeline()
579 size_t store(size_t size, void *data);
580};
581
Chia-I Wufd46e7d2015-07-03 11:49:42 +0800582class PipelineLayout : public internal::NonDispHandle<VkPipelineLayout> {
Karl Schultz6addd812016-02-02 17:17:23 -0700583 public:
Chia-I Wufd46e7d2015-07-03 11:49:42 +0800584 ~PipelineLayout();
585
586 // vCreatePipelineLayout()
Karl Schultz6addd812016-02-02 17:17:23 -0700587 void init(const Device &dev, VkPipelineLayoutCreateInfo &info,
588 const std::vector<const DescriptorSetLayout *> &layouts);
Chia-I Wufd46e7d2015-07-03 11:49:42 +0800589};
590
Chia-I Wu8c721c62015-07-03 11:49:42 +0800591class Sampler : public internal::NonDispHandle<VkSampler> {
Karl Schultz6addd812016-02-02 17:17:23 -0700592 public:
Chia-I Wu8c721c62015-07-03 11:49:42 +0800593 ~Sampler();
594
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600595 // vkCreateSampler()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600596 void init(const Device &dev, const VkSamplerCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600597};
598
Karl Schultz6addd812016-02-02 17:17:23 -0700599class DescriptorSetLayout
600 : public internal::NonDispHandle<VkDescriptorSetLayout> {
601 public:
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800602 ~DescriptorSetLayout();
603
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600604 // vkCreateDescriptorSetLayout()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600605 void init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600606};
607
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800608class DescriptorPool : public internal::NonDispHandle<VkDescriptorPool> {
Karl Schultz6addd812016-02-02 17:17:23 -0700609 public:
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800610 ~DescriptorPool();
611
Karl Schultz6addd812016-02-02 17:17:23 -0700612 // Descriptor sets allocated from this pool will need access to the original
613 // object
Cody Northropcdc72a42015-10-08 11:39:25 -0600614 VkDescriptorPool GetObj() { return pool_; }
615
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600616 // vkCreateDescriptorPool()
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -0600617 void init(const Device &dev, const VkDescriptorPoolCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600618
619 // vkResetDescriptorPool()
620 void reset();
621
Cody Northropcdc72a42015-10-08 11:39:25 -0600622 // vkFreeDescriptorSet()
623 void setDynamicUsage(bool isDynamic) { dynamic_usage_ = isDynamic; }
624 bool getDynamicUsage() { return dynamic_usage_; }
625
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800626 // vkAllocateDescriptorSets()
Karl Schultz6addd812016-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 Northropcdc72a42015-10-08 11:39:25 -0600635
Karl Schultz6addd812016-02-02 17:17:23 -0700636 private:
Cody Northropcdc72a42015-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 Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600641};
642
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800643class DescriptorSet : public internal::NonDispHandle<VkDescriptorSet> {
Karl Schultz6addd812016-02-02 17:17:23 -0700644 public:
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800645 ~DescriptorSet();
646
647 explicit DescriptorSet() : NonDispHandle() {}
Karl Schultz6addd812016-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 Barbour67e99152015-07-10 14:10:27 -0600653
Karl Schultz6addd812016-02-02 17:17:23 -0700654 private:
655 DescriptorPool *containing_pool_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600656};
657
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800658class CommandPool : public internal::NonDispHandle<VkCommandPool> {
Karl Schultz6addd812016-02-02 17:17:23 -0700659 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800660 ~CommandPool();
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600661
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800662 explicit CommandPool() : NonDispHandle() {}
Karl Schultz6addd812016-02-02 17:17:23 -0700663 explicit CommandPool(const Device &dev,
664 const VkCommandPoolCreateInfo &info) {
665 init(dev, info);
666 }
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600667
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800668 void init(const Device &dev, const VkCommandPoolCreateInfo &info);
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600669
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800670 static VkCommandPoolCreateInfo create_info(uint32_t queue_family_index);
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600671};
672
Karl Schultz6addd812016-02-02 17:17:23 -0700673inline VkCommandPoolCreateInfo
674CommandPool::create_info(uint32_t queue_family_index) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800675 VkCommandPoolCreateInfo info = {};
676 info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600677 info.queueFamilyIndex = queue_family_index;
Tobin Ehlisac0ef842015-12-14 13:46:38 -0700678 info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600679 return info;
680}
681
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800682class CommandBuffer : public internal::Handle<VkCommandBuffer> {
Karl Schultz6addd812016-02-02 17:17:23 -0700683 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800684 ~CommandBuffer();
Chia-I Wube2b9172015-07-03 11:49:42 +0800685
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800686 explicit CommandBuffer() : Handle() {}
Karl Schultz6addd812016-02-02 17:17:23 -0700687 explicit CommandBuffer(const Device &dev,
688 const VkCommandBufferAllocateInfo &info) {
689 init(dev, info);
690 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600691
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800692 // vkAllocateCommandBuffers()
693 void init(const Device &dev, const VkCommandBufferAllocateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600694
695 // vkBeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800696 void begin(const VkCommandBufferBeginInfo *info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600697 void begin();
698
699 // vkEndCommandBuffer()
700 // vkResetCommandBuffer()
701 void end();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800702 void reset(VkCommandBufferResetFlags flags);
703 void reset() { reset(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600704
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800705 static VkCommandBufferAllocateInfo create_info(VkCommandPool const &pool);
Chia-I Wube2b9172015-07-03 11:49:42 +0800706
Karl Schultz6addd812016-02-02 17:17:23 -0700707 private:
Chia-I Wube2b9172015-07-03 11:49:42 +0800708 VkDevice dev_handle_;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800709 VkCommandPool cmd_pool_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600710};
711
Karl Schultz6addd812016-02-02 17:17:23 -0700712inline VkMemoryAllocateInfo
713DeviceMemory::alloc_info(VkDeviceSize size, uint32_t memory_type_index) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800714 VkMemoryAllocateInfo info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +0800715 info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800716 info.allocationSize = size;
717 info.memoryTypeIndex = memory_type_index;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600718 return info;
719}
720
Karl Schultz6addd812016-02-02 17:17:23 -0700721inline VkBufferCreateInfo Buffer::create_info(VkDeviceSize size,
722 VkFlags usage) {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600723 VkBufferCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-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 Schultz6addd812016-02-02 17:17:23 -0700730inline VkFenceCreateInfo Fence::create_info(VkFenceCreateFlags flags) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600731 VkFenceCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600732 info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
733 info.flags = flags;
734 return info;
735}
736
Karl Schultz6addd812016-02-02 17:17:23 -0700737inline VkFenceCreateInfo Fence::create_info() {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600738 VkFenceCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600739 info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
740 return info;
741}
742
Karl Schultz6addd812016-02-02 17:17:23 -0700743inline VkSemaphoreCreateInfo Semaphore::create_info(VkFlags flags) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600744 VkSemaphoreCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600745 info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600746 info.flags = flags;
747 return info;
748}
749
Karl Schultz6addd812016-02-02 17:17:23 -0700750inline VkEventCreateInfo Event::create_info(VkFlags flags) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600751 VkEventCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600752 info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
753 info.flags = flags;
754 return info;
755}
756
Karl Schultz6addd812016-02-02 17:17:23 -0700757inline VkQueryPoolCreateInfo QueryPool::create_info(VkQueryType type,
758 uint32_t slot_count) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600759 VkQueryPoolCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600760 info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
761 info.queryType = type;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700762 info.queryCount = slot_count;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600763 return info;
764}
765
Karl Schultz6addd812016-02-02 17:17:23 -0700766inline VkImageCreateInfo Image::create_info() {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600767 VkImageCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-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 Goeltzenleuchter5d2aed42015-10-21 17:57:31 -0600773 info.arrayLayers = 1;
Chia-I Wu5c17c962015-10-31 00:31:16 +0800774 info.samples = VK_SAMPLE_COUNT_1_BIT;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600775 return info;
776}
777
Karl Schultz6addd812016-02-02 17:17:23 -0700778inline VkImageSubresource Image::subresource(VkImageAspectFlagBits aspect,
779 uint32_t mip_level,
780 uint32_t array_layer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600781 VkImageSubresource subres = {};
Chia-I Wu52b07e72015-10-27 19:55:05 +0800782 subres.aspectMask = aspect;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600783 subres.mipLevel = mip_level;
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600784 subres.arrayLayer = array_layer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600785 return subres;
786}
787
Karl Schultz6addd812016-02-02 17:17:23 -0700788inline VkImageSubresource
789Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level,
790 uint32_t array_layer) {
791 return subresource(image_aspect(range.aspectMask),
792 range.baseMipLevel + mip_level,
793 range.baseArrayLayer + array_layer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600794}
795
Karl Schultz6addd812016-02-02 17:17:23 -0700796inline VkImageSubresourceLayers Image::subresource(VkImageAspectFlagBits aspect,
797 uint32_t mip_level,
798 uint32_t array_layer,
799 uint32_t array_size) {
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800800 VkImageSubresourceLayers subres = {};
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800801 subres.aspectMask = aspect;
Courtney Goeltzenleuchter01ee1ca2015-09-10 16:41:13 -0600802 subres.mipLevel = mip_level;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -0600803 subres.baseArrayLayer = array_layer;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800804 subres.layerCount = array_size;
Courtney Goeltzenleuchter01ee1ca2015-09-10 16:41:13 -0600805 return subres;
806}
807
Karl Schultz6addd812016-02-02 17:17:23 -0700808inline VkImageAspectFlagBits Image::image_aspect(VkImageAspectFlags flags) {
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600809 /*
810 * This will map VkImageAspectFlags into a single VkImageAspect.
811 * If there is more than one bit defined we'll get an assertion.
812 */
813 switch (flags) {
814 case VK_IMAGE_ASPECT_COLOR_BIT:
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600815 return VK_IMAGE_ASPECT_COLOR_BIT;
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600816 case VK_IMAGE_ASPECT_DEPTH_BIT:
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600817 return VK_IMAGE_ASPECT_DEPTH_BIT;
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600818 case VK_IMAGE_ASPECT_STENCIL_BIT:
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600819 return VK_IMAGE_ASPECT_STENCIL_BIT;
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600820 case VK_IMAGE_ASPECT_METADATA_BIT:
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600821 return VK_IMAGE_ASPECT_METADATA_BIT;
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600822 default:
823 assert(!"Invalid VkImageAspect");
824 }
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600825 return VK_IMAGE_ASPECT_COLOR_BIT;
Courtney Goeltzenleuchter01ee1ca2015-09-10 16:41:13 -0600826}
827
Karl Schultz6addd812016-02-02 17:17:23 -0700828inline VkImageSubresourceLayers
829Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level,
830 uint32_t array_layer, uint32_t array_size) {
831 return subresource(image_aspect(range.aspectMask),
832 range.baseMipLevel + mip_level,
833 range.baseArrayLayer + array_layer, array_size);
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600834}
835
Karl Schultz6addd812016-02-02 17:17:23 -0700836inline VkImageSubresourceRange
837Image::subresource_range(VkImageAspectFlags aspect_mask,
838 uint32_t base_mip_level, uint32_t mip_levels,
839 uint32_t base_array_layer, uint32_t num_layers) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600840 VkImageSubresourceRange range = {};
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600841 range.aspectMask = aspect_mask;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600842 range.baseMipLevel = base_mip_level;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800843 range.levelCount = mip_levels;
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600844 range.baseArrayLayer = base_array_layer;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800845 range.layerCount = num_layers;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600846 return range;
847}
848
Karl Schultz6addd812016-02-02 17:17:23 -0700849inline VkImageSubresourceRange
850Image::subresource_range(const VkImageCreateInfo &info,
851 VkImageAspectFlags aspect_mask) {
852 return subresource_range(aspect_mask, 0, info.mipLevels, 0,
853 info.arrayLayers);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600854}
855
Karl Schultz6addd812016-02-02 17:17:23 -0700856inline VkImageSubresourceRange
857Image::subresource_range(const VkImageSubresource &subres) {
858 return subresource_range(subres.aspectMask, subres.mipLevel, 1,
859 subres.arrayLayer, 1);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600860}
861
Karl Schultz6addd812016-02-02 17:17:23 -0700862inline VkExtent2D Image::extent(int32_t width, int32_t height) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600863 VkExtent2D extent = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600864 extent.width = width;
865 extent.height = height;
866 return extent;
867}
868
Karl Schultz6addd812016-02-02 17:17:23 -0700869inline VkExtent2D Image::extent(const VkExtent2D &extent, uint32_t mip_level) {
870 const int32_t width =
871 (extent.width >> mip_level) ? extent.width >> mip_level : 1;
872 const int32_t height =
873 (extent.height >> mip_level) ? extent.height >> mip_level : 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600874 return Image::extent(width, height);
875}
876
Karl Schultz6addd812016-02-02 17:17:23 -0700877inline VkExtent2D Image::extent(const VkExtent3D &extent) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600878 return Image::extent(extent.width, extent.height);
879}
880
Karl Schultz6addd812016-02-02 17:17:23 -0700881inline VkExtent3D Image::extent(int32_t width, int32_t height, int32_t depth) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600882 VkExtent3D extent = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600883 extent.width = width;
884 extent.height = height;
885 extent.depth = depth;
886 return extent;
887}
888
Karl Schultz6addd812016-02-02 17:17:23 -0700889inline VkExtent3D Image::extent(const VkExtent3D &extent, uint32_t mip_level) {
890 const int32_t width =
891 (extent.width >> mip_level) ? extent.width >> mip_level : 1;
892 const int32_t height =
893 (extent.height >> mip_level) ? extent.height >> mip_level : 1;
894 const int32_t depth =
895 (extent.depth >> mip_level) ? extent.depth >> mip_level : 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600896 return Image::extent(width, height, depth);
897}
898
Karl Schultz6addd812016-02-02 17:17:23 -0700899inline VkShaderModuleCreateInfo ShaderModule::create_info(size_t code_size,
900 const uint32_t *code,
901 VkFlags flags) {
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600902 VkShaderModuleCreateInfo info = {};
903 info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
904 info.codeSize = code_size;
905 info.pCode = code;
906 info.flags = flags;
907 return info;
908}
909
Karl Schultz6addd812016-02-02 17:17:23 -0700910inline VkWriteDescriptorSet
911Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
912 uint32_t array_element, VkDescriptorType type,
913 uint32_t count,
914 const VkDescriptorImageInfo *image_info) {
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800915 VkWriteDescriptorSet write = {};
916 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800917 write.dstSet = set.handle();
918 write.dstBinding = binding;
919 write.dstArrayElement = array_element;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800920 write.descriptorCount = count;
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800921 write.descriptorType = type;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600922 write.pImageInfo = image_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800923 return write;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600924}
925
Karl Schultz6addd812016-02-02 17:17:23 -0700926inline VkWriteDescriptorSet
927Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
928 uint32_t array_element, VkDescriptorType type,
929 uint32_t count,
930 const VkDescriptorBufferInfo *buffer_info) {
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600931 VkWriteDescriptorSet write = {};
932 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800933 write.dstSet = set.handle();
934 write.dstBinding = binding;
935 write.dstArrayElement = array_element;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800936 write.descriptorCount = count;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600937 write.descriptorType = type;
938 write.pBufferInfo = buffer_info;
939 return write;
940}
941
Karl Schultz6addd812016-02-02 17:17:23 -0700942inline VkWriteDescriptorSet
943Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
944 uint32_t array_element, VkDescriptorType type,
945 uint32_t count, const VkBufferView *buffer_views) {
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600946 VkWriteDescriptorSet write = {};
947 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800948 write.dstSet = set.handle();
949 write.dstBinding = binding;
950 write.dstArrayElement = array_element;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800951 write.descriptorCount = count;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600952 write.descriptorType = type;
953 write.pTexelBufferView = buffer_views;
954 return write;
955}
956
Karl Schultz6addd812016-02-02 17:17:23 -0700957inline VkWriteDescriptorSet Device::write_descriptor_set(
958 const DescriptorSet &set, uint32_t binding, uint32_t array_element,
959 VkDescriptorType type,
960 const std::vector<VkDescriptorImageInfo> &image_info) {
961 return write_descriptor_set(set, binding, array_element, type,
962 image_info.size(), &image_info[0]);
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600963}
964
Karl Schultz6addd812016-02-02 17:17:23 -0700965inline VkWriteDescriptorSet Device::write_descriptor_set(
966 const DescriptorSet &set, uint32_t binding, uint32_t array_element,
967 VkDescriptorType type,
968 const std::vector<VkDescriptorBufferInfo> &buffer_info) {
969 return write_descriptor_set(set, binding, array_element, type,
970 buffer_info.size(), &buffer_info[0]);
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600971}
972
Karl Schultz6addd812016-02-02 17:17:23 -0700973inline VkWriteDescriptorSet
974Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
975 uint32_t array_element, VkDescriptorType type,
976 const std::vector<VkBufferView> &buffer_views) {
977 return write_descriptor_set(set, binding, array_element, type,
978 buffer_views.size(), &buffer_views[0]);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600979}
980
Karl Schultz6addd812016-02-02 17:17:23 -0700981inline VkCopyDescriptorSet
982Device::copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding,
983 uint32_t src_array_element,
984 const DescriptorSet &dst_set, uint32_t dst_binding,
985 uint32_t dst_array_element, uint32_t count) {
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800986 VkCopyDescriptorSet copy = {};
987 copy.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800988 copy.srcSet = src_set.handle();
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800989 copy.srcBinding = src_binding;
990 copy.srcArrayElement = src_array_element;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800991 copy.dstSet = dst_set.handle();
992 copy.dstBinding = dst_binding;
993 copy.dstArrayElement = dst_array_element;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800994 copy.descriptorCount = count;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600995
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800996 return copy;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600997}
998
Karl Schultz6addd812016-02-02 17:17:23 -0700999inline VkCommandBufferAllocateInfo
1000CommandBuffer::create_info(VkCommandPool const &pool) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001001 VkCommandBufferAllocateInfo info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001002 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001003 info.commandPool = pool;
Jon Ashburnf19916e2016-01-11 13:12:43 -07001004 info.commandBufferCount = 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001005 return info;
1006}
1007
1008}; // namespace vk_testing
1009
1010#endif // VKTESTBINDING_H