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
36struct VkJsonLayer {
37  VkLayerProperties properties;
38  std::vector<VkExtensionProperties> extensions;
39};
40
41struct VkJsonDevice {
42  VkJsonDevice() {
43          memset(&properties, 0, sizeof(VkPhysicalDeviceProperties));
44          memset(&features, 0, sizeof(VkPhysicalDeviceFeatures));
45          memset(&memory, 0, sizeof(VkPhysicalDeviceMemoryProperties));
46  }
47  VkPhysicalDeviceProperties properties;
48  VkPhysicalDeviceFeatures features;
49  VkPhysicalDeviceMemoryProperties memory;
50  std::vector<VkQueueFamilyProperties> queues;
51  std::vector<VkExtensionProperties> extensions;
52  std::vector<VkLayerProperties> layers;
53  std::map<VkFormat, VkFormatProperties> formats;
54};
55
56struct VkJsonInstance {
57  std::vector<VkJsonLayer> layers;
58  std::vector<VkExtensionProperties> extensions;
59  std::vector<VkJsonDevice> devices;
60};
61
62VkJsonInstance VkJsonGetInstance();
63std::string VkJsonInstanceToJson(const VkJsonInstance& instance);
64bool VkJsonInstanceFromJson(const std::string& json,
65                            VkJsonInstance* instance,
66                            std::string* errors);
67
68VkJsonDevice VkJsonGetDevice(VkPhysicalDevice device);
69std::string VkJsonDeviceToJson(const VkJsonDevice& device);
70bool VkJsonDeviceFromJson(const std::string& json,
71                          VkJsonDevice* device,
72                          std::string* errors);
73
74std::string VkJsonImageFormatPropertiesToJson(
75    const VkImageFormatProperties& properties);
76bool VkJsonImageFormatPropertiesFromJson(const std::string& json,
77                                         VkImageFormatProperties* properties,
78                                         std::string* errors);
79
80// Backward-compatibility aliases
81typedef VkJsonDevice VkJsonAllProperties;
82inline VkJsonAllProperties VkJsonGetAllProperties(
83    VkPhysicalDevice physicalDevice) {
84  return VkJsonGetDevice(physicalDevice);
85}
86inline std::string VkJsonAllPropertiesToJson(
87    const VkJsonAllProperties& properties) {
88  return VkJsonDeviceToJson(properties);
89}
90inline bool VkJsonAllPropertiesFromJson(const std::string& json,
91                                        VkJsonAllProperties* properties,
92                                        std::string* errors) {
93  return VkJsonDeviceFromJson(json, properties, errors);
94}
95
96#endif  // VKJSON_H_
97