unique_objects.h revision 1c0b73114010d6eb49ff34243fa9474493ef6eae
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 { 480b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis bool wsi_enabled; 492fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::unordered_map<uint64_t, uint64_t> unique_id_mapping; // Map uniqueID to actual object handle 502fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis VkPhysicalDevice gpu; 510b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 52e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski layer_data() : wsi_enabled(false), gpu(VK_NULL_HANDLE){}; 530b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis}; 540b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 550b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlisstruct instExts { 560b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis bool wsi_enabled; 57115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool xlib_enabled; 58115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool xcb_enabled; 59115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool wayland_enabled; 60115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool mir_enabled; 61115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool android_enabled; 62115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool win32_enabled; 630b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis}; 640b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 65491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::unordered_map<void *, struct instExts> instanceExtMap; 66491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::unordered_map<void *, layer_data *> layer_data_map; 67491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic device_table_map unique_objects_device_table_map; 68491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic instance_table_map unique_objects_instance_table_map; 692fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlisstatic std::mutex global_lock; // Protect map accesses and unique_id increments 700b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 710b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis// Handle CreateInstance 72491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic void createInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) { 730b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis uint32_t i; 74b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(unique_objects_instance_table_map, instance); 750b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis PFN_vkGetInstanceProcAddr gpa = pDisp->GetInstanceProcAddr; 7690ee20e0fd1b42245ed4242df98d7a55032ce6eeMichael Lentine 7790ee20e0fd1b42245ed4242df98d7a55032ce6eeMichael Lentine pDisp->DestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)gpa(instance, "vkDestroySurfaceKHR"); 78491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceSurfaceSupportKHR = 79491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceSupportKHR"); 80491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceSurfaceCapabilitiesKHR = 81491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"); 82491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceSurfaceFormatsKHR = 83491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR"); 84491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceSurfacePresentModesKHR = 85491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"); 86115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_WIN32_KHR 87491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)gpa(instance, "vkCreateWin32SurfaceKHR"); 88491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceWin32PresentationSupportKHR = 89491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR"); 900b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#endif // VK_USE_PLATFORM_WIN32_KHR 910b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#ifdef VK_USE_PLATFORM_XCB_KHR 92491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)gpa(instance, "vkCreateXcbSurfaceKHR"); 93491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceXcbPresentationSupportKHR = 94491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR"); 950b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#endif // VK_USE_PLATFORM_XCB_KHR 960b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#ifdef VK_USE_PLATFORM_XLIB_KHR 97491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)gpa(instance, "vkCreateXlibSurfaceKHR"); 98491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceXlibPresentationSupportKHR = 99491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR"); 1000b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#endif // VK_USE_PLATFORM_XLIB_KHR 1010b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#ifdef VK_USE_PLATFORM_MIR_KHR 102491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateMirSurfaceKHR = (PFN_vkCreateMirSurfaceKHR)gpa(instance, "vkCreateMirSurfaceKHR"); 103491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceMirPresentationSupportKHR = 104491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceMirPresentationSupportKHR"); 1050b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#endif // VK_USE_PLATFORM_MIR_KHR 1060b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#ifdef VK_USE_PLATFORM_WAYLAND_KHR 107491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)gpa(instance, "vkCreateWaylandSurfaceKHR"); 108491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetPhysicalDeviceWaylandPresentationSupportKHR = 109491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR"); 1100b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#endif // VK_USE_PLATFORM_WAYLAND_KHR 1110b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#ifdef VK_USE_PLATFORM_ANDROID_KHR 112491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)gpa(instance, "vkCreateAndroidSurfaceKHR"); 1130b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#endif // VK_USE_PLATFORM_ANDROID_KHR 1140b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 115115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp] = {}; 116a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn for (i = 0; i < pCreateInfo->enabledExtensionCount; i++) { 117b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) 1180b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis instanceExtMap[pDisp].wsi_enabled = true; 119115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_XLIB_KHR 120b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) 121115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].xlib_enabled = true; 122115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 123115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_XCB_KHR 124b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) 125115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].xcb_enabled = true; 126115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 127115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_WAYLAND_KHR 128b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) 129115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].wayland_enabled = true; 130115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 131115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_MIR_KHR 132b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) 133115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].mir_enabled = true; 134115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 135115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_ANDROID_KHR 136b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) 137115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].android_enabled = true; 138115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 139115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_WIN32_KHR 140b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) 141115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].win32_enabled = true; 142115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 1430b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 1440b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 1450b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 146491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, 147491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkInstance *pInstance) { 148b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); 1490b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 1502bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter assert(chain_info->u.pLayerInfo); 151b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; 152491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance"); 1532bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter if (fpCreateInstance == NULL) { 1542bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter return VK_ERROR_INITIALIZATION_FAILED; 1552bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter } 1562bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 1572bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter // Advance the link info for the next element on the chain 1582bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext; 1590b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 1602bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance); 1612bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter if (result != VK_SUCCESS) { 1622bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter return result; 1630b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 1642bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 165b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski initInstanceTable(*pInstance, fpGetInstanceProcAddr, unique_objects_instance_table_map); 1662bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 1672bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter createInstanceRegisterExtensions(pCreateInfo, *pInstance); 1682bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 1690b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 1700b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 1710b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 1722fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlisvoid explicit_DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) { 1736f7750c12e4ed3021e0c4c7ad45b188491227ff9Dustin Graves dispatch_key key = get_dispatch_key(instance); 1742fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis get_dispatch_table(unique_objects_instance_table_map, instance)->DestroyInstance(instance, pAllocator); 1756f7750c12e4ed3021e0c4c7ad45b188491227ff9Dustin Graves layer_data_map.erase(key); 1762fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis} 1772fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 1780b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis// Handle CreateDevice 179491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic void createDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) { 180b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 181b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski VkLayerDispatchTable *pDisp = get_dispatch_table(unique_objects_device_table_map, device); 1820b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis PFN_vkGetDeviceProcAddr gpa = pDisp->GetDeviceProcAddr; 183491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpa(device, "vkCreateSwapchainKHR"); 184491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)gpa(device, "vkDestroySwapchainKHR"); 185491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)gpa(device, "vkGetSwapchainImagesKHR"); 186491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)gpa(device, "vkAcquireNextImageKHR"); 187491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->QueuePresentKHR = (PFN_vkQueuePresentKHR)gpa(device, "vkQueuePresentKHR"); 1880b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis my_device_data->wsi_enabled = false; 189a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { 190b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) 1910b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis my_device_data->wsi_enabled = true; 1920b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 1930b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 1940b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 195491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, 196491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkDevice *pDevice) { 197b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); 1982bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 1992bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter assert(chain_info->u.pLayerInfo); 200b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; 201b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr; 202491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice"); 2032bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter if (fpCreateDevice == NULL) { 2042bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter return VK_ERROR_INITIALIZATION_FAILED; 2050b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2062bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 2072bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter // Advance the link info for the next element on the chain 2082bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext; 2092bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 2102bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter VkResult result = fpCreateDevice(gpu, pCreateInfo, pAllocator, pDevice); 2112bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter if (result != VK_SUCCESS) { 2122bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter return result; 2132bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter } 2142bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 2152bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter // Setup layer's device dispatch table 216b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski initDeviceTable(*pDevice, fpGetDeviceProcAddr, unique_objects_device_table_map); 2172bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 2182bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter createDeviceRegisterExtensions(pCreateInfo, *pDevice); 2192fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis // Set gpu for this device in order to get at any objects mapped at instance level 2202fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map); 2212fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis my_device_data->gpu = gpu; 2222bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 2230b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 2240b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 2250b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 2262fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlisvoid explicit_DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) { 2276f7750c12e4ed3021e0c4c7ad45b188491227ff9Dustin Graves dispatch_key key = get_dispatch_key(device); 2282fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis get_dispatch_table(unique_objects_device_table_map, device)->DestroyDevice(device, pAllocator); 2296f7750c12e4ed3021e0c4c7ad45b188491227ff9Dustin Graves layer_data_map.erase(key); 2300b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 2310b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 232491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, 233491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, 234491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkPipeline *pPipelines) { 235491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'stage': {'module': 'VkShaderModule'}, 236491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // 'layout': 'VkPipelineLayout', 'basePipelineHandle': 'VkPipeline'}} 237491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // LOCAL DECLS:{'pCreateInfos': 'VkComputePipelineCreateInfo*'} 2382fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 239491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn safe_VkComputePipelineCreateInfo *local_pCreateInfos = NULL; 2400b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (pCreateInfos) { 2412fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 2429aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis local_pCreateInfos = new safe_VkComputePipelineCreateInfo[createInfoCount]; 243491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) { 2449aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]); 2459aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].basePipelineHandle) { 246491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn local_pCreateInfos[idx0].basePipelineHandle = 24788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkPipeline)my_device_data 24888f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].basePipelineHandle)]; 2490b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2509aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].layout) { 2512fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfos[idx0].layout = 25288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkPipelineLayout) 25388f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].layout)]; 2540b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2559aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].stage.module) { 256491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn local_pCreateInfos[idx0].stage.module = 25788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkShaderModule) 25888f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].stage.module)]; 2590b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2600b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2610b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2629aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pipelineCache) { 2632fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 26488f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(pipelineCache)]; 2650b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2662fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 267491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkResult result = get_dispatch_table(unique_objects_device_table_map, device) 268491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn ->CreateComputePipelines(device, pipelineCache, createInfoCount, 269491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (const VkComputePipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines); 27000a897325251de38bacc017bcacf17bc5b018072Eric Engestrom delete[] local_pCreateInfos; 2710b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (VK_SUCCESS == result) { 2722fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis uint64_t unique_id = 0; 2732fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 274491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t i = 0; i < createInfoCount; ++i) { 275e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski unique_id = global_unique_id++; 27688f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]); 27788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id); 2780b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2790b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2800b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 2810b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 2820b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 283491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, 284491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, 285491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkPipeline *pPipelines) { 286491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'layout': 'VkPipelineLayout', 287491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // 'pStages[stageCount]': {'module': 'VkShaderModule'}, 'renderPass': 'VkRenderPass', 'basePipelineHandle': 'VkPipeline'}} 288491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // LOCAL DECLS:{'pCreateInfos': 'VkGraphicsPipelineCreateInfo*'} 2892fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 290491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn safe_VkGraphicsPipelineCreateInfo *local_pCreateInfos = NULL; 2910b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (pCreateInfos) { 2929aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis local_pCreateInfos = new safe_VkGraphicsPipelineCreateInfo[createInfoCount]; 2932fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 294491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) { 2959aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]); 2969aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].basePipelineHandle) { 297491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn local_pCreateInfos[idx0].basePipelineHandle = 29888f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkPipeline)my_device_data 29988f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].basePipelineHandle)]; 3000b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3019aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].layout) { 3022fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfos[idx0].layout = 30388f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkPipelineLayout) 30488f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].layout)]; 3050b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3069aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].pStages) { 307491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) { 3089aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].pStages[idx1].module) { 309491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn local_pCreateInfos[idx0].pStages[idx1].module = 3102fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis (VkShaderModule)my_device_data 31188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].pStages[idx1].module)]; 3120b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3130b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3140b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3159aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].renderPass) { 3162fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfos[idx0].renderPass = 31788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkRenderPass) 31888f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].renderPass)]; 3190b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3200b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3210b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3229aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pipelineCache) { 3232fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 32488f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(pipelineCache)]; 3259aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis } 3262fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 327491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkResult result = 328491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn get_dispatch_table(unique_objects_device_table_map, device) 329491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, 330491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (const VkGraphicsPipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines); 33100a897325251de38bacc017bcacf17bc5b018072Eric Engestrom delete[] local_pCreateInfos; 3320b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (VK_SUCCESS == result) { 3332fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis uint64_t unique_id = 0; 3342fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 335491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t i = 0; i < createInfoCount; ++i) { 336e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski unique_id = global_unique_id++; 33788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]); 33888f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id); 3390b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3400b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3410b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 3420b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 3430b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 3442fb0dba25a2ef615bc82cb43af333acacd99b82fTobin EhlisVkResult explicit_CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, 3452fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) { 3462fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 3472fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 3482fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis safe_VkSwapchainCreateInfoKHR *local_pCreateInfo = NULL; 3492fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis if (pCreateInfo) { 3502fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 3512fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfo = new safe_VkSwapchainCreateInfoKHR(pCreateInfo); 3522fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfo->oldSwapchain = 35388f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkSwapchainKHR)my_map_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfo->oldSwapchain)]; 3542fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis // Need to pull surface mapping from the instance-level map 3552fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *instance_data = get_my_data_ptr(get_dispatch_key(my_map_data->gpu), layer_data_map); 3562fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfo->surface = 35788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkSurfaceKHR)instance_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfo->surface)]; 3582fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis } 3592fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 3602fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis VkResult result = get_dispatch_table(unique_objects_device_table_map, device) 3612fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis ->CreateSwapchainKHR(device, (const VkSwapchainCreateInfoKHR *)local_pCreateInfo, pAllocator, pSwapchain); 3622fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis if (local_pCreateInfo) 3632fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis delete local_pCreateInfo; 3642fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis if (VK_SUCCESS == result) { 3652fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 366e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski uint64_t unique_id =global_unique_id++; 36788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(*pSwapchain); 36888f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves *pSwapchain = reinterpret_cast<VkSwapchainKHR &>(unique_id); 3692fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis } 3702fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis return result; 3712fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis} 3722fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 373491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount, 374491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkImage *pSwapchainImages) { 375491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // UNWRAP USES: 376491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // 0 : swapchain,VkSwapchainKHR, pSwapchainImages,VkImage 3772fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 3780b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (VK_NULL_HANDLE != swapchain) { 3792fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 38088f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves swapchain = (VkSwapchainKHR)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(swapchain)]; 3810b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 382491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkResult result = get_dispatch_table(unique_objects_device_table_map, device) 383491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages); 3840b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis // TODO : Need to add corresponding code to delete these images 3850b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (VK_SUCCESS == result) { 3860b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if ((*pSwapchainImageCount > 0) && pSwapchainImages) { 3872fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis uint64_t unique_id = 0; 3882fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 389491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) { 390e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski unique_id = global_unique_id++; 39188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pSwapchainImages[i]); 39288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pSwapchainImages[i] = reinterpret_cast<VkImage &>(unique_id); 3930b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3940b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3950b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3960b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 3970b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 3981c0b73114010d6eb49ff34243fa9474493ef6eaeChia-I Wu 3991c0b73114010d6eb49ff34243fa9474493ef6eaeChia-I Wu} // namespace unique_objects 400