blob: 0bb4293dce98af9d18c17fc1a64acc8f61d9430b [file] [log] [blame]
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001// VK tests
2//
3// Copyright (C) 2014 LunarG, Inc.
4//
5// Permission is hereby granted, free of charge, to any person obtaining a
6// copy of this software and associated documentation files (the "Software"),
7// to deal in the Software without restriction, including without limitation
8// the rights to use, copy, modify, merge, publish, distribute, sublicense,
9// and/or sell copies of the Software, and to permit persons to whom the
10// Software is furnished to do so, subject to the following conditions:
11//
12// The above copyright notice and this permission notice shall be included
13// in all copies or substantial portions of the Software.
14//
15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE.
22
23#ifndef VKTESTBINDING_H
24#define VKTESTBINDING_H
25
26#include <vector>
Chia-I Wub0ed7d42015-07-03 10:13:26 +080027#include <assert.h>
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028
29#include "vulkan.h"
30
31namespace vk_testing {
32
33typedef void (*ErrorCallback)(const char *expr, const char *file, unsigned int line, const char *function);
34void set_error_callback(ErrorCallback callback);
35
Chia-I Wu999f0482015-07-03 10:32:05 +080036class PhysicalDevice;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060037class Device;
38class Queue;
Chia-I Wuf8f074f2015-07-03 10:58:57 +080039class DeviceMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060040class Fence;
41class Semaphore;
42class Event;
43class QueryPool;
44class Buffer;
45class BufferView;
46class Image;
47class ImageView;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060048class DepthStencilView;
49class Shader;
50class Pipeline;
51class PipelineDelta;
52class Sampler;
53class DescriptorSetLayout;
Mark Lobodzinski0fadf5f2015-04-17 14:11:39 -050054class PipelineLayout;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060055class DescriptorSetPool;
56class DescriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080057class CommandBuffer;
58class CommandPool;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060059
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -060060std::vector<VkLayerProperties> GetGlobalLayers();
61std::vector<VkExtensionProperties> GetGlobalExtensions();
62std::vector<VkExtensionProperties> GetGlobalExtensions(const char *pLayerName);
63
Chia-I Wub0ed7d42015-07-03 10:13:26 +080064namespace internal {
65
66template<typename T>
67class Handle {
68public:
69 const T &handle() const { return handle_; }
70 bool initialized() const { return (handle_ != VK_NULL_HANDLE); }
71
72protected:
73 typedef T handle_type;
74
75 explicit Handle() : handle_(VK_NULL_HANDLE) {}
76 explicit Handle(T handle) : handle_(handle) {}
77
78 void init(T handle)
79 {
80 assert(!initialized());
81 handle_ = handle;
82 }
83
84private:
85 // handles are non-copyable
86 Handle(const Handle &);
87 Handle &operator=(const Handle &);
88
89 T handle_;
90};
91
92
93template<typename T>
94class NonDispHandle : public Handle<T> {
95protected:
96 explicit NonDispHandle() : Handle<T>(), dev_handle_(VK_NULL_HANDLE) {}
97 explicit NonDispHandle(VkDevice dev, T handle) : Handle<T>(handle), dev_handle_(dev) {}
98
99 const VkDevice &device() const { return dev_handle_; }
100
101 void init(VkDevice dev, T handle)
102 {
103 assert(!Handle<T>::initialized() && dev_handle_ == VK_NULL_HANDLE);
104 Handle<T>::init(handle);
105 dev_handle_ = dev;
106 }
107
108private:
109 VkDevice dev_handle_;
110};
111
112} // namespace internal
113
Chia-I Wu999f0482015-07-03 10:32:05 +0800114class PhysicalDevice : public internal::Handle<VkPhysicalDevice> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600115public:
Chia-I Wu999f0482015-07-03 10:32:05 +0800116 explicit PhysicalDevice(VkPhysicalDevice phy) : Handle(phy)
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600117 {
118 memory_properties_ = memory_properties();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600119 device_properties_ = properties();
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600120 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600121
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600122
Tony Barbourd1c35722015-04-16 15:59:00 -0600123 VkPhysicalDeviceProperties properties() const;
Tony Barbourd1c35722015-04-16 15:59:00 -0600124 VkPhysicalDeviceMemoryProperties memory_properties() const;
Cody Northropd0802882015-08-03 17:04:53 -0600125 std::vector<VkQueueFamilyProperties> queue_properties() const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600126
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800127 bool set_memory_type(const uint32_t type_bits, VkMemoryAllocateInfo *info, const VkMemoryPropertyFlags properties,
Mike Stroyan713b2d72015-08-04 10:49:29 -0600128 const VkMemoryPropertyFlags forbid = 0) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600129
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -0600130 // vkEnumerateDeviceExtensionProperties()
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600131 std::vector<VkExtensionProperties> extensions() const;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600132 std::vector<VkExtensionProperties> extensions(const char * pLayerName) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600133
134 // vkEnumerateLayers()
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600135 std::vector<VkLayerProperties> layers() const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600136
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600137private:
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600138 void add_extension_dependencies(uint32_t dependency_count,
139 VkExtensionProperties *depencency_props,
140 std::vector<VkExtensionProperties> &ext_list);
Chia-I Wu999f0482015-07-03 10:32:05 +0800141
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600142 VkPhysicalDeviceMemoryProperties memory_properties_;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600143
144 VkPhysicalDeviceProperties device_properties_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600145};
146
Chia-I Wuf368b602015-07-03 10:41:20 +0800147class Device : public internal::Handle<VkDevice> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600148public:
Chia-I Wu999f0482015-07-03 10:32:05 +0800149 explicit Device(VkPhysicalDevice phy) : phy_(phy) {}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600150 ~Device();
151
152 // vkCreateDevice()
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600153 void init(const VkDeviceCreateInfo &info);
Courtney Goeltzenleuchter5bac6092015-07-07 11:47:33 -0600154 void init(std::vector<const char*> &layers, std::vector<const char *> &extensions); // all queues, all extensions, etc
155 void init() { std::vector<const char *> layers; std::vector<const char *> extensions; init(layers, extensions); };
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600156
Chia-I Wu999f0482015-07-03 10:32:05 +0800157 const PhysicalDevice &phy() const { return phy_; }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600158
Jon Ashburn8d1b0b52015-05-18 13:20:15 -0600159 // vkGetDeviceProcAddr()
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -0600160 PFN_vkVoidFunction get_proc(const char *name) const { return vkGetDeviceProcAddr(handle(), name); }
Jon Ashburn8d1b0b52015-05-18 13:20:15 -0600161
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600162 // vkGetDeviceQueue()
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500163 const std::vector<Queue *> &graphics_queues() const { return queues_[GRAPHICS]; }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600164 const std::vector<Queue *> &compute_queues() { return queues_[COMPUTE]; }
165 const std::vector<Queue *> &dma_queues() { return queues_[DMA]; }
166 uint32_t graphics_queue_node_index_;
167
168 struct Format {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600169 VkFormat format;
170 VkImageTiling tiling;
171 VkFlags features;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600172 };
173 // vkGetFormatInfo()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600174 VkFormatProperties format_properties(VkFormat format);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600175 const std::vector<Format> &formats() const { return formats_; }
176
177 // vkDeviceWaitIdle()
178 void wait();
179
180 // vkWaitForFences()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600181 VkResult wait(const std::vector<const Fence *> &fences, bool wait_all, uint64_t timeout);
182 VkResult wait(const Fence &fence) { return wait(std::vector<const Fence *>(1, &fence), true, (uint64_t) -1); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600183
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800184 // vkUpdateDescriptorSets()
Mark Lobodzinski2141f652015-09-07 13:59:43 -0600185 void update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes, const std::vector<VkCopyDescriptorSet> &copies);
186 void update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes) { return update_descriptor_sets(writes, std::vector<VkCopyDescriptorSet>()); }
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800187
188 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600189 VkDescriptorType type, uint32_t count, const VkDescriptorImageInfo *image_info);
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800190 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600191 VkDescriptorType type, uint32_t count, const VkDescriptorBufferInfo *buffer_info);
192 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
193 VkDescriptorType type, uint32_t count, const VkBufferView *buffer_views);
194 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
195 VkDescriptorType type, const std::vector<VkDescriptorImageInfo> &image_info);
196 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
197 VkDescriptorType type, const std::vector<VkDescriptorBufferInfo> &buffer_info);
198 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
199 VkDescriptorType type, const std::vector<VkBufferView> &buffer_views);
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800200
201 static VkCopyDescriptorSet copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding, uint32_t src_array_element,
202 const DescriptorSet &dst_set, uint32_t dst_binding, uint32_t dst_array_element,
203 uint32_t count);
204
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600205private:
206 enum QueueIndex {
207 GRAPHICS,
208 COMPUTE,
209 DMA,
210 QUEUE_COUNT,
211 };
212
213 void init_queues();
214 void init_formats();
215
Chia-I Wu999f0482015-07-03 10:32:05 +0800216 PhysicalDevice phy_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600217
218 std::vector<Queue *> queues_[QUEUE_COUNT];
219 std::vector<Format> formats_;
220};
221
Chia-I Wudf12ffd2015-07-03 10:53:18 +0800222class Queue : public internal::Handle<VkQueue> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600223public:
Tony Barbourfb21ea32015-07-23 10:35:30 -0600224 explicit Queue(VkQueue queue, int index) : Handle(queue) {family_index_ = index;}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600225
226 // vkQueueSubmit()
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800227 void submit(const std::vector<const CommandBuffer *> &cmds, Fence &fence);
228 void submit(const CommandBuffer &cmd, Fence &fence);
229 void submit(const CommandBuffer &cmd);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600230
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600231 // vkQueueWaitIdle()
232 void wait();
233
Tony Barbourfb21ea32015-07-23 10:35:30 -0600234 int get_family_index() {return family_index_;}
235
236private:
237 int family_index_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600238};
239
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800240class DeviceMemory : public internal::NonDispHandle<VkDeviceMemory> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600241public:
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800242 ~DeviceMemory();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600243
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800244 // vkAllocateMemory()
245 void init(const Device &dev, const VkMemoryAllocateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600246
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600247 // vkMapMemory()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600248 const void *map(VkFlags flags) const;
249 void *map(VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600250 const void *map() const { return map(0); }
251 void *map() { return map(0); }
252
253 // vkUnmapMemory()
254 void unmap() const;
255
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800256 static VkMemoryAllocateInfo alloc_info(VkDeviceSize size, uint32_t memory_type_index);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600257};
258
Chia-I Wud9e8e822015-07-03 11:45:55 +0800259class Fence : public internal::NonDispHandle<VkFence> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600260public:
Chia-I Wud9e8e822015-07-03 11:45:55 +0800261 ~Fence();
262
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600263 // vkCreateFence()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600264 void init(const Device &dev, const VkFenceCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600265
266 // vkGetFenceStatus()
Chia-I Wud9e8e822015-07-03 11:45:55 +0800267 VkResult status() const { return vkGetFenceStatus(device(), handle()); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600268
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600269 static VkFenceCreateInfo create_info(VkFenceCreateFlags flags);
270 static VkFenceCreateInfo create_info();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600271};
272
Chia-I Wu6b1c2482015-07-03 11:49:42 +0800273class Semaphore : public internal::NonDispHandle<VkSemaphore> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600274public:
Chia-I Wu6b1c2482015-07-03 11:49:42 +0800275 ~Semaphore();
276
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600277 // vkCreateSemaphore()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600278 void init(const Device &dev, const VkSemaphoreCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600279
Tony Barbouraf892a12015-06-26 12:56:09 -0600280 static VkSemaphoreCreateInfo create_info(VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600281};
282
Chia-I Wuc5c97992015-07-03 11:49:42 +0800283class Event : public internal::NonDispHandle<VkEvent> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600284public:
Chia-I Wuc5c97992015-07-03 11:49:42 +0800285 ~Event();
286
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600287 // vkCreateEvent()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600288 void init(const Device &dev, const VkEventCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600289
290 // vkGetEventStatus()
291 // vkSetEvent()
292 // vkResetEvent()
Chia-I Wuc5c97992015-07-03 11:49:42 +0800293 VkResult status() const { return vkGetEventStatus(device(), handle()); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600294 void set();
295 void reset();
296
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600297 static VkEventCreateInfo create_info(VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600298};
299
Chia-I Wu1b7d4762015-07-03 11:49:42 +0800300class QueryPool : public internal::NonDispHandle<VkQueryPool> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600301public:
Chia-I Wu1b7d4762015-07-03 11:49:42 +0800302 ~QueryPool();
303
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600304 // vkCreateQueryPool()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600305 void init(const Device &dev, const VkQueryPoolCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600306
307 // vkGetQueryPoolResults()
Chia-I Wuccc93a72015-10-26 18:36:20 +0800308 VkResult results(uint32_t start, uint32_t count, size_t size, void *data, size_t stride);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600309
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600310 static VkQueryPoolCreateInfo create_info(VkQueryType type, uint32_t slot_count);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600311};
312
Chia-I Wu681d7a02015-07-03 13:44:34 +0800313class Buffer : public internal::NonDispHandle<VkBuffer> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600314public:
Chia-I Wu681d7a02015-07-03 13:44:34 +0800315 explicit Buffer() : NonDispHandle() {}
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600316 explicit Buffer(const Device &dev, const VkBufferCreateInfo &info) { init(dev, info); }
Tony Barbourd1c35722015-04-16 15:59:00 -0600317 explicit Buffer(const Device &dev, VkDeviceSize size) { init(dev, size); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600318
Chia-I Wu681d7a02015-07-03 13:44:34 +0800319 ~Buffer();
320
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600321 // vkCreateBuffer()
Chia-I Wu681d7a02015-07-03 13:44:34 +0800322 void init(const Device &dev, const VkBufferCreateInfo &info, VkMemoryPropertyFlags mem_props);
323 void init(const Device &dev, const VkBufferCreateInfo &info) { init(dev, info, 0); }
324 void init(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags mem_props) { init(dev, create_info(size, 0), mem_props); }
325 void init(const Device &dev, VkDeviceSize size) { init(dev, size, 0); }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800326 void init_as_src(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs) { init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT), reqs); }
327 void init_as_dst(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs) { init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_DST_BIT), reqs); }
328 void init_as_src_and_dst(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs) { init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT), reqs); }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600329 void init_no_mem(const Device &dev, const VkBufferCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600330
Chia-I Wu681d7a02015-07-03 13:44:34 +0800331 // get the internal memory
332 const DeviceMemory &memory() const { return internal_mem_; }
333 DeviceMemory &memory() { return internal_mem_; }
334
335 // vkGetObjectMemoryRequirements()
336 VkMemoryRequirements memory_requirements() const;
337
338 // vkBindObjectMemory()
339 void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
Mark Lobodzinski942b1722015-05-11 17:21:15 -0500340
Tony Barbourd1c35722015-04-16 15:59:00 -0600341 static VkBufferCreateInfo create_info(VkDeviceSize size, VkFlags usage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600342
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600343 VkBufferMemoryBarrier buffer_memory_barrier(VkFlags output_mask, VkFlags input_mask,
Tony Barbourd1c35722015-04-16 15:59:00 -0600344 VkDeviceSize offset, VkDeviceSize size) const
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600345 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600346 VkBufferMemoryBarrier barrier = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600347 barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800348 barrier.buffer = handle();
Chia-I Wua4594202015-10-27 19:54:37 +0800349 barrier.srcAccessMask = output_mask;
350 barrier.dstAccessMask = input_mask;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600351 barrier.offset = offset;
352 barrier.size = size;
353 return barrier;
354 }
Chia-I Wu681d7a02015-07-03 13:44:34 +0800355
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600356private:
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600357 VkBufferCreateInfo create_info_;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800358
359 DeviceMemory internal_mem_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600360};
361
Chia-I Wu3158bf32015-07-03 11:49:42 +0800362class BufferView : public internal::NonDispHandle<VkBufferView> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600363public:
Chia-I Wu3158bf32015-07-03 11:49:42 +0800364 ~BufferView();
365
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600366 // vkCreateBufferView()
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600367 void init(const Device &dev, const VkBufferViewCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600368};
369
Chia-I Wu681d7a02015-07-03 13:44:34 +0800370class Image : public internal::NonDispHandle<VkImage> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600371public:
Chia-I Wu681d7a02015-07-03 13:44:34 +0800372 explicit Image() : NonDispHandle(), format_features_(0) {}
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600373 explicit Image(const Device &dev, const VkImageCreateInfo &info) : format_features_(0) { init(dev, info); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600374
Chia-I Wu681d7a02015-07-03 13:44:34 +0800375 ~Image();
376
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600377 // vkCreateImage()
Chia-I Wu681d7a02015-07-03 13:44:34 +0800378 void init(const Device &dev, const VkImageCreateInfo &info, VkMemoryPropertyFlags mem_props);
379 void init(const Device &dev, const VkImageCreateInfo &info) { init(dev, info, 0); }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600380 void init_no_mem(const Device &dev, const VkImageCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600381
Chia-I Wu681d7a02015-07-03 13:44:34 +0800382 // get the internal memory
383 const DeviceMemory &memory() const { return internal_mem_; }
384 DeviceMemory &memory() { return internal_mem_; }
385
386 // vkGetObjectMemoryRequirements()
387 VkMemoryRequirements memory_requirements() const;
388
389 // vkBindObjectMemory()
390 void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600391
Tony Barbour59a47322015-06-24 16:06:58 -0600392 // vkGetImageSubresourceLayout()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600393 VkSubresourceLayout subresource_layout(const VkImageSubresource &subres) const;
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800394 VkSubresourceLayout subresource_layout(const VkImageSubresourceLayers &subres) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600395
396 bool transparent() const;
Tony Barbourd1c35722015-04-16 15:59:00 -0600397 bool copyable() const { return (format_features_ & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600398
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600399 VkImageSubresourceRange subresource_range(VkImageAspectFlagBits aspect) const { return subresource_range(create_info_, aspect); }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600400 VkExtent3D extent() const { return create_info_.extent; }
401 VkExtent3D extent(uint32_t mip_level) const { return extent(create_info_.extent, mip_level); }
402 VkFormat format() const {return create_info_.format;}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600403
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600404 VkImageMemoryBarrier image_memory_barrier(VkFlags output_mask, VkFlags input_mask,
405 VkImageLayout old_layout,
406 VkImageLayout new_layout,
407 const VkImageSubresourceRange &range) const
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600408 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600409 VkImageMemoryBarrier barrier = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600410 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
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.oldLayout = old_layout;
414 barrier.newLayout = new_layout;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800415 barrier.image = handle();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600416 barrier.subresourceRange = range;
417 return barrier;
418 }
419
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600420 static VkImageCreateInfo create_info();
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600421 static VkImageAspectFlagBits image_aspect(VkImageAspectFlags flags);
422 static VkImageSubresource subresource(VkImageAspectFlagBits aspect, uint32_t mip_level, uint32_t array_layer);
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600423 static VkImageSubresource subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer);
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800424 static VkImageSubresourceLayers subresource(VkImageAspectFlagBits aspect, uint32_t mip_level, uint32_t array_layer, uint32_t array_size);
425 static VkImageSubresourceLayers subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer, uint32_t array_size);
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600426 static VkImageSubresourceRange subresource_range(VkImageAspectFlags aspect_mask, uint32_t base_mip_level, uint32_t mip_levels,
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -0600427 uint32_t base_array_layer, uint32_t num_layers);
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600428 static VkImageSubresourceRange subresource_range(const VkImageCreateInfo &info, VkImageAspectFlags aspect_mask);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600429 static VkImageSubresourceRange subresource_range(const VkImageSubresource &subres);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600430
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600431 static VkExtent2D extent(int32_t width, int32_t height);
432 static VkExtent2D extent(const VkExtent2D &extent, uint32_t mip_level);
433 static VkExtent2D extent(const VkExtent3D &extent);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600434
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600435 static VkExtent3D extent(int32_t width, int32_t height, int32_t depth);
436 static VkExtent3D extent(const VkExtent3D &extent, uint32_t mip_level);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600437
438private:
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600439 void init_info(const Device &dev, const VkImageCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600440
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600441 VkImageCreateInfo create_info_;
442 VkFlags format_features_;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800443
444 DeviceMemory internal_mem_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600445};
446
Chia-I Wu3158bf32015-07-03 11:49:42 +0800447class ImageView : public internal::NonDispHandle<VkImageView> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600448public:
Chia-I Wu3158bf32015-07-03 11:49:42 +0800449 ~ImageView();
450
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600451 // vkCreateImageView()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600452 void init(const Device &dev, const VkImageViewCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600453};
454
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800455class ShaderModule : public internal::NonDispHandle<VkShaderModule> {
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600456public:
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800457 ~ShaderModule();
458
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600459 // vkCreateShaderModule()
460 void init(const Device &dev, const VkShaderModuleCreateInfo &info);
461 VkResult init_try(const Device &dev, const VkShaderModuleCreateInfo &info);
462
Chia-I Wu8094f192015-10-26 19:22:06 +0800463 static VkShaderModuleCreateInfo create_info(size_t code_size, const uint32_t *code, VkFlags flags);
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600464};
465
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800466class Shader : public internal::NonDispHandle<VkShader> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600467public:
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800468 ~Shader();
469
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600470 // vkCreateShader()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600471 void init(const Device &dev, const VkShaderCreateInfo &info);
472 VkResult init_try(const Device &dev, const VkShaderCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600473
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -0600474 static VkShaderCreateInfo create_info(VkShaderModule module, const char *pName, VkFlags flags, VkShaderStageFlagBits stage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600475};
476
Chia-I Wu2ff72fd2015-07-03 11:49:42 +0800477class Pipeline : public internal::NonDispHandle<VkPipeline> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600478public:
Chia-I Wu2ff72fd2015-07-03 11:49:42 +0800479 ~Pipeline();
480
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600481 // vkCreateGraphicsPipeline()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600482 void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600483 // vkCreateGraphicsPipelineDerivative()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600484 void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info, const VkPipeline basePipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600485 // vkCreateComputePipeline()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600486 void init(const Device &dev, const VkComputePipelineCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600487 // vkLoadPipeline()
488 void init(const Device&dev, size_t size, const void *data);
489 // vkLoadPipelineDerivative()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600490 void init(const Device&dev, size_t size, const void *data, VkPipeline basePipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600491
Chris Forbes95292b12015-05-25 11:13:26 +1200492 // vkCreateGraphicsPipeline with error return
493 VkResult init_try(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
494
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600495 // vkStorePipeline()
496 size_t store(size_t size, void *data);
497};
498
Chia-I Wufd46e7d2015-07-03 11:49:42 +0800499class PipelineLayout : public internal::NonDispHandle<VkPipelineLayout> {
500public:
501 ~PipelineLayout();
502
503 // vCreatePipelineLayout()
504 void init(const Device &dev, VkPipelineLayoutCreateInfo &info, const std::vector<const DescriptorSetLayout *> &layouts);
505};
506
Chia-I Wu8c721c62015-07-03 11:49:42 +0800507class Sampler : public internal::NonDispHandle<VkSampler> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600508public:
Chia-I Wu8c721c62015-07-03 11:49:42 +0800509 ~Sampler();
510
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600511 // vkCreateSampler()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600512 void init(const Device &dev, const VkSamplerCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600513};
514
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800515class DescriptorSetLayout : public internal::NonDispHandle<VkDescriptorSetLayout> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600516public:
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800517 ~DescriptorSetLayout();
518
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600519 // vkCreateDescriptorSetLayout()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600520 void init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600521};
522
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800523class DescriptorPool : public internal::NonDispHandle<VkDescriptorPool> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600524public:
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800525 ~DescriptorPool();
526
Cody Northropcdc72a42015-10-08 11:39:25 -0600527 // Descriptor sets allocated from this pool will need access to the original object
528 VkDescriptorPool GetObj() { return pool_; }
529
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600530 // vkCreateDescriptorPool()
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -0600531 void init(const Device &dev, const VkDescriptorPoolCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600532
533 // vkResetDescriptorPool()
534 void reset();
535
Cody Northropcdc72a42015-10-08 11:39:25 -0600536 // vkFreeDescriptorSet()
537 void setDynamicUsage(bool isDynamic) { dynamic_usage_ = isDynamic; }
538 bool getDynamicUsage() { return dynamic_usage_; }
539
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800540 // vkAllocateDescriptorSets()
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -0600541 std::vector<DescriptorSet *> alloc_sets(const Device &dev, const std::vector<const DescriptorSetLayout *> &layouts);
542 std::vector<DescriptorSet *> alloc_sets(const Device &dev, const DescriptorSetLayout &layout, uint32_t count);
543 DescriptorSet *alloc_sets(const Device &dev, const DescriptorSetLayout &layout);
Cody Northropcdc72a42015-10-08 11:39:25 -0600544
545private:
546 VkDescriptorPool pool_;
547
548 // Track whether this pool's usage is VK_DESCRIPTOR_POOL_USAGE_DYNAMIC
549 bool dynamic_usage_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600550};
551
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800552class DescriptorSet : public internal::NonDispHandle<VkDescriptorSet> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600553public:
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800554 ~DescriptorSet();
555
556 explicit DescriptorSet() : NonDispHandle() {}
Cody Northropcdc72a42015-10-08 11:39:25 -0600557 explicit DescriptorSet(const Device &dev, DescriptorPool* pool, VkDescriptorSet set) : NonDispHandle(dev.handle(), set) { containing_pool_ = pool;}
Tony Barbour67e99152015-07-10 14:10:27 -0600558
559private:
Cody Northropcdc72a42015-10-08 11:39:25 -0600560 DescriptorPool* containing_pool_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600561};
562
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800563class CommandPool : public internal::NonDispHandle<VkCommandPool> {
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600564public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800565 ~CommandPool();
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600566
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800567 explicit CommandPool() : NonDispHandle() {}
568 explicit CommandPool(const Device &dev, const VkCommandPoolCreateInfo &info) { init(dev, info); }
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600569
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800570 void init(const Device &dev, const VkCommandPoolCreateInfo &info);
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600571
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800572 static VkCommandPoolCreateInfo create_info(uint32_t queue_family_index);
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600573};
574
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800575inline VkCommandPoolCreateInfo CommandPool::create_info(uint32_t queue_family_index)
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600576{
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800577 VkCommandPoolCreateInfo info = {};
578 info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600579 info.queueFamilyIndex = queue_family_index;
580 return info;
581}
582
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800583class CommandBuffer : public internal::Handle<VkCommandBuffer> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600584public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800585 ~CommandBuffer();
Chia-I Wube2b9172015-07-03 11:49:42 +0800586
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800587 explicit CommandBuffer() : Handle() {}
588 explicit CommandBuffer(const Device &dev, const VkCommandBufferAllocateInfo &info) { init(dev, info); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600589
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800590 // vkAllocateCommandBuffers()
591 void init(const Device &dev, const VkCommandBufferAllocateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600592
593 // vkBeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800594 void begin(const VkCommandBufferBeginInfo *info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600595 void begin();
596
597 // vkEndCommandBuffer()
598 // vkResetCommandBuffer()
599 void end();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800600 void reset(VkCommandBufferResetFlags flags);
601 void reset() { reset(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600602
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800603 static VkCommandBufferAllocateInfo create_info(VkCommandPool const &pool);
Chia-I Wube2b9172015-07-03 11:49:42 +0800604
605private:
606 VkDevice dev_handle_;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800607 VkCommandPool cmd_pool_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600608};
609
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800610inline VkMemoryAllocateInfo DeviceMemory::alloc_info(VkDeviceSize size, uint32_t memory_type_index)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600611{
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800612 VkMemoryAllocateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600613 info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800614 info.allocationSize = size;
615 info.memoryTypeIndex = memory_type_index;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600616 return info;
617}
618
Tony Barbourd1c35722015-04-16 15:59:00 -0600619inline VkBufferCreateInfo Buffer::create_info(VkDeviceSize size, VkFlags usage)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600620{
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600621 VkBufferCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600622 info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
623 info.size = size;
624 info.usage = usage;
625 return info;
626}
627
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600628inline VkFenceCreateInfo Fence::create_info(VkFenceCreateFlags flags)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600629{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600630 VkFenceCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600631 info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
632 info.flags = flags;
633 return info;
634}
635
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600636inline VkFenceCreateInfo Fence::create_info()
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600637{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600638 VkFenceCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600639 info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
640 return info;
641}
642
Tony Barbouraf892a12015-06-26 12:56:09 -0600643inline VkSemaphoreCreateInfo Semaphore::create_info(VkFlags flags)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600644{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600645 VkSemaphoreCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600646 info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600647 info.flags = flags;
648 return info;
649}
650
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600651inline VkEventCreateInfo Event::create_info(VkFlags flags)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600652{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600653 VkEventCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600654 info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
655 info.flags = flags;
656 return info;
657}
658
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600659inline VkQueryPoolCreateInfo QueryPool::create_info(VkQueryType type, uint32_t slot_count)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600660{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600661 VkQueryPoolCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600662 info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
663 info.queryType = type;
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800664 info.entryCount = slot_count;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600665 return info;
666}
667
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600668inline VkImageCreateInfo Image::create_info()
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600669{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600670 VkImageCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600671 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
672 info.extent.width = 1;
673 info.extent.height = 1;
674 info.extent.depth = 1;
675 info.mipLevels = 1;
Courtney Goeltzenleuchter5d2aed42015-10-21 17:57:31 -0600676 info.arrayLayers = 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600677 info.samples = 1;
678 return info;
679}
680
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600681inline VkImageSubresource Image::subresource(VkImageAspectFlagBits aspect, uint32_t mip_level, uint32_t array_layer)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600682{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600683 VkImageSubresource subres = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600684 subres.aspect = aspect;
685 subres.mipLevel = mip_level;
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600686 subres.arrayLayer = array_layer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600687 return subres;
688}
689
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600690inline VkImageSubresource Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600691{
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600692 return subresource(image_aspect(range.aspectMask), range.baseMipLevel + mip_level, range.baseArrayLayer + array_layer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600693}
694
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800695inline VkImageSubresourceLayers Image::subresource(VkImageAspectFlagBits aspect, uint32_t mip_level, uint32_t array_layer, uint32_t array_size)
Courtney Goeltzenleuchter01ee1ca2015-09-10 16:41:13 -0600696{
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800697 VkImageSubresourceLayers subres = {};
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800698 subres.aspectMask = aspect;
Courtney Goeltzenleuchter01ee1ca2015-09-10 16:41:13 -0600699 subres.mipLevel = mip_level;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -0600700 subres.baseArrayLayer = array_layer;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800701 subres.layerCount = array_size;
Courtney Goeltzenleuchter01ee1ca2015-09-10 16:41:13 -0600702 return subres;
703}
704
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600705inline VkImageAspectFlagBits Image::image_aspect(VkImageAspectFlags flags)
Courtney Goeltzenleuchter01ee1ca2015-09-10 16:41:13 -0600706{
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600707 /*
708 * This will map VkImageAspectFlags into a single VkImageAspect.
709 * If there is more than one bit defined we'll get an assertion.
710 */
711 switch (flags) {
712 case VK_IMAGE_ASPECT_COLOR_BIT:
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600713 return VK_IMAGE_ASPECT_COLOR_BIT;
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600714 case VK_IMAGE_ASPECT_DEPTH_BIT:
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600715 return VK_IMAGE_ASPECT_DEPTH_BIT;
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600716 case VK_IMAGE_ASPECT_STENCIL_BIT:
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600717 return VK_IMAGE_ASPECT_STENCIL_BIT;
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600718 case VK_IMAGE_ASPECT_METADATA_BIT:
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600719 return VK_IMAGE_ASPECT_METADATA_BIT;
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600720 default:
721 assert(!"Invalid VkImageAspect");
722 }
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600723 return VK_IMAGE_ASPECT_COLOR_BIT;
Courtney Goeltzenleuchter01ee1ca2015-09-10 16:41:13 -0600724}
725
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800726inline VkImageSubresourceLayers Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer, uint32_t array_size)
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600727{
728 return subresource(image_aspect(range.aspectMask), range.baseMipLevel + mip_level, range.baseArrayLayer + array_layer, array_size);
729}
730
731inline VkImageSubresourceRange Image::subresource_range(VkImageAspectFlags aspect_mask, uint32_t base_mip_level, uint32_t mip_levels,
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -0600732 uint32_t base_array_layer, uint32_t num_layers)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600733{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600734 VkImageSubresourceRange range = {};
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600735 range.aspectMask = aspect_mask;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600736 range.baseMipLevel = base_mip_level;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800737 range.levelCount = mip_levels;
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600738 range.baseArrayLayer = base_array_layer;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800739 range.layerCount = num_layers;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600740 return range;
741}
742
Courtney Goeltzenleuchterba724512015-09-10 17:58:54 -0600743inline VkImageSubresourceRange Image::subresource_range(const VkImageCreateInfo &info, VkImageAspectFlags aspect_mask)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600744{
Courtney Goeltzenleuchter5d2aed42015-10-21 17:57:31 -0600745 return subresource_range(aspect_mask, 0, info.mipLevels, 0, info.arrayLayers);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600746}
747
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600748inline VkImageSubresourceRange Image::subresource_range(const VkImageSubresource &subres)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600749{
Courtney Goeltzenleuchter4a261892015-09-10 16:38:41 -0600750 return subresource_range(subres.aspect, subres.mipLevel, 1, subres.arrayLayer, 1);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600751}
752
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600753inline VkExtent2D Image::extent(int32_t width, int32_t height)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600754{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600755 VkExtent2D extent = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600756 extent.width = width;
757 extent.height = height;
758 return extent;
759}
760
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600761inline VkExtent2D Image::extent(const VkExtent2D &extent, uint32_t mip_level)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600762{
763 const int32_t width = (extent.width >> mip_level) ? extent.width >> mip_level : 1;
764 const int32_t height = (extent.height >> mip_level) ? extent.height >> mip_level : 1;
765 return Image::extent(width, height);
766}
767
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600768inline VkExtent2D Image::extent(const VkExtent3D &extent)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600769{
770 return Image::extent(extent.width, extent.height);
771}
772
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600773inline VkExtent3D Image::extent(int32_t width, int32_t height, int32_t depth)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600774{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600775 VkExtent3D extent = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600776 extent.width = width;
777 extent.height = height;
778 extent.depth = depth;
779 return extent;
780}
781
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600782inline VkExtent3D Image::extent(const VkExtent3D &extent, uint32_t mip_level)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600783{
784 const int32_t width = (extent.width >> mip_level) ? extent.width >> mip_level : 1;
785 const int32_t height = (extent.height >> mip_level) ? extent.height >> mip_level : 1;
786 const int32_t depth = (extent.depth >> mip_level) ? extent.depth >> mip_level : 1;
787 return Image::extent(width, height, depth);
788}
789
Chia-I Wu8094f192015-10-26 19:22:06 +0800790inline VkShaderModuleCreateInfo ShaderModule::create_info(size_t code_size, const uint32_t *code, VkFlags flags)
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600791{
792 VkShaderModuleCreateInfo info = {};
793 info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
794 info.codeSize = code_size;
795 info.pCode = code;
796 info.flags = flags;
797 return info;
798}
799
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -0600800inline VkShaderCreateInfo Shader::create_info(VkShaderModule module, const char *pName, VkFlags flags, VkShaderStageFlagBits stage)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600801{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600802 VkShaderCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600803 info.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO;
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600804 info.module = module;
805 info.pName = pName;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600806 info.flags = flags;
Cody Northropfd4bcfd2015-08-24 15:11:10 -0600807 info.stage = stage;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600808 return info;
809}
810
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800811inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600812 VkDescriptorType type, uint32_t count, const VkDescriptorImageInfo *image_info)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600813{
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800814 VkWriteDescriptorSet write = {};
815 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800816 write.dstSet = set.handle();
817 write.dstBinding = binding;
818 write.dstArrayElement = array_element;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800819 write.descriptorCount = count;
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800820 write.descriptorType = type;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600821 write.pImageInfo = image_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800822 return write;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600823}
824
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800825inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600826 VkDescriptorType type, uint32_t count, const VkDescriptorBufferInfo *buffer_info)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600827{
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600828 VkWriteDescriptorSet write = {};
829 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800830 write.dstSet = set.handle();
831 write.dstBinding = binding;
832 write.dstArrayElement = array_element;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800833 write.descriptorCount = count;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600834 write.descriptorType = type;
835 write.pBufferInfo = buffer_info;
836 return write;
837}
838
839inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
840 VkDescriptorType type, uint32_t count, const VkBufferView *buffer_views)
841{
842 VkWriteDescriptorSet write = {};
843 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800844 write.dstSet = set.handle();
845 write.dstBinding = binding;
846 write.dstArrayElement = array_element;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800847 write.descriptorCount = count;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600848 write.descriptorType = type;
849 write.pTexelBufferView = buffer_views;
850 return write;
851}
852
853inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
854 VkDescriptorType type, const std::vector<VkDescriptorImageInfo> &image_info)
855{
856 return write_descriptor_set(set, binding, array_element, type, image_info.size(), &image_info[0]);
857}
858
859inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
860 VkDescriptorType type, const std::vector<VkDescriptorBufferInfo> &buffer_info)
861{
862 return write_descriptor_set(set, binding, array_element, type, buffer_info.size(), &buffer_info[0]);
863}
864
865inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
866 VkDescriptorType type, const std::vector<VkBufferView> &buffer_views)
867{
868 return write_descriptor_set(set, binding, array_element, type, buffer_views.size(), &buffer_views[0]);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600869}
870
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800871inline VkCopyDescriptorSet Device::copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding, uint32_t src_array_element,
872 const DescriptorSet &dst_set, uint32_t dst_binding, uint32_t dst_array_element,
873 uint32_t count)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600874{
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800875 VkCopyDescriptorSet copy = {};
876 copy.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800877 copy.srcSet = src_set.handle();
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800878 copy.srcBinding = src_binding;
879 copy.srcArrayElement = src_array_element;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800880 copy.dstSet = dst_set.handle();
881 copy.dstBinding = dst_binding;
882 copy.dstArrayElement = dst_array_element;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800883 copy.descriptorCount = count;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600884
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800885 return copy;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600886}
887
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800888inline VkCommandBufferAllocateInfo CommandBuffer::create_info(VkCommandPool const &pool)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600889{
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800890 VkCommandBufferAllocateInfo info = {};
891 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOC_INFO;
892 info.commandPool = pool;
Chia-I Wud50a7d72015-10-26 20:48:51 +0800893 info.bufferCount = 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600894 return info;
895}
896
897}; // namespace vk_testing
898
899#endif // VKTESTBINDING_H