blob: 4a033b9add6b55c3740f70f47e7f50cb4ac38a85 [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.
Michael Lentine0a369f62016-02-03 16:51:46 -06004 * Copyright (c) 2015-2016 Google, Inc.
Jon Ashburn9eed2892015-06-01 10:02:09 -06005 *
Jon Ashburn3ebf1252016-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
Jon Ashburn9eed2892015-06-01 10:02:09 -06009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Jon Ashburn9eed2892015-06-01 10:02:09 -060011 *
Jon Ashburn3ebf1252016-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.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060017 *
18 * Author: Tobin Ehlis <tobin@lunarg.com>
Jon Ashburn9eed2892015-06-01 10:02:09 -060019 */
20#include <assert.h>
21#include <unordered_map>
22#include "vk_dispatch_table_helper.h"
David Pinedo9316d3b2015-11-06 12:54:48 -070023#include "vulkan/vk_layer.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060024#include "vk_layer_table.h"
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060025static device_table_map tableMap;
26static instance_table_map tableInstanceMap;
Jon Ashburn9eed2892015-06-01 10:02:09 -060027
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060028// Map lookup must be thread safe
Jon Ashburn5484e0c2016-03-08 17:48:44 -070029VkLayerDispatchTable *device_dispatch_table(void *object) {
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060030 dispatch_key key = get_dispatch_key(object);
Jon Ashburn5484e0c2016-03-08 17:48:44 -070031 device_table_map::const_iterator it = tableMap.find((void *)key);
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060032 assert(it != tableMap.end() && "Not able to find device dispatch entry");
33 return it->second;
34}
35
Jon Ashburn5484e0c2016-03-08 17:48:44 -070036VkLayerInstanceDispatchTable *instance_dispatch_table(void *object) {
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060037 dispatch_key key = get_dispatch_key(object);
Jon Ashburn5484e0c2016-03-08 17:48:44 -070038 instance_table_map::const_iterator it = tableInstanceMap.find((void *)key);
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070039 assert(it != tableInstanceMap.end() && "Not able to find instance dispatch entry");
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060040 return it->second;
41}
42
Jon Ashburn5484e0c2016-03-08 17:48:44 -070043void destroy_dispatch_table(device_table_map &map, dispatch_key key) {
Michael Lentine0a369f62016-02-03 16:51:46 -060044 device_table_map::const_iterator it = map.find((void *)key);
Józef Kucia017c9302017-06-16 11:52:21 +020045 if (it != map.end()) {
46 delete it->second;
47 map.erase(it);
48 }
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060049}
50
Jon Ashburn5484e0c2016-03-08 17:48:44 -070051void destroy_dispatch_table(instance_table_map &map, dispatch_key key) {
Michael Lentine0a369f62016-02-03 16:51:46 -060052 instance_table_map::const_iterator it = map.find((void *)key);
Józef Kucia1a0b0e72017-06-16 11:52:21 +020053 if (it != map.end()) {
54 delete it->second;
55 map.erase(it);
56 }
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060057}
58
Jon Ashburn5484e0c2016-03-08 17:48:44 -070059void destroy_device_dispatch_table(dispatch_key key) { destroy_dispatch_table(tableMap, key); }
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060060
Jon Ashburn5484e0c2016-03-08 17:48:44 -070061void destroy_instance_dispatch_table(dispatch_key key) { destroy_dispatch_table(tableInstanceMap, key); }
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060062
Jon Ashburn5484e0c2016-03-08 17:48:44 -070063VkLayerDispatchTable *get_dispatch_table(device_table_map &map, void *object) {
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060064 dispatch_key key = get_dispatch_key(object);
Jon Ashburn5484e0c2016-03-08 17:48:44 -070065 device_table_map::const_iterator it = map.find((void *)key);
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060066 assert(it != map.end() && "Not able to find device dispatch entry");
67 return it->second;
68}
69
Jon Ashburn5484e0c2016-03-08 17:48:44 -070070VkLayerInstanceDispatchTable *get_dispatch_table(instance_table_map &map, void *object) {
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060071 dispatch_key key = get_dispatch_key(object);
Jon Ashburn5484e0c2016-03-08 17:48:44 -070072 instance_table_map::const_iterator it = map.find((void *)key);
Courtney Goeltzenleuchterc08e72d2015-06-13 21:18:30 -060073 assert(it != map.end() && "Not able to find instance dispatch entry");
74 return it->second;
75}
76
Jon Ashburn5484e0c2016-03-08 17:48:44 -070077VkLayerInstanceCreateInfo *get_chain_info(const VkInstanceCreateInfo *pCreateInfo, VkLayerFunction func) {
78 VkLayerInstanceCreateInfo *chain_info = (VkLayerInstanceCreateInfo *)pCreateInfo->pNext;
79 while (chain_info && !(chain_info->sType == VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO && chain_info->function == func)) {
80 chain_info = (VkLayerInstanceCreateInfo *)chain_info->pNext;
Courtney Goeltzenleuchter93a89cc2016-01-08 11:52:37 -070081 }
82 assert(chain_info != NULL);
83 return chain_info;
84}
85
Jon Ashburn5484e0c2016-03-08 17:48:44 -070086VkLayerDeviceCreateInfo *get_chain_info(const VkDeviceCreateInfo *pCreateInfo, VkLayerFunction func) {
87 VkLayerDeviceCreateInfo *chain_info = (VkLayerDeviceCreateInfo *)pCreateInfo->pNext;
88 while (chain_info && !(chain_info->sType == VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO && chain_info->function == func)) {
89 chain_info = (VkLayerDeviceCreateInfo *)chain_info->pNext;
Courtney Goeltzenleuchter93a89cc2016-01-08 11:52:37 -070090 }
91 assert(chain_info != NULL);
92 return chain_info;
93}
94
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070095/* Various dispatchable objects will use the same underlying dispatch table if they
Jon Ashburn9eed2892015-06-01 10:02:09 -060096 * are created from that "parent" object. Thus use pointer to dispatch table
97 * as the key to these table maps.
98 * Instance -> PhysicalDevice
Chia-I Wu3432a0c2015-10-27 18:04:07 +080099 * Device -> CommandBuffer or Queue
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700100 * If use the object themselves as key to map then implies Create entrypoints have to be intercepted
Jon Ashburn9eed2892015-06-01 10:02:09 -0600101 * and a new key inserted into map */
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700102VkLayerInstanceDispatchTable *initInstanceTable(VkInstance instance, const PFN_vkGetInstanceProcAddr gpa, instance_table_map &map) {
Jon Ashburn9eed2892015-06-01 10:02:09 -0600103 VkLayerInstanceDispatchTable *pTable;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700104 dispatch_key key = get_dispatch_key(instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700105 instance_table_map::const_iterator it = map.find((void *)key);
Jon Ashburn9eed2892015-06-01 10:02:09 -0600106
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700107 if (it == map.end()) {
108 pTable = new VkLayerInstanceDispatchTable;
109 map[(void *)key] = pTable;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700110 } else {
Jon Ashburn9eed2892015-06-01 10:02:09 -0600111 return it->second;
112 }
113
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700114 layer_init_instance_dispatch_table(instance, pTable, gpa);
Jon Ashburn9eed2892015-06-01 10:02:09 -0600115
Mark Young39389872017-01-19 21:10:49 -0700116 // Setup func pointers that are required but not externally exposed. These won't be added to the instance dispatch table by
117 // default.
118 pTable->GetPhysicalDeviceProcAddr = (PFN_GetPhysicalDeviceProcAddr)gpa(instance, "vk_layerGetPhysicalDeviceProcAddr");
119
Jon Ashburn9eed2892015-06-01 10:02:09 -0600120 return pTable;
121}
122
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700123VkLayerInstanceDispatchTable *initInstanceTable(VkInstance instance, const PFN_vkGetInstanceProcAddr gpa) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700124 return initInstanceTable(instance, gpa, tableInstanceMap);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -0600125}
126
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700127VkLayerDispatchTable *initDeviceTable(VkDevice device, const PFN_vkGetDeviceProcAddr gpa, device_table_map &map) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700128 VkLayerDispatchTable *pTable;
129 dispatch_key key = get_dispatch_key(device);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700130 device_table_map::const_iterator it = map.find((void *)key);
Jon Ashburn9eed2892015-06-01 10:02:09 -0600131
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700132 if (it == map.end()) {
133 pTable = new VkLayerDispatchTable;
134 map[(void *)key] = pTable;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700135 } else {
Jon Ashburn9eed2892015-06-01 10:02:09 -0600136 return it->second;
137 }
138
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700139 layer_init_device_dispatch_table(device, pTable, gpa);
Jon Ashburn9eed2892015-06-01 10:02:09 -0600140
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700141 return pTable;
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -0600142}
143
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700144VkLayerDispatchTable *initDeviceTable(VkDevice device, const PFN_vkGetDeviceProcAddr gpa) {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700145 return initDeviceTable(device, gpa, tableMap);
Jon Ashburn9eed2892015-06-01 10:02:09 -0600146}