blob: 5dab3c8f6e0862496dde68443233f0e7eefd04d2 [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 *
Mark Lobodzinski288e4f72016-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 Ehlis0b99d032015-12-08 10:50:10 -070012 *
Mark Lobodzinski288e4f72016-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 Ehlis0b99d032015-12-08 10:50:10 -070015 *
Mark Lobodzinski288e4f72016-02-02 15:55:36 -070016 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Tobin Ehlis0b99d032015-12-08 10:50:10 -070017 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Mark Lobodzinski288e4f72016-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 Ehlis0b99d032015-12-08 10:50:10 -070024 *
25 * Author: Tobin Ehlis <tobine@google.com>
26 */
27
Tobin Ehlis0b99d032015-12-08 10:50:10 -070028#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31#include <inttypes.h>
32
33#include "vulkan/vulkan.h"
34#include "vk_loader_platform.h"
35
36#include <vector>
37#include <unordered_map>
38
39#include "vulkan/vk_layer.h"
40#include "vk_layer_config.h"
Tobin Ehlis0b99d032015-12-08 10:50:10 -070041#include "vk_layer_table.h"
42#include "vk_layer_data.h"
43#include "vk_layer_logging.h"
44#include "vk_layer_extension_utils.h"
Tobin Ehlis9aac5552016-02-10 15:38:45 -070045#include "vk_safe_struct.h"
Tobin Ehlis0b99d032015-12-08 10:50:10 -070046
47struct layer_data {
Tobin Ehlis0b99d032015-12-08 10:50:10 -070048 bool wsi_enabled;
49
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070050 layer_data() :
51 wsi_enabled(false)
52 {};
Tobin Ehlis0b99d032015-12-08 10:50:10 -070053};
54
55struct instExts {
56 bool wsi_enabled;
Tobin Ehlis115790b2016-01-05 16:34:59 -070057 bool xlib_enabled;
58 bool xcb_enabled;
59 bool wayland_enabled;
60 bool mir_enabled;
61 bool android_enabled;
62 bool win32_enabled;
Tobin Ehlis0b99d032015-12-08 10:50:10 -070063};
64
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070065static std::unordered_map<void*, struct instExts> instanceExtMap;
66static std::unordered_map<void*, layer_data *> layer_data_map;
67static device_table_map unique_objects_device_table_map;
68static instance_table_map unique_objects_instance_table_map;
69// Structure to wrap returned non-dispatchable objects to guarantee they have unique handles
Tobin Ehlis0b99d032015-12-08 10:50:10 -070070// address of struct will be used as the unique handle
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070071struct VkUniqueObject
72{
Tobin Ehlis0b99d032015-12-08 10:50:10 -070073 uint64_t actualObject;
74};
75
Tobin Ehlis0b99d032015-12-08 10:50:10 -070076// Handle CreateInstance
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070077static void createInstanceRegisterExtensions(const VkInstanceCreateInfo* pCreateInfo, VkInstance instance)
78{
Tobin Ehlis0b99d032015-12-08 10:50:10 -070079 uint32_t i;
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070080 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(unique_objects_instance_table_map, instance);
Tobin Ehlis0b99d032015-12-08 10:50:10 -070081 PFN_vkGetInstanceProcAddr gpa = pDisp->GetInstanceProcAddr;
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070082 pDisp->GetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR) gpa(instance, "vkGetPhysicalDeviceSurfaceSupportKHR");
83 pDisp->GetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR) gpa(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
84 pDisp->GetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR) gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR");
85 pDisp->GetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR) gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR");
Tobin Ehlis115790b2016-01-05 16:34:59 -070086#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070087 pDisp->CreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR) gpa(instance, "vkCreateWin32SurfaceKHR");
88 pDisp->GetPhysicalDeviceWin32PresentationSupportKHR = (PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR) gpa(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -070089#endif // VK_USE_PLATFORM_WIN32_KHR
90#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070091 pDisp->CreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR) gpa(instance, "vkCreateXcbSurfaceKHR");
92 pDisp->GetPhysicalDeviceXcbPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR) gpa(instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -070093#endif // VK_USE_PLATFORM_XCB_KHR
94#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070095 pDisp->CreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR) gpa(instance, "vkCreateXlibSurfaceKHR");
96 pDisp->GetPhysicalDeviceXlibPresentationSupportKHR = (PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR) gpa(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -070097#endif // VK_USE_PLATFORM_XLIB_KHR
98#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -070099 pDisp->CreateMirSurfaceKHR = (PFN_vkCreateMirSurfaceKHR) gpa(instance, "vkCreateMirSurfaceKHR");
100 pDisp->GetPhysicalDeviceMirPresentationSupportKHR = (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
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700103 pDisp->CreateWaylandSurfaceKHR = (PFN_vkCreateWaylandSurfaceKHR) gpa(instance, "vkCreateWaylandSurfaceKHR");
104 pDisp->GetPhysicalDeviceWaylandPresentationSupportKHR = (PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR) gpa(instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700105#endif // VK_USE_PLATFORM_WAYLAND_KHR
106#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700107 pDisp->CreateAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR) gpa(instance, "vkCreateAndroidSurfaceKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700108#endif // VK_USE_PLATFORM_ANDROID_KHR
109
Tobin Ehlis115790b2016-01-05 16:34:59 -0700110 instanceExtMap[pDisp] = {};
Jon Ashburna4ae48b2016-01-11 13:12:43 -0700111 for (i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700112 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700113 instanceExtMap[pDisp].wsi_enabled = true;
Tobin Ehlis115790b2016-01-05 16:34:59 -0700114#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700115 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis115790b2016-01-05 16:34:59 -0700116 instanceExtMap[pDisp].xlib_enabled = true;
117#endif
118#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700119 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis115790b2016-01-05 16:34:59 -0700120 instanceExtMap[pDisp].xcb_enabled = true;
121#endif
122#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700123 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis115790b2016-01-05 16:34:59 -0700124 instanceExtMap[pDisp].wayland_enabled = true;
125#endif
126#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700127 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis115790b2016-01-05 16:34:59 -0700128 instanceExtMap[pDisp].mir_enabled = true;
129#endif
130#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700131 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis115790b2016-01-05 16:34:59 -0700132 instanceExtMap[pDisp].android_enabled = true;
133#endif
134#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700135 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0)
Tobin Ehlis115790b2016-01-05 16:34:59 -0700136 instanceExtMap[pDisp].win32_enabled = true;
137#endif
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700138 }
139}
140
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700141VkResult
142explicit_CreateInstance(
143 const VkInstanceCreateInfo *pCreateInfo,
144 const VkAllocationCallbacks *pAllocator,
145 VkInstance *pInstance)
146{
147 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700148
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700149 assert(chain_info->u.pLayerInfo);
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700150 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
151 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance) fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700152 if (fpCreateInstance == NULL) {
153 return VK_ERROR_INITIALIZATION_FAILED;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700154 }
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700155
156 // Advance the link info for the next element on the chain
157 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
158
159 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
160 if (result != VK_SUCCESS) {
161 return result;
162 }
163
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700164 initInstanceTable(*pInstance, fpGetInstanceProcAddr, unique_objects_instance_table_map);
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700165
166 createInstanceRegisterExtensions(pCreateInfo, *pInstance);
167
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700168 return result;
169}
170
171// Handle CreateDevice
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700172static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
173{
174 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
175 VkLayerDispatchTable *pDisp = get_dispatch_table(unique_objects_device_table_map, device);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700176 PFN_vkGetDeviceProcAddr gpa = pDisp->GetDeviceProcAddr;
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700177 pDisp->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR) gpa(device, "vkCreateSwapchainKHR");
178 pDisp->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR) gpa(device, "vkDestroySwapchainKHR");
179 pDisp->GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR) gpa(device, "vkGetSwapchainImagesKHR");
180 pDisp->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR) gpa(device, "vkAcquireNextImageKHR");
181 pDisp->QueuePresentKHR = (PFN_vkQueuePresentKHR) gpa(device, "vkQueuePresentKHR");
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700182 my_device_data->wsi_enabled = false;
Jon Ashburna4ae48b2016-01-11 13:12:43 -0700183 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700184 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0)
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700185 my_device_data->wsi_enabled = true;
186 }
187}
188
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700189VkResult
190explicit_CreateDevice(
191 VkPhysicalDevice gpu,
192 const VkDeviceCreateInfo *pCreateInfo,
193 const VkAllocationCallbacks *pAllocator,
194 VkDevice *pDevice)
195{
196 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700197
198 assert(chain_info->u.pLayerInfo);
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700199 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
200 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
201 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice) fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700202 if (fpCreateDevice == NULL) {
203 return VK_ERROR_INITIALIZATION_FAILED;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700204 }
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700205
206 // Advance the link info for the next element on the chain
207 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
208
209 VkResult result = fpCreateDevice(gpu, pCreateInfo, pAllocator, pDevice);
210 if (result != VK_SUCCESS) {
211 return result;
212 }
213
214 // Setup layer's device dispatch table
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700215 initDeviceTable(*pDevice, fpGetDeviceProcAddr, unique_objects_device_table_map);
Courtney Goeltzenleuchter2bdf6da2016-01-08 12:18:43 -0700216
217 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
218
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700219 return result;
220}
221
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700222VkResult explicit_QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence)
223{
224// UNWRAP USES:
225// 0 : fence,VkFence
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700226 if (VK_NULL_HANDLE != fence) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700227 fence = (VkFence)((VkUniqueObject*)fence)->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700228 }
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700229// waitSemaphoreCount : pSubmits[submitCount]->pWaitSemaphores,VkSemaphore
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700230 std::vector<VkSemaphore> original_pWaitSemaphores = {};
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700231// signalSemaphoreCount : pSubmits[submitCount]->pSignalSemaphores,VkSemaphore
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700232 std::vector<VkSemaphore> original_pSignalSemaphores = {};
233 if (pSubmits) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700234 for (uint32_t index0=0; index0<submitCount; ++index0) {
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700235 if (pSubmits[index0].pWaitSemaphores) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700236 for (uint32_t index1=0; index1<pSubmits[index0].waitSemaphoreCount; ++index1) {
237 VkSemaphore** ppSemaphore = (VkSemaphore**)&(pSubmits[index0].pWaitSemaphores);
238 original_pWaitSemaphores.push_back(pSubmits[index0].pWaitSemaphores[index1]);
239 *(ppSemaphore[index1]) = (VkSemaphore)((VkUniqueObject*)pSubmits[index0].pWaitSemaphores[index1])->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700240 }
241 }
242 if (pSubmits[index0].pSignalSemaphores) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700243 for (uint32_t index1=0; index1<pSubmits[index0].signalSemaphoreCount; ++index1) {
244 VkSemaphore** ppSemaphore = (VkSemaphore**)&(pSubmits[index0].pSignalSemaphores);
245 original_pSignalSemaphores.push_back(pSubmits[index0].pSignalSemaphores[index1]);
246 *(ppSemaphore[index1]) = (VkSemaphore)((VkUniqueObject*)pSubmits[index0].pSignalSemaphores[index1])->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700247 }
248 }
249 }
250 }
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700251 VkResult result = get_dispatch_table(unique_objects_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700252 if (pSubmits) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700253 for (uint32_t index0=0; index0<submitCount; ++index0) {
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700254 if (pSubmits[index0].pWaitSemaphores) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700255 for (uint32_t index1=0; index1<pSubmits[index0].waitSemaphoreCount; ++index1) {
256 VkSemaphore** ppSemaphore = (VkSemaphore**)&(pSubmits[index0].pWaitSemaphores);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700257 *(ppSemaphore[index1]) = original_pWaitSemaphores[index1];
258 }
259 }
260 if (pSubmits[index0].pSignalSemaphores) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700261 for (uint32_t index1=0; index1<pSubmits[index0].signalSemaphoreCount; ++index1) {
262 VkSemaphore** ppSemaphore = (VkSemaphore**)&(pSubmits[index0].pSignalSemaphores);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700263 *(ppSemaphore[index1]) = original_pSignalSemaphores[index1];
264 }
265 }
266 }
267 }
268 return result;
269}
270
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700271VkResult explicit_QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence)
272{
273// UNWRAP USES:
274// 0 : pBindInfo[bindInfoCount]->pBufferBinds[bufferBindCount]->buffer,VkBuffer, pBindInfo[bindInfoCount]->pBufferBinds[bufferBindCount]->pBinds[bindCount]->memory,VkDeviceMemory, pBindInfo[bindInfoCount]->pImageOpaqueBinds[imageOpaqueBindCount]->image,VkImage, pBindInfo[bindInfoCount]->pImageOpaqueBinds[imageOpaqueBindCount]->pBinds[bindCount]->memory,VkDeviceMemory, pBindInfo[bindInfoCount]->pImageBinds[imageBindCount]->image,VkImage, pBindInfo[bindInfoCount]->pImageBinds[imageBindCount]->pBinds[bindCount]->memory,VkDeviceMemory
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700275 std::vector<VkBuffer> original_buffer = {};
276 std::vector<VkDeviceMemory> original_memory1 = {};
277 std::vector<VkImage> original_image1 = {};
278 std::vector<VkDeviceMemory> original_memory2 = {};
279 std::vector<VkImage> original_image2 = {};
280 std::vector<VkDeviceMemory> original_memory3 = {};
281 std::vector<VkSemaphore> original_pWaitSemaphores = {};
282 std::vector<VkSemaphore> original_pSignalSemaphores = {};
283 if (pBindInfo) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700284 for (uint32_t index0=0; index0<bindInfoCount; ++index0) {
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700285 if (pBindInfo[index0].pBufferBinds) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700286 for (uint32_t index1=0; index1<pBindInfo[index0].bufferBindCount; ++index1) {
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700287 if (pBindInfo[index0].pBufferBinds[index1].buffer) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700288 VkBuffer* pBuffer = (VkBuffer*)&(pBindInfo[index0].pBufferBinds[index1].buffer);
289 original_buffer.push_back(pBindInfo[index0].pBufferBinds[index1].buffer);
290 *(pBuffer) = (VkBuffer)((VkUniqueObject*)pBindInfo[index0].pBufferBinds[index1].buffer)->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700291 }
292 if (pBindInfo[index0].pBufferBinds[index1].pBinds) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700293 for (uint32_t index2=0; index2<pBindInfo[index0].pBufferBinds[index1].bindCount; ++index2) {
294 if (pBindInfo[index0].pBufferBinds[index1].pBinds[index2].memory) {
295 VkDeviceMemory* pDeviceMemory = (VkDeviceMemory*)&(pBindInfo[index0].pBufferBinds[index1].pBinds[index2].memory);
296 original_memory1.push_back(pBindInfo[index0].pBufferBinds[index1].pBinds[index2].memory);
297 *(pDeviceMemory) = (VkDeviceMemory)((VkUniqueObject*)pBindInfo[index0].pBufferBinds[index1].pBinds[index2].memory)->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700298 }
299 }
300 }
301 }
302 }
303 if (pBindInfo[index0].pImageOpaqueBinds) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700304 for (uint32_t index1=0; index1<pBindInfo[index0].imageOpaqueBindCount; ++index1) {
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700305 if (pBindInfo[index0].pImageOpaqueBinds[index1].image) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700306 VkImage* pImage = (VkImage*)&(pBindInfo[index0].pImageOpaqueBinds[index1].image);
307 original_image1.push_back(pBindInfo[index0].pImageOpaqueBinds[index1].image);
308 *(pImage) = (VkImage)((VkUniqueObject*)pBindInfo[index0].pImageOpaqueBinds[index1].image)->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700309 }
310 if (pBindInfo[index0].pImageOpaqueBinds[index1].pBinds) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700311 for (uint32_t index2=0; index2<pBindInfo[index0].pImageOpaqueBinds[index1].bindCount; ++index2) {
312 if (pBindInfo[index0].pImageOpaqueBinds[index1].pBinds[index2].memory) {
313 VkDeviceMemory* pDeviceMemory = (VkDeviceMemory*)&(pBindInfo[index0].pImageOpaqueBinds[index1].pBinds[index2].memory);
314 original_memory2.push_back(pBindInfo[index0].pImageOpaqueBinds[index1].pBinds[index2].memory);
315 *(pDeviceMemory) = (VkDeviceMemory)((VkUniqueObject*)pBindInfo[index0].pImageOpaqueBinds[index1].pBinds[index2].memory)->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700316 }
317 }
318 }
319 }
320 }
321 if (pBindInfo[index0].pImageBinds) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700322 for (uint32_t index1=0; index1<pBindInfo[index0].imageBindCount; ++index1) {
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700323 if (pBindInfo[index0].pImageBinds[index1].image) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700324 VkImage* pImage = (VkImage*)&(pBindInfo[index0].pImageBinds[index1].image);
325 original_image2.push_back(pBindInfo[index0].pImageBinds[index1].image);
326 *(pImage) = (VkImage)((VkUniqueObject*)pBindInfo[index0].pImageBinds[index1].image)->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700327 }
328 if (pBindInfo[index0].pImageBinds[index1].pBinds) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700329 for (uint32_t index2=0; index2<pBindInfo[index0].pImageBinds[index1].bindCount; ++index2) {
330 if (pBindInfo[index0].pImageBinds[index1].pBinds[index2].memory) {
331 VkDeviceMemory* pDeviceMemory = (VkDeviceMemory*)&(pBindInfo[index0].pImageBinds[index1].pBinds[index2].memory);
332 original_memory3.push_back(pBindInfo[index0].pImageBinds[index1].pBinds[index2].memory);
333 *(pDeviceMemory) = (VkDeviceMemory)((VkUniqueObject*)pBindInfo[index0].pImageBinds[index1].pBinds[index2].memory)->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700334 }
335 }
336 }
337 }
338 }
339 if (pBindInfo[index0].pWaitSemaphores) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700340 for (uint32_t index1=0; index1<pBindInfo[index0].waitSemaphoreCount; ++index1) {
341 VkSemaphore** ppSemaphore = (VkSemaphore**)&(pBindInfo[index0].pWaitSemaphores);
342 original_pWaitSemaphores.push_back(pBindInfo[index0].pWaitSemaphores[index1]);
343 *(ppSemaphore[index1]) = (VkSemaphore)((VkUniqueObject*)pBindInfo[index0].pWaitSemaphores[index1])->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700344 }
345 }
346 if (pBindInfo[index0].pSignalSemaphores) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700347 for (uint32_t index1=0; index1<pBindInfo[index0].signalSemaphoreCount; ++index1) {
348 VkSemaphore** ppSemaphore = (VkSemaphore**)&(pBindInfo[index0].pSignalSemaphores);
349 original_pSignalSemaphores.push_back(pBindInfo[index0].pSignalSemaphores[index1]);
350 *(ppSemaphore[index1]) = (VkSemaphore)((VkUniqueObject*)pBindInfo[index0].pSignalSemaphores[index1])->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700351 }
352 }
353 }
354 }
355 if (VK_NULL_HANDLE != fence) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700356 fence = (VkFence)((VkUniqueObject*)fence)->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700357 }
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700358 VkResult result = get_dispatch_table(unique_objects_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700359 if (pBindInfo) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700360 for (uint32_t index0=0; index0<bindInfoCount; ++index0) {
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700361 if (pBindInfo[index0].pBufferBinds) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700362 for (uint32_t index1=0; index1<pBindInfo[index0].bufferBindCount; ++index1) {
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700363 if (pBindInfo[index0].pBufferBinds[index1].buffer) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700364 VkBuffer* pBuffer = (VkBuffer*)&(pBindInfo[index0].pBufferBinds[index1].buffer);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700365 *(pBuffer) = original_buffer[index1];
366 }
367 if (pBindInfo[index0].pBufferBinds[index1].pBinds) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700368 for (uint32_t index2=0; index2<pBindInfo[index0].pBufferBinds[index1].bindCount; ++index2) {
369 if (pBindInfo[index0].pBufferBinds[index1].pBinds[index2].memory) {
370 VkDeviceMemory* pDeviceMemory = (VkDeviceMemory*)&(pBindInfo[index0].pBufferBinds[index1].pBinds[index2].memory);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700371 *(pDeviceMemory) = original_memory1[index2];
372 }
373 }
374 }
375 }
376 }
377 if (pBindInfo[index0].pImageOpaqueBinds) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700378 for (uint32_t index1=0; index1<pBindInfo[index0].imageOpaqueBindCount; ++index1) {
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700379 if (pBindInfo[index0].pImageOpaqueBinds[index1].image) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700380 VkImage* pImage = (VkImage*)&(pBindInfo[index0].pImageOpaqueBinds[index1].image);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700381 *(pImage) = original_image1[index1];
382 }
383 if (pBindInfo[index0].pImageOpaqueBinds[index1].pBinds) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700384 for (uint32_t index2=0; index2<pBindInfo[index0].pImageOpaqueBinds[index1].bindCount; ++index2) {
385 if (pBindInfo[index0].pImageOpaqueBinds[index1].pBinds[index2].memory) {
386 VkDeviceMemory* pDeviceMemory = (VkDeviceMemory*)&(pBindInfo[index0].pImageOpaqueBinds[index1].pBinds[index2].memory);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700387 *(pDeviceMemory) = original_memory2[index2];
388 }
389 }
390 }
391 }
392 }
393 if (pBindInfo[index0].pImageBinds) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700394 for (uint32_t index1=0; index1<pBindInfo[index0].imageBindCount; ++index1) {
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700395 if (pBindInfo[index0].pImageBinds[index1].image) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700396 VkImage* pImage = (VkImage*)&(pBindInfo[index0].pImageBinds[index1].image);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700397 *(pImage) = original_image2[index1];
398 }
399 if (pBindInfo[index0].pImageBinds[index1].pBinds) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700400 for (uint32_t index2=0; index2<pBindInfo[index0].pImageBinds[index1].bindCount; ++index2) {
401 if (pBindInfo[index0].pImageBinds[index1].pBinds[index2].memory) {
402 VkDeviceMemory* pDeviceMemory = (VkDeviceMemory*)&(pBindInfo[index0].pImageBinds[index1].pBinds[index2].memory);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700403 *(pDeviceMemory) = original_memory3[index2];
404 }
405 }
406 }
407 }
408 }
409 if (pBindInfo[index0].pWaitSemaphores) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700410 for (uint32_t index1=0; index1<pBindInfo[index0].waitSemaphoreCount; ++index1) {
411 VkSemaphore** ppSemaphore = (VkSemaphore**)&(pBindInfo[index0].pWaitSemaphores);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700412 *(ppSemaphore[index1]) = original_pWaitSemaphores[index1];
413 }
414 }
415 if (pBindInfo[index0].pSignalSemaphores) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700416 for (uint32_t index1=0; index1<pBindInfo[index0].signalSemaphoreCount; ++index1) {
417 VkSemaphore** ppSemaphore = (VkSemaphore**)&(pBindInfo[index0].pSignalSemaphores);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700418 *(ppSemaphore[index1]) = original_pSignalSemaphores[index1];
419 }
420 }
421 }
422 }
423 return result;
424}
425
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700426VkResult explicit_CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
427{
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700428// STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'stage': {'module': 'VkShaderModule'}, 'layout': 'VkPipelineLayout', 'basePipelineHandle': 'VkPipeline'}}
429//LOCAL DECLS:{'pCreateInfos': 'VkComputePipelineCreateInfo*'}
430 safe_VkComputePipelineCreateInfo* local_pCreateInfos = NULL;
431 if (pCreateInfos) {
432 local_pCreateInfos = new safe_VkComputePipelineCreateInfo[createInfoCount];
433 for (uint32_t idx0=0; idx0<createInfoCount; ++idx0) {
434 local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]);
435 if (pCreateInfos[idx0].basePipelineHandle) {
436 local_pCreateInfos[idx0].basePipelineHandle = (VkPipeline)((VkUniqueObject*)pCreateInfos[idx0].basePipelineHandle)->actualObject;
437 }
438 if (pCreateInfos[idx0].layout) {
439 local_pCreateInfos[idx0].layout = (VkPipelineLayout)((VkUniqueObject*)pCreateInfos[idx0].layout)->actualObject;
440 }
441 if (pCreateInfos[idx0].stage.module) {
442 local_pCreateInfos[idx0].stage.module = (VkShaderModule)((VkUniqueObject*)pCreateInfos[idx0].stage.module)->actualObject;
443 }
444 }
445 }
446 if (pipelineCache) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700447 pipelineCache = (VkPipelineCache)((VkUniqueObject*)pipelineCache)->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700448 }
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700449// CODEGEN : file /usr/local/google/home/tobine/vulkan_work/LoaderAndTools/vk-layer-generate.py line #1671
450 VkResult result = get_dispatch_table(unique_objects_device_table_map, device)->CreateComputePipelines(device, pipelineCache, createInfoCount, (const VkComputePipelineCreateInfo*)local_pCreateInfos, pAllocator, pPipelines);
Eric Engestrom00a89732016-02-21 19:58:09 +0000451 delete[] local_pCreateInfos;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700452 if (VK_SUCCESS == result) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700453 VkUniqueObject* pUO = NULL;
454 for (uint32_t i=0; i<createInfoCount; ++i) {
Tobin Ehlis115790b2016-01-05 16:34:59 -0700455 pUO = new VkUniqueObject();
456 pUO->actualObject = (uint64_t)pPipelines[i];
457 pPipelines[i] = (VkPipeline)pUO;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700458 }
459 }
460 return result;
461}
462
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700463VkResult explicit_CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
464{
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700465// STRUCT USES:{'pipelineCache': 'VkPipelineCache', 'pCreateInfos[createInfoCount]': {'layout': 'VkPipelineLayout', 'pStages[stageCount]': {'module': 'VkShaderModule'}, 'renderPass': 'VkRenderPass', 'basePipelineHandle': 'VkPipeline'}}
466//LOCAL DECLS:{'pCreateInfos': 'VkGraphicsPipelineCreateInfo*'}
467 safe_VkGraphicsPipelineCreateInfo* local_pCreateInfos = NULL;
468 if (pCreateInfos) {
469 local_pCreateInfos = new safe_VkGraphicsPipelineCreateInfo[createInfoCount];
470 for (uint32_t idx0=0; idx0<createInfoCount; ++idx0) {
471 local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]);
472 if (pCreateInfos[idx0].basePipelineHandle) {
473 local_pCreateInfos[idx0].basePipelineHandle = (VkPipeline)((VkUniqueObject*)pCreateInfos[idx0].basePipelineHandle)->actualObject;
474 }
475 if (pCreateInfos[idx0].layout) {
476 local_pCreateInfos[idx0].layout = (VkPipelineLayout)((VkUniqueObject*)pCreateInfos[idx0].layout)->actualObject;
477 }
478 if (pCreateInfos[idx0].pStages) {
479 for (uint32_t idx1=0; idx1<pCreateInfos[idx0].stageCount; ++idx1) {
480 if (pCreateInfos[idx0].pStages[idx1].module) {
481 local_pCreateInfos[idx0].pStages[idx1].module = (VkShaderModule)((VkUniqueObject*)pCreateInfos[idx0].pStages[idx1].module)->actualObject;
482 }
483 }
484 }
485 if (pCreateInfos[idx0].renderPass) {
486 local_pCreateInfos[idx0].renderPass = (VkRenderPass)((VkUniqueObject*)pCreateInfos[idx0].renderPass)->actualObject;
487 }
488 }
489 }
490 if (pipelineCache) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700491 pipelineCache = (VkPipelineCache)((VkUniqueObject*)pipelineCache)->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700492 }
Tobin Ehlis9aac5552016-02-10 15:38:45 -0700493// CODEGEN : file /usr/local/google/home/tobine/vulkan_work/LoaderAndTools/vk-layer-generate.py line #1671
494 VkResult result = get_dispatch_table(unique_objects_device_table_map, device)->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, (const VkGraphicsPipelineCreateInfo*)local_pCreateInfos, pAllocator, pPipelines);
Eric Engestrom00a89732016-02-21 19:58:09 +0000495 delete[] local_pCreateInfos;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700496 if (VK_SUCCESS == result) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700497 VkUniqueObject* pUO = NULL;
498 for (uint32_t i=0; i<createInfoCount; ++i) {
Tobin Ehlis115790b2016-01-05 16:34:59 -0700499 pUO = new VkUniqueObject();
500 pUO->actualObject = (uint64_t)pPipelines[i];
501 pPipelines[i] = (VkPipeline)pUO;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700502 }
503 }
504 return result;
505}
506
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700507VkResult explicit_GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages)
508{
509// UNWRAP USES:
510// 0 : swapchain,VkSwapchainKHR, pSwapchainImages,VkImage
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700511 if (VK_NULL_HANDLE != swapchain) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700512 swapchain = (VkSwapchainKHR)((VkUniqueObject*)swapchain)->actualObject;
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700513 }
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700514 VkResult result = get_dispatch_table(unique_objects_device_table_map, device)->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700515 // TODO : Need to add corresponding code to delete these images
516 if (VK_SUCCESS == result) {
517 if ((*pSwapchainImageCount > 0) && pSwapchainImages) {
Mark Lobodzinskib838dc02016-02-03 09:57:14 -0700518 std::vector<VkUniqueObject*> uniqueImages = {};
519 for (uint32_t i=0; i<*pSwapchainImageCount; ++i) {
Tobin Ehlis0b99d032015-12-08 10:50:10 -0700520 uniqueImages.push_back(new VkUniqueObject());
521 uniqueImages[i]->actualObject = (uint64_t)pSwapchainImages[i];
522 pSwapchainImages[i] = (VkImage)uniqueImages[i];
523 }
524 }
525 }
526 return result;
527}