blob: 6c23941b8addfccd2f51cf1b29addb5398681046 [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 {
28
29#define DERIVED_OBJECT_INIT(create_func, ...) \
30 do { \
31 obj_type obj; \
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060032 if (EXPECT(create_func(__VA_ARGS__, &obj) == VK_SUCCESS)) \
Chia-I Wu82bff272014-12-27 14:12:52 +080033 base_type::init(obj); \
34 } while (0)
35
36#define STRINGIFY(x) #x
37#define EXPECT(expr) ((expr) ? true : expect_failure(STRINGIFY(expr), __FILE__, __LINE__, __FUNCTION__))
38
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060039vk_testing::ErrorCallback error_callback;
Chia-I Wu82bff272014-12-27 14:12:52 +080040
41bool expect_failure(const char *expr, const char *file, unsigned int line, const char *function)
42{
43 if (error_callback) {
44 error_callback(expr, file, line, function);
45 } else {
46 std::cerr << file << ":" << line << ": " << function <<
47 ": Expectation `" << expr << "' failed.\n";
48 }
49
50 return false;
51}
52
53template<class T, class S>
54std::vector<T> make_objects(const std::vector<S> &v)
55{
56 std::vector<T> objs;
57 objs.reserve(v.size());
58 for (typename std::vector<S>::const_iterator it = v.begin(); it != v.end(); it++)
59 objs.push_back((*it)->obj());
60 return objs;
61}
62
63template<typename T>
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060064std::vector<T> get_info(VK_PHYSICAL_GPU gpu, VK_PHYSICAL_GPU_INFO_TYPE type, size_t min_elems)
Chia-I Wu82bff272014-12-27 14:12:52 +080065{
66 std::vector<T> info;
Jon Ashburn23bd3822015-02-11 09:36:41 -070067 size_t size;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060068 if (EXPECT(vkGetGpuInfo(gpu, type, &size, NULL) == VK_SUCCESS && size % sizeof(T) == 0)) {
Chia-I Wu82bff272014-12-27 14:12:52 +080069 info.resize(size / sizeof(T));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060070 if (!EXPECT(vkGetGpuInfo(gpu, type, &size, &info[0]) == VK_SUCCESS && size == info.size() * sizeof(T)))
Chia-I Wu82bff272014-12-27 14:12:52 +080071 info.clear();
72 }
73
74 if (info.size() < min_elems)
75 info.resize(min_elems);
76
77 return info;
78}
79
80template<typename T>
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060081std::vector<T> get_info(VK_BASE_OBJECT obj, VK_OBJECT_INFO_TYPE type, size_t min_elems)
Chia-I Wu82bff272014-12-27 14:12:52 +080082{
83 std::vector<T> info;
Jon Ashburn23bd3822015-02-11 09:36:41 -070084 size_t size;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060085 if (EXPECT(vkGetObjectInfo(obj, type, &size, NULL) == VK_SUCCESS && size % sizeof(T) == 0)) {
Chia-I Wu82bff272014-12-27 14:12:52 +080086 info.resize(size / sizeof(T));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060087 if (!EXPECT(vkGetObjectInfo(obj, type, &size, &info[0]) == VK_SUCCESS && size == info.size() * sizeof(T)))
Chia-I Wu82bff272014-12-27 14:12:52 +080088 info.clear();
89 }
90
91 if (info.size() < min_elems)
92 info.resize(min_elems);
93
94 return info;
95}
96
97} // namespace
98
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060099namespace vk_testing {
Chia-I Wu82bff272014-12-27 14:12:52 +0800100
101void set_error_callback(ErrorCallback callback)
102{
103 error_callback = callback;
104}
105
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600106VK_PHYSICAL_GPU_PROPERTIES PhysicalGpu::properties() const
Chia-I Wu82bff272014-12-27 14:12:52 +0800107{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600108 return get_info<VK_PHYSICAL_GPU_PROPERTIES>(gpu_, VK_INFO_TYPE_PHYSICAL_GPU_PROPERTIES, 1)[0];
Chia-I Wu82bff272014-12-27 14:12:52 +0800109}
110
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600111VK_PHYSICAL_GPU_PERFORMANCE PhysicalGpu::performance() const
Chia-I Wu82bff272014-12-27 14:12:52 +0800112{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600113 return get_info<VK_PHYSICAL_GPU_PERFORMANCE>(gpu_, VK_INFO_TYPE_PHYSICAL_GPU_PERFORMANCE, 1)[0];
Chia-I Wu82bff272014-12-27 14:12:52 +0800114}
115
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600116std::vector<VK_PHYSICAL_GPU_QUEUE_PROPERTIES> PhysicalGpu::queue_properties() const
Chia-I Wu82bff272014-12-27 14:12:52 +0800117{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600118 return get_info<VK_PHYSICAL_GPU_QUEUE_PROPERTIES>(gpu_, VK_INFO_TYPE_PHYSICAL_GPU_QUEUE_PROPERTIES, 0);
Chia-I Wu82bff272014-12-27 14:12:52 +0800119}
120
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600121VK_PHYSICAL_GPU_MEMORY_PROPERTIES PhysicalGpu::memory_properties() const
Chia-I Wu82bff272014-12-27 14:12:52 +0800122{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600123 return get_info<VK_PHYSICAL_GPU_MEMORY_PROPERTIES>(gpu_, VK_INFO_TYPE_PHYSICAL_GPU_MEMORY_PROPERTIES, 1)[0];
Chia-I Wu82bff272014-12-27 14:12:52 +0800124}
125
126std::vector<const char *> PhysicalGpu::layers(std::vector<char> &buf) const
127{
128 const size_t max_layer_count = 16;
129 const size_t max_string_size = 256;
130
131 buf.resize(max_layer_count * max_string_size);
132
133 std::vector<const char *> layers;
134 layers.reserve(max_layer_count);
135 for (size_t i = 0; i < max_layer_count; i++)
136 layers.push_back(&buf[0] + max_string_size * i);
137
138 char * const *out = const_cast<char * const *>(&layers[0]);
139 size_t count;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600140 if (!EXPECT(vkEnumerateLayers(gpu_, max_layer_count, max_string_size, &count, out, NULL) == VK_SUCCESS))
Chia-I Wu82bff272014-12-27 14:12:52 +0800141 count = 0;
142 layers.resize(count);
143
144 return layers;
145}
146
147std::vector<const char *> PhysicalGpu::extensions() const
148{
149 static const char *known_exts[] = {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600150 "VK_WSI_X11",
Chia-I Wu82bff272014-12-27 14:12:52 +0800151 };
152
153 std::vector<const char *> exts;
154 for (int i = 0; i < sizeof(known_exts) / sizeof(known_exts[0]); i++) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600155 VK_RESULT err = vkGetExtensionSupport(gpu_, known_exts[i]);
156 if (err == VK_SUCCESS)
Chia-I Wu82bff272014-12-27 14:12:52 +0800157 exts.push_back(known_exts[i]);
158 }
159
160 return exts;
161}
162
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600163VK_GPU_COMPATIBILITY_INFO PhysicalGpu::compatibility(const PhysicalGpu &other) const
Chia-I Wu82bff272014-12-27 14:12:52 +0800164{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600165 VK_GPU_COMPATIBILITY_INFO data;
166 if (!EXPECT(vkGetMultiGpuCompatibility(gpu_, other.gpu_, &data) == VK_SUCCESS))
Chia-I Wu82bff272014-12-27 14:12:52 +0800167 memset(&data, 0, sizeof(data));
168
169 return data;
170}
171
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600172void BaseObject::init(VK_BASE_OBJECT obj, bool own)
Chia-I Wu82bff272014-12-27 14:12:52 +0800173{
174 EXPECT(!initialized());
175 reinit(obj, own);
176}
177
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600178void BaseObject::reinit(VK_BASE_OBJECT obj, bool own)
Chia-I Wu82bff272014-12-27 14:12:52 +0800179{
180 obj_ = obj;
181 own_obj_ = own;
182}
183
184uint32_t BaseObject::memory_allocation_count() const
185{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600186 return get_info<uint32_t>(obj_, VK_INFO_TYPE_MEMORY_ALLOCATION_COUNT, 1)[0];
Chia-I Wu82bff272014-12-27 14:12:52 +0800187}
188
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600189std::vector<VK_MEMORY_REQUIREMENTS> BaseObject::memory_requirements() const
Chia-I Wu82bff272014-12-27 14:12:52 +0800190{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600191 VK_RESULT err;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600192 uint32_t num_allocations = 0;
193 size_t num_alloc_size = sizeof(num_allocations);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600194 err = vkGetObjectInfo(obj_, VK_INFO_TYPE_MEMORY_ALLOCATION_COUNT,
Jon Ashburna9ae3832015-01-16 09:37:43 -0700195 &num_alloc_size, &num_allocations);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600196 EXPECT(err == VK_SUCCESS && num_alloc_size == sizeof(num_allocations));
197 std::vector<VK_MEMORY_REQUIREMENTS> info =
198 get_info<VK_MEMORY_REQUIREMENTS>(obj_, VK_INFO_TYPE_MEMORY_REQUIREMENTS, 0);
Jon Ashburna9ae3832015-01-16 09:37:43 -0700199 EXPECT(info.size() == num_allocations);
Chia-I Wu82bff272014-12-27 14:12:52 +0800200 if (info.size() == 1 && !info[0].size)
201 info.clear();
202
203 return info;
204}
205
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600206void Object::init(VK_OBJECT obj, bool own)
Chia-I Wu82bff272014-12-27 14:12:52 +0800207{
208 BaseObject::init(obj, own);
209 mem_alloc_count_ = memory_allocation_count();
210}
211
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600212void Object::reinit(VK_OBJECT obj, bool own)
Chia-I Wu82bff272014-12-27 14:12:52 +0800213{
214 cleanup();
215 BaseObject::reinit(obj, own);
216 mem_alloc_count_ = memory_allocation_count();
217}
218
219void Object::cleanup()
220{
221 if (!initialized())
222 return;
223
Tony Barbour2b5fb342015-04-09 16:00:18 -0600224 if(bound) {
225 unbind_memory();
226 }
Chia-I Wu82bff272014-12-27 14:12:52 +0800227
228 if (internal_mems_) {
229 delete[] internal_mems_;
230 internal_mems_ = NULL;
231 primary_mem_ = NULL;
232 }
233
234 mem_alloc_count_ = 0;
235
236 if (own())
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600237 EXPECT(vkDestroyObject(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800238}
239
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600240void Object::bind_memory(uint32_t alloc_idx, const GpuMemory &mem, VK_GPU_SIZE mem_offset)
Chia-I Wu82bff272014-12-27 14:12:52 +0800241{
Tony Barbour2b5fb342015-04-09 16:00:18 -0600242 bound = true;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600243 EXPECT(vkBindObjectMemory(obj(), alloc_idx, mem.obj(), mem_offset) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800244}
245
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600246void Object::bind_memory(uint32_t alloc_idx, VK_GPU_SIZE offset, VK_GPU_SIZE size,
247 const GpuMemory &mem, VK_GPU_SIZE mem_offset)
Chia-I Wu714df452015-01-01 07:55:04 +0800248{
Tony Barbour2b5fb342015-04-09 16:00:18 -0600249 bound = true;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600250 EXPECT(!alloc_idx && vkBindObjectMemoryRange(obj(), 0, offset, size, mem.obj(), mem_offset) == VK_SUCCESS);
Chia-I Wu714df452015-01-01 07:55:04 +0800251}
252
Chia-I Wu82bff272014-12-27 14:12:52 +0800253void Object::unbind_memory(uint32_t alloc_idx)
254{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600255 EXPECT(vkBindObjectMemory(obj(), alloc_idx, VK_NULL_HANDLE, 0) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800256}
257
258void Object::unbind_memory()
259{
260 for (uint32_t i = 0; i < mem_alloc_count_; i++)
261 unbind_memory(i);
262}
263
Jon Ashburn5567c812015-01-20 08:50:12 -0700264void Object::alloc_memory(const Device &dev, bool for_buf, bool for_img)
Chia-I Wu82bff272014-12-27 14:12:52 +0800265{
266 if (!EXPECT(!internal_mems_) || !mem_alloc_count_)
267 return;
268
269 internal_mems_ = new GpuMemory[mem_alloc_count_];
270
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600271 const std::vector<VK_MEMORY_REQUIREMENTS> mem_reqs = memory_requirements();
272 std::vector<VK_IMAGE_MEMORY_REQUIREMENTS> img_reqs;
273 std::vector<VK_BUFFER_MEMORY_REQUIREMENTS> buf_reqs;
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600274 VkMemoryAllocImageInfo img_info;
275 VkMemoryAllocBufferInfo buf_info;
276 VkMemoryAllocInfo info, *next_info = NULL;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700277
Jon Ashburn5567c812015-01-20 08:50:12 -0700278 if (for_img) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600279 img_reqs = get_info<VK_IMAGE_MEMORY_REQUIREMENTS>(obj(),
280 VK_INFO_TYPE_IMAGE_MEMORY_REQUIREMENTS, 0);
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700281 EXPECT(img_reqs.size() == 1);
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600282 next_info = (VkMemoryAllocInfo *) &img_info;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700283 img_info.pNext = NULL;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600284 img_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700285 img_info.usage = img_reqs[0].usage;
286 img_info.formatClass = img_reqs[0].formatClass;
287 img_info.samples = img_reqs[0].samples;
288 }
289
290
Jon Ashburn5567c812015-01-20 08:50:12 -0700291 if (for_buf) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600292 buf_reqs = get_info<VK_BUFFER_MEMORY_REQUIREMENTS>(obj(),
293 VK_INFO_TYPE_BUFFER_MEMORY_REQUIREMENTS, 0);
Jon Ashburn5567c812015-01-20 08:50:12 -0700294 if (for_img)
295 img_info.pNext = &buf_info;
296 else
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600297 next_info = (VkMemoryAllocInfo *) &buf_info;
Jon Ashburn5567c812015-01-20 08:50:12 -0700298 buf_info.pNext = NULL;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600299 buf_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO;
Jon Ashburn5567c812015-01-20 08:50:12 -0700300 buf_info.usage = buf_reqs[0].usage;
301 }
302
303
Chia-I Wu82bff272014-12-27 14:12:52 +0800304 for (int i = 0; i < mem_reqs.size(); i++) {
Jon Ashburn5567c812015-01-20 08:50:12 -0700305 info = GpuMemory::alloc_info(mem_reqs[i], next_info);
Chia-I Wu714df452015-01-01 07:55:04 +0800306
Jon Ashburn661c3292015-01-22 11:40:11 -0700307 switch (info.memType) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600308 case VK_MEMORY_TYPE_BUFFER:
Jon Ashburn661c3292015-01-22 11:40:11 -0700309 EXPECT(for_buf);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600310 info.memProps |= VK_MEMORY_PROPERTY_CPU_VISIBLE_BIT;
Jon Ashburn661c3292015-01-22 11:40:11 -0700311 primary_mem_ = &internal_mems_[i];
312 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600313 case VK_MEMORY_TYPE_IMAGE:
Jon Ashburn661c3292015-01-22 11:40:11 -0700314 EXPECT(for_img);
315 primary_mem_ = &internal_mems_[i];
316 break;
317 default:
318 break;
319 }
Chia-I Wu82bff272014-12-27 14:12:52 +0800320
321 internal_mems_[i].init(dev, info);
322 bind_memory(i, internal_mems_[i], 0);
323 }
324}
325
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600326void Object::alloc_memory(const std::vector<VK_GPU_MEMORY> &mems)
Chia-I Wu82bff272014-12-27 14:12:52 +0800327{
328 if (!EXPECT(!internal_mems_) || !mem_alloc_count_)
329 return;
330
331 internal_mems_ = new GpuMemory[mem_alloc_count_];
332
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600333 const std::vector<VK_MEMORY_REQUIREMENTS> mem_reqs = memory_requirements();
Chia-I Wu82bff272014-12-27 14:12:52 +0800334 if (!EXPECT(mem_reqs.size() == mems.size()))
335 return;
336
337 for (int i = 0; i < mem_reqs.size(); i++) {
338 primary_mem_ = &internal_mems_[i];
339
340 internal_mems_[i].init(mems[i]);
341 bind_memory(i, internal_mems_[i], 0);
342 }
343}
344
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600345std::vector<VK_GPU_MEMORY> Object::memories() const
Chia-I Wu82bff272014-12-27 14:12:52 +0800346{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600347 std::vector<VK_GPU_MEMORY> mems;
Chia-I Wu82bff272014-12-27 14:12:52 +0800348 if (internal_mems_) {
349 mems.reserve(mem_alloc_count_);
350 for (uint32_t i = 0; i < mem_alloc_count_; i++)
351 mems.push_back(internal_mems_[i].obj());
352 }
353
354 return mems;
355}
356
357Device::~Device()
358{
359 if (!initialized())
360 return;
361
362 for (int i = 0; i < QUEUE_COUNT; i++) {
363 for (std::vector<Queue *>::iterator it = queues_[i].begin(); it != queues_[i].end(); it++)
364 delete *it;
365 queues_[i].clear();
366 }
367
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600368 EXPECT(vkDestroyDevice(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800369}
370
Chia-I Wu6c099222015-01-06 10:40:45 +0800371void Device::init(bool enable_layers)
Chia-I Wu82bff272014-12-27 14:12:52 +0800372{
373 // request all queues
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600374 const std::vector<VK_PHYSICAL_GPU_QUEUE_PROPERTIES> queue_props = gpu_.queue_properties();
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600375 std::vector<VkDeviceQueueCreateInfo> queue_info;
Chia-I Wu82bff272014-12-27 14:12:52 +0800376 queue_info.reserve(queue_props.size());
377 for (int i = 0; i < queue_props.size(); i++) {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600378 VkDeviceQueueCreateInfo qi = {};
Chia-I Wu82bff272014-12-27 14:12:52 +0800379 qi.queueNodeIndex = i;
380 qi.queueCount = queue_props[i].queueCount;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600381 if (queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700382 graphics_queue_node_index_ = i;
383 }
Chia-I Wu82bff272014-12-27 14:12:52 +0800384 queue_info.push_back(qi);
385 }
386
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600387 VkLayerCreateInfo layer_info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600388 layer_info.sType = VK_STRUCTURE_TYPE_LAYER_CREATE_INFO;
Chia-I Wu6c099222015-01-06 10:40:45 +0800389
390 std::vector<const char *> layers;
391 std::vector<char> layer_buf;
392 // request all layers
393 if (enable_layers) {
394 layers = gpu_.layers(layer_buf);
395 layer_info.layerCount = layers.size();
396 layer_info.ppActiveLayerNames = &layers[0];
397 }
Chia-I Wu82bff272014-12-27 14:12:52 +0800398
399 const std::vector<const char *> exts = gpu_.extensions();
400
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600401 VkDeviceCreateInfo dev_info = {};
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600402 dev_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
Jon Ashburnca930582015-01-22 13:33:15 -0700403 dev_info.pNext = (enable_layers) ? static_cast<void *>(&layer_info) : NULL;
Chia-I Wu82bff272014-12-27 14:12:52 +0800404 dev_info.queueRecordCount = queue_info.size();
405 dev_info.pRequestedQueues = &queue_info[0];
406 dev_info.extensionCount = exts.size();
407 dev_info.ppEnabledExtensionNames = &exts[0];
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600408 dev_info.maxValidationLevel = VK_VALIDATION_LEVEL_END_RANGE;
409 dev_info.flags = VK_DEVICE_CREATE_VALIDATION_BIT;
Chia-I Wu82bff272014-12-27 14:12:52 +0800410
411 init(dev_info);
412}
413
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600414void Device::init(const VkDeviceCreateInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800415{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600416 DERIVED_OBJECT_INIT(vkCreateDevice, gpu_.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800417
418 init_queues();
Chia-I Wu82bff272014-12-27 14:12:52 +0800419 init_formats();
420}
421
422void Device::init_queues()
423{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600424 VK_RESULT err;
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700425 size_t data_size;
426 uint32_t queue_node_count;
Chia-I Wu82bff272014-12-27 14:12:52 +0800427
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600428 err = vkGetGpuInfo(gpu_.obj(), VK_INFO_TYPE_PHYSICAL_GPU_QUEUE_PROPERTIES,
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700429 &data_size, NULL);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600430 EXPECT(err == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800431
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600432 queue_node_count = data_size / sizeof(VK_PHYSICAL_GPU_QUEUE_PROPERTIES);
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700433 EXPECT(queue_node_count >= 1);
434
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600435 VK_PHYSICAL_GPU_QUEUE_PROPERTIES queue_props[queue_node_count];
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700436
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600437 err = vkGetGpuInfo(gpu_.obj(), VK_INFO_TYPE_PHYSICAL_GPU_QUEUE_PROPERTIES,
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700438 &data_size, queue_props);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600439 EXPECT(err == VK_SUCCESS);
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700440
441 for (int i = 0; i < queue_node_count; i++) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600442 VK_QUEUE queue;
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700443
444 for (int j = 0; j < queue_props[i].queueCount; j++) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600445 err = vkGetDeviceQueue(obj(), i, j, &queue);
446 EXPECT(err == VK_SUCCESS);
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700447
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600448 if (queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700449 queues_[GRAPHICS].push_back(new Queue(queue));
450 }
451
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600452 if (queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) {
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700453 queues_[COMPUTE].push_back(new Queue(queue));
454 }
455
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600456 if (queue_props[i].queueFlags & VK_QUEUE_DMA_BIT) {
Courtney Goeltzenleuchterf3168062015-03-05 18:09:39 -0700457 queues_[DMA].push_back(new Queue(queue));
458 }
Chia-I Wu82bff272014-12-27 14:12:52 +0800459 }
460 }
461
462 EXPECT(!queues_[GRAPHICS].empty() || !queues_[COMPUTE].empty());
463}
464
Chia-I Wu82bff272014-12-27 14:12:52 +0800465void Device::init_formats()
466{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600467 for (int f = VK_FMT_BEGIN_RANGE; f <= VK_FMT_END_RANGE; f++) {
468 const VK_FORMAT fmt = static_cast<VK_FORMAT>(f);
469 const VK_FORMAT_PROPERTIES props = format_properties(fmt);
Chia-I Wu82bff272014-12-27 14:12:52 +0800470
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700471 if (props.linearTilingFeatures) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600472 const Format tmp = { fmt, VK_LINEAR_TILING, props.linearTilingFeatures };
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700473 formats_.push_back(tmp);
474 }
Chia-I Wu82bff272014-12-27 14:12:52 +0800475
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700476 if (props.optimalTilingFeatures) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600477 const Format tmp = { fmt, VK_OPTIMAL_TILING, props.optimalTilingFeatures };
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700478 formats_.push_back(tmp);
Chia-I Wu82bff272014-12-27 14:12:52 +0800479 }
480 }
481
482 EXPECT(!formats_.empty());
483}
484
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600485VK_FORMAT_PROPERTIES Device::format_properties(VK_FORMAT format)
Chia-I Wu82bff272014-12-27 14:12:52 +0800486{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600487 const VK_FORMAT_INFO_TYPE type = VK_INFO_TYPE_FORMAT_PROPERTIES;
488 VK_FORMAT_PROPERTIES data;
Chia-I Wu82bff272014-12-27 14:12:52 +0800489 size_t size = sizeof(data);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600490 if (!EXPECT(vkGetFormatInfo(obj(), format, type, &size, &data) == VK_SUCCESS && size == sizeof(data)))
Chia-I Wu82bff272014-12-27 14:12:52 +0800491 memset(&data, 0, sizeof(data));
492
493 return data;
494}
495
496void Device::wait()
497{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600498 EXPECT(vkDeviceWaitIdle(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800499}
500
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600501VK_RESULT Device::wait(const std::vector<const Fence *> &fences, bool wait_all, uint64_t timeout)
Chia-I Wu82bff272014-12-27 14:12:52 +0800502{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600503 const std::vector<VK_FENCE> fence_objs = make_objects<VK_FENCE>(fences);
504 VK_RESULT err = vkWaitForFences(obj(), fence_objs.size(), &fence_objs[0], wait_all, timeout);
505 EXPECT(err == VK_SUCCESS || err == VK_TIMEOUT);
Chia-I Wu82bff272014-12-27 14:12:52 +0800506
507 return err;
508}
509
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600510void Device::begin_descriptor_pool_update(VK_DESCRIPTOR_UPDATE_MODE mode)
Chia-I Wuf8385062015-01-04 16:27:24 +0800511{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600512 EXPECT(vkBeginDescriptorPoolUpdate(obj(), mode) == VK_SUCCESS);
Chia-I Wuf8385062015-01-04 16:27:24 +0800513}
514
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800515void Device::end_descriptor_pool_update(CmdBuffer &cmd)
Chia-I Wuf8385062015-01-04 16:27:24 +0800516{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600517 EXPECT(vkEndDescriptorPoolUpdate(obj(), cmd.obj()) == VK_SUCCESS);
Chia-I Wuf8385062015-01-04 16:27:24 +0800518}
519
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600520void Queue::submit(const std::vector<const CmdBuffer *> &cmds, Fence &fence)
Chia-I Wu82bff272014-12-27 14:12:52 +0800521{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600522 const std::vector<VK_CMD_BUFFER> cmd_objs = make_objects<VK_CMD_BUFFER>(cmds);
523 EXPECT(vkQueueSubmit(obj(), cmd_objs.size(), &cmd_objs[0], fence.obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800524}
525
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600526void Queue::submit(const CmdBuffer &cmd, Fence &fence)
Chia-I Wu82bff272014-12-27 14:12:52 +0800527{
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600528 submit(std::vector<const CmdBuffer*>(1, &cmd), fence);
Chia-I Wu82bff272014-12-27 14:12:52 +0800529}
530
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600531void Queue::submit(const CmdBuffer &cmd)
Chia-I Wu82bff272014-12-27 14:12:52 +0800532{
533 Fence fence;
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600534 submit(cmd, fence);
Chia-I Wu82bff272014-12-27 14:12:52 +0800535}
536
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600537void Queue::add_mem_references(const std::vector<VK_GPU_MEMORY> &mem_refs)
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600538{
539 for (int i = 0; i < mem_refs.size(); i++) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600540 EXPECT(vkQueueAddMemReference(obj(), mem_refs[i]) == VK_SUCCESS);
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600541 }
542}
543
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600544void Queue::remove_mem_references(const std::vector<VK_GPU_MEMORY> &mem_refs)
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600545{
546 for (int i = 0; i < mem_refs.size(); i++) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600547 EXPECT(vkQueueRemoveMemReference(obj(), mem_refs[i]) == VK_SUCCESS);
Courtney Goeltzenleuchter8d49dbd2015-04-07 17:13:38 -0600548 }
549}
Chia-I Wu82bff272014-12-27 14:12:52 +0800550
551void Queue::wait()
552{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600553 EXPECT(vkQueueWaitIdle(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800554}
555
Courtney Goeltzenleuchter0d2efef2015-03-25 17:14:29 -0600556void Queue::signal_semaphore(Semaphore &sem)
Chia-I Wu82bff272014-12-27 14:12:52 +0800557{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600558 EXPECT(vkQueueSignalSemaphore(obj(), sem.obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800559}
560
Courtney Goeltzenleuchter0d2efef2015-03-25 17:14:29 -0600561void Queue::wait_semaphore(Semaphore &sem)
Chia-I Wu82bff272014-12-27 14:12:52 +0800562{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600563 EXPECT(vkQueueWaitSemaphore(obj(), sem.obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800564}
565
566GpuMemory::~GpuMemory()
567{
568 if (initialized() && own())
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600569 EXPECT(vkFreeMemory(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800570}
571
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600572void GpuMemory::init(const Device &dev, const VkMemoryAllocInfo &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800573{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600574 DERIVED_OBJECT_INIT(vkAllocMemory, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800575}
576
Chia-I Wu82bff272014-12-27 14:12:52 +0800577void GpuMemory::init(const Device &dev, size_t size, const void *data)
578{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600579 DERIVED_OBJECT_INIT(vkPinSystemMemory, dev.obj(), data, size);
Chia-I Wu82bff272014-12-27 14:12:52 +0800580}
581
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600582void GpuMemory::init(const Device &dev, const VK_MEMORY_OPEN_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800583{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600584 DERIVED_OBJECT_INIT(vkOpenSharedMemory, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800585}
586
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600587void GpuMemory::init(const Device &dev, const VK_PEER_MEMORY_OPEN_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800588{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600589 DERIVED_OBJECT_INIT(vkOpenPeerMemory, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800590}
591
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600592void GpuMemory::set_priority(VK_MEMORY_PRIORITY priority)
Chia-I Wu82bff272014-12-27 14:12:52 +0800593{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600594 EXPECT(vkSetMemoryPriority(obj(), priority) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800595}
596
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600597const void *GpuMemory::map(VK_FLAGS flags) const
Chia-I Wu82bff272014-12-27 14:12:52 +0800598{
599 void *data;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600600 if (!EXPECT(vkMapMemory(obj(), flags, &data) == VK_SUCCESS))
Chia-I Wu82bff272014-12-27 14:12:52 +0800601 data = NULL;
602
603 return data;
604}
605
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600606void *GpuMemory::map(VK_FLAGS flags)
Chia-I Wu82bff272014-12-27 14:12:52 +0800607{
608 void *data;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600609 if (!EXPECT(vkMapMemory(obj(), flags, &data) == VK_SUCCESS))
Chia-I Wu82bff272014-12-27 14:12:52 +0800610 data = NULL;
611
612 return data;
613}
614
615void GpuMemory::unmap() const
616{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600617 EXPECT(vkUnmapMemory(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800618}
619
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600620void Fence::init(const Device &dev, const VK_FENCE_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800621{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600622 DERIVED_OBJECT_INIT(vkCreateFence, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800623 alloc_memory(dev);
624}
625
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600626void Semaphore::init(const Device &dev, const VK_SEMAPHORE_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800627{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600628 DERIVED_OBJECT_INIT(vkCreateSemaphore, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800629 alloc_memory(dev);
630}
631
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600632void Semaphore::init(const Device &dev, const VK_SEMAPHORE_OPEN_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800633{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600634 DERIVED_OBJECT_INIT(vkOpenSharedSemaphore, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800635}
636
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600637void Event::init(const Device &dev, const VK_EVENT_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800638{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600639 DERIVED_OBJECT_INIT(vkCreateEvent, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800640 alloc_memory(dev);
641}
642
643void Event::set()
644{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600645 EXPECT(vkSetEvent(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800646}
647
648void Event::reset()
649{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600650 EXPECT(vkResetEvent(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800651}
652
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600653void QueryPool::init(const Device &dev, const VK_QUERY_POOL_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800654{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600655 DERIVED_OBJECT_INIT(vkCreateQueryPool, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800656 alloc_memory(dev);
657}
658
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600659VK_RESULT QueryPool::results(uint32_t start, uint32_t count, size_t size, void *data)
Chia-I Wu82bff272014-12-27 14:12:52 +0800660{
661 size_t tmp = size;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600662 VK_RESULT err = vkGetQueryPoolResults(obj(), start, count, &tmp, data);
663 if (err == VK_SUCCESS) {
Chia-I Wu82bff272014-12-27 14:12:52 +0800664 if (!EXPECT(tmp == size))
665 memset(data, 0, size);
666 } else {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600667 EXPECT(err == VK_NOT_READY);
Chia-I Wu82bff272014-12-27 14:12:52 +0800668 }
669
670 return err;
671}
672
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600673void Buffer::init(const Device &dev, const VkBufferCreateInfo &info)
Chia-I Wu714df452015-01-01 07:55:04 +0800674{
675 init_no_mem(dev, info);
Jon Ashburn5567c812015-01-20 08:50:12 -0700676 alloc_memory(dev, true, false);
Chia-I Wu714df452015-01-01 07:55:04 +0800677}
678
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600679void Buffer::init_no_mem(const Device &dev, const VkBufferCreateInfo &info)
Chia-I Wu714df452015-01-01 07:55:04 +0800680{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600681 DERIVED_OBJECT_INIT(vkCreateBuffer, dev.obj(), &info);
Chia-I Wu714df452015-01-01 07:55:04 +0800682 create_info_ = info;
683}
684
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600685void BufferView::init(const Device &dev, const VkBufferViewCreateInfo &info)
Chia-I Wu714df452015-01-01 07:55:04 +0800686{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600687 DERIVED_OBJECT_INIT(vkCreateBufferView, dev.obj(), &info);
Chia-I Wu714df452015-01-01 07:55:04 +0800688 alloc_memory(dev);
689}
690
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600691void Image::init(const Device &dev, const VK_IMAGE_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800692{
693 init_no_mem(dev, info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600694 alloc_memory(dev, info.tiling == VK_LINEAR_TILING, true);
Chia-I Wu82bff272014-12-27 14:12:52 +0800695}
696
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600697void Image::init_no_mem(const Device &dev, const VK_IMAGE_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800698{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600699 DERIVED_OBJECT_INIT(vkCreateImage, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800700 init_info(dev, info);
701}
702
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600703void Image::init(const Device &dev, const VK_PEER_IMAGE_OPEN_INFO &info, const VK_IMAGE_CREATE_INFO &original_info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800704{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600705 VK_IMAGE img;
706 VK_GPU_MEMORY mem;
707 EXPECT(vkOpenPeerImage(dev.obj(), &info, &img, &mem) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800708 Object::init(img);
709
710 init_info(dev, original_info);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600711 alloc_memory(std::vector<VK_GPU_MEMORY>(1, mem));
Chia-I Wu82bff272014-12-27 14:12:52 +0800712}
713
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600714void Image::init_info(const Device &dev, const VK_IMAGE_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800715{
716 create_info_ = info;
717
718 for (std::vector<Device::Format>::const_iterator it = dev.formats().begin(); it != dev.formats().end(); it++) {
719 if (memcmp(&it->format, &create_info_.format, sizeof(it->format)) == 0 && it->tiling == create_info_.tiling) {
720 format_features_ = it->features;
721 break;
722 }
723 }
724}
725
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600726void Image::bind_memory(uint32_t alloc_idx, const VK_IMAGE_MEMORY_BIND_INFO &info,
727 const GpuMemory &mem, VK_GPU_SIZE mem_offset)
Chia-I Wu714df452015-01-01 07:55:04 +0800728{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600729 EXPECT(!alloc_idx && vkBindImageMemoryRange(obj(), 0, &info, mem.obj(), mem_offset) == VK_SUCCESS);
Chia-I Wu714df452015-01-01 07:55:04 +0800730}
731
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600732VK_SUBRESOURCE_LAYOUT Image::subresource_layout(const VK_IMAGE_SUBRESOURCE &subres) const
Chia-I Wu82bff272014-12-27 14:12:52 +0800733{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600734 const VK_SUBRESOURCE_INFO_TYPE type = VK_INFO_TYPE_SUBRESOURCE_LAYOUT;
735 VK_SUBRESOURCE_LAYOUT data;
Chia-I Wu82bff272014-12-27 14:12:52 +0800736 size_t size = sizeof(data);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600737 if (!EXPECT(vkGetImageSubresourceInfo(obj(), &subres, type, &size, &data) == VK_SUCCESS && size == sizeof(data)))
Chia-I Wu82bff272014-12-27 14:12:52 +0800738 memset(&data, 0, sizeof(data));
739
740 return data;
741}
742
743bool Image::transparent() const
744{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600745 return (create_info_.tiling == VK_LINEAR_TILING &&
Chia-I Wu82bff272014-12-27 14:12:52 +0800746 create_info_.samples == 1 &&
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600747 !(create_info_.usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
748 VK_IMAGE_USAGE_DEPTH_STENCIL_BIT)));
Chia-I Wu82bff272014-12-27 14:12:52 +0800749}
750
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600751void ImageView::init(const Device &dev, const VK_IMAGE_VIEW_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800752{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600753 DERIVED_OBJECT_INIT(vkCreateImageView, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800754 alloc_memory(dev);
755}
756
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600757void ColorAttachmentView::init(const Device &dev, const VK_COLOR_ATTACHMENT_VIEW_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800758{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600759 DERIVED_OBJECT_INIT(vkCreateColorAttachmentView, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800760 alloc_memory(dev);
761}
762
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600763void DepthStencilView::init(const Device &dev, const VK_DEPTH_STENCIL_VIEW_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800764{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600765 DERIVED_OBJECT_INIT(vkCreateDepthStencilView, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800766 alloc_memory(dev);
767}
768
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600769void Shader::init(const Device &dev, const VK_SHADER_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800770{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600771 DERIVED_OBJECT_INIT(vkCreateShader, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800772}
773
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600774VK_RESULT Shader::init_try(const Device &dev, const VK_SHADER_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800775{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600776 VK_SHADER sh;
777 VK_RESULT err = vkCreateShader(dev.obj(), &info, &sh);
778 if (err == VK_SUCCESS)
Chia-I Wu82bff272014-12-27 14:12:52 +0800779 Object::init(sh);
780
781 return err;
782}
783
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600784void Pipeline::init(const Device &dev, const VK_GRAPHICS_PIPELINE_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800785{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600786 DERIVED_OBJECT_INIT(vkCreateGraphicsPipeline, dev.obj(), &info);
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,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600792 const VK_GRAPHICS_PIPELINE_CREATE_INFO &info,
793 const VK_PIPELINE basePipeline)
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -0600794{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600795 DERIVED_OBJECT_INIT(vkCreateGraphicsPipelineDerivative, dev.obj(), &info, basePipeline);
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -0600796 alloc_memory(dev);
797}
798
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600799void Pipeline::init(const Device &dev, const VK_COMPUTE_PIPELINE_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800800{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600801 DERIVED_OBJECT_INIT(vkCreateComputePipeline, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800802 alloc_memory(dev);
803}
804
805void Pipeline::init(const Device&dev, size_t size, const void *data)
806{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600807 DERIVED_OBJECT_INIT(vkLoadPipeline, dev.obj(), size, data);
Chia-I Wu82bff272014-12-27 14:12:52 +0800808 alloc_memory(dev);
809}
810
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -0600811void Pipeline::init(
812 const Device&dev,
813 size_t size,
814 const void *data,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600815 const VK_PIPELINE basePipeline)
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -0600816{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600817 DERIVED_OBJECT_INIT(vkLoadPipelineDerivative, dev.obj(), size, data, basePipeline);
Courtney Goeltzenleuchter32876a12015-03-25 15:37:49 -0600818 alloc_memory(dev);
819}
820
Chia-I Wu82bff272014-12-27 14:12:52 +0800821size_t Pipeline::store(size_t size, void *data)
822{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600823 if (!EXPECT(vkStorePipeline(obj(), &size, data) == VK_SUCCESS))
Chia-I Wu82bff272014-12-27 14:12:52 +0800824 size = 0;
825
826 return size;
827}
828
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600829void Sampler::init(const Device &dev, const VK_SAMPLER_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800830{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600831 DERIVED_OBJECT_INIT(vkCreateSampler, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800832 alloc_memory(dev);
833}
834
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600835void DescriptorSetLayout::init(const Device &dev, const VK_DESCRIPTOR_SET_LAYOUT_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800836{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600837 DERIVED_OBJECT_INIT(vkCreateDescriptorSetLayout, dev.obj(), &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 Wu7732cb22015-03-26 15:27:55 +0800841void DescriptorSetLayoutChain::init(const Device &dev, const std::vector<const DescriptorSetLayout *> &layouts)
Chia-I Wu82bff272014-12-27 14:12:52 +0800842{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600843 const std::vector<VK_DESCRIPTOR_SET_LAYOUT> layout_objs = make_objects<VK_DESCRIPTOR_SET_LAYOUT>(layouts);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800844
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600845 DERIVED_OBJECT_INIT(vkCreateDescriptorSetLayoutChain, dev.obj(), layout_objs.size(), &layout_objs[0]);
Chia-I Wu7732cb22015-03-26 15:27:55 +0800846 alloc_memory(dev);
Chia-I Wu82bff272014-12-27 14:12:52 +0800847}
848
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600849void DescriptorPool::init(const Device &dev, VK_DESCRIPTOR_POOL_USAGE usage,
850 uint32_t max_sets, const VK_DESCRIPTOR_POOL_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800851{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600852 DERIVED_OBJECT_INIT(vkCreateDescriptorPool, dev.obj(), usage, max_sets, &info);
Chia-I Wuf8385062015-01-04 16:27:24 +0800853 alloc_memory(dev);
Chia-I Wu82bff272014-12-27 14:12:52 +0800854}
855
Chia-I Wudee95612015-03-26 15:23:52 +0800856void DescriptorPool::reset()
Chia-I Wu82bff272014-12-27 14:12:52 +0800857{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600858 EXPECT(vkResetDescriptorPool(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800859}
860
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600861std::vector<DescriptorSet *> DescriptorPool::alloc_sets(VK_DESCRIPTOR_SET_USAGE usage, const std::vector<const DescriptorSetLayout *> &layouts)
Chia-I Wu82bff272014-12-27 14:12:52 +0800862{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600863 const std::vector<VK_DESCRIPTOR_SET_LAYOUT> layout_objs = make_objects<VK_DESCRIPTOR_SET_LAYOUT>(layouts);
Chia-I Wuf8385062015-01-04 16:27:24 +0800864
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600865 std::vector<VK_DESCRIPTOR_SET> set_objs;
Chia-I Wuf8385062015-01-04 16:27:24 +0800866 set_objs.resize(layout_objs.size());
867
868 uint32_t set_count;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600869 VK_RESULT err = vkAllocDescriptorSets(obj(), usage, layout_objs.size(), &layout_objs[0], &set_objs[0], &set_count);
870 if (err == VK_SUCCESS)
Chia-I Wuf8385062015-01-04 16:27:24 +0800871 EXPECT(set_count == set_objs.size());
872 set_objs.resize(set_count);
873
874 std::vector<DescriptorSet *> sets;
875 sets.reserve(set_count);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600876 for (std::vector<VK_DESCRIPTOR_SET>::const_iterator it = set_objs.begin(); it != set_objs.end(); it++) {
Chia-I Wuf8385062015-01-04 16:27:24 +0800877 // do descriptor sets need memories bound?
878 sets.push_back(new DescriptorSet(*it));
879 }
880
881 return sets;
882}
883
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600884std::vector<DescriptorSet *> DescriptorPool::alloc_sets(VK_DESCRIPTOR_SET_USAGE usage, const DescriptorSetLayout &layout, uint32_t count)
Chia-I Wuf8385062015-01-04 16:27:24 +0800885{
886 return alloc_sets(usage, std::vector<const DescriptorSetLayout *>(count, &layout));
887}
888
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600889DescriptorSet *DescriptorPool::alloc_sets(VK_DESCRIPTOR_SET_USAGE usage, const DescriptorSetLayout &layout)
Chia-I Wuf8385062015-01-04 16:27:24 +0800890{
891 std::vector<DescriptorSet *> set = alloc_sets(usage, layout, 1);
892 return (set.empty()) ? NULL : set[0];
893}
894
Chia-I Wu8d24b3b2015-03-26 13:14:16 +0800895void DescriptorPool::clear_sets(const std::vector<DescriptorSet *> &sets)
Chia-I Wuf8385062015-01-04 16:27:24 +0800896{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600897 const std::vector<VK_DESCRIPTOR_SET> set_objs = make_objects<VK_DESCRIPTOR_SET>(sets);
898 vkClearDescriptorSets(obj(), set_objs.size(), &set_objs[0]);
Chia-I Wuf8385062015-01-04 16:27:24 +0800899}
900
Chia-I Wu7732cb22015-03-26 15:27:55 +0800901void DescriptorSet::update(const std::vector<const void *> &update_array)
Chia-I Wuf8385062015-01-04 16:27:24 +0800902{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600903 vkUpdateDescriptors(obj(), update_array.size(), const_cast<const void **>(&update_array[0]));
Chia-I Wu82bff272014-12-27 14:12:52 +0800904}
905
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600906void DynamicVpStateObject::init(const Device &dev, const VK_DYNAMIC_VP_STATE_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800907{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600908 DERIVED_OBJECT_INIT(vkCreateDynamicViewportState, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800909 alloc_memory(dev);
910}
911
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600912void DynamicRsStateObject::init(const Device &dev, const VK_DYNAMIC_RS_STATE_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800913{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600914 DERIVED_OBJECT_INIT(vkCreateDynamicRasterState, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800915 alloc_memory(dev);
916}
917
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600918void DynamicCbStateObject::init(const Device &dev, const VK_DYNAMIC_CB_STATE_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800919{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600920 DERIVED_OBJECT_INIT(vkCreateDynamicColorBlendState, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800921 alloc_memory(dev);
922}
923
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600924void DynamicDsStateObject::init(const Device &dev, const VK_DYNAMIC_DS_STATE_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800925{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600926 DERIVED_OBJECT_INIT(vkCreateDynamicDepthStencilState, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800927 alloc_memory(dev);
928}
929
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600930void CmdBuffer::init(const Device &dev, const VK_CMD_BUFFER_CREATE_INFO &info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800931{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600932 DERIVED_OBJECT_INIT(vkCreateCommandBuffer, dev.obj(), &info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800933}
934
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600935void CmdBuffer::begin(const VK_CMD_BUFFER_BEGIN_INFO *info)
Chia-I Wu82bff272014-12-27 14:12:52 +0800936{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600937 EXPECT(vkBeginCommandBuffer(obj(), info) == VK_SUCCESS);
Jeremy Hayese0c3b222015-01-14 16:17:08 -0700938}
939
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600940void CmdBuffer::begin(VK_RENDER_PASS renderpass_obj, VK_FRAMEBUFFER framebuffer_obj)
Jeremy Hayese0c3b222015-01-14 16:17:08 -0700941{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600942 VK_CMD_BUFFER_BEGIN_INFO info = {};
943 VK_CMD_BUFFER_GRAPHICS_BEGIN_INFO graphics_cmd_buf_info = {};
944 graphics_cmd_buf_info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO;
Tony Barbour901f3bc2015-04-01 17:10:07 -0600945 graphics_cmd_buf_info.pNext = NULL;
Courtney Goeltzenleuchtere3b0f3a2015-04-03 15:25:24 -0600946 graphics_cmd_buf_info.renderPassContinue.renderPass = renderpass_obj;
947 graphics_cmd_buf_info.renderPassContinue.framebuffer = framebuffer_obj;
Tony Barbour901f3bc2015-04-01 17:10:07 -0600948
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600949 info.flags = VK_CMD_BUFFER_OPTIMIZE_GPU_SMALL_BATCH_BIT |
950 VK_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT;
951 info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO;
Jeremy Hayese0c3b222015-01-14 16:17:08 -0700952 info.pNext = &graphics_cmd_buf_info;
953
954 begin(&info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800955}
956
957void CmdBuffer::begin()
958{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600959 VK_CMD_BUFFER_BEGIN_INFO info = {};
960 info.flags = VK_CMD_BUFFER_OPTIMIZE_GPU_SMALL_BATCH_BIT |
961 VK_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT;
962 info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO;
Jeremy Hayese0c3b222015-01-14 16:17:08 -0700963
964 begin(&info);
Chia-I Wu82bff272014-12-27 14:12:52 +0800965}
966
967void CmdBuffer::end()
968{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600969 EXPECT(vkEndCommandBuffer(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800970}
971
972void CmdBuffer::reset()
973{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600974 EXPECT(vkResetCommandBuffer(obj()) == VK_SUCCESS);
Chia-I Wu82bff272014-12-27 14:12:52 +0800975}
976
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600977}; // namespace vk_testing