blob: 6eb113c7ca9ec154dd81b6473f09d1c0aafab56a [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 *
Jon Ashburn43b53e82016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Karl Schultz99e9d1d2016-02-02 17:17:23 -07009 *
Jon Ashburn43b53e82016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz99e9d1d2016-02-02 17:17:23 -070011 *
Jon Ashburn43b53e82016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Karl Schultz99e9d1d2016-02-02 17:17:23 -070017 *
18 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
19 * Author: Cody Northrop <cody@lunarg.com>
20 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060021
22#ifndef VKTESTBINDING_H
23#define VKTESTBINDING_H
24
25#include <vector>
Chia-I Wua10be9d2015-07-03 10:13:26 +080026#include <assert.h>
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060027
David Pinedo329ca9e2015-11-06 12:54:48 -070028#include "vulkan/vulkan.h"
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060029
30namespace vk_testing {
31
Karl Schultz99e9d1d2016-02-02 17:17:23 -070032typedef void (*ErrorCallback)(const char *expr, const char *file,
33 unsigned int line, const char *function);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060034void set_error_callback(ErrorCallback callback);
35
Chia-I Wuf5fb1092015-07-03 10:32:05 +080036class PhysicalDevice;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060037class Device;
38class Queue;
Chia-I Wuba0836f2015-07-03 10:58:57 +080039class DeviceMemory;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060040class Fence;
41class Semaphore;
42class Event;
43class QueryPool;
44class Buffer;
45class BufferView;
46class Image;
47class ImageView;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060048class DepthStencilView;
49class Shader;
50class Pipeline;
51class PipelineDelta;
52class Sampler;
53class DescriptorSetLayout;
Mark Lobodzinski556f7212015-04-17 14:11:39 -050054class PipelineLayout;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060055class DescriptorSetPool;
56class DescriptorSet;
Chia-I Wu1f851912015-10-27 18:04:07 +080057class CommandBuffer;
58class CommandPool;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060059
Courtney Goeltzenleuchter18061cd2015-06-29 15:39:26 -060060std::vector<VkLayerProperties> GetGlobalLayers();
61std::vector<VkExtensionProperties> GetGlobalExtensions();
62std::vector<VkExtensionProperties> GetGlobalExtensions(const char *pLayerName);
63
Chia-I Wua10be9d2015-07-03 10:13:26 +080064namespace internal {
65
Karl Schultz99e9d1d2016-02-02 17:17:23 -070066template <typename T> class Handle {
67 public:
Chia-I Wua10be9d2015-07-03 10:13:26 +080068 const T &handle() const { return handle_; }
69 bool initialized() const { return (handle_ != VK_NULL_HANDLE); }
70
Karl Schultz99e9d1d2016-02-02 17:17:23 -070071 protected:
Chia-I Wua10be9d2015-07-03 10:13:26 +080072 typedef T handle_type;
73
74 explicit Handle() : handle_(VK_NULL_HANDLE) {}
75 explicit Handle(T handle) : handle_(handle) {}
76
Karl Schultz99e9d1d2016-02-02 17:17:23 -070077 void init(T handle) {
Chia-I Wua10be9d2015-07-03 10:13:26 +080078 assert(!initialized());
79 handle_ = handle;
80 }
81
Karl Schultz99e9d1d2016-02-02 17:17:23 -070082 private:
Chia-I Wua10be9d2015-07-03 10:13:26 +080083 // handles are non-copyable
84 Handle(const Handle &);
85 Handle &operator=(const Handle &);
86
87 T handle_;
88};
89
Karl Schultz99e9d1d2016-02-02 17:17:23 -070090template <typename T> class NonDispHandle : public Handle<T> {
91 protected:
Chia-I Wua10be9d2015-07-03 10:13:26 +080092 explicit NonDispHandle() : Handle<T>(), dev_handle_(VK_NULL_HANDLE) {}
Karl Schultz99e9d1d2016-02-02 17:17:23 -070093 explicit NonDispHandle(VkDevice dev, T handle)
94 : Handle<T>(handle), dev_handle_(dev) {}
Chia-I Wua10be9d2015-07-03 10:13:26 +080095
96 const VkDevice &device() const { return dev_handle_; }
97
Karl Schultz99e9d1d2016-02-02 17:17:23 -070098 void init(VkDevice dev, T handle) {
Chia-I Wua10be9d2015-07-03 10:13:26 +080099 assert(!Handle<T>::initialized() && dev_handle_ == VK_NULL_HANDLE);
100 Handle<T>::init(handle);
101 dev_handle_ = dev;
102 }
103
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700104 private:
Chia-I Wua10be9d2015-07-03 10:13:26 +0800105 VkDevice dev_handle_;
106};
107
108} // namespace internal
109
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800110class PhysicalDevice : public internal::Handle<VkPhysicalDevice> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700111 public:
112 explicit PhysicalDevice(VkPhysicalDevice phy) : Handle(phy) {
Mark Lobodzinski72346292015-07-02 16:49:40 -0600113 memory_properties_ = memory_properties();
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600114 device_properties_ = properties();
Mark Lobodzinski72346292015-07-02 16:49:40 -0600115 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600116
Tony Barbour8205d902015-04-16 15:59:00 -0600117 VkPhysicalDeviceProperties properties() const;
Tony Barbour8205d902015-04-16 15:59:00 -0600118 VkPhysicalDeviceMemoryProperties memory_properties() const;
Cody Northropef72e2a2015-08-03 17:04:53 -0600119 std::vector<VkQueueFamilyProperties> queue_properties() const;
Chris Forbes90479f42016-04-04 17:22:42 +1200120 VkPhysicalDeviceFeatures features() const;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600121
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700122 bool set_memory_type(const uint32_t type_bits, VkMemoryAllocateInfo *info,
123 const VkMemoryPropertyFlags properties,
124 const VkMemoryPropertyFlags forbid = 0) const;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600125
Courtney Goeltzenleuchter74c4ce92015-09-14 17:22:16 -0600126 // vkEnumerateDeviceExtensionProperties()
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600127 std::vector<VkExtensionProperties> extensions() const;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700128 std::vector<VkExtensionProperties> extensions(const char *pLayerName) const;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600129
130 // vkEnumerateLayers()
Courtney Goeltzenleuchterf5c61952015-07-06 09:10:47 -0600131 std::vector<VkLayerProperties> layers() const;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600132
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700133 private:
134 void
135 add_extension_dependencies(uint32_t dependency_count,
136 VkExtensionProperties *depencency_props,
137 std::vector<VkExtensionProperties> &ext_list);
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800138
Mark Lobodzinski72346292015-07-02 16:49:40 -0600139 VkPhysicalDeviceMemoryProperties memory_properties_;
Mark Lobodzinskiddaecf82015-09-22 09:33:21 -0600140
141 VkPhysicalDeviceProperties device_properties_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600142};
143
Chia-I Wua2636292015-07-03 10:41:20 +0800144class Device : public internal::Handle<VkDevice> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700145 public:
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800146 explicit Device(VkPhysicalDevice phy) : phy_(phy) {}
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600147 ~Device();
148
149 // vkCreateDevice()
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600150 void init(const VkDeviceCreateInfo &info);
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700151 void init(std::vector<const char *> &layers,
152 std::vector<const char *> &
153 extensions); // all queues, all extensions, etc
154 void init() {
155 std::vector<const char *> layers;
156 std::vector<const char *> extensions;
157 init(layers, extensions);
158 };
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600159
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800160 const PhysicalDevice &phy() const { return phy_; }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600161
Jon Ashburn1245cec2015-05-18 13:20:15 -0600162 // vkGetDeviceProcAddr()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700163 PFN_vkVoidFunction get_proc(const char *name) const {
164 return vkGetDeviceProcAddr(handle(), name);
165 }
Jon Ashburn1245cec2015-05-18 13:20:15 -0600166
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600167 // vkGetDeviceQueue()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700168 const std::vector<Queue *> &graphics_queues() const {
169 return queues_[GRAPHICS];
170 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600171 const std::vector<Queue *> &compute_queues() { return queues_[COMPUTE]; }
172 const std::vector<Queue *> &dma_queues() { return queues_[DMA]; }
173 uint32_t graphics_queue_node_index_;
174
175 struct Format {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600176 VkFormat format;
177 VkImageTiling tiling;
178 VkFlags features;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600179 };
180 // vkGetFormatInfo()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600181 VkFormatProperties format_properties(VkFormat format);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600182 const std::vector<Format> &formats() const { return formats_; }
183
184 // vkDeviceWaitIdle()
185 void wait();
186
187 // vkWaitForFences()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700188 VkResult wait(const std::vector<const Fence *> &fences, bool wait_all,
189 uint64_t timeout);
190 VkResult wait(const Fence &fence) {
191 return wait(std::vector<const Fence *>(1, &fence), true, (uint64_t)-1);
192 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600193
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800194 // vkUpdateDescriptorSets()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700195 void update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes,
196 const std::vector<VkCopyDescriptorSet> &copies);
197 void
198 update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes) {
199 return update_descriptor_sets(writes,
200 std::vector<VkCopyDescriptorSet>());
201 }
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800202
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700203 static VkWriteDescriptorSet
204 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
205 uint32_t array_element, VkDescriptorType type,
206 uint32_t count,
207 const VkDescriptorImageInfo *image_info);
208 static VkWriteDescriptorSet
209 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
210 uint32_t array_element, VkDescriptorType type,
211 uint32_t count,
212 const VkDescriptorBufferInfo *buffer_info);
213 static VkWriteDescriptorSet
214 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
215 uint32_t array_element, VkDescriptorType type,
216 uint32_t count, const VkBufferView *buffer_views);
217 static VkWriteDescriptorSet
218 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
219 uint32_t array_element, VkDescriptorType type,
220 const std::vector<VkDescriptorImageInfo> &image_info);
221 static VkWriteDescriptorSet write_descriptor_set(
222 const DescriptorSet &set, uint32_t binding, uint32_t array_element,
223 VkDescriptorType type,
224 const std::vector<VkDescriptorBufferInfo> &buffer_info);
225 static VkWriteDescriptorSet
226 write_descriptor_set(const DescriptorSet &set, uint32_t binding,
227 uint32_t array_element, VkDescriptorType type,
228 const std::vector<VkBufferView> &buffer_views);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800229
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700230 static VkCopyDescriptorSet
231 copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding,
232 uint32_t src_array_element,
233 const DescriptorSet &dst_set, uint32_t dst_binding,
234 uint32_t dst_array_element, uint32_t count);
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800235
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700236 private:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600237 enum QueueIndex {
238 GRAPHICS,
239 COMPUTE,
240 DMA,
241 QUEUE_COUNT,
242 };
243
244 void init_queues();
245 void init_formats();
246
Chia-I Wuf5fb1092015-07-03 10:32:05 +0800247 PhysicalDevice phy_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600248
249 std::vector<Queue *> queues_[QUEUE_COUNT];
250 std::vector<Format> formats_;
251};
252
Chia-I Wuf2862c72015-07-03 10:53:18 +0800253class Queue : public internal::Handle<VkQueue> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700254 public:
255 explicit Queue(VkQueue queue, int index) : Handle(queue) {
256 family_index_ = index;
257 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600258
259 // vkQueueSubmit()
Chia-I Wu1f851912015-10-27 18:04:07 +0800260 void submit(const std::vector<const CommandBuffer *> &cmds, Fence &fence);
261 void submit(const CommandBuffer &cmd, Fence &fence);
262 void submit(const CommandBuffer &cmd);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600263
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600264 // vkQueueWaitIdle()
265 void wait();
266
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700267 int get_family_index() { return family_index_; }
Tony Barbour0caa94f2015-07-23 10:35:30 -0600268
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700269 private:
Tony Barbour0caa94f2015-07-23 10:35:30 -0600270 int family_index_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600271};
272
Chia-I Wuba0836f2015-07-03 10:58:57 +0800273class DeviceMemory : public internal::NonDispHandle<VkDeviceMemory> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700274 public:
Chia-I Wuba0836f2015-07-03 10:58:57 +0800275 ~DeviceMemory();
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600276
Chia-I Wu1f851912015-10-27 18:04:07 +0800277 // vkAllocateMemory()
278 void init(const Device &dev, const VkMemoryAllocateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600279
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600280 // vkMapMemory()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600281 const void *map(VkFlags flags) const;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700282 void *map(VkFlags flags);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600283 const void *map() const { return map(0); }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700284 void *map() { return map(0); }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600285
286 // vkUnmapMemory()
287 void unmap() const;
288
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700289 static VkMemoryAllocateInfo alloc_info(VkDeviceSize size,
290 uint32_t memory_type_index);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600291};
292
Chia-I Wua4992342015-07-03 11:45:55 +0800293class Fence : public internal::NonDispHandle<VkFence> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700294 public:
Chia-I Wua4992342015-07-03 11:45:55 +0800295 ~Fence();
296
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600297 // vkCreateFence()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600298 void init(const Device &dev, const VkFenceCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600299
300 // vkGetFenceStatus()
Chia-I Wua4992342015-07-03 11:45:55 +0800301 VkResult status() const { return vkGetFenceStatus(device(), handle()); }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600302
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600303 static VkFenceCreateInfo create_info(VkFenceCreateFlags flags);
304 static VkFenceCreateInfo create_info();
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600305};
306
Chia-I Wu2454b922015-07-03 11:49:42 +0800307class Semaphore : public internal::NonDispHandle<VkSemaphore> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700308 public:
Chia-I Wu2454b922015-07-03 11:49:42 +0800309 ~Semaphore();
310
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600311 // vkCreateSemaphore()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600312 void init(const Device &dev, const VkSemaphoreCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600313
Tony Barbour864fd382015-06-26 12:56:09 -0600314 static VkSemaphoreCreateInfo create_info(VkFlags flags);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600315};
316
Chia-I Wu9b6db1d2015-07-03 11:49:42 +0800317class Event : public internal::NonDispHandle<VkEvent> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700318 public:
Chia-I Wu9b6db1d2015-07-03 11:49:42 +0800319 ~Event();
320
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600321 // vkCreateEvent()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600322 void init(const Device &dev, const VkEventCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600323
324 // vkGetEventStatus()
325 // vkSetEvent()
326 // vkResetEvent()
Chia-I Wu9b6db1d2015-07-03 11:49:42 +0800327 VkResult status() const { return vkGetEventStatus(device(), handle()); }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600328 void set();
329 void reset();
330
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600331 static VkEventCreateInfo create_info(VkFlags flags);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600332};
333
Chia-I Wufd0ce992015-07-03 11:49:42 +0800334class QueryPool : public internal::NonDispHandle<VkQueryPool> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700335 public:
Chia-I Wufd0ce992015-07-03 11:49:42 +0800336 ~QueryPool();
337
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600338 // vkCreateQueryPool()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600339 void init(const Device &dev, const VkQueryPoolCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600340
341 // vkGetQueryPoolResults()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700342 VkResult results(uint32_t first, uint32_t count, size_t size, void *data,
343 size_t stride);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600344
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700345 static VkQueryPoolCreateInfo create_info(VkQueryType type,
346 uint32_t slot_count);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600347};
348
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800349class Buffer : public internal::NonDispHandle<VkBuffer> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700350 public:
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800351 explicit Buffer() : NonDispHandle() {}
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700352 explicit Buffer(const Device &dev, const VkBufferCreateInfo &info) {
353 init(dev, info);
354 }
Tony Barbour8205d902015-04-16 15:59:00 -0600355 explicit Buffer(const Device &dev, VkDeviceSize size) { init(dev, size); }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600356
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800357 ~Buffer();
358
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600359 // vkCreateBuffer()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700360 void init(const Device &dev, const VkBufferCreateInfo &info,
361 VkMemoryPropertyFlags mem_props);
362 void init(const Device &dev, const VkBufferCreateInfo &info) {
363 init(dev, info, 0);
364 }
365 void init(const Device &dev, VkDeviceSize size,
366 VkMemoryPropertyFlags mem_props) {
367 init(dev, create_info(size, 0), mem_props);
368 }
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800369 void init(const Device &dev, VkDeviceSize size) { init(dev, size, 0); }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700370 void init_as_src(const Device &dev, VkDeviceSize size,
371 VkMemoryPropertyFlags &reqs) {
372 init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT), reqs);
373 }
374 void init_as_dst(const Device &dev, VkDeviceSize size,
375 VkMemoryPropertyFlags &reqs) {
376 init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_DST_BIT), reqs);
377 }
378 void init_as_src_and_dst(const Device &dev, VkDeviceSize size,
379 VkMemoryPropertyFlags &reqs) {
380 init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
381 VK_BUFFER_USAGE_TRANSFER_DST_BIT),
382 reqs);
383 }
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600384 void init_no_mem(const Device &dev, const VkBufferCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600385
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800386 // get the internal memory
387 const DeviceMemory &memory() const { return internal_mem_; }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700388 DeviceMemory &memory() { return internal_mem_; }
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800389
390 // vkGetObjectMemoryRequirements()
391 VkMemoryRequirements memory_requirements() const;
392
393 // vkBindObjectMemory()
394 void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
Mark Lobodzinskifb9f5642015-05-11 17:21:15 -0500395
Tony Barbour8205d902015-04-16 15:59:00 -0600396 static VkBufferCreateInfo create_info(VkDeviceSize size, VkFlags usage);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600397
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700398 VkBufferMemoryBarrier buffer_memory_barrier(VkFlags output_mask,
399 VkFlags input_mask,
400 VkDeviceSize offset,
401 VkDeviceSize size) const {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600402 VkBufferMemoryBarrier barrier = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600403 barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800404 barrier.buffer = handle();
Chia-I Wu989de842015-10-27 19:54:37 +0800405 barrier.srcAccessMask = output_mask;
406 barrier.dstAccessMask = input_mask;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600407 barrier.offset = offset;
408 barrier.size = size;
409 return barrier;
410 }
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800411
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700412 private:
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600413 VkBufferCreateInfo create_info_;
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800414
415 DeviceMemory internal_mem_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600416};
417
Chia-I Wu76ab1ff2015-07-03 11:49:42 +0800418class BufferView : public internal::NonDispHandle<VkBufferView> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700419 public:
Chia-I Wu76ab1ff2015-07-03 11:49:42 +0800420 ~BufferView();
421
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600422 // vkCreateBufferView()
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600423 void init(const Device &dev, const VkBufferViewCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600424};
425
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800426class Image : public internal::NonDispHandle<VkImage> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700427 public:
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800428 explicit Image() : NonDispHandle(), format_features_(0) {}
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700429 explicit Image(const Device &dev, const VkImageCreateInfo &info)
430 : format_features_(0) {
431 init(dev, info);
432 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600433
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800434 ~Image();
435
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600436 // vkCreateImage()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700437 void init(const Device &dev, const VkImageCreateInfo &info,
438 VkMemoryPropertyFlags mem_props);
439 void init(const Device &dev, const VkImageCreateInfo &info) {
440 init(dev, info, 0);
441 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600442 void init_no_mem(const Device &dev, const VkImageCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600443
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800444 // get the internal memory
445 const DeviceMemory &memory() const { return internal_mem_; }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700446 DeviceMemory &memory() { return internal_mem_; }
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800447
448 // vkGetObjectMemoryRequirements()
449 VkMemoryRequirements memory_requirements() const;
450
451 // vkBindObjectMemory()
452 void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600453
Tony Barbour426b9052015-06-24 16:06:58 -0600454 // vkGetImageSubresourceLayout()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700455 VkSubresourceLayout
456 subresource_layout(const VkImageSubresource &subres) const;
457 VkSubresourceLayout
458 subresource_layout(const VkImageSubresourceLayers &subres) const;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600459
460 bool transparent() const;
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700461 bool copyable() const {
462 return (format_features_ & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
463 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600464
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700465 VkImageSubresourceRange
466 subresource_range(VkImageAspectFlagBits aspect) const {
467 return subresource_range(create_info_, aspect);
468 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600469 VkExtent3D extent() const { return create_info_.extent; }
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700470 VkExtent3D extent(uint32_t mip_level) const {
471 return extent(create_info_.extent, mip_level);
472 }
473 VkFormat format() const { return create_info_.format; }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600474
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700475 VkImageMemoryBarrier
476 image_memory_barrier(VkFlags output_mask, VkFlags input_mask,
477 VkImageLayout old_layout, VkImageLayout new_layout,
478 const VkImageSubresourceRange &range) const {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600479 VkImageMemoryBarrier barrier = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600480 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Chia-I Wu989de842015-10-27 19:54:37 +0800481 barrier.srcAccessMask = output_mask;
482 barrier.dstAccessMask = input_mask;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600483 barrier.oldLayout = old_layout;
484 barrier.newLayout = new_layout;
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800485 barrier.image = handle();
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600486 barrier.subresourceRange = range;
487 return barrier;
488 }
489
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600490 static VkImageCreateInfo create_info();
Karl Schultz8da60b02016-03-29 12:41:24 -0600491 static VkImageSubresource subresource(VkImageAspectFlags aspect,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700492 uint32_t mip_level,
493 uint32_t array_layer);
494 static VkImageSubresource subresource(const VkImageSubresourceRange &range,
495 uint32_t mip_level,
496 uint32_t array_layer);
Karl Schultz8da60b02016-03-29 12:41:24 -0600497 static VkImageSubresourceLayers subresource(VkImageAspectFlags aspect,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700498 uint32_t mip_level,
499 uint32_t array_layer,
500 uint32_t array_size);
501 static VkImageSubresourceLayers
502 subresource(const VkImageSubresourceRange &range, uint32_t mip_level,
503 uint32_t array_layer, uint32_t array_size);
504 static VkImageSubresourceRange
505 subresource_range(VkImageAspectFlags aspect_mask, uint32_t base_mip_level,
506 uint32_t mip_levels, uint32_t base_array_layer,
507 uint32_t num_layers);
508 static VkImageSubresourceRange
509 subresource_range(const VkImageCreateInfo &info,
510 VkImageAspectFlags aspect_mask);
511 static VkImageSubresourceRange
512 subresource_range(const VkImageSubresource &subres);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600513
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600514 static VkExtent2D extent(int32_t width, int32_t height);
515 static VkExtent2D extent(const VkExtent2D &extent, uint32_t mip_level);
516 static VkExtent2D extent(const VkExtent3D &extent);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600517
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600518 static VkExtent3D extent(int32_t width, int32_t height, int32_t depth);
519 static VkExtent3D extent(const VkExtent3D &extent, uint32_t mip_level);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600520
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700521 private:
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600522 void init_info(const Device &dev, const VkImageCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600523
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600524 VkImageCreateInfo create_info_;
525 VkFlags format_features_;
Chia-I Wuf4aed6c2015-07-03 13:44:34 +0800526
527 DeviceMemory internal_mem_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600528};
529
Chia-I Wu76ab1ff2015-07-03 11:49:42 +0800530class ImageView : public internal::NonDispHandle<VkImageView> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700531 public:
Chia-I Wu76ab1ff2015-07-03 11:49:42 +0800532 ~ImageView();
533
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600534 // vkCreateImageView()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600535 void init(const Device &dev, const VkImageViewCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600536};
537
Chia-I Wub48eddb2015-07-03 11:49:42 +0800538class ShaderModule : public internal::NonDispHandle<VkShaderModule> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700539 public:
Chia-I Wub48eddb2015-07-03 11:49:42 +0800540 ~ShaderModule();
541
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -0600542 // vkCreateShaderModule()
543 void init(const Device &dev, const VkShaderModuleCreateInfo &info);
544 VkResult init_try(const Device &dev, const VkShaderModuleCreateInfo &info);
545
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700546 static VkShaderModuleCreateInfo
547 create_info(size_t code_size, const uint32_t *code, VkFlags flags);
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -0600548};
549
Chia-I Wu2b1d4d02015-07-03 11:49:42 +0800550class Pipeline : public internal::NonDispHandle<VkPipeline> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700551 public:
Chia-I Wu2b1d4d02015-07-03 11:49:42 +0800552 ~Pipeline();
553
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600554 // vkCreateGraphicsPipeline()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600555 void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600556 // vkCreateGraphicsPipelineDerivative()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700557 void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info,
558 const VkPipeline basePipeline);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600559 // vkCreateComputePipeline()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600560 void init(const Device &dev, const VkComputePipelineCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600561 // vkLoadPipeline()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700562 void init(const Device &dev, size_t size, const void *data);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600563 // vkLoadPipelineDerivative()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700564 void init(const Device &dev, size_t size, const void *data,
565 VkPipeline basePipeline);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600566
Chris Forbesdc2188c2015-05-25 11:13:26 +1200567 // vkCreateGraphicsPipeline with error return
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700568 VkResult init_try(const Device &dev,
569 const VkGraphicsPipelineCreateInfo &info);
Chris Forbesdc2188c2015-05-25 11:13:26 +1200570
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600571 // vkStorePipeline()
572 size_t store(size_t size, void *data);
573};
574
Chia-I Wudeb99132015-07-03 11:49:42 +0800575class PipelineLayout : public internal::NonDispHandle<VkPipelineLayout> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700576 public:
Chia-I Wudeb99132015-07-03 11:49:42 +0800577 ~PipelineLayout();
578
579 // vCreatePipelineLayout()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700580 void init(const Device &dev, VkPipelineLayoutCreateInfo &info,
581 const std::vector<const DescriptorSetLayout *> &layouts);
Chia-I Wudeb99132015-07-03 11:49:42 +0800582};
583
Chia-I Wu6abe35d2015-07-03 11:49:42 +0800584class Sampler : public internal::NonDispHandle<VkSampler> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700585 public:
Chia-I Wu6abe35d2015-07-03 11:49:42 +0800586 ~Sampler();
587
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600588 // vkCreateSampler()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600589 void init(const Device &dev, const VkSamplerCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600590};
591
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700592class DescriptorSetLayout
593 : public internal::NonDispHandle<VkDescriptorSetLayout> {
594 public:
Chia-I Wu55a871f2015-07-03 11:49:42 +0800595 ~DescriptorSetLayout();
596
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600597 // vkCreateDescriptorSetLayout()
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600598 void init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600599};
600
Chia-I Wu55a871f2015-07-03 11:49:42 +0800601class DescriptorPool : public internal::NonDispHandle<VkDescriptorPool> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700602 public:
Chia-I Wu55a871f2015-07-03 11:49:42 +0800603 ~DescriptorPool();
604
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700605 // Descriptor sets allocated from this pool will need access to the original
606 // object
Cody Northrop35ce7e62015-10-08 11:39:25 -0600607 VkDescriptorPool GetObj() { return pool_; }
608
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600609 // vkCreateDescriptorPool()
Courtney Goeltzenleuchterd9e966a2015-09-16 16:12:45 -0600610 void init(const Device &dev, const VkDescriptorPoolCreateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600611
612 // vkResetDescriptorPool()
613 void reset();
614
Cody Northrop35ce7e62015-10-08 11:39:25 -0600615 // vkFreeDescriptorSet()
616 void setDynamicUsage(bool isDynamic) { dynamic_usage_ = isDynamic; }
617 bool getDynamicUsage() { return dynamic_usage_; }
618
Chia-I Wu1f851912015-10-27 18:04:07 +0800619 // vkAllocateDescriptorSets()
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700620 std::vector<DescriptorSet *>
621 alloc_sets(const Device &dev,
622 const std::vector<const DescriptorSetLayout *> &layouts);
623 std::vector<DescriptorSet *> alloc_sets(const Device &dev,
624 const DescriptorSetLayout &layout,
625 uint32_t count);
626 DescriptorSet *alloc_sets(const Device &dev,
627 const DescriptorSetLayout &layout);
Cody Northrop35ce7e62015-10-08 11:39:25 -0600628
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700629 private:
Cody Northrop35ce7e62015-10-08 11:39:25 -0600630 VkDescriptorPool pool_;
631
632 // Track whether this pool's usage is VK_DESCRIPTOR_POOL_USAGE_DYNAMIC
633 bool dynamic_usage_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600634};
635
Chia-I Wu55a871f2015-07-03 11:49:42 +0800636class DescriptorSet : public internal::NonDispHandle<VkDescriptorSet> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700637 public:
Chia-I Wu55a871f2015-07-03 11:49:42 +0800638 ~DescriptorSet();
639
640 explicit DescriptorSet() : NonDispHandle() {}
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700641 explicit DescriptorSet(const Device &dev, DescriptorPool *pool,
642 VkDescriptorSet set)
643 : NonDispHandle(dev.handle(), set) {
644 containing_pool_ = pool;
645 }
Tony Barboure84a8d62015-07-10 14:10:27 -0600646
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700647 private:
648 DescriptorPool *containing_pool_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600649};
650
Chia-I Wu1f851912015-10-27 18:04:07 +0800651class CommandPool : public internal::NonDispHandle<VkCommandPool> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700652 public:
Chia-I Wu1f851912015-10-27 18:04:07 +0800653 ~CommandPool();
Courtney Goeltzenleuchter902d0812015-07-10 19:50:17 -0600654
Chia-I Wu1f851912015-10-27 18:04:07 +0800655 explicit CommandPool() : NonDispHandle() {}
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700656 explicit CommandPool(const Device &dev,
657 const VkCommandPoolCreateInfo &info) {
658 init(dev, info);
659 }
Courtney Goeltzenleuchter902d0812015-07-10 19:50:17 -0600660
Chia-I Wu1f851912015-10-27 18:04:07 +0800661 void init(const Device &dev, const VkCommandPoolCreateInfo &info);
Courtney Goeltzenleuchter902d0812015-07-10 19:50:17 -0600662
Chia-I Wu1f851912015-10-27 18:04:07 +0800663 static VkCommandPoolCreateInfo create_info(uint32_t queue_family_index);
Courtney Goeltzenleuchter902d0812015-07-10 19:50:17 -0600664};
665
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700666inline VkCommandPoolCreateInfo
667CommandPool::create_info(uint32_t queue_family_index) {
Chia-I Wu1f851912015-10-27 18:04:07 +0800668 VkCommandPoolCreateInfo info = {};
669 info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
Courtney Goeltzenleuchter902d0812015-07-10 19:50:17 -0600670 info.queueFamilyIndex = queue_family_index;
Tobin Ehlis4c8381e2015-12-14 13:46:38 -0700671 info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Courtney Goeltzenleuchter902d0812015-07-10 19:50:17 -0600672 return info;
673}
674
Chia-I Wu1f851912015-10-27 18:04:07 +0800675class CommandBuffer : public internal::Handle<VkCommandBuffer> {
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700676 public:
Chia-I Wu1f851912015-10-27 18:04:07 +0800677 ~CommandBuffer();
Chia-I Wu78c2a352015-07-03 11:49:42 +0800678
Chia-I Wu1f851912015-10-27 18:04:07 +0800679 explicit CommandBuffer() : Handle() {}
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700680 explicit CommandBuffer(const Device &dev,
681 const VkCommandBufferAllocateInfo &info) {
682 init(dev, info);
683 }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600684
Chia-I Wu1f851912015-10-27 18:04:07 +0800685 // vkAllocateCommandBuffers()
686 void init(const Device &dev, const VkCommandBufferAllocateInfo &info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600687
688 // vkBeginCommandBuffer()
Chia-I Wu1f851912015-10-27 18:04:07 +0800689 void begin(const VkCommandBufferBeginInfo *info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600690 void begin();
691
692 // vkEndCommandBuffer()
693 // vkResetCommandBuffer()
694 void end();
Chia-I Wu1f851912015-10-27 18:04:07 +0800695 void reset(VkCommandBufferResetFlags flags);
696 void reset() { reset(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); }
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600697
Chia-I Wu1f851912015-10-27 18:04:07 +0800698 static VkCommandBufferAllocateInfo create_info(VkCommandPool const &pool);
Chia-I Wu78c2a352015-07-03 11:49:42 +0800699
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700700 private:
Chia-I Wu78c2a352015-07-03 11:49:42 +0800701 VkDevice dev_handle_;
Chia-I Wu1f851912015-10-27 18:04:07 +0800702 VkCommandPool cmd_pool_;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600703};
704
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700705inline VkMemoryAllocateInfo
706DeviceMemory::alloc_info(VkDeviceSize size, uint32_t memory_type_index) {
Chia-I Wu1f851912015-10-27 18:04:07 +0800707 VkMemoryAllocateInfo info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +0800708 info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Chia-I Wuba0836f2015-07-03 10:58:57 +0800709 info.allocationSize = size;
710 info.memoryTypeIndex = memory_type_index;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600711 return info;
712}
713
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700714inline VkBufferCreateInfo Buffer::create_info(VkDeviceSize size,
715 VkFlags usage) {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600716 VkBufferCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600717 info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
718 info.size = size;
719 info.usage = usage;
720 return info;
721}
722
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700723inline VkFenceCreateInfo Fence::create_info(VkFenceCreateFlags flags) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600724 VkFenceCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600725 info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
726 info.flags = flags;
727 return info;
728}
729
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700730inline VkFenceCreateInfo Fence::create_info() {
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 return info;
734}
735
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700736inline VkSemaphoreCreateInfo Semaphore::create_info(VkFlags flags) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600737 VkSemaphoreCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600738 info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600739 info.flags = flags;
740 return info;
741}
742
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700743inline VkEventCreateInfo Event::create_info(VkFlags flags) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600744 VkEventCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600745 info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
746 info.flags = flags;
747 return info;
748}
749
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700750inline VkQueryPoolCreateInfo QueryPool::create_info(VkQueryType type,
751 uint32_t slot_count) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600752 VkQueryPoolCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600753 info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
754 info.queryType = type;
Jon Ashburna4ae48b2016-01-11 13:12:43 -0700755 info.queryCount = slot_count;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600756 return info;
757}
758
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700759inline VkImageCreateInfo Image::create_info() {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600760 VkImageCreateInfo info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600761 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
762 info.extent.width = 1;
763 info.extent.height = 1;
764 info.extent.depth = 1;
765 info.mipLevels = 1;
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -0600766 info.arrayLayers = 1;
Chia-I Wu3138d6a2015-10-31 00:31:16 +0800767 info.samples = VK_SAMPLE_COUNT_1_BIT;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600768 return info;
769}
770
Karl Schultz8da60b02016-03-29 12:41:24 -0600771inline VkImageSubresource Image::subresource(VkImageAspectFlags aspect,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700772 uint32_t mip_level,
773 uint32_t array_layer) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600774 VkImageSubresource subres = {};
Karl Schultz8da60b02016-03-29 12:41:24 -0600775 if (aspect == 0) {
776 assert(!"Invalid VkImageAspectFlags");
777 }
Chia-I Wu195c9e12015-10-27 19:55:05 +0800778 subres.aspectMask = aspect;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600779 subres.mipLevel = mip_level;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600780 subres.arrayLayer = array_layer;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600781 return subres;
782}
783
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700784inline VkImageSubresource
785Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level,
786 uint32_t array_layer) {
Karl Schultz8da60b02016-03-29 12:41:24 -0600787 return subresource(range.aspectMask,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700788 range.baseMipLevel + mip_level,
789 range.baseArrayLayer + array_layer);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600790}
791
Karl Schultz8da60b02016-03-29 12:41:24 -0600792inline VkImageSubresourceLayers Image::subresource(VkImageAspectFlags aspect,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700793 uint32_t mip_level,
794 uint32_t array_layer,
795 uint32_t array_size) {
Chia-I Wuc51b1212015-10-27 19:25:11 +0800796 VkImageSubresourceLayers subres = {};
Karl Schultz8da60b02016-03-29 12:41:24 -0600797 switch (aspect) {
798 case VK_IMAGE_ASPECT_COLOR_BIT:
799 case VK_IMAGE_ASPECT_DEPTH_BIT:
800 case VK_IMAGE_ASPECT_STENCIL_BIT:
801 case VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT:
802 /* valid */
803 break;
804 default:
805 assert(!"Invalid VkImageAspectFlags");
806 }
Chia-I Wu4291d882015-10-27 19:00:15 +0800807 subres.aspectMask = aspect;
Courtney Goeltzenleuchterbd7f5922015-09-10 16:41:13 -0600808 subres.mipLevel = mip_level;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600809 subres.baseArrayLayer = array_layer;
Chia-I Wu1f851912015-10-27 18:04:07 +0800810 subres.layerCount = array_size;
Courtney Goeltzenleuchterbd7f5922015-09-10 16:41:13 -0600811 return subres;
812}
813
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700814inline VkImageSubresourceLayers
815Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level,
816 uint32_t array_layer, uint32_t array_size) {
Karl Schultz8da60b02016-03-29 12:41:24 -0600817 return subresource(range.aspectMask,
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700818 range.baseMipLevel + mip_level,
819 range.baseArrayLayer + array_layer, array_size);
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -0600820}
821
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700822inline VkImageSubresourceRange
823Image::subresource_range(VkImageAspectFlags aspect_mask,
824 uint32_t base_mip_level, uint32_t mip_levels,
825 uint32_t base_array_layer, uint32_t num_layers) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600826 VkImageSubresourceRange range = {};
Karl Schultz8da60b02016-03-29 12:41:24 -0600827 if (aspect_mask == 0) {
828 assert(!"Invalid VkImageAspectFlags");
829 }
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -0600830 range.aspectMask = aspect_mask;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600831 range.baseMipLevel = base_mip_level;
Chia-I Wu1f851912015-10-27 18:04:07 +0800832 range.levelCount = mip_levels;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600833 range.baseArrayLayer = base_array_layer;
Chia-I Wu1f851912015-10-27 18:04:07 +0800834 range.layerCount = num_layers;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600835 return range;
836}
837
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700838inline VkImageSubresourceRange
839Image::subresource_range(const VkImageCreateInfo &info,
840 VkImageAspectFlags aspect_mask) {
841 return subresource_range(aspect_mask, 0, info.mipLevels, 0,
842 info.arrayLayers);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600843}
844
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700845inline VkImageSubresourceRange
846Image::subresource_range(const VkImageSubresource &subres) {
847 return subresource_range(subres.aspectMask, subres.mipLevel, 1,
848 subres.arrayLayer, 1);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600849}
850
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700851inline VkExtent2D Image::extent(int32_t width, int32_t height) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600852 VkExtent2D extent = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600853 extent.width = width;
854 extent.height = height;
855 return extent;
856}
857
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700858inline VkExtent2D Image::extent(const VkExtent2D &extent, uint32_t mip_level) {
859 const int32_t width =
860 (extent.width >> mip_level) ? extent.width >> mip_level : 1;
861 const int32_t height =
862 (extent.height >> mip_level) ? extent.height >> mip_level : 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600863 return Image::extent(width, height);
864}
865
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700866inline VkExtent2D Image::extent(const VkExtent3D &extent) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600867 return Image::extent(extent.width, extent.height);
868}
869
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700870inline VkExtent3D Image::extent(int32_t width, int32_t height, int32_t depth) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600871 VkExtent3D extent = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600872 extent.width = width;
873 extent.height = height;
874 extent.depth = depth;
875 return extent;
876}
877
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700878inline VkExtent3D Image::extent(const VkExtent3D &extent, uint32_t mip_level) {
879 const int32_t width =
880 (extent.width >> mip_level) ? extent.width >> mip_level : 1;
881 const int32_t height =
882 (extent.height >> mip_level) ? extent.height >> mip_level : 1;
883 const int32_t depth =
884 (extent.depth >> mip_level) ? extent.depth >> mip_level : 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600885 return Image::extent(width, height, depth);
886}
887
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700888inline VkShaderModuleCreateInfo ShaderModule::create_info(size_t code_size,
889 const uint32_t *code,
890 VkFlags flags) {
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -0600891 VkShaderModuleCreateInfo info = {};
892 info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
893 info.codeSize = code_size;
894 info.pCode = code;
895 info.flags = flags;
896 return info;
897}
898
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700899inline VkWriteDescriptorSet
900Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
901 uint32_t array_element, VkDescriptorType type,
902 uint32_t count,
903 const VkDescriptorImageInfo *image_info) {
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800904 VkWriteDescriptorSet write = {};
905 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu1f851912015-10-27 18:04:07 +0800906 write.dstSet = set.handle();
907 write.dstBinding = binding;
908 write.dstArrayElement = array_element;
Chia-I Wu763a7492015-10-26 20:48:51 +0800909 write.descriptorCount = count;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800910 write.descriptorType = type;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600911 write.pImageInfo = image_info;
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800912 return write;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600913}
914
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700915inline VkWriteDescriptorSet
916Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
917 uint32_t array_element, VkDescriptorType type,
918 uint32_t count,
919 const VkDescriptorBufferInfo *buffer_info) {
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600920 VkWriteDescriptorSet write = {};
921 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu1f851912015-10-27 18:04:07 +0800922 write.dstSet = set.handle();
923 write.dstBinding = binding;
924 write.dstArrayElement = array_element;
Chia-I Wu763a7492015-10-26 20:48:51 +0800925 write.descriptorCount = count;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600926 write.descriptorType = type;
927 write.pBufferInfo = buffer_info;
928 return write;
929}
930
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700931inline VkWriteDescriptorSet
932Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
933 uint32_t array_element, VkDescriptorType type,
934 uint32_t count, const VkBufferView *buffer_views) {
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600935 VkWriteDescriptorSet write = {};
936 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu1f851912015-10-27 18:04:07 +0800937 write.dstSet = set.handle();
938 write.dstBinding = binding;
939 write.dstArrayElement = array_element;
Chia-I Wu763a7492015-10-26 20:48:51 +0800940 write.descriptorCount = count;
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600941 write.descriptorType = type;
942 write.pTexelBufferView = buffer_views;
943 return write;
944}
945
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700946inline VkWriteDescriptorSet Device::write_descriptor_set(
947 const DescriptorSet &set, uint32_t binding, uint32_t array_element,
948 VkDescriptorType type,
949 const std::vector<VkDescriptorImageInfo> &image_info) {
950 return write_descriptor_set(set, binding, array_element, type,
951 image_info.size(), &image_info[0]);
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600952}
953
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700954inline VkWriteDescriptorSet Device::write_descriptor_set(
955 const DescriptorSet &set, uint32_t binding, uint32_t array_element,
956 VkDescriptorType type,
957 const std::vector<VkDescriptorBufferInfo> &buffer_info) {
958 return write_descriptor_set(set, binding, array_element, type,
959 buffer_info.size(), &buffer_info[0]);
Courtney Goeltzenleuchter34aa5c82015-10-23 13:38:14 -0600960}
961
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700962inline VkWriteDescriptorSet
963Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
964 uint32_t array_element, VkDescriptorType type,
965 const std::vector<VkBufferView> &buffer_views) {
966 return write_descriptor_set(set, binding, array_element, type,
967 buffer_views.size(), &buffer_views[0]);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600968}
969
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700970inline VkCopyDescriptorSet
971Device::copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding,
972 uint32_t src_array_element,
973 const DescriptorSet &dst_set, uint32_t dst_binding,
974 uint32_t dst_array_element, uint32_t count) {
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800975 VkCopyDescriptorSet copy = {};
976 copy.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
Chia-I Wu55a871f2015-07-03 11:49:42 +0800977 copy.srcSet = src_set.handle();
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800978 copy.srcBinding = src_binding;
979 copy.srcArrayElement = src_array_element;
Chia-I Wu1f851912015-10-27 18:04:07 +0800980 copy.dstSet = dst_set.handle();
981 copy.dstBinding = dst_binding;
982 copy.dstArrayElement = dst_array_element;
Chia-I Wu763a7492015-10-26 20:48:51 +0800983 copy.descriptorCount = count;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600984
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +0800985 return copy;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600986}
987
Karl Schultz99e9d1d2016-02-02 17:17:23 -0700988inline VkCommandBufferAllocateInfo
989CommandBuffer::create_info(VkCommandPool const &pool) {
Chia-I Wu1f851912015-10-27 18:04:07 +0800990 VkCommandBufferAllocateInfo info = {};
Chia-I Wuc1f5e402015-11-10 16:21:09 +0800991 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Chia-I Wu1f851912015-10-27 18:04:07 +0800992 info.commandPool = pool;
Jon Ashburna4ae48b2016-01-11 13:12:43 -0700993 info.commandBufferCount = 1;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600994 return info;
995}
996
997}; // namespace vk_testing
998
999#endif // VKTESTBINDING_H