blob: c2f8f9e4feacfab22d052dc7d629a92d56bb9f84 [file] [log] [blame]
Chia-I Wu82bff272014-12-27 14:12:52 +08001// XGL tests
2//
3// Copyright (C) 2014 LunarG, Inc.
4//
5// Permission is hereby granted, free of charge, to any person obtaining a
6// copy of this software and associated documentation files (the "Software"),
7// to deal in the Software without restriction, including without limitation
8// the rights to use, copy, modify, merge, publish, distribute, sublicense,
9// and/or sell copies of the Software, and to permit persons to whom the
10// Software is furnished to do so, subject to the following conditions:
11//
12// The above copyright notice and this permission notice shall be included
13// in all copies or substantial portions of the Software.
14//
15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE.
22
23#ifndef XGLTESTBINDING_H
24#define XGLTESTBINDING_H
25
26#include <vector>
27
28#define XGL_PROTOTYPES
29#include "xgl.h"
30
31namespace xgl_testing {
32
33typedef void (*ErrorCallback)(const char *expr, const char *file, unsigned int line, const char *function);
34void set_error_callback(ErrorCallback callback);
35
36class PhysicalGpu;
37class BaseObject;
38class Object;
39class DynamicStateObject;
40class Device;
41class Queue;
42class GpuMemory;
43class Fence;
44class QueueSemaphore;
45class Event;
46class QueryPool;
47class Image;
48class ImageView;
49class ColorAttachmentView;
50class DepthStencilView;
51class Shader;
52class Pipeline;
53class PipelineDelta;
54class Sampler;
55class DescriptorSet;
56class DynamicVpStateObject;
57class DynamicRsStateObject;
58class DynamicMsaaStateObject;
59class DynamicCbStateObject;
60class DynamicDsStateObject;
61class CmdBuffer;
62
63class PhysicalGpu {
64public:
65 explicit PhysicalGpu(XGL_PHYSICAL_GPU gpu) : gpu_(gpu) {}
66
67 const XGL_PHYSICAL_GPU &obj() const { return gpu_; }
68
69 // xglGetGpuInfo()
70 XGL_PHYSICAL_GPU_PROPERTIES properties() const;
71 XGL_PHYSICAL_GPU_PERFORMANCE performance() const;
72 XGL_PHYSICAL_GPU_MEMORY_PROPERTIES memory_properties() const;
73 std::vector<XGL_PHYSICAL_GPU_QUEUE_PROPERTIES> queue_properties() const;
74
75 // xglGetProcAddr()
76 void *get_proc(const char *name) const { return xglGetProcAddr(gpu_, name); }
77
78 // xglGetExtensionSupport()
79 bool has_extension(const char *ext) const { return (xglGetExtensionSupport(gpu_, ext) == XGL_SUCCESS); }
80 std::vector<const char *> extensions() const;
81
82 // xglEnumerateLayers()
83 std::vector<const char *> layers(std::vector<char> &buf) const;
84
85 // xglGetMultiGpuCompatibility()
86 XGL_GPU_COMPATIBILITY_INFO compatibility(const PhysicalGpu &other) const;
87
88private:
89 XGL_PHYSICAL_GPU gpu_;
90};
91
92class BaseObject {
93public:
94 const XGL_BASE_OBJECT &obj() const { return obj_; }
95 bool initialized() const { return (obj_ != XGL_NULL_HANDLE); }
96
97 // xglGetObjectInfo()
98 uint32_t memory_allocation_count() const;
99 std::vector<XGL_MEMORY_REQUIREMENTS> memory_requirements() const;
100
101protected:
102 explicit BaseObject() : obj_(XGL_NULL_HANDLE), own_obj_(false) {}
103 explicit BaseObject(XGL_BASE_OBJECT obj) : obj_(XGL_NULL_HANDLE), own_obj_(false) { init(obj); }
104
105 void init(XGL_BASE_OBJECT obj, bool own);
106 void init(XGL_BASE_OBJECT obj) { init(obj, true); }
107
108 void reinit(XGL_BASE_OBJECT obj, bool own);
109 void reinit(XGL_BASE_OBJECT obj) { reinit(obj, true); }
110
111 bool own() const { return own_obj_; };
112
113private:
114 // base objects are non-copyable
115 BaseObject(const BaseObject &);
116 BaseObject &operator=(const BaseObject &);
117
118 XGL_BASE_OBJECT obj_;
119 bool own_obj_;
120};
121
122class Object : public BaseObject {
123public:
124 const XGL_OBJECT &obj() const { return reinterpret_cast<const XGL_OBJECT &>(BaseObject::obj()); }
125
126 // xglBindObjectMemory()
127 void bind_memory(uint32_t alloc_idx, const GpuMemory &mem, XGL_GPU_SIZE mem_offset);
128 void unbind_memory(uint32_t alloc_idx);
129 void unbind_memory();
130
131 // Unless an object is initialized with init_no_mem(), memories are
132 // automatically allocated and bound. These methods can be used to get
133 // the memories (for XGL_MEMORY_REFs), or to map/unmap the primary memory.
134 std::vector<XGL_GPU_MEMORY> memories() const;
135
136 const void *map(XGL_FLAGS flags) const;
137 void *map(XGL_FLAGS flags);
138 const void *map() const { return map(0); }
139 void *map() { return map(0); }
140
141 void unmap() const;
142
143protected:
144 explicit Object() : mem_alloc_count_(0), internal_mems_(NULL), primary_mem_(NULL) {}
145 explicit Object(XGL_OBJECT obj) : mem_alloc_count_(0), internal_mems_(NULL), primary_mem_(NULL) { init(obj); }
146 ~Object() { cleanup(); }
147
148 void init(XGL_OBJECT obj, bool own);
149 void init(XGL_OBJECT obj) { init(obj, true); }
150
151 void reinit(XGL_OBJECT obj, bool own);
152 void reinit(XGL_OBJECT obj) { init(obj, true); }
153
154 // allocate and bind internal memories
155 void alloc_memory(const Device &dev, bool for_linear_img);
156 void alloc_memory(const Device &dev) { alloc_memory(dev, false); }
157 void alloc_memory(const std::vector<XGL_GPU_MEMORY> &mems);
158
159private:
160 void cleanup();
161
162 uint32_t mem_alloc_count_;
163 GpuMemory *internal_mems_;
164 GpuMemory *primary_mem_;
165};
166
167class DynamicStateObject : public Object {
168public:
169 const XGL_STATE_OBJECT &obj() const { return reinterpret_cast<const XGL_STATE_OBJECT &>(Object::obj()); }
170
171protected:
172 explicit DynamicStateObject() {}
173 explicit DynamicStateObject(XGL_STATE_OBJECT obj) : Object(obj) {}
174};
175
176template<typename T, class C>
177class DerivedObject : public C {
178public:
179 const T &obj() const { return reinterpret_cast<const T &>(C::obj()); }
180
181protected:
182 typedef T obj_type;
183 typedef C base_type;
184
185 explicit DerivedObject() {}
186 explicit DerivedObject(T obj) : C(obj) {}
187};
188
189class Device : public DerivedObject<XGL_DEVICE, BaseObject> {
190public:
191 explicit Device(XGL_PHYSICAL_GPU gpu) : gpu_(gpu) {}
192 ~Device();
193
194 // xglCreateDevice()
195 void init(const XGL_DEVICE_CREATE_INFO &info);
Chia-I Wu6c099222015-01-06 10:40:45 +0800196 void init(bool enable_layers); // all queues, all extensions, etc
197 void init() { init(false); };
Chia-I Wu82bff272014-12-27 14:12:52 +0800198
199 const PhysicalGpu &gpu() const { return gpu_; }
200
201 // xglGetDeviceQueue()
202 const std::vector<Queue *> &graphics_queues() { return queues_[GRAPHICS]; }
203 const std::vector<Queue *> &compute_queues() { return queues_[COMPUTE]; }
204 const std::vector<Queue *> &dma_queues() { return queues_[DMA]; }
205
206 const std::vector<XGL_MEMORY_HEAP_PROPERTIES> &heap_properties() const { return heap_props_; }
207
208 struct Format {
209 XGL_FORMAT format;
210 XGL_IMAGE_TILING tiling;
211 XGL_FLAGS features;
212 };
213 // xglGetFormatInfo()
214 XGL_FORMAT_PROPERTIES format_properties(XGL_FORMAT format);
215 const std::vector<Format> &formats() const { return formats_; }
216
217 // xglDeviceWaitIdle()
218 void wait();
219
220 // xglWaitForFences()
221 XGL_RESULT wait(const std::vector<const Fence *> &fences, bool wait_all, uint64_t timeout);
222 XGL_RESULT wait(const Fence &fence) { return wait(std::vector<const Fence *>(1, &fence), true, (uint64_t) -1); }
223
224private:
225 enum QueueIndex {
226 GRAPHICS,
227 COMPUTE,
228 DMA,
229 QUEUE_COUNT,
230 };
231
232 void init_queues();
233 void init_heap_props();
234 void init_formats();
235
236 PhysicalGpu gpu_;
237
238 std::vector<Queue *> queues_[QUEUE_COUNT];
239 std::vector<XGL_MEMORY_HEAP_PROPERTIES> heap_props_;
240 std::vector<Format> formats_;
241};
242
243class Queue : public DerivedObject<XGL_QUEUE, BaseObject> {
244public:
245 explicit Queue(XGL_QUEUE queue) : DerivedObject(queue) {}
246
247 // xglQueueSubmit()
248 void submit(const std::vector<const CmdBuffer *> &cmds, const std::vector<XGL_MEMORY_REF> &mem_refs, Fence &fence);
249 void submit(const CmdBuffer &cmd, const std::vector<XGL_MEMORY_REF> &mem_refs, Fence &fence);
250 void submit(const CmdBuffer &cmd, const std::vector<XGL_MEMORY_REF> &mem_refs);
251
252 // xglQueueSetGlobalMemReferences()
253 void set_global_mem_references(const std::vector<XGL_MEMORY_REF> &mem_refs);
254
255 // xglQueueWaitIdle()
256 void wait();
257
258 // xglSignalQueueSemaphore()
259 // xglWaitQueueSemaphore()
260 void signal_semaphore(QueueSemaphore &sem);
261 void wait_semaphore(QueueSemaphore &sem);
262};
263
264class GpuMemory : public DerivedObject<XGL_GPU_MEMORY, BaseObject> {
265public:
266 explicit GpuMemory() {}
267 explicit GpuMemory(const Device &dev, XGL_GPU_SIZE size) { init(dev, size); }
268 ~GpuMemory();
269
270 // xglAllocMemory()
271 void init(const Device &dev, const XGL_MEMORY_ALLOC_INFO &info);
272 void init(const Device &dev, XGL_GPU_SIZE size);
273 // xglPinSystemMemory()
274 void init(const Device &dev, size_t size, const void *data);
275 // xglOpenSharedMemory()
276 void init(const Device &dev, const XGL_MEMORY_OPEN_INFO &info);
277 // xglOpenPeerMemory()
278 void init(const Device &dev, const XGL_PEER_MEMORY_OPEN_INFO &info);
279
280 void init(XGL_GPU_MEMORY mem) { BaseObject::init(mem, false); }
281
282 // xglSetMemoryPriority()
283 void set_priority(XGL_MEMORY_PRIORITY priority);
284
285 // xglMapMemory()
286 const void *map(XGL_FLAGS flags) const;
287 void *map(XGL_FLAGS flags);
288 const void *map() const { return map(0); }
289 void *map() { return map(0); }
290
291 // xglUnmapMemory()
292 void unmap() const;
293
294 XGL_MEMORY_STATE_TRANSITION state_transition(XGL_MEMORY_STATE old_state, XGL_MEMORY_STATE new_state,
295 XGL_GPU_SIZE offset, XGL_GPU_SIZE size) const
296 {
297 XGL_MEMORY_STATE_TRANSITION transition = {};
298 transition.sType = XGL_STRUCTURE_TYPE_MEMORY_STATE_TRANSITION;
299 transition.mem = obj();
300 transition.oldState = old_state;
301 transition.newState = new_state;
302 transition.offset = offset;
303 transition.regionSize = size;
304 return transition;
305 }
306
307 static XGL_MEMORY_ALLOC_INFO alloc_info(const XGL_MEMORY_REQUIREMENTS &reqs);
308};
309
310class Fence : public DerivedObject<XGL_FENCE, Object> {
311public:
312 // xglCreateFence()
313 void init(const Device &dev, const XGL_FENCE_CREATE_INFO &info);
314
315 // xglGetFenceStatus()
316 XGL_RESULT status() const { return xglGetFenceStatus(obj()); }
317
318 static XGL_FENCE_CREATE_INFO create_info(XGL_FLAGS flags);
319};
320
321class QueueSemaphore : public DerivedObject<XGL_QUEUE_SEMAPHORE, Object> {
322public:
323 // xglCreateQueueSemaphore()
324 void init(const Device &dev, const XGL_QUEUE_SEMAPHORE_CREATE_INFO &info);
325 // xglOpenSharedQueueSemaphore()
326 void init(const Device &dev, const XGL_QUEUE_SEMAPHORE_OPEN_INFO &info);
327
328 static XGL_QUEUE_SEMAPHORE_CREATE_INFO create_info(uint32_t init_count, XGL_FLAGS flags);
329};
330
331class Event : public DerivedObject<XGL_EVENT, Object> {
332public:
333 // xglCreateEvent()
334 void init(const Device &dev, const XGL_EVENT_CREATE_INFO &info);
335
336 // xglGetEventStatus()
337 // xglSetEvent()
338 // xglResetEvent()
339 XGL_RESULT status() const { return xglGetEventStatus(obj()); }
340 void set();
341 void reset();
342
343 static XGL_EVENT_CREATE_INFO create_info(XGL_FLAGS flags);
344};
345
346class QueryPool : public DerivedObject<XGL_QUERY_POOL, Object> {
347public:
348 // xglCreateQueryPool()
349 void init(const Device &dev, const XGL_QUERY_POOL_CREATE_INFO &info);
350
351 // xglGetQueryPoolResults()
352 XGL_RESULT results(uint32_t start, uint32_t count, size_t size, void *data);
353
354 static XGL_QUERY_POOL_CREATE_INFO create_info(XGL_QUERY_TYPE type, uint32_t slot_count);
355};
356
357class Image : public DerivedObject<XGL_IMAGE, Object> {
358public:
359 explicit Image() : format_features_(0) {}
360 explicit Image(const Device &dev, const XGL_IMAGE_CREATE_INFO &info) : format_features_(0) { init(dev, info); }
361
362 // xglCreateImage()
363 void init(const Device &dev, const XGL_IMAGE_CREATE_INFO &info);
364 void init_no_mem(const Device &dev, const XGL_IMAGE_CREATE_INFO &info);
365 // xglOpenPeerImage()
366 void init(const Device &dev, const XGL_PEER_IMAGE_OPEN_INFO &info, const XGL_IMAGE_CREATE_INFO &original_info);
367
368 // xglGetImageSubresourceInfo()
369 XGL_SUBRESOURCE_LAYOUT subresource_layout(const XGL_IMAGE_SUBRESOURCE &subres) const;
370
371 bool transparent() const;
372 bool copyable() const { return (format_features_ & XGL_FORMAT_IMAGE_COPY_BIT); }
373
374 XGL_IMAGE_SUBRESOURCE_RANGE subresource_range(XGL_IMAGE_ASPECT aspect) const { return subresource_range(create_info_, aspect); }
375 XGL_EXTENT3D extent() const { return create_info_.extent; }
376 XGL_EXTENT3D extent(uint32_t mip_level) const { return extent(create_info_.extent, mip_level); }
377
378 XGL_IMAGE_STATE_TRANSITION state_transition(XGL_IMAGE_STATE old_state, XGL_IMAGE_STATE new_state,
379 const XGL_IMAGE_SUBRESOURCE_RANGE &range) const
380 {
381 XGL_IMAGE_STATE_TRANSITION transition = {};
382 transition.image = obj();
383 transition.oldState = old_state;
384 transition.newState = new_state;
385 transition.subresourceRange = range;
386 return transition;
387 }
388
389 static XGL_IMAGE_CREATE_INFO create_info();
390 static XGL_IMAGE_SUBRESOURCE subresource(XGL_IMAGE_ASPECT aspect, uint32_t mip_level, uint32_t array_slice);
391 static XGL_IMAGE_SUBRESOURCE subresource(const XGL_IMAGE_SUBRESOURCE_RANGE &range, uint32_t mip_level, uint32_t array_slice);
392 static XGL_IMAGE_SUBRESOURCE_RANGE subresource_range(XGL_IMAGE_ASPECT aspect, uint32_t base_mip_level, uint32_t mip_levels,
393 uint32_t base_array_slice, uint32_t array_size);
394 static XGL_IMAGE_SUBRESOURCE_RANGE subresource_range(const XGL_IMAGE_CREATE_INFO &info, XGL_IMAGE_ASPECT aspect);
395 static XGL_IMAGE_SUBRESOURCE_RANGE subresource_range(const XGL_IMAGE_SUBRESOURCE &subres);
396
397 static XGL_EXTENT2D extent(int32_t width, int32_t height);
398 static XGL_EXTENT2D extent(const XGL_EXTENT2D &extent, uint32_t mip_level);
399 static XGL_EXTENT2D extent(const XGL_EXTENT3D &extent);
400
401 static XGL_EXTENT3D extent(int32_t width, int32_t height, int32_t depth);
402 static XGL_EXTENT3D extent(const XGL_EXTENT3D &extent, uint32_t mip_level);
403
404private:
405 void init_info(const Device &dev, const XGL_IMAGE_CREATE_INFO &info);
406
407 XGL_IMAGE_CREATE_INFO create_info_;
408 XGL_FLAGS format_features_;
409};
410
411class ImageView : public DerivedObject<XGL_IMAGE_VIEW, Object> {
412public:
413 // xglCreateImageView()
414 void init(const Device &dev, const XGL_IMAGE_VIEW_CREATE_INFO &info);
415};
416
417class ColorAttachmentView : public DerivedObject<XGL_COLOR_ATTACHMENT_VIEW, Object> {
418public:
419 // xglCreateColorAttachmentView()
420 void init(const Device &dev, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO &info);
421};
422
423class DepthStencilView : public DerivedObject<XGL_DEPTH_STENCIL_VIEW, Object> {
424public:
425 // xglCreateDepthStencilView()
426 void init(const Device &dev, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO &info);
427};
428
429class Shader : public DerivedObject<XGL_SHADER, Object> {
430public:
431 // xglCreateShader()
432 void init(const Device &dev, const XGL_SHADER_CREATE_INFO &info);
433 XGL_RESULT init_try(const Device &dev, const XGL_SHADER_CREATE_INFO &info);
434
435 static XGL_SHADER_CREATE_INFO create_info(size_t code_size, const void *code, XGL_FLAGS flags);
436};
437
438class Pipeline : public DerivedObject<XGL_PIPELINE, Object> {
439public:
440 // xglCreateGraphicsPipeline()
441 void init(const Device &dev, const XGL_GRAPHICS_PIPELINE_CREATE_INFO &info);
442 // xglCreateComputePipeline()
443 void init(const Device &dev, const XGL_COMPUTE_PIPELINE_CREATE_INFO &info);
444 // xglLoadPipeline()
445 void init(const Device&dev, size_t size, const void *data);
446
447 // xglStorePipeline()
448 size_t store(size_t size, void *data);
449};
450
451class PipelineDelta : public DerivedObject<XGL_PIPELINE_DELTA, Object> {
452public:
453 // xglCreatePipelineDelta()
454 void init(const Device &dev, const Pipeline &p1, const Pipeline &p2);
455};
456
457class Sampler : public DerivedObject<XGL_SAMPLER, Object> {
458public:
459 // xglCreateSampler()
460 void init(const Device &dev, const XGL_SAMPLER_CREATE_INFO &info);
461};
462
463class DescriptorSet : public DerivedObject<XGL_DESCRIPTOR_SET, Object> {
464public:
465 // xglCreateDescriptorSet()
466 void init(const Device &dev, const XGL_DESCRIPTOR_SET_CREATE_INFO &info);
467
468 // xglBeginDescriptorSetUpdate()
469 // xglEndDescriptorSetUpdate()
470 void begin() { xglBeginDescriptorSetUpdate(obj()); }
471 void end() { xglEndDescriptorSetUpdate(obj()); }
472
473 // xglAttachSamplerDescriptors()
474 void attach(uint32_t start_slot, const std::vector<const Sampler *> &samplers);
475 void attach(uint32_t start_slot, const Sampler &sampler)
476 {
477 attach(start_slot, std::vector<const Sampler *>(1, &sampler));
478 }
479
480 // xglAttachImageViewDescriptors()
481 void attach(uint32_t start_slot, const std::vector<XGL_IMAGE_VIEW_ATTACH_INFO> &img_views);
482 void attach(uint32_t start_slot, const XGL_IMAGE_VIEW_ATTACH_INFO &view)
483 {
484 attach(start_slot, std::vector<XGL_IMAGE_VIEW_ATTACH_INFO>(1, view));
485 }
486
487 // xglAttachMemoryViewDescriptors()
488 void attach(uint32_t start_slot, const std::vector<XGL_MEMORY_VIEW_ATTACH_INFO> &mem_views);
489 void attach(uint32_t start_slot, const XGL_MEMORY_VIEW_ATTACH_INFO &view)
490 {
491 attach(start_slot, std::vector<XGL_MEMORY_VIEW_ATTACH_INFO>(1, view));
492 }
493
494 // xglAttachNestedDescriptors()
495 void attach(uint32_t start_slot, const std::vector<XGL_DESCRIPTOR_SET_ATTACH_INFO> &sets);
496 void attach(uint32_t start_slot, const XGL_DESCRIPTOR_SET_ATTACH_INFO &set)
497 {
498 attach(start_slot, std::vector<XGL_DESCRIPTOR_SET_ATTACH_INFO>(1, set));
499 }
500
501 // xglClearDescriptorSetSlots()
502 void clear(uint32_t start_slot, uint32_t count) { xglClearDescriptorSetSlots(obj(), start_slot, count); }
503 void clear() { clear(0, info_.slots); }
504
505 static XGL_DESCRIPTOR_SET_CREATE_INFO create_info(uint32_t slot_count)
506 {
507 XGL_DESCRIPTOR_SET_CREATE_INFO info = {};
508 info.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
509 info.slots = slot_count;
510 return info;
511 }
512
513private:
514 XGL_DESCRIPTOR_SET_CREATE_INFO info_;
515};
516
517class DynamicVpStateObject : public DerivedObject<XGL_VIEWPORT_STATE_OBJECT, DynamicStateObject> {
518public:
519 // xglCreateViewportState()
520 void init(const Device &dev, const XGL_VIEWPORT_STATE_CREATE_INFO &info);
521};
522
523class DynamicRsStateObject : public DerivedObject<XGL_RASTER_STATE_OBJECT, DynamicStateObject> {
524public:
525 // xglCreateRasterState()
526 void init(const Device &dev, const XGL_RASTER_STATE_CREATE_INFO &info);
527};
528
529class DynamicMsaaStateObject : public DerivedObject<XGL_MSAA_STATE_OBJECT, DynamicStateObject> {
530public:
531 // xglCreateMsaaState()
532 void init(const Device &dev, const XGL_MSAA_STATE_CREATE_INFO &info);
533};
534
535class DynamicCbStateObject : public DerivedObject<XGL_COLOR_BLEND_STATE_OBJECT, DynamicStateObject> {
536public:
537 // xglCreateColorBlendState()
538 void init(const Device &dev, const XGL_COLOR_BLEND_STATE_CREATE_INFO &info);
539};
540
541class DynamicDsStateObject : public DerivedObject<XGL_DEPTH_STENCIL_STATE_OBJECT, DynamicStateObject> {
542public:
543 // xglCreateDepthStencilState()
544 void init(const Device &dev, const XGL_DEPTH_STENCIL_STATE_CREATE_INFO &info);
545};
546
547class CmdBuffer : public DerivedObject<XGL_CMD_BUFFER, Object> {
548public:
549 explicit CmdBuffer() {}
550 explicit CmdBuffer(const Device &dev, const XGL_CMD_BUFFER_CREATE_INFO &info) { init(dev, info); }
551
552 // xglCreateCommandBuffer()
553 void init(const Device &dev, const XGL_CMD_BUFFER_CREATE_INFO &info);
554
555 // xglBeginCommandBuffer()
556 void begin(XGL_FLAGS flags);
557 void begin();
558
559 // xglEndCommandBuffer()
560 // xglResetCommandBuffer()
561 void end();
562 void reset();
563
564 static XGL_CMD_BUFFER_CREATE_INFO create_info(XGL_QUEUE_TYPE type);
565};
566
567inline const void *Object::map(XGL_FLAGS flags) const
568{
569 return (primary_mem_) ? primary_mem_->map(flags) : NULL;
570}
571
572inline void *Object::map(XGL_FLAGS flags)
573{
574 return (primary_mem_) ? primary_mem_->map(flags) : NULL;
575}
576
577inline void Object::unmap() const
578{
579 if (primary_mem_)
580 primary_mem_->unmap();
581}
582
583inline XGL_MEMORY_ALLOC_INFO GpuMemory::alloc_info(const XGL_MEMORY_REQUIREMENTS &reqs)
584{
585 XGL_MEMORY_ALLOC_INFO info = {};
586 info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
587 info.allocationSize = reqs.size;
588 info.alignment = reqs.alignment;
589 info.heapCount = reqs.heapCount;
590 for (int i = 0; i < reqs.heapCount; i++)
591 info.heaps[i] = reqs.heaps[i];
592 info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
593 return info;
594}
595
596inline XGL_FENCE_CREATE_INFO Fence::create_info(XGL_FLAGS flags)
597{
598 XGL_FENCE_CREATE_INFO info = {};
599 info.sType = XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO;
600 info.flags = flags;
601 return info;
602}
603
604inline XGL_QUEUE_SEMAPHORE_CREATE_INFO QueueSemaphore::create_info(uint32_t init_count, XGL_FLAGS flags)
605{
606 XGL_QUEUE_SEMAPHORE_CREATE_INFO info = {};
607 info.sType = XGL_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
608 info.initialCount = init_count;
609 info.flags = flags;
610 return info;
611}
612
613inline XGL_EVENT_CREATE_INFO Event::create_info(XGL_FLAGS flags)
614{
615 XGL_EVENT_CREATE_INFO info = {};
616 info.sType = XGL_STRUCTURE_TYPE_EVENT_CREATE_INFO;
617 info.flags = flags;
618 return info;
619}
620
621inline XGL_QUERY_POOL_CREATE_INFO QueryPool::create_info(XGL_QUERY_TYPE type, uint32_t slot_count)
622{
623 XGL_QUERY_POOL_CREATE_INFO info = {};
624 info.sType = XGL_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
625 info.queryType = type;
626 info.slots = slot_count;
627 return info;
628}
629
630inline XGL_IMAGE_CREATE_INFO Image::create_info()
631{
632 XGL_IMAGE_CREATE_INFO info = {};
633 info.sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
634 info.extent.width = 1;
635 info.extent.height = 1;
636 info.extent.depth = 1;
637 info.mipLevels = 1;
638 info.arraySize = 1;
639 info.samples = 1;
640 return info;
641}
642
643inline XGL_IMAGE_SUBRESOURCE Image::subresource(XGL_IMAGE_ASPECT aspect, uint32_t mip_level, uint32_t array_slice)
644{
645 XGL_IMAGE_SUBRESOURCE subres = {};
646 subres.aspect = aspect;
647 subres.mipLevel = mip_level;
648 subres.arraySlice = array_slice;
649 return subres;
650}
651
652inline XGL_IMAGE_SUBRESOURCE Image::subresource(const XGL_IMAGE_SUBRESOURCE_RANGE &range, uint32_t mip_level, uint32_t array_slice)
653{
654 return subresource(range.aspect, range.baseMipLevel + mip_level, range.baseArraySlice + array_slice);
655}
656
657inline XGL_IMAGE_SUBRESOURCE_RANGE Image::subresource_range(XGL_IMAGE_ASPECT aspect, uint32_t base_mip_level, uint32_t mip_levels,
658 uint32_t base_array_slice, uint32_t array_size)
659{
660 XGL_IMAGE_SUBRESOURCE_RANGE range = {};
661 range.aspect = aspect;
662 range.baseMipLevel = base_mip_level;
663 range.mipLevels = mip_levels;
664 range.baseArraySlice = base_array_slice;
665 range.arraySize = array_size;
666 return range;
667}
668
669inline XGL_IMAGE_SUBRESOURCE_RANGE Image::subresource_range(const XGL_IMAGE_CREATE_INFO &info, XGL_IMAGE_ASPECT aspect)
670{
671 return subresource_range(aspect, 0, info.mipLevels, 0, info.arraySize);
672}
673
674inline XGL_IMAGE_SUBRESOURCE_RANGE Image::subresource_range(const XGL_IMAGE_SUBRESOURCE &subres)
675{
676 return subresource_range(subres.aspect, subres.mipLevel, 1, subres.arraySlice, 1);
677}
678
679inline XGL_EXTENT2D Image::extent(int32_t width, int32_t height)
680{
681 XGL_EXTENT2D extent = {};
682 extent.width = width;
683 extent.height = height;
684 return extent;
685}
686
687inline XGL_EXTENT2D Image::extent(const XGL_EXTENT2D &extent, uint32_t mip_level)
688{
689 const int32_t width = (extent.width >> mip_level) ? extent.width >> mip_level : 1;
690 const int32_t height = (extent.height >> mip_level) ? extent.height >> mip_level : 1;
691 return Image::extent(width, height);
692}
693
694inline XGL_EXTENT2D Image::extent(const XGL_EXTENT3D &extent)
695{
696 return Image::extent(extent.width, extent.height);
697}
698
699inline XGL_EXTENT3D Image::extent(int32_t width, int32_t height, int32_t depth)
700{
701 XGL_EXTENT3D extent = {};
702 extent.width = width;
703 extent.height = height;
704 extent.depth = depth;
705 return extent;
706}
707
708inline XGL_EXTENT3D Image::extent(const XGL_EXTENT3D &extent, uint32_t mip_level)
709{
710 const int32_t width = (extent.width >> mip_level) ? extent.width >> mip_level : 1;
711 const int32_t height = (extent.height >> mip_level) ? extent.height >> mip_level : 1;
712 const int32_t depth = (extent.depth >> mip_level) ? extent.depth >> mip_level : 1;
713 return Image::extent(width, height, depth);
714}
715
716inline XGL_SHADER_CREATE_INFO Shader::create_info(size_t code_size, const void *code, XGL_FLAGS flags)
717{
718 XGL_SHADER_CREATE_INFO info = {};
719 info.sType = XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO;
720 info.codeSize = code_size;
721 info.pCode = code;
722 info.flags = flags;
723 return info;
724}
725
726inline XGL_CMD_BUFFER_CREATE_INFO CmdBuffer::create_info(XGL_QUEUE_TYPE type)
727{
728 XGL_CMD_BUFFER_CREATE_INFO info = {};
729 info.sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO;
730 info.queueType = type;
731 return info;
732}
733
734}; // namespace xgl_testing
735
736#endif // XGLTESTBINDING_H