Home | History | Annotate | Download | only in vkjson
      1 ///////////////////////////////////////////////////////////////////////////////
      2 //
      3 // Copyright (c) 2015-2016 The Khronos Group Inc.
      4 // Copyright (c) 2015-2016 Valve Corporation
      5 // Copyright (c) 2015-2016 LunarG, Inc.
      6 // Copyright (c) 2015-2016 Google, Inc.
      7 //
      8 // Licensed under the Apache License, Version 2.0 (the "License");
      9 // you may not use this file except in compliance with the License.
     10 // You may obtain a copy of the License at
     11 //
     12 //     http://www.apache.org/licenses/LICENSE-2.0
     13 //
     14 // Unless required by applicable law or agreed to in writing, software
     15 // distributed under the License is distributed on an "AS IS" BASIS,
     16 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     17 // See the License for the specific language governing permissions and
     18 // limitations under the License.
     19 ///////////////////////////////////////////////////////////////////////////////
     20 
     21 #ifndef VKJSON_H_
     22 #define VKJSON_H_
     23 
     24 #include <vulkan/vulkan.h>
     25 #include <string.h>
     26 
     27 #include <map>
     28 #include <string>
     29 #include <vector>
     30 
     31 #ifdef WIN32
     32 #undef min
     33 #undef max
     34 #endif
     35 
     36 #ifndef VK_API_VERSION_1_0
     37 #define VK_API_VERSION_1_0 VK_MAKE_VERSION(1, 0, 0)
     38 #endif
     39 
     40 #ifndef VK_API_VERSION_1_1
     41 #define VK_API_VERSION_1_1 VK_MAKE_VERSION(1, 1, 0)
     42 #endif
     43 
     44 /*
     45  * Annotation to tell clang that we intend to fall through from one case to
     46  * another in a switch. Sourced from android-base/macros.h.
     47  */
     48 #define FALLTHROUGH_INTENDED [[clang::fallthrough]]
     49 
     50 struct VkJsonLayer {
     51   VkLayerProperties properties;
     52   std::vector<VkExtensionProperties> extensions;
     53 };
     54 
     55 struct VkJsonExtDriverProperties {
     56   VkJsonExtDriverProperties() {
     57     reported = false;
     58     memset(&driver_properties_khr, 0,
     59            sizeof(VkPhysicalDeviceDriverPropertiesKHR));
     60   }
     61   bool reported;
     62   VkPhysicalDeviceDriverPropertiesKHR driver_properties_khr;
     63 };
     64 
     65 struct VkJsonExtVariablePointerFeatures {
     66   VkJsonExtVariablePointerFeatures() {
     67     reported = false;
     68     memset(&variable_pointer_features_khr, 0,
     69            sizeof(VkPhysicalDeviceVariablePointerFeaturesKHR));
     70   }
     71   bool reported;
     72   VkPhysicalDeviceVariablePointerFeaturesKHR variable_pointer_features_khr;
     73 };
     74 
     75 struct VkJsonDevice {
     76   VkJsonDevice() {
     77     memset(&properties, 0, sizeof(VkPhysicalDeviceProperties));
     78     memset(&features, 0, sizeof(VkPhysicalDeviceFeatures));
     79     memset(&memory, 0, sizeof(VkPhysicalDeviceMemoryProperties));
     80     memset(&subgroup_properties, 0, sizeof(VkPhysicalDeviceSubgroupProperties));
     81     memset(&point_clipping_properties, 0,
     82            sizeof(VkPhysicalDevicePointClippingProperties));
     83     memset(&multiview_properties, 0,
     84            sizeof(VkPhysicalDeviceMultiviewProperties));
     85     memset(&id_properties, 0, sizeof(VkPhysicalDeviceIDProperties));
     86     memset(&maintenance3_properties, 0,
     87            sizeof(VkPhysicalDeviceMaintenance3Properties));
     88     memset(&bit16_storage_features, 0,
     89            sizeof(VkPhysicalDevice16BitStorageFeatures));
     90     memset(&multiview_features, 0, sizeof(VkPhysicalDeviceMultiviewFeatures));
     91     memset(&variable_pointer_features, 0,
     92            sizeof(VkPhysicalDeviceVariablePointerFeatures));
     93     memset(&protected_memory_features, 0,
     94            sizeof(VkPhysicalDeviceProtectedMemoryFeatures));
     95     memset(&sampler_ycbcr_conversion_features, 0,
     96            sizeof(VkPhysicalDeviceSamplerYcbcrConversionFeatures));
     97     memset(&shader_draw_parameter_features, 0,
     98            sizeof(VkPhysicalDeviceShaderDrawParameterFeatures));
     99   }
    100   VkPhysicalDeviceProperties properties;
    101   VkPhysicalDeviceFeatures features;
    102   VkJsonExtDriverProperties ext_driver_properties;
    103   VkJsonExtVariablePointerFeatures ext_variable_pointer_features;
    104   VkPhysicalDeviceMemoryProperties memory;
    105   std::vector<VkQueueFamilyProperties> queues;
    106   std::vector<VkExtensionProperties> extensions;
    107   std::vector<VkLayerProperties> layers;
    108   std::map<VkFormat, VkFormatProperties> formats;
    109   VkPhysicalDeviceSubgroupProperties subgroup_properties;
    110   VkPhysicalDevicePointClippingProperties point_clipping_properties;
    111   VkPhysicalDeviceMultiviewProperties multiview_properties;
    112   VkPhysicalDeviceIDProperties id_properties;
    113   VkPhysicalDeviceMaintenance3Properties maintenance3_properties;
    114   VkPhysicalDevice16BitStorageFeatures bit16_storage_features;
    115   VkPhysicalDeviceMultiviewFeatures multiview_features;
    116   VkPhysicalDeviceVariablePointerFeatures variable_pointer_features;
    117   VkPhysicalDeviceProtectedMemoryFeatures protected_memory_features;
    118   VkPhysicalDeviceSamplerYcbcrConversionFeatures
    119       sampler_ycbcr_conversion_features;
    120   VkPhysicalDeviceShaderDrawParameterFeatures shader_draw_parameter_features;
    121   std::map<VkExternalFenceHandleTypeFlagBits, VkExternalFenceProperties>
    122       external_fence_properties;
    123   std::map<VkExternalSemaphoreHandleTypeFlagBits, VkExternalSemaphoreProperties>
    124       external_semaphore_properties;
    125 };
    126 
    127 struct VkJsonDeviceGroup {
    128   VkJsonDeviceGroup() {
    129     memset(&properties, 0, sizeof(VkPhysicalDeviceGroupProperties));
    130   }
    131   VkPhysicalDeviceGroupProperties properties;
    132   std::vector<uint32_t> device_inds;
    133 };
    134 
    135 struct VkJsonInstance {
    136   VkJsonInstance() : api_version(0) {}
    137   uint32_t api_version;
    138   std::vector<VkJsonLayer> layers;
    139   std::vector<VkExtensionProperties> extensions;
    140   std::vector<VkJsonDevice> devices;
    141   std::vector<VkJsonDeviceGroup> device_groups;
    142 };
    143 
    144 VkJsonInstance VkJsonGetInstance();
    145 std::string VkJsonInstanceToJson(const VkJsonInstance& instance);
    146 bool VkJsonInstanceFromJson(const std::string& json,
    147                             VkJsonInstance* instance,
    148                             std::string* errors);
    149 
    150 VkJsonDevice VkJsonGetDevice(VkInstance instance,
    151                              VkPhysicalDevice device,
    152                              uint32_t instanceExtensionCount,
    153                              const char* const* instanceExtensions);
    154 std::string VkJsonDeviceToJson(const VkJsonDevice& device);
    155 bool VkJsonDeviceFromJson(const std::string& json,
    156                           VkJsonDevice* device,
    157                           std::string* errors);
    158 
    159 std::string VkJsonImageFormatPropertiesToJson(
    160     const VkImageFormatProperties& properties);
    161 bool VkJsonImageFormatPropertiesFromJson(const std::string& json,
    162                                          VkImageFormatProperties* properties,
    163                                          std::string* errors);
    164 
    165 // Backward-compatibility aliases
    166 typedef VkJsonDevice VkJsonAllProperties;
    167 inline VkJsonAllProperties VkJsonGetAllProperties(
    168     VkPhysicalDevice physicalDevice) {
    169   return VkJsonGetDevice(VK_NULL_HANDLE, physicalDevice, 0, nullptr);
    170 }
    171 inline std::string VkJsonAllPropertiesToJson(
    172     const VkJsonAllProperties& properties) {
    173   return VkJsonDeviceToJson(properties);
    174 }
    175 inline bool VkJsonAllPropertiesFromJson(const std::string& json,
    176                                         VkJsonAllProperties* properties,
    177                                         std::string* errors) {
    178   return VkJsonDeviceFromJson(json, properties, errors);
    179 }
    180 
    181 #endif  // VKJSON_H_
    182