Home | History | Annotate | Download | only in smoke
      1 /*
      2  * Copyright (C) 2016 Google, Inc.
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice shall be included
     12  * in all copies or substantial portions of the Software.
     13  *
     14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     17  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     20  * DEALINGS IN THE SOFTWARE.
     21  */
     22 
     23 #ifndef HELPERS_H
     24 #define HELPERS_H
     25 
     26 #include <vector>
     27 #include <sstream>
     28 #include <stdexcept>
     29 #include <vulkan/vulkan.h>
     30 
     31 #include "HelpersDispatchTable.h"
     32 
     33 namespace vk {
     34 
     35 inline VkResult assert_success(VkResult res)
     36 {
     37     if (res != VK_SUCCESS) {
     38         std::stringstream ss;
     39         ss << "VkResult " << res << " returned";
     40         throw std::runtime_error(ss.str());
     41     }
     42 
     43     return res;
     44 }
     45 
     46 inline VkResult enumerate(const char *layer, std::vector<VkExtensionProperties> &exts)
     47 {
     48     uint32_t count = 0;
     49     vk::EnumerateInstanceExtensionProperties(layer, &count, nullptr);
     50 
     51     exts.resize(count);
     52     return vk::EnumerateInstanceExtensionProperties(layer, &count, exts.data());
     53 }
     54 
     55 inline VkResult enumerate(VkPhysicalDevice phy, const char *layer, std::vector<VkExtensionProperties> &exts)
     56 {
     57     uint32_t count = 0;
     58     vk::EnumerateDeviceExtensionProperties(phy, layer, &count, nullptr);
     59 
     60     exts.resize(count);
     61     return vk::EnumerateDeviceExtensionProperties(phy, layer, &count, exts.data());
     62 }
     63 
     64 inline VkResult enumerate(VkInstance instance, std::vector<VkPhysicalDevice> &phys)
     65 {
     66     uint32_t count = 0;
     67     vk::EnumeratePhysicalDevices(instance, &count, nullptr);
     68 
     69     phys.resize(count);
     70     return vk::EnumeratePhysicalDevices(instance, &count, phys.data());
     71 }
     72 
     73 inline VkResult enumerate(std::vector<VkLayerProperties> &layer_props)
     74 {
     75     uint32_t count = 0;
     76     vk::EnumerateInstanceLayerProperties(&count, nullptr);
     77 
     78     layer_props.resize(count);
     79     return vk::EnumerateInstanceLayerProperties(&count, layer_props.data());
     80 }
     81 
     82 inline VkResult enumerate(VkPhysicalDevice phy, std::vector<VkLayerProperties> &layer_props)
     83 {
     84     uint32_t count = 0;
     85     vk::EnumerateDeviceLayerProperties(phy, &count, nullptr);
     86 
     87     layer_props.resize(count);
     88     return vk::EnumerateDeviceLayerProperties(phy, &count, layer_props.data());
     89 }
     90 
     91 inline VkResult get(VkPhysicalDevice phy, std::vector<VkQueueFamilyProperties> &queues)
     92 {
     93     uint32_t count = 0;
     94     vk::GetPhysicalDeviceQueueFamilyProperties(phy, &count, nullptr);
     95 
     96     queues.resize(count);
     97     vk::GetPhysicalDeviceQueueFamilyProperties(phy, &count, queues.data());
     98 
     99     return VK_SUCCESS;
    100 }
    101 
    102 inline VkResult get(VkPhysicalDevice phy, VkSurfaceKHR surface, std::vector<VkSurfaceFormatKHR> &formats)
    103 {
    104     uint32_t count = 0;
    105     vk::GetPhysicalDeviceSurfaceFormatsKHR(phy, surface, &count, nullptr);
    106 
    107     formats.resize(count);
    108     return vk::GetPhysicalDeviceSurfaceFormatsKHR(phy, surface, &count, formats.data());
    109 }
    110 
    111 inline VkResult get(VkPhysicalDevice phy, VkSurfaceKHR surface, std::vector<VkPresentModeKHR> &modes)
    112 {
    113     uint32_t count = 0;
    114     vk::GetPhysicalDeviceSurfacePresentModesKHR(phy, surface, &count, nullptr);
    115 
    116     modes.resize(count);
    117     return vk::GetPhysicalDeviceSurfacePresentModesKHR(phy, surface, &count, modes.data());
    118 }
    119 
    120 inline VkResult get(VkDevice dev, VkSwapchainKHR swapchain, std::vector<VkImage> &images)
    121 {
    122     uint32_t count = 0;
    123     vk::GetSwapchainImagesKHR(dev, swapchain, &count, nullptr);
    124 
    125     images.resize(count);
    126     return vk::GetSwapchainImagesKHR(dev, swapchain, &count, images.data());
    127 }
    128 
    129 } // namespace vk
    130 
    131 #endif // HELPERS_H
    132