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 44struct VkJsonLayer { 45 VkLayerProperties properties; 46 std::vector<VkExtensionProperties> extensions; 47}; 48 49struct VkJsonExtVariablePointerFeatures { 50 VkJsonExtVariablePointerFeatures() { 51 memset(&variable_pointer_features_khr, 0, 52 sizeof(VkPhysicalDeviceVariablePointerFeaturesKHR)); 53 } 54 VkPhysicalDeviceVariablePointerFeaturesKHR variable_pointer_features_khr; 55}; 56 57struct VkJsonDevice { 58 VkJsonDevice() { 59 memset(&properties, 0, sizeof(VkPhysicalDeviceProperties)); 60 memset(&features, 0, sizeof(VkPhysicalDeviceFeatures)); 61 memset(&memory, 0, sizeof(VkPhysicalDeviceMemoryProperties)); 62 memset(&subgroup_properties, 0, sizeof(VkPhysicalDeviceSubgroupProperties)); 63 memset(&point_clipping_properties, 0, 64 sizeof(VkPhysicalDevicePointClippingProperties)); 65 memset(&multiview_properties, 0, 66 sizeof(VkPhysicalDeviceMultiviewProperties)); 67 memset(&id_properties, 0, sizeof(VkPhysicalDeviceIDProperties)); 68 memset(&maintenance3_properties, 0, 69 sizeof(VkPhysicalDeviceMaintenance3Properties)); 70 memset(&bit16_storage_features, 0, 71 sizeof(VkPhysicalDevice16BitStorageFeatures)); 72 memset(&multiview_features, 0, sizeof(VkPhysicalDeviceMultiviewFeatures)); 73 memset(&variable_pointer_features, 0, 74 sizeof(VkPhysicalDeviceVariablePointerFeatures)); 75 memset(&protected_memory_features, 0, 76 sizeof(VkPhysicalDeviceProtectedMemoryFeatures)); 77 memset(&sampler_ycbcr_conversion_features, 0, 78 sizeof(VkPhysicalDeviceSamplerYcbcrConversionFeatures)); 79 memset(&shader_draw_parameter_features, 0, 80 sizeof(VkPhysicalDeviceShaderDrawParameterFeatures)); 81 } 82 VkPhysicalDeviceProperties properties; 83 VkPhysicalDeviceFeatures features; 84 VkJsonExtVariablePointerFeatures ext_variable_pointer_features; 85 VkPhysicalDeviceMemoryProperties memory; 86 std::vector<VkQueueFamilyProperties> queues; 87 std::vector<VkExtensionProperties> extensions; 88 std::vector<VkLayerProperties> layers; 89 std::map<VkFormat, VkFormatProperties> formats; 90 VkPhysicalDeviceSubgroupProperties subgroup_properties; 91 VkPhysicalDevicePointClippingProperties point_clipping_properties; 92 VkPhysicalDeviceMultiviewProperties multiview_properties; 93 VkPhysicalDeviceIDProperties id_properties; 94 VkPhysicalDeviceMaintenance3Properties maintenance3_properties; 95 VkPhysicalDevice16BitStorageFeatures bit16_storage_features; 96 VkPhysicalDeviceMultiviewFeatures multiview_features; 97 VkPhysicalDeviceVariablePointerFeatures variable_pointer_features; 98 VkPhysicalDeviceProtectedMemoryFeatures protected_memory_features; 99 VkPhysicalDeviceSamplerYcbcrConversionFeatures 100 sampler_ycbcr_conversion_features; 101 VkPhysicalDeviceShaderDrawParameterFeatures shader_draw_parameter_features; 102 std::map<VkExternalFenceHandleTypeFlagBits, VkExternalFenceProperties> 103 external_fence_properties; 104 std::map<VkExternalSemaphoreHandleTypeFlagBits, VkExternalSemaphoreProperties> 105 external_semaphore_properties; 106}; 107 108struct VkJsonDeviceGroup { 109 VkJsonDeviceGroup() { 110 memset(&properties, 0, sizeof(VkPhysicalDeviceGroupProperties)); 111 } 112 VkPhysicalDeviceGroupProperties properties; 113 std::vector<uint32_t> device_inds; 114}; 115 116struct VkJsonInstance { 117 VkJsonInstance() : api_version(0) {} 118 uint32_t api_version; 119 std::vector<VkJsonLayer> layers; 120 std::vector<VkExtensionProperties> extensions; 121 std::vector<VkJsonDevice> devices; 122 std::vector<VkJsonDeviceGroup> device_groups; 123}; 124 125VkJsonInstance VkJsonGetInstance(); 126std::string VkJsonInstanceToJson(const VkJsonInstance& instance); 127bool VkJsonInstanceFromJson(const std::string& json, 128 VkJsonInstance* instance, 129 std::string* errors); 130 131VkJsonDevice VkJsonGetDevice(VkInstance instance, 132 VkPhysicalDevice device, 133 uint32_t instanceExtensionCount, 134 const char* const* instanceExtensions); 135std::string VkJsonDeviceToJson(const VkJsonDevice& device); 136bool VkJsonDeviceFromJson(const std::string& json, 137 VkJsonDevice* device, 138 std::string* errors); 139 140std::string VkJsonImageFormatPropertiesToJson( 141 const VkImageFormatProperties& properties); 142bool VkJsonImageFormatPropertiesFromJson(const std::string& json, 143 VkImageFormatProperties* properties, 144 std::string* errors); 145 146// Backward-compatibility aliases 147typedef VkJsonDevice VkJsonAllProperties; 148inline VkJsonAllProperties VkJsonGetAllProperties( 149 VkPhysicalDevice physicalDevice) { 150 return VkJsonGetDevice(VK_NULL_HANDLE, physicalDevice, 0, nullptr); 151} 152inline std::string VkJsonAllPropertiesToJson( 153 const VkJsonAllProperties& properties) { 154 return VkJsonDeviceToJson(properties); 155} 156inline bool VkJsonAllPropertiesFromJson(const std::string& json, 157 VkJsonAllProperties* properties, 158 std::string* errors) { 159 return VkJsonDeviceFromJson(json, properties, errors); 160} 161 162#endif // VKJSON_H_ 163