blob: b4376a54d9481f9d46fe8d54e8ca4a63610b1628 [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 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07006 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and/or associated documentation files (the "Materials"), to
8 * deal in the Materials without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Materials, and to permit persons to whom the Materials
11 * are furnished to do so, subject to the following conditions:
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070012 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070013 * The above copyright notice(s) and this permission notice shall be included
14 * in all copies or substantial portions of the Materials.
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070015 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070016 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070017 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070018 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 *
20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
21 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
22 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
23 * USE OR OTHER DEALINGS IN THE MATERIALS
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070024 *
25 * Author: Tobin Ehlis <tobine@google.com>
26 */
27
Jamie Madilldf5d5732016-04-04 11:54:43 -040028#include "vk_loader_platform.h"
29#include "vulkan/vulkan.h"
30
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070031#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34#include <inttypes.h>
35
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070036#include <unordered_map>
Tobin Ehlis10ba1de2016-04-13 12:59:43 -060037#include <vector>
38#include <mutex>
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070039
40#include "vulkan/vk_layer.h"
41#include "vk_layer_config.h"
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070042#include "vk_layer_table.h"
43#include "vk_layer_data.h"
44#include "vk_layer_logging.h"
45#include "vk_layer_extension_utils.h"
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -070046#include "vk_safe_struct.h"
Jon Ashburndc9111c2016-03-22 12:57:13 -060047#include "vk_layer_utils.h"
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070048
49struct layer_data {
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070050 bool wsi_enabled;
Tobin Ehlis10ba1de2016-04-13 12:59:43 -060051 uint64_t unique_id; // All increments are guarded by global_lock
52 std::unordered_map<uint64_t, uint64_t> unique_id_mapping; // Map uniqueID to actual object handle
53 VkPhysicalDevice gpu;
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070054
Tobin Ehlis10ba1de2016-04-13 12:59:43 -060055 layer_data() : wsi_enabled(false), unique_id(1), gpu(VK_NULL_HANDLE){};
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070056};
57
58struct instExts {
59 bool wsi_enabled;
Tobin Ehlisa39c26a2016-01-05 16:34:59 -070060 bool xlib_enabled;
61 bool xcb_enabled;
62 bool wayland_enabled;
63 bool mir_enabled;
64 bool android_enabled;
65 bool win32_enabled;
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070066};
67
Jon Ashburn5484e0c2016-03-08 17:48:44 -070068static std::unordered_map<void *, struct instExts> instanceExtMap;
69static std::unordered_map<void *, layer_data *> layer_data_map;
70static device_table_map unique_objects_device_table_map;
71static instance_table_map unique_objects_instance_table_map;
Tobin Ehlis10ba1de2016-04-13 12:59:43 -060072static std::mutex global_lock; // Protect map accesses and unique_id increments
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070073
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070074// Handle CreateInstance
Jon Ashburn5484e0c2016-03-08 17:48:44 -070075static void createInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070076 uint32_t i;
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070077 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(unique_objects_instance_table_map, instance);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070078 PFN_vkGetInstanceProcAddr gpa = pDisp->GetInstanceProcAddr;
Michael Lentine56512bb2016-03-02 17:28:55 -060079
80 pDisp->DestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)gpa(instance, "vkDestroySurfaceKHR");
Jon Ashburn5484e0c2016-03-08 17:48:44 -070081 pDisp->GetPhysicalDeviceSurfaceSupportKHR =
82 (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceSupportKHR");
83 pDisp->GetPhysicalDeviceSurfaceCapabilitiesKHR =
84 (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
85 pDisp->GetPhysicalDeviceSurfaceFormatsKHR =
86 (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR");
87 pDisp->GetPhysicalDeviceSurfacePresentModesKHR =
88 (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR");
Tobin Ehlisa39c26a2016-01-05 16:34:59 -070089#ifdef VK_USE_PLATFORM_WIN32_KHR
Jon Ashburn5484e0c2016-03-08 17:48:44 -070090 pDisp->CreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)gpa(instance, "vkCreateWin32SurfaceKHR");
91 pDisp->GetPhysicalDeviceWin32PresentationSupportKHR =
92 (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070093#endif // VK_USE_PLATFORM_WIN32_KHR
94#ifdef VK_USE_PLATFORM_XCB_KHR
Jon Ashburn5484e0c2016-03-08 17:48:44 -070095 pDisp->CreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR)gpa(instance, "vkCreateXcbSurfaceKHR");
96 pDisp->GetPhysicalDeviceXcbPresentationSupportKHR =
97 (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -070098#endif // VK_USE_PLATFORM_XCB_KHR
99#ifdef VK_USE_PLATFORM_XLIB_KHR
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700100 pDisp->CreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR)gpa(instance, "vkCreateXlibSurfaceKHR");
101 pDisp->GetPhysicalDeviceXlibPresentationSupportKHR =
102 (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700103#endif // VK_USE_PLATFORM_XLIB_KHR
104#ifdef VK_USE_PLATFORM_MIR_KHR
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700105 pDisp->CreateMirSurfaceKHR = (PFN_vkCreateMirSurfaceKHR)gpa(instance, "vkCreateMirSurfaceKHR");
106 pDisp->GetPhysicalDeviceMirPresentationSupportKHR =
107 (PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceMirPresentationSupportKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700108#endif // VK_USE_PLATFORM_MIR_KHR
109#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700110 pDisp->CreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR)gpa(instance, "vkCreateWaylandSurfaceKHR");
111 pDisp->GetPhysicalDeviceWaylandPresentationSupportKHR =
112 (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)gpa(instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700113#endif // VK_USE_PLATFORM_WAYLAND_KHR
114#ifdef VK_USE_PLATFORM_ANDROID_KHR
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700115 pDisp->CreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)gpa(instance, "vkCreateAndroidSurfaceKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700116#endif // VK_USE_PLATFORM_ANDROID_KHR
117
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700118 instanceExtMap[pDisp] = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -0700119 for (i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700120 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700121 instanceExtMap[pDisp].wsi_enabled = true;
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700122#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700123 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700124 instanceExtMap[pDisp].xlib_enabled = true;
125#endif
126#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700127 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700128 instanceExtMap[pDisp].xcb_enabled = true;
129#endif
130#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700131 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700132 instanceExtMap[pDisp].wayland_enabled = true;
133#endif
134#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700135 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700136 instanceExtMap[pDisp].mir_enabled = true;
137#endif
138#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700139 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700140 instanceExtMap[pDisp].android_enabled = true;
141#endif
142#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700143 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlisa39c26a2016-01-05 16:34:59 -0700144 instanceExtMap[pDisp].win32_enabled = true;
145#endif
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700146 }
147}
148
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700149VkResult explicit_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
150 VkInstance *pInstance) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700151 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700152
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700153 assert(chain_info->u.pLayerInfo);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700154 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700155 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700156 if (fpCreateInstance == NULL) {
157 return VK_ERROR_INITIALIZATION_FAILED;
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700158 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700159
160 // Advance the link info for the next element on the chain
161 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
162
163 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
164 if (result != VK_SUCCESS) {
165 return result;
166 }
167
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700168 initInstanceTable(*pInstance, fpGetInstanceProcAddr, unique_objects_instance_table_map);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700169
170 createInstanceRegisterExtensions(pCreateInfo, *pInstance);
171
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700172 return result;
173}
174
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600175void explicit_DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
176 get_dispatch_table(unique_objects_instance_table_map, instance)->DestroyInstance(instance, pAllocator);
177 layer_data_map.erase(get_dispatch_key(instance));
178}
179
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700180// Handle CreateDevice
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700181static void createDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700182 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
183 VkLayerDispatchTable *pDisp = get_dispatch_table(unique_objects_device_table_map, device);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700184 PFN_vkGetDeviceProcAddr gpa = pDisp->GetDeviceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700185 pDisp->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpa(device, "vkCreateSwapchainKHR");
186 pDisp->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)gpa(device, "vkDestroySwapchainKHR");
187 pDisp->GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)gpa(device, "vkGetSwapchainImagesKHR");
188 pDisp->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)gpa(device, "vkAcquireNextImageKHR");
189 pDisp->QueuePresentKHR = (PFN_vkQueuePresentKHR)gpa(device, "vkQueuePresentKHR");
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700190 my_device_data->wsi_enabled = false;
Jon Ashburnf19916e2016-01-11 13:12:43 -0700191 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700192 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0)
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700193 my_device_data->wsi_enabled = true;
194 }
195}
196
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700197VkResult explicit_CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
198 VkDevice *pDevice) {
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700199 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700200
201 assert(chain_info->u.pLayerInfo);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700202 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
203 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700204 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700205 if (fpCreateDevice == NULL) {
206 return VK_ERROR_INITIALIZATION_FAILED;
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700207 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700208
209 // Advance the link info for the next element on the chain
210 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
211
212 VkResult result = fpCreateDevice(gpu, pCreateInfo, pAllocator, pDevice);
213 if (result != VK_SUCCESS) {
214 return result;
215 }
216
217 // Setup layer's device dispatch table
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700218 initDeviceTable(*pDevice, fpGetDeviceProcAddr, unique_objects_device_table_map);
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700219
220 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600221 // Set gpu for this device in order to get at any objects mapped at instance level
222 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
223 my_device_data->gpu = gpu;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700224
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700225 return result;
226}
227
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600228void explicit_DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
229 get_dispatch_table(unique_objects_device_table_map, device)->DestroyDevice(device, pAllocator);
230 layer_data_map.erase(get_dispatch_key(device));
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700231}
232
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700233VkResult explicit_CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
234 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
235 VkPipeline *pPipelines) {
236 // STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'stage': {'module': 'VkShaderModule'},
237 // 'layout': 'VkPipelineLayout', 'basePipelineHandle': 'VkPipeline'}}
238 // LOCAL DECLS:{'pCreateInfos': 'VkComputePipelineCreateInfo*'}
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600239 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700240 safe_VkComputePipelineCreateInfo *local_pCreateInfos = NULL;
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700241 if (pCreateInfos) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600242 std::lock_guard<std::mutex> lock(global_lock);
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700243 local_pCreateInfos = new safe_VkComputePipelineCreateInfo[createInfoCount];
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700244 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700245 local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]);
246 if (pCreateInfos[idx0].basePipelineHandle) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700247 local_pCreateInfos[idx0].basePipelineHandle =
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600248 (VkPipeline)
249 my_device_data->unique_id_mapping[reinterpret_cast<uint64_t>(pCreateInfos[idx0].basePipelineHandle)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700250 }
251 if (pCreateInfos[idx0].layout) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600252 local_pCreateInfos[idx0].layout =
253 (VkPipelineLayout)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t>(pCreateInfos[idx0].layout)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700254 }
255 if (pCreateInfos[idx0].stage.module) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700256 local_pCreateInfos[idx0].stage.module =
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600257 (VkShaderModule)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t>(pCreateInfos[idx0].stage.module)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700258 }
259 }
260 }
261 if (pipelineCache) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600262 std::lock_guard<std::mutex> lock(global_lock);
263 pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t>(pipelineCache)];
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700264 }
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600265
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700266 VkResult result = get_dispatch_table(unique_objects_device_table_map, device)
267 ->CreateComputePipelines(device, pipelineCache, createInfoCount,
268 (const VkComputePipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines);
Eric Engestrom53b513f2016-02-21 19:58:09 +0000269 delete[] local_pCreateInfos;
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700270 if (VK_SUCCESS == result) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600271 uint64_t unique_id = 0;
272 std::lock_guard<std::mutex> lock(global_lock);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700273 for (uint32_t i = 0; i < createInfoCount; ++i) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600274 unique_id = my_device_data->unique_id++;
275 my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t>(pPipelines[i]);
276 pPipelines[i] = reinterpret_cast<VkPipeline>(unique_id);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700277 }
278 }
279 return result;
280}
281
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700282VkResult explicit_CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
283 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
284 VkPipeline *pPipelines) {
285 // STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'layout': 'VkPipelineLayout',
286 // 'pStages[stageCount]': {'module': 'VkShaderModule'}, 'renderPass': 'VkRenderPass', 'basePipelineHandle': 'VkPipeline'}}
287 // LOCAL DECLS:{'pCreateInfos': 'VkGraphicsPipelineCreateInfo*'}
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600288 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700289 safe_VkGraphicsPipelineCreateInfo *local_pCreateInfos = NULL;
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700290 if (pCreateInfos) {
291 local_pCreateInfos = new safe_VkGraphicsPipelineCreateInfo[createInfoCount];
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600292 std::lock_guard<std::mutex> lock(global_lock);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700293 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700294 local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]);
295 if (pCreateInfos[idx0].basePipelineHandle) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700296 local_pCreateInfos[idx0].basePipelineHandle =
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600297 (VkPipeline)
298 my_device_data->unique_id_mapping[reinterpret_cast<uint64_t>(pCreateInfos[idx0].basePipelineHandle)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700299 }
300 if (pCreateInfos[idx0].layout) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600301 local_pCreateInfos[idx0].layout =
302 (VkPipelineLayout)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t>(pCreateInfos[idx0].layout)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700303 }
304 if (pCreateInfos[idx0].pStages) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700305 for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) {
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700306 if (pCreateInfos[idx0].pStages[idx1].module) {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700307 local_pCreateInfos[idx0].pStages[idx1].module =
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600308 (VkShaderModule)my_device_data
309 ->unique_id_mapping[reinterpret_cast<uint64_t>(pCreateInfos[idx0].pStages[idx1].module)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700310 }
311 }
312 }
313 if (pCreateInfos[idx0].renderPass) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600314 local_pCreateInfos[idx0].renderPass =
315 (VkRenderPass)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t>(pCreateInfos[idx0].renderPass)];
Tobin Ehlis8bb7c2f2016-02-10 15:38:45 -0700316 }
317 }
318 }
319 if (pipelineCache) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600320 std::lock_guard<std::mutex> lock(global_lock);
321 pipelineCache = (VkPipelineCache)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t>(pipelineCache)];
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700322 }
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600323
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700324 VkResult result =
325 get_dispatch_table(unique_objects_device_table_map, device)
326 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount,
327 (const VkGraphicsPipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines);
Eric Engestrom53b513f2016-02-21 19:58:09 +0000328 delete[] local_pCreateInfos;
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700329 if (VK_SUCCESS == result) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600330 uint64_t unique_id = 0;
331 std::lock_guard<std::mutex> lock(global_lock);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700332 for (uint32_t i = 0; i < createInfoCount; ++i) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600333 unique_id = my_device_data->unique_id++;
334 my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t>(pPipelines[i]);
335 pPipelines[i] = reinterpret_cast<VkPipeline>(unique_id);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700336 }
337 }
338 return result;
339}
340
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600341VkResult explicit_CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
342 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
343 layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
344
345 safe_VkSwapchainCreateInfoKHR *local_pCreateInfo = NULL;
346 if (pCreateInfo) {
347 std::lock_guard<std::mutex> lock(global_lock);
348 local_pCreateInfo = new safe_VkSwapchainCreateInfoKHR(pCreateInfo);
349 local_pCreateInfo->oldSwapchain =
350 (VkSwapchainKHR)my_map_data->unique_id_mapping[reinterpret_cast<uint64_t>(pCreateInfo->oldSwapchain)];
351 // Need to pull surface mapping from the instance-level map
352 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(my_map_data->gpu), layer_data_map);
353 local_pCreateInfo->surface =
354 (VkSurfaceKHR)instance_data->unique_id_mapping[reinterpret_cast<uint64_t>(pCreateInfo->surface)];
355 }
356
357 VkResult result = get_dispatch_table(unique_objects_device_table_map, device)
358 ->CreateSwapchainKHR(device, (const VkSwapchainCreateInfoKHR *)local_pCreateInfo, pAllocator, pSwapchain);
359 if (local_pCreateInfo)
360 delete local_pCreateInfo;
361 if (VK_SUCCESS == result) {
362 std::lock_guard<std::mutex> lock(global_lock);
363 uint64_t unique_id = my_map_data->unique_id++;
364 my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t>(*pSwapchain);
365 *pSwapchain = reinterpret_cast<VkSwapchainKHR>(unique_id);
366 }
367 return result;
368}
369
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700370VkResult explicit_GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
371 VkImage *pSwapchainImages) {
372 // UNWRAP USES:
373 // 0 : swapchain,VkSwapchainKHR, pSwapchainImages,VkImage
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600374 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700375 if (VK_NULL_HANDLE != swapchain) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600376 std::lock_guard<std::mutex> lock(global_lock);
377 swapchain = (VkSwapchainKHR)my_device_data->unique_id_mapping[reinterpret_cast<uint64_t>(swapchain)];
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700378 }
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700379 VkResult result = get_dispatch_table(unique_objects_device_table_map, device)
380 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700381 // TODO : Need to add corresponding code to delete these images
382 if (VK_SUCCESS == result) {
383 if ((*pSwapchainImageCount > 0) && pSwapchainImages) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600384 uint64_t unique_id = 0;
385 std::lock_guard<std::mutex> lock(global_lock);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700386 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
Tobin Ehlis10ba1de2016-04-13 12:59:43 -0600387 unique_id = my_device_data->unique_id++;
388 my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t>(pSwapchainImages[i]);
389 pSwapchainImages[i] = reinterpret_cast<VkImage>(unique_id);
Tobin Ehlisd34a4c52015-12-08 10:50:10 -0700390 }
391 }
392 }
393 return result;
394}