1b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz/////////////////////////////////////////////////////////////////////////////// 2e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour// 3b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz// Copyright (c) 2015-2016 The Khronos Group Inc. 4b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz// Copyright (c) 2015-2016 Valve Corporation 5b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz// Copyright (c) 2015-2016 LunarG, Inc. 6b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz// Copyright (c) 2015-2016 Google, Inc. 7e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour// 843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn// Licensed under the Apache License, Version 2.0 (the "License"); 943b53e83705f02245da6ae61e31273866a35b833Jon Ashburn// you may not use this file except in compliance with the License. 1043b53e83705f02245da6ae61e31273866a35b833Jon Ashburn// You may obtain a copy of the License at 11e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour// 1243b53e83705f02245da6ae61e31273866a35b833Jon Ashburn// http://www.apache.org/licenses/LICENSE-2.0 13b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz// 1443b53e83705f02245da6ae61e31273866a35b833Jon Ashburn// Unless required by applicable law or agreed to in writing, software 1543b53e83705f02245da6ae61e31273866a35b833Jon Ashburn// distributed under the License is distributed on an "AS IS" BASIS, 1643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1743b53e83705f02245da6ae61e31273866a35b833Jon Ashburn// See the License for the specific language governing permissions and 1843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn// limitations under the License. 19b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz/////////////////////////////////////////////////////////////////////////////// 20e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 21e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour#include "vkjson.h" 22e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 23e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour#include <assert.h> 24e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour#include <string.h> 25ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop#include <stdlib.h> 26e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 27e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour#include <cmath> 28f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour#include <cinttypes> 29f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour#include <cstdio> 30e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour#include <limits> 31e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour#include <memory> 32e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour#include <sstream> 33e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour#include <type_traits> 34e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour#include <utility> 35e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 3666e6a3f23e9332bfae6219e97cb5616208d7f30cJesse Hall#include <cJSON.h> 37e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 38e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labournamespace { 39e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 40e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool IsIntegral(double value) { 41ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop#if defined(ANDROID) 42ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop // Android NDK doesn't provide std::trunc yet 43ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop return trunc(value) == value; 44ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop#else 45e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return std::trunc(value) == value; 46ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop#endif 47e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 48e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 49e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T> struct EnumTraits; 50e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <> struct EnumTraits<VkPhysicalDeviceType> { 51e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour static uint32_t min() { return VK_PHYSICAL_DEVICE_TYPE_BEGIN_RANGE; } 52e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour static uint32_t max() { return VK_PHYSICAL_DEVICE_TYPE_END_RANGE; } 5306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang static bool exist(uint32_t e) { return e >= min() && e <= max(); } 54e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour}; 55e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 56e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <> struct EnumTraits<VkFormat> { 5706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang static bool exist(uint32_t e) { 5806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang switch (e) { 5906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_UNDEFINED: 6006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R4G4_UNORM_PACK8: 6106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R4G4B4A4_UNORM_PACK16: 6206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B4G4R4A4_UNORM_PACK16: 6306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R5G6B5_UNORM_PACK16: 6406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B5G6R5_UNORM_PACK16: 6506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R5G5B5A1_UNORM_PACK16: 6606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B5G5R5A1_UNORM_PACK16: 6706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A1R5G5B5_UNORM_PACK16: 6806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8_UNORM: 6906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8_SNORM: 7006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8_USCALED: 7106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8_SSCALED: 7206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8_UINT: 7306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8_SINT: 7406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8_SRGB: 7506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8_UNORM: 7606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8_SNORM: 7706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8_USCALED: 7806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8_SSCALED: 7906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8_UINT: 8006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8_SINT: 8106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8_SRGB: 8206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8_UNORM: 8306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8_SNORM: 8406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8_USCALED: 8506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8_SSCALED: 8606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8_UINT: 8706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8_SINT: 8806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8_SRGB: 8906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8_UNORM: 9006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8_SNORM: 9106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8_USCALED: 9206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8_SSCALED: 9306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8_UINT: 9406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8_SINT: 9506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8_SRGB: 9606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8A8_UNORM: 9706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8A8_SNORM: 9806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8A8_USCALED: 9906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8A8_SSCALED: 10006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8A8_UINT: 10106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8A8_SINT: 10206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R8G8B8A8_SRGB: 10306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8A8_UNORM: 10406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8A8_SNORM: 10506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8A8_USCALED: 10606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8A8_SSCALED: 10706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8A8_UINT: 10806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8A8_SINT: 10906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8A8_SRGB: 11006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A8B8G8R8_UNORM_PACK32: 11106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A8B8G8R8_SNORM_PACK32: 11206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A8B8G8R8_USCALED_PACK32: 11306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A8B8G8R8_SSCALED_PACK32: 11406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A8B8G8R8_UINT_PACK32: 11506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A8B8G8R8_SINT_PACK32: 11606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A8B8G8R8_SRGB_PACK32: 11706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A2R10G10B10_UNORM_PACK32: 11806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A2R10G10B10_SNORM_PACK32: 11906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A2R10G10B10_USCALED_PACK32: 12006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A2R10G10B10_SSCALED_PACK32: 12106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A2R10G10B10_UINT_PACK32: 12206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A2R10G10B10_SINT_PACK32: 12306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A2B10G10R10_UNORM_PACK32: 12406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A2B10G10R10_SNORM_PACK32: 12506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A2B10G10R10_USCALED_PACK32: 12606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A2B10G10R10_SSCALED_PACK32: 12706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A2B10G10R10_UINT_PACK32: 12806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_A2B10G10R10_SINT_PACK32: 12906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16_UNORM: 13006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16_SNORM: 13106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16_USCALED: 13206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16_SSCALED: 13306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16_UINT: 13406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16_SINT: 13506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16_SFLOAT: 13606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16_UNORM: 13706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16_SNORM: 13806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16_USCALED: 13906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16_SSCALED: 14006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16_UINT: 14106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16_SINT: 14206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16_SFLOAT: 14306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16_UNORM: 14406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16_SNORM: 14506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16_USCALED: 14606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16_SSCALED: 14706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16_UINT: 14806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16_SINT: 14906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16_SFLOAT: 15006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16A16_UNORM: 15106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16A16_SNORM: 15206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16A16_USCALED: 15306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16A16_SSCALED: 15406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16A16_UINT: 15506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16A16_SINT: 15606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R16G16B16A16_SFLOAT: 15706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R32_UINT: 15806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R32_SINT: 15906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R32_SFLOAT: 16006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R32G32_UINT: 16106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R32G32_SINT: 16206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R32G32_SFLOAT: 16306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R32G32B32_UINT: 16406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R32G32B32_SINT: 16506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R32G32B32_SFLOAT: 16606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R32G32B32A32_UINT: 16706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R32G32B32A32_SINT: 16806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R32G32B32A32_SFLOAT: 16906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R64_UINT: 17006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R64_SINT: 17106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R64_SFLOAT: 17206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R64G64_UINT: 17306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R64G64_SINT: 17406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R64G64_SFLOAT: 17506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R64G64B64_UINT: 17606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R64G64B64_SINT: 17706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R64G64B64_SFLOAT: 17806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R64G64B64A64_UINT: 17906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R64G64B64A64_SINT: 18006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R64G64B64A64_SFLOAT: 18106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B10G11R11_UFLOAT_PACK32: 18206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: 18306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_D16_UNORM: 18406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_X8_D24_UNORM_PACK32: 18506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_D32_SFLOAT: 18606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_S8_UINT: 18706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_D16_UNORM_S8_UINT: 18806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_D24_UNORM_S8_UINT: 18906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_D32_SFLOAT_S8_UINT: 19006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC1_RGB_UNORM_BLOCK: 19106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC1_RGB_SRGB_BLOCK: 19206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: 19306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC1_RGBA_SRGB_BLOCK: 19406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC2_UNORM_BLOCK: 19506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC2_SRGB_BLOCK: 19606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC3_UNORM_BLOCK: 19706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC3_SRGB_BLOCK: 19806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC4_UNORM_BLOCK: 19906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC4_SNORM_BLOCK: 20006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC5_UNORM_BLOCK: 20106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC5_SNORM_BLOCK: 20206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC6H_UFLOAT_BLOCK: 20306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC6H_SFLOAT_BLOCK: 20406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC7_UNORM_BLOCK: 20506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_BC7_SRGB_BLOCK: 20606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: 20706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: 20806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: 20906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: 21006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: 21106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: 21206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_EAC_R11_UNORM_BLOCK: 21306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_EAC_R11_SNORM_BLOCK: 21406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_EAC_R11G11_UNORM_BLOCK: 21506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_EAC_R11G11_SNORM_BLOCK: 21606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_4x4_UNORM_BLOCK: 21706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_4x4_SRGB_BLOCK: 21806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_5x4_UNORM_BLOCK: 21906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_5x4_SRGB_BLOCK: 22006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_5x5_UNORM_BLOCK: 22106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_5x5_SRGB_BLOCK: 22206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_6x5_UNORM_BLOCK: 22306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_6x5_SRGB_BLOCK: 22406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_6x6_UNORM_BLOCK: 22506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_6x6_SRGB_BLOCK: 22606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_8x5_UNORM_BLOCK: 22706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_8x5_SRGB_BLOCK: 22806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_8x6_UNORM_BLOCK: 22906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_8x6_SRGB_BLOCK: 23006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_8x8_UNORM_BLOCK: 23106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_8x8_SRGB_BLOCK: 23206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_10x5_UNORM_BLOCK: 23306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_10x5_SRGB_BLOCK: 23406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_10x6_UNORM_BLOCK: 23506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_10x6_SRGB_BLOCK: 23606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_10x8_UNORM_BLOCK: 23706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_10x8_SRGB_BLOCK: 23806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_10x10_UNORM_BLOCK: 23906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_10x10_SRGB_BLOCK: 24006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_12x10_UNORM_BLOCK: 24106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: 24206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_12x12_UNORM_BLOCK: 24306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: 24406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG: 24506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG: 24606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG: 24706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG: 24806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG: 24906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG: 25006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG: 25106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG: 25206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G8B8G8R8_422_UNORM_KHR: 25306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B8G8R8G8_422_UNORM_KHR: 25406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR: 25506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR: 25606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR: 25706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR: 25806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR: 25906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R10X6_UNORM_PACK16_KHR: 26006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR: 26106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR: 26206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR: 26306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR: 26406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR: 26506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR: 26606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR: 26706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR: 26806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR: 26906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R12X4_UNORM_PACK16_KHR: 27006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR: 27106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR: 27206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR: 27306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR: 27406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR: 27506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR: 27606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR: 27706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR: 27806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR: 27906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G16B16G16R16_422_UNORM_KHR: 28006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_B16G16R16G16_422_UNORM_KHR: 28106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR: 28206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR: 28306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR: 28406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR: 28506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR: 28606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang return true; 28706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 28806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang return false; 28906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 290e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour}; 291e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 292e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <> 293e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangstruct EnumTraits<VkPointClippingBehavior> { 294e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang static uint32_t min() { return VK_POINT_CLIPPING_BEHAVIOR_BEGIN_RANGE; } 295e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang static uint32_t max() { return VK_POINT_CLIPPING_BEHAVIOR_END_RANGE; } 29606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang static bool exist(uint32_t e) { return e >= min() && e <= max(); } 297e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang}; 298e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 299e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <> 300e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangstruct EnumTraits<VkExternalFenceHandleTypeFlagBits> { 30106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang static bool exist(uint32_t e) { 30206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang switch (e) { 30306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT: 30406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT: 30506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT: 30606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT: 30706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang return true; 30806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 30906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang return false; 31006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 311e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang}; 312e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 313e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <> 314e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangstruct EnumTraits<VkExternalSemaphoreHandleTypeFlagBits> { 31506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang static bool exist(uint32_t e) { 31606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang switch (e) { 31706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT: 31806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT: 31906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT: 32006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT: 32106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT: 32206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang return true; 32306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 32406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang return false; 325e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang } 326e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang}; 327e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 328e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour// VkSparseImageFormatProperties 329e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 330e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 331e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, VkExtent3D* extents) { 332e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 333e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("width", &extents->width) && 334e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("height", &extents->height) && 335e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("depth", &extents->depth); 336e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 337e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 338e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 339e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, VkImageFormatProperties* properties) { 340e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 341e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxExtent", &properties->maxExtent) && 342e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxMipLevels", &properties->maxMipLevels) && 343e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxArrayLayers", &properties->maxArrayLayers) && 344e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sampleCounts", &properties->sampleCounts) && 345e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxResourceSize", &properties->maxResourceSize); 346e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 347e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 348e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 349e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, VkPhysicalDeviceLimits* limits) { 350e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 351e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxImageDimension1D", &limits->maxImageDimension1D) && 352e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxImageDimension2D", &limits->maxImageDimension2D) && 353e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxImageDimension3D", &limits->maxImageDimension3D) && 354e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxImageDimensionCube", &limits->maxImageDimensionCube) && 355e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxImageArrayLayers", &limits->maxImageArrayLayers) && 356e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxTexelBufferElements", &limits->maxTexelBufferElements) && 357e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxUniformBufferRange", &limits->maxUniformBufferRange) && 358e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxStorageBufferRange", &limits->maxStorageBufferRange) && 359e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxPushConstantsSize", &limits->maxPushConstantsSize) && 360e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxMemoryAllocationCount", &limits->maxMemoryAllocationCount) && 361e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxSamplerAllocationCount", &limits->maxSamplerAllocationCount) && 362e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("bufferImageGranularity", &limits->bufferImageGranularity) && 363e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sparseAddressSpaceSize", &limits->sparseAddressSpaceSize) && 364e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxBoundDescriptorSets", &limits->maxBoundDescriptorSets) && 365e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxPerStageDescriptorSamplers", &limits->maxPerStageDescriptorSamplers) && 366e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxPerStageDescriptorUniformBuffers", &limits->maxPerStageDescriptorUniformBuffers) && 367e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxPerStageDescriptorStorageBuffers", &limits->maxPerStageDescriptorStorageBuffers) && 368e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxPerStageDescriptorSampledImages", &limits->maxPerStageDescriptorSampledImages) && 369e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxPerStageDescriptorStorageImages", &limits->maxPerStageDescriptorStorageImages) && 370e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxPerStageDescriptorInputAttachments", &limits->maxPerStageDescriptorInputAttachments) && 371e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxPerStageResources", &limits->maxPerStageResources) && 372e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxDescriptorSetSamplers", &limits->maxDescriptorSetSamplers) && 373e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxDescriptorSetUniformBuffers", &limits->maxDescriptorSetUniformBuffers) && 374e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxDescriptorSetUniformBuffersDynamic", &limits->maxDescriptorSetUniformBuffersDynamic) && 375e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxDescriptorSetStorageBuffers", &limits->maxDescriptorSetStorageBuffers) && 376e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxDescriptorSetStorageBuffersDynamic", &limits->maxDescriptorSetStorageBuffersDynamic) && 377e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxDescriptorSetSampledImages", &limits->maxDescriptorSetSampledImages) && 378e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxDescriptorSetStorageImages", &limits->maxDescriptorSetStorageImages) && 379e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxDescriptorSetInputAttachments", &limits->maxDescriptorSetInputAttachments) && 380e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxVertexInputAttributes", &limits->maxVertexInputAttributes) && 381e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxVertexInputBindings", &limits->maxVertexInputBindings) && 382e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxVertexInputAttributeOffset", &limits->maxVertexInputAttributeOffset) && 383e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxVertexInputBindingStride", &limits->maxVertexInputBindingStride) && 384e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxVertexOutputComponents", &limits->maxVertexOutputComponents) && 385e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxTessellationGenerationLevel", &limits->maxTessellationGenerationLevel) && 386e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxTessellationPatchSize", &limits->maxTessellationPatchSize) && 387e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxTessellationControlPerVertexInputComponents", &limits->maxTessellationControlPerVertexInputComponents) && 388e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxTessellationControlPerVertexOutputComponents", &limits->maxTessellationControlPerVertexOutputComponents) && 389e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxTessellationControlPerPatchOutputComponents", &limits->maxTessellationControlPerPatchOutputComponents) && 390e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxTessellationControlTotalOutputComponents", &limits->maxTessellationControlTotalOutputComponents) && 391e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxTessellationEvaluationInputComponents", &limits->maxTessellationEvaluationInputComponents) && 392e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxTessellationEvaluationOutputComponents", &limits->maxTessellationEvaluationOutputComponents) && 393e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxGeometryShaderInvocations", &limits->maxGeometryShaderInvocations) && 394e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxGeometryInputComponents", &limits->maxGeometryInputComponents) && 395e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxGeometryOutputComponents", &limits->maxGeometryOutputComponents) && 396e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxGeometryOutputVertices", &limits->maxGeometryOutputVertices) && 397e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxGeometryTotalOutputComponents", &limits->maxGeometryTotalOutputComponents) && 398e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxFragmentInputComponents", &limits->maxFragmentInputComponents) && 399e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxFragmentOutputAttachments", &limits->maxFragmentOutputAttachments) && 400e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxFragmentDualSrcAttachments", &limits->maxFragmentDualSrcAttachments) && 401e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxFragmentCombinedOutputResources", &limits->maxFragmentCombinedOutputResources) && 402e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxComputeSharedMemorySize", &limits->maxComputeSharedMemorySize) && 403e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxComputeWorkGroupCount", &limits->maxComputeWorkGroupCount) && 404e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxComputeWorkGroupInvocations", &limits->maxComputeWorkGroupInvocations) && 405e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxComputeWorkGroupSize", &limits->maxComputeWorkGroupSize) && 406e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("subPixelPrecisionBits", &limits->subPixelPrecisionBits) && 407e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("subTexelPrecisionBits", &limits->subTexelPrecisionBits) && 408e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("mipmapPrecisionBits", &limits->mipmapPrecisionBits) && 409e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxDrawIndexedIndexValue", &limits->maxDrawIndexedIndexValue) && 410e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxDrawIndirectCount", &limits->maxDrawIndirectCount) && 411e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxSamplerLodBias", &limits->maxSamplerLodBias) && 412e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxSamplerAnisotropy", &limits->maxSamplerAnisotropy) && 413e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxViewports", &limits->maxViewports) && 414e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxViewportDimensions", &limits->maxViewportDimensions) && 415e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("viewportBoundsRange", &limits->viewportBoundsRange) && 416e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("viewportSubPixelBits", &limits->viewportSubPixelBits) && 417e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("minMemoryMapAlignment", &limits->minMemoryMapAlignment) && 418e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("minTexelBufferOffsetAlignment", &limits->minTexelBufferOffsetAlignment) && 419e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("minUniformBufferOffsetAlignment", &limits->minUniformBufferOffsetAlignment) && 420e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("minStorageBufferOffsetAlignment", &limits->minStorageBufferOffsetAlignment) && 421e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("minTexelOffset", &limits->minTexelOffset) && 422e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxTexelOffset", &limits->maxTexelOffset) && 423e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("minTexelGatherOffset", &limits->minTexelGatherOffset) && 424e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxTexelGatherOffset", &limits->maxTexelGatherOffset) && 425e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("minInterpolationOffset", &limits->minInterpolationOffset) && 426e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxInterpolationOffset", &limits->maxInterpolationOffset) && 427e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("subPixelInterpolationOffsetBits", &limits->subPixelInterpolationOffsetBits) && 428e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxFramebufferWidth", &limits->maxFramebufferWidth) && 429e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxFramebufferHeight", &limits->maxFramebufferHeight) && 430e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxFramebufferLayers", &limits->maxFramebufferLayers) && 431e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("framebufferColorSampleCounts", &limits->framebufferColorSampleCounts) && 432e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("framebufferDepthSampleCounts", &limits->framebufferDepthSampleCounts) && 433e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("framebufferStencilSampleCounts", &limits->framebufferStencilSampleCounts) && 434e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("framebufferNoAttachmentsSampleCounts", &limits->framebufferNoAttachmentsSampleCounts) && 435e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxColorAttachments", &limits->maxColorAttachments) && 436e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sampledImageColorSampleCounts", &limits->sampledImageColorSampleCounts) && 437e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sampledImageIntegerSampleCounts", &limits->sampledImageIntegerSampleCounts) && 438e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sampledImageDepthSampleCounts", &limits->sampledImageDepthSampleCounts) && 439e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sampledImageStencilSampleCounts", &limits->sampledImageStencilSampleCounts) && 440e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("storageImageSampleCounts", &limits->storageImageSampleCounts) && 441e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxSampleMaskWords", &limits->maxSampleMaskWords) && 442e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("timestampComputeAndGraphics", &limits->timestampComputeAndGraphics) && 443e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("timestampPeriod", &limits->timestampPeriod) && 444e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxClipDistances", &limits->maxClipDistances) && 445e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxCullDistances", &limits->maxCullDistances) && 446e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("maxCombinedClipAndCullDistances", &limits->maxCombinedClipAndCullDistances) && 447e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("discreteQueuePriorities", &limits->discreteQueuePriorities) && 448e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("pointSizeRange", &limits->pointSizeRange) && 449e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("lineWidthRange", &limits->lineWidthRange) && 450e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("pointSizeGranularity", &limits->pointSizeGranularity) && 451e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("lineWidthGranularity", &limits->lineWidthGranularity) && 452e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("strictLines", &limits->strictLines) && 453e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("standardSampleLocations", &limits->standardSampleLocations) && 454e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("optimalBufferCopyOffsetAlignment", &limits->optimalBufferCopyOffsetAlignment) && 455e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("optimalBufferCopyRowPitchAlignment", &limits->optimalBufferCopyRowPitchAlignment) && 456e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("nonCoherentAtomSize", &limits->nonCoherentAtomSize); 457e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 458e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 459e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 460e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, 461e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour VkPhysicalDeviceSparseProperties* properties) { 462e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 463e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("residencyStandard2DBlockShape", &properties->residencyStandard2DBlockShape) && 464e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("residencyStandard2DMultisampleBlockShape", &properties->residencyStandard2DMultisampleBlockShape) && 465e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("residencyStandard3DBlockShape", &properties->residencyStandard3DBlockShape) && 466e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("residencyAlignedMipSize", &properties->residencyAlignedMipSize) && 467e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("residencyNonResidentStrict", &properties->residencyNonResidentStrict); 468e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 469e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 470e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 471e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, 472e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour VkPhysicalDeviceProperties* properties) { 473e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 474e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("apiVersion", &properties->apiVersion) && 475e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("driverVersion", &properties->driverVersion) && 476e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("vendorID", &properties->vendorID) && 477e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("deviceID", &properties->deviceID) && 478e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("deviceType", &properties->deviceType) && 479e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("deviceName", &properties->deviceName) && 480e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("pipelineCacheUUID", &properties->pipelineCacheUUID) && 481e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("limits", &properties->limits) && 482e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sparseProperties", &properties->sparseProperties); 483e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 484e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 485e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 486e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, VkPhysicalDeviceFeatures* features) { 487e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 488e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("robustBufferAccess", &features->robustBufferAccess) && 489e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("fullDrawIndexUint32", &features->fullDrawIndexUint32) && 490e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("imageCubeArray", &features->imageCubeArray) && 491e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("independentBlend", &features->independentBlend) && 492e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("geometryShader", &features->geometryShader) && 493e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("tessellationShader", &features->tessellationShader) && 494e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sampleRateShading", &features->sampleRateShading) && 495e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("dualSrcBlend", &features->dualSrcBlend) && 496e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("logicOp", &features->logicOp) && 497e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("multiDrawIndirect", &features->multiDrawIndirect) && 498e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("drawIndirectFirstInstance", &features->drawIndirectFirstInstance) && 499e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("depthClamp", &features->depthClamp) && 500e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("depthBiasClamp", &features->depthBiasClamp) && 501e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("fillModeNonSolid", &features->fillModeNonSolid) && 502e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("depthBounds", &features->depthBounds) && 503e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("wideLines", &features->wideLines) && 504e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("largePoints", &features->largePoints) && 505e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("alphaToOne", &features->alphaToOne) && 506e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("multiViewport", &features->multiViewport) && 507e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("samplerAnisotropy", &features->samplerAnisotropy) && 508e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("textureCompressionETC2", &features->textureCompressionETC2) && 509e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("textureCompressionASTC_LDR", &features->textureCompressionASTC_LDR) && 510e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("textureCompressionBC", &features->textureCompressionBC) && 511e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("occlusionQueryPrecise", &features->occlusionQueryPrecise) && 512e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("pipelineStatisticsQuery", &features->pipelineStatisticsQuery) && 513e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("vertexPipelineStoresAndAtomics", &features->vertexPipelineStoresAndAtomics) && 514e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("fragmentStoresAndAtomics", &features->fragmentStoresAndAtomics) && 515e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderTessellationAndGeometryPointSize", &features->shaderTessellationAndGeometryPointSize) && 516e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderImageGatherExtended", &features->shaderImageGatherExtended) && 517e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderStorageImageExtendedFormats", &features->shaderStorageImageExtendedFormats) && 518e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderStorageImageMultisample", &features->shaderStorageImageMultisample) && 519e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderStorageImageReadWithoutFormat", &features->shaderStorageImageReadWithoutFormat) && 520e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderStorageImageWriteWithoutFormat", &features->shaderStorageImageWriteWithoutFormat) && 521e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderUniformBufferArrayDynamicIndexing", &features->shaderUniformBufferArrayDynamicIndexing) && 522e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderSampledImageArrayDynamicIndexing", &features->shaderSampledImageArrayDynamicIndexing) && 523e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderStorageBufferArrayDynamicIndexing", &features->shaderStorageBufferArrayDynamicIndexing) && 524e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderStorageImageArrayDynamicIndexing", &features->shaderStorageImageArrayDynamicIndexing) && 525e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderClipDistance", &features->shaderClipDistance) && 526e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderCullDistance", &features->shaderCullDistance) && 527e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderFloat64", &features->shaderFloat64) && 528e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderInt64", &features->shaderInt64) && 529e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderInt16", &features->shaderInt16) && 530e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderResourceResidency", &features->shaderResourceResidency) && 531e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("shaderResourceMinLod", &features->shaderResourceMinLod) && 532e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sparseBinding", &features->sparseBinding) && 533e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sparseResidencyBuffer", &features->sparseResidencyBuffer) && 534e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sparseResidencyImage2D", &features->sparseResidencyImage2D) && 535e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sparseResidencyImage3D", &features->sparseResidencyImage3D) && 536e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sparseResidency2Samples", &features->sparseResidency2Samples) && 537e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sparseResidency4Samples", &features->sparseResidency4Samples) && 538e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sparseResidency8Samples", &features->sparseResidency8Samples) && 539e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sparseResidency16Samples", &features->sparseResidency16Samples) && 540e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("sparseResidencyAliased", &features->sparseResidencyAliased) && 541e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("variableMultisampleRate", &features->variableMultisampleRate) && 542e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("inheritedQueries", &features->inheritedQueries); 543e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 544e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 545e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 54673bf24cb361d3b2163cd0e124aff01b5308ad9d5Jesse Hallinline bool Iterate(Visitor* visitor, 54706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang VkJsonExtVariablePointerFeatures* features) { 54806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang return visitor->Visit("variablePointerFeaturesKHR", 54906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang &features->variable_pointer_features_khr); 55073bf24cb361d3b2163cd0e124aff01b5308ad9d5Jesse Hall} 55173bf24cb361d3b2163cd0e124aff01b5308ad9d5Jesse Hall 55273bf24cb361d3b2163cd0e124aff01b5308ad9d5Jesse Halltemplate <typename Visitor> 553e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, VkMemoryType* type) { 554e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 555e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("propertyFlags", &type->propertyFlags) && 556e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("heapIndex", &type->heapIndex); 557e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 558e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 559e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 560e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, VkMemoryHeap* heap) { 561e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 562e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("size", &heap->size) && 563e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("flags", &heap->flags); 564e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 565e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 566e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 567e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, VkPhysicalDeviceMemoryProperties* properties) { 568e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 569e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("memoryTypeCount", &properties->memoryTypeCount) && 570e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->VisitArray("memoryTypes", properties->memoryTypeCount, &properties->memoryTypes) && 571e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("memoryHeapCount", &properties->memoryHeapCount) && 572e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->VisitArray("memoryHeaps", properties->memoryHeapCount, &properties->memoryHeaps); 573e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 574e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 575e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 576e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, 577e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang VkPhysicalDeviceSubgroupProperties* properties) { 578e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("subgroupSize", &properties->subgroupSize) && 579e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("supportedStages", &properties->supportedStages) && 580e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("supportedOperations", 581e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->supportedOperations) && 582e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("quadOperationsInAllStages", 583e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->quadOperationsInAllStages); 584e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 585e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 586e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 587e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, 588e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang VkPhysicalDevicePointClippingProperties* properties) { 589e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("pointClippingBehavior", 590e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->pointClippingBehavior); 591e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 592e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 593e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 594e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, 595e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang VkPhysicalDeviceMultiviewProperties* properties) { 596e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("maxMultiviewViewCount", 597e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->maxMultiviewViewCount) && 598e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("maxMultiviewInstanceIndex", 599e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->maxMultiviewInstanceIndex); 600e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 601e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 602e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 603e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, 604e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang VkPhysicalDeviceIDProperties* properties) { 605e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("deviceUUID", &properties->deviceUUID) && 606e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("driverUUID", &properties->driverUUID) && 607e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("deviceLUID", &properties->deviceLUID) && 608e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("deviceNodeMask", &properties->deviceNodeMask) && 609e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("deviceLUIDValid", &properties->deviceLUIDValid); 610e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 611e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 612e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 613e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, 614e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang VkPhysicalDeviceMaintenance3Properties* properties) { 615e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("maxPerSetDescriptors", 616e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->maxPerSetDescriptors) && 617e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("maxMemoryAllocationSize", 618e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->maxMemoryAllocationSize); 619e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 620e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 621e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 622e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, 623e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang VkPhysicalDevice16BitStorageFeatures* features) { 624e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("storageBuffer16BitAccess", 625e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &features->storageBuffer16BitAccess) && 626e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("uniformAndStorageBuffer16BitAccess", 627e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &features->uniformAndStorageBuffer16BitAccess) && 628e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("storagePushConstant16", 629e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &features->storagePushConstant16) && 630e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("storageInputOutput16", 631e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &features->storageInputOutput16); 632e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 633e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 634e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 635e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, 636e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang VkPhysicalDeviceMultiviewFeatures* features) { 637e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("multiview", &features->multiview) && 638e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("multiviewGeometryShader", 639e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &features->multiviewGeometryShader) && 640e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("multiviewTessellationShader", 641e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &features->multiviewTessellationShader); 642e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 643e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 644e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 645e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, 64606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang VkPhysicalDeviceVariablePointerFeatures* features) { 64706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang return visitor->Visit("variablePointersStorageBuffer", 64806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang &features->variablePointersStorageBuffer) && 64906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang visitor->Visit("variablePointers", &features->variablePointers); 65006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang} 65106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang 65206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhangtemplate <typename Visitor> 65306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhanginline bool Iterate(Visitor* visitor, 654e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang VkPhysicalDeviceProtectedMemoryFeatures* features) { 655e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("protectedMemory", &features->protectedMemory); 656e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 657e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 658e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 659e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, 660e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang VkPhysicalDeviceSamplerYcbcrConversionFeatures* features) { 661e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("samplerYcbcrConversion", 662e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &features->samplerYcbcrConversion); 663e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 664e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 665e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 666e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, 667e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang VkPhysicalDeviceShaderDrawParameterFeatures* features) { 668e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("shaderDrawParameters", 669e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &features->shaderDrawParameters); 670e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 671e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 672e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 673e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, VkExternalFenceProperties* properties) { 674e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("exportFromImportedHandleTypes", 675e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->exportFromImportedHandleTypes) && 676e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("compatibleHandleTypes", 677e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->compatibleHandleTypes) && 678e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("externalFenceFeatures", 679e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->externalFenceFeatures); 680e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 681e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 682e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 683e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, 684e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang VkExternalSemaphoreProperties* properties) { 685e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("exportFromImportedHandleTypes", 686e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->exportFromImportedHandleTypes) && 687e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("compatibleHandleTypes", 688e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->compatibleHandleTypes) && 689e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("externalSemaphoreFeatures", 690e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &properties->externalSemaphoreFeatures); 691e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 692e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 693e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 694e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, VkQueueFamilyProperties* properties) { 695e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 696e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("queueFlags", &properties->queueFlags) && 697e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("queueCount", &properties->queueCount) && 698e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("timestampValidBits", &properties->timestampValidBits) && 699e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("minImageTransferGranularity", &properties->minImageTransferGranularity); 700e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 701e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 702e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 703e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, VkExtensionProperties* properties) { 704e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 705e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("extensionName", &properties->extensionName) && 706e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("specVersion", &properties->specVersion); 707e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 708e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 709e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 710e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, VkLayerProperties* properties) { 711e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 712e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("layerName", &properties->layerName) && 713e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("specVersion", &properties->specVersion) && 714e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("implementationVersion", &properties->implementationVersion) && 715e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("description", &properties->description); 716e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 717e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 718e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 719e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool Iterate(Visitor* visitor, VkFormatProperties* properties) { 720e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return 721e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("linearTilingFeatures", &properties->linearTilingFeatures) && 722e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("optimalTilingFeatures", &properties->optimalTilingFeatures) && 723e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour visitor->Visit("bufferFeatures", &properties->bufferFeatures); 724e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 725e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 726e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor> 727b4d24eaa8cdc950e730418898612fe971c176c46Jesse Hallinline bool Iterate(Visitor* visitor, VkJsonLayer* layer) { 728b4d24eaa8cdc950e730418898612fe971c176c46Jesse Hall return visitor->Visit("properties", &layer->properties) && 729b4d24eaa8cdc950e730418898612fe971c176c46Jesse Hall visitor->Visit("extensions", &layer->extensions); 730b4d24eaa8cdc950e730418898612fe971c176c46Jesse Hall} 731b4d24eaa8cdc950e730418898612fe971c176c46Jesse Hall 732b4d24eaa8cdc950e730418898612fe971c176c46Jesse Halltemplate <typename Visitor> 733e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhanginline bool Iterate(Visitor* visitor, VkJsonDeviceGroup* device_group) { 734e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return visitor->Visit("devices", &device_group->device_inds) && 735e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("subsetAllocation", 736e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &device_group->properties.subsetAllocation); 737e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang} 738e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang 739e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhangtemplate <typename Visitor> 740594091db7f508f6073975efddb5fab8d0fb273e7Jesse Hallinline bool Iterate(Visitor* visitor, VkJsonDevice* device) { 741e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang bool ret = true; 742e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang switch (device->properties.apiVersion ^ 743e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang VK_VERSION_PATCH(device->properties.apiVersion)) { 744e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang case VK_API_VERSION_1_1: 745e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang ret &= 746e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("subgroupProperties", &device->subgroup_properties) && 747e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("pointClippingProperties", 748e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &device->point_clipping_properties) && 749e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("multiviewProperties", 750e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &device->multiview_properties) && 751e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("idProperties", &device->id_properties) && 752e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("maintenance3Properties", 753e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &device->maintenance3_properties) && 754e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("16bitStorageFeatures", 755e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &device->bit16_storage_features) && 756e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("multiviewFeatures", &device->multiview_features) && 757e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("variablePointerFeatures", 75806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang &device->variable_pointer_features) && 759e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("protectedMemoryFeatures", 760e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &device->protected_memory_features) && 761e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("samplerYcbcrConversionFeatures", 762e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &device->sampler_ycbcr_conversion_features) && 763e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("shaderDrawParameterFeatures", 764e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &device->shader_draw_parameter_features) && 765e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("externalFenceProperties", 766e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &device->external_fence_properties) && 767e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("externalSemaphoreProperties", 768e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang &device->external_semaphore_properties); 769e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang case VK_API_VERSION_1_0: 770e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang ret &= visitor->Visit("properties", &device->properties) && 771e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("features", &device->features) && 77206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang visitor->Visit("VK_KHR_variable_pointers", 77306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang &device->ext_variable_pointer_features) && 774e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("memory", &device->memory) && 775e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("queues", &device->queues) && 776e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("extensions", &device->extensions) && 777e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("layers", &device->layers) && 778e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("formats", &device->formats); 779e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang } 780e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return ret; 781e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 782e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 7836f328aec9b6c8667e12fee73847d9954814991ddJesse Halltemplate <typename Visitor> 7846f328aec9b6c8667e12fee73847d9954814991ddJesse Hallinline bool Iterate(Visitor* visitor, VkJsonInstance* instance) { 785e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang bool ret = true; 786e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang switch (instance->api_version ^ VK_VERSION_PATCH(instance->api_version)) { 787e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang case VK_API_VERSION_1_1: 788e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang ret &= visitor->Visit("deviceGroups", &instance->device_groups); 789e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang case VK_API_VERSION_1_0: 790e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang ret &= visitor->Visit("layers", &instance->layers) && 791e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("extensions", &instance->extensions) && 792e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang visitor->Visit("devices", &instance->devices); 793e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang } 794e6e471ab2396d695aea3d823723c1a86a1c8ad29Yiwei Zhang return ret; 7956f328aec9b6c8667e12fee73847d9954814991ddJesse Hall} 796e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 797e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T> 798e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourusing EnableForArithmetic = 799e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour typename std::enable_if<std::is_arithmetic<T>::value, void>::type; 800e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 801e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T> 802e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourusing EnableForStruct = 803e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour typename std::enable_if<std::is_class<T>::value, void>::type; 804e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 805e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T> 806e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourusing EnableForEnum = 807e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour typename std::enable_if<std::is_enum<T>::value, void>::type; 808e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 809e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T, typename = EnableForStruct<T>, typename = void> 810e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine LabourcJSON* ToJsonValue(const T& value); 811e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 812e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T, typename = EnableForArithmetic<T>> 813e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline cJSON* ToJsonValue(const T& value) { 814e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return cJSON_CreateNumber(static_cast<double>(value)); 815e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 816e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 817f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labourinline cJSON* ToJsonValue(const uint64_t& value) { 818f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour char string[19] = {0}; // "0x" + 16 digits + terminal \0 8195ca53291a312c4343d8f25e77136491242daf383Jon Ashburn snprintf(string, sizeof(string), "0x%016" PRIx64, value); 820f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour return cJSON_CreateString(string); 821f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour} 822f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour 823e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T, typename = EnableForEnum<T>, typename = void, 824e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour typename = void> 825e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline cJSON* ToJsonValue(const T& value) { 826e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return cJSON_CreateNumber(static_cast<double>(value)); 827e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 828e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 829e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T> 830e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline cJSON* ArrayToJsonValue(uint32_t count, const T* values) { 831e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON* array = cJSON_CreateArray(); 832e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour for (unsigned int i = 0; i < count; ++i) 833e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON_AddItemToArray(array, ToJsonValue(values[i])); 834e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return array; 835e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 836e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 837e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T, unsigned int N> 838e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline cJSON* ToJsonValue(const T (&value)[N]) { 839e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return ArrayToJsonValue(N, value); 840e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 841e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 842e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <size_t N> 843e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline cJSON* ToJsonValue(const char (&value)[N]) { 844e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour assert(strlen(value) < N); 845e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return cJSON_CreateString(value); 846e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 847e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 848e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T> 849e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline cJSON* ToJsonValue(const std::vector<T>& value) { 850e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour assert(value.size() <= std::numeric_limits<uint32_t>::max()); 851e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return ArrayToJsonValue(static_cast<uint32_t>(value.size()), value.data()); 852e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 853e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 854e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename F, typename S> 855e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline cJSON* ToJsonValue(const std::pair<F, S>& value) { 856e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON* array = cJSON_CreateArray(); 857e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON_AddItemToArray(array, ToJsonValue(value.first)); 858e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON_AddItemToArray(array, ToJsonValue(value.second)); 859e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return array; 860e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 861e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 862e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename F, typename S> 863e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline cJSON* ToJsonValue(const std::map<F, S>& value) { 864e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON* array = cJSON_CreateArray(); 865e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour for (auto& kv : value) 866e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON_AddItemToArray(array, ToJsonValue(kv)); 867e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return array; 868e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 869e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 870e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourclass JsonWriterVisitor { 871e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour public: 872e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour JsonWriterVisitor() : object_(cJSON_CreateObject()) {} 873e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 874e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour ~JsonWriterVisitor() { 875e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (object_) 876e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON_Delete(object_); 877e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour } 878e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 879e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour template <typename T> bool Visit(const char* key, const T* value) { 880e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON_AddItemToObjectCS(object_, key, ToJsonValue(*value)); 881e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return true; 882e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour } 883e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 884e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour template <typename T, uint32_t N> 885e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour bool VisitArray(const char* key, uint32_t count, const T (*value)[N]) { 886e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour assert(count <= N); 887e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON_AddItemToObjectCS(object_, key, ArrayToJsonValue(count, *value)); 888e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return true; 889e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour } 890e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 891e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON* get_object() const { return object_; } 892e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON* take_object() { 893e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON* object = object_; 894e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour object_ = nullptr; 895e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return object; 896e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour } 897e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 898e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour private: 899e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON* object_; 900e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour}; 901e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 902e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor, typename T> 903e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline void VisitForWrite(Visitor* visitor, const T& t) { 904e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour Iterate(visitor, const_cast<T*>(&t)); 905e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 906e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 90766e6a3f23e9332bfae6219e97cb5616208d7f30cJesse Halltemplate <typename T, typename /*= EnableForStruct<T>*/, typename /*= void*/> 908e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine LabourcJSON* ToJsonValue(const T& value) { 909e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour JsonWriterVisitor visitor; 910e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour VisitForWrite(&visitor, value); 911e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return visitor.take_object(); 912e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 913e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 914e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T, typename = EnableForStruct<T>> 915e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourbool AsValue(cJSON* json_value, T* t); 916e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 917e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool AsValue(cJSON* json_value, int32_t* value) { 918e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour double d = json_value->valuedouble; 919e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (json_value->type != cJSON_Number || !IsIntegral(d) || 920e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour d < static_cast<double>(std::numeric_limits<int32_t>::min()) || 921e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour d > static_cast<double>(std::numeric_limits<int32_t>::max())) 922e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 923e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour *value = static_cast<int32_t>(d); 924e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return true; 925e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 926e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 927e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool AsValue(cJSON* json_value, uint64_t* value) { 928f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour if (json_value->type != cJSON_String) 929e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 930f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour int result = std::sscanf(json_value->valuestring, "0x%016" PRIx64, value); 931f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour return result == 1; 932e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 933e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 934e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool AsValue(cJSON* json_value, uint32_t* value) { 935f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour double d = json_value->valuedouble; 936f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour if (json_value->type != cJSON_Number || !IsIntegral(d) || 937f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour d < 0.0 || d > static_cast<double>(std::numeric_limits<uint32_t>::max())) 938e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 939f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour *value = static_cast<uint32_t>(d); 940e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return true; 941e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 942e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 943e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool AsValue(cJSON* json_value, uint8_t* value) { 944f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour uint32_t value32 = 0; 945f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour AsValue(json_value, &value32); 946f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour if (value32 > std::numeric_limits<uint8_t>::max()) 947e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 948f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour *value = static_cast<uint8_t>(value32); 949e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return true; 950e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 951e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 952e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool AsValue(cJSON* json_value, float* value) { 953e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (json_value->type != cJSON_Number) 954e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 955e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour *value = static_cast<float>(json_value->valuedouble); 956e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return true; 957e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 958e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 959e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T> 960e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool AsArray(cJSON* json_value, uint32_t count, T* values) { 961f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour if (json_value->type != cJSON_Array || 962f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour cJSON_GetArraySize(json_value) != count) 963e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 964e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour for (uint32_t i = 0; i < count; ++i) { 965e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (!AsValue(cJSON_GetArrayItem(json_value, i), values + i)) 966e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 967e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour } 968e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return true; 969e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 970e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 971e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T, unsigned int N> 972e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool AsValue(cJSON* json_value, T (*value)[N]) { 973e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return AsArray(json_value, N, *value); 974e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 975e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 976e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <size_t N> 977e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool AsValue(cJSON* json_value, char (*value)[N]) { 978e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (json_value->type != cJSON_String) 979e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 980e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour size_t len = strlen(json_value->valuestring); 981e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (len >= N) 982e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 983e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour memcpy(*value, json_value->valuestring, len); 984e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour memset(*value + len, 0, N-len); 985e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return true; 986e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 987e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 988e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T, typename = EnableForEnum<T>, typename = void> 989e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool AsValue(cJSON* json_value, T* t) { 990e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour uint32_t value = 0; 991e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (!AsValue(json_value, &value)) 992e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 99306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang if (!EnumTraits<T>::exist(value)) return false; 994e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour *t = static_cast<T>(value); 995e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return true; 996e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 997e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 998e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T> 999e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool AsValue(cJSON* json_value, std::vector<T>* value) { 1000e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (json_value->type != cJSON_Array) 1001e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 1002e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour int size = cJSON_GetArraySize(json_value); 1003e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour value->resize(size); 1004e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return AsArray(json_value, size, value->data()); 1005e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 1006e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1007e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename F, typename S> 1008e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool AsValue(cJSON* json_value, std::pair<F, S>* value) { 1009e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (json_value->type != cJSON_Array || cJSON_GetArraySize(json_value) != 2) 1010e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 1011e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return AsValue(cJSON_GetArrayItem(json_value, 0), &value->first) && 1012e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour AsValue(cJSON_GetArrayItem(json_value, 1), &value->second); 1013e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 1014e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1015e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename F, typename S> 1016e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool AsValue(cJSON* json_value, std::map<F, S>* value) { 1017e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (json_value->type != cJSON_Array) 1018e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 1019e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour int size = cJSON_GetArraySize(json_value); 10208928c06b038cad53ce79d821bc10517f45589768Mark Young for (int i = 0; i < size; ++i) { 1021e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour std::pair<F, S> elem; 1022e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (!AsValue(cJSON_GetArrayItem(json_value, i), &elem)) 1023e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 1024e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (!value->insert(elem).second) 1025e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 1026e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour } 1027e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return true; 1028e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 1029e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1030e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T> 1031e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourbool ReadValue(cJSON* object, const char* key, T* value, 1032e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour std::string* errors) { 1033e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON* json_value = cJSON_GetObjectItem(object, key); 1034e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (!json_value) { 1035e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (errors) 1036e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour *errors = std::string(key) + " missing."; 1037e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 1038e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour } 1039e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (AsValue(json_value, value)) 1040e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return true; 1041e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (errors) 1042e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour *errors = std::string("Wrong type for ") + std::string(key) + "."; 1043e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 1044e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 1045e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1046e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename Visitor, typename T> 1047e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourinline bool VisitForRead(Visitor* visitor, T* t) { 1048e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return Iterate(visitor, t); 1049e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 1050e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1051e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourclass JsonReaderVisitor { 1052e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour public: 1053e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour JsonReaderVisitor(cJSON* object, std::string* errors) 1054e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour : object_(object), errors_(errors) {} 1055e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1056e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour template <typename T> bool Visit(const char* key, T* value) const { 1057e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return ReadValue(object_, key, value, errors_); 1058e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour } 1059e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1060e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour template <typename T, uint32_t N> 1061e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour bool VisitArray(const char* key, uint32_t count, T (*value)[N]) { 1062e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (count > N) 1063e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 1064e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON* json_value = cJSON_GetObjectItem(object_, key); 1065e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (!json_value) { 1066e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (errors_) 1067e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour *errors_ = std::string(key) + " missing."; 1068e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 1069e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour } 1070e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (AsArray(json_value, count, *value)) 1071e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return true; 1072e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (errors_) 1073e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour *errors_ = std::string("Wrong type for ") + std::string(key) + "."; 1074e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 1075e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour } 1076e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1077e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1078e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour private: 1079e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON* object_; 1080e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour std::string* errors_; 1081e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour}; 1082e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 108366e6a3f23e9332bfae6219e97cb5616208d7f30cJesse Halltemplate <typename T, typename /*= EnableForStruct<T>*/> 1084e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourbool AsValue(cJSON* json_value, T* t) { 1085e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (json_value->type != cJSON_Object) 1086e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 1087e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour JsonReaderVisitor visitor(json_value, nullptr); 1088e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return VisitForRead(&visitor, t); 1089e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 1090e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1091e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1092e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T> std::string VkTypeToJson(const T& t) { 1093e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour JsonWriterVisitor visitor; 1094e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour VisitForWrite(&visitor, t); 1095e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1096e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour char* output = cJSON_Print(visitor.get_object()); 1097e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour std::string result(output); 1098e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour free(output); 1099e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return result; 1100e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 1101e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1102e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourtemplate <typename T> bool VkTypeFromJson(const std::string& json, 1103e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour T* t, 1104e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour std::string* errors) { 1105e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour *t = T(); 1106e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON* object = cJSON_Parse(json.c_str()); 1107e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (!object) { 1108e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour if (errors) 1109e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour errors->assign(cJSON_GetErrorPtr()); 1110e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return false; 1111e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour } 1112e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour bool result = AsValue(object, t); 1113e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour cJSON_Delete(object); 1114e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return result; 1115e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 1116e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1117e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} // anonymous namespace 1118e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 11196f328aec9b6c8667e12fee73847d9954814991ddJesse Hallstd::string VkJsonInstanceToJson(const VkJsonInstance& instance) { 11206f328aec9b6c8667e12fee73847d9954814991ddJesse Hall return VkTypeToJson(instance); 1121e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 1122e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 11236f328aec9b6c8667e12fee73847d9954814991ddJesse Hallbool VkJsonInstanceFromJson(const std::string& json, 11246f328aec9b6c8667e12fee73847d9954814991ddJesse Hall VkJsonInstance* instance, 11256f328aec9b6c8667e12fee73847d9954814991ddJesse Hall std::string* errors) { 11266f328aec9b6c8667e12fee73847d9954814991ddJesse Hall return VkTypeFromJson(json, instance, errors); 11276f328aec9b6c8667e12fee73847d9954814991ddJesse Hall} 11286f328aec9b6c8667e12fee73847d9954814991ddJesse Hall 1129594091db7f508f6073975efddb5fab8d0fb273e7Jesse Hallstd::string VkJsonDeviceToJson(const VkJsonDevice& device) { 1130594091db7f508f6073975efddb5fab8d0fb273e7Jesse Hall return VkTypeToJson(device); 1131e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 1132e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1133594091db7f508f6073975efddb5fab8d0fb273e7Jesse Hallbool VkJsonDeviceFromJson(const std::string& json, 1134594091db7f508f6073975efddb5fab8d0fb273e7Jesse Hall VkJsonDevice* device, 1135594091db7f508f6073975efddb5fab8d0fb273e7Jesse Hall std::string* errors) { 1136594091db7f508f6073975efddb5fab8d0fb273e7Jesse Hall return VkTypeFromJson(json, device, errors); 1137e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour}; 1138e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1139e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourstd::string VkJsonImageFormatPropertiesToJson( 1140e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour const VkImageFormatProperties& properties) { 1141e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return VkTypeToJson(properties); 1142e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour} 1143e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 1144e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourbool VkJsonImageFormatPropertiesFromJson(const std::string& json, 1145e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour VkImageFormatProperties* properties, 1146e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour std::string* errors) { 1147e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour return VkTypeFromJson(json, properties, errors); 1148e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour}; 1149