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