blob: 1db6b6f29c12561e71301dc6018ae9ba8ae30048 [file] [log] [blame]
Jon Ashburn79113cc2014-12-01 14:22:40 -07001/*
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002 * Vulkan
Jon Ashburn79113cc2014-12-01 14:22:40 -07003 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 */
25
26#include <string.h>
27#include <stdlib.h>
28#include <assert.h>
29#include <unordered_map>
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060030#include "vk_loader_platform.h"
Tobin Ehlis0c6f9ee2015-07-03 09:42:57 -060031#include "vk_layer.h"
Jon Ashburn1e41a442015-08-12 16:43:01 -060032#include "vk_layer_table.h"
Jon Ashburn79113cc2014-12-01 14:22:40 -070033
Jon Ashburn79113cc2014-12-01 14:22:40 -070034#ifdef __cplusplus
35extern "C" {
36#endif
37
Jon Ashburn1e41a442015-08-12 16:43:01 -060038
39static device_table_map multi1_device_table_map;
40/******************************** Layer multi1 functions **************************/
41
Courtney Goeltzenleuchter75337d92015-07-06 21:32:03 -060042/* hook DestroyDevice to remove tableMap entry */
Mark Lobodzinski2141f652015-09-07 13:59:43 -060043VK_LAYER_EXPORT void VKAPI multi1DestroyDevice(VkDevice device)
Jon Ashburn9a8a2e22015-05-19 16:34:53 -060044{
Jon Ashburn1e41a442015-08-12 16:43:01 -060045 VkLayerDispatchTable *pDisp = get_dispatch_table(multi1_device_table_map, device);
46 dispatch_key key = get_dispatch_key(device);
Jon Ashburn9a8a2e22015-05-19 16:34:53 -060047
Jon Ashburn1e41a442015-08-12 16:43:01 -060048 printf("At start of multi1 layer vkDestroyDevice()\n");
Mark Lobodzinski2141f652015-09-07 13:59:43 -060049 pDisp->DestroyDevice(device);
Jon Ashburn1e41a442015-08-12 16:43:01 -060050 multi1_device_table_map.erase(key);
51 printf("Completed multi1 layer vkDestroyDevice()\n");
Jon Ashburn9a8a2e22015-05-19 16:34:53 -060052}
53
Jon Ashburn95a77ba2015-05-15 15:09:35 -060054VK_LAYER_EXPORT VkResult VKAPI multi1CreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, VkSampler* pSampler)
Jon Ashburn79113cc2014-12-01 14:22:40 -070055{
Jon Ashburn1e41a442015-08-12 16:43:01 -060056 VkLayerDispatchTable *pDisp = get_dispatch_table(multi1_device_table_map, device);
Jon Ashburn95a77ba2015-05-15 15:09:35 -060057
58 printf("At start of multi1 layer vkCreateSampler()\n");
Jon Ashburn1e41a442015-08-12 16:43:01 -060059 VkResult result = pDisp->CreateSampler(device, pCreateInfo, pSampler);
Jon Ashburn95a77ba2015-05-15 15:09:35 -060060 printf("Completed multi1 layer vkCreateSampler()\n");
Jon Ashburn79113cc2014-12-01 14:22:40 -070061 return result;
62}
63
Jon Ashburnc669cc62015-07-09 15:02:25 -060064VK_LAYER_EXPORT VkResult VKAPI multi1CreateGraphicsPipelines(
65 VkDevice device,
66 VkPipelineCache pipelineCache,
67 uint32_t count,
68 const VkGraphicsPipelineCreateInfo* pCreateInfos,
69 VkPipeline* pPipelines)
Jon Ashburn79113cc2014-12-01 14:22:40 -070070{
Jon Ashburn1e41a442015-08-12 16:43:01 -060071 VkLayerDispatchTable *pDisp = get_dispatch_table(multi1_device_table_map, device);
Jon Ashburn79113cc2014-12-01 14:22:40 -070072
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060073 printf("At start of multi1 layer vkCreateGraphicsPipeline()\n");
Jon Ashburn1e41a442015-08-12 16:43:01 -060074 VkResult result = pDisp->CreateGraphicsPipelines(device, pipelineCache, count, pCreateInfos, pPipelines);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060075 printf("Completed multi1 layer vkCreateGraphicsPipeline()\n");
Jon Ashburn79113cc2014-12-01 14:22:40 -070076 return result;
77}
78
Jon Ashburn1e41a442015-08-12 16:43:01 -060079VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI multi1GetDeviceProcAddr(VkDevice device, const char* pName)
Jon Ashburn79113cc2014-12-01 14:22:40 -070080{
Chia-I Wub665d942015-01-05 09:41:27 +080081
Jon Ashburn8d1b0b52015-05-18 13:20:15 -060082 if (device == NULL)
Jon Ashburn79113cc2014-12-01 14:22:40 -070083 return NULL;
Chia-I Wub665d942015-01-05 09:41:27 +080084
Jon Ashburn1e41a442015-08-12 16:43:01 -060085 /* loader uses this to force layer initialization; device object is wrapped */
86 if (!strcmp(pName, "multi1GetDeviceProcAddr") || !strcmp(pName, "vkGetDeviceProcAddr")) {
87 initDeviceTable(multi1_device_table_map, (const VkBaseLayerObject *) device);
88 return (PFN_vkVoidFunction) multi1GetDeviceProcAddr;
Jon Ashburn8fd08252015-05-28 16:25:02 -060089 }
Jon Ashburn1e41a442015-08-12 16:43:01 -060090
Jon Ashburn9a8a2e22015-05-19 16:34:53 -060091 if (!strcmp("vkDestroyDevice", pName))
Jon Ashburn1e41a442015-08-12 16:43:01 -060092 return (PFN_vkVoidFunction) multi1DestroyDevice;
Jon Ashburn95a77ba2015-05-15 15:09:35 -060093 if (!strcmp("vkCreateSampler", pName))
Jon Ashburn1e41a442015-08-12 16:43:01 -060094 return (PFN_vkVoidFunction) multi1CreateSampler;
Jon Ashburnc669cc62015-07-09 15:02:25 -060095 if (!strcmp("vkCreateGraphicsPipelines", pName))
Jon Ashburn1e41a442015-08-12 16:43:01 -060096 return (PFN_vkVoidFunction) multi1CreateGraphicsPipelines;
Jon Ashburn79113cc2014-12-01 14:22:40 -070097 else {
Jon Ashburn1e41a442015-08-12 16:43:01 -060098 VkLayerDispatchTable *pTable = get_dispatch_table(multi1_device_table_map, device);
Jon Ashburn8fd08252015-05-28 16:25:02 -060099 if (pTable->GetDeviceProcAddr == NULL)
Jon Ashburn79113cc2014-12-01 14:22:40 -0700100 return NULL;
Jon Ashburn8fd08252015-05-28 16:25:02 -0600101 return pTable->GetDeviceProcAddr(device, pName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -0600102 }
103}
104
Jon Ashburnf6b33db2015-05-05 14:22:52 -0600105
Jon Ashburn1e41a442015-08-12 16:43:01 -0600106static instance_table_map multi2_instance_table_map;
Jon Ashburn79113cc2014-12-01 14:22:40 -0700107/******************************** Layer multi2 functions **************************/
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600108VK_LAYER_EXPORT VkResult VKAPI multi2EnumeratePhysicalDevices(
109 VkInstance instance,
110 uint32_t* pPhysicalDeviceCount,
111 VkPhysicalDevice* pPhysicalDevices)
112{
Jon Ashburn1e41a442015-08-12 16:43:01 -0600113 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(multi2_instance_table_map, instance);
Jon Ashburnfe7ff9c2015-05-15 16:40:25 -0600114
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600115 printf("At start of wrapped multi2 vkEnumeratePhysicalDevices()\n");
Jon Ashburn1e41a442015-08-12 16:43:01 -0600116 VkResult result = pDisp->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600117 printf("Completed multi2 layer vkEnumeratePhysicalDevices()\n");
118 return result;
119}
120
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -0600121VK_LAYER_EXPORT void VKAPI multi2GetPhysicalDeviceProperties(
Jon Ashburn1e41a442015-08-12 16:43:01 -0600122 VkPhysicalDevice physicalDevice,
123 VkPhysicalDeviceProperties* pProperties)
Jon Ashburn9a8a2e22015-05-19 16:34:53 -0600124{
Jon Ashburn1e41a442015-08-12 16:43:01 -0600125 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(multi2_instance_table_map, physicalDevice);
126 printf("At start of wrapped multi2 vkGetPhysicalDeviceProperties()\n");
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -0600127 pDisp->GetPhysicalDeviceProperties(physicalDevice, pProperties);
Jon Ashburn1e41a442015-08-12 16:43:01 -0600128 printf("Completed multi2 layer vkGetPhysicalDeviceProperties()\n");
Jon Ashburn1e41a442015-08-12 16:43:01 -0600129}
130
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -0600131VK_LAYER_EXPORT void VKAPI multi2GetPhysicalDeviceFeatures(
Jon Ashburn1e41a442015-08-12 16:43:01 -0600132 VkPhysicalDevice physicalDevice,
133 VkPhysicalDeviceFeatures* pFeatures)
134{
135 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(multi2_instance_table_map, physicalDevice);
136 printf("At start of wrapped multi2 vkGetPhysicalDeviceFeatures()\n");
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -0600137 pDisp->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
Jon Ashburn1e41a442015-08-12 16:43:01 -0600138 printf("Completed multi2 layer vkGetPhysicalDeviceFeatures()\n");
Jon Ashburn9a8a2e22015-05-19 16:34:53 -0600139}
140
141/* hook DestroyInstance to remove tableInstanceMap entry */
Mark Lobodzinski2141f652015-09-07 13:59:43 -0600142VK_LAYER_EXPORT void VKAPI multi2DestroyInstance(VkInstance instance)
Jon Ashburn9a8a2e22015-05-19 16:34:53 -0600143{
Jon Ashburn1e41a442015-08-12 16:43:01 -0600144 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(multi2_instance_table_map, instance);
145 dispatch_key key = get_dispatch_key(instance);
146
147 printf("At start of wrapped multi2 vkDestroyInstance()\n");
Mark Lobodzinski2141f652015-09-07 13:59:43 -0600148 pDisp->DestroyInstance(instance);
Jon Ashburn1e41a442015-08-12 16:43:01 -0600149 multi2_instance_table_map.erase(key);
150 printf("Completed multi2 layer vkDestroyInstance()\n");
Jon Ashburn9a8a2e22015-05-19 16:34:53 -0600151}
152
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -0600153VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI multi2GetInstanceProcAddr(VkInstance inst, const char* pName)
Jon Ashburnf6b33db2015-05-05 14:22:52 -0600154{
Jon Ashburnf6b33db2015-05-05 14:22:52 -0600155 if (inst == NULL)
156 return NULL;
157
Jon Ashburn1e41a442015-08-12 16:43:01 -0600158 /* loader uses this to force layer initialization; device object is wrapped */
159 if (!strcmp(pName, "multi2GetInstanceProcAddr") || !strcmp(pName, "vkGetInstanceProcAddr")) {
160 initInstanceTable(multi2_instance_table_map, (const VkBaseLayerObject *) inst);
161 return (PFN_vkVoidFunction) multi2GetInstanceProcAddr;
Jon Ashburn8fd08252015-05-28 16:25:02 -0600162 }
Jon Ashburn1e41a442015-08-12 16:43:01 -0600163
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600164 if (!strcmp("vkEnumeratePhysicalDevices", pName))
Jon Ashburn1e41a442015-08-12 16:43:01 -0600165 return (PFN_vkVoidFunction) multi2EnumeratePhysicalDevices;
166 if (!strcmp("GetPhysicalDeviceProperties", pName))
167 return (PFN_vkVoidFunction) multi2GetPhysicalDeviceProperties;
168 if (!strcmp("GetPhysicalDeviceFeatures", pName))
169 return (PFN_vkVoidFunction) multi2GetPhysicalDeviceFeatures;
Jon Ashburn9a8a2e22015-05-19 16:34:53 -0600170 if (!strcmp("vkDestroyInstance", pName))
Jon Ashburn1e41a442015-08-12 16:43:01 -0600171 return (PFN_vkVoidFunction) multi2DestroyInstance;
Jon Ashburnf6b33db2015-05-05 14:22:52 -0600172 else {
Jon Ashburn1e41a442015-08-12 16:43:01 -0600173 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(multi2_instance_table_map, inst);
Jon Ashburn8fd08252015-05-28 16:25:02 -0600174 if (pTable->GetInstanceProcAddr == NULL)
Jon Ashburnf6b33db2015-05-05 14:22:52 -0600175 return NULL;
Jon Ashburn8fd08252015-05-28 16:25:02 -0600176 return pTable->GetInstanceProcAddr(inst, pName);
Jon Ashburn79113cc2014-12-01 14:22:40 -0700177 }
Jon Ashburn79113cc2014-12-01 14:22:40 -0700178}
179
Jon Ashburn79113cc2014-12-01 14:22:40 -0700180#ifdef __cplusplus
181} //extern "C"
182#endif
183