blob: 0479e5813e37c21b955aae2c0ba9e59f6e01c7ce [file] [log] [blame]
Mark Lobodzinski288e4f72016-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 Ehlis0b99d032015-12-08 10:50:10 -07005 *
Jon Ashburn43b53e82016-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 Ehlis0b99d032015-12-08 10:50:10 -07009 *
Jon Ashburn43b53e82016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Tobin Ehlis0b99d032015-12-08 10:50:10 -070011 *
Jon Ashburn43b53e82016-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 Ehlis0b99d032015-12-08 10:50:10 -070017 *
18 * Author: Tobin Ehlis <tobine@google.com>
19 */
20
Jamie Madill6f25bb72016-04-04 11:54:43 -040021#include "vk_loader_platform.h"
22#include "vulkan/vulkan.h"
23
Tobin Ehlis0b99d032015-12-08 10:50:10 -070024#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27#include <inttypes.h>
28
Tobin Ehlis0b99d032015-12-08 10:50:10 -070029#include <unordered_map>
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -060030#include <vector>
31#include <mutex>
Tobin Ehlis0b99d032015-12-08 10:50:10 -070032
33#include "vulkan/vk_layer.h"
34#include "vk_layer_config.h"
Tobin Ehlis0b99d032015-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 Ehlis9aac5552016-02-10 15:38:45 -070039#include "vk_safe_struct.h"
Jon Ashburnf1ea4182016-03-22 12:57:13 -060040#include "vk_layer_utils.h"
Tobin Ehlis0b99d032015-12-08 10:50:10 -070041
42struct layer_data {
Tobin Ehlis0b99d032015-12-08 10:50:10 -070043 bool wsi_enabled;
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -060044 uint64_t unique_id; // All increments are guarded by global_lock
45 std::unordered_map<uint64_t, uint64_t> unique_id_mapping; // Map uniqueID to actual object handle
46 VkPhysicalDevice gpu;
Tobin Ehlis0b99d032015-12-08 10:50:10 -070047
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -060048 layer_data() : wsi_enabled(false), unique_id(1), gpu(VK_NULL_HANDLE){};
Tobin Ehlis0b99d032015-12-08 10:50:10 -070049};
50
51struct instExts {
52 bool wsi_enabled;
Tobin Ehlis115790b2016-01-05 16:34:59 -070053 bool xlib_enabled;
54 bool xcb_enabled;
55 bool wayland_enabled;
56 bool mir_enabled;
57 bool android_enabled;
58 bool win32_enabled;
Tobin Ehlis0b99d032015-12-08 10:50:10 -070059};
60
Jon Ashburn491a3cd2016-03-08 17:48:44 -070061static std::unordered_map<void *, struct instExts> instanceExtMap;
62static std::unordered_map<void *, layer_data *> layer_data_map;
63static device_table_map unique_objects_device_table_map;
64static instance_table_map unique_objects_instance_table_map;
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -060065static std::mutex global_lock; // Protect map accesses and unique_id increments
Tobin Ehlis0b99d032015-12-08 10:50:10 -070066
Tobin Ehlis0b99d032015-12-08 10:50:10 -070067// Handle CreateInstance
Jon Ashburn491a3cd2016-03-08 17:48:44 -070068static void createInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Tobin Ehlis0b99d032015-12-08 10:50:10 -070069 uint32_t i;
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070070 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(unique_objects_instance_table_map, instance);
Tobin Ehlis0b99d032015-12-08 10:50:10 -070071 PFN_vkGetInstanceProcAddr gpa = pDisp->GetInstanceProcAddr;
Michael Lentine90ee20e2016-03-02 17:28:55 -060072
73 pDisp->DestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)gpa(instance, "vkDestroySurfaceKHR");
Jon Ashburn491a3cd2016-03-08 17:48:44 -070074 pDisp->GetPhysicalDeviceSurfaceSupportKHR =
75 (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceSupportKHR");
76 pDisp->GetPhysicalDeviceSurfaceCapabilitiesKHR =
77 (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
78 pDisp->GetPhysicalDeviceSurfaceFormatsKHR =
79 (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR");
80 pDisp->GetPhysicalDeviceSurfacePresentModesKHR =
81 (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR");
Tobin Ehlis115790b2016-01-05 16:34:59 -070082#ifdef VK_USE_PLATFORM_WIN32_KHR
Jon Ashburn491a3cd2016-03-08 17:48:44 -070083 pDisp->CreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)gpa(instance, "vkCreateWin32SurfaceKHR");
84 pDisp->GetPhysicalDeviceWin32PresentationSupportKHR =
85 (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -070086#endif // VK_USE_PLATFORM_WIN32_KHR
87#ifdef VK_USE_PLATFORM_XCB_KHR
Jon Ashburn491a3cd2016-03-08 17:48:44 -070088 pDisp->CreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)gpa(instance, "vkCreateXcbSurfaceKHR");
89 pDisp->GetPhysicalDeviceXcbPresentationSupportKHR =
90 (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -070091#endif // VK_USE_PLATFORM_XCB_KHR
92#ifdef VK_USE_PLATFORM_XLIB_KHR
Jon Ashburn491a3cd2016-03-08 17:48:44 -070093 pDisp->CreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)gpa(instance, "vkCreateXlibSurfaceKHR");
94 pDisp->GetPhysicalDeviceXlibPresentationSupportKHR =
95 (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -070096#endif // VK_USE_PLATFORM_XLIB_KHR
97#ifdef VK_USE_PLATFORM_MIR_KHR
Jon Ashburn491a3cd2016-03-08 17:48:44 -070098 pDisp->CreateMirSurfaceKHR = (PFN_vkCreateMirSurfaceKHR)gpa(instance, "vkCreateMirSurfaceKHR");
99 pDisp->GetPhysicalDeviceMirPresentationSupportKHR =
100 (PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceMirPresentationSupportKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700101#endif // VK_USE_PLATFORM_MIR_KHR
102#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700103 pDisp->CreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)gpa(instance, "vkCreateWaylandSurfaceKHR");
104 pDisp->GetPhysicalDeviceWaylandPresentationSupportKHR =
105 (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700106#endif // VK_USE_PLATFORM_WAYLAND_KHR
107#ifdef VK_USE_PLATFORM_ANDROID_KHR
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700108 pDisp->CreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)gpa(instance, "vkCreateAndroidSurfaceKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700109#endif // VK_USE_PLATFORM_ANDROID_KHR
110
Tobin Ehlis115790b2016-01-05 16:34:59 -0700111 instanceExtMap[pDisp] = {};
Jon Ashburna4ae48b2016-01-11 13:12:43 -0700112 for (i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700113 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700114 instanceExtMap[pDisp].wsi_enabled = true;
Tobin Ehlis115790b2016-01-05 16:34:59 -0700115#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700116 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis115790b2016-01-05 16:34:59 -0700117 instanceExtMap[pDisp].xlib_enabled = true;
118#endif
119#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700120 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis115790b2016-01-05 16:34:59 -0700121 instanceExtMap[pDisp].xcb_enabled = true;
122#endif
123#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700124 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis115790b2016-01-05 16:34:59 -0700125 instanceExtMap[pDisp].wayland_enabled = true;
126#endif
127#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700128 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis115790b2016-01-05 16:34:59 -0700129 instanceExtMap[pDisp].mir_enabled = true;
130#endif
131#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700132 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis115790b2016-01-05 16:34:59 -0700133 instanceExtMap[pDisp].android_enabled = true;
134#endif
135#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700136 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis115790b2016-01-05 16:34:59 -0700137 instanceExtMap[pDisp].win32_enabled = true;
138#endif
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700139 }
140}
141
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700142VkResult explicit_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
143 VkInstance *pInstance) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700144 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700145
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700146 assert(chain_info->u.pLayerInfo);
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700147 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700148 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700149 if (fpCreateInstance == NULL) {
150 return VK_ERROR_INITIALIZATION_FAILED;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700151 }
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700152
153 // Advance the link info for the next element on the chain
154 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
155
156 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
157 if (result != VK_SUCCESS) {
158 return result;
159 }
160
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700161 initInstanceTable(*pInstance, fpGetInstanceProcAddr, unique_objects_instance_table_map);
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700162
163 createInstanceRegisterExtensions(pCreateInfo, *pInstance);
164
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700165 return result;
166}
167
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600168void explicit_DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
169 get_dispatch_table(unique_objects_instance_table_map, instance)->DestroyInstance(instance, pAllocator);
170 layer_data_map.erase(get_dispatch_key(instance));
171}
172
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700173// Handle CreateDevice
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700174static void createDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700175 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
176 VkLayerDispatchTable *pDisp = get_dispatch_table(unique_objects_device_table_map, device);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700177 PFN_vkGetDeviceProcAddr gpa = pDisp->GetDeviceProcAddr;
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700178 pDisp->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpa(device, "vkCreateSwapchainKHR");
179 pDisp->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)gpa(device, "vkDestroySwapchainKHR");
180 pDisp->GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)gpa(device, "vkGetSwapchainImagesKHR");
181 pDisp->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)gpa(device, "vkAcquireNextImageKHR");
182 pDisp->QueuePresentKHR = (PFN_vkQueuePresentKHR)gpa(device, "vkQueuePresentKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700183 my_device_data->wsi_enabled = false;
Jon Ashburna4ae48b2016-01-11 13:12:43 -0700184 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700185 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0)
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700186 my_device_data->wsi_enabled = true;
187 }
188}
189
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700190VkResult explicit_CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
191 VkDevice *pDevice) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700192 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700193
194 assert(chain_info->u.pLayerInfo);
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700195 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
196 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700197 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700198 if (fpCreateDevice == NULL) {
199 return VK_ERROR_INITIALIZATION_FAILED;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700200 }
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700201
202 // Advance the link info for the next element on the chain
203 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
204
205 VkResult result = fpCreateDevice(gpu, pCreateInfo, pAllocator, pDevice);
206 if (result != VK_SUCCESS) {
207 return result;
208 }
209
210 // Setup layer's device dispatch table
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700211 initDeviceTable(*pDevice, fpGetDeviceProcAddr, unique_objects_device_table_map);
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700212
213 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600214 // Set gpu for this device in order to get at any objects mapped at instance level
215 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
216 my_device_data->gpu = gpu;
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700217
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700218 return result;
219}
220
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600221void explicit_DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
222 get_dispatch_table(unique_objects_device_table_map, device)->DestroyDevice(device, pAllocator);
223 layer_data_map.erase(get_dispatch_key(device));
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700224}
225
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700226VkResult explicit_CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
227 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
228 VkPipeline *pPipelines) {
229 // STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'stage': {'module': 'VkShaderModule'},
230 // 'layout': 'VkPipelineLayout', 'basePipelineHandle': 'VkPipeline'}}
231 // LOCAL DECLS:{'pCreateInfos': 'VkComputePipelineCreateInfo*'}
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600232 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700233 safe_VkComputePipelineCreateInfo *local_pCreateInfos = NULL;
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700234 if (pCreateInfos) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600235 std::lock_guard<std::mutex> lock(global_lock);
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700236 local_pCreateInfos = new safe_VkComputePipelineCreateInfo[createInfoCount];
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700237 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700238 local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]);
239 if (pCreateInfos[idx0].basePipelineHandle) {
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700240 local_pCreateInfos[idx0].basePipelineHandle =
Dustin Graves88f2e922016-04-14 17:29:20 -0600241 (VkPipeline)my_device_data
242 ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].basePipelineHandle)];
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700243 }
244 if (pCreateInfos[idx0].layout) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600245 local_pCreateInfos[idx0].layout =
Dustin Graves88f2e922016-04-14 17:29:20 -0600246 (VkPipelineLayout)
247 my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].layout)];
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700248 }
249 if (pCreateInfos[idx0].stage.module) {
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700250 local_pCreateInfos[idx0].stage.module =
Dustin Graves88f2e922016-04-14 17:29:20 -0600251 (VkShaderModule)
252 my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].stage.module)];
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700253 }
254 }
255 }
256 if (pipelineCache) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600257 std::lock_guard<std::mutex> lock(global_lock);
Dustin Graves88f2e922016-04-14 17:29:20 -0600258 pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(pipelineCache)];
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700259 }
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600260
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700261 VkResult result = get_dispatch_table(unique_objects_device_table_map, device)
262 ->CreateComputePipelines(device, pipelineCache, createInfoCount,
263 (const VkComputePipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines);
Eric Engestrom00a89732016-02-21 19:58:09 +0000264 delete[] local_pCreateInfos;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700265 if (VK_SUCCESS == result) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600266 uint64_t unique_id = 0;
267 std::lock_guard<std::mutex> lock(global_lock);
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700268 for (uint32_t i = 0; i < createInfoCount; ++i) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600269 unique_id = my_device_data->unique_id++;
Dustin Graves88f2e922016-04-14 17:29:20 -0600270 my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]);
271 pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700272 }
273 }
274 return result;
275}
276
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700277VkResult explicit_CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
278 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
279 VkPipeline *pPipelines) {
280 // STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'layout': 'VkPipelineLayout',
281 // 'pStages[stageCount]': {'module': 'VkShaderModule'}, 'renderPass': 'VkRenderPass', 'basePipelineHandle': 'VkPipeline'}}
282 // LOCAL DECLS:{'pCreateInfos': 'VkGraphicsPipelineCreateInfo*'}
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600283 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700284 safe_VkGraphicsPipelineCreateInfo *local_pCreateInfos = NULL;
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700285 if (pCreateInfos) {
286 local_pCreateInfos = new safe_VkGraphicsPipelineCreateInfo[createInfoCount];
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600287 std::lock_guard<std::mutex> lock(global_lock);
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700288 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700289 local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]);
290 if (pCreateInfos[idx0].basePipelineHandle) {
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700291 local_pCreateInfos[idx0].basePipelineHandle =
Dustin Graves88f2e922016-04-14 17:29:20 -0600292 (VkPipeline)my_device_data
293 ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].basePipelineHandle)];
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700294 }
295 if (pCreateInfos[idx0].layout) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600296 local_pCreateInfos[idx0].layout =
Dustin Graves88f2e922016-04-14 17:29:20 -0600297 (VkPipelineLayout)
298 my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].layout)];
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700299 }
300 if (pCreateInfos[idx0].pStages) {
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700301 for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) {
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700302 if (pCreateInfos[idx0].pStages[idx1].module) {
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700303 local_pCreateInfos[idx0].pStages[idx1].module =
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600304 (VkShaderModule)my_device_data
Dustin Graves88f2e922016-04-14 17:29:20 -0600305 ->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].pStages[idx1].module)];
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700306 }
307 }
308 }
309 if (pCreateInfos[idx0].renderPass) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600310 local_pCreateInfos[idx0].renderPass =
Dustin Graves88f2e922016-04-14 17:29:20 -0600311 (VkRenderPass)
312 my_device_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[idx0].renderPass)];
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700313 }
314 }
315 }
316 if (pipelineCache) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600317 std::lock_guard<std::mutex> lock(global_lock);
Dustin Graves88f2e922016-04-14 17:29:20 -0600318 pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(pipelineCache)];
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700319 }
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600320
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700321 VkResult result =
322 get_dispatch_table(unique_objects_device_table_map, device)
323 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount,
324 (const VkGraphicsPipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines);
Eric Engestrom00a89732016-02-21 19:58:09 +0000325 delete[] local_pCreateInfos;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700326 if (VK_SUCCESS == result) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600327 uint64_t unique_id = 0;
328 std::lock_guard<std::mutex> lock(global_lock);
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700329 for (uint32_t i = 0; i < createInfoCount; ++i) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600330 unique_id = my_device_data->unique_id++;
Dustin Graves88f2e922016-04-14 17:29:20 -0600331 my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]);
332 pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700333 }
334 }
335 return result;
336}
337
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600338VkResult explicit_CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
339 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
340 layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
341
342 safe_VkSwapchainCreateInfoKHR *local_pCreateInfo = NULL;
343 if (pCreateInfo) {
344 std::lock_guard<std::mutex> lock(global_lock);
345 local_pCreateInfo = new safe_VkSwapchainCreateInfoKHR(pCreateInfo);
346 local_pCreateInfo->oldSwapchain =
Dustin Graves88f2e922016-04-14 17:29:20 -0600347 (VkSwapchainKHR)my_map_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfo->oldSwapchain)];
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600348 // Need to pull surface mapping from the instance-level map
349 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(my_map_data->gpu), layer_data_map);
350 local_pCreateInfo->surface =
Dustin Graves88f2e922016-04-14 17:29:20 -0600351 (VkSurfaceKHR)instance_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfo->surface)];
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600352 }
353
354 VkResult result = get_dispatch_table(unique_objects_device_table_map, device)
355 ->CreateSwapchainKHR(device, (const VkSwapchainCreateInfoKHR *)local_pCreateInfo, pAllocator, pSwapchain);
356 if (local_pCreateInfo)
357 delete local_pCreateInfo;
358 if (VK_SUCCESS == result) {
359 std::lock_guard<std::mutex> lock(global_lock);
360 uint64_t unique_id = my_map_data->unique_id++;
Dustin Graves88f2e922016-04-14 17:29:20 -0600361 my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(*pSwapchain);
362 *pSwapchain = reinterpret_cast<VkSwapchainKHR &>(unique_id);
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600363 }
364 return result;
365}
366
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700367VkResult explicit_GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
368 VkImage *pSwapchainImages) {
369 // UNWRAP USES:
370 // 0 : swapchain,VkSwapchainKHR, pSwapchainImages,VkImage
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600371 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700372 if (VK_NULL_HANDLE != swapchain) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600373 std::lock_guard<std::mutex> lock(global_lock);
Dustin Graves88f2e922016-04-14 17:29:20 -0600374 swapchain = (VkSwapchainKHR)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t &>(swapchain)];
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700375 }
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700376 VkResult result = get_dispatch_table(unique_objects_device_table_map, device)
377 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700378 // TODO : Need to add corresponding code to delete these images
379 if (VK_SUCCESS == result) {
380 if ((*pSwapchainImageCount > 0) && pSwapchainImages) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600381 uint64_t unique_id = 0;
382 std::lock_guard<std::mutex> lock(global_lock);
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700383 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
Tobin Ehlis2fb0dba2016-04-13 12:59:43 -0600384 unique_id = my_device_data->unique_id++;
Dustin Graves88f2e922016-04-14 17:29:20 -0600385 my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pSwapchainImages[i]);
386 pSwapchainImages[i] = reinterpret_cast<VkImage &>(unique_id);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700387 }
388 }
389 }
390 return result;
391}