blob: f41a0e0d48d739f95c9e87e9d0a5a5df6a21b9b3 [file] [log] [blame]
Jeremy Hayesb707aa52015-06-18 10:12:39 -06001/*
2 * Vulkan
3 *
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#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28
29#include <iostream>
30#include <string>
31#include <sstream>
32#include <unordered_map>
33
Tobin Ehlis7a51d902015-07-03 10:34:49 -060034#include "vk_loader_platform.h"
Tobin Ehlis2d1d9702015-07-03 09:42:57 -060035#include "vk_layer.h"
Tobin Ehlis56d204a2015-07-03 10:15:26 -060036#include "vk_layer_config.h"
Jeremy Hayesb707aa52015-06-18 10:12:39 -060037#include "vk_enum_validate_helper.h"
38#include "vk_struct_validate_helper.h"
39//The following is #included again to catch certain OS-specific functions being used:
Tobin Ehlis7a51d902015-07-03 10:34:49 -060040#include "vk_loader_platform.h"
Jeremy Hayesb707aa52015-06-18 10:12:39 -060041
Tobin Ehlis56d204a2015-07-03 10:15:26 -060042#include "vk_layer_table.h"
43#include "vk_layer_data.h"
44#include "vk_layer_logging.h"
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -060045#include "vk_layer_extension_utils.h"
Jeremy Hayesb707aa52015-06-18 10:12:39 -060046
47typedef struct _layer_data {
48 debug_report_data *report_data;
49 VkDbgMsgCallback logging_callback;
Chris Forbesd7576302015-06-21 22:55:02 +120050 VkPhysicalDevice physicalDevice;
Jeremy Hayesb707aa52015-06-18 10:12:39 -060051} layer_data;
52
53static std::unordered_map<void*, layer_data*> layer_data_map;
54static device_table_map image_device_table_map;
55static instance_table_map image_instance_table_map;
56
57// "my device data"
Tony Barbour2a199c12015-07-09 17:31:46 -060058debug_report_data *mdd(const void* object)
Jeremy Hayesb707aa52015-06-18 10:12:39 -060059{
60 dispatch_key key = get_dispatch_key(object);
61 layer_data *data = get_my_data_ptr(key, layer_data_map);
62#if DISPATCH_MAP_DEBUG
63 fprintf(stderr, "MDD: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, data);
64#endif
Jeremy Hayesb707aa52015-06-18 10:12:39 -060065 return data->report_data;
66}
67
68// "my instance data"
69debug_report_data *mid(VkInstance object)
70{
71 dispatch_key key = get_dispatch_key(object);
Courtney Goeltzenleuchter07199212015-06-22 16:19:14 -060072 layer_data *data = get_my_data_ptr(key, layer_data_map);
Jeremy Hayesb707aa52015-06-18 10:12:39 -060073#if DISPATCH_MAP_DEBUG
74 fprintf(stderr, "MID: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, data);
75#endif
Jeremy Hayesb707aa52015-06-18 10:12:39 -060076 return data->report_data;
77}
78
79static void InitImage(layer_data *data)
80{
81 uint32_t report_flags = getLayerOptionFlags("ImageReportFlags", 0);
82
83 uint32_t debug_action = 0;
84 getLayerOptionEnum("ImageDebugAction", (uint32_t *) &debug_action);
85 if(debug_action & VK_DBG_LAYER_ACTION_LOG_MSG)
86 {
87 FILE *log_output = NULL;
88 const char* option_str = getLayerOption("ImageLogFilename");
Tobin Ehlisb4b6e7c2015-09-15 09:55:54 -060089 log_output = getLayerLogOutput(option_str, "Image");
Jeremy Hayesb707aa52015-06-18 10:12:39 -060090 layer_create_msg_callback(data->report_data, report_flags, log_callback, (void*)log_output, &data->logging_callback);
91 }
92}
93
94VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback(
95 VkInstance instance,
96 VkFlags msgFlags,
97 const PFN_vkDbgMsgCallback pfnMsgCallback,
98 void* pUserData,
99 VkDbgMsgCallback* pMsgCallback)
100{
101 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(image_instance_table_map, instance);
102 VkResult res = pTable->DbgCreateMsgCallback(instance, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
103 if (res == VK_SUCCESS) {
104 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
105
106 res = layer_create_msg_callback(data->report_data, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
107 }
108 return res;
109}
110
111VK_LAYER_EXPORT VkResult VKAPI vkDbgDestroyMsgCallback(
112 VkInstance instance,
113 VkDbgMsgCallback msgCallback)
114{
115 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(image_instance_table_map, instance);
116 VkResult res = pTable->DbgDestroyMsgCallback(instance, msgCallback);
117
118 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
119 layer_destroy_msg_callback(data->report_data, msgCallback);
120
121 return res;
122}
123
124VK_LAYER_EXPORT VkResult VKAPI vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance)
125{
126 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(image_instance_table_map, *pInstance);
127 VkResult result = pTable->CreateInstance(pCreateInfo, pInstance);
128
129 if (result == VK_SUCCESS) {
130 layer_data *data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
131 data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->extensionCount,
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600132 pCreateInfo->ppEnabledExtensionNames);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600133
134 InitImage(data);
135 }
136
137 return result;
138}
139
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600140VK_LAYER_EXPORT void VKAPI vkDestroyInstance(VkInstance instance)
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600141{
142 // Grab the key before the instance is destroyed.
143 dispatch_key key = get_dispatch_key(instance);
144 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(image_instance_table_map, instance);
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600145 pTable->DestroyInstance(instance);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600146
147 // Clean up logging callback, if any
148 layer_data *data = get_my_data_ptr(key, layer_data_map);
149 if(data->logging_callback)
150 {
151 layer_destroy_msg_callback(data->report_data, data->logging_callback);
152 }
153
154 layer_debug_report_destroy_instance(mid(instance));
155 layer_data_map.erase(pTable);
156
157 image_instance_table_map.erase(key);
158 assert(image_instance_table_map.size() == 0 && "Should not have any instance mappings hanging around");
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600159}
160
161VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice)
162{
Courtney Goeltzenleuchterbe637992015-06-25 18:01:43 -0600163 VkLayerDispatchTable *pTable = get_dispatch_table(image_device_table_map, *pDevice);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600164 VkResult result = pTable->CreateDevice(physicalDevice, pCreateInfo, pDevice);
165 if(result == VK_SUCCESS)
166 {
167 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
168 layer_data *device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
169 device_data->report_data = layer_debug_report_create_device(instance_data->report_data, *pDevice);
Chris Forbesd7576302015-06-21 22:55:02 +1200170 device_data->physicalDevice = physicalDevice;
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600171 }
172
173 return result;
174}
175
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600176VK_LAYER_EXPORT void VKAPI vkDestroyDevice(VkDevice device)
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600177{
178 layer_debug_report_destroy_device(device);
179
180 dispatch_key key = get_dispatch_key(device);
181#if DISPATCH_MAP_DEBUG
182 fprintf(stderr, "Device: %p, key: %p\n", device, key);
183#endif
184
Mark Lobodzinski67b42b72015-09-07 13:59:43 -0600185 get_dispatch_table(image_device_table_map, device)->DestroyDevice(device);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600186 image_device_table_map.erase(key);
187 assert(image_device_table_map.size() == 0 && "Should not have any instance mappings hanging around");
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600188}
189
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600190static const VkLayerProperties pc_global_layers[] = {
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600191 {
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600192 "Image",
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600193 VK_API_VERSION,
194 VK_MAKE_VERSION(0, 1, 0),
195 "Validation layer: Image ParamChecker",
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600196 }
197};
198
Tony Barbour426b9052015-06-24 16:06:58 -0600199VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionProperties(
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600200 const char *pLayerName,
201 uint32_t *pCount,
202 VkExtensionProperties* pProperties)
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600203{
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600204 /* ParamChecker does not have any global extensions */
205 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600206}
207
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600208VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalLayerProperties(
209 uint32_t *pCount,
210 VkLayerProperties* pProperties)
Tony Barbour426b9052015-06-24 16:06:58 -0600211{
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600212 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers),
213 pc_global_layers,
214 pCount, pProperties);
Tony Barbour426b9052015-06-24 16:06:58 -0600215}
216
217VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionProperties(
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600218 VkPhysicalDevice physicalDevice,
219 const char* pLayerName,
220 uint32_t* pCount,
221 VkExtensionProperties* pProperties)
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600222{
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600223 /* ParamChecker does not have any physical device extensions */
224 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
225}
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600226
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600227VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceLayerProperties(
228 VkPhysicalDevice physicalDevice,
229 uint32_t* pCount,
230 VkLayerProperties* pProperties)
231{
232 /* ParamChecker's physical device layers are the same as global */
233 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers,
234 pCount, pProperties);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600235}
236
Mark Lobodzinski9cce7832015-07-29 09:21:22 -0600237// Start of the Image layer proper
238
239// Returns TRUE if a format is a depth-compatible format
240bool is_depth_format(VkFormat format)
241{
242 bool result = VK_FALSE;
243 switch (format) {
244 case VK_FORMAT_D16_UNORM:
Courtney Goeltzenleuchter7ed10592015-09-10 17:17:43 -0600245 case VK_FORMAT_D24_UNORM_X8:
Mark Lobodzinski9cce7832015-07-29 09:21:22 -0600246 case VK_FORMAT_D32_SFLOAT:
247 case VK_FORMAT_S8_UINT:
248 case VK_FORMAT_D16_UNORM_S8_UINT:
249 case VK_FORMAT_D24_UNORM_S8_UINT:
250 case VK_FORMAT_D32_SFLOAT_S8_UINT:
251 result = VK_TRUE;
252 break;
253 default:
254 break;
255 }
256 return result;
257}
258
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600259VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage)
260{
261 if(pCreateInfo->format != VK_FORMAT_UNDEFINED)
262 {
Courtney Goeltzenleuchter07199212015-06-22 16:19:14 -0600263 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600264 VkFormatProperties properties;
Courtney Goeltzenleuchterab36aa62015-07-12 12:40:29 -0600265 VkResult result = get_dispatch_table(image_instance_table_map, device_data->physicalDevice)->GetPhysicalDeviceFormatProperties(
Chris Forbesd7576302015-06-21 22:55:02 +1200266 device_data->physicalDevice, pCreateInfo->format, &properties);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600267 if(result != VK_SUCCESS)
268 {
269 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, cannot be validated";
Tony Barbour2a199c12015-07-09 17:31:46 -0600270 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, (VkDbgObjectType)0, 0, 0, 1, "IMAGE", str);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600271 }
272
273 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
274 {
275 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains unsupported format";
Tony Barbour2a199c12015-07-09 17:31:46 -0600276 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, (VkDbgObjectType)0, 0, 0, 1, "IMAGE", str);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600277 }
278 }
279
280 VkResult result = get_dispatch_table(image_device_table_map, device)->CreateImage(device, pCreateInfo, pImage);
281
282 return result;
283}
284
285VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, VkRenderPass* pRenderPass)
286{
Chia-I Wuc278df82015-07-07 11:50:03 +0800287 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600288 {
Chia-I Wuc278df82015-07-07 11:50:03 +0800289 if(pCreateInfo->pAttachments[i].format != VK_FORMAT_UNDEFINED)
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600290 {
Courtney Goeltzenleuchter07199212015-06-22 16:19:14 -0600291 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600292 VkFormatProperties properties;
Courtney Goeltzenleuchterab36aa62015-07-12 12:40:29 -0600293 VkResult result = get_dispatch_table(image_instance_table_map, device_data->physicalDevice)->GetPhysicalDeviceFormatProperties(
Chia-I Wuc278df82015-07-07 11:50:03 +0800294 device_data->physicalDevice, pCreateInfo->pAttachments[i].format, &properties);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600295 if(result != VK_SUCCESS)
296 {
297 std::stringstream ss;
Chia-I Wuc278df82015-07-07 11:50:03 +0800298 ss << "vkCreateRenderPass parameter, VkFormat in pCreateInfo->pAttachments[" << i << "], cannot be validated";
Tony Barbour2a199c12015-07-09 17:31:46 -0600299 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, (VkDbgObjectType)0, 0, 0, 1, "IMAGE", ss.str().c_str());
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600300 continue;
301 }
302
303 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
304 {
305 std::stringstream ss;
Chia-I Wuc278df82015-07-07 11:50:03 +0800306 ss << "vkCreateRenderPass parameter, VkFormat in pCreateInfo->pAttachments[" << i << "], contains unsupported format";
Tony Barbour2a199c12015-07-09 17:31:46 -0600307 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, (VkDbgObjectType)0, 0, 0, 1, "IMAGE", ss.str().c_str());
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600308 }
309 }
310 }
311
Chia-I Wuc278df82015-07-07 11:50:03 +0800312 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600313 {
Chia-I Wuc278df82015-07-07 11:50:03 +0800314 if(!validate_VkImageLayout(pCreateInfo->pAttachments[i].initialLayout) ||
315 !validate_VkImageLayout(pCreateInfo->pAttachments[i].finalLayout))
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600316 {
317 std::stringstream ss;
Chia-I Wuc278df82015-07-07 11:50:03 +0800318 ss << "vkCreateRenderPass parameter, VkImageLayout in pCreateInfo->pAttachments[" << i << "], is unrecognized";
Tony Barbour2a199c12015-07-09 17:31:46 -0600319 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, (VkDbgObjectType)0, 0, 0, 1, "IMAGE", ss.str().c_str());
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600320 }
321 }
322
Chia-I Wuc278df82015-07-07 11:50:03 +0800323 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600324 {
Chia-I Wuc278df82015-07-07 11:50:03 +0800325 if(!validate_VkAttachmentLoadOp(pCreateInfo->pAttachments[i].loadOp))
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600326 {
327 std::stringstream ss;
Chia-I Wuc278df82015-07-07 11:50:03 +0800328 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp in pCreateInfo->pAttachments[" << i << "], is unrecognized";
Tony Barbour2a199c12015-07-09 17:31:46 -0600329 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, (VkDbgObjectType)0, 0, 0, 1, "IMAGE", ss.str().c_str());
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600330 }
331 }
332
Chia-I Wuc278df82015-07-07 11:50:03 +0800333 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600334 {
Chia-I Wuc278df82015-07-07 11:50:03 +0800335 if(!validate_VkAttachmentStoreOp(pCreateInfo->pAttachments[i].storeOp))
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600336 {
337 std::stringstream ss;
Chia-I Wuc278df82015-07-07 11:50:03 +0800338 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp in pCreateInfo->pAttachments[" << i << "], is unrecognized";
Tony Barbour2a199c12015-07-09 17:31:46 -0600339 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, (VkDbgObjectType)0, 0, 0, 1, "IMAGE", ss.str().c_str());
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600340 }
341 }
342
Mark Lobodzinski9cce7832015-07-29 09:21:22 -0600343 // Any depth buffers specified as attachments?
344 bool depthFormatPresent = VK_FALSE;
345 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
346 {
347 depthFormatPresent |= is_depth_format(pCreateInfo->pAttachments[i].format);
348 }
349
350 if (depthFormatPresent == VK_FALSE) {
351 // No depth attachment is present, validate that subpasses set depthStencilAttachment to VK_ATTACHMENT_UNUSED;
352 for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {
353 if (pCreateInfo->pSubpasses[i].depthStencilAttachment.attachment != VK_ATTACHMENT_UNUSED) {
354 std::stringstream ss;
355 ss << "vkCreateRenderPass has no depth/stencil attachment, yet subpass[" << i << "] has VkSubpassDescription::depthStencilAttachment value that is not VK_ATTACHMENT_UNUSED";
356 log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType)0, 0, 0, 1, "IMAGE", ss.str().c_str());
357 }
358 }
359 }
360
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600361 VkResult result = get_dispatch_table(image_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pRenderPass);
362
363 return result;
364}
365
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600366VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600367{
368 if (device == NULL) {
369 return NULL;
370 }
371
372 /* loader uses this to force layer initialization; device object is wrapped */
373 if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
374 initDeviceTable(image_device_table_map, (const VkBaseLayerObject *) device);
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600375 return (PFN_vkVoidFunction) vkGetDeviceProcAddr;
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600376 }
377
Courtney Goeltzenleuchterbe637992015-06-25 18:01:43 -0600378 if (!strcmp(funcName, "vkCreateDevice"))
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600379 return (PFN_vkVoidFunction) vkCreateDevice;
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600380 if (!strcmp(funcName, "vkDestroyDevice"))
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600381 return (PFN_vkVoidFunction) vkDestroyDevice;
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600382 if (!strcmp(funcName, "vkCreateImage"))
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600383 return (PFN_vkVoidFunction) vkCreateImage;
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600384 if (!strcmp(funcName, "vkCreateRenderPass"))
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600385 return (PFN_vkVoidFunction) vkCreateRenderPass;
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600386
387 {
388 if (get_dispatch_table(image_device_table_map, device)->GetDeviceProcAddr == NULL)
389 return NULL;
390 return get_dispatch_table(image_device_table_map, device)->GetDeviceProcAddr(device, funcName);
391 }
392}
393
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600394VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600395{
396 if (instance == NULL) {
397 return NULL;
398 }
399
400 /* loader uses this to force layer initialization; instance object is wrapped */
401 if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
402 initInstanceTable(image_instance_table_map, (const VkBaseLayerObject *) instance);
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600403 return (PFN_vkVoidFunction) vkGetInstanceProcAddr;
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600404 }
405
406 if (!strcmp(funcName, "vkCreateInstance"))
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600407 return (PFN_vkVoidFunction) vkCreateInstance;
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600408 if (!strcmp(funcName, "vkDestroyInstance"))
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600409 return (PFN_vkVoidFunction) vkDestroyInstance;
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600410 if (!strcmp(funcName, "vkGetGlobalLayerProperties"))
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600411 return (PFN_vkVoidFunction) vkGetGlobalLayerProperties;
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600412 if (!strcmp(funcName, "vkGetGlobalExtensionProperties"))
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600413 return (PFN_vkVoidFunction) vkGetGlobalExtensionProperties;
Courtney Goeltzenleuchtereb1ddb02015-07-07 11:18:30 -0600414 if (!strcmp(funcName, "vkGetPhysicalDeviceLayerProperties"))
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600415 return (PFN_vkVoidFunction) vkGetPhysicalDeviceLayerProperties;
Tony Barbour426b9052015-06-24 16:06:58 -0600416 if (!strcmp(funcName, "vkGetPhysicalDeviceExtensionProperties"))
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600417 return (PFN_vkVoidFunction) vkGetPhysicalDeviceExtensionProperties;
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600418
419 layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchtera4c8c712015-07-12 14:35:22 -0600420 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName);
Jeremy Hayesb707aa52015-06-18 10:12:39 -0600421 if(fptr)
422 return fptr;
423
424 {
425 if (get_dispatch_table(image_instance_table_map, instance)->GetInstanceProcAddr == NULL)
426 return NULL;
427 return get_dispatch_table(image_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
428 }
429}