blob: 3bbea8c55b478f18a0c4e0063d7839254963c6e6 [file] [log] [blame]
Jon Ashburn79113cc2014-12-01 14:22:40 -07001/*
Jon Ashburn79113cc2014-12-01 14:22:40 -07002 *
Courtney Goeltzenleuchterfcbe16f2015-10-29 13:50:34 -06003 * Copyright (C) 2015 Valve Corporation
Jon Ashburn79113cc2014-12-01 14:22:40 -07004 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included
13 * in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 *
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060023 * Author: Jon Ashburn <jon@lunarg.com>
24 *
Jon Ashburn79113cc2014-12-01 14:22:40 -070025 */
26
27#include <string.h>
28#include <stdlib.h>
29#include <assert.h>
30#include <unordered_map>
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060031#include "vk_loader_platform.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070032#include "vulkan/vk_layer.h"
Jon Ashburn1e41a442015-08-12 16:43:01 -060033#include "vk_layer_table.h"
Jon Ashburn79113cc2014-12-01 14:22:40 -070034
Jon Ashburn79113cc2014-12-01 14:22:40 -070035#ifdef __cplusplus
36extern "C" {
37#endif
38
Jon Ashburn1e41a442015-08-12 16:43:01 -060039
40static device_table_map multi1_device_table_map;
41/******************************** Layer multi1 functions **************************/
42
Courtney Goeltzenleuchter75337d92015-07-06 21:32:03 -060043/* hook DestroyDevice to remove tableMap entry */
Chia-I Wu9ab61502015-11-06 06:42:02 +080044VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL multi1DestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator)
Jon Ashburn9a8a2e22015-05-19 16:34:53 -060045{
Jon Ashburn1e41a442015-08-12 16:43:01 -060046 VkLayerDispatchTable *pDisp = get_dispatch_table(multi1_device_table_map, device);
47 dispatch_key key = get_dispatch_key(device);
Jon Ashburn9a8a2e22015-05-19 16:34:53 -060048
Jon Ashburn1e41a442015-08-12 16:43:01 -060049 printf("At start of multi1 layer vkDestroyDevice()\n");
Chia-I Wuf7458c52015-10-26 21:10:41 +080050 pDisp->DestroyDevice(device, pAllocator);
Jon Ashburn1e41a442015-08-12 16:43:01 -060051 multi1_device_table_map.erase(key);
52 printf("Completed multi1 layer vkDestroyDevice()\n");
Jon Ashburn9a8a2e22015-05-19 16:34:53 -060053}
54
Chia-I Wu9ab61502015-11-06 06:42:02 +080055VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL multi1CreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSampler* pSampler)
Jon Ashburn79113cc2014-12-01 14:22:40 -070056{
Jon Ashburn1e41a442015-08-12 16:43:01 -060057 VkLayerDispatchTable *pDisp = get_dispatch_table(multi1_device_table_map, device);
Jon Ashburn95a77ba2015-05-15 15:09:35 -060058
59 printf("At start of multi1 layer vkCreateSampler()\n");
Chia-I Wuf7458c52015-10-26 21:10:41 +080060 VkResult result = pDisp->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
Jon Ashburn95a77ba2015-05-15 15:09:35 -060061 printf("Completed multi1 layer vkCreateSampler()\n");
Jon Ashburn79113cc2014-12-01 14:22:40 -070062 return result;
63}
64
Chia-I Wu9ab61502015-11-06 06:42:02 +080065VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL multi1CreateGraphicsPipelines(
Jon Ashburnc669cc62015-07-09 15:02:25 -060066 VkDevice device,
67 VkPipelineCache pipelineCache,
68 uint32_t count,
69 const VkGraphicsPipelineCreateInfo* pCreateInfos,
Chia-I Wu3432a0c2015-10-27 18:04:07 +080070 const VkAllocationCallbacks* pAllocator,
Jon Ashburnc669cc62015-07-09 15:02:25 -060071 VkPipeline* pPipelines)
Jon Ashburn79113cc2014-12-01 14:22:40 -070072{
Jon Ashburn1e41a442015-08-12 16:43:01 -060073 VkLayerDispatchTable *pDisp = get_dispatch_table(multi1_device_table_map, device);
Jon Ashburn79113cc2014-12-01 14:22:40 -070074
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060075 printf("At start of multi1 layer vkCreateGraphicsPipeline()\n");
Chia-I Wuf7458c52015-10-26 21:10:41 +080076 VkResult result = pDisp->CreateGraphicsPipelines(device, pipelineCache, count, pCreateInfos, pAllocator, pPipelines);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060077 printf("Completed multi1 layer vkCreateGraphicsPipeline()\n");
Jon Ashburn79113cc2014-12-01 14:22:40 -070078 return result;
79}
80
Chia-I Wu9ab61502015-11-06 06:42:02 +080081VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL multi1GetDeviceProcAddr(VkDevice device, const char* pName)
Jon Ashburn79113cc2014-12-01 14:22:40 -070082{
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -070083 if (!strcmp(pName, "multi1GetDeviceProcAddr") || !strcmp(pName, "vkGetDeviceProcAddr"))
Jon Ashburn1e41a442015-08-12 16:43:01 -060084 return (PFN_vkVoidFunction) multi1GetDeviceProcAddr;
Jon Ashburn9a8a2e22015-05-19 16:34:53 -060085 if (!strcmp("vkDestroyDevice", pName))
Jon Ashburn1e41a442015-08-12 16:43:01 -060086 return (PFN_vkVoidFunction) multi1DestroyDevice;
Jon Ashburn95a77ba2015-05-15 15:09:35 -060087 if (!strcmp("vkCreateSampler", pName))
Jon Ashburn1e41a442015-08-12 16:43:01 -060088 return (PFN_vkVoidFunction) multi1CreateSampler;
Jon Ashburnc669cc62015-07-09 15:02:25 -060089 if (!strcmp("vkCreateGraphicsPipelines", pName))
Jon Ashburn1e41a442015-08-12 16:43:01 -060090 return (PFN_vkVoidFunction) multi1CreateGraphicsPipelines;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -070091
92 if (device == NULL)
93 return NULL;
94
95 VkLayerDispatchTable *pTable = get_dispatch_table(multi1_device_table_map, device);
96 if (pTable->GetDeviceProcAddr == NULL)
97 return NULL;
98 return pTable->GetDeviceProcAddr(device, pName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -060099}
100
Jon Ashburnf6b33db2015-05-05 14:22:52 -0600101
Jon Ashburn1e41a442015-08-12 16:43:01 -0600102static instance_table_map multi2_instance_table_map;
Jon Ashburn79113cc2014-12-01 14:22:40 -0700103/******************************** Layer multi2 functions **************************/
Chia-I Wu9ab61502015-11-06 06:42:02 +0800104VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL multi2EnumeratePhysicalDevices(
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600105 VkInstance instance,
106 uint32_t* pPhysicalDeviceCount,
107 VkPhysicalDevice* pPhysicalDevices)
108{
Jon Ashburn1e41a442015-08-12 16:43:01 -0600109 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(multi2_instance_table_map, instance);
Jon Ashburnfe7ff9c2015-05-15 16:40:25 -0600110
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600111 printf("At start of wrapped multi2 vkEnumeratePhysicalDevices()\n");
Jon Ashburn1e41a442015-08-12 16:43:01 -0600112 VkResult result = pDisp->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600113 printf("Completed multi2 layer vkEnumeratePhysicalDevices()\n");
114 return result;
115}
116
Chia-I Wu9ab61502015-11-06 06:42:02 +0800117VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL multi2GetPhysicalDeviceProperties(
Jon Ashburn1e41a442015-08-12 16:43:01 -0600118 VkPhysicalDevice physicalDevice,
119 VkPhysicalDeviceProperties* pProperties)
Jon Ashburn9a8a2e22015-05-19 16:34:53 -0600120{
Jon Ashburn1e41a442015-08-12 16:43:01 -0600121 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(multi2_instance_table_map, physicalDevice);
122 printf("At start of wrapped multi2 vkGetPhysicalDeviceProperties()\n");
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -0600123 pDisp->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Jon Ashburn1e41a442015-08-12 16:43:01 -0600124 printf("Completed multi2 layer vkGetPhysicalDeviceProperties()\n");
Jon Ashburn1e41a442015-08-12 16:43:01 -0600125}
126
Chia-I Wu9ab61502015-11-06 06:42:02 +0800127VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL multi2GetPhysicalDeviceFeatures(
Jon Ashburn1e41a442015-08-12 16:43:01 -0600128 VkPhysicalDevice physicalDevice,
129 VkPhysicalDeviceFeatures* pFeatures)
130{
131 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(multi2_instance_table_map, physicalDevice);
132 printf("At start of wrapped multi2 vkGetPhysicalDeviceFeatures()\n");
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -0600133 pDisp->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Jon Ashburn1e41a442015-08-12 16:43:01 -0600134 printf("Completed multi2 layer vkGetPhysicalDeviceFeatures()\n");
Jon Ashburn9a8a2e22015-05-19 16:34:53 -0600135}
136
137/* hook DestroyInstance to remove tableInstanceMap entry */
Chia-I Wu9ab61502015-11-06 06:42:02 +0800138VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL multi2DestroyInstance(VkInstance instance, const VkAllocationCallbacks* pAllocator)
Jon Ashburn9a8a2e22015-05-19 16:34:53 -0600139{
Jon Ashburn1e41a442015-08-12 16:43:01 -0600140 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(multi2_instance_table_map, instance);
141 dispatch_key key = get_dispatch_key(instance);
142
143 printf("At start of wrapped multi2 vkDestroyInstance()\n");
Chia-I Wuf7458c52015-10-26 21:10:41 +0800144 pDisp->DestroyInstance(instance, pAllocator);
Jon Ashburn1e41a442015-08-12 16:43:01 -0600145 multi2_instance_table_map.erase(key);
146 printf("Completed multi2 layer vkDestroyInstance()\n");
Jon Ashburn9a8a2e22015-05-19 16:34:53 -0600147}
148
Chia-I Wu9ab61502015-11-06 06:42:02 +0800149VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL multi2GetInstanceProcAddr(VkInstance inst, const char* pName)
Jon Ashburnf6b33db2015-05-05 14:22:52 -0600150{
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700151 if (!strcmp(pName, "multi2GetInstanceProcAddr") || !strcmp(pName, "vkGetInstanceProcAddr"))
Jon Ashburn1e41a442015-08-12 16:43:01 -0600152 return (PFN_vkVoidFunction) multi2GetInstanceProcAddr;
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600153 if (!strcmp("vkEnumeratePhysicalDevices", pName))
Jon Ashburn1e41a442015-08-12 16:43:01 -0600154 return (PFN_vkVoidFunction) multi2EnumeratePhysicalDevices;
155 if (!strcmp("GetPhysicalDeviceProperties", pName))
156 return (PFN_vkVoidFunction) multi2GetPhysicalDeviceProperties;
157 if (!strcmp("GetPhysicalDeviceFeatures", pName))
158 return (PFN_vkVoidFunction) multi2GetPhysicalDeviceFeatures;
Jon Ashburn9a8a2e22015-05-19 16:34:53 -0600159 if (!strcmp("vkDestroyInstance", pName))
Jon Ashburn1e41a442015-08-12 16:43:01 -0600160 return (PFN_vkVoidFunction) multi2DestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700161
162 if (inst == NULL)
163 return NULL;
164
165 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(multi2_instance_table_map, inst);
166 if (pTable->GetInstanceProcAddr == NULL)
167 return NULL;
168 return pTable->GetInstanceProcAddr(inst, pName);
Jon Ashburn79113cc2014-12-01 14:22:40 -0700169}
170
Jon Ashburn79113cc2014-12-01 14:22:40 -0700171#ifdef __cplusplus
172} //extern "C"
173#endif
174