blob: 9abf240cdc901c0d44b0ad30098f9647cf65870c [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
4 * Copyright (C) 2015-2016 Google Inc.
Tobin Ehlisd34a4c52015-12-08 10:50:10 -07005 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Tobin Ehlisd34a4c52015-12-08 10:50:10 -07009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070017 *
18 * Author: Tobin Ehlis <tobine@google.com>
19 */
20
Jamie Madilldf5d5732016-04-04 11:54:43 -040021#include "vk_loader_platform.h"
22#include "vulkan/vulkan.h"
23
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070024#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
Karl Schultzd7f37542016-05-10 11:36:08 -060027#include <cinttypes>
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070028
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070029#include <unordered_map>
Tobin Ehlis10ba1de2016-04-13 12:59:43 -060030#include <vector>
31#include <mutex>
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070032
33#include "vulkan/vk_layer.h"
34#include "vk_layer_config.h"
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070035#include "vk_layer_table.h"
36#include "vk_layer_data.h"
37#include "vk_layer_logging.h"
38#include "vk_layer_extension_utils.h"
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -070039#include "vk_safe_struct.h"
Jon Ashburndc9111c2016-03-22 12:57:13 -060040#include "vk_layer_utils.h"
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070041
Chia-I Wucdb70962016-05-13 14:07:36 +080042namespace unique_objects {
43
Mark Lobodzinskifdf8f472016-04-28 16:36:58 -060044// All increments must be guarded by global_lock
45static uint64_t global_unique_id = 1;
46
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070047struct layer_data {
Chia-I Wu16570472016-05-17 07:57:15 +080048 VkInstance instance;
49
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070050 bool wsi_enabled;
Tobin Ehlis10ba1de2016-04-13 12:59:43 -060051 std::unordered_map<uint64_t, uint64_t> unique_id_mapping; // Map uniqueID to actual object handle
52 VkPhysicalDevice gpu;
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070053
Mark Lobodzinskifdf8f472016-04-28 16:36:58 -060054 layer_data() : wsi_enabled(false), gpu(VK_NULL_HANDLE){};
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070055};
56
57struct instExts {
58 bool wsi_enabled;
Tobin Ehlisa39c26a2016-01-05 16:34:59 -070059 bool xlib_enabled;
60 bool xcb_enabled;
61 bool wayland_enabled;
62 bool mir_enabled;
63 bool android_enabled;
64 bool win32_enabled;
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070065};
66
Jon Ashburn5484e0c2016-03-08 17:48:44 -070067static std::unordered_map<void *, struct instExts> instanceExtMap;
68static std::unordered_map<void *, layer_data *> layer_data_map;
69static device_table_map unique_objects_device_table_map;
70static instance_table_map unique_objects_instance_table_map;
Tobin Ehlis10ba1de2016-04-13 12:59:43 -060071static std::mutex global_lock; // Protect map accesses and unique_id increments
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070072
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070073// Handle CreateInstance
Jon Ashburn5484e0c2016-03-08 17:48:44 -070074static void createInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070075 uint32_t i;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070076 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(unique_objects_instance_table_map, instance);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070077 PFN_vkGetInstanceProcAddr gpa = pDisp->GetInstanceProcAddr;
Michael Lentine56512bb2016-03-02 17:28:55 -060078
79 pDisp->DestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)gpa(instance, "vkDestroySurfaceKHR");
Jon Ashburn5484e0c2016-03-08 17:48:44 -070080 pDisp->GetPhysicalDeviceSurfaceSupportKHR =
81 (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceSupportKHR");
82 pDisp->GetPhysicalDeviceSurfaceCapabilitiesKHR =
83 (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
84 pDisp->GetPhysicalDeviceSurfaceFormatsKHR =
85 (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR");
86 pDisp->GetPhysicalDeviceSurfacePresentModesKHR =
87 (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR");
Tobin Ehlisa39c26a2016-01-05 16:34:59 -070088#ifdef VK_USE_PLATFORM_WIN32_KHR
Jon Ashburn5484e0c2016-03-08 17:48:44 -070089 pDisp->CreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)gpa(instance, "vkCreateWin32SurfaceKHR");
90 pDisp->GetPhysicalDeviceWin32PresentationSupportKHR =
91 (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070092#endif // VK_USE_PLATFORM_WIN32_KHR
93#ifdef VK_USE_PLATFORM_XCB_KHR
Jon Ashburn5484e0c2016-03-08 17:48:44 -070094 pDisp->CreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)gpa(instance, "vkCreateXcbSurfaceKHR");
95 pDisp->GetPhysicalDeviceXcbPresentationSupportKHR =
96 (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070097#endif // VK_USE_PLATFORM_XCB_KHR
98#ifdef VK_USE_PLATFORM_XLIB_KHR
Jon Ashburn5484e0c2016-03-08 17:48:44 -070099 pDisp->CreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)gpa(instance, "vkCreateXlibSurfaceKHR");
100 pDisp->GetPhysicalDeviceXlibPresentationSupportKHR =
101 (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700102#endif // VK_USE_PLATFORM_XLIB_KHR
103#ifdef VK_USE_PLATFORM_MIR_KHR
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700104 pDisp->CreateMirSurfaceKHR = (PFN_vkCreateMirSurfaceKHR)gpa(instance, "vkCreateMirSurfaceKHR");
105 pDisp->GetPhysicalDeviceMirPresentationSupportKHR =
106 (PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceMirPresentationSupportKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700107#endif // VK_USE_PLATFORM_MIR_KHR
108#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700109 pDisp->CreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)gpa(instance, "vkCreateWaylandSurfaceKHR");
110 pDisp->GetPhysicalDeviceWaylandPresentationSupportKHR =
111 (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700112#endif // VK_USE_PLATFORM_WAYLAND_KHR
113#ifdef VK_USE_PLATFORM_ANDROID_KHR
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700114 pDisp->CreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)gpa(instance, "vkCreateAndroidSurfaceKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700115#endif // VK_USE_PLATFORM_ANDROID_KHR
116
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700117 instanceExtMap[pDisp] = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -0700118 for (i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700119 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700120 instanceExtMap[pDisp].wsi_enabled = true;
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700121#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700122 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700123 instanceExtMap[pDisp].xlib_enabled = true;
124#endif
125#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700126 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700127 instanceExtMap[pDisp].xcb_enabled = true;
128#endif
129#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700130 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700131 instanceExtMap[pDisp].wayland_enabled = true;
132#endif
133#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700134 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700135 instanceExtMap[pDisp].mir_enabled = true;
136#endif
137#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700138 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700139 instanceExtMap[pDisp].android_enabled = true;
140#endif
141#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700142 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700143 instanceExtMap[pDisp].win32_enabled = true;
144#endif
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700145 }
146}
147
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700148VkResult explicit_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
149 VkInstance *pInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700150 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700151
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700152 assert(chain_info->u.pLayerInfo);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700153 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700154 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700155 if (fpCreateInstance == NULL) {
156 return VK_ERROR_INITIALIZATION_FAILED;
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700157 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700158
159 // Advance the link info for the next element on the chain
160 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
161
162 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
163 if (result != VK_SUCCESS) {
164 return result;
165 }
166
Chia-I Wu16570472016-05-17 07:57:15 +0800167 layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
168 my_data->instance = *pInstance;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700169 initInstanceTable(*pInstance, fpGetInstanceProcAddr, unique_objects_instance_table_map);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700170
171 createInstanceRegisterExtensions(pCreateInfo, *pInstance);
172
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700173 return result;
174}
175
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600176void explicit_DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Dustin Graves7b098da2016-04-29 11:55:43 -0600177 dispatch_key key = get_dispatch_key(instance);
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600178 get_dispatch_table(unique_objects_instance_table_map, instance)->DestroyInstance(instance, pAllocator);
Dustin Graves7b098da2016-04-29 11:55:43 -0600179 layer_data_map.erase(key);
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600180}
181
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700182// Handle CreateDevice
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700183static void createDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700184 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
185 VkLayerDispatchTable *pDisp = get_dispatch_table(unique_objects_device_table_map, device);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700186 PFN_vkGetDeviceProcAddr gpa = pDisp->GetDeviceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700187 pDisp->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpa(device, "vkCreateSwapchainKHR");
188 pDisp->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)gpa(device, "vkDestroySwapchainKHR");
189 pDisp->GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)gpa(device, "vkGetSwapchainImagesKHR");
190 pDisp->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)gpa(device, "vkAcquireNextImageKHR");
191 pDisp->QueuePresentKHR = (PFN_vkQueuePresentKHR)gpa(device, "vkQueuePresentKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700192 my_device_data->wsi_enabled = false;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700193 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700194 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0)
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700195 my_device_data->wsi_enabled = true;
196 }
197}
198
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700199VkResult explicit_CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
200 VkDevice *pDevice) {
Chia-I Wu16570472016-05-17 07:57:15 +0800201 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700202 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700203
204 assert(chain_info->u.pLayerInfo);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700205 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
206 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Chia-I Wu16570472016-05-17 07:57:15 +0800207 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice");
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700208 if (fpCreateDevice == NULL) {
209 return VK_ERROR_INITIALIZATION_FAILED;
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700210 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700211
212 // Advance the link info for the next element on the chain
213 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
214
215 VkResult result = fpCreateDevice(gpu, pCreateInfo, pAllocator, pDevice);
216 if (result != VK_SUCCESS) {
217 return result;
218 }
219
220 // Setup layer's device dispatch table
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700221 initDeviceTable(*pDevice, fpGetDeviceProcAddr, unique_objects_device_table_map);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700222
223 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600224 // Set gpu for this device in order to get at any objects mapped at instance level
225 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
226 my_device_data->gpu = gpu;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700227
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700228 return result;
229}
230
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600231void explicit_DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Dustin Graves7b098da2016-04-29 11:55:43 -0600232 dispatch_key key = get_dispatch_key(device);
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600233 get_dispatch_table(unique_objects_device_table_map, device)->DestroyDevice(device, pAllocator);
Dustin Graves7b098da2016-04-29 11:55:43 -0600234 layer_data_map.erase(key);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700235}
236
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700237VkResult explicit_CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
238 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
239 VkPipeline *pPipelines) {
240 // STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'stage': {'module': 'VkShaderModule'},
241 // 'layout': 'VkPipelineLayout', 'basePipelineHandle': 'VkPipeline'}}
242 // LOCAL DECLS:{'pCreateInfos': 'VkComputePipelineCreateInfo*'}
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600243 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700244 safe_VkComputePipelineCreateInfo *local_pCreateInfos = NULL;
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700245 if (pCreateInfos) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600246 std::lock_guard<std::mutex> lock(global_lock);
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700247 local_pCreateInfos = new safe_VkComputePipelineCreateInfo[createInfoCount];
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700248 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700249 local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]);
250 if (pCreateInfos[idx0].basePipelineHandle) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700251 local_pCreateInfos[idx0].basePipelineHandle =
Dustin Gravesa7622d82016-04-14 17:29:20 -0600252 (VkPipeline)my_device_data
253 ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].basePipelineHandle)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700254 }
255 if (pCreateInfos[idx0].layout) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600256 local_pCreateInfos[idx0].layout =
Dustin Gravesa7622d82016-04-14 17:29:20 -0600257 (VkPipelineLayout)
258 my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].layout)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700259 }
260 if (pCreateInfos[idx0].stage.module) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700261 local_pCreateInfos[idx0].stage.module =
Dustin Gravesa7622d82016-04-14 17:29:20 -0600262 (VkShaderModule)
263 my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].stage.module)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700264 }
265 }
266 }
267 if (pipelineCache) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600268 std::lock_guard<std::mutex> lock(global_lock);
Dustin Gravesa7622d82016-04-14 17:29:20 -0600269 pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(pipelineCache)];
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700270 }
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600271
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700272 VkResult result = get_dispatch_table(unique_objects_device_table_map, device)
273 ->CreateComputePipelines(device, pipelineCache, createInfoCount,
274 (const VkComputePipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines);
Eric Engestrom53b513f2016-02-21 19:58:09 +0000275 delete[] local_pCreateInfos;
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700276 if (VK_SUCCESS == result) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600277 uint64_t unique_id = 0;
278 std::lock_guard<std::mutex> lock(global_lock);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700279 for (uint32_t i = 0; i < createInfoCount; ++i) {
Mark Lobodzinskifdf8f472016-04-28 16:36:58 -0600280 unique_id = global_unique_id++;
Dustin Gravesa7622d82016-04-14 17:29:20 -0600281 my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]);
282 pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700283 }
284 }
285 return result;
286}
287
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700288VkResult explicit_CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
289 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
290 VkPipeline *pPipelines) {
291 // STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'layout': 'VkPipelineLayout',
292 // 'pStages[stageCount]': {'module': 'VkShaderModule'}, 'renderPass': 'VkRenderPass', 'basePipelineHandle': 'VkPipeline'}}
293 // LOCAL DECLS:{'pCreateInfos': 'VkGraphicsPipelineCreateInfo*'}
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600294 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700295 safe_VkGraphicsPipelineCreateInfo *local_pCreateInfos = NULL;
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700296 if (pCreateInfos) {
297 local_pCreateInfos = new safe_VkGraphicsPipelineCreateInfo[createInfoCount];
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600298 std::lock_guard<std::mutex> lock(global_lock);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700299 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700300 local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]);
301 if (pCreateInfos[idx0].basePipelineHandle) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700302 local_pCreateInfos[idx0].basePipelineHandle =
Dustin Gravesa7622d82016-04-14 17:29:20 -0600303 (VkPipeline)my_device_data
304 ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].basePipelineHandle)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700305 }
306 if (pCreateInfos[idx0].layout) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600307 local_pCreateInfos[idx0].layout =
Dustin Gravesa7622d82016-04-14 17:29:20 -0600308 (VkPipelineLayout)
309 my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].layout)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700310 }
311 if (pCreateInfos[idx0].pStages) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700312 for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) {
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700313 if (pCreateInfos[idx0].pStages[idx1].module) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700314 local_pCreateInfos[idx0].pStages[idx1].module =
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600315 (VkShaderModule)my_device_data
Dustin Gravesa7622d82016-04-14 17:29:20 -0600316 ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].pStages[idx1].module)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700317 }
318 }
319 }
320 if (pCreateInfos[idx0].renderPass) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600321 local_pCreateInfos[idx0].renderPass =
Dustin Gravesa7622d82016-04-14 17:29:20 -0600322 (VkRenderPass)
323 my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].renderPass)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700324 }
325 }
326 }
327 if (pipelineCache) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600328 std::lock_guard<std::mutex> lock(global_lock);
Dustin Gravesa7622d82016-04-14 17:29:20 -0600329 pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(pipelineCache)];
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700330 }
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600331
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700332 VkResult result =
333 get_dispatch_table(unique_objects_device_table_map, device)
334 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount,
335 (const VkGraphicsPipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines);
Eric Engestrom53b513f2016-02-21 19:58:09 +0000336 delete[] local_pCreateInfos;
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700337 if (VK_SUCCESS == result) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600338 uint64_t unique_id = 0;
339 std::lock_guard<std::mutex> lock(global_lock);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700340 for (uint32_t i = 0; i < createInfoCount; ++i) {
Mark Lobodzinskifdf8f472016-04-28 16:36:58 -0600341 unique_id = global_unique_id++;
Dustin Gravesa7622d82016-04-14 17:29:20 -0600342 my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]);
343 pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700344 }
345 }
346 return result;
347}
348
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600349VkResult explicit_CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
350 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
351 layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
352
353 safe_VkSwapchainCreateInfoKHR *local_pCreateInfo = NULL;
354 if (pCreateInfo) {
355 std::lock_guard<std::mutex> lock(global_lock);
356 local_pCreateInfo = new safe_VkSwapchainCreateInfoKHR(pCreateInfo);
357 local_pCreateInfo->oldSwapchain =
Dustin Gravesa7622d82016-04-14 17:29:20 -0600358 (VkSwapchainKHR)my_map_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfo->oldSwapchain)];
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600359 // Need to pull surface mapping from the instance-level map
360 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(my_map_data->gpu), layer_data_map);
361 local_pCreateInfo->surface =
Dustin Gravesa7622d82016-04-14 17:29:20 -0600362 (VkSurfaceKHR)instance_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfo->surface)];
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600363 }
364
365 VkResult result = get_dispatch_table(unique_objects_device_table_map, device)
366 ->CreateSwapchainKHR(device, (const VkSwapchainCreateInfoKHR *)local_pCreateInfo, pAllocator, pSwapchain);
367 if (local_pCreateInfo)
368 delete local_pCreateInfo;
369 if (VK_SUCCESS == result) {
370 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinskifdf8f472016-04-28 16:36:58 -0600371 uint64_t unique_id =global_unique_id++;
Dustin Gravesa7622d82016-04-14 17:29:20 -0600372 my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(*pSwapchain);
373 *pSwapchain = reinterpret_cast<VkSwapchainKHR &>(unique_id);
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600374 }
375 return result;
376}
377
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700378VkResult explicit_GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
379 VkImage *pSwapchainImages) {
380 // UNWRAP USES:
381 // 0 : swapchain,VkSwapchainKHR, pSwapchainImages,VkImage
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600382 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700383 if (VK_NULL_HANDLE != swapchain) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600384 std::lock_guard<std::mutex> lock(global_lock);
Dustin Gravesa7622d82016-04-14 17:29:20 -0600385 swapchain = (VkSwapchainKHR)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(swapchain)];
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700386 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700387 VkResult result = get_dispatch_table(unique_objects_device_table_map, device)
388 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700389 // TODO : Need to add corresponding code to delete these images
390 if (VK_SUCCESS == result) {
391 if ((*pSwapchainImageCount > 0) && pSwapchainImages) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600392 uint64_t unique_id = 0;
393 std::lock_guard<std::mutex> lock(global_lock);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700394 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
Mark Lobodzinskifdf8f472016-04-28 16:36:58 -0600395 unique_id = global_unique_id++;
Dustin Gravesa7622d82016-04-14 17:29:20 -0600396 my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pSwapchainImages[i]);
397 pSwapchainImages[i] = reinterpret_cast<VkImage &>(unique_id);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700398 }
399 }
400 }
401 return result;
402}
Chia-I Wucdb70962016-05-13 14:07:36 +0800403
404} // namespace unique_objects