blob: abfaca47e552c2cb6cc4ed7fe04c889d97f5d226 [file] [log] [blame]
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001// VK tests
Chia-I Wu82bff272014-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 Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060025#include "vktestbinding.h"
Chia-I Wu82bff272014-12-27 14:12:52 +080026
27namespace {
Chia-I Wu82bff272014-12-27 14:12:52 +080028#define DERIVED_OBJECT_INIT(create_func, ...) \
29 do { \
30 obj_type obj; \
Mark Lobodzinskicf26e072015-04-16 11:44:05 -050031 if (EXPECT(create_func(__VA_ARGS__, &obj) == VK_SUCCESS)) \
Chia-I Wu82bff272014-12-27 14:12:52 +080032 base_type::init(obj); \
33 } while (0)
34
35#define STRINGIFY(x) #x
36#define EXPECT(expr) ((expr) ? true : expect_failure(STRINGIFY(expr), __FILE__, __LINE__, __FUNCTION__))
Mark Lobodzinskicf26e072015-04-16 11:44:05 -050037#define DEV_INIT(device) dev_ = &device;
38
39
Chia-I Wu82bff272014-12-27 14:12:52 +080040
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060041vk_testing::ErrorCallback error_callback;
Chia-I Wu82bff272014-12-27 14:12:52 +080042
43bool expect_failure(const char *expr, const char *file, unsigned int line, const char *function)
44{
45 if (error_callback) {
46 error_callback(expr, file, line, function);
47 } else {
48 std::cerr << file << ":" << line << ": " << function <<
49 ": Expectation `" << expr << "' failed.\n";
50 }
51
52 return false;
53}
54
55template<class T, class S>
56std::vector<T> make_objects(const std::vector<S> &v)
57{
58 std::vector<T> objs;
59 objs.reserve(v.size());
60 for (typename std::vector<S>::const_iterator it = v.begin(); it != v.end(); it++)
61 objs.push_back((*it)->obj());
62 return objs;
63}
64
65template<typename T>
Tony Barbour8205d902015-04-16 15:59:00 -060066std::vector<T> get_info(VkPhysicalDevice gpu, VkPhysicalDeviceInfoType type, size_t min_elems)
Chia-I Wu82bff272014-12-27 14:12:52 +080067{
68 std::vector<T> info;
Jon Ashburn23bd3822015-02-11 09:36:41 -070069 size_t size;
Tony Barbour8205d902015-04-16 15:59:00 -060070 if (EXPECT(vkGetPhysicalDeviceInfo(gpu, type, &size, NULL) == VK_SUCCESS && size % sizeof(T) == 0)) {
Chia-I Wu82bff272014-12-27 14:12:52 +080071 info.resize(size / sizeof(T));
Tony Barbour8205d902015-04-16 15:59:00 -060072 if (!EXPECT(vkGetPhysicalDeviceInfo(gpu, type, &size, &info[0]) == VK_SUCCESS && size == info.size() * sizeof(T)))
Chia-I Wu82bff272014-12-27 14:12:52 +080073 info.clear();
74 }
75
76 if (info.size() < min_elems)
77 info.resize(min_elems);
78
79 return info;
80}
81
82template<typename T>
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060083std::vector<T> get_info(VkBaseObject obj, VkObjectInfoType type, size_t min_elems)
Chia-I Wu82bff272014-12-27 14:12:52 +080084{
85 std::vector<T> info;
Jon Ashburn23bd3822015-02-11 09:36:41 -070086 size_t size;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060087 if (EXPECT(vkGetObjectInfo(obj, type, &size, NULL) == VK_SUCCESS && size % sizeof(T) == 0)) {
Chia-I Wu82bff272014-12-27 14:12:52 +080088 info.resize(size / sizeof(T));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060089 if (!EXPECT(vkGetObjectInfo(obj, type, &size, &info[0]) == VK_SUCCESS && size == info.size() * sizeof(T)))
Chia-I Wu82bff272014-12-27 14:12:52 +080090 info.clear();
91 }
92
93 if (info.size() < min_elems)
94 info.resize(min_elems);
95
96 return info;
97}
98
99} // namespace
100
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600101namespace vk_testing {
Chia-I Wu82bff272014-12-27 14:12:52 +0800102
103void set_error_callback(ErrorCallback callback)
104{
105 error_callback = callback;
106}
107
Tony Barbour8205d902015-04-16 15:59:00 -0600108VkPhysicalDeviceProperties PhysicalGpu::properties() const
Chia-I Wu82bff272014-12-27 14:12:52 +0800109{
Tony Barbour8205d902015-04-16 15:59:00 -0600110 return get_info<VkPhysicalDeviceProperties>(gpu_, VK_PHYSICAL_DEVICE_INFO_TYPE_PROPERTIES, 1)[0];
Chia-I Wu82bff272014-12-27 14:12:52 +0800111}
112
Tony Barbour8205d902015-04-16 15:59:00 -0600113VkPhysicalDevicePerformance PhysicalGpu::performance() const
Chia-I Wu82bff272014-12-27 14:12:52 +0800114{
Tony Barbour8205d902015-04-16 15:59:00 -0600115 return get_info<VkPhysicalDevicePerformance>(gpu_, VK_PHYSICAL_DEVICE_INFO_TYPE_PERFORMANCE, 1)[0];
Chia-I Wu82bff272014-12-27 14:12:52 +0800116}
117
Tony Barbour8205d902015-04-16 15:59:00 -0600118std::vector<VkPhysicalDeviceQueueProperties> PhysicalGpu::queue_properties() const
Chia-I Wu82bff272014-12-27 14:12:52 +0800119{
Tony Barbour8205d902015-04-16 15:59:00 -0600120 return get_info<VkPhysicalDeviceQueueProperties>(gpu_, VK_PHYSICAL_DEVICE_INFO_TYPE_QUEUE_PROPERTIES, 0);
Chia-I Wu82bff272014-12-27 14:12:52 +0800121}
122
Tony Barbour8205d902015-04-16 15:59:00 -0600123VkPhysicalDeviceMemoryProperties PhysicalGpu::memory_properties() const
Chia-I Wu82bff272014-12-27 14:12:52 +0800124{
Tony Barbour8205d902015-04-16 15:59:00 -0600125 return get_info<VkPhysicalDeviceMemoryProperties>(gpu_, VK_PHYSICAL_DEVICE_INFO_TYPE_MEMORY_PROPERTIES, 1)[0];
Chia-I Wu82bff272014-12-27 14:12:52 +0800126}
127
128std::vector<const char *> PhysicalGpu::layers(std::vector<char> &buf) const
129{
130 const size_t max_layer_count = 16;
131 const size_t max_string_size = 256;
132
133 buf.resize(max_layer_count * max_string_size);
134
135 std::vector<const char *> layers;
136 layers.reserve(max_layer_count);
137 for (size_t i = 0; i < max_layer_count; i++)
138 layers.push_back(&buf[0] + max_string_size * i);
139
140 char * const *out = const_cast<char * const *>(&layers[0]);
141 size_t count;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600142 if (!EXPECT(vkEnumerateLayers(gpu_, max_layer_count, max_string_size, &count, out, NULL) == VK_SUCCESS))
Chia-I Wu82bff272014-12-27 14:12:52 +0800143 count = 0;
144 layers.resize(count);
145
146 return layers;
147}
148
149std::vector<const char *> PhysicalGpu::extensions() const
150{
Tobin Ehlis3536b442015-04-16 18:04:57 -0600151 // Extensions to enable
Chia-I Wu82bff272014-12-27 14:12:52 +0800152 static const char *known_exts[] = {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600153 "VK_WSI_X11",
Chia-I Wu82bff272014-12-27 14:12:52 +0800154 };
Chia-I Wu82bff272014-12-27 14:12:52 +0800155 std::vector<const char *> exts;
Tobin Ehlis3536b442015-04-16 18:04:57 -0600156 size_t extSize = sizeof(uint32_t);
157 uint32_t extCount = 0;
158 if (!EXPECT(vkGetGlobalExtensionInfo(VK_EXTENSION_INFO_TYPE_COUNT, 0, &extSize, &extCount) == VK_SUCCESS))
159 return exts;
160
161 VkExtensionProperties extProp;
162 extSize = sizeof(VkExtensionProperties);
163 // TODO : Need to update this if/when we have more than 1 extension to enable
164 for (uint32_t i = 0; i < extCount; i++) {
165 if (!EXPECT(vkGetGlobalExtensionInfo(VK_EXTENSION_INFO_TYPE_PROPERTIES, i, &extSize, &extProp) == VK_SUCCESS))
166 return exts;
167
168 if (!strcmp(known_exts[0], extProp.extName))
169 exts.push_back(known_exts[i]);
Chia-I Wu82bff272014-12-27 14:12:52 +0800170 }
171
172 return exts;
173}
174
Tony Barbour8205d902015-04-16 15:59:00 -0600175VkPhysicalDeviceCompatibilityInfo PhysicalGpu::compatibility(const PhysicalGpu &other) const
Chia-I Wu82bff272014-12-27 14:12:52 +0800176{
Tony Barbour8205d902015-04-16 15:59:00 -0600177 VkPhysicalDeviceCompatibilityInfo data;
178 if (!EXPECT(vkGetMultiDeviceCompatibility(gpu_, other.gpu_, &data) == VK_SUCCESS))
Chia-I Wu82bff272014-12-27 14:12:52 +0800179 memset(&data, 0, sizeof(data));
180
181 return data;
182}
183
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600184void BaseObject::init(VkBaseObject obj, bool own)
Chia-I Wu82bff272014-12-27 14:12:52 +0800185{
186 EXPECT(!initialized());
187 reinit(obj, own);
188}
189
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600190void BaseObject::reinit(VkBaseObject obj, bool own)
Chia-I Wu82bff272014-12-27 14:12:52 +0800191{
192 obj_ = obj;
193 own_obj_ = own;
194}
195
196uint32_t BaseObject::memory_allocation_count() const
197{
Tony Barbour8205d902015-04-16 15:59:00 -0600198 return get_info<uint32_t>(obj_, VK_OBJECT_INFO_TYPE_MEMORY_ALLOCATION_COUNT, 1)[0];
Chia-I Wu82bff272014-12-27 14:12:52 +0800199}
200
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600201std::vector<VkMemoryRequirements> BaseObject::memory_requirements() const
Chia-I Wu82bff272014-12-27 14:12:52 +0800202{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600203 VkResult err;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600204 uint32_t num_allocations = 0;
205 size_t num_alloc_size = sizeof(num_allocations);
Tony Barbour8205d902015-04-16 15:59:00 -0600206 err = vkGetObjectInfo(obj_, VK_OBJECT_INFO_TYPE_MEMORY_ALLOCATION_COUNT,
Jon Ashburna9ae3832015-01-16 09:37:43 -0700207 &num_alloc_size, &num_allocations);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600208 EXPECT(err == VK_SUCCESS && num_alloc_size == sizeof(num_allocations));
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600209 std::vector<VkMemoryRequirements> info =
Tony Barbour8205d902015-04-16 15:59:00 -0600210 get_info<VkMemoryRequirements>(obj_, VK_OBJECT_INFO_TYPE_MEMORY_REQUIREMENTS, 0);
Jon Ashburna9ae3832015-01-16 09:37:43 -0700211 EXPECT(info.size() == num_allocations);
Chia-I Wu82bff272014-12-27 14:12:52 +0800212 if (info.size() == 1 && !info[0].size)
213 info.clear();
214
215 return info;
216}
217
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600218void Object::init(VkObject obj, bool own)
Chia-I Wu82bff272014-12-27 14:12:52 +0800219{
220 BaseObject::init(obj, own);
221 mem_alloc_count_ = memory_allocation_count();
222}
223
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600224void Object::reinit(VkObject obj, bool own)
Chia-I Wu82bff272014-12-27 14:12:52 +0800225{
226 cleanup();
227 BaseObject::reinit(obj, own);
228 mem_alloc_count_ = memory_allocation_count();
229}
230
231void Object::cleanup()
232{
233 if (!initialized())
234 return;
235
Tony Barbour2b5fb342015-04-09 16:00:18 -0600236 if(bound) {
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500237 unbind_memory(*dev_);
Tony Barbour2b5fb342015-04-09 16:00:18 -0600238 }
Chia-I Wu82bff272014-12-27 14:12:52 +0800239
240 if (internal_mems_) {
241 delete[] internal_mems_;
242 internal_mems_ = NULL;
243 primary_mem_ = NULL;
244 }
245
246 mem_alloc_count_ = 0;
247
248 if (own())
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600249 EXPECT(vkDestroyObject(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800250}
251
Tony Barbour8205d902015-04-16 15:59:00 -0600252void Object::bind_memory(const Device &dev, uint32_t alloc_idx, const GpuMemory &mem, VkDeviceSize mem_offset)
Chia-I Wu82bff272014-12-27 14:12:52 +0800253{
Tony Barbour2b5fb342015-04-09 16:00:18 -0600254 bound = true;
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500255 VkQueue queue = dev.graphics_queues()[0]->obj();
256 EXPECT(vkQueueBindObjectMemory(queue, obj(), alloc_idx, mem.obj(), mem_offset) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800257}
258
Tony Barbour8205d902015-04-16 15:59:00 -0600259void Object::bind_memory(const Device &dev, uint32_t alloc_idx, VkDeviceSize offset, VkDeviceSize size,
260 const GpuMemory &mem, VkDeviceSize mem_offset)
Chia-I Wu714df452015-01-01 07:55:04 +0800261{
Tony Barbour2b5fb342015-04-09 16:00:18 -0600262 bound = true;
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500263 VkQueue queue = dev.graphics_queues()[0]->obj();
264 EXPECT(!alloc_idx && vkQueueBindObjectMemoryRange(queue, obj(), 0, offset, size, mem.obj(), mem_offset) == VK_SUCCESS);
Chia-I Wu714df452015-01-01 07:55:04 +0800265}
266
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500267void Object::unbind_memory(const Device &dev, uint32_t alloc_idx)
Chia-I Wu82bff272014-12-27 14:12:52 +0800268{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500269 VkQueue queue = dev.graphics_queues()[0]->obj();
270 EXPECT(vkQueueBindObjectMemory(queue, obj(), alloc_idx, VK_NULL_HANDLE, 0) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800271}
272
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500273void Object::unbind_memory(const Device &dev)
Chia-I Wu82bff272014-12-27 14:12:52 +0800274{
275 for (uint32_t i = 0; i < mem_alloc_count_; i++)
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500276 unbind_memory(dev, i);
Chia-I Wu82bff272014-12-27 14:12:52 +0800277}
278
Mark Lobodzinski97dcd042015-04-16 08:52:00 -0500279void Object::alloc_memory(const Device &dev)
Chia-I Wu82bff272014-12-27 14:12:52 +0800280{
281 if (!EXPECT(!internal_mems_) || !mem_alloc_count_)
282 return;
283
284 internal_mems_ = new GpuMemory[mem_alloc_count_];
285
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600286 const std::vector<VkMemoryRequirements> mem_reqs = memory_requirements();
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600287 VkMemoryAllocInfo info, *next_info = NULL;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700288
Chia-I Wu82bff272014-12-27 14:12:52 +0800289 for (int i = 0; i < mem_reqs.size(); i++) {
Jon Ashburn5567c812015-01-20 08:50:12 -0700290 info = GpuMemory::alloc_info(mem_reqs[i], next_info);
Mark Lobodzinski97dcd042015-04-16 08:52:00 -0500291 primary_mem_ = &internal_mems_[i];
Chia-I Wu82bff272014-12-27 14:12:52 +0800292 internal_mems_[i].init(dev, info);
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500293 bind_memory(dev, i, internal_mems_[i], 0);
Chia-I Wu82bff272014-12-27 14:12:52 +0800294 }
295}
296
Tony Barbour8205d902015-04-16 15:59:00 -0600297void Object::alloc_memory(const Device &dev, const std::vector<VkDeviceMemory> &mems)
Chia-I Wu82bff272014-12-27 14:12:52 +0800298{
299 if (!EXPECT(!internal_mems_) || !mem_alloc_count_)
300 return;
301
302 internal_mems_ = new GpuMemory[mem_alloc_count_];
303
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600304 const std::vector<VkMemoryRequirements> mem_reqs = memory_requirements();
Chia-I Wu82bff272014-12-27 14:12:52 +0800305 if (!EXPECT(mem_reqs.size() == mems.size()))
306 return;
307
308 for (int i = 0; i < mem_reqs.size(); i++) {
309 primary_mem_ = &internal_mems_[i];
310
311 internal_mems_[i].init(mems[i]);
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500312 bind_memory(dev, i, internal_mems_[i], 0);
Chia-I Wu82bff272014-12-27 14:12:52 +0800313 }
314}
315
Tony Barbour8205d902015-04-16 15:59:00 -0600316std::vector<VkDeviceMemory> Object::memories() const
Chia-I Wu82bff272014-12-27 14:12:52 +0800317{
Tony Barbour8205d902015-04-16 15:59:00 -0600318 std::vector<VkDeviceMemory> mems;
Chia-I Wu82bff272014-12-27 14:12:52 +0800319 if (internal_mems_) {
320 mems.reserve(mem_alloc_count_);
321 for (uint32_t i = 0; i < mem_alloc_count_; i++)
322 mems.push_back(internal_mems_[i].obj());
323 }
324
325 return mems;
326}
327
328Device::~Device()
329{
330 if (!initialized())
331 return;
332
333 for (int i = 0; i < QUEUE_COUNT; i++) {
334 for (std::vector<Queue *>::iterator it = queues_[i].begin(); it != queues_[i].end(); it++)
335 delete *it;
336 queues_[i].clear();
337 }
338
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600339 EXPECT(vkDestroyDevice(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800340}
341
Chia-I Wu6c099222015-01-06 10:40:45 +0800342void Device::init(bool enable_layers)
Chia-I Wu82bff272014-12-27 14:12:52 +0800343{
344 // request all queues
Tony Barbour8205d902015-04-16 15:59:00 -0600345 const std::vector<VkPhysicalDeviceQueueProperties> queue_props = gpu_.queue_properties();
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600346 std::vector<VkDeviceQueueCreateInfo> queue_info;
Chia-I Wu82bff272014-12-27 14:12:52 +0800347 queue_info.reserve(queue_props.size());
348 for (int i = 0; i < queue_props.size(); i++) {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600349 VkDeviceQueueCreateInfo qi = {};
Chia-I Wu82bff272014-12-27 14:12:52 +0800350 qi.queueNodeIndex = i;
351 qi.queueCount = queue_props[i].queueCount;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600352 if (queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700353 graphics_queue_node_index_ = i;
354 }
Chia-I Wu82bff272014-12-27 14:12:52 +0800355 queue_info.push_back(qi);
356 }
357
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600358 VkLayerCreateInfo layer_info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600359 layer_info.sType = VK_STRUCTURE_TYPE_LAYER_CREATE_INFO;
Chia-I Wu6c099222015-01-06 10:40:45 +0800360
361 std::vector<const char *> layers;
362 std::vector<char> layer_buf;
363 // request all layers
364 if (enable_layers) {
365 layers = gpu_.layers(layer_buf);
366 layer_info.layerCount = layers.size();
367 layer_info.ppActiveLayerNames = &layers[0];
368 }
Chia-I Wu82bff272014-12-27 14:12:52 +0800369
370 const std::vector<const char *> exts = gpu_.extensions();
371
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600372 VkDeviceCreateInfo dev_info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600373 dev_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
Jon Ashburnca930582015-01-22 13:33:15 -0700374 dev_info.pNext = (enable_layers) ? static_cast<void *>(&layer_info) : NULL;
Chia-I Wu82bff272014-12-27 14:12:52 +0800375 dev_info.queueRecordCount = queue_info.size();
376 dev_info.pRequestedQueues = &queue_info[0];
377 dev_info.extensionCount = exts.size();
378 dev_info.ppEnabledExtensionNames = &exts[0];
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600379 dev_info.flags = VK_DEVICE_CREATE_VALIDATION_BIT;
Chia-I Wu82bff272014-12-27 14:12:52 +0800380
381 init(dev_info);
382}
383
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600384void Device::init(const VkDeviceCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800385{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600386 DERIVED_OBJECT_INIT(vkCreateDevice, gpu_.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800387
388 init_queues();
Chia-I Wu82bff272014-12-27 14:12:52 +0800389 init_formats();
390}
391
392void Device::init_queues()
393{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600394 VkResult err;
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700395 size_t data_size;
396 uint32_t queue_node_count;
Chia-I Wu82bff272014-12-27 14:12:52 +0800397
Tony Barbour8205d902015-04-16 15:59:00 -0600398 err = vkGetPhysicalDeviceInfo(gpu_.obj(), VK_PHYSICAL_DEVICE_INFO_TYPE_QUEUE_PROPERTIES,
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700399 &data_size, NULL);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600400 EXPECT(err == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800401
Tony Barbour8205d902015-04-16 15:59:00 -0600402 queue_node_count = data_size / sizeof(VkPhysicalDeviceQueueProperties);
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700403 EXPECT(queue_node_count >= 1);
404
Tony Barbour8205d902015-04-16 15:59:00 -0600405 VkPhysicalDeviceQueueProperties queue_props[queue_node_count];
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700406
Tony Barbour8205d902015-04-16 15:59:00 -0600407 err = vkGetPhysicalDeviceInfo(gpu_.obj(), VK_PHYSICAL_DEVICE_INFO_TYPE_QUEUE_PROPERTIES,
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700408 &data_size, queue_props);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600409 EXPECT(err == VK_SUCCESS);
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700410
411 for (int i = 0; i < queue_node_count; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600412 VkQueue queue;
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700413
414 for (int j = 0; j < queue_props[i].queueCount; j++) {
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500415 // TODO: Need to add support for separate MEMMGR and work queues, including synchronization
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600416 err = vkGetDeviceQueue(obj(), i, j, &queue);
417 EXPECT(err == VK_SUCCESS);
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700418
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600419 if (queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700420 queues_[GRAPHICS].push_back(new Queue(queue));
421 }
422
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600423 if (queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) {
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700424 queues_[COMPUTE].push_back(new Queue(queue));
425 }
426
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600427 if (queue_props[i].queueFlags & VK_QUEUE_DMA_BIT) {
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700428 queues_[DMA].push_back(new Queue(queue));
429 }
Chia-I Wu82bff272014-12-27 14:12:52 +0800430 }
431 }
432
433 EXPECT(!queues_[GRAPHICS].empty() || !queues_[COMPUTE].empty());
434}
435
Chia-I Wu82bff272014-12-27 14:12:52 +0800436void Device::init_formats()
437{
Tony Barbour8205d902015-04-16 15:59:00 -0600438 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600439 const VkFormat fmt = static_cast<VkFormat>(f);
440 const VkFormatProperties props = format_properties(fmt);
Chia-I Wu82bff272014-12-27 14:12:52 +0800441
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700442 if (props.linearTilingFeatures) {
Tony Barbour8205d902015-04-16 15:59:00 -0600443 const Format tmp = { fmt, VK_IMAGE_TILING_LINEAR, props.linearTilingFeatures };
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700444 formats_.push_back(tmp);
445 }
Chia-I Wu82bff272014-12-27 14:12:52 +0800446
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700447 if (props.optimalTilingFeatures) {
Tony Barbour8205d902015-04-16 15:59:00 -0600448 const Format tmp = { fmt, VK_IMAGE_TILING_OPTIMAL, props.optimalTilingFeatures };
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700449 formats_.push_back(tmp);
Chia-I Wu82bff272014-12-27 14:12:52 +0800450 }
451 }
452
453 EXPECT(!formats_.empty());
454}
455
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600456VkFormatProperties Device::format_properties(VkFormat format)
Chia-I Wu82bff272014-12-27 14:12:52 +0800457{
Tony Barbour8205d902015-04-16 15:59:00 -0600458 const VkFormatInfoType type = VK_FORMAT_INFO_TYPE_PROPERTIES;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600459 VkFormatProperties data;
Chia-I Wu82bff272014-12-27 14:12:52 +0800460 size_t size = sizeof(data);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600461 if (!EXPECT(vkGetFormatInfo(obj(), format, type, &size, &data) == VK_SUCCESS && size == sizeof(data)))
Chia-I Wu82bff272014-12-27 14:12:52 +0800462 memset(&data, 0, sizeof(data));
463
464 return data;
465}
466
467void Device::wait()
468{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600469 EXPECT(vkDeviceWaitIdle(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800470}
471
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600472VkResult Device::wait(const std::vector<const Fence *> &fences, bool wait_all, uint64_t timeout)
Chia-I Wu82bff272014-12-27 14:12:52 +0800473{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600474 const std::vector<VkFence> fence_objs = make_objects<VkFence>(fences);
475 VkResult err = vkWaitForFences(obj(), fence_objs.size(), &fence_objs[0], wait_all, timeout);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600476 EXPECT(err == VK_SUCCESS || err == VK_TIMEOUT);
Chia-I Wu82bff272014-12-27 14:12:52 +0800477
478 return err;
479}
480
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600481void Device::begin_descriptor_pool_update(VkDescriptorUpdateMode mode)
Chia-I Wuf8385062015-01-04 16:27:24 +0800482{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600483 EXPECT(vkBeginDescriptorPoolUpdate(obj(), mode) == VK_SUCCESS);
Chia-I Wuf8385062015-01-04 16:27:24 +0800484}
485
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800486void Device::end_descriptor_pool_update(CmdBuffer &cmd)
Chia-I Wuf8385062015-01-04 16:27:24 +0800487{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600488 EXPECT(vkEndDescriptorPoolUpdate(obj(), cmd.obj()) == VK_SUCCESS);
Chia-I Wuf8385062015-01-04 16:27:24 +0800489}
490
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600491void Queue::submit(const std::vector<const CmdBuffer *> &cmds, Fence &fence)
Chia-I Wu82bff272014-12-27 14:12:52 +0800492{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600493 const std::vector<VkCmdBuffer> cmd_objs = make_objects<VkCmdBuffer>(cmds);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600494 EXPECT(vkQueueSubmit(obj(), cmd_objs.size(), &cmd_objs[0], fence.obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800495}
496
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600497void Queue::submit(const CmdBuffer &cmd, Fence &fence)
Chia-I Wu82bff272014-12-27 14:12:52 +0800498{
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600499 submit(std::vector<const CmdBuffer*>(1, &cmd), fence);
Chia-I Wu82bff272014-12-27 14:12:52 +0800500}
501
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600502void Queue::submit(const CmdBuffer &cmd)
Chia-I Wu82bff272014-12-27 14:12:52 +0800503{
504 Fence fence;
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600505 submit(cmd, fence);
Chia-I Wu82bff272014-12-27 14:12:52 +0800506}
507
Tony Barbour8205d902015-04-16 15:59:00 -0600508void Queue::add_mem_references(const std::vector<VkDeviceMemory> &mem_refs)
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600509{
Courtney Goeltzenleuchter46962942015-04-16 13:38:46 -0600510 EXPECT(vkQueueAddMemReferences(obj(), mem_refs.size(), &mem_refs[0]) == VK_SUCCESS);
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600511}
512
Tony Barbour8205d902015-04-16 15:59:00 -0600513void Queue::remove_mem_references(const std::vector<VkDeviceMemory> &mem_refs)
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600514{
Courtney Goeltzenleuchter46962942015-04-16 13:38:46 -0600515 EXPECT(vkQueueRemoveMemReferences(obj(), mem_refs.size(), &mem_refs[0]) == VK_SUCCESS);
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600516}
Chia-I Wu82bff272014-12-27 14:12:52 +0800517
518void Queue::wait()
519{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600520 EXPECT(vkQueueWaitIdle(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800521}
522
Courtney Goeltzenleuchter0d2efef2015-03-25 17:14:29 -0600523void Queue::signal_semaphore(Semaphore &sem)
Chia-I Wu82bff272014-12-27 14:12:52 +0800524{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600525 EXPECT(vkQueueSignalSemaphore(obj(), sem.obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800526}
527
Courtney Goeltzenleuchter0d2efef2015-03-25 17:14:29 -0600528void Queue::wait_semaphore(Semaphore &sem)
Chia-I Wu82bff272014-12-27 14:12:52 +0800529{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600530 EXPECT(vkQueueWaitSemaphore(obj(), sem.obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800531}
532
533GpuMemory::~GpuMemory()
534{
535 if (initialized() && own())
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600536 EXPECT(vkFreeMemory(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800537}
538
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600539void GpuMemory::init(const Device &dev, const VkMemoryAllocInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800540{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600541 DERIVED_OBJECT_INIT(vkAllocMemory, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800542}
543
Chia-I Wu82bff272014-12-27 14:12:52 +0800544void GpuMemory::init(const Device &dev, size_t size, const void *data)
545{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600546 DERIVED_OBJECT_INIT(vkPinSystemMemory, dev.obj(), data, size);
Chia-I Wu82bff272014-12-27 14:12:52 +0800547}
548
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600549void GpuMemory::init(const Device &dev, const VkMemoryOpenInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800550{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600551 DERIVED_OBJECT_INIT(vkOpenSharedMemory, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800552}
553
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600554void GpuMemory::init(const Device &dev, const VkPeerMemoryOpenInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800555{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600556 DERIVED_OBJECT_INIT(vkOpenPeerMemory, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800557}
558
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600559void GpuMemory::set_priority(VkMemoryPriority priority)
Chia-I Wu82bff272014-12-27 14:12:52 +0800560{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600561 EXPECT(vkSetMemoryPriority(obj(), priority) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800562}
563
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600564const void *GpuMemory::map(VkFlags flags) const
Chia-I Wu82bff272014-12-27 14:12:52 +0800565{
566 void *data;
Tony Barbour3e3420a2015-04-16 19:09:28 -0600567 if (!EXPECT(vkMapMemory(obj(), 0 ,0, flags, &data) == VK_SUCCESS))
Chia-I Wu82bff272014-12-27 14:12:52 +0800568 data = NULL;
569
570 return data;
571}
572
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600573void *GpuMemory::map(VkFlags flags)
Chia-I Wu82bff272014-12-27 14:12:52 +0800574{
575 void *data;
Tony Barbour3e3420a2015-04-16 19:09:28 -0600576 if (!EXPECT(vkMapMemory(obj(), 0, 0, flags, &data) == VK_SUCCESS))
Chia-I Wu82bff272014-12-27 14:12:52 +0800577 data = NULL;
578
579 return data;
580}
581
582void GpuMemory::unmap() const
583{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600584 EXPECT(vkUnmapMemory(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800585}
586
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600587void Fence::init(const Device &dev, const VkFenceCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800588{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600589 DERIVED_OBJECT_INIT(vkCreateFence, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800590 alloc_memory(dev);
591}
592
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600593void Semaphore::init(const Device &dev, const VkSemaphoreCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800594{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500595 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600596 DERIVED_OBJECT_INIT(vkCreateSemaphore, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800597 alloc_memory(dev);
598}
599
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600600void Semaphore::init(const Device &dev, const VkSemaphoreOpenInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800601{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500602 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600603 DERIVED_OBJECT_INIT(vkOpenSharedSemaphore, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800604}
605
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600606void Event::init(const Device &dev, const VkEventCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800607{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500608 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600609 DERIVED_OBJECT_INIT(vkCreateEvent, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800610 alloc_memory(dev);
611}
612
613void Event::set()
614{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600615 EXPECT(vkSetEvent(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800616}
617
618void Event::reset()
619{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600620 EXPECT(vkResetEvent(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800621}
622
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600623void QueryPool::init(const Device &dev, const VkQueryPoolCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800624{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500625 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600626 DERIVED_OBJECT_INIT(vkCreateQueryPool, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800627 alloc_memory(dev);
628}
629
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600630VkResult QueryPool::results(uint32_t start, uint32_t count, size_t size, void *data)
Chia-I Wu82bff272014-12-27 14:12:52 +0800631{
632 size_t tmp = size;
Tony Barbour8205d902015-04-16 15:59:00 -0600633 VkResult err = vkGetQueryPoolResults(obj(), start, count, &tmp, data, 0);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600634 if (err == VK_SUCCESS) {
Chia-I Wu82bff272014-12-27 14:12:52 +0800635 if (!EXPECT(tmp == size))
636 memset(data, 0, size);
637 } else {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600638 EXPECT(err == VK_NOT_READY);
Chia-I Wu82bff272014-12-27 14:12:52 +0800639 }
640
641 return err;
642}
643
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600644void Buffer::init(const Device &dev, const VkBufferCreateInfo &info)
Chia-I Wu714df452015-01-01 07:55:04 +0800645{
646 init_no_mem(dev, info);
Mark Lobodzinski97dcd042015-04-16 08:52:00 -0500647 alloc_memory(dev);
Chia-I Wu714df452015-01-01 07:55:04 +0800648}
649
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600650void Buffer::init_no_mem(const Device &dev, const VkBufferCreateInfo &info)
Chia-I Wu714df452015-01-01 07:55:04 +0800651{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500652 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600653 DERIVED_OBJECT_INIT(vkCreateBuffer, dev.obj(), &info);
Chia-I Wu714df452015-01-01 07:55:04 +0800654 create_info_ = info;
655}
656
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600657void BufferView::init(const Device &dev, const VkBufferViewCreateInfo &info)
Chia-I Wu714df452015-01-01 07:55:04 +0800658{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600659 DERIVED_OBJECT_INIT(vkCreateBufferView, dev.obj(), &info);
Chia-I Wu714df452015-01-01 07:55:04 +0800660 alloc_memory(dev);
661}
662
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600663void Image::init(const Device &dev, const VkImageCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800664{
665 init_no_mem(dev, info);
Mark Lobodzinski97dcd042015-04-16 08:52:00 -0500666 alloc_memory(dev);
Chia-I Wu82bff272014-12-27 14:12:52 +0800667}
668
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600669void Image::init_no_mem(const Device &dev, const VkImageCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800670{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500671 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600672 DERIVED_OBJECT_INIT(vkCreateImage, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800673 init_info(dev, info);
674}
675
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600676void Image::init(const Device &dev, const VkPeerImageOpenInfo &info, const VkImageCreateInfo &original_info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800677{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600678 VkImage img;
Tony Barbour8205d902015-04-16 15:59:00 -0600679 VkDeviceMemory mem;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600680 EXPECT(vkOpenPeerImage(dev.obj(), &info, &img, &mem) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800681 Object::init(img);
682
683 init_info(dev, original_info);
Tony Barbour8205d902015-04-16 15:59:00 -0600684 alloc_memory(dev, std::vector<VkDeviceMemory>(1, mem));
Chia-I Wu82bff272014-12-27 14:12:52 +0800685}
686
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600687void Image::init_info(const Device &dev, const VkImageCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800688{
689 create_info_ = info;
690
691 for (std::vector<Device::Format>::const_iterator it = dev.formats().begin(); it != dev.formats().end(); it++) {
692 if (memcmp(&it->format, &create_info_.format, sizeof(it->format)) == 0 && it->tiling == create_info_.tiling) {
693 format_features_ = it->features;
694 break;
695 }
696 }
697}
698
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500699void Image::bind_memory(const Device &dev, uint32_t alloc_idx, const VkImageMemoryBindInfo &info,
Tony Barbour8205d902015-04-16 15:59:00 -0600700 const GpuMemory &mem, VkDeviceSize mem_offset)
Chia-I Wu714df452015-01-01 07:55:04 +0800701{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500702 VkQueue queue = dev.graphics_queues()[0]->obj();
703 EXPECT(!alloc_idx && vkQueueBindImageMemoryRange(queue, obj(), 0, &info, mem.obj(), mem_offset) == VK_SUCCESS);
Chia-I Wu714df452015-01-01 07:55:04 +0800704}
705
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600706VkSubresourceLayout Image::subresource_layout(const VkImageSubresource &subres) const
Chia-I Wu82bff272014-12-27 14:12:52 +0800707{
Tony Barbour8205d902015-04-16 15:59:00 -0600708 const VkSubresourceInfoType type = VK_SUBRESOURCE_INFO_TYPE_LAYOUT;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600709 VkSubresourceLayout data;
Chia-I Wu82bff272014-12-27 14:12:52 +0800710 size_t size = sizeof(data);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600711 if (!EXPECT(vkGetImageSubresourceInfo(obj(), &subres, type, &size, &data) == VK_SUCCESS && size == sizeof(data)))
Chia-I Wu82bff272014-12-27 14:12:52 +0800712 memset(&data, 0, sizeof(data));
713
714 return data;
715}
716
717bool Image::transparent() const
718{
Tony Barbour8205d902015-04-16 15:59:00 -0600719 return (create_info_.tiling == VK_IMAGE_TILING_LINEAR &&
Chia-I Wu82bff272014-12-27 14:12:52 +0800720 create_info_.samples == 1 &&
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600721 !(create_info_.usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
722 VK_IMAGE_USAGE_DEPTH_STENCIL_BIT)));
Chia-I Wu82bff272014-12-27 14:12:52 +0800723}
724
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600725void ImageView::init(const Device &dev, const VkImageViewCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800726{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600727 DERIVED_OBJECT_INIT(vkCreateImageView, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800728 alloc_memory(dev);
729}
730
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600731void ColorAttachmentView::init(const Device &dev, const VkColorAttachmentViewCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800732{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600733 DERIVED_OBJECT_INIT(vkCreateColorAttachmentView, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800734 alloc_memory(dev);
735}
736
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600737void DepthStencilView::init(const Device &dev, const VkDepthStencilViewCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800738{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600739 DERIVED_OBJECT_INIT(vkCreateDepthStencilView, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800740 alloc_memory(dev);
741}
742
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600743void Shader::init(const Device &dev, const VkShaderCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800744{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500745 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600746 DERIVED_OBJECT_INIT(vkCreateShader, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800747}
748
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600749VkResult Shader::init_try(const Device &dev, const VkShaderCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800750{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600751 VkShader sh;
752 VkResult err = vkCreateShader(dev.obj(), &info, &sh);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600753 if (err == VK_SUCCESS)
Chia-I Wu82bff272014-12-27 14:12:52 +0800754 Object::init(sh);
755
756 return err;
757}
758
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600759void Pipeline::init(const Device &dev, const VkGraphicsPipelineCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800760{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500761 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600762 DERIVED_OBJECT_INIT(vkCreateGraphicsPipeline, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800763 alloc_memory(dev);
764}
765
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -0600766void Pipeline::init(
767 const Device &dev,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600768 const VkGraphicsPipelineCreateInfo &info,
769 const VkPipeline basePipeline)
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -0600770{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500771 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600772 DERIVED_OBJECT_INIT(vkCreateGraphicsPipelineDerivative, dev.obj(), &info, basePipeline);
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -0600773 alloc_memory(dev);
774}
775
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600776void Pipeline::init(const Device &dev, const VkComputePipelineCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800777{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500778 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600779 DERIVED_OBJECT_INIT(vkCreateComputePipeline, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800780 alloc_memory(dev);
781}
782
783void Pipeline::init(const Device&dev, size_t size, const void *data)
784{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500785 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600786 DERIVED_OBJECT_INIT(vkLoadPipeline, dev.obj(), size, data);
Chia-I Wu82bff272014-12-27 14:12:52 +0800787 alloc_memory(dev);
788}
789
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -0600790void Pipeline::init(
791 const Device&dev,
792 size_t size,
793 const void *data,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600794 const VkPipeline basePipeline)
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -0600795{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500796 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600797 DERIVED_OBJECT_INIT(vkLoadPipelineDerivative, dev.obj(), size, data, basePipeline);
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -0600798 alloc_memory(dev);
799}
800
Chia-I Wu82bff272014-12-27 14:12:52 +0800801size_t Pipeline::store(size_t size, void *data)
802{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600803 if (!EXPECT(vkStorePipeline(obj(), &size, data) == VK_SUCCESS))
Chia-I Wu82bff272014-12-27 14:12:52 +0800804 size = 0;
805
806 return size;
807}
808
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600809void Sampler::init(const Device &dev, const VkSamplerCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800810{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500811 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600812 DERIVED_OBJECT_INIT(vkCreateSampler, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800813 alloc_memory(dev);
814}
815
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600816void DescriptorSetLayout::init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800817{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500818 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600819 DERIVED_OBJECT_INIT(vkCreateDescriptorSetLayout, dev.obj(), &info);
Chia-I Wuf8385062015-01-04 16:27:24 +0800820 alloc_memory(dev);
Chia-I Wu82bff272014-12-27 14:12:52 +0800821}
822
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500823void PipelineLayout::init(const Device &dev, VkPipelineLayoutCreateInfo &info, const std::vector<const DescriptorSetLayout *> &layouts)
Chia-I Wu82bff272014-12-27 14:12:52 +0800824{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500825 DEV_INIT(dev);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600826 const std::vector<VkDescriptorSetLayout> layout_objs = make_objects<VkDescriptorSetLayout>(layouts);
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500827 info.pSetLayouts = &layout_objs[0];
Chia-I Wu7732cb22015-03-26 15:27:55 +0800828
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500829 DERIVED_OBJECT_INIT(vkCreatePipelineLayout, dev.obj(), &info);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800830 alloc_memory(dev);
Chia-I Wu82bff272014-12-27 14:12:52 +0800831}
832
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600833void DescriptorPool::init(const Device &dev, VkDescriptorPoolUsage usage,
834 uint32_t max_sets, const VkDescriptorPoolCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800835{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500836 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600837 DERIVED_OBJECT_INIT(vkCreateDescriptorPool, dev.obj(), usage, max_sets, &info);
Chia-I Wuf8385062015-01-04 16:27:24 +0800838 alloc_memory(dev);
Chia-I Wu82bff272014-12-27 14:12:52 +0800839}
840
Chia-I Wudee95612015-03-26 15:23:52 +0800841void DescriptorPool::reset()
Chia-I Wu82bff272014-12-27 14:12:52 +0800842{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600843 EXPECT(vkResetDescriptorPool(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800844}
845
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500846std::vector<DescriptorSet *> DescriptorPool::alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const std::vector<const DescriptorSetLayout *> &layouts)
Chia-I Wu82bff272014-12-27 14:12:52 +0800847{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600848 const std::vector<VkDescriptorSetLayout> layout_objs = make_objects<VkDescriptorSetLayout>(layouts);
Chia-I Wuf8385062015-01-04 16:27:24 +0800849
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600850 std::vector<VkDescriptorSet> set_objs;
Chia-I Wuf8385062015-01-04 16:27:24 +0800851 set_objs.resize(layout_objs.size());
852
853 uint32_t set_count;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600854 VkResult err = vkAllocDescriptorSets(obj(), usage, layout_objs.size(), &layout_objs[0], &set_objs[0], &set_count);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600855 if (err == VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800856 EXPECT(set_count == set_objs.size());
857 set_objs.resize(set_count);
858
859 std::vector<DescriptorSet *> sets;
860 sets.reserve(set_count);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600861 for (std::vector<VkDescriptorSet>::const_iterator it = set_objs.begin(); it != set_objs.end(); it++) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800862 // do descriptor sets need memories bound?
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500863 DescriptorSet *descriptorSet = new DescriptorSet(*it);
864 descriptorSet->dev_ = &dev;
865 sets.push_back(descriptorSet);
Chia-I Wuf8385062015-01-04 16:27:24 +0800866 }
Chia-I Wuf8385062015-01-04 16:27:24 +0800867 return sets;
868}
869
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500870std::vector<DescriptorSet *> DescriptorPool::alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const DescriptorSetLayout &layout, uint32_t count)
Chia-I Wuf8385062015-01-04 16:27:24 +0800871{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500872 return alloc_sets(dev, usage, std::vector<const DescriptorSetLayout *>(count, &layout));
Chia-I Wuf8385062015-01-04 16:27:24 +0800873}
874
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500875DescriptorSet *DescriptorPool::alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const DescriptorSetLayout &layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800876{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500877 std::vector<DescriptorSet *> set = alloc_sets(dev, usage, layout, 1);
Chia-I Wuf8385062015-01-04 16:27:24 +0800878 return (set.empty()) ? NULL : set[0];
879}
880
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800881void DescriptorPool::clear_sets(const std::vector<DescriptorSet *> &sets)
Chia-I Wuf8385062015-01-04 16:27:24 +0800882{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600883 const std::vector<VkDescriptorSet> set_objs = make_objects<VkDescriptorSet>(sets);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600884 vkClearDescriptorSets(obj(), set_objs.size(), &set_objs[0]);
Chia-I Wuf8385062015-01-04 16:27:24 +0800885}
886
Chia-I Wu7732cb22015-03-26 15:27:55 +0800887void DescriptorSet::update(const std::vector<const void *> &update_array)
Chia-I Wuf8385062015-01-04 16:27:24 +0800888{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600889 vkUpdateDescriptors(obj(), update_array.size(), const_cast<const void **>(&update_array[0]));
Chia-I Wu82bff272014-12-27 14:12:52 +0800890}
891
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600892void DynamicVpStateObject::init(const Device &dev, const VkDynamicVpStateCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800893{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600894 DERIVED_OBJECT_INIT(vkCreateDynamicViewportState, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800895 alloc_memory(dev);
896}
897
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600898void DynamicRsStateObject::init(const Device &dev, const VkDynamicRsStateCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800899{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600900 DERIVED_OBJECT_INIT(vkCreateDynamicRasterState, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800901 alloc_memory(dev);
902}
903
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600904void DynamicCbStateObject::init(const Device &dev, const VkDynamicCbStateCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800905{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600906 DERIVED_OBJECT_INIT(vkCreateDynamicColorBlendState, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800907 alloc_memory(dev);
908}
909
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600910void DynamicDsStateObject::init(const Device &dev, const VkDynamicDsStateCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800911{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600912 DERIVED_OBJECT_INIT(vkCreateDynamicDepthStencilState, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800913 alloc_memory(dev);
914}
915
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600916void CmdBuffer::init(const Device &dev, const VkCmdBufferCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800917{
Mark Lobodzinskicf26e072015-04-16 11:44:05 -0500918 DEV_INIT(dev);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600919 DERIVED_OBJECT_INIT(vkCreateCommandBuffer, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800920}
921
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600922void CmdBuffer::begin(const VkCmdBufferBeginInfo *info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800923{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600924 EXPECT(vkBeginCommandBuffer(obj(), info) == VK_SUCCESS);
Jeremy Hayese0c3b222015-01-14 16:17:08 -0700925}
926
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600927void CmdBuffer::begin(VkRenderPass renderpass_obj, VkFramebuffer framebuffer_obj)
Jeremy Hayese0c3b222015-01-14 16:17:08 -0700928{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600929 VkCmdBufferBeginInfo info = {};
930 VkCmdBufferGraphicsBeginInfo graphics_cmd_buf_info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600931 graphics_cmd_buf_info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO;
Tony Barbour901f3bc2015-04-01 17:10:07 -0600932 graphics_cmd_buf_info.pNext = NULL;
Courtney Goeltzenleuchtere3b0f3a2015-04-03 15:25:24 -0600933 graphics_cmd_buf_info.renderPassContinue.renderPass = renderpass_obj;
934 graphics_cmd_buf_info.renderPassContinue.framebuffer = framebuffer_obj;
Tony Barbour901f3bc2015-04-01 17:10:07 -0600935
Tony Barbour8205d902015-04-16 15:59:00 -0600936 info.flags = VK_CMD_BUFFER_OPTIMIZE_SMALL_BATCH_BIT |
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600937 VK_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT;
938 info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO;
Jeremy Hayese0c3b222015-01-14 16:17:08 -0700939 info.pNext = &graphics_cmd_buf_info;
940
941 begin(&info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800942}
943
944void CmdBuffer::begin()
945{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600946 VkCmdBufferBeginInfo info = {};
Tony Barbour8205d902015-04-16 15:59:00 -0600947 info.flags = VK_CMD_BUFFER_OPTIMIZE_SMALL_BATCH_BIT |
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600948 VK_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT;
949 info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO;
Jeremy Hayese0c3b222015-01-14 16:17:08 -0700950
951 begin(&info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800952}
953
954void CmdBuffer::end()
955{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600956 EXPECT(vkEndCommandBuffer(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800957}
958
959void CmdBuffer::reset()
960{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600961 EXPECT(vkResetCommandBuffer(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800962}
963
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600964}; // namespace vk_testing