unique_objects.h revision dae6e857077ff54f468613f56fdd6dbffcaec8b5
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 2415b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves#include <cinttypes> 2515b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves#include <memory> 260b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include <stdio.h> 270b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include <stdlib.h> 280b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include <string.h> 290b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 300b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include <unordered_map> 312fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis#include <vector> 322fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis#include <mutex> 330b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 340b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include "vulkan/vk_layer.h" 350b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include "vk_layer_config.h" 360b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include "vk_layer_table.h" 370b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include "vk_layer_data.h" 380b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include "vk_layer_logging.h" 390b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis#include "vk_layer_extension_utils.h" 409aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis#include "vk_safe_struct.h" 41f1ea418f193d10a8455cdf47e0eeeeb1f4d8b5bfJon Ashburn#include "vk_layer_utils.h" 420b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 431c0b73114010d6eb49ff34243fa9474493ef6eaeChia-I Wunamespace unique_objects { 441c0b73114010d6eb49ff34243fa9474493ef6eaeChia-I Wu 45dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski// The display-server-specific WSI extensions are handled explicitly 46dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinskistatic const char *kUniqueObjectsSupportedInstanceExtensions = 47dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski#ifdef VK_USE_PLATFORM_XLIB_KHR 48dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_KHR_XLIB_SURFACE_EXTENSION_NAME 49dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski#endif 50dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski#ifdef VK_USE_PLATFORM_XCB_KHR 51dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_KHR_XCB_SURFACE_EXTENSION_NAME 52dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski#endif 53dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski#ifdef VK_USE_PLATFORM_WAYLAND_KHR 54dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME 55dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski#endif 56dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski#ifdef VK_USE_PLATFORM_MIR_KHR 57dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_KHR_MIR_SURFACE_EXTENSION_NAME 58dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski#endif 59dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski#ifdef VK_USE_PLATFORM_ANDROID_KHR 60dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_KHR_ANDROID_SURFACE_EXTENSION_NAME 61dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski#endif 62dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski#ifdef VK_USE_PLATFORM_WIN32_KHR 63dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_KHR_WIN32_SURFACE_EXTENSION_NAME 64dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski#endif 65dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_EXT_DEBUG_MARKER_EXTENSION_NAME 66dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_EXT_DEBUG_REPORT_EXTENSION_NAME 67dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_KHR_DISPLAY_EXTENSION_NAME 68dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_KHR_SURFACE_EXTENSION_NAME; 69dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski 70dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinskistatic const char *kUniqueObjectsSupportedDeviceExtensions = 71dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_AMD_RASTERIZATION_ORDER_EXTENSION_NAME 72dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_AMD_SHADER_TRINARY_MINMAX_EXTENSION_NAME 73dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME 74dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_AMD_GCN_SHADER_EXTENSION_NAME 75dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_IMG_FILTER_CUBIC_EXTENSION_NAME 76dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_IMG_FORMAT_PVRTC_EXTENSION_NAME 77dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME 78dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_KHR_SWAPCHAIN_EXTENSION_NAME 79dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME 80dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME 81dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski VK_NV_GLSL_SHADER_EXTENSION_NAME; 82dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski 83e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski// All increments must be guarded by global_lock 84e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinskistatic uint64_t global_unique_id = 1; 85e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski 860b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlisstruct layer_data { 87edac63503f87b4429c524ce796f6642c0dce4adcChia-I Wu VkInstance instance; 88edac63503f87b4429c524ce796f6642c0dce4adcChia-I Wu 89625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski debug_report_data *report_data; 90625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski std::vector<VkDebugReportCallbackEXT> logging_callback; 91625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski 92625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski // The following are for keeping track of the temporary callbacks that can 93625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski // be used in vkCreateInstance and vkDestroyInstance: 94625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski uint32_t num_tmp_callbacks; 95625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos; 96625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski VkDebugReportCallbackEXT *tmp_callbacks; 97625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski 980b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis bool wsi_enabled; 992fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::unordered_map<uint64_t, uint64_t> unique_id_mapping; // Map uniqueID to actual object handle 1002fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis VkPhysicalDevice gpu; 1010b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 102e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski layer_data() : wsi_enabled(false), gpu(VK_NULL_HANDLE){}; 1030b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis}; 1040b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 10561d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinskistruct instance_extension_enables { 1060b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis bool wsi_enabled; 107115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool xlib_enabled; 108115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool xcb_enabled; 109115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool wayland_enabled; 110115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool mir_enabled; 111115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool android_enabled; 112115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis bool win32_enabled; 11370ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn bool display_enabled; 1140b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis}; 1150b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 11661d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinskistatic std::unordered_map<void *, struct instance_extension_enables> instanceExtMap; 117491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic std::unordered_map<void *, layer_data *> layer_data_map; 118491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic device_table_map unique_objects_device_table_map; 119491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic instance_table_map unique_objects_instance_table_map; 1202fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlisstatic std::mutex global_lock; // Protect map accesses and unique_id increments 1210b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 12215b4845aaf667fa51be8fa910970901da84cc5a9Dustin Gravesstruct GenericHeader { 12315b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves VkStructureType sType; 12415b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves void *pNext; 12515b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves}; 12615b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 12715b4845aaf667fa51be8fa910970901da84cc5a9Dustin Gravestemplate <typename T> bool ContainsExtStruct(const T *target, VkStructureType ext_type) { 12815b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves assert(target != nullptr); 12915b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 13015b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves const GenericHeader *ext_struct = reinterpret_cast<const GenericHeader *>(target->pNext); 13115b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 13215b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves while (ext_struct != nullptr) { 13315b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves if (ext_struct->sType == ext_type) { 13415b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves return true; 13515b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves } 13615b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 13715b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves ext_struct = reinterpret_cast<const GenericHeader *>(ext_struct->pNext); 13815b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves } 13915b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 14015b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves return false; 14115b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves} 14215b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 143625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinskistatic void init_unique_objects(layer_data *my_data, const VkAllocationCallbacks *pAllocator) { 144625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "google_unique_objects"); 145625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski} 146625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski 1470b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis// Handle CreateInstance 148373469f006399d6b5204ee05db3b56beb168b36fMark Youngstatic void checkInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) { 1490b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis uint32_t i; 150b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(unique_objects_instance_table_map, instance); 1510b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 152115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp] = {}; 15361d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinski 154a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn for (i = 0; i < pCreateInfo->enabledExtensionCount; i++) { 155dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski 156dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) { 1570b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis instanceExtMap[pDisp].wsi_enabled = true; 158dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski } 159dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) { 16070ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn instanceExtMap[pDisp].display_enabled = true; 161dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski } 162115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_XLIB_KHR 163dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) { 164115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].xlib_enabled = true; 165dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski } 166115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 167115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_XCB_KHR 168dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) { 169115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].xcb_enabled = true; 170dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski } 171115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 172115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_WAYLAND_KHR 173dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) { 174115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].wayland_enabled = true; 175dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski } 176115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 177115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_MIR_KHR 178dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) { 179115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].mir_enabled = true; 180dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski } 181115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 182115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_ANDROID_KHR 183dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) { 184115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].android_enabled = true; 185dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski } 186115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 187115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#ifdef VK_USE_PLATFORM_WIN32_KHR 188dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) { 189115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis instanceExtMap[pDisp].win32_enabled = true; 190dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski } 191115790b84c1afea132a994b5e47ffec7601d6759Tobin Ehlis#endif 192dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski 193dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski // Check for recognized instance extensions 194dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); 195dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski if (!white_list(pCreateInfo->ppEnabledExtensionNames[i], kUniqueObjectsSupportedInstanceExtensions)) { 196dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 197dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski 0, "UniqueObjects", 198dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski "Instance Extension %s is not supported by this layer. Using this extension may adversely affect " 199dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski "validation results and/or produce undefined behavior.", 200dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski pCreateInfo->ppEnabledExtensionNames[i]); 201dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski } 2020b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2030b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 2040b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 205491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, 206491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkInstance *pInstance) { 207b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); 2080b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 2092bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter assert(chain_info->u.pLayerInfo); 210b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; 211491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance"); 2122bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter if (fpCreateInstance == NULL) { 2132bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter return VK_ERROR_INITIALIZATION_FAILED; 2142bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter } 2152bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 2162bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter // Advance the link info for the next element on the chain 2172bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext; 2180b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 2192bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance); 2202bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter if (result != VK_SUCCESS) { 2212bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter return result; 2220b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 2232bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 224edac63503f87b4429c524ce796f6642c0dce4adcChia-I Wu layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map); 225edac63503f87b4429c524ce796f6642c0dce4adcChia-I Wu my_data->instance = *pInstance; 226625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, unique_objects_instance_table_map); 2272bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 228625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski my_data->instance = *pInstance; 229625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski my_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount, 230625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski pCreateInfo->ppEnabledExtensionNames); 231625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski 232625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski // Set up temporary debug callbacks to output messages at CreateInstance-time 233625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_data->num_tmp_callbacks, &my_data->tmp_dbg_create_infos, 234625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski &my_data->tmp_callbacks)) { 235625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski if (my_data->num_tmp_callbacks > 0) { 236625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski if (layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos, 237625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski my_data->tmp_callbacks)) { 238625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks); 239625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski my_data->num_tmp_callbacks = 0; 240625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski } 241625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski } 242625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski } 243625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski 244625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski init_unique_objects(my_data, pAllocator); 245373469f006399d6b5204ee05db3b56beb168b36fMark Young checkInstanceRegisterExtensions(pCreateInfo, *pInstance); 2462bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 247625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski // Disable and free tmp callbacks, no longer necessary 248625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski if (my_data->num_tmp_callbacks > 0) { 249625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks); 250625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks); 251625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski my_data->num_tmp_callbacks = 0; 252625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski } 253625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski 2540b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 2550b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 2560b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 2572fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlisvoid explicit_DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) { 2586f7750c12e4ed3021e0c4c7ad45b188491227ff9Dustin Graves dispatch_key key = get_dispatch_key(instance); 259625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski layer_data *my_data = get_my_data_ptr(key, layer_data_map); 26070ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(unique_objects_instance_table_map, instance); 26170ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn instanceExtMap.erase(pDisp); 262ed4aaf592ef33a9e2be01430c4ade78bd28f027bCody Northrop pDisp->DestroyInstance(instance, pAllocator); 263625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski 264625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski // Clean up logging callback, if any 265625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski while (my_data->logging_callback.size() > 0) { 266625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski VkDebugReportCallbackEXT callback = my_data->logging_callback.back(); 267625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski layer_destroy_msg_callback(my_data->report_data, callback, pAllocator); 268625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski my_data->logging_callback.pop_back(); 269625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski } 270625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski 271625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski layer_debug_report_destroy_instance(my_data->report_data); 272ed4aaf592ef33a9e2be01430c4ade78bd28f027bCody Northrop layer_data_map.erase(key); 2732fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis} 2742fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 2750b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis// Handle CreateDevice 276491a3cd11793892b996a8b5771479cc539198f99Jon Ashburnstatic void createDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) { 277b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 278b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski VkLayerDispatchTable *pDisp = get_dispatch_table(unique_objects_device_table_map, device); 2790b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis PFN_vkGetDeviceProcAddr gpa = pDisp->GetDeviceProcAddr; 280491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpa(device, "vkCreateSwapchainKHR"); 281491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)gpa(device, "vkDestroySwapchainKHR"); 282491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)gpa(device, "vkGetSwapchainImagesKHR"); 283491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)gpa(device, "vkAcquireNextImageKHR"); 284491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn pDisp->QueuePresentKHR = (PFN_vkQueuePresentKHR)gpa(device, "vkQueuePresentKHR"); 2850b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis my_device_data->wsi_enabled = false; 286dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski 287a4ae48bfd6f2e2a80e1f92e054a007cf90a4e218Jon Ashburn for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { 288dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) { 2890b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis my_device_data->wsi_enabled = true; 290dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski } 291dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski // Check for recognized device extensions 292dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski if (!white_list(pCreateInfo->ppEnabledExtensionNames[i], kUniqueObjectsSupportedDeviceExtensions)) { 293dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski log_msg(my_device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, 294dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski __LINE__, 0, "UniqueObjects", 295dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski "Device Extension %s is not supported by this layer. Using this extension may adversely affect " 296dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski "validation results and/or produce undefined behavior.", 297dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski pCreateInfo->ppEnabledExtensionNames[i]); 298dae6e857077ff54f468613f56fdd6dbffcaec8b5Mark Lobodzinski } 2990b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3000b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 3010b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 302491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, 303491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkDevice *pDevice) { 304edac63503f87b4429c524ce796f6642c0dce4adcChia-I Wu layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map); 305b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); 3062bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 3072bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter assert(chain_info->u.pLayerInfo); 308b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; 309b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr; 310edac63503f87b4429c524ce796f6642c0dce4adcChia-I Wu PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice"); 3112bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter if (fpCreateDevice == NULL) { 3122bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter return VK_ERROR_INITIALIZATION_FAILED; 3130b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 3142bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 3152bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter // Advance the link info for the next element on the chain 3162bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext; 3172bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 3182bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter VkResult result = fpCreateDevice(gpu, pCreateInfo, pAllocator, pDevice); 3192bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter if (result != VK_SUCCESS) { 3202bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter return result; 3212bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter } 3222bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 323625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map); 324625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice); 325625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski 3262bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter // Setup layer's device dispatch table 327b838dc009d9e603ef13bdac2d1f960da78bebd2dMark Lobodzinski initDeviceTable(*pDevice, fpGetDeviceProcAddr, unique_objects_device_table_map); 3282bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 3292bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter createDeviceRegisterExtensions(pCreateInfo, *pDevice); 3302fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis // Set gpu for this device in order to get at any objects mapped at instance level 331625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski 3322fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis my_device_data->gpu = gpu; 3332bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter 3340b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 3350b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 3360b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 3372fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlisvoid explicit_DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) { 3386f7750c12e4ed3021e0c4c7ad45b188491227ff9Dustin Graves dispatch_key key = get_dispatch_key(device); 339625cac1aeb4cfffb9b6a3c06bdf857d077bed173Mark Lobodzinski layer_debug_report_destroy_device(device); 3402fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis get_dispatch_table(unique_objects_device_table_map, device)->DestroyDevice(device, pAllocator); 3416f7750c12e4ed3021e0c4c7ad45b188491227ff9Dustin Graves layer_data_map.erase(key); 3420b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 3430b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 34415b4845aaf667fa51be8fa910970901da84cc5a9Dustin GravesVkResult explicit_AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo, 34515b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) { 34615b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves const VkMemoryAllocateInfo *input_allocate_info = pAllocateInfo; 34715b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves std::unique_ptr<safe_VkMemoryAllocateInfo> safe_allocate_info; 34815b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves std::unique_ptr<safe_VkDedicatedAllocationMemoryAllocateInfoNV> safe_dedicated_allocate_info; 34915b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 35015b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 35115b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves if ((pAllocateInfo != nullptr) && 35215b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves ContainsExtStruct(pAllocateInfo, VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV)) { 35315b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves // Assuming there is only one extension struct of this type in the list for now 35415b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves safe_dedicated_allocate_info = 35515b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves std::unique_ptr<safe_VkDedicatedAllocationMemoryAllocateInfoNV>(new safe_VkDedicatedAllocationMemoryAllocateInfoNV); 35615b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves safe_allocate_info = std::unique_ptr<safe_VkMemoryAllocateInfo>(new safe_VkMemoryAllocateInfo); 35715b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 35815b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves safe_allocate_info->initialize(pAllocateInfo); 35915b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves input_allocate_info = reinterpret_cast<const VkMemoryAllocateInfo *>(safe_allocate_info.get()); 36015b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 36115b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves const GenericHeader *orig_pnext = reinterpret_cast<const GenericHeader *>(pAllocateInfo->pNext); 36215b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves GenericHeader *input_pnext = reinterpret_cast<GenericHeader *>(safe_allocate_info.get()); 36315b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves while (orig_pnext != nullptr) { 36415b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves if (orig_pnext->sType == VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV) { 36515b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves safe_dedicated_allocate_info->initialize( 36615b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV *>(orig_pnext)); 36715b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 36815b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves std::unique_lock<std::mutex> lock(global_lock); 36915b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 37015b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves if (safe_dedicated_allocate_info->buffer != VK_NULL_HANDLE) { 37115b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves uint64_t local_buffer = reinterpret_cast<uint64_t &>(safe_dedicated_allocate_info->buffer); 37215b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves safe_dedicated_allocate_info->buffer = 37315b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves reinterpret_cast<VkBuffer &>(my_map_data->unique_id_mapping[local_buffer]); 37415b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves } 37515b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 37615b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves if (safe_dedicated_allocate_info->image != VK_NULL_HANDLE) { 37715b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves uint64_t local_image = reinterpret_cast<uint64_t &>(safe_dedicated_allocate_info->image); 37815b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves safe_dedicated_allocate_info->image = reinterpret_cast<VkImage &>(my_map_data->unique_id_mapping[local_image]); 37915b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves } 38015b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 38115b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves lock.unlock(); 38215b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 38315b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves input_pnext->pNext = reinterpret_cast<GenericHeader *>(safe_dedicated_allocate_info.get()); 38415b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves input_pnext = reinterpret_cast<GenericHeader *>(input_pnext->pNext); 38515b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves } else { 38615b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves // TODO: generic handling of pNext copies 38715b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves } 38815b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 38915b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves orig_pnext = reinterpret_cast<const GenericHeader *>(orig_pnext->pNext); 39015b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves } 39115b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves } 39215b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 39315b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves VkResult result = get_dispatch_table(unique_objects_device_table_map, device) 39415b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves ->AllocateMemory(device, input_allocate_info, pAllocator, pMemory); 39515b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 39615b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves if (VK_SUCCESS == result) { 39715b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves std::lock_guard<std::mutex> lock(global_lock); 39815b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves uint64_t unique_id = global_unique_id++; 39915b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(*pMemory); 40015b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves *pMemory = reinterpret_cast<VkDeviceMemory &>(unique_id); 40115b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves } 40215b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 40315b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves return result; 40415b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves} 40515b4845aaf667fa51be8fa910970901da84cc5a9Dustin Graves 406491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, 407491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, 408491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkPipeline *pPipelines) { 409491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'stage': {'module': 'VkShaderModule'}, 410491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // 'layout': 'VkPipelineLayout', 'basePipelineHandle': 'VkPipeline'}} 411491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // LOCAL DECLS:{'pCreateInfos': 'VkComputePipelineCreateInfo*'} 4122fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 413491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn safe_VkComputePipelineCreateInfo *local_pCreateInfos = NULL; 4140b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (pCreateInfos) { 4152fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 4169aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis local_pCreateInfos = new safe_VkComputePipelineCreateInfo[createInfoCount]; 417491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) { 4189aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]); 4199aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].basePipelineHandle) { 420491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn local_pCreateInfos[idx0].basePipelineHandle = 42188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkPipeline)my_device_data 42288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].basePipelineHandle)]; 4230b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4249aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].layout) { 4252fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfos[idx0].layout = 42688f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkPipelineLayout) 42788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].layout)]; 4280b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4299aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].stage.module) { 430491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn local_pCreateInfos[idx0].stage.module = 43188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkShaderModule) 43288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].stage.module)]; 4330b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4340b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4350b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4369aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pipelineCache) { 4372fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 43888f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(pipelineCache)]; 4390b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4402fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 441491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkResult result = get_dispatch_table(unique_objects_device_table_map, device) 442491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn ->CreateComputePipelines(device, pipelineCache, createInfoCount, 443491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (const VkComputePipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines); 44400a897325251de38bacc017bcacf17bc5b018072Eric Engestrom delete[] local_pCreateInfos; 4450b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (VK_SUCCESS == result) { 4462fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis uint64_t unique_id = 0; 4472fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 448491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t i = 0; i < createInfoCount; ++i) { 449e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski unique_id = global_unique_id++; 45088f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]); 45188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id); 4520b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4530b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4540b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 4550b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 4560b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 457491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, 458491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, 459491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkPipeline *pPipelines) { 460491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'layout': 'VkPipelineLayout', 461491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // 'pStages[stageCount]': {'module': 'VkShaderModule'}, 'renderPass': 'VkRenderPass', 'basePipelineHandle': 'VkPipeline'}} 462491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // LOCAL DECLS:{'pCreateInfos': 'VkGraphicsPipelineCreateInfo*'} 4632fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 464491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn safe_VkGraphicsPipelineCreateInfo *local_pCreateInfos = NULL; 4650b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (pCreateInfos) { 4669aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis local_pCreateInfos = new safe_VkGraphicsPipelineCreateInfo[createInfoCount]; 4672fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 468491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) { 4699aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]); 4709aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].basePipelineHandle) { 471491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn local_pCreateInfos[idx0].basePipelineHandle = 47288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkPipeline)my_device_data 47388f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].basePipelineHandle)]; 4740b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4759aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].layout) { 4762fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfos[idx0].layout = 47788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkPipelineLayout) 47888f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].layout)]; 4790b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4809aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].pStages) { 481491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) { 4829aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].pStages[idx1].module) { 483491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn local_pCreateInfos[idx0].pStages[idx1].module = 4842fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis (VkShaderModule)my_device_data 48588f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].pStages[idx1].module)]; 4860b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4870b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4880b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4899aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pCreateInfos[idx0].renderPass) { 4902fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfos[idx0].renderPass = 49188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkRenderPass) 49288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].renderPass)]; 4930b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4940b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4950b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 4969aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis if (pipelineCache) { 4972fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 49888f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(pipelineCache)]; 4999aac555fc92f69fd059781139e17647eb7277992Tobin Ehlis } 5002fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 501491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkResult result = 502491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn get_dispatch_table(unique_objects_device_table_map, device) 503491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, 504491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn (const VkGraphicsPipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines); 50500a897325251de38bacc017bcacf17bc5b018072Eric Engestrom delete[] local_pCreateInfos; 5060b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (VK_SUCCESS == result) { 5072fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis uint64_t unique_id = 0; 5082fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 509491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t i = 0; i < createInfoCount; ++i) { 510e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski unique_id = global_unique_id++; 51188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]); 51288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id); 5130b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 5140b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 5150b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 5160b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 5170b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis 5182fb0dba25a2ef615bc82cb43af333acacd99b82fTobin EhlisVkResult explicit_CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, 5192fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) { 5202fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 5212fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 5222fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis safe_VkSwapchainCreateInfoKHR *local_pCreateInfo = NULL; 5232fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis if (pCreateInfo) { 5242fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 5252fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfo = new safe_VkSwapchainCreateInfoKHR(pCreateInfo); 5262fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfo->oldSwapchain = 52788f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkSwapchainKHR)my_map_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfo->oldSwapchain)]; 5282fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis // Need to pull surface mapping from the instance-level map 5292fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *instance_data = get_my_data_ptr(get_dispatch_key(my_map_data->gpu), layer_data_map); 5302fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis local_pCreateInfo->surface = 53188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves (VkSurfaceKHR)instance_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfo->surface)]; 5322fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis } 5332fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 5342fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis VkResult result = get_dispatch_table(unique_objects_device_table_map, device) 5352fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis ->CreateSwapchainKHR(device, (const VkSwapchainCreateInfoKHR *)local_pCreateInfo, pAllocator, pSwapchain); 5362fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis if (local_pCreateInfo) 5372fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis delete local_pCreateInfo; 5382fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis if (VK_SUCCESS == result) { 5392fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 540e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski uint64_t unique_id =global_unique_id++; 54188f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(*pSwapchain); 54288f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves *pSwapchain = reinterpret_cast<VkSwapchainKHR &>(unique_id); 5432fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis } 5442fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis return result; 5452fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis} 5462fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis 547491a3cd11793892b996a8b5771479cc539198f99Jon AshburnVkResult explicit_GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount, 548491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkImage *pSwapchainImages) { 549491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // UNWRAP USES: 550491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn // 0 : swapchain,VkSwapchainKHR, pSwapchainImages,VkImage 5512fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); 5520b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (VK_NULL_HANDLE != swapchain) { 5532fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 55488f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves swapchain = (VkSwapchainKHR)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(swapchain)]; 5550b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 556491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn VkResult result = get_dispatch_table(unique_objects_device_table_map, device) 557491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages); 5580b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis // TODO : Need to add corresponding code to delete these images 5590b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if (VK_SUCCESS == result) { 5600b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis if ((*pSwapchainImageCount > 0) && pSwapchainImages) { 5612fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis uint64_t unique_id = 0; 5622fb0dba25a2ef615bc82cb43af333acacd99b82fTobin Ehlis std::lock_guard<std::mutex> lock(global_lock); 563491a3cd11793892b996a8b5771479cc539198f99Jon Ashburn for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) { 564e8c386537125cba5ebc02b394bae69fd47c2b5d1Mark Lobodzinski unique_id = global_unique_id++; 56588f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pSwapchainImages[i]); 56688f2e92a842cb325b7f17b56ca5aaf2c6f1f1617Dustin Graves pSwapchainImages[i] = reinterpret_cast<VkImage &>(unique_id); 5670b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 5680b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 5690b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis } 5700b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis return result; 5710b99d0383bb88c3b128c7d7922151d6a833da51dTobin Ehlis} 5721c0b73114010d6eb49ff34243fa9474493ef6eaeChia-I Wu 5737c1b4a4d2562d2ab230f96d4f6144a31f0f8ab35Jon Ashburn #ifndef __ANDROID__ 574ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon AshburnVkResult explicit_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPropertiesKHR* pProperties) 575ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn{ 576ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); 577ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn safe_VkDisplayPropertiesKHR* local_pProperties = NULL; 578ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn { 579ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn std::lock_guard<std::mutex> lock(global_lock); 580ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn if (pProperties) { 581ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn local_pProperties = new safe_VkDisplayPropertiesKHR[*pPropertyCount]; 582ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn for (uint32_t idx0=0; idx0<*pPropertyCount; ++idx0) { 583ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn local_pProperties[idx0].initialize(&pProperties[idx0]); 584ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn if (pProperties[idx0].display) { 585ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn local_pProperties[idx0].display = (VkDisplayKHR)my_map_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pProperties[idx0].display)]; 586ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn } 587ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn } 588ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn } 589ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn } 590ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn 591ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn VkResult result = get_dispatch_table(unique_objects_instance_table_map, physicalDevice)->GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, ( VkDisplayPropertiesKHR*)local_pProperties); 592ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn if (result == VK_SUCCESS && pProperties) 593ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn { 594ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn for (uint32_t idx0=0; idx0<*pPropertyCount; ++idx0) { 595ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn std::lock_guard<std::mutex> lock(global_lock); 596ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn 597ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn uint64_t unique_id = global_unique_id++; 598ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(local_pProperties[idx0].display); 599ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].display = reinterpret_cast<VkDisplayKHR&>(unique_id); 600ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].displayName = local_pProperties[idx0].displayName; 601ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].physicalDimensions = local_pProperties[idx0].physicalDimensions; 602ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].physicalResolution = local_pProperties[idx0].physicalResolution; 603ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].supportedTransforms = local_pProperties[idx0].supportedTransforms; 604ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].planeReorderPossible = local_pProperties[idx0].planeReorderPossible; 605ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn pProperties[idx0].persistentContent = local_pProperties[idx0].persistentContent; 606ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn } 607ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn } 608ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn if (local_pProperties) 609ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn delete[] local_pProperties; 610ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn return result; 611ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn} 612ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn 61370ebf4a7c86c77a8ce9b09683e06e872c975977cJon AshburnVkResult explicit_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t* pDisplayCount, VkDisplayKHR* pDisplays) 61470ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn{ 61570ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); 61670ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn VkResult result = get_dispatch_table(unique_objects_instance_table_map, physicalDevice)->GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays); 61770ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn if (VK_SUCCESS == result) { 61870ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn if ((*pDisplayCount > 0) && pDisplays) { 61970ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn std::lock_guard<std::mutex> lock(global_lock); 62070ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn for (uint32_t i = 0; i < *pDisplayCount; i++) { 6217c1b4a4d2562d2ab230f96d4f6144a31f0f8ab35Jon Ashburn auto it = my_map_data->unique_id_mapping.find(reinterpret_cast<const uint64_t &> (pDisplays[i])); 622ed5b8c0dea6146258f390ac65dcb9c7808ecd18eJon Ashburn assert (it != my_map_data->unique_id_mapping.end()); 6237c1b4a4d2562d2ab230f96d4f6144a31f0f8ab35Jon Ashburn pDisplays[i] = reinterpret_cast<VkDisplayKHR&> (it->second); 62470ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn } 62570ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn } 62670ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn } 62770ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn return result; 62870ebf4a7c86c77a8ce9b09683e06e872c975977cJon Ashburn} 629f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn 630f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn 631f111922542ba7fc1a2b0909e4258029150837c31Jon AshburnVkResult explicit_GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t* pPropertyCount, VkDisplayModePropertiesKHR* pProperties) 632f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn{ 633f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); 634f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn safe_VkDisplayModePropertiesKHR* local_pProperties = NULL; 635f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn { 636f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn std::lock_guard<std::mutex> lock(global_lock); 637f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn display = (VkDisplayKHR)my_map_data->unique_id_mapping[reinterpret_cast<uint64_t &>(display)]; 638f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn if (pProperties) { 639f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn local_pProperties = new safe_VkDisplayModePropertiesKHR[*pPropertyCount]; 640f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn for (uint32_t idx0=0; idx0<*pPropertyCount; ++idx0) { 641f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn local_pProperties[idx0].initialize(&pProperties[idx0]); 642f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn } 643f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn } 644f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn } 645f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn 646f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn VkResult result = get_dispatch_table(unique_objects_instance_table_map, physicalDevice)->GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, ( VkDisplayModePropertiesKHR*)local_pProperties); 647f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn if (result == VK_SUCCESS && pProperties) 648f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn { 649f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn for (uint32_t idx0=0; idx0<*pPropertyCount; ++idx0) { 650f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn std::lock_guard<std::mutex> lock(global_lock); 651f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn 652f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn uint64_t unique_id = global_unique_id++; 653f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(local_pProperties[idx0].displayMode); 654f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn pProperties[idx0].displayMode = reinterpret_cast<VkDisplayModeKHR&>(unique_id); 655f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn pProperties[idx0].parameters.visibleRegion.width = local_pProperties[idx0].parameters.visibleRegion.width; 656f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn pProperties[idx0].parameters.visibleRegion.height = local_pProperties[idx0].parameters.visibleRegion.height; 657f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn pProperties[idx0].parameters.refreshRate = local_pProperties[idx0].parameters.refreshRate; 658f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn } 659f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn } 660f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn if (local_pProperties) 661f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn delete[] local_pProperties; 662f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn return result; 663f111922542ba7fc1a2b0909e4258029150837c31Jon Ashburn} 6647c1b4a4d2562d2ab230f96d4f6144a31f0f8ab35Jon Ashburn#endif 6651c0b73114010d6eb49ff34243fa9474493ef6eaeChia-I Wu} // namespace unique_objects 666