| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // Copyright (c) 2015-2016 The Khronos Group Inc. |
| // Copyright (c) 2015-2016 Valve Corporation |
| // Copyright (c) 2015-2016 LunarG, Inc. |
| // Copyright (c) 2015-2016 Google, Inc. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| #ifndef VKJSON_H_ |
| #define VKJSON_H_ |
| |
| #include <vulkan/vulkan.h> |
| #include <string.h> |
| |
| #include <map> |
| #include <string> |
| #include <vector> |
| |
| #ifdef WIN32 |
| #undef min |
| #undef max |
| #endif |
| |
| /* |
| * Annotation to tell clang that we intend to fall through from one case to |
| * another in a switch. Sourced from android-base/macros.h. |
| */ |
| #define FALLTHROUGH_INTENDED [[clang::fallthrough]] |
| |
| struct VkJsonLayer { |
| VkLayerProperties properties; |
| std::vector<VkExtensionProperties> extensions; |
| }; |
| |
| struct VkJsonExtDriverProperties { |
| VkJsonExtDriverProperties() { |
| reported = false; |
| memset(&driver_properties_khr, 0, |
| sizeof(VkPhysicalDeviceDriverPropertiesKHR)); |
| } |
| bool reported; |
| VkPhysicalDeviceDriverPropertiesKHR driver_properties_khr; |
| }; |
| |
| struct VkJsonExtVariablePointerFeatures { |
| VkJsonExtVariablePointerFeatures() { |
| reported = false; |
| memset(&variable_pointer_features_khr, 0, |
| sizeof(VkPhysicalDeviceVariablePointerFeaturesKHR)); |
| } |
| bool reported; |
| VkPhysicalDeviceVariablePointerFeaturesKHR variable_pointer_features_khr; |
| }; |
| |
| struct VkJsonExtShaderFloat16Int8Features { |
| VkJsonExtShaderFloat16Int8Features() { |
| reported = false; |
| memset(&shader_float16_int8_features_khr, 0, |
| sizeof(VkPhysicalDeviceShaderFloat16Int8FeaturesKHR)); |
| } |
| bool reported; |
| VkPhysicalDeviceShaderFloat16Int8FeaturesKHR shader_float16_int8_features_khr; |
| }; |
| |
| struct VkJsonCore12 { |
| VkPhysicalDeviceVulkan12Properties properties; |
| VkPhysicalDeviceVulkan12Features features; |
| }; |
| |
| struct VkJsonCore13 { |
| VkPhysicalDeviceVulkan13Properties properties; |
| VkPhysicalDeviceVulkan13Features features; |
| }; |
| |
| struct VkJsonDevice { |
| VkJsonDevice() { |
| memset(&properties, 0, sizeof(VkPhysicalDeviceProperties)); |
| memset(&features, 0, sizeof(VkPhysicalDeviceFeatures)); |
| memset(&memory, 0, sizeof(VkPhysicalDeviceMemoryProperties)); |
| memset(&subgroup_properties, 0, sizeof(VkPhysicalDeviceSubgroupProperties)); |
| memset(&point_clipping_properties, 0, |
| sizeof(VkPhysicalDevicePointClippingProperties)); |
| memset(&multiview_properties, 0, |
| sizeof(VkPhysicalDeviceMultiviewProperties)); |
| memset(&id_properties, 0, sizeof(VkPhysicalDeviceIDProperties)); |
| memset(&maintenance3_properties, 0, |
| sizeof(VkPhysicalDeviceMaintenance3Properties)); |
| memset(&bit16_storage_features, 0, |
| sizeof(VkPhysicalDevice16BitStorageFeatures)); |
| memset(&multiview_features, 0, sizeof(VkPhysicalDeviceMultiviewFeatures)); |
| memset(&variable_pointer_features, 0, |
| sizeof(VkPhysicalDeviceVariablePointerFeatures)); |
| memset(&protected_memory_features, 0, |
| sizeof(VkPhysicalDeviceProtectedMemoryFeatures)); |
| memset(&sampler_ycbcr_conversion_features, 0, |
| sizeof(VkPhysicalDeviceSamplerYcbcrConversionFeatures)); |
| memset(&shader_draw_parameter_features, 0, |
| sizeof(VkPhysicalDeviceShaderDrawParameterFeatures)); |
| memset(&core12, 0, sizeof(VkJsonCore12)); |
| memset(&core13, 0, sizeof(VkJsonCore13)); |
| } |
| VkPhysicalDeviceProperties properties; |
| VkPhysicalDeviceFeatures features; |
| VkJsonExtDriverProperties ext_driver_properties; |
| VkJsonExtVariablePointerFeatures ext_variable_pointer_features; |
| VkJsonExtShaderFloat16Int8Features ext_shader_float16_int8_features; |
| VkPhysicalDeviceMemoryProperties memory; |
| std::vector<VkQueueFamilyProperties> queues; |
| std::vector<VkExtensionProperties> extensions; |
| std::vector<VkLayerProperties> layers; |
| std::map<VkFormat, VkFormatProperties> formats; |
| VkPhysicalDeviceSubgroupProperties subgroup_properties; |
| VkPhysicalDevicePointClippingProperties point_clipping_properties; |
| VkPhysicalDeviceMultiviewProperties multiview_properties; |
| VkPhysicalDeviceIDProperties id_properties; |
| VkPhysicalDeviceMaintenance3Properties maintenance3_properties; |
| VkPhysicalDevice16BitStorageFeatures bit16_storage_features; |
| VkPhysicalDeviceMultiviewFeatures multiview_features; |
| VkPhysicalDeviceVariablePointerFeatures variable_pointer_features; |
| VkPhysicalDeviceProtectedMemoryFeatures protected_memory_features; |
| VkPhysicalDeviceSamplerYcbcrConversionFeatures |
| sampler_ycbcr_conversion_features; |
| VkPhysicalDeviceShaderDrawParameterFeatures shader_draw_parameter_features; |
| std::map<VkExternalFenceHandleTypeFlagBits, VkExternalFenceProperties> |
| external_fence_properties; |
| std::map<VkExternalSemaphoreHandleTypeFlagBits, VkExternalSemaphoreProperties> |
| external_semaphore_properties; |
| VkJsonCore12 core12; |
| VkJsonCore13 core13; |
| }; |
| |
| struct VkJsonDeviceGroup { |
| VkJsonDeviceGroup() { |
| memset(&properties, 0, sizeof(VkPhysicalDeviceGroupProperties)); |
| } |
| VkPhysicalDeviceGroupProperties properties; |
| std::vector<uint32_t> device_inds; |
| }; |
| |
| struct VkJsonInstance { |
| VkJsonInstance() : api_version(0) {} |
| uint32_t api_version; |
| std::vector<VkJsonLayer> layers; |
| std::vector<VkExtensionProperties> extensions; |
| std::vector<VkJsonDevice> devices; |
| std::vector<VkJsonDeviceGroup> device_groups; |
| }; |
| |
| VkJsonInstance VkJsonGetInstance(); |
| std::string VkJsonInstanceToJson(const VkJsonInstance& instance); |
| bool VkJsonInstanceFromJson(const std::string& json, |
| VkJsonInstance* instance, |
| std::string* errors); |
| |
| VkJsonDevice VkJsonGetDevice(VkPhysicalDevice device); |
| std::string VkJsonDeviceToJson(const VkJsonDevice& device); |
| bool VkJsonDeviceFromJson(const std::string& json, |
| VkJsonDevice* device, |
| std::string* errors); |
| |
| std::string VkJsonImageFormatPropertiesToJson( |
| const VkImageFormatProperties& properties); |
| bool VkJsonImageFormatPropertiesFromJson(const std::string& json, |
| VkImageFormatProperties* properties, |
| std::string* errors); |
| |
| // Backward-compatibility aliases |
| typedef VkJsonDevice VkJsonAllProperties; |
| inline VkJsonAllProperties VkJsonGetAllProperties( |
| VkPhysicalDevice physicalDevice) { |
| return VkJsonGetDevice(physicalDevice); |
| } |
| inline std::string VkJsonAllPropertiesToJson( |
| const VkJsonAllProperties& properties) { |
| return VkJsonDeviceToJson(properties); |
| } |
| inline bool VkJsonAllPropertiesFromJson(const std::string& json, |
| VkJsonAllProperties* properties, |
| std::string* errors) { |
| return VkJsonDeviceFromJson(json, properties, errors); |
| } |
| |
| #endif // VKJSON_H_ |