blob: 63be2a99e6334da4e0aa35298356021b172e2d04 [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;
48class ColorAttachmentView;
49class DepthStencilView;
50class Shader;
51class Pipeline;
52class PipelineDelta;
53class Sampler;
54class DescriptorSetLayout;
Mark Lobodzinski0fadf5f2015-04-17 14:11:39 -050055class PipelineLayout;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060056class DescriptorSetPool;
57class DescriptorSet;
Chia-I Wubc4a5542015-07-03 11:49:42 +080058class DynamicViewportState;
59class DynamicRasterState;
60class DynamicColorBlendState;
61class DynamicDepthStencilState;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060062class CmdBuffer;
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -060063class CmdPool;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060064
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -060065std::vector<VkLayerProperties> GetGlobalLayers();
66std::vector<VkExtensionProperties> GetGlobalExtensions();
67std::vector<VkExtensionProperties> GetGlobalExtensions(const char *pLayerName);
68
Chia-I Wub0ed7d42015-07-03 10:13:26 +080069namespace internal {
70
71template<typename T>
72class Handle {
73public:
74 const T &handle() const { return handle_; }
75 bool initialized() const { return (handle_ != VK_NULL_HANDLE); }
76
77protected:
78 typedef T handle_type;
79
80 explicit Handle() : handle_(VK_NULL_HANDLE) {}
81 explicit Handle(T handle) : handle_(handle) {}
82
83 void init(T handle)
84 {
85 assert(!initialized());
86 handle_ = handle;
87 }
88
89private:
90 // handles are non-copyable
91 Handle(const Handle &);
92 Handle &operator=(const Handle &);
93
94 T handle_;
95};
96
97
98template<typename T>
99class NonDispHandle : public Handle<T> {
100protected:
101 explicit NonDispHandle() : Handle<T>(), dev_handle_(VK_NULL_HANDLE) {}
102 explicit NonDispHandle(VkDevice dev, T handle) : Handle<T>(handle), dev_handle_(dev) {}
103
104 const VkDevice &device() const { return dev_handle_; }
105
106 void init(VkDevice dev, T handle)
107 {
108 assert(!Handle<T>::initialized() && dev_handle_ == VK_NULL_HANDLE);
109 Handle<T>::init(handle);
110 dev_handle_ = dev;
111 }
112
113private:
114 VkDevice dev_handle_;
115};
116
117} // namespace internal
118
Chia-I Wu999f0482015-07-03 10:32:05 +0800119class PhysicalDevice : public internal::Handle<VkPhysicalDevice> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600120public:
Chia-I Wu999f0482015-07-03 10:32:05 +0800121 explicit PhysicalDevice(VkPhysicalDevice phy) : Handle(phy)
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600122 {
123 memory_properties_ = memory_properties();
124 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600125
Tony Barbourd1c35722015-04-16 15:59:00 -0600126 VkPhysicalDeviceProperties properties() const;
Tony Barbourd1c35722015-04-16 15:59:00 -0600127 VkPhysicalDeviceMemoryProperties memory_properties() const;
Cody Northropd0802882015-08-03 17:04:53 -0600128 std::vector<VkQueueFamilyProperties> queue_properties() const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600129
Mike Stroyan713b2d72015-08-04 10:49:29 -0600130 VkResult set_memory_type(const uint32_t type_bits, VkMemoryAllocInfo *info, const VkMemoryPropertyFlags properties,
131 const VkMemoryPropertyFlags forbid = 0) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600132
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600133 // vkGetPhysicalDeviceExtensionProperties()
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600134 std::vector<VkExtensionProperties> extensions() const;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600135 std::vector<VkExtensionProperties> extensions(const char * pLayerName) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600136
137 // vkEnumerateLayers()
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600138 std::vector<VkLayerProperties> layers() const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600139
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600140private:
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600141 void add_extension_dependencies(uint32_t dependency_count,
142 VkExtensionProperties *depencency_props,
143 std::vector<VkExtensionProperties> &ext_list);
Chia-I Wu999f0482015-07-03 10:32:05 +0800144
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600145 VkPhysicalDeviceMemoryProperties memory_properties_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600146};
147
Chia-I Wuf368b602015-07-03 10:41:20 +0800148class Device : public internal::Handle<VkDevice> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600149public:
Chia-I Wu999f0482015-07-03 10:32:05 +0800150 explicit Device(VkPhysicalDevice phy) : phy_(phy) {}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600151 ~Device();
152
153 // vkCreateDevice()
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600154 void init(const VkDeviceCreateInfo &info);
Courtney Goeltzenleuchter5bac6092015-07-07 11:47:33 -0600155 void init(std::vector<const char*> &layers, std::vector<const char *> &extensions); // all queues, all extensions, etc
156 void init() { std::vector<const char *> layers; std::vector<const char *> extensions; init(layers, extensions); };
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600157
Chia-I Wu999f0482015-07-03 10:32:05 +0800158 const PhysicalDevice &phy() const { return phy_; }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600159
Jon Ashburn8d1b0b52015-05-18 13:20:15 -0600160 // vkGetDeviceProcAddr()
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -0600161 PFN_vkVoidFunction get_proc(const char *name) const { return vkGetDeviceProcAddr(handle(), name); }
Jon Ashburn8d1b0b52015-05-18 13:20:15 -0600162
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600163 // vkGetDeviceQueue()
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500164 const std::vector<Queue *> &graphics_queues() const { return queues_[GRAPHICS]; }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600165 const std::vector<Queue *> &compute_queues() { return queues_[COMPUTE]; }
166 const std::vector<Queue *> &dma_queues() { return queues_[DMA]; }
167 uint32_t graphics_queue_node_index_;
168
169 struct Format {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600170 VkFormat format;
171 VkImageTiling tiling;
172 VkFlags features;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600173 };
174 // vkGetFormatInfo()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600175 VkFormatProperties format_properties(VkFormat format);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600176 const std::vector<Format> &formats() const { return formats_; }
177
178 // vkDeviceWaitIdle()
179 void wait();
180
181 // vkWaitForFences()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600182 VkResult wait(const std::vector<const Fence *> &fences, bool wait_all, uint64_t timeout);
183 VkResult wait(const Fence &fence) { return wait(std::vector<const Fence *>(1, &fence), true, (uint64_t) -1); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600184
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800185 // vkUpdateDescriptorSets()
186 VkResult update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes, const std::vector<VkCopyDescriptorSet> &copies);
187 VkResult update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes) { return update_descriptor_sets(writes, std::vector<VkCopyDescriptorSet>()); }
188
189 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
190 VkDescriptorType type, uint32_t count, const VkDescriptorInfo *descriptors);
191 static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
192 VkDescriptorType type, const std::vector<VkDescriptorInfo> &descriptors);
193
194 static VkCopyDescriptorSet copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding, uint32_t src_array_element,
195 const DescriptorSet &dst_set, uint32_t dst_binding, uint32_t dst_array_element,
196 uint32_t count);
197
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600198private:
199 enum QueueIndex {
200 GRAPHICS,
201 COMPUTE,
202 DMA,
203 QUEUE_COUNT,
204 };
205
206 void init_queues();
207 void init_formats();
208
Chia-I Wu999f0482015-07-03 10:32:05 +0800209 PhysicalDevice phy_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600210
211 std::vector<Queue *> queues_[QUEUE_COUNT];
212 std::vector<Format> formats_;
213};
214
Chia-I Wudf12ffd2015-07-03 10:53:18 +0800215class Queue : public internal::Handle<VkQueue> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600216public:
Tony Barbourfb21ea32015-07-23 10:35:30 -0600217 explicit Queue(VkQueue queue, int index) : Handle(queue) {family_index_ = index;}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600218
219 // vkQueueSubmit()
220 void submit(const std::vector<const CmdBuffer *> &cmds, Fence &fence);
221 void submit(const CmdBuffer &cmd, Fence &fence);
222 void submit(const CmdBuffer &cmd);
223
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600224 // vkQueueWaitIdle()
225 void wait();
226
227 // vkQueueSignalSemaphore()
228 // vkQueueWaitSemaphore()
229 void signal_semaphore(Semaphore &sem);
230 void wait_semaphore(Semaphore &sem);
Tony Barbourfb21ea32015-07-23 10:35:30 -0600231
232 int get_family_index() {return family_index_;}
233
234private:
235 int family_index_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600236};
237
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800238class DeviceMemory : public internal::NonDispHandle<VkDeviceMemory> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600239public:
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800240 ~DeviceMemory();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600241
242 // vkAllocMemory()
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600243 void init(const Device &dev, const VkMemoryAllocInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600244
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600245 // vkMapMemory()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600246 const void *map(VkFlags flags) const;
247 void *map(VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600248 const void *map() const { return map(0); }
249 void *map() { return map(0); }
250
251 // vkUnmapMemory()
252 void unmap() const;
253
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800254 static VkMemoryAllocInfo alloc_info(VkDeviceSize size, uint32_t memory_type_index);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600255};
256
Chia-I Wud9e8e822015-07-03 11:45:55 +0800257class Fence : public internal::NonDispHandle<VkFence> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600258public:
Chia-I Wud9e8e822015-07-03 11:45:55 +0800259 ~Fence();
260
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600261 // vkCreateFence()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600262 void init(const Device &dev, const VkFenceCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600263
264 // vkGetFenceStatus()
Chia-I Wud9e8e822015-07-03 11:45:55 +0800265 VkResult status() const { return vkGetFenceStatus(device(), handle()); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600266
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600267 static VkFenceCreateInfo create_info(VkFenceCreateFlags flags);
268 static VkFenceCreateInfo create_info();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600269};
270
Chia-I Wu6b1c2482015-07-03 11:49:42 +0800271class Semaphore : public internal::NonDispHandle<VkSemaphore> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600272public:
Chia-I Wu6b1c2482015-07-03 11:49:42 +0800273 ~Semaphore();
274
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600275 // vkCreateSemaphore()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600276 void init(const Device &dev, const VkSemaphoreCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600277
Tony Barbouraf892a12015-06-26 12:56:09 -0600278 static VkSemaphoreCreateInfo create_info(VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600279};
280
Chia-I Wuc5c97992015-07-03 11:49:42 +0800281class Event : public internal::NonDispHandle<VkEvent> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600282public:
Chia-I Wuc5c97992015-07-03 11:49:42 +0800283 ~Event();
284
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600285 // vkCreateEvent()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600286 void init(const Device &dev, const VkEventCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600287
288 // vkGetEventStatus()
289 // vkSetEvent()
290 // vkResetEvent()
Chia-I Wuc5c97992015-07-03 11:49:42 +0800291 VkResult status() const { return vkGetEventStatus(device(), handle()); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600292 void set();
293 void reset();
294
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600295 static VkEventCreateInfo create_info(VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600296};
297
Chia-I Wu1b7d4762015-07-03 11:49:42 +0800298class QueryPool : public internal::NonDispHandle<VkQueryPool> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600299public:
Chia-I Wu1b7d4762015-07-03 11:49:42 +0800300 ~QueryPool();
301
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600302 // vkCreateQueryPool()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600303 void init(const Device &dev, const VkQueryPoolCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600304
305 // vkGetQueryPoolResults()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600306 VkResult results(uint32_t start, uint32_t count, size_t size, void *data);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600307
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600308 static VkQueryPoolCreateInfo create_info(VkQueryType type, uint32_t slot_count);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600309};
310
Chia-I Wu681d7a02015-07-03 13:44:34 +0800311class Buffer : public internal::NonDispHandle<VkBuffer> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600312public:
Chia-I Wu681d7a02015-07-03 13:44:34 +0800313 explicit Buffer() : NonDispHandle() {}
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600314 explicit Buffer(const Device &dev, const VkBufferCreateInfo &info) { init(dev, info); }
Tony Barbourd1c35722015-04-16 15:59:00 -0600315 explicit Buffer(const Device &dev, VkDeviceSize size) { init(dev, size); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600316
Chia-I Wu681d7a02015-07-03 13:44:34 +0800317 ~Buffer();
318
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600319 // vkCreateBuffer()
Chia-I Wu681d7a02015-07-03 13:44:34 +0800320 void init(const Device &dev, const VkBufferCreateInfo &info, VkMemoryPropertyFlags mem_props);
321 void init(const Device &dev, const VkBufferCreateInfo &info) { init(dev, info, 0); }
322 void init(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags mem_props) { init(dev, create_info(size, 0), mem_props); }
323 void init(const Device &dev, VkDeviceSize size) { init(dev, size, 0); }
Cody Northrop7fb43862015-06-22 14:56:14 -0600324 void init_as_src(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs) { init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT), reqs); }
325 void init_as_dst(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs) { init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT), reqs); }
326 void init_as_src_and_dst(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs) { init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT | VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT), reqs); }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600327 void init_no_mem(const Device &dev, const VkBufferCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600328
Chia-I Wu681d7a02015-07-03 13:44:34 +0800329 // get the internal memory
330 const DeviceMemory &memory() const { return internal_mem_; }
331 DeviceMemory &memory() { return internal_mem_; }
332
333 // vkGetObjectMemoryRequirements()
334 VkMemoryRequirements memory_requirements() const;
335
336 // vkBindObjectMemory()
337 void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
Mark Lobodzinski942b1722015-05-11 17:21:15 -0500338
Tony Barbourd1c35722015-04-16 15:59:00 -0600339 static VkBufferCreateInfo create_info(VkDeviceSize size, VkFlags usage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600340
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600341 VkBufferMemoryBarrier buffer_memory_barrier(VkFlags output_mask, VkFlags input_mask,
Tony Barbourd1c35722015-04-16 15:59:00 -0600342 VkDeviceSize offset, VkDeviceSize size) const
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600343 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600344 VkBufferMemoryBarrier barrier = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600345 barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800346 barrier.buffer = handle();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600347 barrier.outputMask = output_mask;
348 barrier.inputMask = input_mask;
349 barrier.offset = offset;
350 barrier.size = size;
351 return barrier;
352 }
Chia-I Wu681d7a02015-07-03 13:44:34 +0800353
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600354private:
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600355 VkBufferCreateInfo create_info_;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800356
357 DeviceMemory internal_mem_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600358};
359
Chia-I Wu3158bf32015-07-03 11:49:42 +0800360class BufferView : public internal::NonDispHandle<VkBufferView> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600361public:
Chia-I Wu3158bf32015-07-03 11:49:42 +0800362 ~BufferView();
363
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600364 // vkCreateBufferView()
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600365 void init(const Device &dev, const VkBufferViewCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600366};
367
Chia-I Wu681d7a02015-07-03 13:44:34 +0800368class Image : public internal::NonDispHandle<VkImage> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600369public:
Chia-I Wu681d7a02015-07-03 13:44:34 +0800370 explicit Image() : NonDispHandle(), format_features_(0) {}
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600371 explicit Image(const Device &dev, const VkImageCreateInfo &info) : format_features_(0) { init(dev, info); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600372
Chia-I Wu681d7a02015-07-03 13:44:34 +0800373 ~Image();
374
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600375 // vkCreateImage()
Chia-I Wu681d7a02015-07-03 13:44:34 +0800376 void init(const Device &dev, const VkImageCreateInfo &info, VkMemoryPropertyFlags mem_props);
377 void init(const Device &dev, const VkImageCreateInfo &info) { init(dev, info, 0); }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600378 void init_no_mem(const Device &dev, const VkImageCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600379
Chia-I Wu681d7a02015-07-03 13:44:34 +0800380 // get the internal memory
381 const DeviceMemory &memory() const { return internal_mem_; }
382 DeviceMemory &memory() { return internal_mem_; }
383
384 // vkGetObjectMemoryRequirements()
385 VkMemoryRequirements memory_requirements() const;
386
387 // vkBindObjectMemory()
388 void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600389
Tony Barbour59a47322015-06-24 16:06:58 -0600390 // vkGetImageSubresourceLayout()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600391 VkSubresourceLayout subresource_layout(const VkImageSubresource &subres) const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600392
393 bool transparent() const;
Tony Barbourd1c35722015-04-16 15:59:00 -0600394 bool copyable() const { return (format_features_ & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600395
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600396 VkImageSubresourceRange subresource_range(VkImageAspect aspect) const { return subresource_range(create_info_, aspect); }
397 VkExtent3D extent() const { return create_info_.extent; }
398 VkExtent3D extent(uint32_t mip_level) const { return extent(create_info_.extent, mip_level); }
399 VkFormat format() const {return create_info_.format;}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600400
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600401 VkImageMemoryBarrier image_memory_barrier(VkFlags output_mask, VkFlags input_mask,
402 VkImageLayout old_layout,
403 VkImageLayout new_layout,
404 const VkImageSubresourceRange &range) const
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600405 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600406 VkImageMemoryBarrier barrier = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600407 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
408 barrier.outputMask = output_mask;
409 barrier.inputMask = input_mask;
410 barrier.oldLayout = old_layout;
411 barrier.newLayout = new_layout;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800412 barrier.image = handle();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600413 barrier.subresourceRange = range;
414 return barrier;
415 }
416
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600417 static VkImageCreateInfo create_info();
418 static VkImageSubresource subresource(VkImageAspect aspect, uint32_t mip_level, uint32_t array_slice);
419 static VkImageSubresource subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_slice);
420 static VkImageSubresourceRange subresource_range(VkImageAspect aspect, uint32_t base_mip_level, uint32_t mip_levels,
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600421 uint32_t base_array_slice, uint32_t array_size);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600422 static VkImageSubresourceRange subresource_range(const VkImageCreateInfo &info, VkImageAspect aspect);
423 static VkImageSubresourceRange subresource_range(const VkImageSubresource &subres);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600424
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600425 static VkExtent2D extent(int32_t width, int32_t height);
426 static VkExtent2D extent(const VkExtent2D &extent, uint32_t mip_level);
427 static VkExtent2D extent(const VkExtent3D &extent);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600428
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600429 static VkExtent3D extent(int32_t width, int32_t height, int32_t depth);
430 static VkExtent3D extent(const VkExtent3D &extent, uint32_t mip_level);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600431
432private:
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600433 void init_info(const Device &dev, const VkImageCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600434
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600435 VkImageCreateInfo create_info_;
436 VkFlags format_features_;
Chia-I Wu681d7a02015-07-03 13:44:34 +0800437
438 DeviceMemory internal_mem_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600439};
440
Chia-I Wu3158bf32015-07-03 11:49:42 +0800441class ImageView : public internal::NonDispHandle<VkImageView> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600442public:
Chia-I Wu3158bf32015-07-03 11:49:42 +0800443 ~ImageView();
444
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600445 // vkCreateImageView()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600446 void init(const Device &dev, const VkImageViewCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600447};
448
Chia-I Wu3158bf32015-07-03 11:49:42 +0800449//class AttachmentView : public DerivedObject<VkAttachmentView, Object, VK_OBJECT_TYPE_ATTACHMENT_VIEW> {
450class AttachmentView : public internal::NonDispHandle<VkAttachmentView> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600451public:
Chia-I Wu3158bf32015-07-03 11:49:42 +0800452 ~AttachmentView();
453
Chia-I Wu08accc62015-07-07 11:50:03 +0800454 // vkCreateAttachmentView()
455 void init(const Device &dev, const VkAttachmentViewCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600456};
457
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800458class ShaderModule : public internal::NonDispHandle<VkShaderModule> {
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600459public:
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800460 ~ShaderModule();
461
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600462 // vkCreateShaderModule()
463 void init(const Device &dev, const VkShaderModuleCreateInfo &info);
464 VkResult init_try(const Device &dev, const VkShaderModuleCreateInfo &info);
465
466 static VkShaderModuleCreateInfo create_info(size_t code_size, const void *code, VkFlags flags);
467};
468
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800469class Shader : public internal::NonDispHandle<VkShader> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600470public:
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800471 ~Shader();
472
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600473 // vkCreateShader()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600474 void init(const Device &dev, const VkShaderCreateInfo &info);
475 VkResult init_try(const Device &dev, const VkShaderCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600476
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600477 static VkShaderCreateInfo create_info(VkShaderModule module, const char *pName, VkFlags flags);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600478};
479
Chia-I Wu2ff72fd2015-07-03 11:49:42 +0800480class Pipeline : public internal::NonDispHandle<VkPipeline> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600481public:
Chia-I Wu2ff72fd2015-07-03 11:49:42 +0800482 ~Pipeline();
483
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600484 // vkCreateGraphicsPipeline()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600485 void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600486 // vkCreateGraphicsPipelineDerivative()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600487 void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info, const VkPipeline basePipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600488 // vkCreateComputePipeline()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600489 void init(const Device &dev, const VkComputePipelineCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600490 // vkLoadPipeline()
491 void init(const Device&dev, size_t size, const void *data);
492 // vkLoadPipelineDerivative()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600493 void init(const Device&dev, size_t size, const void *data, VkPipeline basePipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600494
Chris Forbes95292b12015-05-25 11:13:26 +1200495 // vkCreateGraphicsPipeline with error return
496 VkResult init_try(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
497
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600498 // vkStorePipeline()
499 size_t store(size_t size, void *data);
500};
501
Chia-I Wufd46e7d2015-07-03 11:49:42 +0800502class PipelineLayout : public internal::NonDispHandle<VkPipelineLayout> {
503public:
504 ~PipelineLayout();
505
506 // vCreatePipelineLayout()
507 void init(const Device &dev, VkPipelineLayoutCreateInfo &info, const std::vector<const DescriptorSetLayout *> &layouts);
508};
509
Chia-I Wu8c721c62015-07-03 11:49:42 +0800510class Sampler : public internal::NonDispHandle<VkSampler> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600511public:
Chia-I Wu8c721c62015-07-03 11:49:42 +0800512 ~Sampler();
513
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600514 // vkCreateSampler()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600515 void init(const Device &dev, const VkSamplerCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600516};
517
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800518class DescriptorSetLayout : public internal::NonDispHandle<VkDescriptorSetLayout> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600519public:
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800520 ~DescriptorSetLayout();
521
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600522 // vkCreateDescriptorSetLayout()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600523 void init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600524};
525
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800526class DescriptorPool : public internal::NonDispHandle<VkDescriptorPool> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600527public:
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800528 ~DescriptorPool();
529
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600530 // vkCreateDescriptorPool()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600531 void init(const Device &dev, VkDescriptorPoolUsage usage,
532 uint32_t max_sets, const VkDescriptorPoolCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600533
534 // vkResetDescriptorPool()
535 void reset();
536
537 // vkAllocDescriptorSets()
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500538 std::vector<DescriptorSet *> alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const std::vector<const DescriptorSetLayout *> &layouts);
539 std::vector<DescriptorSet *> alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const DescriptorSetLayout &layout, uint32_t count);
540 DescriptorSet *alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const DescriptorSetLayout &layout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600541};
542
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800543class DescriptorSet : public internal::NonDispHandle<VkDescriptorSet> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600544public:
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800545 ~DescriptorSet();
546
547 explicit DescriptorSet() : NonDispHandle() {}
Tony Barbour67e99152015-07-10 14:10:27 -0600548 explicit DescriptorSet(const Device &dev, VkDescriptorPool pool, VkDescriptorSet set) : NonDispHandle(dev.handle(), set) { pool_ = pool;}
549
550private:
551 VkDescriptorPool pool_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600552};
553
Tony Barbour1d2cd3f2015-07-03 10:33:54 -0600554class DynamicViewportState : public internal::NonDispHandle<VkDynamicViewportState> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600555public:
Chia-I Wubc4a5542015-07-03 11:49:42 +0800556 ~DynamicViewportState();
557
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600558 // vkCreateDynamicViewportState()
Tony Barbour1d2cd3f2015-07-03 10:33:54 -0600559 void init(const Device &dev, const VkDynamicViewportStateCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600560};
561
Tony Barbour1d2cd3f2015-07-03 10:33:54 -0600562class DynamicRasterState : public internal::NonDispHandle<VkDynamicRasterState> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600563public:
Chia-I Wubc4a5542015-07-03 11:49:42 +0800564 ~DynamicRasterState();
565
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600566 // vkCreateDynamicRasterState()
Tony Barbour1d2cd3f2015-07-03 10:33:54 -0600567 void init(const Device &dev, const VkDynamicRasterStateCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600568};
569
Tony Barbour1d2cd3f2015-07-03 10:33:54 -0600570class DynamicColorBlendState : public internal::NonDispHandle<VkDynamicColorBlendState> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600571public:
Chia-I Wubc4a5542015-07-03 11:49:42 +0800572 ~DynamicColorBlendState();
573
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600574 // vkCreateDynamicColorBlendState()
Tony Barbour1d2cd3f2015-07-03 10:33:54 -0600575 void init(const Device &dev, const VkDynamicColorBlendStateCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600576};
577
Tony Barbour1d2cd3f2015-07-03 10:33:54 -0600578class DynamicDepthStencilState : public internal::NonDispHandle<VkDynamicDepthStencilState> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600579public:
Chia-I Wubc4a5542015-07-03 11:49:42 +0800580 ~DynamicDepthStencilState();
581
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600582 // vkCreateDynamicDepthStencilState()
Tony Barbour1d2cd3f2015-07-03 10:33:54 -0600583 void init(const Device &dev, const VkDynamicDepthStencilStateCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600584};
585
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600586class CmdPool : public internal::NonDispHandle<VkCmdPool> {
587public:
588 ~CmdPool();
589
590 explicit CmdPool() : NonDispHandle() {}
591 explicit CmdPool(const Device &dev, const VkCmdPoolCreateInfo &info) { init(dev, info); }
592
593 // vkCreateDynamicDepthStencilState()
594 void init(const Device &dev, const VkCmdPoolCreateInfo &info);
595
596 static VkCmdPoolCreateInfo create_info(uint32_t queue_family_index);
597};
598
599inline VkCmdPoolCreateInfo CmdPool::create_info(uint32_t queue_family_index)
600{
601 VkCmdPoolCreateInfo info = {};
Tony Barboure815fd72015-07-27 09:36:24 -0600602 info.sType = VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO;
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600603 info.queueFamilyIndex = queue_family_index;
604 return info;
605}
606
Chia-I Wube2b9172015-07-03 11:49:42 +0800607class CmdBuffer : public internal::Handle<VkCmdBuffer> {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600608public:
Chia-I Wube2b9172015-07-03 11:49:42 +0800609 ~CmdBuffer();
610
611 explicit CmdBuffer() : Handle() {}
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600612 explicit CmdBuffer(const Device &dev, const VkCmdBufferCreateInfo &info) { init(dev, info); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600613
614 // vkCreateCommandBuffer()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600615 void init(const Device &dev, const VkCmdBufferCreateInfo &info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600616
617 // vkBeginCommandBuffer()
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600618 void begin(const VkCmdBufferBeginInfo *info);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600619 void begin();
620
621 // vkEndCommandBuffer()
622 // vkResetCommandBuffer()
623 void end();
Cody Northrope62183e2015-07-09 18:08:05 -0600624 void reset(VkCmdBufferResetFlags flags);
625 void reset() { reset(VK_CMD_BUFFER_RESET_RELEASE_RESOURCES); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600626
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600627 static VkCmdBufferCreateInfo create_info(VkCmdPool const &pool);
Chia-I Wube2b9172015-07-03 11:49:42 +0800628
629private:
630 VkDevice dev_handle_;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600631};
632
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800633inline VkMemoryAllocInfo DeviceMemory::alloc_info(VkDeviceSize size, uint32_t memory_type_index)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600634{
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600635 VkMemoryAllocInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600636 info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800637 info.allocationSize = size;
638 info.memoryTypeIndex = memory_type_index;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600639 return info;
640}
641
Tony Barbourd1c35722015-04-16 15:59:00 -0600642inline VkBufferCreateInfo Buffer::create_info(VkDeviceSize size, VkFlags usage)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600643{
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600644 VkBufferCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600645 info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
646 info.size = size;
647 info.usage = usage;
648 return info;
649}
650
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600651inline VkFenceCreateInfo Fence::create_info(VkFenceCreateFlags flags)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600652{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600653 VkFenceCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600654 info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
655 info.flags = flags;
656 return info;
657}
658
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600659inline VkFenceCreateInfo Fence::create_info()
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600660{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600661 VkFenceCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600662 info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
663 return info;
664}
665
Tony Barbouraf892a12015-06-26 12:56:09 -0600666inline VkSemaphoreCreateInfo Semaphore::create_info(VkFlags flags)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600667{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600668 VkSemaphoreCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600669 info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600670 info.flags = flags;
671 return info;
672}
673
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600674inline VkEventCreateInfo Event::create_info(VkFlags flags)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600675{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600676 VkEventCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600677 info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
678 info.flags = flags;
679 return info;
680}
681
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600682inline VkQueryPoolCreateInfo QueryPool::create_info(VkQueryType type, uint32_t slot_count)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600683{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600684 VkQueryPoolCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600685 info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
686 info.queryType = type;
687 info.slots = slot_count;
688 return info;
689}
690
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600691inline VkImageCreateInfo Image::create_info()
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600692{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600693 VkImageCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600694 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
695 info.extent.width = 1;
696 info.extent.height = 1;
697 info.extent.depth = 1;
698 info.mipLevels = 1;
699 info.arraySize = 1;
700 info.samples = 1;
701 return info;
702}
703
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600704inline VkImageSubresource Image::subresource(VkImageAspect aspect, uint32_t mip_level, uint32_t array_slice)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600705{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600706 VkImageSubresource subres = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600707 subres.aspect = aspect;
708 subres.mipLevel = mip_level;
709 subres.arraySlice = array_slice;
710 return subres;
711}
712
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600713inline VkImageSubresource Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_slice)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600714{
715 return subresource(range.aspect, range.baseMipLevel + mip_level, range.baseArraySlice + array_slice);
716}
717
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600718inline VkImageSubresourceRange Image::subresource_range(VkImageAspect aspect, uint32_t base_mip_level, uint32_t mip_levels,
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600719 uint32_t base_array_slice, uint32_t array_size)
720{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600721 VkImageSubresourceRange range = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600722 range.aspect = aspect;
723 range.baseMipLevel = base_mip_level;
724 range.mipLevels = mip_levels;
725 range.baseArraySlice = base_array_slice;
726 range.arraySize = array_size;
727 return range;
728}
729
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600730inline VkImageSubresourceRange Image::subresource_range(const VkImageCreateInfo &info, VkImageAspect aspect)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600731{
732 return subresource_range(aspect, 0, info.mipLevels, 0, info.arraySize);
733}
734
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600735inline VkImageSubresourceRange Image::subresource_range(const VkImageSubresource &subres)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600736{
737 return subresource_range(subres.aspect, subres.mipLevel, 1, subres.arraySlice, 1);
738}
739
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600740inline VkExtent2D Image::extent(int32_t width, int32_t height)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600741{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600742 VkExtent2D extent = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600743 extent.width = width;
744 extent.height = height;
745 return extent;
746}
747
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600748inline VkExtent2D Image::extent(const VkExtent2D &extent, uint32_t mip_level)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600749{
750 const int32_t width = (extent.width >> mip_level) ? extent.width >> mip_level : 1;
751 const int32_t height = (extent.height >> mip_level) ? extent.height >> mip_level : 1;
752 return Image::extent(width, height);
753}
754
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600755inline VkExtent2D Image::extent(const VkExtent3D &extent)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600756{
757 return Image::extent(extent.width, extent.height);
758}
759
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600760inline VkExtent3D Image::extent(int32_t width, int32_t height, int32_t depth)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600761{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600762 VkExtent3D extent = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600763 extent.width = width;
764 extent.height = height;
765 extent.depth = depth;
766 return extent;
767}
768
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600769inline VkExtent3D Image::extent(const VkExtent3D &extent, uint32_t mip_level)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600770{
771 const int32_t width = (extent.width >> mip_level) ? extent.width >> mip_level : 1;
772 const int32_t height = (extent.height >> mip_level) ? extent.height >> mip_level : 1;
773 const int32_t depth = (extent.depth >> mip_level) ? extent.depth >> mip_level : 1;
774 return Image::extent(width, height, depth);
775}
776
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600777inline VkShaderModuleCreateInfo ShaderModule::create_info(size_t code_size, const void *code, VkFlags flags)
778{
779 VkShaderModuleCreateInfo info = {};
780 info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
781 info.codeSize = code_size;
782 info.pCode = code;
783 info.flags = flags;
784 return info;
785}
786
787inline VkShaderCreateInfo Shader::create_info(VkShaderModule module, const char *pName, VkFlags flags)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600788{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600789 VkShaderCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600790 info.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO;
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600791 info.module = module;
792 info.pName = pName;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600793 info.flags = flags;
794 return info;
795}
796
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800797inline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
798 VkDescriptorType type, uint32_t count, const VkDescriptorInfo *descriptors)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600799{
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800800 VkWriteDescriptorSet write = {};
801 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800802 write.destSet = set.handle();
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800803 write.destBinding = binding;
804 write.destArrayElement = array_element;
805 write.count = count;
806 write.descriptorType = type;
807 write.pDescriptors = descriptors;
808 return write;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600809}
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,
812 VkDescriptorType type, const std::vector<VkDescriptorInfo> &descriptors)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600813{
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800814 return write_descriptor_set(set, binding, array_element, type, descriptors.size(), &descriptors[0]);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600815}
816
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800817inline VkCopyDescriptorSet Device::copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding, uint32_t src_array_element,
818 const DescriptorSet &dst_set, uint32_t dst_binding, uint32_t dst_array_element,
819 uint32_t count)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600820{
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800821 VkCopyDescriptorSet copy = {};
822 copy.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800823 copy.srcSet = src_set.handle();
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800824 copy.srcBinding = src_binding;
825 copy.srcArrayElement = src_array_element;
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800826 copy.destSet = dst_set.handle();
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800827 copy.destBinding = dst_binding;
828 copy.destArrayElement = dst_array_element;
829 copy.count = count;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600830
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800831 return copy;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600832}
833
Courtney Goeltzenleuchteree5d80b2015-07-10 19:50:17 -0600834inline VkCmdBufferCreateInfo CmdBuffer::create_info(VkCmdPool const &pool)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600835{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600836 VkCmdBufferCreateInfo info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600837 info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO;
Cody Northrope62183e2015-07-09 18:08:05 -0600838 info.cmdPool = pool;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600839 return info;
840}
841
842}; // namespace vk_testing
843
844#endif // VKTESTBINDING_H