199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz/*
299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * Copyright (c) 2015-2016 The Khronos Group Inc.
399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * Copyright (c) 2015-2016 Valve Corporation
499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * Copyright (c) 2015-2016 LunarG, Inc.
599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz *
699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * Permission is hereby granted, free of charge, to any person obtaining a copy
799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * of this software and/or associated documentation files (the "Materials"), to
899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * deal in the Materials without restriction, including without limitation the
999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * sell copies of the Materials, and to permit persons to whom the Materials are
1199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * furnished to do so, subject to the following conditions:
1299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz *
1399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * The above copyright notice(s) and this permission notice shall be included in
1499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * all copies or substantial portions of the Materials.
1599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz *
1699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
1999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz *
2099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
2199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
2399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * USE OR OTHER DEALINGS IN THE MATERIALS.
2499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz *
2599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
2699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * Author: Cody Northrop <cody@lunarg.com>
2799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz */
289cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
299cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#ifndef VKTESTBINDING_H
309cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#define VKTESTBINDING_H
319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
329cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#include <vector>
33a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu#include <assert.h>
349cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
35329ca9eb16cdbee7a7644fb08ade7b3d3bb32e23David Pinedo#include "vulkan/vulkan.h"
369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
379cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchternamespace vk_testing {
389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
3999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultztypedef void (*ErrorCallback)(const char *expr, const char *file,
4099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                              unsigned int line, const char *function);
419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchtervoid set_error_callback(ErrorCallback callback);
429cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
43f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wuclass PhysicalDevice;
449cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Device;
459cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Queue;
46ba0836f623e3a756bf0cac72d5a688430d2a3420Chia-I Wuclass DeviceMemory;
479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Fence;
489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Semaphore;
499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Event;
509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass QueryPool;
519cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Buffer;
529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass BufferView;
539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Image;
549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass ImageView;
559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass DepthStencilView;
569cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Shader;
579cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Pipeline;
589cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass PipelineDelta;
599cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass Sampler;
609cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass DescriptorSetLayout;
61556f721b927c7f8bf6f37dd502afe8ebf3b76719Mark Lobodzinskiclass PipelineLayout;
629cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass DescriptorSetPool;
639cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchterclass DescriptorSet;
641f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wuclass CommandBuffer;
651f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wuclass CommandPool;
669cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
6718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstd::vector<VkLayerProperties> GetGlobalLayers();
6818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstd::vector<VkExtensionProperties> GetGlobalExtensions();
6918061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchterstd::vector<VkExtensionProperties> GetGlobalExtensions(const char *pLayerName);
7018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter
71a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wunamespace internal {
72a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
7399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultztemplate <typename T> class Handle {
7499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
75a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    const T &handle() const { return handle_; }
76a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    bool initialized() const { return (handle_ != VK_NULL_HANDLE); }
77a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
7899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  protected:
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
8499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init(T handle) {
85a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu        assert(!initialized());
86a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu        handle_ = handle;
87a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    }
88a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
8999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  private:
90a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    // handles are non-copyable
91a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    Handle(const Handle &);
92a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    Handle &operator=(const Handle &);
93a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
94a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    T handle_;
95a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu};
96a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
9799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultztemplate <typename T> class NonDispHandle : public Handle<T> {
9899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  protected:
99a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    explicit NonDispHandle() : Handle<T>(), dev_handle_(VK_NULL_HANDLE) {}
10099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    explicit NonDispHandle(VkDevice dev, T handle)
10199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        : Handle<T>(handle), dev_handle_(dev) {}
102a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
103a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    const VkDevice &device() const { return dev_handle_; }
104a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
10599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init(VkDevice dev, T handle) {
106a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu        assert(!Handle<T>::initialized() && dev_handle_ == VK_NULL_HANDLE);
107a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu        Handle<T>::init(handle);
108a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu        dev_handle_ = dev;
109a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    }
110a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
11199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  private:
112a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu    VkDevice dev_handle_;
113a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu};
114a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
115a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu} // namespace internal
116a10be9d8a28a559a0de069fc590d550a0c101430Chia-I Wu
117f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wuclass PhysicalDevice : public internal::Handle<VkPhysicalDevice> {
11899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
11999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    explicit PhysicalDevice(VkPhysicalDevice phy) : Handle(phy) {
120723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski        memory_properties_ = memory_properties();
121ddaecf8b7983676feae8a8c26faf2cceca4b2adeMark Lobodzinski        device_properties_ = properties();
122723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    }
1239cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1248205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDeviceProperties properties() const;
1258205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    VkPhysicalDeviceMemoryProperties memory_properties() const;
126ef72e2a7cf4fa5708fdbfbc1c972a24ad0dbf809Cody Northrop    std::vector<VkQueueFamilyProperties> queue_properties() const;
1279cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
12899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    bool set_memory_type(const uint32_t type_bits, VkMemoryAllocateInfo *info,
12999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         const VkMemoryPropertyFlags properties,
13099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         const VkMemoryPropertyFlags forbid = 0) const;
1319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
13274c4ce9c4fa101c0989a29cf918e799fa67adcecCourtney Goeltzenleuchter    // vkEnumerateDeviceExtensionProperties()
1331c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    std::vector<VkExtensionProperties> extensions() const;
13499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    std::vector<VkExtensionProperties> extensions(const char *pLayerName) const;
1359cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkEnumerateLayers()
137f5c61951493d13d4fda80bce2d36fab7b6f449aaCourtney Goeltzenleuchter    std::vector<VkLayerProperties> layers() const;
1389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
13999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  private:
14099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void
14199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    add_extension_dependencies(uint32_t dependency_count,
14299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                               VkExtensionProperties *depencency_props,
14399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                               std::vector<VkExtensionProperties> &ext_list);
144f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wu
145723462910ef2f9ed0255b74399c835020a75a0b1Mark Lobodzinski    VkPhysicalDeviceMemoryProperties memory_properties_;
146ddaecf8b7983676feae8a8c26faf2cceca4b2adeMark Lobodzinski
147ddaecf8b7983676feae8a8c26faf2cceca4b2adeMark Lobodzinski    VkPhysicalDeviceProperties device_properties_;
1489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
1499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
150a263629c001e522a146c68e253979c20482becfbChia-I Wuclass Device : public internal::Handle<VkDevice> {
15199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
152f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wu    explicit Device(VkPhysicalDevice phy) : phy_(phy) {}
1539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    ~Device();
1549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateDevice()
156ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    void init(const VkDeviceCreateInfo &info);
15799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init(std::vector<const char *> &layers,
15899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz              std::vector<const char *> &
15999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                  extensions); // all queues, all extensions, etc
16099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init() {
16199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        std::vector<const char *> layers;
16299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        std::vector<const char *> extensions;
16399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        init(layers, extensions);
16499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    };
1659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
166f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wu    const PhysicalDevice &phy() const { return phy_; }
1679cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1681245cec54fd74fea87bc95913788726054a91518Jon Ashburn    // vkGetDeviceProcAddr()
16999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    PFN_vkVoidFunction get_proc(const char *name) const {
17099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        return vkGetDeviceProcAddr(handle(), name);
17199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
1721245cec54fd74fea87bc95913788726054a91518Jon Ashburn
1739cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkGetDeviceQueue()
17499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    const std::vector<Queue *> &graphics_queues() const {
17599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        return queues_[GRAPHICS];
17699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
1779cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const std::vector<Queue *> &compute_queues() { return queues_[COMPUTE]; }
1789cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const std::vector<Queue *> &dma_queues() { return queues_[DMA]; }
1799cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    uint32_t graphics_queue_node_index_;
1809cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1819cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    struct Format {
182382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkFormat format;
183382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkImageTiling tiling;
184382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkFlags features;
1859cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    };
1869cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkGetFormatInfo()
187382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFormatProperties format_properties(VkFormat format);
1889cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const std::vector<Format> &formats() const { return formats_; }
1899cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1909cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkDeviceWaitIdle()
1919cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void wait();
1929cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
1939cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkWaitForFences()
19499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkResult wait(const std::vector<const Fence *> &fences, bool wait_all,
19599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                  uint64_t timeout);
19699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkResult wait(const Fence &fence) {
19799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        return wait(std::vector<const Fence *>(1, &fence), true, (uint64_t)-1);
19899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
1999cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2008cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    // vkUpdateDescriptorSets()
20199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes,
20299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                const std::vector<VkCopyDescriptorSet> &copies);
20399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void
20499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    update_descriptor_sets(const std::vector<VkWriteDescriptorSet> &writes) {
20599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        return update_descriptor_sets(writes,
20699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                      std::vector<VkCopyDescriptorSet>());
20799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
20899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz
20999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkWriteDescriptorSet
21099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    write_descriptor_set(const DescriptorSet &set, uint32_t binding,
21199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         uint32_t array_element, VkDescriptorType type,
21299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         uint32_t count,
21399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         const VkDescriptorImageInfo *image_info);
21499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkWriteDescriptorSet
21599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    write_descriptor_set(const DescriptorSet &set, uint32_t binding,
21699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         uint32_t array_element, VkDescriptorType type,
21799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         uint32_t count,
21899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         const VkDescriptorBufferInfo *buffer_info);
21999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkWriteDescriptorSet
22099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    write_descriptor_set(const DescriptorSet &set, uint32_t binding,
22199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         uint32_t array_element, VkDescriptorType type,
22299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         uint32_t count, const VkBufferView *buffer_views);
22399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkWriteDescriptorSet
22499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    write_descriptor_set(const DescriptorSet &set, uint32_t binding,
22599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         uint32_t array_element, VkDescriptorType type,
22699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         const std::vector<VkDescriptorImageInfo> &image_info);
22799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkWriteDescriptorSet write_descriptor_set(
22899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        const DescriptorSet &set, uint32_t binding, uint32_t array_element,
22999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        VkDescriptorType type,
23099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        const std::vector<VkDescriptorBufferInfo> &buffer_info);
23199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkWriteDescriptorSet
23299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    write_descriptor_set(const DescriptorSet &set, uint32_t binding,
23399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         uint32_t array_element, VkDescriptorType type,
23499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         const std::vector<VkBufferView> &buffer_views);
23599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz
23699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkCopyDescriptorSet
23799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding,
23899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                        uint32_t src_array_element,
23999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                        const DescriptorSet &dst_set, uint32_t dst_binding,
24099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                        uint32_t dst_array_element, uint32_t count);
24199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz
24299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  private:
2439cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    enum QueueIndex {
2449cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        GRAPHICS,
2459cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        COMPUTE,
2469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        DMA,
2479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        QUEUE_COUNT,
2489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    };
2499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void init_queues();
2519cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void init_formats();
2529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
253f5fb1092e95a6d5d38ef65c4f9504e7ea4f9ce59Chia-I Wu    PhysicalDevice phy_;
2549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    std::vector<Queue *> queues_[QUEUE_COUNT];
2569cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    std::vector<Format> formats_;
2579cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
2589cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
259f2862c7fc1528f109583276ec4c92e131aa540b4Chia-I Wuclass Queue : public internal::Handle<VkQueue> {
26099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
26199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    explicit Queue(VkQueue queue, int index) : Handle(queue) {
26299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        family_index_ = index;
26399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
2649cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkQueueSubmit()
2661f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    void submit(const std::vector<const CommandBuffer *> &cmds, Fence &fence);
2671f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    void submit(const CommandBuffer &cmd, Fence &fence);
2681f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    void submit(const CommandBuffer &cmd);
2699cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2709cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkQueueWaitIdle()
2719cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void wait();
2729cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
27399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    int get_family_index() { return family_index_; }
2740caa94f5c686c2b9eaf57594b72a67fb9f440df1Tony Barbour
27599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  private:
2760caa94f5c686c2b9eaf57594b72a67fb9f440df1Tony Barbour    int family_index_;
2779cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
2789cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
279ba0836f623e3a756bf0cac72d5a688430d2a3420Chia-I Wuclass DeviceMemory : public internal::NonDispHandle<VkDeviceMemory> {
28099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
281ba0836f623e3a756bf0cac72d5a688430d2a3420Chia-I Wu    ~DeviceMemory();
2829cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2831f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    // vkAllocateMemory()
2841f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    void init(const Device &dev, const VkMemoryAllocateInfo &info);
2859cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2869cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkMapMemory()
287382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    const void *map(VkFlags flags) const;
28899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void *map(VkFlags flags);
2899cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    const void *map() const { return map(0); }
29099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void *map() { return map(0); }
2919cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
2929cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkUnmapMemory()
2939cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void unmap() const;
2949cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
29599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkMemoryAllocateInfo alloc_info(VkDeviceSize size,
29699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                           uint32_t memory_type_index);
2979cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
2989cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
299a49923427e634a6ba14c610861284b2aa2291cbaChia-I Wuclass Fence : public internal::NonDispHandle<VkFence> {
30099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
301a49923427e634a6ba14c610861284b2aa2291cbaChia-I Wu    ~Fence();
302a49923427e634a6ba14c610861284b2aa2291cbaChia-I Wu
3039cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateFence()
304382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkFenceCreateInfo &info);
3059cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
3069cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkGetFenceStatus()
307a49923427e634a6ba14c610861284b2aa2291cbaChia-I Wu    VkResult status() const { return vkGetFenceStatus(device(), handle()); }
3089cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
309382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkFenceCreateInfo create_info(VkFenceCreateFlags flags);
310382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkFenceCreateInfo create_info();
3119cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
3129cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
3132454b9236ddcc40638aec9ac33de3ab570621f64Chia-I Wuclass Semaphore : public internal::NonDispHandle<VkSemaphore> {
31499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
3152454b9236ddcc40638aec9ac33de3ab570621f64Chia-I Wu    ~Semaphore();
3162454b9236ddcc40638aec9ac33de3ab570621f64Chia-I Wu
3179cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateSemaphore()
318382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkSemaphoreCreateInfo &info);
3199cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
320864fd38da3f44dfe26e043f26f0cecad29a1cfd6Tony Barbour    static VkSemaphoreCreateInfo create_info(VkFlags flags);
3219cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
3229cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
3239b6db1d5d991a4f98a99e8510d9d85b67f117e04Chia-I Wuclass Event : public internal::NonDispHandle<VkEvent> {
32499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
3259b6db1d5d991a4f98a99e8510d9d85b67f117e04Chia-I Wu    ~Event();
3269b6db1d5d991a4f98a99e8510d9d85b67f117e04Chia-I Wu
3279cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateEvent()
328382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkEventCreateInfo &info);
3299cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
3309cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkGetEventStatus()
3319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkSetEvent()
3329cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkResetEvent()
3339b6db1d5d991a4f98a99e8510d9d85b67f117e04Chia-I Wu    VkResult status() const { return vkGetEventStatus(device(), handle()); }
3349cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void set();
3359cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void reset();
3369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
337382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkEventCreateInfo create_info(VkFlags flags);
3389cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
3399cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
340fd0ce99eac2a9faa48c76702ec0a4c533389d435Chia-I Wuclass QueryPool : public internal::NonDispHandle<VkQueryPool> {
34199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
342fd0ce99eac2a9faa48c76702ec0a4c533389d435Chia-I Wu    ~QueryPool();
343fd0ce99eac2a9faa48c76702ec0a4c533389d435Chia-I Wu
3449cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateQueryPool()
345382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkQueryPoolCreateInfo &info);
3469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
3479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkGetQueryPoolResults()
34899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkResult results(uint32_t first, uint32_t count, size_t size, void *data,
34999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                     size_t stride);
3509cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
35199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkQueryPoolCreateInfo create_info(VkQueryType type,
35299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                             uint32_t slot_count);
3539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
3549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
355f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wuclass Buffer : public internal::NonDispHandle<VkBuffer> {
35699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
357f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    explicit Buffer() : NonDispHandle() {}
35899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    explicit Buffer(const Device &dev, const VkBufferCreateInfo &info) {
35999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        init(dev, info);
36099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
3618205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    explicit Buffer(const Device &dev, VkDeviceSize size) { init(dev, size); }
3629cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
363f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    ~Buffer();
364f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
3659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateBuffer()
36699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init(const Device &dev, const VkBufferCreateInfo &info,
36799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz              VkMemoryPropertyFlags mem_props);
36899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init(const Device &dev, const VkBufferCreateInfo &info) {
36999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        init(dev, info, 0);
37099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
37199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init(const Device &dev, VkDeviceSize size,
37299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz              VkMemoryPropertyFlags mem_props) {
37399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        init(dev, create_info(size, 0), mem_props);
37499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
375f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    void init(const Device &dev, VkDeviceSize size) { init(dev, size, 0); }
37699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init_as_src(const Device &dev, VkDeviceSize size,
37799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                     VkMemoryPropertyFlags &reqs) {
37899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT), reqs);
37999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
38099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init_as_dst(const Device &dev, VkDeviceSize size,
38199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                     VkMemoryPropertyFlags &reqs) {
38299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_DST_BIT), reqs);
38399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
38499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init_as_src_and_dst(const Device &dev, VkDeviceSize size,
38599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             VkMemoryPropertyFlags &reqs) {
38699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        init(dev, create_info(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
38799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                        VK_BUFFER_USAGE_TRANSFER_DST_BIT),
38899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz             reqs);
38999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
390ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    void init_no_mem(const Device &dev, const VkBufferCreateInfo &info);
3919cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
392f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    // get the internal memory
393f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    const DeviceMemory &memory() const { return internal_mem_; }
39499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    DeviceMemory &memory() { return internal_mem_; }
395f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
396f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    // vkGetObjectMemoryRequirements()
397f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    VkMemoryRequirements memory_requirements() const;
398f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
399f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    // vkBindObjectMemory()
400f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
401fb9f5646a9f331a834d2e318d503a213cba490d7Mark Lobodzinski
4028205d901f17b1c76d89c956be235cf4e7a20a546Tony Barbour    static VkBufferCreateInfo create_info(VkDeviceSize size, VkFlags usage);
4039cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
40499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkBufferMemoryBarrier buffer_memory_barrier(VkFlags output_mask,
40599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                                VkFlags input_mask,
40699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                                VkDeviceSize offset,
40799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                                VkDeviceSize size) const {
408382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkBufferMemoryBarrier barrier = {};
4099cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
410f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu        barrier.buffer = handle();
411989de845e6627fecee8dceef882955149b7538baChia-I Wu        barrier.srcAccessMask = output_mask;
412989de845e6627fecee8dceef882955149b7538baChia-I Wu        barrier.dstAccessMask = input_mask;
4139cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.offset = offset;
4149cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.size = size;
4159cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        return barrier;
4169cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    }
417f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
41899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  private:
419ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    VkBufferCreateInfo create_info_;
420f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
421f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    DeviceMemory internal_mem_;
4229cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
4239cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
42476ab1ff1f3572f5722b8c1108c9d8fa57a9a353bChia-I Wuclass BufferView : public internal::NonDispHandle<VkBufferView> {
42599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
42676ab1ff1f3572f5722b8c1108c9d8fa57a9a353bChia-I Wu    ~BufferView();
42776ab1ff1f3572f5722b8c1108c9d8fa57a9a353bChia-I Wu
4289cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateBufferView()
429ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    void init(const Device &dev, const VkBufferViewCreateInfo &info);
4309cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
4319cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
432f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wuclass Image : public internal::NonDispHandle<VkImage> {
43399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
434f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    explicit Image() : NonDispHandle(), format_features_(0) {}
43599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    explicit Image(const Device &dev, const VkImageCreateInfo &info)
43699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        : format_features_(0) {
43799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        init(dev, info);
43899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
4399cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
440f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    ~Image();
441f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
4429cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateImage()
44399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init(const Device &dev, const VkImageCreateInfo &info,
44499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz              VkMemoryPropertyFlags mem_props);
44599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init(const Device &dev, const VkImageCreateInfo &info) {
44699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        init(dev, info, 0);
44799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
448382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init_no_mem(const Device &dev, const VkImageCreateInfo &info);
4499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
450f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    // get the internal memory
451f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    const DeviceMemory &memory() const { return internal_mem_; }
45299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    DeviceMemory &memory() { return internal_mem_; }
453f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
454f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    // vkGetObjectMemoryRequirements()
455f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    VkMemoryRequirements memory_requirements() const;
456f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
457f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    // vkBindObjectMemory()
458f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    void bind_memory(const DeviceMemory &mem, VkDeviceSize mem_offset);
4599cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
460426b90566abae5716741aade41184dc4dafe4aa4Tony Barbour    // vkGetImageSubresourceLayout()
46199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkSubresourceLayout
46299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    subresource_layout(const VkImageSubresource &subres) const;
46399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkSubresourceLayout
46499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    subresource_layout(const VkImageSubresourceLayers &subres) const;
4659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
4669cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    bool transparent() const;
46799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    bool copyable() const {
46899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        return (format_features_ & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
46999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
4709cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
47199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkImageSubresourceRange
47299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    subresource_range(VkImageAspectFlagBits aspect) const {
47399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        return subresource_range(create_info_, aspect);
47499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
475382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkExtent3D extent() const { return create_info_.extent; }
47699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkExtent3D extent(uint32_t mip_level) const {
47799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        return extent(create_info_.extent, mip_level);
47899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
47999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkFormat format() const { return create_info_.format; }
48099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz
48199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkImageMemoryBarrier
48299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    image_memory_barrier(VkFlags output_mask, VkFlags input_mask,
48399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         VkImageLayout old_layout, VkImageLayout new_layout,
48499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         const VkImageSubresourceRange &range) const {
485382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter        VkImageMemoryBarrier barrier = {};
4869cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
487989de845e6627fecee8dceef882955149b7538baChia-I Wu        barrier.srcAccessMask = output_mask;
488989de845e6627fecee8dceef882955149b7538baChia-I Wu        barrier.dstAccessMask = input_mask;
4899cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.oldLayout = old_layout;
4909cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.newLayout = new_layout;
491f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu        barrier.image = handle();
4929cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        barrier.subresourceRange = range;
4939cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        return barrier;
4949cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    }
4959cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
496382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkImageCreateInfo create_info();
497ba11ebe8763601875a5a0c925610088ab317ef06Courtney Goeltzenleuchter    static VkImageAspectFlagBits image_aspect(VkImageAspectFlags flags);
49899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkImageSubresource subresource(VkImageAspectFlagBits aspect,
49999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                          uint32_t mip_level,
50099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                          uint32_t array_layer);
50199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkImageSubresource subresource(const VkImageSubresourceRange &range,
50299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                          uint32_t mip_level,
50399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                          uint32_t array_layer);
50499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkImageSubresourceLayers subresource(VkImageAspectFlagBits aspect,
50599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                                uint32_t mip_level,
50699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                                uint32_t array_layer,
50799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                                uint32_t array_size);
50899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkImageSubresourceLayers
50999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    subresource(const VkImageSubresourceRange &range, uint32_t mip_level,
51099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                uint32_t array_layer, uint32_t array_size);
51199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkImageSubresourceRange
51299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    subresource_range(VkImageAspectFlags aspect_mask, uint32_t base_mip_level,
51399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                      uint32_t mip_levels, uint32_t base_array_layer,
51499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                      uint32_t num_layers);
51599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkImageSubresourceRange
51699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    subresource_range(const VkImageCreateInfo &info,
51799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                      VkImageAspectFlags aspect_mask);
51899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkImageSubresourceRange
51999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    subresource_range(const VkImageSubresource &subres);
5209cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
521382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkExtent2D extent(int32_t width, int32_t height);
522382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkExtent2D extent(const VkExtent2D &extent, uint32_t mip_level);
523382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkExtent2D extent(const VkExtent3D &extent);
5249cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
525382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkExtent3D extent(int32_t width, int32_t height, int32_t depth);
526382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    static VkExtent3D extent(const VkExtent3D &extent, uint32_t mip_level);
5279cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
52899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  private:
529382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init_info(const Device &dev, const VkImageCreateInfo &info);
5309cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
531382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkImageCreateInfo create_info_;
532382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFlags format_features_;
533f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu
534f4aed6c620084a7748e9d7be3897ae736f03d165Chia-I Wu    DeviceMemory internal_mem_;
5359cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
5369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
53776ab1ff1f3572f5722b8c1108c9d8fa57a9a353bChia-I Wuclass ImageView : public internal::NonDispHandle<VkImageView> {
53899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
53976ab1ff1f3572f5722b8c1108c9d8fa57a9a353bChia-I Wu    ~ImageView();
54076ab1ff1f3572f5722b8c1108c9d8fa57a9a353bChia-I Wu
5419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateImageView()
542382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkImageViewCreateInfo &info);
5439cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
5449cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
545b48eddb3bb67b48b7319f2752c4110f66e9dc4a3Chia-I Wuclass ShaderModule : public internal::NonDispHandle<VkShaderModule> {
54699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
547b48eddb3bb67b48b7319f2752c4110f66e9dc4a3Chia-I Wu    ~ShaderModule();
548b48eddb3bb67b48b7319f2752c4110f66e9dc4a3Chia-I Wu
5492d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    // vkCreateShaderModule()
5502d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    void init(const Device &dev, const VkShaderModuleCreateInfo &info);
5512d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    VkResult init_try(const Device &dev, const VkShaderModuleCreateInfo &info);
5522d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter
55399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static VkShaderModuleCreateInfo
55499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    create_info(size_t code_size, const uint32_t *code, VkFlags flags);
5552d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter};
5562d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter
5572b1d4d0666ed79101b5f5f0a228817fd97ac5c79Chia-I Wuclass Pipeline : public internal::NonDispHandle<VkPipeline> {
55899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
5592b1d4d0666ed79101b5f5f0a228817fd97ac5c79Chia-I Wu    ~Pipeline();
5602b1d4d0666ed79101b5f5f0a228817fd97ac5c79Chia-I Wu
5619cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateGraphicsPipeline()
562382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
5639cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateGraphicsPipelineDerivative()
56499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info,
56599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz              const VkPipeline basePipeline);
5669cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateComputePipeline()
567382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkComputePipelineCreateInfo &info);
5689cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkLoadPipeline()
56999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init(const Device &dev, size_t size, const void *data);
5709cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkLoadPipelineDerivative()
57199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init(const Device &dev, size_t size, const void *data,
57299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz              VkPipeline basePipeline);
5739cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
574dc2188c58915eadd6e0cead54dacbfc00605c10dChris Forbes    // vkCreateGraphicsPipeline with error return
57599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkResult init_try(const Device &dev,
57699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                      const VkGraphicsPipelineCreateInfo &info);
577dc2188c58915eadd6e0cead54dacbfc00605c10dChris Forbes
5789cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkStorePipeline()
5799cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    size_t store(size_t size, void *data);
5809cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
5819cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
582deb9913579771b8f66442046ae778488e513856aChia-I Wuclass PipelineLayout : public internal::NonDispHandle<VkPipelineLayout> {
58399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
584deb9913579771b8f66442046ae778488e513856aChia-I Wu    ~PipelineLayout();
585deb9913579771b8f66442046ae778488e513856aChia-I Wu
586deb9913579771b8f66442046ae778488e513856aChia-I Wu    // vCreatePipelineLayout()
58799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void init(const Device &dev, VkPipelineLayoutCreateInfo &info,
58899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz              const std::vector<const DescriptorSetLayout *> &layouts);
589deb9913579771b8f66442046ae778488e513856aChia-I Wu};
590deb9913579771b8f66442046ae778488e513856aChia-I Wu
5916abe35d79296718595d738f8b78a6487110fa861Chia-I Wuclass Sampler : public internal::NonDispHandle<VkSampler> {
59299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
5936abe35d79296718595d738f8b78a6487110fa861Chia-I Wu    ~Sampler();
5946abe35d79296718595d738f8b78a6487110fa861Chia-I Wu
5959cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateSampler()
596382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkSamplerCreateInfo &info);
5979cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
5989cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
59999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzclass DescriptorSetLayout
60099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    : public internal::NonDispHandle<VkDescriptorSetLayout> {
60199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
60255a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu    ~DescriptorSetLayout();
60355a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu
6049cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateDescriptorSetLayout()
605382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    void init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info);
6069cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
6079cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
60855a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wuclass DescriptorPool : public internal::NonDispHandle<VkDescriptorPool> {
60999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
61055a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu    ~DescriptorPool();
61155a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu
61299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    // Descriptor sets allocated from this pool will need access to the original
61399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    // object
61435ce7e6723ccc61952a5ee4eec49f2343a1a1dd4Cody Northrop    VkDescriptorPool GetObj() { return pool_; }
61535ce7e6723ccc61952a5ee4eec49f2343a1a1dd4Cody Northrop
6169cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkCreateDescriptorPool()
617d9e966aac83c28e7f6ac6535f695c9a7c06f667dCourtney Goeltzenleuchter    void init(const Device &dev, const VkDescriptorPoolCreateInfo &info);
6189cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
6199cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkResetDescriptorPool()
6209cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void reset();
6219cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
62235ce7e6723ccc61952a5ee4eec49f2343a1a1dd4Cody Northrop    // vkFreeDescriptorSet()
62335ce7e6723ccc61952a5ee4eec49f2343a1a1dd4Cody Northrop    void setDynamicUsage(bool isDynamic) { dynamic_usage_ = isDynamic; }
62435ce7e6723ccc61952a5ee4eec49f2343a1a1dd4Cody Northrop    bool getDynamicUsage() { return dynamic_usage_; }
62535ce7e6723ccc61952a5ee4eec49f2343a1a1dd4Cody Northrop
6261f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    // vkAllocateDescriptorSets()
62799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    std::vector<DescriptorSet *>
62899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    alloc_sets(const Device &dev,
62999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz               const std::vector<const DescriptorSetLayout *> &layouts);
63099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    std::vector<DescriptorSet *> alloc_sets(const Device &dev,
63199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                            const DescriptorSetLayout &layout,
63299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                            uint32_t count);
63399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    DescriptorSet *alloc_sets(const Device &dev,
63499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                              const DescriptorSetLayout &layout);
63599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz
63699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  private:
63735ce7e6723ccc61952a5ee4eec49f2343a1a1dd4Cody Northrop    VkDescriptorPool pool_;
63835ce7e6723ccc61952a5ee4eec49f2343a1a1dd4Cody Northrop
63935ce7e6723ccc61952a5ee4eec49f2343a1a1dd4Cody Northrop    // Track whether this pool's usage is VK_DESCRIPTOR_POOL_USAGE_DYNAMIC
64035ce7e6723ccc61952a5ee4eec49f2343a1a1dd4Cody Northrop    bool dynamic_usage_;
6419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
6429cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
64355a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wuclass DescriptorSet : public internal::NonDispHandle<VkDescriptorSet> {
64499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
64555a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu    ~DescriptorSet();
64655a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu
64755a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu    explicit DescriptorSet() : NonDispHandle() {}
64899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    explicit DescriptorSet(const Device &dev, DescriptorPool *pool,
64999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                           VkDescriptorSet set)
65099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        : NonDispHandle(dev.handle(), set) {
65199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        containing_pool_ = pool;
65299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
653e84a8d680991b8fc0be0d666fb7dcb617b36acc5Tony Barbour
65499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  private:
65599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    DescriptorPool *containing_pool_;
6569cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
6579cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
6581f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wuclass CommandPool : public internal::NonDispHandle<VkCommandPool> {
65999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
6601f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    ~CommandPool();
661902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter
6621f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    explicit CommandPool() : NonDispHandle() {}
66399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    explicit CommandPool(const Device &dev,
66499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         const VkCommandPoolCreateInfo &info) {
66599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        init(dev, info);
66699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
667902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter
6681f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    void init(const Device &dev, const VkCommandPoolCreateInfo &info);
669902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter
6701f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    static VkCommandPoolCreateInfo create_info(uint32_t queue_family_index);
671902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter};
672902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter
67399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkCommandPoolCreateInfo
67499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzCommandPool::create_info(uint32_t queue_family_index) {
6751f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    VkCommandPoolCreateInfo info = {};
6761f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
677902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter    info.queueFamilyIndex = queue_family_index;
6784c8381eb4ccab196a9b4bc3b3fe42cd23797e4d5Tobin Ehlis    info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
679902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter    return info;
680902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter}
681902d08122fca004bc59fecd27efe08a653ce31ecCourtney Goeltzenleuchter
6821f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wuclass CommandBuffer : public internal::Handle<VkCommandBuffer> {
68399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
6841f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    ~CommandBuffer();
68578c2a35016c72b92ce5d6fd705deb31736162607Chia-I Wu
6861f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    explicit CommandBuffer() : Handle() {}
68799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    explicit CommandBuffer(const Device &dev,
68899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                           const VkCommandBufferAllocateInfo &info) {
68999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        init(dev, info);
69099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    }
6919cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
6921f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    // vkAllocateCommandBuffers()
6931f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    void init(const Device &dev, const VkCommandBufferAllocateInfo &info);
6949cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
6959cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkBeginCommandBuffer()
6961f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    void begin(const VkCommandBufferBeginInfo *info);
6979cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void begin();
6989cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
6999cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkEndCommandBuffer()
7009cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    // vkResetCommandBuffer()
7019cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    void end();
7021f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    void reset(VkCommandBufferResetFlags flags);
7031f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    void reset() { reset(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT); }
7049cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
7051f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    static VkCommandBufferAllocateInfo create_info(VkCommandPool const &pool);
70678c2a35016c72b92ce5d6fd705deb31736162607Chia-I Wu
70799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  private:
70878c2a35016c72b92ce5d6fd705deb31736162607Chia-I Wu    VkDevice dev_handle_;
7091f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    VkCommandPool cmd_pool_;
7109cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter};
7119cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
71299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkMemoryAllocateInfo
71399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzDeviceMemory::alloc_info(VkDeviceSize size, uint32_t memory_type_index) {
7141f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    VkMemoryAllocateInfo info = {};
715c1f5e4068eab0504d4b68f78f88c55312ef96328Chia-I Wu    info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
716ba0836f623e3a756bf0cac72d5a688430d2a3420Chia-I Wu    info.allocationSize = size;
717ba0836f623e3a756bf0cac72d5a688430d2a3420Chia-I Wu    info.memoryTypeIndex = memory_type_index;
7189cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
7199cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7209cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
72199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkBufferCreateInfo Buffer::create_info(VkDeviceSize size,
72299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                              VkFlags usage) {
723ddcb6192458d696a106f48eeb12fd0390a3ca63fCourtney Goeltzenleuchter    VkBufferCreateInfo info = {};
7249cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7259cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.size = size;
7269cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.usage = usage;
7279cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
7289cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7299cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
73099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkFenceCreateInfo Fence::create_info(VkFenceCreateFlags flags) {
731382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFenceCreateInfo info = {};
7329cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
7339cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.flags = flags;
7349cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
7359cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7369cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
73799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkFenceCreateInfo Fence::create_info() {
738382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkFenceCreateInfo info = {};
7399cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
7409cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
7419cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7429cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
74399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkSemaphoreCreateInfo Semaphore::create_info(VkFlags flags) {
744382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkSemaphoreCreateInfo info = {};
7459cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
7469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.flags = flags;
7479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
7489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7499cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
75099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkEventCreateInfo Event::create_info(VkFlags flags) {
751382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkEventCreateInfo info = {};
7529cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7539cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.flags = flags;
7549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
7559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7569cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
75799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkQueryPoolCreateInfo QueryPool::create_info(VkQueryType type,
75899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                                    uint32_t slot_count) {
759382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkQueryPoolCreateInfo info = {};
7609cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7619cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.queryType = type;
762a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn    info.queryCount = slot_count;
7639cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
7649cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
76699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkImageCreateInfo Image::create_info() {
767382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkImageCreateInfo info = {};
7689cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7699cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.extent.width = 1;
7709cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.extent.height = 1;
7719cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.extent.depth = 1;
7729cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.mipLevels = 1;
7732ebc234580f41270585dfbbe2925358dd41b125eCourtney Goeltzenleuchter    info.arrayLayers = 1;
7743138d6a7fafb314644a22a854267258769c6d6a0Chia-I Wu    info.samples = VK_SAMPLE_COUNT_1_BIT;
7759cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
7769cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7779cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
77899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkImageSubresource Image::subresource(VkImageAspectFlagBits aspect,
77999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                             uint32_t mip_level,
78099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                             uint32_t array_layer) {
781382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkImageSubresource subres = {};
782195c9e1571bc33a143af6a1adf7f6083a3b41f8dChia-I Wu    subres.aspectMask = aspect;
7839cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    subres.mipLevel = mip_level;
7843dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchter    subres.arrayLayer = array_layer;
7859cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return subres;
7869cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7879cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
78899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkImageSubresource
78999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzImage::subresource(const VkImageSubresourceRange &range, uint32_t mip_level,
79099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                   uint32_t array_layer) {
79199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    return subresource(image_aspect(range.aspectMask),
79299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                       range.baseMipLevel + mip_level,
79399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                       range.baseArrayLayer + array_layer);
7949cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
7959cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
79699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkImageSubresourceLayers Image::subresource(VkImageAspectFlagBits aspect,
79799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                                   uint32_t mip_level,
79899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                                   uint32_t array_layer,
79999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                                   uint32_t array_size) {
800c51b121913d6f21ccefb3f7595178d3c87e11de4Chia-I Wu    VkImageSubresourceLayers subres = {};
8014291d8822ec2a685ef89ec2b210ff16857e25310Chia-I Wu    subres.aspectMask = aspect;
802bd7f592c081094082ecb22ae30beaef079f437d0Courtney Goeltzenleuchter    subres.mipLevel = mip_level;
80363f0ead42f862f1c8ad815798c7cc6983cc413acCourtney Goeltzenleuchter    subres.baseArrayLayer = array_layer;
8041f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    subres.layerCount = array_size;
805bd7f592c081094082ecb22ae30beaef079f437d0Courtney Goeltzenleuchter    return subres;
806bd7f592c081094082ecb22ae30beaef079f437d0Courtney Goeltzenleuchter}
807bd7f592c081094082ecb22ae30beaef079f437d0Courtney Goeltzenleuchter
80899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkImageAspectFlagBits Image::image_aspect(VkImageAspectFlags flags) {
809aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter    /*
810aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter     * This will map VkImageAspectFlags into a single VkImageAspect.
811aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter     * If there is more than one bit defined we'll get an assertion.
812aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter     */
813aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter    switch (flags) {
814aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter    case VK_IMAGE_ASPECT_COLOR_BIT:
815ba11ebe8763601875a5a0c925610088ab317ef06Courtney Goeltzenleuchter        return VK_IMAGE_ASPECT_COLOR_BIT;
816aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter    case VK_IMAGE_ASPECT_DEPTH_BIT:
817ba11ebe8763601875a5a0c925610088ab317ef06Courtney Goeltzenleuchter        return VK_IMAGE_ASPECT_DEPTH_BIT;
818aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter    case VK_IMAGE_ASPECT_STENCIL_BIT:
819ba11ebe8763601875a5a0c925610088ab317ef06Courtney Goeltzenleuchter        return VK_IMAGE_ASPECT_STENCIL_BIT;
820aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter    case VK_IMAGE_ASPECT_METADATA_BIT:
821ba11ebe8763601875a5a0c925610088ab317ef06Courtney Goeltzenleuchter        return VK_IMAGE_ASPECT_METADATA_BIT;
822aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter    default:
823aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter        assert(!"Invalid VkImageAspect");
824aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter    }
825ba11ebe8763601875a5a0c925610088ab317ef06Courtney Goeltzenleuchter    return VK_IMAGE_ASPECT_COLOR_BIT;
826aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter}
827aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter
82899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkImageSubresourceLayers
82999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzImage::subresource(const VkImageSubresourceRange &range, uint32_t mip_level,
83099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                   uint32_t array_layer, uint32_t array_size) {
83199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    return subresource(image_aspect(range.aspectMask),
83299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                       range.baseMipLevel + mip_level,
83399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                       range.baseArrayLayer + array_layer, array_size);
834bd7f592c081094082ecb22ae30beaef079f437d0Courtney Goeltzenleuchter}
835bd7f592c081094082ecb22ae30beaef079f437d0Courtney Goeltzenleuchter
83699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkImageSubresourceRange
83799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzImage::subresource_range(VkImageAspectFlags aspect_mask,
83899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         uint32_t base_mip_level, uint32_t mip_levels,
83999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         uint32_t base_array_layer, uint32_t num_layers) {
840382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkImageSubresourceRange range = {};
841aeffeae6128137520f85be7c81d67cb305929a10Courtney Goeltzenleuchter    range.aspectMask = aspect_mask;
8429cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    range.baseMipLevel = base_mip_level;
8431f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    range.levelCount = mip_levels;
8443dee8087999562e0637326175a3cf6cab858158eCourtney Goeltzenleuchter    range.baseArrayLayer = base_array_layer;
8451f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    range.layerCount = num_layers;
8469cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return range;
8479cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
8489cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
84999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkImageSubresourceRange
85099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzImage::subresource_range(const VkImageCreateInfo &info,
85199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                         VkImageAspectFlags aspect_mask) {
85299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    return subresource_range(aspect_mask, 0, info.mipLevels, 0,
85399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             info.arrayLayers);
8549cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
8559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
85699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkImageSubresourceRange
85799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzImage::subresource_range(const VkImageSubresource &subres) {
85899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    return subresource_range(subres.aspectMask, subres.mipLevel, 1,
85999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             subres.arrayLayer, 1);
8609cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
8619cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
86299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkExtent2D Image::extent(int32_t width, int32_t height) {
863382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkExtent2D extent = {};
8649cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    extent.width = width;
8659cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    extent.height = height;
8669cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return extent;
8679cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
8689cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
86999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkExtent2D Image::extent(const VkExtent2D &extent, uint32_t mip_level) {
87099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    const int32_t width =
87199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        (extent.width >> mip_level) ? extent.width >> mip_level : 1;
87299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    const int32_t height =
87399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        (extent.height >> mip_level) ? extent.height >> mip_level : 1;
8749cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return Image::extent(width, height);
8759cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
8769cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
87799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkExtent2D Image::extent(const VkExtent3D &extent) {
8789cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return Image::extent(extent.width, extent.height);
8799cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
8809cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
88199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkExtent3D Image::extent(int32_t width, int32_t height, int32_t depth) {
882382489d723fd0d3935da0dc7e1021c56c7b721d3Courtney Goeltzenleuchter    VkExtent3D extent = {};
8839cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    extent.width = width;
8849cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    extent.height = height;
8859cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    extent.depth = depth;
8869cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return extent;
8879cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
8889cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
88999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkExtent3D Image::extent(const VkExtent3D &extent, uint32_t mip_level) {
89099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    const int32_t width =
89199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        (extent.width >> mip_level) ? extent.width >> mip_level : 1;
89299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    const int32_t height =
89399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        (extent.height >> mip_level) ? extent.height >> mip_level : 1;
89499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    const int32_t depth =
89599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz        (extent.depth >> mip_level) ? extent.depth >> mip_level : 1;
8969cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return Image::extent(width, height, depth);
8979cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
8989cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
89999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkShaderModuleCreateInfo ShaderModule::create_info(size_t code_size,
90099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                                          const uint32_t *code,
90199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                                          VkFlags flags) {
9022d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    VkShaderModuleCreateInfo info = {};
9032d034fd483f9181399561cf3207ddf12bf4e5b6aCourtney Goeltzenleuchter    info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
9049cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.codeSize = code_size;
9059cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.pCode = code;
9069cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    info.flags = flags;
9079cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
9089cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
9099cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
91099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkWriteDescriptorSet
91199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzDevice::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
91299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             uint32_t array_element, VkDescriptorType type,
91399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             uint32_t count,
91499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             const VkDescriptorImageInfo *image_info) {
91534aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter    VkWriteDescriptorSet write = {};
91634aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter    write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9171f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    write.dstSet = set.handle();
9181f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    write.dstBinding = binding;
9191f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    write.dstArrayElement = array_element;
920763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu    write.descriptorCount = count;
92134aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter    write.descriptorType = type;
92234aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter    write.pImageInfo = image_info;
92334aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter    return write;
92434aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter}
92534aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter
92699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkWriteDescriptorSet
92799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzDevice::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
92899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             uint32_t array_element, VkDescriptorType type,
92999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             uint32_t count,
93099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             const VkDescriptorBufferInfo *buffer_info) {
93134aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter    VkWriteDescriptorSet write = {};
93234aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter    write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9331f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    write.dstSet = set.handle();
9341f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    write.dstBinding = binding;
9351f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    write.dstArrayElement = array_element;
936763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu    write.descriptorCount = count;
93734aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter    write.descriptorType = type;
93834aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter    write.pBufferInfo = buffer_info;
93934aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter    return write;
94034aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter}
94134aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter
94299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkWriteDescriptorSet
94399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzDevice::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
94499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             uint32_t array_element, VkDescriptorType type,
94599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             uint32_t count, const VkBufferView *buffer_views) {
9468cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    VkWriteDescriptorSet write = {};
9478cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9481f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    write.dstSet = set.handle();
9491f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    write.dstBinding = binding;
9501f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    write.dstArrayElement = array_element;
951763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu    write.descriptorCount = count;
9528cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    write.descriptorType = type;
95334aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter    write.pTexelBufferView = buffer_views;
9548cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    return write;
9559cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
9569cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
95799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkWriteDescriptorSet Device::write_descriptor_set(
95899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    const DescriptorSet &set, uint32_t binding, uint32_t array_element,
95999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkDescriptorType type,
96099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    const std::vector<VkDescriptorImageInfo> &image_info) {
96199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    return write_descriptor_set(set, binding, array_element, type,
96299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                image_info.size(), &image_info[0]);
96334aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter}
96434aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter
96599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkWriteDescriptorSet Device::write_descriptor_set(
96699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    const DescriptorSet &set, uint32_t binding, uint32_t array_element,
96799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    VkDescriptorType type,
96899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    const std::vector<VkDescriptorBufferInfo> &buffer_info) {
96999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    return write_descriptor_set(set, binding, array_element, type,
97099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                buffer_info.size(), &buffer_info[0]);
97134aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter}
97234aa5c8bb02340240969d574d69dad0f68dbcb42Courtney Goeltzenleuchter
97399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkWriteDescriptorSet
97499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzDevice::write_descriptor_set(const DescriptorSet &set, uint32_t binding,
97599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             uint32_t array_element, VkDescriptorType type,
97699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                             const std::vector<VkBufferView> &buffer_views) {
97799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    return write_descriptor_set(set, binding, array_element, type,
97899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                                buffer_views.size(), &buffer_views[0]);
9799cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
9809cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
98199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkCopyDescriptorSet
98299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzDevice::copy_descriptor_set(const DescriptorSet &src_set, uint32_t src_binding,
98399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                            uint32_t src_array_element,
98499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                            const DescriptorSet &dst_set, uint32_t dst_binding,
98599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz                            uint32_t dst_array_element, uint32_t count) {
9868cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    VkCopyDescriptorSet copy = {};
9878cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    copy.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
98855a871ff827f9b699a541c2f8bb479bba8aebf04Chia-I Wu    copy.srcSet = src_set.handle();
9898cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    copy.srcBinding = src_binding;
9908cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    copy.srcArrayElement = src_array_element;
9911f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    copy.dstSet = dst_set.handle();
9921f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    copy.dstBinding = dst_binding;
9931f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    copy.dstArrayElement = dst_array_element;
994763a749795bb4827efbbf19cbc87b959511496ddChia-I Wu    copy.descriptorCount = count;
9959cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
9968cd8ecde19f154f1779a7bcc93cb1a3519b57dbfChia-I Wu    return copy;
9979cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
9989cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
99999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzinline VkCommandBufferAllocateInfo
100099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl SchultzCommandBuffer::create_info(VkCommandPool const &pool) {
10011f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    VkCommandBufferAllocateInfo info = {};
1002c1f5e4068eab0504d4b68f78f88c55312ef96328Chia-I Wu    info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
10031f85191a3a8479194ecb7b937aee284cf80cf08fChia-I Wu    info.commandPool = pool;
1004a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn    info.commandBufferCount = 1;
10059cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    return info;
10069cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}
10079cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
10089cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter}; // namespace vk_testing
10099cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter
10109cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#endif // VKTESTBINDING_H
1011