vktestbinding.h revision 3dee8087999562e0637326175a3cf6cab858158e
19cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// VK tests
29cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter//
39cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// Copyright (C) 2014 LunarG, Inc.
49cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter//
59cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// Permission is hereby granted, free of charge, to any person obtaining a
69cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// copy of this software and associated documentation files (the "Software"),
79cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// to deal in the Software without restriction, including without limitation
89cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// the rights to use, copy, modify, merge, publish, distribute, sublicense,
99cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// and/or sell copies of the Software, and to permit persons to whom the
109cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// Software is furnished to do so, subject to the following conditions:
119cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter//
129cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// The above copyright notice and this permission notice shall be included
139cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// in all copies or substantial portions of the Software.
149cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter//
159cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
169cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
179cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
189cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
199cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
209cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
219cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter// DEALINGS IN THE SOFTWARE.
229cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
239cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#ifndef VKTESTBINDING_H
249cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#define VKTESTBINDING_H
259cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
269cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#include <vector>
27a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu#include <assert.h>
289cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
299cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#include "vulkan.h"
309cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchternamespace vk_testing {
329cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
339cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchtertypedef void (*ErrorCallback)(const char *expr, const char *file, unsigned int line, const char *function);
349cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchtervoid set_error_callback(ErrorCallback callback);
359cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
36f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wuclass PhysicalDevice;
379cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Device;
389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Queue;
39ba0836f623e3a756bf0cac72d5a688430d2a3420Chia-I Wuclass DeviceMemory;
409cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Fence;
419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Semaphore;
429cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Event;
439cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass QueryPool;
449cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Buffer;
459cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass BufferView;
469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Image;
479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass ImageView;
489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass DepthStencilView;
499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Shader;
509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Pipeline;
519cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass PipelineDelta;
529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Sampler;
539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass DescriptorSetLayout;
54556f721b927c7f8bf6f37dd502afe8ebf3b76719Mark Lobodzinskiclass PipelineLayout;
559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass DescriptorSetPool;
569cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass DescriptorSet;
576b11e60997003c59ddfc3944bb24d0fb7a0473cdChia-I Wuclass DynamicViewportState;
58e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northropclass DynamicLineWidthState;
59e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northropclass DynamicDepthBiasState;
60e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northropclass DynamicBlendState;
61e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northropclass DynamicDepthBoundsState;
622605cb05ec149b2e2668540501dc79c71b6a67e9Cody Northropclass DynamicStencilState;
639cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass CmdBuffer;
64902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchterclass CmdPool;
659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
6618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstd::vector<VkLayerProperties> GetGlobalLayers();
6718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstd::vector<VkExtensionProperties> GetGlobalExtensions();
6818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstd::vector<VkExtensionProperties> GetGlobalExtensions(const char *pLayerName);
6918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
70a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wunamespace internal {
71a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
72a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wutemplate<typename T>
73a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wuclass Handle {
74a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wupublic:
75a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    const T &handle() const { return handle_; }
76a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    bool initialized() const { return (handle_ != VK_NULL_HANDLE); }
77a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
78a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wuprotected:
79a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    typedef T handle_type;
80a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
81a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    explicit Handle() : handle_(VK_NULL_HANDLE) {}
82a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    explicit Handle(T handle) : handle_(handle) {}
83a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
84a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    void init(T handle)
85a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    {
86a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu        assert(!initialized());
87a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu        handle_ = handle;
88a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    }
89a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
90a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wuprivate:
91a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    // handles are non-copyable
92a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    Handle(const Handle &);
93a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    Handle &operator=(const Handle &);
94a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
95a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    T handle_;
96a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu};
97a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
98a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
99a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wutemplate<typename T>
100a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wuclass NonDispHandle : public Handle<T> {
101a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wuprotected:
102a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    explicit NonDispHandle() : Handle<T>(), dev_handle_(VK_NULL_HANDLE) {}
103a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    explicit NonDispHandle(VkDevice dev, T handle) : Handle<T>(handle), dev_handle_(dev) {}
104a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
105a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    const VkDevice &device() const { return dev_handle_; }
106a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
107a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    void init(VkDevice dev, T handle)
108a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    {
109a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu        assert(!Handle<T>::initialized() && dev_handle_ == VK_NULL_HANDLE);
110a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu        Handle<T>::init(handle);
111a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu        dev_handle_ = dev;
112a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    }
113a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
114a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wuprivate:
115a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    VkDevice dev_handle_;
116a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu};
117a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
118a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu} // namespace internal
119a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
120f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wuclass PhysicalDevice : public internal::Handle<VkPhysicalDevice> {
1219cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
122f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wu    explicit PhysicalDevice(VkPhysicalDevice phy) : Handle(phy)
123723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    {
124723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski        memory_properties_ = memory_properties();
125723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    }
1269cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1278205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDeviceProperties properties() const;
1288205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDeviceMemoryProperties memory_properties() const;
129ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop    std::vector<VkQueueFamilyProperties> queue_properties() const;
1309cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
131d72da75739c3caab80fcb704f2ab353c5f223aa9Mike Stroyan    VkResult set_memory_type(const uint32_t type_bits, VkMemoryAllocInfo *info, const VkMemoryPropertyFlags properties,
132d72da75739c3caab80fcb704f2ab353c5f223aa9Mike Stroyan                             const VkMemoryPropertyFlags forbid = 0) const;
1339cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
13418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    // vkGetPhysicalDeviceExtensionProperties()
1351c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    std::vector<VkExtensionProperties> extensions() const;
13618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter    std::vector<VkExtensionProperties> extensions(const char * pLayerName) const;
1379cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkEnumerateLayers()
139f5c61951493d13d4fda80bce2d36fab7b6f449aaCourtney Goeltzenleuchter    std::vector<VkLayerProperties> layers() const;
1409cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterprivate:
1421c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    void add_extension_dependencies(uint32_t dependency_count,
1431c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter                                    VkExtensionProperties *depencency_props,
1441c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter                                    std::vector<VkExtensionProperties> &ext_list);
145f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wu
146723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    VkPhysicalDeviceMemoryProperties memory_properties_;
1479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
1489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
149a263629c001e522a146c68e253979c20482becfbChia-I Wuclass Device : public internal::Handle<VkDevice> {
1509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
151f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wu    explicit Device(VkPhysicalDevice phy) : phy_(phy) {}
1529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    ~Device();
1539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateDevice()
155ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    void init(const VkDeviceCreateInfo &info);
15661414dee66bbc720c72dce59da6db9f0d31ea24aCourtney Goeltzenleuchter    void init(std::vector<const char*> &layers, std::vector<const char *> &extensions); // all queues, all extensions, etc
15761414dee66bbc720c72dce59da6db9f0d31ea24aCourtney Goeltzenleuchter    void init() { std::vector<const char *> layers; std::vector<const char *> extensions; init(layers, extensions); };
1589cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
159f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wu    const PhysicalDevice &phy() const { return phy_; }
1609cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1611245cec54fd74fea87bc95913788726054a91518Jon Ashburn    // vkGetDeviceProcAddr()
162a4c8c71cb37926b9cc4dd8e131b2ddd3f5de48d5Courtney Goeltzenleuchter    PFN_vkVoidFunction get_proc(const char *name) const { return vkGetDeviceProcAddr(handle(), name); }
1631245cec54fd74fea87bc95913788726054a91518Jon Ashburn
1649cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkGetDeviceQueue()
165cf26e07b83fc43011e939b75f0d393a48a5628d0Mark Lobodzinski    const std::vector<Queue *> &graphics_queues() const { return queues_[GRAPHICS]; }
1669cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const std::vector<Queue *> &compute_queues() { return queues_[COMPUTE]; }
1679cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const std::vector<Queue *> &dma_queues() { return queues_[DMA]; }
1689cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    uint32_t graphics_queue_node_index_;
1699cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1709cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    struct Format {
171382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkFormat format;
172382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkImageTiling tiling;
173382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkFlags features;
1749cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    };
1759cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkGetFormatInfo()
176382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFormatProperties format_properties(VkFormat format);
1779cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const std::vector<Format> &formats() const { return formats_; }
1789cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1799cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkDeviceWaitIdle()
1809cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void wait();
1819cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1829cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkWaitForFences()
183382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkResult wait(const std::vector<const Fence *> &fences, bool wait_all, uint64_t timeout);
184382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkResult wait(const Fence &fence) { return wait(std::vector<const Fence *>(1, &fence), true, (uint64_t) -1); }
1859cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1868cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    // vkUpdateDescriptorSets()
18767b42b7bde3163f662452cd8ed20e0b69e1afa4fMark Lobodzinski    void update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes, const std::vector<VkCopyDescriptorSet> &copies);
18867b42b7bde3163f662452cd8ed20e0b69e1afa4fMark Lobodzinski    void update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes) { return update_descriptor_sets(writes, std::vector<VkCopyDescriptorSet>()); }
1898cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu
1908cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
1918cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu                                                     VkDescriptorType type, uint32_t count, const VkDescriptorInfo *descriptors);
1928cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    static VkWriteDescriptorSet write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
1938cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu                                                     VkDescriptorType type, const std::vector<VkDescriptorInfo> &descriptors);
1948cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu
1958cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    static VkCopyDescriptorSet copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding, uint32_t src_array_element,
1968cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu                                                   const DescriptorSet &dst_set, uint32_t dst_binding, uint32_t dst_array_element,
1978cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu                                                   uint32_t count);
1988cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu
1999cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterprivate:
2009cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    enum QueueIndex {
2019cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        GRAPHICS,
2029cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        COMPUTE,
2039cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        DMA,
2049cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        QUEUE_COUNT,
2059cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    };
2069cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2079cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void init_queues();
2089cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void init_formats();
2099cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
210f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wu    PhysicalDevice phy_;
2119cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2129cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    std::vector<Queue *> queues_[QUEUE_COUNT];
2139cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    std::vector<Format> formats_;
2149cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
2159cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
216f2862c7fc1528f109583276ec4c92e131aa540b4Chia-I Wuclass Queue : public internal::Handle<VkQueue> {
2179cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
2180caa94f5c686c2b9eaf57594b72a67fb9f440df1Tony Barbour    explicit Queue(VkQueue queue, int index) : Handle(queue) {family_index_ = index;}
2199cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2209cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkQueueSubmit()
2219cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void submit(const std::vector<const CmdBuffer *> &cmds, Fence &fence);
2229cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void submit(const CmdBuffer &cmd, Fence &fence);
2239cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void submit(const CmdBuffer &cmd);
2249cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2259cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkQueueWaitIdle()
2269cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void wait();
2279cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2289cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkQueueSignalSemaphore()
2299cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkQueueWaitSemaphore()
2309cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void signal_semaphore(Semaphore &sem);
2319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void wait_semaphore(Semaphore &sem);
2320caa94f5c686c2b9eaf57594b72a67fb9f440df1Tony Barbour
2330caa94f5c686c2b9eaf57594b72a67fb9f440df1Tony Barbour    int get_family_index() {return family_index_;}
2340caa94f5c686c2b9eaf57594b72a67fb9f440df1Tony Barbour
2350caa94f5c686c2b9eaf57594b72a67fb9f440df1Tony Barbourprivate:
2360caa94f5c686c2b9eaf57594b72a67fb9f440df1Tony Barbour    int family_index_;
2379cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
2389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
239ba0836f623e3a756bf0cac72d5a688430d2a3420Chia-I Wuclass DeviceMemory : public internal::NonDispHandle<VkDeviceMemory> {
2409cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
241ba0836f623e3a756bf0cac72d5a688430d2a3420Chia-I Wu    ~DeviceMemory();
2429cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2439cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkAllocMemory()
244ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    void init(const Device &dev, const VkMemoryAllocInfo &info);
2459cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkMapMemory()
247382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    const void *map(VkFlags flags) const;
248382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter          void *map(VkFlags flags);
2499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const void *map() const { return map(0); }
2509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter          void *map()       { return map(0); }
2519cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkUnmapMemory()
2539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void unmap() const;
2549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
255ba0836f623e3a756bf0cac72d5a688430d2a3420Chia-I Wu    static VkMemoryAllocInfo alloc_info(VkDeviceSize size, uint32_t memory_type_index);
2569cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
2579cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
258a49923427e634a6ba14c610861284b2aa2291cbaChia-I Wuclass Fence : public internal::NonDispHandle<VkFence> {
2599cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
260a49923427e634a6ba14c610861284b2aa2291cbaChia-I Wu    ~Fence();
261a49923427e634a6ba14c610861284b2aa2291cbaChia-I Wu
2629cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateFence()
263382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkFenceCreateInfo &info);
2649cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkGetFenceStatus()
266a49923427e634a6ba14c610861284b2aa2291cbaChia-I Wu    VkResult status() const { return vkGetFenceStatus(device(), handle()); }
2679cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
268382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkFenceCreateInfo create_info(VkFenceCreateFlags flags);
269382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkFenceCreateInfo create_info();
2709cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
2719cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2722454b9236ddcc40638aec9ac33de3ab570621f64Chia-I Wuclass Semaphore : public internal::NonDispHandle<VkSemaphore> {
2739cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
2742454b9236ddcc40638aec9ac33de3ab570621f64Chia-I Wu    ~Semaphore();
2752454b9236ddcc40638aec9ac33de3ab570621f64Chia-I Wu
2769cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateSemaphore()
277382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkSemaphoreCreateInfo &info);
2789cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
279864fd38da3f44dfe26e043f26f0cecad29a1cfd6Tony Barbour    static VkSemaphoreCreateInfo create_info(VkFlags flags);
2809cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
2819cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2829b6db1d5d991a4f98a99e8510d9d85b67f117e04Chia-I Wuclass Event : public internal::NonDispHandle<VkEvent> {
2839cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
2849b6db1d5d991a4f98a99e8510d9d85b67f117e04Chia-I Wu    ~Event();
2859b6db1d5d991a4f98a99e8510d9d85b67f117e04Chia-I Wu
2869cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateEvent()
287382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkEventCreateInfo &info);
2889cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2899cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkGetEventStatus()
2909cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkSetEvent()
2919cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkResetEvent()
2929b6db1d5d991a4f98a99e8510d9d85b67f117e04Chia-I Wu    VkResult status() const { return vkGetEventStatus(device(), handle()); }
2939cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void set();
2949cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void reset();
2959cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
296382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkEventCreateInfo create_info(VkFlags flags);
2979cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
2989cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
299fd0ce99eac2a9faa48c76702ec0a4c533389d435Chia-I Wuclass QueryPool : public internal::NonDispHandle<VkQueryPool> {
3009cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
301fd0ce99eac2a9faa48c76702ec0a4c533389d435Chia-I Wu    ~QueryPool();
302fd0ce99eac2a9faa48c76702ec0a4c533389d435Chia-I Wu
3039cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateQueryPool()
304382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkQueryPoolCreateInfo &info);
3059cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
3069cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkGetQueryPoolResults()
307382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkResult results(uint32_t start, uint32_t count, size_t size, void *data);
3089cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
309382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkQueryPoolCreateInfo create_info(VkQueryType type, uint32_t slot_count);
3109cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
3119cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
312f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wuclass Buffer : public internal::NonDispHandle<VkBuffer> {
3139cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
314f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    explicit Buffer() : NonDispHandle() {}
315ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    explicit Buffer(const Device &dev, const VkBufferCreateInfo &info) { init(dev, info); }
3168205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    explicit Buffer(const Device &dev, VkDeviceSize size) { init(dev, size); }
3179cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
318f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    ~Buffer();
319f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
3209cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateBuffer()
321f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    void init(const Device &dev, const VkBufferCreateInfo &info, VkMemoryPropertyFlags mem_props);
322f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    void init(const Device &dev, const VkBufferCreateInfo &info) { init(dev, info, 0); }
323f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    void init(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags mem_props) { init(dev, create_info(size, 0), mem_props); }
324f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    void init(const Device &dev, VkDeviceSize size) { init(dev, size, 0); }
325d0e7d22a3ea3cc61de731011cc63b5e148e6667fCody Northrop    void init_as_src(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs) { init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT), reqs); }
326d0e7d22a3ea3cc61de731011cc63b5e148e6667fCody Northrop    void init_as_dst(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs) { init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT), reqs); }
327d0e7d22a3ea3cc61de731011cc63b5e148e6667fCody Northrop    void init_as_src_and_dst(const Device &dev, VkDeviceSize size, VkMemoryPropertyFlags &reqs) { init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT | VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT), reqs); }
328ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    void init_no_mem(const Device &dev, const VkBufferCreateInfo &info);
3299cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
330f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    // get the internal memory
331f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    const DeviceMemory &memory() const { return internal_mem_; }
332f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu          DeviceMemory &memory()       { return internal_mem_; }
333f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
334f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    // vkGetObjectMemoryRequirements()
335f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    VkMemoryRequirements memory_requirements() const;
336f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
337f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    // vkBindObjectMemory()
338f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
339fb9f5646a9f331a834d2e318d503a213cba490d7Mark Lobodzinski
3408205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    static VkBufferCreateInfo create_info(VkDeviceSize size, VkFlags usage);
3419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
342382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkBufferMemoryBarrier buffer_memory_barrier(VkFlags output_mask, VkFlags input_mask,
3438205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour                                                 VkDeviceSize offset, VkDeviceSize size) const
3449cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    {
345382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkBufferMemoryBarrier barrier = {};
3469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
347f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu        barrier.buffer = handle();
3489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.outputMask = output_mask;
3499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.inputMask = input_mask;
3509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.offset = offset;
3519cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.size = size;
3529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        return barrier;
3539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    }
354f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
3559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterprivate:
356ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    VkBufferCreateInfo create_info_;
357f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
358f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    DeviceMemory internal_mem_;
3599cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
3609cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
36176ab1ff1f3572f5722b8c1108c9d8fa57a9a353bChia-I Wuclass BufferView : public internal::NonDispHandle<VkBufferView> {
3629cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
36376ab1ff1f3572f5722b8c1108c9d8fa57a9a353bChia-I Wu    ~BufferView();
36476ab1ff1f3572f5722b8c1108c9d8fa57a9a353bChia-I Wu
3659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateBufferView()
366ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    void init(const Device &dev, const VkBufferViewCreateInfo &info);
3679cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
3689cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
369f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wuclass Image : public internal::NonDispHandle<VkImage> {
3709cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
371f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    explicit Image() : NonDispHandle(), format_features_(0) {}
372382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    explicit Image(const Device &dev, const VkImageCreateInfo &info) : format_features_(0) { init(dev, info); }
3739cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
374f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    ~Image();
375f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
3769cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateImage()
377f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    void init(const Device &dev, const VkImageCreateInfo &info, VkMemoryPropertyFlags mem_props);
378f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    void init(const Device &dev, const VkImageCreateInfo &info) { init(dev, info, 0); }
379382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init_no_mem(const Device &dev, const VkImageCreateInfo &info);
3809cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
381f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    // get the internal memory
382f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    const DeviceMemory &memory() const { return internal_mem_; }
383f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu          DeviceMemory &memory()       { return internal_mem_; }
384f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
385f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    // vkGetObjectMemoryRequirements()
386f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    VkMemoryRequirements memory_requirements() const;
387f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
388f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    // vkBindObjectMemory()
389f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
3909cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
391426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    // vkGetImageSubresourceLayout()
392382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkSubresourceLayout subresource_layout(const VkImageSubresource &subres) const;
3939cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
3949cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    bool transparent() const;
3958205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    bool copyable() const { return (format_features_ & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT); }
3969cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
397382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkImageSubresourceRange subresource_range(VkImageAspect aspect) const { return subresource_range(create_info_, aspect); }
398382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkExtent3D extent() const { return create_info_.extent; }
399382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkExtent3D extent(uint32_t mip_level) const { return extent(create_info_.extent, mip_level); }
400382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFormat format() const {return create_info_.format;}
4019cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
402382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkImageMemoryBarrier image_memory_barrier(VkFlags output_mask, VkFlags input_mask,
403382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter                                                  VkImageLayout old_layout,
404382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter                                                  VkImageLayout new_layout,
405382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter                                                  const VkImageSubresourceRange &range) const
4069cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    {
407382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkImageMemoryBarrier barrier = {};
4089cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4099cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.outputMask = output_mask;
4109cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.inputMask = input_mask;
4119cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.oldLayout = old_layout;
4129cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.newLayout = new_layout;
413f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu        barrier.image = handle();
4149cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.subresourceRange = range;
4159cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        return barrier;
4169cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    }
4179cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
418382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkImageCreateInfo create_info();
4193dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchter    static VkImageSubresource subresource(VkImageAspect aspect, uint32_t mip_level, uint32_t array_layer);
4203dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchter    static VkImageSubresource subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer);
421382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkImageSubresourceRange subresource_range(VkImageAspect aspect, uint32_t base_mip_level, uint32_t mip_levels,
4223dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchter                                                     uint32_t base_array_layer, uint32_t array_size);
423382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkImageSubresourceRange subresource_range(const VkImageCreateInfo &info, VkImageAspect aspect);
424382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkImageSubresourceRange subresource_range(const VkImageSubresource &subres);
4259cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
426382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkExtent2D extent(int32_t width, int32_t height);
427382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkExtent2D extent(const VkExtent2D &extent, uint32_t mip_level);
428382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkExtent2D extent(const VkExtent3D &extent);
4299cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
430382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkExtent3D extent(int32_t width, int32_t height, int32_t depth);
431382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkExtent3D extent(const VkExtent3D &extent, uint32_t mip_level);
4329cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
4339cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterprivate:
434382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init_info(const Device &dev, const VkImageCreateInfo &info);
4359cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
436382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkImageCreateInfo create_info_;
437382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFlags format_features_;
438f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
439f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    DeviceMemory internal_mem_;
4409cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
4419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
44276ab1ff1f3572f5722b8c1108c9d8fa57a9a353bChia-I Wuclass ImageView : public internal::NonDispHandle<VkImageView> {
4439cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
44476ab1ff1f3572f5722b8c1108c9d8fa57a9a353bChia-I Wu    ~ImageView();
44576ab1ff1f3572f5722b8c1108c9d8fa57a9a353bChia-I Wu
4469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateImageView()
447382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkImageViewCreateInfo &info);
4489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
4499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
450b48eddb3bb67b48b7319f2752c4110f66e9dc4a3Chia-I Wuclass ShaderModule : public internal::NonDispHandle<VkShaderModule> {
4512d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchterpublic:
452b48eddb3bb67b48b7319f2752c4110f66e9dc4a3Chia-I Wu    ~ShaderModule();
453b48eddb3bb67b48b7319f2752c4110f66e9dc4a3Chia-I Wu
4542d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    // vkCreateShaderModule()
4552d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    void init(const Device &dev, const VkShaderModuleCreateInfo &info);
4562d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    VkResult init_try(const Device &dev, const VkShaderModuleCreateInfo &info);
4572d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter
4582d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    static VkShaderModuleCreateInfo create_info(size_t code_size, const void *code, VkFlags flags);
4592d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter};
4602d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter
461b48eddb3bb67b48b7319f2752c4110f66e9dc4a3Chia-I Wuclass Shader : public internal::NonDispHandle<VkShader> {
4629cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
463b48eddb3bb67b48b7319f2752c4110f66e9dc4a3Chia-I Wu    ~Shader();
464b48eddb3bb67b48b7319f2752c4110f66e9dc4a3Chia-I Wu
4659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateShader()
466382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkShaderCreateInfo &info);
467382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkResult init_try(const Device &dev, const VkShaderCreateInfo &info);
4689cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
46987ae5e14eeb6478f01fe31567cf07fd8bf8f0697Cody Northrop    static VkShaderCreateInfo create_info(VkShaderModule module, const char *pName, VkFlags flags, VkShaderStage stage);
4709cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
4719cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
4722b1d4d0666ed79101b5f5f0a228817fd97ac5c79Chia-I Wuclass Pipeline : public internal::NonDispHandle<VkPipeline> {
4739cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
4742b1d4d0666ed79101b5f5f0a228817fd97ac5c79Chia-I Wu    ~Pipeline();
4752b1d4d0666ed79101b5f5f0a228817fd97ac5c79Chia-I Wu
4769cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateGraphicsPipeline()
477382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
4789cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateGraphicsPipelineDerivative()
479382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info, const VkPipeline basePipeline);
4809cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateComputePipeline()
481382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkComputePipelineCreateInfo &info);
4829cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkLoadPipeline()
4839cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void init(const Device&dev, size_t size, const void *data);
4849cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkLoadPipelineDerivative()
485382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device&dev, size_t size, const void *data, VkPipeline basePipeline);
4869cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
487dc2188c58915eadd6e0cead54dacbfc00605c10dChris Forbes    // vkCreateGraphicsPipeline with error return
488dc2188c58915eadd6e0cead54dacbfc00605c10dChris Forbes    VkResult init_try(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
489dc2188c58915eadd6e0cead54dacbfc00605c10dChris Forbes
4909cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkStorePipeline()
4919cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    size_t store(size_t size, void *data);
4929cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
4939cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
494deb9913579771b8f66442046ae778488e513856aChia-I Wuclass PipelineLayout : public internal::NonDispHandle<VkPipelineLayout> {
495deb9913579771b8f66442046ae778488e513856aChia-I Wupublic:
496deb9913579771b8f66442046ae778488e513856aChia-I Wu    ~PipelineLayout();
497deb9913579771b8f66442046ae778488e513856aChia-I Wu
498deb9913579771b8f66442046ae778488e513856aChia-I Wu    // vCreatePipelineLayout()
499deb9913579771b8f66442046ae778488e513856aChia-I Wu    void init(const Device &dev, VkPipelineLayoutCreateInfo &info, const std::vector<const DescriptorSetLayout *> &layouts);
500deb9913579771b8f66442046ae778488e513856aChia-I Wu};
501deb9913579771b8f66442046ae778488e513856aChia-I Wu
5026abe35d79296718595d738f8b78a6487110fa861Chia-I Wuclass Sampler : public internal::NonDispHandle<VkSampler> {
5039cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
5046abe35d79296718595d738f8b78a6487110fa861Chia-I Wu    ~Sampler();
5056abe35d79296718595d738f8b78a6487110fa861Chia-I Wu
5069cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateSampler()
507382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkSamplerCreateInfo &info);
5089cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
5099cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
51055a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wuclass DescriptorSetLayout : public internal::NonDispHandle<VkDescriptorSetLayout> {
5119cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
51255a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu    ~DescriptorSetLayout();
51355a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu
5149cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateDescriptorSetLayout()
515382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info);
5169cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
5179cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
51855a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wuclass DescriptorPool : public internal::NonDispHandle<VkDescriptorPool> {
5199cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
52055a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu    ~DescriptorPool();
52155a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu
5229cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateDescriptorPool()
523382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, VkDescriptorPoolUsage usage,
524382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter              uint32_t max_sets, const VkDescriptorPoolCreateInfo &info);
5259cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
5269cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkResetDescriptorPool()
5279cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void reset();
5289cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
5299cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkAllocDescriptorSets()
530cf26e07b83fc43011e939b75f0d393a48a5628d0Mark Lobodzinski    std::vector<DescriptorSet *> alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const std::vector<const DescriptorSetLayout *> &layouts);
531cf26e07b83fc43011e939b75f0d393a48a5628d0Mark Lobodzinski    std::vector<DescriptorSet *> alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const DescriptorSetLayout &layout, uint32_t count);
532cf26e07b83fc43011e939b75f0d393a48a5628d0Mark Lobodzinski    DescriptorSet *alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const DescriptorSetLayout &layout);
5339cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
5349cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
53555a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wuclass DescriptorSet : public internal::NonDispHandle<VkDescriptorSet> {
5369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
53755a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu    ~DescriptorSet();
53855a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu
53955a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu    explicit DescriptorSet() : NonDispHandle() {}
540e84a8d680991b8fc0be0d666fb7dcb617b36acc5Tony Barbour    explicit DescriptorSet(const Device &dev, VkDescriptorPool pool, VkDescriptorSet set) : NonDispHandle(dev.handle(), set) { pool_ = pool;}
541e84a8d680991b8fc0be0d666fb7dcb617b36acc5Tony Barbour
542e84a8d680991b8fc0be0d666fb7dcb617b36acc5Tony Barbourprivate:
543e84a8d680991b8fc0be0d666fb7dcb617b36acc5Tony Barbour    VkDescriptorPool pool_;
5449cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
5459cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
546de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbourclass DynamicViewportState : public internal::NonDispHandle<VkDynamicViewportState> {
5479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
5486b11e60997003c59ddfc3944bb24d0fb7a0473cdChia-I Wu    ~DynamicViewportState();
5496b11e60997003c59ddfc3944bb24d0fb7a0473cdChia-I Wu
5509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateDynamicViewportState()
551de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour    void init(const Device &dev, const VkDynamicViewportStateCreateInfo &info);
5529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
5539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
554e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northropclass DynamicLineWidthState : public internal::NonDispHandle<VkDynamicLineWidthState> {
5559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
556e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop    ~DynamicLineWidthState();
5576b11e60997003c59ddfc3944bb24d0fb7a0473cdChia-I Wu
558e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop    // vkCreateDynamicLineWidthState()
559e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop    void init(const Device &dev, const VkDynamicLineWidthStateCreateInfo &info);
560f5bd2253ff4114ac446f8eb820e78d56f711020fCody Northrop};
561f5bd2253ff4114ac446f8eb820e78d56f711020fCody Northrop
562e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northropclass DynamicDepthBiasState : public internal::NonDispHandle<VkDynamicDepthBiasState> {
563f5bd2253ff4114ac446f8eb820e78d56f711020fCody Northroppublic:
564e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop    ~DynamicDepthBiasState();
565f5bd2253ff4114ac446f8eb820e78d56f711020fCody Northrop
566e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop    // vkCreateDynamicDepthBiasState()
567e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop    void init(const Device &dev, const VkDynamicDepthBiasStateCreateInfo &info);
5689cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
5699cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
570e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northropclass DynamicBlendState : public internal::NonDispHandle<VkDynamicBlendState> {
5719cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
572e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop    ~DynamicBlendState();
5736b11e60997003c59ddfc3944bb24d0fb7a0473cdChia-I Wu
574e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop    // vkCreateDynamicBlendState()
575e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop    void init(const Device &dev, const VkDynamicBlendStateCreateInfo &info);
5769cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
5779cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
578e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northropclass DynamicDepthBoundsState : public internal::NonDispHandle<VkDynamicDepthBoundsState> {
5799cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
580e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop    ~DynamicDepthBoundsState();
5816b11e60997003c59ddfc3944bb24d0fb7a0473cdChia-I Wu
582e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop    // vkCreateDynamicDepthBoundsState()
583e4bc6948ada94c7fe0b35a89dbc2542ec4f791a2Cody Northrop    void init(const Device &dev, const VkDynamicDepthBoundsStateCreateInfo &info);
5842605cb05ec149b2e2668540501dc79c71b6a67e9Cody Northrop};
5852605cb05ec149b2e2668540501dc79c71b6a67e9Cody Northrop
5862605cb05ec149b2e2668540501dc79c71b6a67e9Cody Northropclass DynamicStencilState : public internal::NonDispHandle<VkDynamicStencilState> {
5872605cb05ec149b2e2668540501dc79c71b6a67e9Cody Northroppublic:
5882605cb05ec149b2e2668540501dc79c71b6a67e9Cody Northrop    ~DynamicStencilState();
5892605cb05ec149b2e2668540501dc79c71b6a67e9Cody Northrop
5902605cb05ec149b2e2668540501dc79c71b6a67e9Cody Northrop    // vkCreateDynamicStencilState()
5912605cb05ec149b2e2668540501dc79c71b6a67e9Cody Northrop    void init(const Device &dev, const VkDynamicStencilStateCreateInfo &frontInfo, const VkDynamicStencilStateCreateInfo &backInfo);
5929cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
5939cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
594902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchterclass CmdPool : public internal::NonDispHandle<VkCmdPool> {
595902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchterpublic:
596902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter    ~CmdPool();
597902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter
598902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter    explicit CmdPool() : NonDispHandle() {}
599902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter    explicit CmdPool(const Device &dev, const VkCmdPoolCreateInfo &info) { init(dev, info); }
600902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter
601902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter    void init(const Device &dev, const VkCmdPoolCreateInfo &info);
602902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter
603902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter    static VkCmdPoolCreateInfo create_info(uint32_t queue_family_index);
604902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter};
605902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter
606902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchterinline VkCmdPoolCreateInfo CmdPool::create_info(uint32_t queue_family_index)
607902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter{
608902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter    VkCmdPoolCreateInfo info = {};
60973c22f4abf564e8d97d5addbf7d23adaa4b7dc77Tony Barbour    info.sType = VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO;
610902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter    info.queueFamilyIndex = queue_family_index;
611902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter    return info;
612902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter}
613902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter
61478c2a35016c72b92ce5d6fd705deb31736162607Chia-I Wuclass CmdBuffer : public internal::Handle<VkCmdBuffer> {
6159cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterpublic:
61678c2a35016c72b92ce5d6fd705deb31736162607Chia-I Wu    ~CmdBuffer();
61778c2a35016c72b92ce5d6fd705deb31736162607Chia-I Wu
61878c2a35016c72b92ce5d6fd705deb31736162607Chia-I Wu    explicit CmdBuffer() : Handle() {}
619382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    explicit CmdBuffer(const Device &dev, const VkCmdBufferCreateInfo &info) { init(dev, info); }
6209cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
6219cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateCommandBuffer()
622382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkCmdBufferCreateInfo &info);
6239cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
6249cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkBeginCommandBuffer()
625382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void begin(const VkCmdBufferBeginInfo *info);
6269cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void begin();
6279cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
6289cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkEndCommandBuffer()
6299cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkResetCommandBuffer()
6309cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void end();
631f02f9f8606b4b6b1604f7efd62ec5fc5bd6dfef8Cody Northrop    void reset(VkCmdBufferResetFlags flags);
632f02f9f8606b4b6b1604f7efd62ec5fc5bd6dfef8Cody Northrop    void reset() { reset(VK_CMD_BUFFER_RESET_RELEASE_RESOURCES); }
6339cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
634902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter    static VkCmdBufferCreateInfo create_info(VkCmdPool const &pool);
63578c2a35016c72b92ce5d6fd705deb31736162607Chia-I Wu
63678c2a35016c72b92ce5d6fd705deb31736162607Chia-I Wuprivate:
63778c2a35016c72b92ce5d6fd705deb31736162607Chia-I Wu    VkDevice dev_handle_;
6389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
6399cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
640ba0836f623e3a756bf0cac72d5a688430d2a3420Chia-I Wuinline VkMemoryAllocInfo DeviceMemory::alloc_info(VkDeviceSize size, uint32_t memory_type_index)
6419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
642ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    VkMemoryAllocInfo info = {};
6439cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
644ba0836f623e3a756bf0cac72d5a688430d2a3420Chia-I Wu    info.allocationSize = size;
645ba0836f623e3a756bf0cac72d5a688430d2a3420Chia-I Wu    info.memoryTypeIndex = memory_type_index;
6469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
6479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
6489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
6498205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbourinline VkBufferCreateInfo Buffer::create_info(VkDeviceSize size, VkFlags usage)
6509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
651ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    VkBufferCreateInfo info = {};
6529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.size = size;
6549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.usage = usage;
6559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
6569cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
6579cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
658382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkFenceCreateInfo Fence::create_info(VkFenceCreateFlags flags)
6599cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
660382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFenceCreateInfo info = {};
6619cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6629cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.flags = flags;
6639cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
6649cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
6659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
666382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkFenceCreateInfo Fence::create_info()
6679cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
668382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFenceCreateInfo info = {};
6699cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6709cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
6719cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
6729cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
673864fd38da3f44dfe26e043f26f0cecad29a1cfd6Tony Barbourinline VkSemaphoreCreateInfo Semaphore::create_info(VkFlags flags)
6749cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
675382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkSemaphoreCreateInfo info = {};
6769cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6779cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.flags = flags;
6789cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
6799cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
6809cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
681382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkEventCreateInfo Event::create_info(VkFlags flags)
6829cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
683382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkEventCreateInfo info = {};
6849cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6859cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.flags = flags;
6869cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
6879cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
6889cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
689382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkQueryPoolCreateInfo QueryPool::create_info(VkQueryType type, uint32_t slot_count)
6909cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
691382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkQueryPoolCreateInfo info = {};
6929cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
6939cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.queryType = type;
6949cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.slots = slot_count;
6959cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
6969cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
6979cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
698382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkImageCreateInfo Image::create_info()
6999cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
700382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkImageCreateInfo info = {};
7019cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7029cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.extent.width = 1;
7039cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.extent.height = 1;
7049cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.extent.depth = 1;
7059cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.mipLevels = 1;
7069cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.arraySize = 1;
7079cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.samples = 1;
7089cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
7099cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7109cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
7113dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchterinline VkImageSubresource Image::subresource(VkImageAspect aspect, uint32_t mip_level, uint32_t array_layer)
7129cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
713382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkImageSubresource subres = {};
7149cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    subres.aspect = aspect;
7159cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    subres.mipLevel = mip_level;
7163dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchter    subres.arrayLayer = array_layer;
7179cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return subres;
7189cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7199cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
7203dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchterinline VkImageSubresource Image::subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer)
7219cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
7223dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchter    return subresource(range.aspect, range.baseMipLevel + mip_level, range.baseArrayLayer + array_layer);
7239cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7249cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
725382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkImageSubresourceRange Image::subresource_range(VkImageAspect aspect, uint32_t base_mip_level, uint32_t mip_levels,
7263dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchter                                                        uint32_t base_array_layer, uint32_t array_size)
7279cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
728382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkImageSubresourceRange range = {};
7299cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    range.aspect = aspect;
7309cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    range.baseMipLevel = base_mip_level;
7319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    range.mipLevels = mip_levels;
7323dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchter    range.baseArrayLayer = base_array_layer;
7339cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    range.arraySize = array_size;
7349cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return range;
7359cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
737382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkImageSubresourceRange Image::subresource_range(const VkImageCreateInfo &info, VkImageAspect aspect)
7389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
7399cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return subresource_range(aspect, 0, info.mipLevels, 0, info.arraySize);
7409cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
742382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkImageSubresourceRange Image::subresource_range(const VkImageSubresource &subres)
7439cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
7443dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchter    return subresource_range(subres.aspect, subres.mipLevel, 1, subres.arrayLayer, 1);
7459cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
747382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkExtent2D Image::extent(int32_t width, int32_t height)
7489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
749382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkExtent2D extent = {};
7509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    extent.width = width;
7519cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    extent.height = height;
7529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return extent;
7539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
755382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkExtent2D Image::extent(const VkExtent2D &extent, uint32_t mip_level)
7569cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
7579cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const int32_t width  = (extent.width  >> mip_level) ? extent.width  >> mip_level : 1;
7589cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const int32_t height = (extent.height >> mip_level) ? extent.height >> mip_level : 1;
7599cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return Image::extent(width, height);
7609cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7619cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
762382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkExtent2D Image::extent(const VkExtent3D &extent)
7639cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
7649cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return Image::extent(extent.width, extent.height);
7659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7669cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
767382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkExtent3D Image::extent(int32_t width, int32_t height, int32_t depth)
7689cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
769382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkExtent3D extent = {};
7709cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    extent.width = width;
7719cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    extent.height = height;
7729cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    extent.depth = depth;
7739cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return extent;
7749cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7759cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
776382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchterinline VkExtent3D Image::extent(const VkExtent3D &extent, uint32_t mip_level)
7779cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
7789cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const int32_t width  = (extent.width  >> mip_level) ? extent.width  >> mip_level : 1;
7799cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const int32_t height = (extent.height >> mip_level) ? extent.height >> mip_level : 1;
7809cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const int32_t depth  = (extent.depth  >> mip_level) ? extent.depth  >> mip_level : 1;
7819cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return Image::extent(width, height, depth);
7829cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7839cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
7842d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchterinline VkShaderModuleCreateInfo ShaderModule::create_info(size_t code_size, const void *code, VkFlags flags)
7859cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
7862d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    VkShaderModuleCreateInfo info = {};
7872d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
7889cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.codeSize = code_size;
7899cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.pCode = code;
7909cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.flags = flags;
7919cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
7929cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7939cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
79487ae5e14eeb6478f01fe31567cf07fd8bf8f0697Cody Northropinline VkShaderCreateInfo Shader::create_info(VkShaderModule module, const char *pName, VkFlags flags, VkShaderStage stage)
7952d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter{
7962d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    VkShaderCreateInfo info = {};
7972d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO;
7982d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    info.module = module;
7992d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    info.pName = pName;
8002d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    info.flags = flags;
80187ae5e14eeb6478f01fe31567cf07fd8bf8f0697Cody Northrop    info.stage = stage;
8022d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    return info;
8032d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter}
8042d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter
8058cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wuinline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
8068cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu                                                         VkDescriptorType type, uint32_t count, const VkDescriptorInfo *descriptors)
8079cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
8088cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    VkWriteDescriptorSet write = {};
8098cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
81055a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu    write.destSet = set.handle();
8118cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    write.destBinding = binding;
8128cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    write.destArrayElement = array_element;
8138cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    write.count = count;
8148cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    write.descriptorType = type;
8158cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    write.pDescriptors = descriptors;
8168cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    return write;
8179cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
8189cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
8198cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wuinline VkWriteDescriptorSet Device::write_descriptor_set(const DescriptorSet &set, uint32_t binding, uint32_t array_element,
8208cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu                                                         VkDescriptorType type, const std::vector<VkDescriptorInfo> &descriptors)
8219cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
8228cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    return write_descriptor_set(set, binding, array_element, type, descriptors.size(), &descriptors[0]);
8239cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
8249cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
8258cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wuinline VkCopyDescriptorSet Device::copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding, uint32_t src_array_element,
8268cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu                                                       const DescriptorSet &dst_set, uint32_t dst_binding, uint32_t dst_array_element,
8278cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu                                                       uint32_t count)
8289cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
8298cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    VkCopyDescriptorSet copy = {};
8308cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    copy.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
83155a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu    copy.srcSet = src_set.handle();
8328cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    copy.srcBinding = src_binding;
8338cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    copy.srcArrayElement = src_array_element;
83455a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu    copy.destSet = dst_set.handle();
8358cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    copy.destBinding = dst_binding;
8368cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    copy.destArrayElement = dst_array_element;
8378cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    copy.count = count;
8389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
8398cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    return copy;
8409cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
8419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
842902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchterinline VkCmdBufferCreateInfo CmdBuffer::create_info(VkCmdPool const &pool)
8439cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter{
844382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkCmdBufferCreateInfo info = {};
8459cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO;
846f02f9f8606b4b6b1604f7efd62ec5fc5bd6dfef8Cody Northrop    info.cmdPool = pool;
8479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
8489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
8499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
8509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}; // namespace vk_testing
8519cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
8529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#endif // VKTESTBINDING_H
853