unique_objects.h revision ed4aaf592ef33a9e2be01430c4ade78bd28f027b
1288e4f7d378f9185c714ead36a17dff64be24e49Mark Lobodzinski/* Copyright (c) 2015-2016 The Khronos Group Inc. 2288e4f7d378f9185c714ead36a17dff64be24e49Mark Lobodzinski * Copyright (c) 2015-2016 Valve Corporation 3288e4f7d378f9185c714ead36a17dff64be24e49Mark Lobodzinski * Copyright (c) 2015-2016 LunarG, Inc. 4288e4f7d378f9185c714ead36a17dff64be24e49Mark Lobodzinski * Copyright (C) 2015-2016 Google Inc. 50b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis * 643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Licensed under the Apache License, Version 2.0 (the "License"); 743b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * you may not use this file except in compliance with the License. 843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * You may obtain a copy of the License at 90b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis * 1043b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * http://www.apache.org/licenses/LICENSE-2.0 110b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis * 1243b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Unless required by applicable law or agreed to in writing, software 1343b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * distributed under the License is distributed on an "AS IS" BASIS, 1443b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1543b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * See the License for the specific language governing permissions and 1643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * limitations under the License. 170b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis * 180b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis * Author: Tobin Ehlis <tobine@google.com> 190b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis */ 200b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 216f25bb7c1c77be0bcfbca387329550a4d069f706Jamie Madill#include "vk_loader_platform.h" 226f25bb7c1c77be0bcfbca387329550a4d069f706Jamie Madill#include "vulkan/vulkan.h" 236f25bb7c1c77be0bcfbca387329550a4d069f706Jamie Madill 240b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include <stdio.h> 250b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include <stdlib.h> 260b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include <string.h> 2737fb5d229d5163e1c1f817810dafd5e3e4c33a1dKarl Schultz#include <cinttypes> 280b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 290b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include <unordered_map> 302fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis#include <vector> 312fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis#include <mutex> 320b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 330b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include "vulkan/vk_layer.h" 340b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include "vk_layer_config.h" 350b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include "vk_layer_table.h" 360b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include "vk_layer_data.h" 370b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include "vk_layer_logging.h" 380b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include "vk_layer_extension_utils.h" 399aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis#include "vk_safe_struct.h" 40f1ea418f193d10a8455cdf47e0eeeeb1f4d8b5bfJon Ashburn#include "vk_layer_utils.h" 410b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 421c0b73114010d6eb49ff34243fa9474493ef6eaeChia-I Wunamespace unique_objects { 431c0b73114010d6eb49ff34243fa9474493ef6eaeChia-I Wu 44e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski// All increments must be guarded by global_lock 45e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinskistatic uint64_t global_unique_id = 1; 46e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski 470b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlisstruct layer_data { 48edac63503f87b4429c524ce796f6642c0dce4adcChia-I Wu VkInstance instance; 49edac63503f87b4429c524ce796f6642c0dce4adcChia-I Wu 500b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis bool wsi_enabled; 512fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::unordered_map<uint64_t, uint64_t> unique_id_mapping; // Map uniqueID to actual object handle 522fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis VkPhysicalDevice gpu; 530b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 54e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski layer_data() : wsi_enabled(false), gpu(VK_NULL_HANDLE){}; 550b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis}; 560b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 5761d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinskistruct instance_extension_enables { 580b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis bool wsi_enabled; 59115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool xlib_enabled; 60115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool xcb_enabled; 61115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool wayland_enabled; 62115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool mir_enabled; 63115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool android_enabled; 64115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool win32_enabled; 6570ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn bool display_enabled; 660b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis}; 670b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 6861d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinskistatic std::unordered_map<void *, struct instance_extension_enables> instanceExtMap; 69491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::unordered_map<void *, layer_data *> layer_data_map; 70491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic device_table_map unique_objects_device_table_map; 71491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic instance_table_map unique_objects_instance_table_map; 722fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlisstatic std::mutex global_lock; // Protect map accesses and unique_id increments 730b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 740b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis// Handle CreateInstance 75491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic void createInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) { 760b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis uint32_t i; 77b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(unique_objects_instance_table_map, instance); 780b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis PFN_vkGetInstanceProcAddr gpa = pDisp->GetInstanceProcAddr; 7990ee20e0fd1b42245ed4242df98d7a55032ce6eeMichael Lentine 8070ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn //KHR_surface 8190ee20e0fd1b42245ed4242df98d7a55032ce6eeMichael Lentine pDisp->DestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)gpa(instance, "vkDestroySurfaceKHR"); 82491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceSurfaceSupportKHR = 83491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceSupportKHR"); 84491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceSurfaceCapabilitiesKHR = 85491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"); 86491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceSurfaceFormatsKHR = 87491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR"); 88491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceSurfacePresentModesKHR = 89491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"); 9070ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn 9170ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn // KHR_display 927c1b4a4d2562d2ab230f96d4f6144a31f0f8ab35Jon Ashburn#ifndef __ANDROID__ 9370ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn pDisp->GetPhysicalDeviceDisplayPropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)gpa(instance, "vkGetPhysicalDeviceDisplayPropertiesKHR"); 9470ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn pDisp->GetPhysicalDeviceDisplayPlanePropertiesKHR = (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)gpa(instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR"); 9570ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn pDisp->GetDisplayPlaneSupportedDisplaysKHR = (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)gpa(instance, "vkGetDisplayPlaneSupportedDisplaysKHR"); 9670ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn pDisp->GetDisplayModePropertiesKHR = (PFN_vkGetDisplayModePropertiesKHR)gpa(instance, "vkGetDisplayModePropertiesKHR"); 9770ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn pDisp->CreateDisplayModeKHR = (PFN_vkCreateDisplayModeKHR)gpa(instance, "vkCreateDisplayModeKHR"); 9870ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn pDisp->GetDisplayPlaneCapabilitiesKHR = (PFN_vkGetDisplayPlaneCapabilitiesKHR)gpa(instance, "vkGetDisplayPlaneCapabilitiesKHR"); 99a19fad484ac4b2a2b5c94192654591d689fd3261Petros Bantolas pDisp->CreateDisplayPlaneSurfaceKHR = (PFN_vkCreateDisplayPlaneSurfaceKHR)gpa(instance, "vkCreateDisplayPlaneSurfaceKHR"); 1007c1b4a4d2562d2ab230f96d4f6144a31f0f8ab35Jon Ashburn#endif 10170ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn 102115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_WIN32_KHR 103491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)gpa(instance, "vkCreateWin32SurfaceKHR"); 104491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceWin32PresentationSupportKHR = 105491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR"); 1060b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#endif // VK_USE_PLATFORM_WIN32_KHR 1070b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#ifdef VK_USE_PLATFORM_XCB_KHR 108491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)gpa(instance, "vkCreateXcbSurfaceKHR"); 109491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceXcbPresentationSupportKHR = 110491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR"); 1110b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#endif // VK_USE_PLATFORM_XCB_KHR 1120b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#ifdef VK_USE_PLATFORM_XLIB_KHR 113491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)gpa(instance, "vkCreateXlibSurfaceKHR"); 114491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceXlibPresentationSupportKHR = 115491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR"); 1160b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#endif // VK_USE_PLATFORM_XLIB_KHR 1170b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#ifdef VK_USE_PLATFORM_MIR_KHR 118491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateMirSurfaceKHR = (PFN_vkCreateMirSurfaceKHR)gpa(instance, "vkCreateMirSurfaceKHR"); 119491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceMirPresentationSupportKHR = 120491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceMirPresentationSupportKHR"); 1210b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#endif // VK_USE_PLATFORM_MIR_KHR 1220b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#ifdef VK_USE_PLATFORM_WAYLAND_KHR 123491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)gpa(instance, "vkCreateWaylandSurfaceKHR"); 124491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceWaylandPresentationSupportKHR = 125491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR"); 1260b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#endif // VK_USE_PLATFORM_WAYLAND_KHR 1270b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#ifdef VK_USE_PLATFORM_ANDROID_KHR 128491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)gpa(instance, "vkCreateAndroidSurfaceKHR"); 1290b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#endif // VK_USE_PLATFORM_ANDROID_KHR 1300b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 131115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp] = {}; 13261d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinski 133a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn for (i = 0; i < pCreateInfo->enabledExtensionCount; i++) { 134b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) 1350b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis instanceExtMap[pDisp].wsi_enabled = true; 13670ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) 13770ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn instanceExtMap[pDisp].display_enabled = true; 138115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_XLIB_KHR 139b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) 140115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].xlib_enabled = true; 141115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 142115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_XCB_KHR 143b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) 144115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].xcb_enabled = true; 145115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 146115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_WAYLAND_KHR 147b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) 148115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].wayland_enabled = true; 149115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 150115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_MIR_KHR 151b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) 152115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].mir_enabled = true; 153115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 154115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_ANDROID_KHR 155b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) 156115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].android_enabled = true; 157115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 158115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_WIN32_KHR 159b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) 160115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].win32_enabled = true; 161115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 1620b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 1630b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 1640b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 165491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, 166491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkInstance *pInstance) { 167b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); 1680b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 1692bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter assert(chain_info->u.pLayerInfo); 170b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; 171491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance"); 1722bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter if (fpCreateInstance == NULL) { 1732bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter return VK_ERROR_INITIALIZATION_FAILED; 1742bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter } 1752bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 1762bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter // Advance the link info for the next element on the chain 1772bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext; 1780b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 1792bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance); 1802bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter if (result != VK_SUCCESS) { 1812bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter return result; 1820b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 1832bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 184edac63503f87b4429c524ce796f6642c0dce4adcChia-I Wu layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map); 185edac63503f87b4429c524ce796f6642c0dce4adcChia-I Wu my_data->instance = *pInstance; 186b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski initInstanceTable(*pInstance, fpGetInstanceProcAddr, unique_objects_instance_table_map); 1872bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 1882bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter createInstanceRegisterExtensions(pCreateInfo, *pInstance); 1892bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 1900b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 1910b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 1920b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 1932fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlisvoid explicit_DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) { 1946f7750c12e4ed3021e0c4c7ad45b188491227ff9Dustin Graves dispatch_key key = get_dispatch_key(instance); 19570ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(unique_objects_instance_table_map, instance); 19670ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn instanceExtMap.erase(pDisp); 197ed4aaf592ef33a9e2be01430c4ade78bd28f027bCody Northrop pDisp->DestroyInstance(instance, pAllocator); 198ed4aaf592ef33a9e2be01430c4ade78bd28f027bCody Northrop layer_data_map.erase(key); 1992fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis} 2002fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 2010b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis// Handle CreateDevice 202491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic void createDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) { 203b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 204b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski VkLayerDispatchTable *pDisp = get_dispatch_table(unique_objects_device_table_map, device); 2050b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis PFN_vkGetDeviceProcAddr gpa = pDisp->GetDeviceProcAddr; 206491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpa(device, "vkCreateSwapchainKHR"); 207491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)gpa(device, "vkDestroySwapchainKHR"); 208491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)gpa(device, "vkGetSwapchainImagesKHR"); 209491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)gpa(device, "vkAcquireNextImageKHR"); 210491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->QueuePresentKHR = (PFN_vkQueuePresentKHR)gpa(device, "vkQueuePresentKHR"); 2110b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis my_device_data->wsi_enabled = false; 212a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { 213b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) 2140b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis my_device_data->wsi_enabled = true; 2150b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2160b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 2170b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 218491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, 219491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkDevice *pDevice) { 220edac63503f87b4429c524ce796f6642c0dce4adcChia-I Wu layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map); 221b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); 2222bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 2232bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter assert(chain_info->u.pLayerInfo); 224b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; 225b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr; 226edac63503f87b4429c524ce796f6642c0dce4adcChia-I Wu PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice"); 2272bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter if (fpCreateDevice == NULL) { 2282bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter return VK_ERROR_INITIALIZATION_FAILED; 2290b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2302bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 2312bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter // Advance the link info for the next element on the chain 2322bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext; 2332bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 2342bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter VkResult result = fpCreateDevice(gpu, pCreateInfo, pAllocator, pDevice); 2352bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter if (result != VK_SUCCESS) { 2362bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter return result; 2372bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter } 2382bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 2392bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter // Setup layer's device dispatch table 240b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski initDeviceTable(*pDevice, fpGetDeviceProcAddr, unique_objects_device_table_map); 2412bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 2422bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter createDeviceRegisterExtensions(pCreateInfo, *pDevice); 2432fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis // Set gpu for this device in order to get at any objects mapped at instance level 2442fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map); 2452fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis my_device_data->gpu = gpu; 2462bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 2470b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 2480b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 2490b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 2502fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlisvoid explicit_DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) { 2516f7750c12e4ed3021e0c4c7ad45b188491227ff9Dustin Graves dispatch_key key = get_dispatch_key(device); 2522fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis get_dispatch_table(unique_objects_device_table_map, device)->DestroyDevice(device, pAllocator); 2536f7750c12e4ed3021e0c4c7ad45b188491227ff9Dustin Graves layer_data_map.erase(key); 2540b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 2550b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 256491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, 257491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, 258491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkPipeline *pPipelines) { 259491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'stage': {'module': 'VkShaderModule'}, 260491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // 'layout': 'VkPipelineLayout', 'basePipelineHandle': 'VkPipeline'}} 261491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // LOCAL DECLS:{'pCreateInfos': 'VkComputePipelineCreateInfo*'} 2622fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 263491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn safe_VkComputePipelineCreateInfo *local_pCreateInfos = NULL; 2640b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (pCreateInfos) { 2652fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 2669aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis local_pCreateInfos = new safe_VkComputePipelineCreateInfo[createInfoCount]; 267491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) { 2689aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]); 2699aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].basePipelineHandle) { 270491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn local_pCreateInfos[idx0].basePipelineHandle = 27188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkPipeline)my_device_data 27288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].basePipelineHandle)]; 2730b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2749aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].layout) { 2752fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfos[idx0].layout = 27688f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkPipelineLayout) 27788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].layout)]; 2780b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2799aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].stage.module) { 280491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn local_pCreateInfos[idx0].stage.module = 28188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkShaderModule) 28288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].stage.module)]; 2830b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2840b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2850b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2869aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pipelineCache) { 2872fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 28888f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(pipelineCache)]; 2890b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2902fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 291491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkResult result = get_dispatch_table(unique_objects_device_table_map, device) 292491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn ->CreateComputePipelines(device, pipelineCache, createInfoCount, 293491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (const VkComputePipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines); 29400a897325251de38bacc017bcacf17bc5b018072Eric Engestrom delete[] local_pCreateInfos; 2950b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (VK_SUCCESS == result) { 2962fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis uint64_t unique_id = 0; 2972fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 298491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t i = 0; i < createInfoCount; ++i) { 299e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski unique_id = global_unique_id++; 30088f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]); 30188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id); 3020b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3030b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3040b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 3050b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 3060b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 307491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, 308491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, 309491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkPipeline *pPipelines) { 310491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'layout': 'VkPipelineLayout', 311491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // 'pStages[stageCount]': {'module': 'VkShaderModule'}, 'renderPass': 'VkRenderPass', 'basePipelineHandle': 'VkPipeline'}} 312491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // LOCAL DECLS:{'pCreateInfos': 'VkGraphicsPipelineCreateInfo*'} 3132fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 314491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn safe_VkGraphicsPipelineCreateInfo *local_pCreateInfos = NULL; 3150b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (pCreateInfos) { 3169aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis local_pCreateInfos = new safe_VkGraphicsPipelineCreateInfo[createInfoCount]; 3172fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 318491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) { 3199aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]); 3209aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].basePipelineHandle) { 321491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn local_pCreateInfos[idx0].basePipelineHandle = 32288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkPipeline)my_device_data 32388f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].basePipelineHandle)]; 3240b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3259aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].layout) { 3262fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfos[idx0].layout = 32788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkPipelineLayout) 32888f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].layout)]; 3290b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3309aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].pStages) { 331491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) { 3329aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].pStages[idx1].module) { 333491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn local_pCreateInfos[idx0].pStages[idx1].module = 3342fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis (VkShaderModule)my_device_data 33588f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].pStages[idx1].module)]; 3360b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3370b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3380b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3399aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].renderPass) { 3402fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfos[idx0].renderPass = 34188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkRenderPass) 34288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].renderPass)]; 3430b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3440b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3450b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3469aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pipelineCache) { 3472fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 34888f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(pipelineCache)]; 3499aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis } 3502fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 351491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkResult result = 352491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn get_dispatch_table(unique_objects_device_table_map, device) 353491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, 354491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (const VkGraphicsPipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines); 35500a897325251de38bacc017bcacf17bc5b018072Eric Engestrom delete[] local_pCreateInfos; 3560b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (VK_SUCCESS == result) { 3572fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis uint64_t unique_id = 0; 3582fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 359491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t i = 0; i < createInfoCount; ++i) { 360e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski unique_id = global_unique_id++; 36188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]); 36288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id); 3630b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3640b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3650b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 3660b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 3670b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 3682fb0dba25a2ef615bc82cb43af333acacd99b82fTobin EhlisVkResult explicit_CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, 3692fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) { 3702fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 3712fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 3722fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis safe_VkSwapchainCreateInfoKHR *local_pCreateInfo = NULL; 3732fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis if (pCreateInfo) { 3742fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 3752fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfo = new safe_VkSwapchainCreateInfoKHR(pCreateInfo); 3762fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfo->oldSwapchain = 37788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkSwapchainKHR)my_map_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfo->oldSwapchain)]; 3782fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis // Need to pull surface mapping from the instance-level map 3792fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *instance_data = get_my_data_ptr(get_dispatch_key(my_map_data->gpu), layer_data_map); 3802fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfo->surface = 38188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkSurfaceKHR)instance_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfo->surface)]; 3822fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis } 3832fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 3842fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis VkResult result = get_dispatch_table(unique_objects_device_table_map, device) 3852fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis ->CreateSwapchainKHR(device, (const VkSwapchainCreateInfoKHR *)local_pCreateInfo, pAllocator, pSwapchain); 3862fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis if (local_pCreateInfo) 3872fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis delete local_pCreateInfo; 3882fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis if (VK_SUCCESS == result) { 3892fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 390e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski uint64_t unique_id =global_unique_id++; 39188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(*pSwapchain); 39288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves *pSwapchain = reinterpret_cast<VkSwapchainKHR &>(unique_id); 3932fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis } 3942fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis return result; 3952fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis} 3962fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 397491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount, 398491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkImage *pSwapchainImages) { 399491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // UNWRAP USES: 400491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // 0 : swapchain,VkSwapchainKHR, pSwapchainImages,VkImage 4012fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 4020b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (VK_NULL_HANDLE != swapchain) { 4032fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 40488f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves swapchain = (VkSwapchainKHR)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(swapchain)]; 4050b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 406491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkResult result = get_dispatch_table(unique_objects_device_table_map, device) 407491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages); 4080b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis // TODO : Need to add corresponding code to delete these images 4090b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (VK_SUCCESS == result) { 4100b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if ((*pSwapchainImageCount > 0) && pSwapchainImages) { 4112fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis uint64_t unique_id = 0; 4122fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 413491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) { 414e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski unique_id = global_unique_id++; 41588f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pSwapchainImages[i]); 41688f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pSwapchainImages[i] = reinterpret_cast<VkImage &>(unique_id); 4170b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4180b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4190b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4200b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 4210b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 4221c0b73114010d6eb49ff34243fa9474493ef6eaeChia-I Wu 4237c1b4a4d2562d2ab230f96d4f6144a31f0f8ab35Jon Ashburn #ifndef __ANDROID__ 424ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon AshburnVkResult explicit_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPropertiesKHR* pProperties) 425ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn{ 426ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); 427ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn safe_VkDisplayPropertiesKHR* local_pProperties = NULL; 428ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn { 429ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn std::lock_guard<std::mutex> lock(global_lock); 430ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn if (pProperties) { 431ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn local_pProperties = new safe_VkDisplayPropertiesKHR[*pPropertyCount]; 432ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn for (uint32_t idx0=0; idx0<*pPropertyCount; ++idx0) { 433ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn local_pProperties[idx0].initialize(&pProperties[idx0]); 434ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn if (pProperties[idx0].display) { 435ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn local_pProperties[idx0].display = (VkDisplayKHR)my_map_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pProperties[idx0].display)]; 436ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn } 437ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn } 438ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn } 439ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn } 440ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn 441ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn VkResult result = get_dispatch_table(unique_objects_instance_table_map, physicalDevice)->GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, ( VkDisplayPropertiesKHR*)local_pProperties); 442ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn if (result == VK_SUCCESS && pProperties) 443ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn { 444ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn for (uint32_t idx0=0; idx0<*pPropertyCount; ++idx0) { 445ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn std::lock_guard<std::mutex> lock(global_lock); 446ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn 447ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn uint64_t unique_id = global_unique_id++; 448ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(local_pProperties[idx0].display); 449ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].display = reinterpret_cast<VkDisplayKHR&>(unique_id); 450ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].displayName = local_pProperties[idx0].displayName; 451ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].physicalDimensions = local_pProperties[idx0].physicalDimensions; 452ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].physicalResolution = local_pProperties[idx0].physicalResolution; 453ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].supportedTransforms = local_pProperties[idx0].supportedTransforms; 454ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].planeReorderPossible = local_pProperties[idx0].planeReorderPossible; 455ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].persistentContent = local_pProperties[idx0].persistentContent; 456ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn } 457ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn } 458ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn if (local_pProperties) 459ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn delete[] local_pProperties; 460ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn return result; 461ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn} 462ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn 46370ebf4a7c86c77a8ce9b09683e06e872c975977cJon AshburnVkResult explicit_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t* pDisplayCount, VkDisplayKHR* pDisplays) 46470ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn{ 46570ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); 46670ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn VkResult result = get_dispatch_table(unique_objects_instance_table_map, physicalDevice)->GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays); 46770ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn if (VK_SUCCESS == result) { 46870ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn if ((*pDisplayCount > 0) && pDisplays) { 46970ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn std::lock_guard<std::mutex> lock(global_lock); 47070ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn for (uint32_t i = 0; i < *pDisplayCount; i++) { 4717c1b4a4d2562d2ab230f96d4f6144a31f0f8ab35Jon Ashburn auto it = my_map_data->unique_id_mapping.find(reinterpret_cast<const uint64_t &> (pDisplays[i])); 472ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn assert (it != my_map_data->unique_id_mapping.end()); 4737c1b4a4d2562d2ab230f96d4f6144a31f0f8ab35Jon Ashburn pDisplays[i] = reinterpret_cast<VkDisplayKHR&> (it->second); 47470ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn } 47570ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn } 47670ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn } 47770ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn return result; 47870ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn} 479f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn 480f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn 481f111922542ba7fc1a2b0909e4258029150837c31Jon AshburnVkResult explicit_GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t* pPropertyCount, VkDisplayModePropertiesKHR* pProperties) 482f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn{ 483f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); 484f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn safe_VkDisplayModePropertiesKHR* local_pProperties = NULL; 485f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn { 486f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn std::lock_guard<std::mutex> lock(global_lock); 487f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn display = (VkDisplayKHR)my_map_data->unique_id_mapping[reinterpret_cast<uint64_t &>(display)]; 488f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn if (pProperties) { 489f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn local_pProperties = new safe_VkDisplayModePropertiesKHR[*pPropertyCount]; 490f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn for (uint32_t idx0=0; idx0<*pPropertyCount; ++idx0) { 491f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn local_pProperties[idx0].initialize(&pProperties[idx0]); 492f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn } 493f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn } 494f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn } 495f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn 496f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn VkResult result = get_dispatch_table(unique_objects_instance_table_map, physicalDevice)->GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, ( VkDisplayModePropertiesKHR*)local_pProperties); 497f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn if (result == VK_SUCCESS && pProperties) 498f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn { 499f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn for (uint32_t idx0=0; idx0<*pPropertyCount; ++idx0) { 500f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn std::lock_guard<std::mutex> lock(global_lock); 501f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn 502f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn uint64_t unique_id = global_unique_id++; 503f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(local_pProperties[idx0].displayMode); 504f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn pProperties[idx0].displayMode = reinterpret_cast<VkDisplayModeKHR&>(unique_id); 505f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn pProperties[idx0].parameters.visibleRegion.width = local_pProperties[idx0].parameters.visibleRegion.width; 506f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn pProperties[idx0].parameters.visibleRegion.height = local_pProperties[idx0].parameters.visibleRegion.height; 507f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn pProperties[idx0].parameters.refreshRate = local_pProperties[idx0].parameters.refreshRate; 508f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn } 509f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn } 510f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn if (local_pProperties) 511f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn delete[] local_pProperties; 512f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn return result; 513f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn} 5147c1b4a4d2562d2ab230f96d4f6144a31f0f8ab35Jon Ashburn#endif 5151c0b73114010d6eb49ff34243fa9474493ef6eaeChia-I Wu} // namespace unique_objects 516