blob: e3950f4a08e5b5e7711059517cd046781aa716c4 [file] [log] [blame]
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001// VK tests
Chia-I Wuf1e2e992014-12-27 14:12:52 +08002//
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#include <iostream>
24#include <string.h> // memset(), memcmp()
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -060025#include <assert.h>
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060026#include "vktestbinding.h"
Chia-I Wuf1e2e992014-12-27 14:12:52 +080027
28namespace {
Chia-I Wuf1e2e992014-12-27 14:12:52 +080029
Chia-I Wuf8f074f2015-07-03 10:58:57 +080030#define NON_DISPATCHABLE_HANDLE_INIT(create_func, dev, ...) \
31 do { \
32 handle_type handle; \
33 if (EXPECT(create_func(dev.handle(), __VA_ARGS__, &handle) == VK_SUCCESS)) \
34 NonDispHandle::init(dev.handle(), handle); \
35 } while (0)
36
Chia-I Wud9e8e822015-07-03 11:45:55 +080037#define NON_DISPATCHABLE_HANDLE_DTOR(cls, destroy_func, ...) \
38 cls::~cls() \
39 { \
40 if (initialized()) \
41 EXPECT(destroy_func(device(), __VA_ARGS__, handle()) == VK_SUCCESS); \
42 }
43
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -060044#define DERIVED_OBJECT_TYPE_INIT(create_func, dev, vk_object_type, ...) \
45 do { \
46 obj_type obj; \
47 dev_ = &dev; \
Chia-I Wuf368b602015-07-03 10:41:20 +080048 if (EXPECT(create_func(dev.handle(), __VA_ARGS__, &obj) == VK_SUCCESS)) \
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -060049 base_type::init(obj, vk_object_type); \
Mike Stroyanb050c682015-04-17 12:36:38 -060050 } while (0)
51
Chia-I Wuf1e2e992014-12-27 14:12:52 +080052#define STRINGIFY(x) #x
53#define EXPECT(expr) ((expr) ? true : expect_failure(STRINGIFY(expr), __FILE__, __LINE__, __FUNCTION__))
Mark Lobodzinski40f7f402015-04-16 11:44:05 -050054
Chia-I Wuf1e2e992014-12-27 14:12:52 +080055
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060056vk_testing::ErrorCallback error_callback;
Chia-I Wuf1e2e992014-12-27 14:12:52 +080057
58bool expect_failure(const char *expr, const char *file, unsigned int line, const char *function)
59{
60 if (error_callback) {
61 error_callback(expr, file, line, function);
62 } else {
63 std::cerr << file << ":" << line << ": " << function <<
64 ": Expectation `" << expr << "' failed.\n";
65 }
66
67 return false;
68}
69
70template<class T, class S>
Chia-I Wud9e8e822015-07-03 11:45:55 +080071std::vector<T> make_handles(const std::vector<S> &v)
72{
73 std::vector<T> handles;
74 handles.reserve(v.size());
75 for (typename std::vector<S>::const_iterator it = v.begin(); it != v.end(); it++)
76 handles.push_back((*it)->handle());
77 return handles;
78}
79
Chia-I Wuf1e2e992014-12-27 14:12:52 +080080template<typename T>
Tony Barbour59a47322015-06-24 16:06:58 -060081std::vector<T> get_memory_reqs(VkDevice device, VkObjectType obj_type, VkObject obj, size_t min_elems)
Chia-I Wuf1e2e992014-12-27 14:12:52 +080082{
83 std::vector<T> info;
Tony Barbour59a47322015-06-24 16:06:58 -060084
85 info.resize((min_elems > 0)?min_elems:1);
86 if (!EXPECT(vkGetObjectMemoryRequirements(device, obj_type, obj, &info[0]) == VK_SUCCESS))
87 info.clear();
Chia-I Wuf1e2e992014-12-27 14:12:52 +080088
89 if (info.size() < min_elems)
90 info.resize(min_elems);
91
92 return info;
93}
Chia-I Wuf1e2e992014-12-27 14:12:52 +080094} // namespace
95
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060096namespace vk_testing {
Chia-I Wuf1e2e992014-12-27 14:12:52 +080097
98void set_error_callback(ErrorCallback callback)
99{
100 error_callback = callback;
101}
102
Chia-I Wu999f0482015-07-03 10:32:05 +0800103VkPhysicalDeviceProperties PhysicalDevice::properties() const
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800104{
Tony Barbour59a47322015-06-24 16:06:58 -0600105 VkPhysicalDeviceProperties info;
106
Chia-I Wu999f0482015-07-03 10:32:05 +0800107 EXPECT(vkGetPhysicalDeviceProperties(handle(), &info) == VK_SUCCESS);
Tony Barbour59a47322015-06-24 16:06:58 -0600108
109 return info;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800110}
111
Chia-I Wu999f0482015-07-03 10:32:05 +0800112VkPhysicalDevicePerformance PhysicalDevice::performance() const
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800113{
Tony Barbour59a47322015-06-24 16:06:58 -0600114 VkPhysicalDevicePerformance info;
115
Chia-I Wu999f0482015-07-03 10:32:05 +0800116 EXPECT(vkGetPhysicalDevicePerformance(handle(), &info) == VK_SUCCESS);
Tony Barbour59a47322015-06-24 16:06:58 -0600117
118 return info;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800119}
120
Chia-I Wu999f0482015-07-03 10:32:05 +0800121std::vector<VkPhysicalDeviceQueueProperties> PhysicalDevice::queue_properties() const
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800122{
Tony Barbour59a47322015-06-24 16:06:58 -0600123 std::vector<VkPhysicalDeviceQueueProperties> info;
124 uint32_t count;
125
Chia-I Wu999f0482015-07-03 10:32:05 +0800126 if (EXPECT(vkGetPhysicalDeviceQueueCount(handle(), &count) == VK_SUCCESS)) {
Tony Barbour59a47322015-06-24 16:06:58 -0600127 info.resize(count);
Chia-I Wu999f0482015-07-03 10:32:05 +0800128 if (!EXPECT(vkGetPhysicalDeviceQueueProperties(handle(), count, &info[0]) == VK_SUCCESS))
Tony Barbour59a47322015-06-24 16:06:58 -0600129 info.clear();
130 }
131
132 return info;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800133}
134
Chia-I Wu999f0482015-07-03 10:32:05 +0800135VkPhysicalDeviceMemoryProperties PhysicalDevice::memory_properties() const
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800136{
Tony Barbour59a47322015-06-24 16:06:58 -0600137 VkPhysicalDeviceMemoryProperties info;
138
Chia-I Wu999f0482015-07-03 10:32:05 +0800139 EXPECT(vkGetPhysicalDeviceMemoryProperties(handle(), &info) == VK_SUCCESS);
Tony Barbour59a47322015-06-24 16:06:58 -0600140
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600141
Tony Barbour59a47322015-06-24 16:06:58 -0600142 return info;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800143}
144
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600145/*
146 * Return list of Global layers available
147 */
148std::vector<VkLayerProperties> GetGlobalLayers()
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800149{
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600150 VkResult err;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600151 std::vector<VkLayerProperties> layers;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600152 uint32_t layer_count;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600153
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600154 do {
155 layer_count = 0;
156 err = vkGetGlobalLayerProperties(&layer_count, NULL);
157
158 if (err == VK_SUCCESS) {
159 layers.reserve(layer_count);
160 err = vkGetGlobalLayerProperties(&layer_count, &layers[0]);
161 }
162 } while (err == VK_INCOMPLETE);
163
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600164 assert(err == VK_SUCCESS);
165
166 return layers;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800167}
168
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600169/*
170 * Return list of Global extensions provided by the ICD / Loader
171 */
172std::vector<VkExtensionProperties> GetGlobalExtensions()
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800173{
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600174 return GetGlobalExtensions(NULL);
175}
176
177/*
178 * Return list of Global extensions provided by the specified layer
179 * If pLayerName is NULL, will return extensions implemented by the loader / ICDs
180 */
181std::vector<VkExtensionProperties> GetGlobalExtensions(const char *pLayerName)
182{
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600183 std::vector<VkExtensionProperties> exts;
184 uint32_t ext_count;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600185 VkResult err;
186
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600187 do {
188 ext_count = 0;
189 err = vkGetGlobalExtensionProperties(pLayerName, &ext_count, NULL);
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600190
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600191 if (err == VK_SUCCESS) {
Courtney Goeltzenleuchter381f3a22015-07-06 15:45:58 -0600192 exts.resize(ext_count);
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600193 err = vkGetGlobalExtensionProperties(pLayerName, &ext_count, &exts[0]);
194 }
195 } while (err == VK_INCOMPLETE);
196
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600197 assert(err == VK_SUCCESS);
198
199 return exts;
200}
201
202/*
203 * Return list of PhysicalDevice extensions provided by the ICD / Loader
204 */
Chia-I Wu999f0482015-07-03 10:32:05 +0800205std::vector<VkExtensionProperties> PhysicalDevice::extensions() const
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600206{
207 return extensions(NULL);
208}
209
210/*
211 * Return list of PhysicalDevice extensions provided by the specified layer
212 * If pLayerName is NULL, will return extensions for ICD / loader.
213 */
Chia-I Wu999f0482015-07-03 10:32:05 +0800214std::vector<VkExtensionProperties> PhysicalDevice::extensions(const char *pLayerName) const
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600215{
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600216 std::vector<VkExtensionProperties> exts;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600217 VkResult err;
218
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600219 do {
220 uint32_t extCount = 0;
Chia-I Wu999f0482015-07-03 10:32:05 +0800221 err = vkGetPhysicalDeviceExtensionProperties(handle(), pLayerName, &extCount, NULL);
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600222
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600223 if (err == VK_SUCCESS) {
224 exts.reserve(extCount);
Chia-I Wu999f0482015-07-03 10:32:05 +0800225 err = vkGetPhysicalDeviceExtensionProperties(handle(), pLayerName, &extCount, &exts[0]);
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600226 }
227 } while (err == VK_INCOMPLETE);
228
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600229 assert(err == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800230
231 return exts;
232}
233
Chia-I Wu999f0482015-07-03 10:32:05 +0800234VkResult PhysicalDevice::set_memory_type(const uint32_t type_bits, VkMemoryAllocInfo *info, const VkFlags properties) const
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -0600235{
236 uint32_t type_mask = type_bits;
237 // Search memtypes to find first index with those properties
238 for (uint32_t i = 0; i < 32; i++) {
239 if ((type_mask & 1) == 1) {
240 // Type is available, does it match user properties?
241 if ((memory_properties_.memoryTypes[i].propertyFlags & properties) == properties) {
242 info->memoryTypeIndex = i;
243 return VK_SUCCESS;
244 }
245 }
246 type_mask >>= 1;
247 }
248 // No memory types matched, return failure
249 return VK_UNSUPPORTED;
250}
251
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600252/*
253 * Return list of PhysicalDevice layers
254 */
Chia-I Wu999f0482015-07-03 10:32:05 +0800255std::vector<VkLayerProperties> PhysicalDevice::layers() const
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600256{
257 std::vector<VkLayerProperties> layer_props;
258 VkResult err;
259
260 do {
261 uint32_t layer_count = 0;
Chia-I Wu999f0482015-07-03 10:32:05 +0800262 err = vkGetPhysicalDeviceLayerProperties(handle(), &layer_count, NULL);
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600263
264 if (err == VK_SUCCESS) {
265 layer_props.reserve(layer_count);
Chia-I Wu999f0482015-07-03 10:32:05 +0800266 err = vkGetPhysicalDeviceLayerProperties(handle(), &layer_count, &layer_props[0]);
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600267 }
268 } while (err == VK_INCOMPLETE);
269
270 assert(err == VK_SUCCESS);
271
272 return layer_props;
273}
274
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600275void BaseObject::init(VkObject obj, VkObjectType type, bool own)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800276{
277 EXPECT(!initialized());
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600278 reinit(obj, type, own);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800279}
280
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600281void BaseObject::reinit(VkObject obj, VkObjectType type, bool own)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800282{
283 obj_ = obj;
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600284 object_type_ = type;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800285 own_obj_ = own;
286}
287
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600288uint32_t Object::memory_allocation_count() const
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800289{
Mark Lobodzinski23065352015-05-29 09:32:35 -0500290 return 1;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800291}
292
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600293std::vector<VkMemoryRequirements> Object::memory_requirements() const
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800294{
Mark Lobodzinski23065352015-05-29 09:32:35 -0500295 uint32_t num_allocations = 1;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600296 std::vector<VkMemoryRequirements> info =
Chia-I Wuf368b602015-07-03 10:41:20 +0800297 get_memory_reqs<VkMemoryRequirements>(dev_->handle(), type(), obj(), 0);
Jon Ashburn7e781952015-01-16 09:37:43 -0700298 EXPECT(info.size() == num_allocations);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800299 if (info.size() == 1 && !info[0].size)
300 info.clear();
301
302 return info;
303}
304
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600305void Object::init(VkObject obj, VkObjectType object_type, bool own)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800306{
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600307 BaseObject::init(obj, object_type, own);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800308 mem_alloc_count_ = memory_allocation_count();
309}
310
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600311void Object::reinit(VkObject obj, VkObjectType object_type, bool own)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800312{
313 cleanup();
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600314 BaseObject::reinit(obj, object_type, own);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800315 mem_alloc_count_ = memory_allocation_count();
316}
317
318void Object::cleanup()
319{
320 if (!initialized())
321 return;
322
Courtney Goeltzenleuchterde69c412015-06-14 21:31:09 -0600323 if (own())
Chia-I Wuf368b602015-07-03 10:41:20 +0800324 EXPECT(vkDestroyObject(dev_->handle(), type(), obj()) == VK_SUCCESS);
Courtney Goeltzenleuchterde69c412015-06-14 21:31:09 -0600325
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800326 if (internal_mems_) {
327 delete[] internal_mems_;
328 internal_mems_ = NULL;
329 primary_mem_ = NULL;
330 }
331
332 mem_alloc_count_ = 0;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800333}
334
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800335void Object::bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800336{
Tony Barbour44bb3ab2015-04-09 16:00:18 -0600337 bound = true;
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800338 EXPECT(vkBindObjectMemory(dev_->handle(), type(), obj(), mem.handle(), mem_offset) == VK_SUCCESS);
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800339}
340
Courtney Goeltzenleuchter30a39452015-04-22 10:02:41 -0600341void Object::alloc_memory()
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800342{
343 if (!EXPECT(!internal_mems_) || !mem_alloc_count_)
344 return;
345
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800346 internal_mems_ = new DeviceMemory[mem_alloc_count_];
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800347
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600348 const std::vector<VkMemoryRequirements> mem_reqs = memory_requirements();
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800349 VkMemoryAllocInfo info;
Jon Ashburn8a5da752015-01-19 15:00:26 -0700350
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800351 for (int i = 0; i < mem_reqs.size(); i++) {
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800352 info = DeviceMemory::alloc_info(mem_reqs[i].size, 0);
Chia-I Wu999f0482015-07-03 10:32:05 +0800353 dev_->phy().set_memory_type(mem_reqs[i].memoryTypeBits, &info, 0);
Mark Lobodzinskie39f6952015-04-16 08:52:00 -0500354 primary_mem_ = &internal_mems_[i];
Courtney Goeltzenleuchter30a39452015-04-22 10:02:41 -0600355 internal_mems_[i].init(*dev_, info);
Mark Lobodzinski23065352015-05-29 09:32:35 -0500356 bind_memory(internal_mems_[i], 0);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800357 }
358}
359
Tony Barbour4c97d7a2015-04-22 15:10:33 -0600360void Object::alloc_memory(VkMemoryPropertyFlags &reqs)
361{
362 if (!EXPECT(!internal_mems_) || !mem_alloc_count_)
363 return;
364
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800365 internal_mems_ = new DeviceMemory[mem_alloc_count_];
Tony Barbour4c97d7a2015-04-22 15:10:33 -0600366
367 std::vector<VkMemoryRequirements> mem_reqs = memory_requirements();
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800368 VkMemoryAllocInfo info;
Tony Barbour4c97d7a2015-04-22 15:10:33 -0600369
370 for (int i = 0; i < mem_reqs.size(); i++) {
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800371 info = DeviceMemory::alloc_info(mem_reqs[i].size, 0);
Chia-I Wu999f0482015-07-03 10:32:05 +0800372 dev_->phy().set_memory_type(mem_reqs[i].memoryTypeBits, &info, reqs);
Tony Barbour4c97d7a2015-04-22 15:10:33 -0600373 primary_mem_ = &internal_mems_[i];
374 internal_mems_[i].init(*dev_, info);
Mark Lobodzinski23065352015-05-29 09:32:35 -0500375 bind_memory(internal_mems_[i], 0);
Tony Barbour4c97d7a2015-04-22 15:10:33 -0600376 }
377}
378
Tony Barbourd1c35722015-04-16 15:59:00 -0600379std::vector<VkDeviceMemory> Object::memories() const
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800380{
Tony Barbourd1c35722015-04-16 15:59:00 -0600381 std::vector<VkDeviceMemory> mems;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800382 if (internal_mems_) {
383 mems.reserve(mem_alloc_count_);
384 for (uint32_t i = 0; i < mem_alloc_count_; i++)
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800385 mems.push_back(internal_mems_[i].handle());
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800386 }
387
388 return mems;
389}
390
391Device::~Device()
392{
393 if (!initialized())
394 return;
395
396 for (int i = 0; i < QUEUE_COUNT; i++) {
397 for (std::vector<Queue *>::iterator it = queues_[i].begin(); it != queues_[i].end(); it++)
398 delete *it;
399 queues_[i].clear();
400 }
401
Chia-I Wuf368b602015-07-03 10:41:20 +0800402 EXPECT(vkDestroyDevice(handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800403}
404
Courtney Goeltzenleuchter5bac6092015-07-07 11:47:33 -0600405void Device::init(std::vector<const char *> &layers, std::vector<const char *> &extensions)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800406{
407 // request all queues
Chia-I Wu999f0482015-07-03 10:32:05 +0800408 const std::vector<VkPhysicalDeviceQueueProperties> queue_props = phy_.queue_properties();
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600409 std::vector<VkDeviceQueueCreateInfo> queue_info;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800410 queue_info.reserve(queue_props.size());
411 for (int i = 0; i < queue_props.size(); i++) {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600412 VkDeviceQueueCreateInfo qi = {};
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800413 qi.queueNodeIndex = i;
414 qi.queueCount = queue_props[i].queueCount;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600415 if (queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
Courtney Goeltzenleuchter18248e62015-03-05 18:09:39 -0700416 graphics_queue_node_index_ = i;
417 }
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800418 queue_info.push_back(qi);
419 }
420
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600421 VkDeviceCreateInfo dev_info = {};
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600422 dev_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600423 dev_info.pNext = NULL;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800424 dev_info.queueRecordCount = queue_info.size();
425 dev_info.pRequestedQueues = &queue_info[0];
Courtney Goeltzenleuchter5bac6092015-07-07 11:47:33 -0600426 dev_info.layerCount = layers.size();
427 dev_info.ppEnabledLayerNames = &layers[0];
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600428 dev_info.extensionCount = extensions.size();
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -0600429 dev_info.ppEnabledExtensionNames = &extensions[0];
Jon Ashburn9fc13ba2015-05-18 09:06:15 -0600430 dev_info.flags = 0;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800431
432 init(dev_info);
433}
434
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600435void Device::init(const VkDeviceCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800436{
Chia-I Wuf368b602015-07-03 10:41:20 +0800437 VkDevice dev;
438
439 if (EXPECT(vkCreateDevice(phy_.handle(), &info, &dev) == VK_SUCCESS))
440 Handle::init(dev);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800441
442 init_queues();
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800443 init_formats();
444}
445
446void Device::init_queues()
447{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600448 VkResult err;
Courtney Goeltzenleuchter18248e62015-03-05 18:09:39 -0700449 uint32_t queue_node_count;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800450
Chia-I Wu999f0482015-07-03 10:32:05 +0800451 err = vkGetPhysicalDeviceQueueCount(phy_.handle(), &queue_node_count);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600452 EXPECT(err == VK_SUCCESS);
Courtney Goeltzenleuchter18248e62015-03-05 18:09:39 -0700453 EXPECT(queue_node_count >= 1);
454
Tony Barbour3d69c9e2015-05-20 16:53:31 -0600455 VkPhysicalDeviceQueueProperties* queue_props = new VkPhysicalDeviceQueueProperties[queue_node_count];
Courtney Goeltzenleuchter18248e62015-03-05 18:09:39 -0700456
Chia-I Wu999f0482015-07-03 10:32:05 +0800457 err = vkGetPhysicalDeviceQueueProperties(phy_.handle(), queue_node_count, queue_props);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600458 EXPECT(err == VK_SUCCESS);
Courtney Goeltzenleuchter18248e62015-03-05 18:09:39 -0700459
Tony Barbour7ea6aa22015-05-22 09:44:58 -0600460 for (uint32_t i = 0; i < queue_node_count; i++) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600461 VkQueue queue;
Courtney Goeltzenleuchter18248e62015-03-05 18:09:39 -0700462
Tony Barbour7ea6aa22015-05-22 09:44:58 -0600463 for (uint32_t j = 0; j < queue_props[i].queueCount; j++) {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500464 // TODO: Need to add support for separate MEMMGR and work queues, including synchronization
Chia-I Wuf368b602015-07-03 10:41:20 +0800465 err = vkGetDeviceQueue(handle(), i, j, &queue);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600466 EXPECT(err == VK_SUCCESS);
Courtney Goeltzenleuchter18248e62015-03-05 18:09:39 -0700467
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600468 if (queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
Courtney Goeltzenleuchter18248e62015-03-05 18:09:39 -0700469 queues_[GRAPHICS].push_back(new Queue(queue));
470 }
471
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600472 if (queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) {
Courtney Goeltzenleuchter18248e62015-03-05 18:09:39 -0700473 queues_[COMPUTE].push_back(new Queue(queue));
474 }
475
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600476 if (queue_props[i].queueFlags & VK_QUEUE_DMA_BIT) {
Courtney Goeltzenleuchter18248e62015-03-05 18:09:39 -0700477 queues_[DMA].push_back(new Queue(queue));
478 }
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800479 }
480 }
481
Chris Forbes02038792015-06-04 10:49:27 +1200482 delete[] queue_props;
Tony Barbour3d69c9e2015-05-20 16:53:31 -0600483
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800484 EXPECT(!queues_[GRAPHICS].empty() || !queues_[COMPUTE].empty());
485}
486
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800487void Device::init_formats()
488{
Tony Barbourd1c35722015-04-16 15:59:00 -0600489 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600490 const VkFormat fmt = static_cast<VkFormat>(f);
491 const VkFormatProperties props = format_properties(fmt);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800492
Jeremy Hayesa058eee2015-01-23 08:51:43 -0700493 if (props.linearTilingFeatures) {
Tony Barbourd1c35722015-04-16 15:59:00 -0600494 const Format tmp = { fmt, VK_IMAGE_TILING_LINEAR, props.linearTilingFeatures };
Jeremy Hayesa058eee2015-01-23 08:51:43 -0700495 formats_.push_back(tmp);
496 }
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800497
Jeremy Hayesa058eee2015-01-23 08:51:43 -0700498 if (props.optimalTilingFeatures) {
Tony Barbourd1c35722015-04-16 15:59:00 -0600499 const Format tmp = { fmt, VK_IMAGE_TILING_OPTIMAL, props.optimalTilingFeatures };
Jeremy Hayesa058eee2015-01-23 08:51:43 -0700500 formats_.push_back(tmp);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800501 }
502 }
503
504 EXPECT(!formats_.empty());
505}
506
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600507VkFormatProperties Device::format_properties(VkFormat format)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800508{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600509 VkFormatProperties data;
Chia-I Wu999f0482015-07-03 10:32:05 +0800510 if (!EXPECT(vkGetPhysicalDeviceFormatInfo(phy().handle(), format, &data) == VK_SUCCESS))
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800511 memset(&data, 0, sizeof(data));
512
513 return data;
514}
515
516void Device::wait()
517{
Chia-I Wuf368b602015-07-03 10:41:20 +0800518 EXPECT(vkDeviceWaitIdle(handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800519}
520
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600521VkResult Device::wait(const std::vector<const Fence *> &fences, bool wait_all, uint64_t timeout)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800522{
Chia-I Wud9e8e822015-07-03 11:45:55 +0800523 const std::vector<VkFence> fence_handles = make_handles<VkFence>(fences);
524 VkResult err = vkWaitForFences(handle(), fence_handles.size(), &fence_handles[0], wait_all, timeout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600525 EXPECT(err == VK_SUCCESS || err == VK_TIMEOUT);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800526
527 return err;
528}
529
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800530VkResult Device::update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes, const std::vector<VkCopyDescriptorSet> &copies)
531{
Chia-I Wuf368b602015-07-03 10:41:20 +0800532 return vkUpdateDescriptorSets(handle(), writes.size(), &writes[0], copies.size(), &copies[0]);
Chia-I Wu9d00ed72015-05-25 16:27:55 +0800533}
534
Courtney Goeltzenleuchter97b75232015-04-07 17:13:38 -0600535void Queue::submit(const std::vector<const CmdBuffer *> &cmds, Fence &fence)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800536{
Chia-I Wube2b9172015-07-03 11:49:42 +0800537 const std::vector<VkCmdBuffer> cmd_handles = make_handles<VkCmdBuffer>(cmds);
538 EXPECT(vkQueueSubmit(handle(), cmd_handles.size(), &cmd_handles[0], fence.handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800539}
540
Courtney Goeltzenleuchter97b75232015-04-07 17:13:38 -0600541void Queue::submit(const CmdBuffer &cmd, Fence &fence)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800542{
Courtney Goeltzenleuchter97b75232015-04-07 17:13:38 -0600543 submit(std::vector<const CmdBuffer*>(1, &cmd), fence);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800544}
545
Courtney Goeltzenleuchter97b75232015-04-07 17:13:38 -0600546void Queue::submit(const CmdBuffer &cmd)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800547{
548 Fence fence;
Courtney Goeltzenleuchter97b75232015-04-07 17:13:38 -0600549 submit(cmd, fence);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800550}
551
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800552void Queue::wait()
553{
Chia-I Wudf12ffd2015-07-03 10:53:18 +0800554 EXPECT(vkQueueWaitIdle(handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800555}
556
Courtney Goeltzenleuchterebb95842015-03-25 17:14:29 -0600557void Queue::signal_semaphore(Semaphore &sem)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800558{
Chia-I Wu6b1c2482015-07-03 11:49:42 +0800559 EXPECT(vkQueueSignalSemaphore(handle(), sem.handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800560}
561
Courtney Goeltzenleuchterebb95842015-03-25 17:14:29 -0600562void Queue::wait_semaphore(Semaphore &sem)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800563{
Chia-I Wu6b1c2482015-07-03 11:49:42 +0800564 EXPECT(vkQueueWaitSemaphore(handle(), sem.handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800565}
566
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800567DeviceMemory::~DeviceMemory()
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800568{
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800569 if (initialized())
570 EXPECT(vkFreeMemory(device(), handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800571}
572
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800573void DeviceMemory::init(const Device &dev, const VkMemoryAllocInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800574{
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800575 NON_DISPATCHABLE_HANDLE_INIT(vkAllocMemory, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800576}
577
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800578const void *DeviceMemory::map(VkFlags flags) const
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800579{
580 void *data;
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800581 if (!EXPECT(vkMapMemory(device(), handle(), 0 ,0, flags, &data) == VK_SUCCESS))
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800582 data = NULL;
583
584 return data;
585}
586
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800587void *DeviceMemory::map(VkFlags flags)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800588{
589 void *data;
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800590 if (!EXPECT(vkMapMemory(device(), handle(), 0, 0, flags, &data) == VK_SUCCESS))
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800591 data = NULL;
592
593 return data;
594}
595
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800596void DeviceMemory::unmap() const
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800597{
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800598 EXPECT(vkUnmapMemory(device(), handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800599}
600
Chia-I Wud9e8e822015-07-03 11:45:55 +0800601NON_DISPATCHABLE_HANDLE_DTOR(Fence, vkDestroyObject, VK_OBJECT_TYPE_FENCE)
602
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600603void Fence::init(const Device &dev, const VkFenceCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800604{
Chia-I Wud9e8e822015-07-03 11:45:55 +0800605 NON_DISPATCHABLE_HANDLE_INIT(vkCreateFence, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800606}
607
Chia-I Wu6b1c2482015-07-03 11:49:42 +0800608NON_DISPATCHABLE_HANDLE_DTOR(Semaphore, vkDestroyObject, VK_OBJECT_TYPE_SEMAPHORE)
609
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600610void Semaphore::init(const Device &dev, const VkSemaphoreCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800611{
Chia-I Wu6b1c2482015-07-03 11:49:42 +0800612 NON_DISPATCHABLE_HANDLE_INIT(vkCreateSemaphore, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800613}
614
Chia-I Wuc5c97992015-07-03 11:49:42 +0800615NON_DISPATCHABLE_HANDLE_DTOR(Event, vkDestroyObject, VK_OBJECT_TYPE_EVENT)
616
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600617void Event::init(const Device &dev, const VkEventCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800618{
Chia-I Wuc5c97992015-07-03 11:49:42 +0800619 NON_DISPATCHABLE_HANDLE_INIT(vkCreateEvent, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800620}
621
622void Event::set()
623{
Chia-I Wuc5c97992015-07-03 11:49:42 +0800624 EXPECT(vkSetEvent(device(), handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800625}
626
627void Event::reset()
628{
Chia-I Wuc5c97992015-07-03 11:49:42 +0800629 EXPECT(vkResetEvent(device(), handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800630}
631
Chia-I Wu1b7d4762015-07-03 11:49:42 +0800632NON_DISPATCHABLE_HANDLE_DTOR(QueryPool, vkDestroyObject, VK_OBJECT_TYPE_QUERY_POOL)
633
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600634void QueryPool::init(const Device &dev, const VkQueryPoolCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800635{
Chia-I Wu1b7d4762015-07-03 11:49:42 +0800636 NON_DISPATCHABLE_HANDLE_INIT(vkCreateQueryPool, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800637}
638
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600639VkResult QueryPool::results(uint32_t start, uint32_t count, size_t size, void *data)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800640{
641 size_t tmp = size;
Chia-I Wu1b7d4762015-07-03 11:49:42 +0800642 VkResult err = vkGetQueryPoolResults(device(), handle(), start, count, &tmp, data, 0);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600643 if (err == VK_SUCCESS) {
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800644 if (!EXPECT(tmp == size))
645 memset(data, 0, size);
646 } else {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600647 EXPECT(err == VK_NOT_READY);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800648 }
649
650 return err;
651}
652
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600653void Buffer::init(const Device &dev, const VkBufferCreateInfo &info)
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800654{
655 init_no_mem(dev, info);
Courtney Goeltzenleuchter30a39452015-04-22 10:02:41 -0600656 alloc_memory();
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800657}
658
Tony Barbour4c97d7a2015-04-22 15:10:33 -0600659void Buffer::init(const Device &dev, const VkBufferCreateInfo &info, VkMemoryPropertyFlags &reqs)
660{
661 init_no_mem(dev, info);
662 alloc_memory(reqs);
663}
664
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600665void Buffer::init_no_mem(const Device &dev, const VkBufferCreateInfo &info)
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800666{
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600667 DERIVED_OBJECT_TYPE_INIT(vkCreateBuffer, dev, VK_OBJECT_TYPE_BUFFER, &info);
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800668 create_info_ = info;
669}
670
Mark Lobodzinski23065352015-05-29 09:32:35 -0500671void Buffer::bind_memory(VkDeviceSize offset, VkDeviceSize size,
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800672 const DeviceMemory &mem, VkDeviceSize mem_offset)
Mark Lobodzinski942b1722015-05-11 17:21:15 -0500673{
Chia-I Wudf12ffd2015-07-03 10:53:18 +0800674 VkQueue queue = dev_->graphics_queues()[0]->handle();
Mark Lobodzinski16e8bef2015-07-03 15:58:09 -0600675 VkSparseMemoryBindInfo bindInfo;
676 memset(&bindInfo, 0, sizeof(VkSparseMemoryBindInfo));
677 bindInfo.offset = offset;
678 bindInfo.memOffset = mem_offset;
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800679 bindInfo.mem = mem.handle();
Mark Lobodzinski16e8bef2015-07-03 15:58:09 -0600680 EXPECT(vkQueueBindSparseBufferMemory(queue, obj(), 1, &bindInfo) == VK_SUCCESS);
Mark Lobodzinski942b1722015-05-11 17:21:15 -0500681}
682
Chia-I Wu3158bf32015-07-03 11:49:42 +0800683NON_DISPATCHABLE_HANDLE_DTOR(BufferView, vkDestroyObject, VK_OBJECT_TYPE_BUFFER_VIEW)
684
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600685void BufferView::init(const Device &dev, const VkBufferViewCreateInfo &info)
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800686{
Chia-I Wu3158bf32015-07-03 11:49:42 +0800687 NON_DISPATCHABLE_HANDLE_INIT(vkCreateBufferView, dev, &info);
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800688}
689
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600690void Image::init(const Device &dev, const VkImageCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800691{
692 init_no_mem(dev, info);
Courtney Goeltzenleuchter30a39452015-04-22 10:02:41 -0600693 alloc_memory();
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800694}
695
Tony Barbour4c97d7a2015-04-22 15:10:33 -0600696void Image::init(const Device &dev, const VkImageCreateInfo &info, VkMemoryPropertyFlags &reqs)
697{
698 init_no_mem(dev, info);
699 alloc_memory(reqs);
700}
701
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600702void Image::init_no_mem(const Device &dev, const VkImageCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800703{
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600704 DERIVED_OBJECT_TYPE_INIT(vkCreateImage, dev, VK_OBJECT_TYPE_IMAGE, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800705 init_info(dev, info);
706}
707
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600708void Image::init_info(const Device &dev, const VkImageCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800709{
710 create_info_ = info;
711
712 for (std::vector<Device::Format>::const_iterator it = dev.formats().begin(); it != dev.formats().end(); it++) {
713 if (memcmp(&it->format, &create_info_.format, sizeof(it->format)) == 0 && it->tiling == create_info_.tiling) {
714 format_features_ = it->features;
715 break;
716 }
717 }
718}
719
Mark Lobodzinski16e8bef2015-07-03 15:58:09 -0600720void Image::bind_memory(const Device &dev, const VkSparseImageMemoryBindInfo &info,
Chia-I Wuf8f074f2015-07-03 10:58:57 +0800721 const DeviceMemory &mem, VkDeviceSize mem_offset)
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800722{
Chia-I Wudf12ffd2015-07-03 10:53:18 +0800723 VkQueue queue = dev.graphics_queues()[0]->handle();
Mark Lobodzinski16e8bef2015-07-03 15:58:09 -0600724 EXPECT(vkQueueBindSparseImageMemory(queue, obj(), 1, &info) == VK_SUCCESS);
Chia-I Wu1a28fe02015-01-01 07:55:04 +0800725}
726
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600727VkSubresourceLayout Image::subresource_layout(const VkImageSubresource &subres) const
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800728{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600729 VkSubresourceLayout data;
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800730 size_t size = sizeof(data);
Chia-I Wuf368b602015-07-03 10:41:20 +0800731 if (!EXPECT(vkGetImageSubresourceLayout(dev_->handle(), obj(), &subres, &data) == VK_SUCCESS && size == sizeof(data)))
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800732 memset(&data, 0, sizeof(data));
733
734 return data;
735}
736
737bool Image::transparent() const
738{
Tony Barbourd1c35722015-04-16 15:59:00 -0600739 return (create_info_.tiling == VK_IMAGE_TILING_LINEAR &&
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800740 create_info_.samples == 1 &&
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600741 !(create_info_.usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
742 VK_IMAGE_USAGE_DEPTH_STENCIL_BIT)));
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800743}
744
Chia-I Wu3158bf32015-07-03 11:49:42 +0800745NON_DISPATCHABLE_HANDLE_DTOR(ImageView, vkDestroyObject, VK_OBJECT_TYPE_IMAGE_VIEW)
746
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600747void ImageView::init(const Device &dev, const VkImageViewCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800748{
Chia-I Wu3158bf32015-07-03 11:49:42 +0800749 NON_DISPATCHABLE_HANDLE_INIT(vkCreateImageView, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800750}
751
Chia-I Wu3158bf32015-07-03 11:49:42 +0800752NON_DISPATCHABLE_HANDLE_DTOR(AttachmentView, vkDestroyObject, VK_OBJECT_TYPE_ATTACHMENT_VIEW)
753
Chia-I Wu08accc62015-07-07 11:50:03 +0800754void AttachmentView::init(const Device &dev, const VkAttachmentViewCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800755{
Chia-I Wu3158bf32015-07-03 11:49:42 +0800756 NON_DISPATCHABLE_HANDLE_INIT(vkCreateAttachmentView, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800757}
758
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800759NON_DISPATCHABLE_HANDLE_DTOR(ShaderModule, vkDestroyObject, VK_OBJECT_TYPE_SHADER_MODULE)
760
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600761void ShaderModule::init(const Device &dev, const VkShaderModuleCreateInfo &info)
762{
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800763 NON_DISPATCHABLE_HANDLE_INIT(vkCreateShaderModule, dev, &info);
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600764}
765
766VkResult ShaderModule::init_try(const Device &dev, const VkShaderModuleCreateInfo &info)
767{
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800768 VkShaderModule mod;
769
770 VkResult err = vkCreateShaderModule(dev.handle(), &info, &mod);
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600771 if (err == VK_SUCCESS)
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800772 NonDispHandle::init(dev.handle(), mod);
Courtney Goeltzenleuchteree4027d2015-06-28 13:01:17 -0600773
774 return err;
775}
776
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800777NON_DISPATCHABLE_HANDLE_DTOR(Shader, vkDestroyObject, VK_OBJECT_TYPE_SHADER)
778
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600779void Shader::init(const Device &dev, const VkShaderCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800780{
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800781 NON_DISPATCHABLE_HANDLE_INIT(vkCreateShader, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800782}
783
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600784VkResult Shader::init_try(const Device &dev, const VkShaderCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800785{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600786 VkShader sh;
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800787
Chia-I Wuf368b602015-07-03 10:41:20 +0800788 VkResult err = vkCreateShader(dev.handle(), &info, &sh);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600789 if (err == VK_SUCCESS)
Chia-I Wu4d0c7922015-07-03 11:49:42 +0800790 NonDispHandle::init(dev.handle(), sh);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800791
792 return err;
793}
794
Chia-I Wu2ff72fd2015-07-03 11:49:42 +0800795NON_DISPATCHABLE_HANDLE_DTOR(Pipeline, vkDestroyObject, VK_OBJECT_TYPE_PIPELINE)
796
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600797void Pipeline::init(const Device &dev, const VkGraphicsPipelineCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800798{
Jon Ashburnc669cc62015-07-09 15:02:25 -0600799 VkPipelineCache cache;
800 VkPipelineCacheCreateInfo ci;
801 memset((void *) &ci, 0, sizeof(VkPipelineCacheCreateInfo));
802 ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Chia-I Wuf368b602015-07-03 10:41:20 +0800803 VkResult err = vkCreatePipelineCache(dev.handle(), &ci, &cache);
Jon Ashburnc669cc62015-07-09 15:02:25 -0600804 if (err == VK_SUCCESS) {
Chia-I Wu2ff72fd2015-07-03 11:49:42 +0800805 NON_DISPATCHABLE_HANDLE_INIT(vkCreateGraphicsPipelines, dev, cache, 1, &info);
Chia-I Wuf368b602015-07-03 10:41:20 +0800806 vkDestroyPipelineCache(dev.handle(), cache);
Jon Ashburnc669cc62015-07-09 15:02:25 -0600807 }
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800808}
809
Chris Forbes95292b12015-05-25 11:13:26 +1200810VkResult Pipeline::init_try(const Device &dev, const VkGraphicsPipelineCreateInfo &info)
811{
812 VkPipeline pipe;
Jon Ashburnc669cc62015-07-09 15:02:25 -0600813 VkPipelineCache cache;
814 VkPipelineCacheCreateInfo ci;
Jon Ashburnc669cc62015-07-09 15:02:25 -0600815 memset((void *) &ci, 0, sizeof(VkPipelineCacheCreateInfo));
816 ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Chia-I Wuf368b602015-07-03 10:41:20 +0800817 VkResult err = vkCreatePipelineCache(dev.handle(), &ci, &cache);
818 EXPECT(err == VK_SUCCESS);
Chris Forbes95292b12015-05-25 11:13:26 +1200819 if (err == VK_SUCCESS) {
Chia-I Wuf368b602015-07-03 10:41:20 +0800820 err = vkCreateGraphicsPipelines(dev.handle(), cache, 1, &info, &pipe);
Jon Ashburnc669cc62015-07-09 15:02:25 -0600821 if (err == VK_SUCCESS) {
Chia-I Wu2ff72fd2015-07-03 11:49:42 +0800822 NonDispHandle::init(dev.handle(), pipe);
Chia-I Wuf368b602015-07-03 10:41:20 +0800823 vkDestroyPipelineCache(dev.handle(), cache);
Jon Ashburnc669cc62015-07-09 15:02:25 -0600824 }
Chris Forbes95292b12015-05-25 11:13:26 +1200825 }
826
827 return err;
828}
829
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600830void Pipeline::init(const Device &dev, const VkComputePipelineCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800831{
Jon Ashburnc669cc62015-07-09 15:02:25 -0600832 VkPipelineCache cache;
833 VkPipelineCacheCreateInfo ci;
834 memset((void *) &ci, 0, sizeof(VkPipelineCacheCreateInfo));
835 ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Chia-I Wuf368b602015-07-03 10:41:20 +0800836 VkResult err = vkCreatePipelineCache(dev.handle(), &ci, &cache);
Jon Ashburnc669cc62015-07-09 15:02:25 -0600837 if (err == VK_SUCCESS) {
Chia-I Wu2ff72fd2015-07-03 11:49:42 +0800838 NON_DISPATCHABLE_HANDLE_INIT(vkCreateComputePipelines, dev, cache, 1, &info);
Chia-I Wuf368b602015-07-03 10:41:20 +0800839 vkDestroyPipelineCache(dev.handle(), cache);
Jon Ashburnc669cc62015-07-09 15:02:25 -0600840 }
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800841}
842
Chia-I Wufd46e7d2015-07-03 11:49:42 +0800843NON_DISPATCHABLE_HANDLE_DTOR(PipelineLayout, vkDestroyObject, VK_OBJECT_TYPE_PIPELINE_LAYOUT)
844
845void PipelineLayout::init(const Device &dev, VkPipelineLayoutCreateInfo &info, const std::vector<const DescriptorSetLayout *> &layouts)
846{
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800847 const std::vector<VkDescriptorSetLayout> layout_handles = make_handles<VkDescriptorSetLayout>(layouts);
848 info.pSetLayouts = &layout_handles[0];
Chia-I Wufd46e7d2015-07-03 11:49:42 +0800849
850 NON_DISPATCHABLE_HANDLE_INIT(vkCreatePipelineLayout, dev, &info);
851}
852
Chia-I Wu8c721c62015-07-03 11:49:42 +0800853NON_DISPATCHABLE_HANDLE_DTOR(Sampler, vkDestroyObject, VK_OBJECT_TYPE_SAMPLER)
854
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600855void Sampler::init(const Device &dev, const VkSamplerCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800856{
Chia-I Wu8c721c62015-07-03 11:49:42 +0800857 NON_DISPATCHABLE_HANDLE_INIT(vkCreateSampler, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800858}
859
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800860NON_DISPATCHABLE_HANDLE_DTOR(DescriptorSetLayout, vkDestroyObject, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
861
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600862void DescriptorSetLayout::init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800863{
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800864 NON_DISPATCHABLE_HANDLE_INIT(vkCreateDescriptorSetLayout, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800865}
866
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800867NON_DISPATCHABLE_HANDLE_DTOR(DescriptorPool, vkDestroyObject, VK_OBJECT_TYPE_DESCRIPTOR_POOL)
868
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600869void DescriptorPool::init(const Device &dev, VkDescriptorPoolUsage usage,
870 uint32_t max_sets, const VkDescriptorPoolCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800871{
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800872 NON_DISPATCHABLE_HANDLE_INIT(vkCreateDescriptorPool, dev, usage, max_sets, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800873}
874
Chia-I Wufae40bc2015-03-26 15:23:52 +0800875void DescriptorPool::reset()
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800876{
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800877 EXPECT(vkResetDescriptorPool(device(), handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800878}
879
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500880std::vector<DescriptorSet *> DescriptorPool::alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const std::vector<const DescriptorSetLayout *> &layouts)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800881{
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800882 const std::vector<VkDescriptorSetLayout> layout_handles = make_handles<VkDescriptorSetLayout>(layouts);
Chia-I Wu11078b02015-01-04 16:27:24 +0800883
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800884 std::vector<VkDescriptorSet> set_handles;
885 set_handles.resize(layout_handles.size());
Chia-I Wu11078b02015-01-04 16:27:24 +0800886
887 uint32_t set_count;
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800888 VkResult err = vkAllocDescriptorSets(device(), handle(), usage, layout_handles.size(), &layout_handles[0], &set_handles[0], &set_count);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600889 if (err == VK_SUCCESS)
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800890 EXPECT(set_count == set_handles.size());
891 set_handles.resize(set_count);
Chia-I Wu11078b02015-01-04 16:27:24 +0800892
893 std::vector<DescriptorSet *> sets;
894 sets.reserve(set_count);
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800895 for (std::vector<VkDescriptorSet>::const_iterator it = set_handles.begin(); it != set_handles.end(); it++) {
Chia-I Wu11078b02015-01-04 16:27:24 +0800896 // do descriptor sets need memories bound?
Courtney Goeltzenleuchter992fb4f2015-04-19 19:07:33 -0600897 DescriptorSet *descriptorSet = new DescriptorSet(dev, *it);
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500898 sets.push_back(descriptorSet);
Chia-I Wu11078b02015-01-04 16:27:24 +0800899 }
Chia-I Wu11078b02015-01-04 16:27:24 +0800900 return sets;
901}
902
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500903std::vector<DescriptorSet *> DescriptorPool::alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const DescriptorSetLayout &layout, uint32_t count)
Chia-I Wu11078b02015-01-04 16:27:24 +0800904{
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500905 return alloc_sets(dev, usage, std::vector<const DescriptorSetLayout *>(count, &layout));
Chia-I Wu11078b02015-01-04 16:27:24 +0800906}
907
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500908DescriptorSet *DescriptorPool::alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const DescriptorSetLayout &layout)
Chia-I Wu11078b02015-01-04 16:27:24 +0800909{
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500910 std::vector<DescriptorSet *> set = alloc_sets(dev, usage, layout, 1);
Chia-I Wu11078b02015-01-04 16:27:24 +0800911 return (set.empty()) ? NULL : set[0];
912}
913
Chia-I Wuafdfd7f2015-07-03 11:49:42 +0800914NON_DISPATCHABLE_HANDLE_DTOR(DescriptorSet, vkDestroyObject, VK_OBJECT_TYPE_DESCRIPTOR_SET)
915
Chia-I Wubc4a5542015-07-03 11:49:42 +0800916NON_DISPATCHABLE_HANDLE_DTOR(DynamicViewportState, vkDestroyObject, VK_OBJECT_TYPE_DYNAMIC_VP_STATE)
917
918void DynamicViewportState::init(const Device &dev, const VkDynamicVpStateCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800919{
Chia-I Wubc4a5542015-07-03 11:49:42 +0800920 NON_DISPATCHABLE_HANDLE_INIT(vkCreateDynamicViewportState, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800921}
922
Chia-I Wubc4a5542015-07-03 11:49:42 +0800923NON_DISPATCHABLE_HANDLE_DTOR(DynamicRasterState, vkDestroyObject, VK_OBJECT_TYPE_DYNAMIC_RS_STATE)
924
925void DynamicRasterState::init(const Device &dev, const VkDynamicRsStateCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800926{
Chia-I Wubc4a5542015-07-03 11:49:42 +0800927 NON_DISPATCHABLE_HANDLE_INIT(vkCreateDynamicRasterState, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800928}
929
Chia-I Wubc4a5542015-07-03 11:49:42 +0800930NON_DISPATCHABLE_HANDLE_DTOR(DynamicColorBlendState, vkDestroyObject, VK_OBJECT_TYPE_DYNAMIC_CB_STATE)
931
932void DynamicColorBlendState::init(const Device &dev, const VkDynamicCbStateCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800933{
Chia-I Wubc4a5542015-07-03 11:49:42 +0800934 NON_DISPATCHABLE_HANDLE_INIT(vkCreateDynamicColorBlendState, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800935}
936
Chia-I Wubc4a5542015-07-03 11:49:42 +0800937NON_DISPATCHABLE_HANDLE_DTOR(DynamicDepthStencilState, vkDestroyObject, VK_OBJECT_TYPE_DYNAMIC_DS_STATE)
938
939void DynamicDepthStencilState::init(const Device &dev, const VkDynamicDsStateCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800940{
Chia-I Wubc4a5542015-07-03 11:49:42 +0800941 NON_DISPATCHABLE_HANDLE_INIT(vkCreateDynamicDepthStencilState, dev, &info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800942}
943
Chia-I Wube2b9172015-07-03 11:49:42 +0800944CmdBuffer::~CmdBuffer()
945{
946 if (initialized())
947 EXPECT(vkDestroyObject(dev_handle_, VK_OBJECT_TYPE_COMMAND_BUFFER, handle()) == VK_SUCCESS);
948}
949
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600950void CmdBuffer::init(const Device &dev, const VkCmdBufferCreateInfo &info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800951{
Chia-I Wube2b9172015-07-03 11:49:42 +0800952 VkCmdBuffer cmd;
953
954 if (EXPECT(vkCreateCommandBuffer(dev.handle(), &info, &cmd) == VK_SUCCESS)) {
955 Handle::init(cmd);
956 dev_handle_ = dev.handle();
957 }
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800958}
959
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600960void CmdBuffer::begin(const VkCmdBufferBeginInfo *info)
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800961{
Chia-I Wube2b9172015-07-03 11:49:42 +0800962 EXPECT(vkBeginCommandBuffer(handle(), info) == VK_SUCCESS);
Jeremy Hayesd65ae082015-01-14 16:17:08 -0700963}
964
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800965void CmdBuffer::begin()
966{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600967 VkCmdBufferBeginInfo info = {};
Tony Barbourd1c35722015-04-16 15:59:00 -0600968 info.flags = VK_CMD_BUFFER_OPTIMIZE_SMALL_BATCH_BIT |
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600969 VK_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT;
970 info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO;
Jeremy Hayesd65ae082015-01-14 16:17:08 -0700971
972 begin(&info);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800973}
974
975void CmdBuffer::end()
976{
Chia-I Wube2b9172015-07-03 11:49:42 +0800977 EXPECT(vkEndCommandBuffer(handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800978}
979
980void CmdBuffer::reset()
981{
Chia-I Wube2b9172015-07-03 11:49:42 +0800982 EXPECT(vkResetCommandBuffer(handle()) == VK_SUCCESS);
Chia-I Wuf1e2e992014-12-27 14:12:52 +0800983}
984
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600985}; // namespace vk_testing