blob: a40b2f23c62503d3e3c3013c3a33c1faeb46ceaa [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.
4 * Copyright (C) 2015-2016 Google Inc.
Jeremy Hayes9cc31582015-06-18 10:12:39 -06005 *
Mark Lobodzinski6eda00a2016-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:
Jeremy Hayes9cc31582015-06-18 10:12:39 -060012 *
Mark Lobodzinski6eda00a2016-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.
Jeremy Hayes9cc31582015-06-18 10:12:39 -060015 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070016 * The Materials are Confidential Information as defined by the Khronos
17 * Membership Agreement until designated non-confidential by Khronos, at which
18 * point this condition clause shall be removed.
Jeremy Hayes9cc31582015-06-18 10:12:39 -060019 *
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070020 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Jeremy Hayes9cc31582015-06-18 10:12:39 -060021 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -070022 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 *
24 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
25 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
26 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
27 * USE OR OTHER DEALINGS IN THE MATERIALS
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060028 *
29 * Author: Jeremy Hayes <jeremy@lunarg.com>
30 * Author: Mark Lobodzinski <mark@lunarg.com>
31 * Author: Mike Stroyan <mike@LunarG.com>
32 * Author: Tobin Ehlis <tobin@lunarg.com>
Jeremy Hayes9cc31582015-06-18 10:12:39 -060033 */
34
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060035#include <inttypes.h>
Jeremy Hayes9cc31582015-06-18 10:12:39 -060036#include <stdio.h>
37#include <stdlib.h>
38#include <string.h>
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060039#include <assert.h>
40#include <vector>
Jeremy Hayes9cc31582015-06-18 10:12:39 -060041#include <unordered_map>
Tobin Ehlisad8c4462015-09-21 15:20:28 -060042#include <memory>
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060043using namespace std;
Jeremy Hayes9cc31582015-06-18 10:12:39 -060044
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060045#include "vk_loader_platform.h"
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060046#include "vk_dispatch_table_helper.h"
47#include "vk_struct_string_helper_cpp.h"
Jeremy Hayes9cc31582015-06-18 10:12:39 -060048#include "vk_enum_validate_helper.h"
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060049#include "image.h"
50#include "vk_layer_config.h"
51#include "vk_layer_extension_utils.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060052#include "vk_layer_table.h"
53#include "vk_layer_data.h"
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -060054#include "vk_layer_extension_utils.h"
Mike Stroyana3082432015-09-25 13:39:21 -060055#include "vk_layer_utils.h"
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060056#include "vk_layer_logging.h"
Jeremy Hayes9cc31582015-06-18 10:12:39 -060057
Tobin Ehlisad8c4462015-09-21 15:20:28 -060058using namespace std;
59
Cody Northrop55443ef2015-09-28 15:09:32 -060060struct layer_data {
Mark Lobodzinskid5a23822015-11-12 15:14:35 -070061 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070062 vector<VkDebugReportCallbackEXT> logging_callback;
Mark Lobodzinskid5a23822015-11-12 15:14:35 -070063 VkLayerDispatchTable* device_dispatch_table;
64 VkLayerInstanceDispatchTable *instance_dispatch_table;
65 VkPhysicalDevice physicalDevice;
66 VkPhysicalDeviceProperties physicalDeviceProperties;
67
Chia-I Wue2fc5522015-10-26 20:04:44 +080068 unordered_map<VkImage, IMAGE_STATE> imageMap;
Cody Northrop55443ef2015-09-28 15:09:32 -060069
70 layer_data() :
71 report_data(nullptr),
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -060072 device_dispatch_table(nullptr),
73 instance_dispatch_table(nullptr),
Mark Lobodzinskid5a23822015-11-12 15:14:35 -070074 physicalDevice(0),
75 physicalDeviceProperties()
Cody Northrop55443ef2015-09-28 15:09:32 -060076 {};
77};
Jeremy Hayes9cc31582015-06-18 10:12:39 -060078
Tobin Ehlisad8c4462015-09-21 15:20:28 -060079static unordered_map<void*, layer_data*> layer_data_map;
Jeremy Hayes9cc31582015-06-18 10:12:39 -060080
Courtney Goeltzenleuchter6d8e8182015-11-25 14:31:49 -070081static void InitImage(layer_data *data, const VkAllocationCallbacks *pAllocator)
Jeremy Hayes9cc31582015-06-18 10:12:39 -060082{
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070083 VkDebugReportCallbackEXT callback;
Jeremy Hayes9cc31582015-06-18 10:12:39 -060084 uint32_t report_flags = getLayerOptionFlags("ImageReportFlags", 0);
85
86 uint32_t debug_action = 0;
87 getLayerOptionEnum("ImageDebugAction", (uint32_t *) &debug_action);
88 if(debug_action & VK_DBG_LAYER_ACTION_LOG_MSG)
89 {
90 FILE *log_output = NULL;
91 const char* option_str = getLayerOption("ImageLogFilename");
Tobin Ehlisb1df55e2015-09-15 09:55:54 -060092 log_output = getLayerLogOutput(option_str, "Image");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070093 VkDebugReportCallbackCreateInfoEXT dbgInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -070094 memset(&dbgInfo, 0, sizeof(dbgInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070095 dbgInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -070096 dbgInfo.pfnCallback = log_callback;
97 dbgInfo.pUserData = log_output;
98 dbgInfo.flags = report_flags;
99 layer_create_msg_callback(data->report_data, &dbgInfo, pAllocator, &callback);
Courtney Goeltzenleuchterffcdd8b2015-10-05 15:59:11 -0600100 data->logging_callback.push_back(callback);
101 }
102
103 if (debug_action & VK_DBG_LAYER_ACTION_DEBUG_OUTPUT) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700104 VkDebugReportCallbackCreateInfoEXT dbgInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700105 memset(&dbgInfo, 0, sizeof(dbgInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700106 dbgInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700107 dbgInfo.pfnCallback = win32_debug_output_msg;
108 dbgInfo.flags = report_flags;
109 layer_create_msg_callback(data->report_data, &dbgInfo, pAllocator, &callback);
Courtney Goeltzenleuchterffcdd8b2015-10-05 15:59:11 -0600110 data->logging_callback.push_back(callback);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600111 }
112}
113
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700114VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700115 VkInstance instance,
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700116 const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700117 const VkAllocationCallbacks* pAllocator,
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700118 VkDebugReportCallbackEXT* pMsgCallback)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600119{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600120 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700121 VkResult res = my_data->instance_dispatch_table->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600122 if (res == VK_SUCCESS) {
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700123 res = layer_create_msg_callback(my_data->report_data, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600124 }
125 return res;
126}
127
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700128VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700129 VkInstance instance,
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700130 VkDebugReportCallbackEXT msgCallback,
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700131 const VkAllocationCallbacks* pAllocator)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600132{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600133 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700134 my_data->instance_dispatch_table->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700135 layer_destroy_msg_callback(my_data->report_data, msgCallback, pAllocator);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600136}
137
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700138VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700139 VkInstance instance,
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700140 VkDebugReportFlagsEXT flags,
141 VkDebugReportObjectTypeEXT objType,
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700142 uint64_t object,
143 size_t location,
144 int32_t msgCode,
145 const char* pLayerPrefix,
146 const char* pMsg)
147{
148 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700149 my_data->instance_dispatch_table->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700150}
151
Chia-I Wu9ab61502015-11-06 06:42:02 +0800152VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkInstance* pInstance)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600153{
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700154 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600155
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700156 assert(chain_info->u.pLayerInfo);
157 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
158 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance) fpGetInstanceProcAddr(NULL, "vkCreateInstance");
159 if (fpCreateInstance == NULL) {
160 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600161 }
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700162
163 // Advance the link info for the next element on the chain
164 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
165
166 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
167 if (result != VK_SUCCESS)
168 return result;
169
170 layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
171 my_data->instance_dispatch_table = new VkLayerInstanceDispatchTable;
172 layer_init_instance_dispatch_table(*pInstance, my_data->instance_dispatch_table, fpGetInstanceProcAddr);
173
174 my_data->report_data = debug_report_create_instance(
175 my_data->instance_dispatch_table,
176 *pInstance,
177 pCreateInfo->enabledExtensionCount,
178 pCreateInfo->ppEnabledExtensionNames);
179
180 InitImage(my_data, pAllocator);
181
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600182 return result;
183}
184
Chia-I Wu9ab61502015-11-06 06:42:02 +0800185VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks* pAllocator)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600186{
187 // Grab the key before the instance is destroyed.
188 dispatch_key key = get_dispatch_key(instance);
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600189 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
190 VkLayerInstanceDispatchTable *pTable = my_data->instance_dispatch_table;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800191 pTable->DestroyInstance(instance, pAllocator);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600192
193 // Clean up logging callback, if any
Courtney Goeltzenleuchterffcdd8b2015-10-05 15:59:11 -0600194 while (my_data->logging_callback.size() > 0) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700195 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700196 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Courtney Goeltzenleuchterffcdd8b2015-10-05 15:59:11 -0600197 my_data->logging_callback.pop_back();
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600198 }
199
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600200 layer_debug_report_destroy_instance(my_data->report_data);
201 delete my_data->instance_dispatch_table;
202 layer_data_map.erase(key);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600203
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600204}
205
Chia-I Wu9ab61502015-11-06 06:42:02 +0800206VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600207{
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700208 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
209
210 assert(chain_info->u.pLayerInfo);
211 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
212 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
213 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice) fpGetInstanceProcAddr(NULL, "vkCreateDevice");
214 if (fpCreateDevice == NULL) {
215 return VK_ERROR_INITIALIZATION_FAILED;
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600216 }
217
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700218 // Advance the link info for the next element on the chain
219 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
220
221 VkResult result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
222 if (result != VK_SUCCESS) {
223 return result;
224 }
225
226 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
227 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
228
229 // Setup device dispatch table
230 my_device_data->device_dispatch_table = new VkLayerDispatchTable;
231 layer_init_device_dispatch_table(*pDevice, my_device_data->device_dispatch_table, fpGetDeviceProcAddr);
232
233 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
234 my_device_data->physicalDevice = physicalDevice;
235
236 my_instance_data->instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &(my_device_data->physicalDeviceProperties));
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700237
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600238 return result;
239}
240
Chia-I Wu9ab61502015-11-06 06:42:02 +0800241VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600242{
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600243 dispatch_key key = get_dispatch_key(device);
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600244 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Chia-I Wuf7458c52015-10-26 21:10:41 +0800245 my_data->device_dispatch_table->DestroyDevice(device, pAllocator);
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600246 delete my_data->device_dispatch_table;
247 layer_data_map.erase(key);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600248}
249
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700250static const VkExtensionProperties instance_extensions[] = {
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600251 {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700252 VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
Courtney Goeltzenleuchterb69cd592016-01-19 16:08:39 -0700253 VK_EXT_DEBUG_REPORT_SPEC_VERSION
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600254 }
255};
256
Chia-I Wu9ab61502015-11-06 06:42:02 +0800257VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600258 const char *pLayerName,
259 uint32_t *pCount,
260 VkExtensionProperties* pProperties)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600261{
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700262 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600263}
264
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700265static const VkLayerProperties pc_global_layers[] = {
266 {
Michael Lentine03107b42015-12-11 10:49:51 -0800267 "VK_LAYER_LUNARG_image",
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700268 VK_API_VERSION,
269 VK_MAKE_VERSION(0, 1, 0),
Mark Lobodzinski0d054fe2015-12-30 08:16:12 -0700270 "Validation layer: image",
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700271 }
272};
273
Chia-I Wu9ab61502015-11-06 06:42:02 +0800274VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600275 uint32_t *pCount,
276 VkLayerProperties* pProperties)
Tony Barbour59a47322015-06-24 16:06:58 -0600277{
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600278 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers),
279 pc_global_layers,
280 pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -0600281}
282
Chia-I Wu9ab61502015-11-06 06:42:02 +0800283VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600284 VkPhysicalDevice physicalDevice,
285 const char* pLayerName,
286 uint32_t* pCount,
287 VkExtensionProperties* pProperties)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600288{
Jon Ashburn751c4842015-11-02 17:37:20 -0700289 // Image does not have any physical device extensions
290 if (pLayerName == NULL) {
291 dispatch_key key = get_dispatch_key(physicalDevice);
292 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
293 VkLayerInstanceDispatchTable *pTable = my_data->instance_dispatch_table;
294 return pTable->EnumerateDeviceExtensionProperties(
295 physicalDevice,
296 NULL,
297 pCount,
298 pProperties);
299 } else {
300 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
301 }
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600302}
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600303
Chia-I Wu9ab61502015-11-06 06:42:02 +0800304VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600305 VkPhysicalDevice physicalDevice,
306 uint32_t* pCount,
307 VkLayerProperties* pProperties)
308{
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600309 // ParamChecker's physical device layers are the same as global
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600310 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers,
311 pCount, pProperties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600312}
313
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600314// Start of the Image layer proper
315
316// Returns TRUE if a format is a depth-compatible format
317bool is_depth_format(VkFormat format)
318{
319 bool result = VK_FALSE;
320 switch (format) {
321 case VK_FORMAT_D16_UNORM:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800322 case VK_FORMAT_X8_D24_UNORM_PACK32:
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600323 case VK_FORMAT_D32_SFLOAT:
324 case VK_FORMAT_S8_UINT:
325 case VK_FORMAT_D16_UNORM_S8_UINT:
326 case VK_FORMAT_D24_UNORM_S8_UINT:
327 case VK_FORMAT_D32_SFLOAT_S8_UINT:
328 result = VK_TRUE;
329 break;
330 default:
331 break;
332 }
333 return result;
334}
335
Mark Lobodzinski601ed152015-11-10 11:01:32 -0700336static inline uint32_t validate_VkImageLayoutKHR(VkImageLayout input_value)
337{
338 return ((validate_VkImageLayout(input_value) == 1) ||
Ian Elliott05846062015-11-20 14:13:17 -0700339 (input_value == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR));
Mark Lobodzinski601ed152015-11-10 11:01:32 -0700340}
341
Chia-I Wu9ab61502015-11-06 06:42:02 +0800342VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600343{
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700344 VkBool32 skipCall = VK_FALSE;
Courtney Goeltzenleuchter52fee652015-12-10 16:41:22 -0700345 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700346 VkImageFormatProperties ImageFormatProperties = {0};
347
348 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
349 VkPhysicalDevice physicalDevice = device_data->physicalDevice;
350 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
351
352 if (pCreateInfo->format != VK_FORMAT_UNDEFINED)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600353 {
354 VkFormatProperties properties;
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700355 phy_dev_data->instance_dispatch_table->GetPhysicalDeviceFormatProperties(
Chris Forbesbc0bb772015-06-21 22:55:02 +1200356 device_data->physicalDevice, pCreateInfo->format, &properties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600357
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700358 if ((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600359 {
360 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains unsupported format";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700361 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700362 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, IMAGE_FORMAT_UNSUPPORTED, "IMAGE", str);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600363 }
364 }
365
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700366 // Internal call to get format info. Still goes through layers, could potentially go directly to ICD.
367 phy_dev_data->instance_dispatch_table->GetPhysicalDeviceImageFormatProperties(
368 physicalDevice, pCreateInfo->format, pCreateInfo->imageType, pCreateInfo->tiling,
369 pCreateInfo->usage, pCreateInfo->flags, &ImageFormatProperties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600370
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700371 VkDeviceSize imageGranularity = device_data->physicalDeviceProperties.limits.bufferImageGranularity;
372 imageGranularity = imageGranularity == 1 ? 0 : imageGranularity;
373
374 if ((pCreateInfo->extent.depth > ImageFormatProperties.maxExtent.depth) ||
375 (pCreateInfo->extent.width > ImageFormatProperties.maxExtent.width) ||
376 (pCreateInfo->extent.height > ImageFormatProperties.maxExtent.height)) {
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700377 skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, (uint64_t)pImage, __LINE__,
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700378 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
379 "CreateImage extents exceed allowable limits for format: "
380 "Width = %d Height = %d Depth = %d: Limits for Width = %d Height = %d Depth = %d for format %s.",
381 pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth,
382 ImageFormatProperties.maxExtent.width, ImageFormatProperties.maxExtent.height, ImageFormatProperties.maxExtent.depth,
383 string_VkFormat(pCreateInfo->format));
384
385 }
386
387 uint64_t totalSize = ((uint64_t)pCreateInfo->extent.width *
388 (uint64_t)pCreateInfo->extent.height *
389 (uint64_t)pCreateInfo->extent.depth *
390 (uint64_t)pCreateInfo->arrayLayers *
391 (uint64_t)pCreateInfo->samples *
392 (uint64_t)vk_format_get_size(pCreateInfo->format) +
393 (uint64_t)imageGranularity ) & ~(uint64_t)imageGranularity;
394
395 if (totalSize > ImageFormatProperties.maxResourceSize) {
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700396 skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, (uint64_t)pImage, __LINE__,
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700397 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
398 "CreateImage resource size exceeds allowable maximum "
399 "Image resource size = %#" PRIxLEAST64 ", maximum resource size = %#" PRIxLEAST64 " ",
400 totalSize, ImageFormatProperties.maxResourceSize);
401 }
402
403 if (pCreateInfo->mipLevels > ImageFormatProperties.maxMipLevels) {
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700404 skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, (uint64_t)pImage, __LINE__,
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700405 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
406 "CreateImage mipLevels=%d exceeds allowable maximum supported by format of %d",
407 pCreateInfo->mipLevels, ImageFormatProperties.maxMipLevels);
408 }
409
410 if (pCreateInfo->arrayLayers > ImageFormatProperties.maxArrayLayers) {
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700411 skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, (uint64_t)pImage, __LINE__,
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700412 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
413 "CreateImage arrayLayers=%d exceeds allowable maximum supported by format of %d",
414 pCreateInfo->arrayLayers, ImageFormatProperties.maxArrayLayers);
415 }
416
417 if ((pCreateInfo->samples & ImageFormatProperties.sampleCounts) == 0) {
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700418 skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, (uint64_t)pImage, __LINE__,
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700419 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
420 "CreateImage samples %s is not supported by format 0x%.8X",
421 string_VkSampleCountFlagBits(pCreateInfo->samples), ImageFormatProperties.sampleCounts);
422 }
423
424 if (VK_FALSE == skipCall) {
425 result = device_data->device_dispatch_table->CreateImage(device, pCreateInfo, pAllocator, pImage);
426 }
427 if (result == VK_SUCCESS) {
Chia-I Wue2fc5522015-10-26 20:04:44 +0800428 device_data->imageMap[*pImage] = IMAGE_STATE(pCreateInfo);
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600429 }
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600430 return result;
431}
432
Chia-I Wu9ab61502015-11-06 06:42:02 +0800433VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator)
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600434{
435 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chia-I Wue2fc5522015-10-26 20:04:44 +0800436 device_data->imageMap.erase(image);
Chia-I Wuf7458c52015-10-26 21:10:41 +0800437 device_data->device_dispatch_table->DestroyImage(device, image, pAllocator);
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600438}
439
Chia-I Wu9ab61502015-11-06 06:42:02 +0800440VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600441{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600442 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Tobin Ehlisdea00952015-09-22 08:40:52 -0600443 VkBool32 skipCall = VK_FALSE;
Chia-I Wu08accc62015-07-07 11:50:03 +0800444 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600445 {
Chia-I Wu08accc62015-07-07 11:50:03 +0800446 if(pCreateInfo->pAttachments[i].format != VK_FORMAT_UNDEFINED)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600447 {
448 VkFormatProperties properties;
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600449 get_my_data_ptr(get_dispatch_key(my_data->physicalDevice), layer_data_map)->instance_dispatch_table->GetPhysicalDeviceFormatProperties(
450 my_data->physicalDevice, pCreateInfo->pAttachments[i].format, &properties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600451
452 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
453 {
454 std::stringstream ss;
Chia-I Wu08accc62015-07-07 11:50:03 +0800455 ss << "vkCreateRenderPass parameter, VkFormat in pCreateInfo->pAttachments[" << i << "], contains unsupported format";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700456 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700457 skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, IMAGE_FORMAT_UNSUPPORTED, "IMAGE", "%s", ss.str().c_str());
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600458 }
459 }
460 }
461
Chia-I Wu08accc62015-07-07 11:50:03 +0800462 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600463 {
Mark Lobodzinski601ed152015-11-10 11:01:32 -0700464 if(!validate_VkImageLayoutKHR(pCreateInfo->pAttachments[i].initialLayout) ||
465 !validate_VkImageLayoutKHR(pCreateInfo->pAttachments[i].finalLayout))
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600466 {
467 std::stringstream ss;
Chia-I Wu08accc62015-07-07 11:50:03 +0800468 ss << "vkCreateRenderPass parameter, VkImageLayout in pCreateInfo->pAttachments[" << i << "], is unrecognized";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700469 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700470 skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, IMAGE_RENDERPASS_INVALID_ATTACHMENT, "IMAGE", "%s", ss.str().c_str());
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600471 }
472 }
473
Chia-I Wu08accc62015-07-07 11:50:03 +0800474 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600475 {
Chia-I Wu08accc62015-07-07 11:50:03 +0800476 if(!validate_VkAttachmentLoadOp(pCreateInfo->pAttachments[i].loadOp))
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600477 {
478 std::stringstream ss;
Chia-I Wu08accc62015-07-07 11:50:03 +0800479 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp in pCreateInfo->pAttachments[" << i << "], is unrecognized";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700480 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700481 skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, IMAGE_RENDERPASS_INVALID_ATTACHMENT, "IMAGE", "%s", ss.str().c_str());
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600482 }
483 }
484
Chia-I Wu08accc62015-07-07 11:50:03 +0800485 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600486 {
Chia-I Wu08accc62015-07-07 11:50:03 +0800487 if(!validate_VkAttachmentStoreOp(pCreateInfo->pAttachments[i].storeOp))
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600488 {
489 std::stringstream ss;
Chia-I Wu08accc62015-07-07 11:50:03 +0800490 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp in pCreateInfo->pAttachments[" << i << "], is unrecognized";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700491 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700492 skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, IMAGE_RENDERPASS_INVALID_ATTACHMENT, "IMAGE", "%s", ss.str().c_str());
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600493 }
494 }
495
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600496 // Any depth buffers specified as attachments?
497 bool depthFormatPresent = VK_FALSE;
498 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
499 {
500 depthFormatPresent |= is_depth_format(pCreateInfo->pAttachments[i].format);
501 }
502
503 if (depthFormatPresent == VK_FALSE) {
504 // No depth attachment is present, validate that subpasses set depthStencilAttachment to VK_ATTACHMENT_UNUSED;
505 for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {
Chia-I Wu1efb7e52015-10-26 17:32:47 +0800506 if (pCreateInfo->pSubpasses[i].pDepthStencilAttachment &&
507 pCreateInfo->pSubpasses[i].pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) {
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600508 std::stringstream ss;
509 ss << "vkCreateRenderPass has no depth/stencil attachment, yet subpass[" << i << "] has VkSubpassDescription::depthStencilAttachment value that is not VK_ATTACHMENT_UNUSED";
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700510 skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, IMAGE_RENDERPASS_INVALID_DS_ATTACHMENT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600511 }
512 }
513 }
Tobin Ehlisdea00952015-09-22 08:40:52 -0600514 if (skipCall)
Courtney Goeltzenleuchter52fee652015-12-10 16:41:22 -0700515 return VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600516
Chia-I Wuf7458c52015-10-26 21:10:41 +0800517 VkResult result = my_data->device_dispatch_table->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600518
519 return result;
520}
521
Chia-I Wu9ab61502015-11-06 06:42:02 +0800522VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView)
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600523{
524 VkBool32 skipCall = VK_FALSE;
525 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chia-I Wue2fc5522015-10-26 20:04:44 +0800526 auto imageEntry = device_data->imageMap.find(pCreateInfo->image);
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600527 if (imageEntry != device_data->imageMap.end()) {
Tobin Ehlisd923d152015-09-25 14:49:43 -0600528 if (pCreateInfo->subresourceRange.baseMipLevel >= imageEntry->second.mipLevels) {
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600529 std::stringstream ss;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600530 ss << "vkCreateImageView called with baseMipLevel " << pCreateInfo->subresourceRange.baseMipLevel
Chia-I Wue2fc5522015-10-26 20:04:44 +0800531 << " for image " << pCreateInfo->image << " that only has " << imageEntry->second.mipLevels << " mip levels.";
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700532 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str());
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600533 }
Tobin Ehlisd923d152015-09-25 14:49:43 -0600534 if (pCreateInfo->subresourceRange.baseArrayLayer >= imageEntry->second.arraySize) {
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600535 std::stringstream ss;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600536 ss << "vkCreateImageView called with baseArrayLayer " << pCreateInfo->subresourceRange.baseArrayLayer << " for image "
Chia-I Wue2fc5522015-10-26 20:04:44 +0800537 << pCreateInfo->image << " that only has " << imageEntry->second.arraySize << " mip levels.";
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700538 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str());
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600539 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800540 if (!pCreateInfo->subresourceRange.levelCount) {
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600541 std::stringstream ss;
Jeremy Hayes5097da02015-11-17 18:24:56 -0700542 ss << "vkCreateImageView called with 0 in pCreateInfo->subresourceRange.levelCount.";
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700543 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str());
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600544 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800545 if (!pCreateInfo->subresourceRange.layerCount) {
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600546 std::stringstream ss;
Jeremy Hayes5097da02015-11-17 18:24:56 -0700547 ss << "vkCreateImageView called with 0 in pCreateInfo->subresourceRange.layerCount.";
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700548 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str());
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600549 }
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600550
Mark Lobodzinski1e638c62016-01-11 16:50:30 -0700551 VkImageCreateFlags imageFlags = imageEntry->second.flags;
Tobin Ehlisd923d152015-09-25 14:49:43 -0600552 VkFormat imageFormat = imageEntry->second.format;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600553 VkFormat ivciFormat = pCreateInfo->format;
554 VkImageAspectFlags aspectMask = pCreateInfo->subresourceRange.aspectMask;
555
Mark Lobodzinskiadaac9d2016-01-08 11:07:56 -0700556 // Validate VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT state
Mark Lobodzinski1e638c62016-01-11 16:50:30 -0700557 if (imageFlags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
Mark Lobodzinskiadaac9d2016-01-08 11:07:56 -0700558 // Format MUST be compatible (in the same format compatibility class) as the format the image was created with
559 if (vk_format_get_compatibility_class(imageFormat) != vk_format_get_compatibility_class(ivciFormat)) {
560 std::stringstream ss;
561 ss << "vkCreateImageView(): ImageView format " << string_VkFormat(ivciFormat) << " is not in the same format compatibility class as image (" <<
562 (uint64_t)pCreateInfo->image << ") format " << string_VkFormat(imageFormat) << ". Images created with the VK_IMAGE_CREATE_MUTABLE_FORMAT BIT " <<
563 "can support ImageViews with differing formats but they must be in the same compatibility class.";
564 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
565 IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str());
566 }
567 } else {
568 // Format MUST be IDENTICAL to the format the image was created with
569 if (imageFormat != ivciFormat) {
570 std::stringstream ss;
571 ss << "vkCreateImageView() format " << string_VkFormat(ivciFormat) << " differs from image " << (uint64_t)pCreateInfo->image << " format " <<
572 string_VkFormat(imageFormat) << ". Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.";
573 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
574 IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str());
575 }
576 }
577
578 // Validate correct image aspect bits for desired formats and format consistency
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600579 if (vk_format_is_color(imageFormat)) {
580 if ((aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) != VK_IMAGE_ASPECT_COLOR_BIT) {
581 std::stringstream ss;
582 ss << "vkCreateImageView: Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700583 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700584 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600585 }
586 if ((aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) != aspectMask) {
587 std::stringstream ss;
588 ss << "vkCreateImageView: Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700589 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700590 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600591 }
592 if (VK_FALSE == vk_format_is_color(ivciFormat)) {
593 std::stringstream ss;
594 ss << "vkCreateImageView: The image view's format can differ from the parent image's format, but both must be "
595 << "color formats. ImageFormat is " << string_VkFormat(imageFormat) << " ImageViewFormat is " << string_VkFormat(ivciFormat);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700596 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700597 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600598 }
599 // TODO: Uncompressed formats are compatible if they occupy they same number of bits per pixel.
600 // Compressed formats are compatible if the only difference between them is the numerical type of
601 // the uncompressed pixels (e.g. signed vs. unsigned, or sRGB vs. UNORM encoding).
602 } else if (vk_format_is_depth_and_stencil(imageFormat)) {
Mark Lobodzinskid21bbff2015-11-23 09:07:20 -0700603 if ((aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) == 0) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600604 std::stringstream ss;
Mark Lobodzinski26d58042015-11-18 09:14:04 -0700605 ss << "vkCreateImageView: Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700606 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700607 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600608 }
609 if ((aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != aspectMask) {
610 std::stringstream ss;
611 ss << "vkCreateImageView: Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700612 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700613 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600614 }
615 } else if (vk_format_is_depth_only(imageFormat)) {
616 if ((aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) {
617 std::stringstream ss;
618 ss << "vkCreateImageView: Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700619 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700620 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600621 }
622 if ((aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != aspectMask) {
623 std::stringstream ss;
624 ss << "vkCreateImageView: Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700625 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700626 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600627 }
628 } else if (vk_format_is_stencil_only(imageFormat)) {
629 if ((aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT) {
630 std::stringstream ss;
631 ss << "vkCreateImageView: Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700632 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700633 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600634 }
635 if ((aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != aspectMask) {
636 std::stringstream ss;
637 ss << "vkCreateImageView: Stencil-only image formats can have only the VK_IMAGE_ASPECT_STENCIL_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700638 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700639 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600640 }
641 }
642 }
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600643
Mark Lobodzinskiadaac9d2016-01-08 11:07:56 -0700644 if (skipCall) {
Courtney Goeltzenleuchter52fee652015-12-10 16:41:22 -0700645 return VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskiadaac9d2016-01-08 11:07:56 -0700646 }
Tobin Ehlisdea00952015-09-22 08:40:52 -0600647
Chia-I Wuf7458c52015-10-26 21:10:41 +0800648 VkResult result = device_data->device_dispatch_table->CreateImageView(device, pCreateInfo, pAllocator, pView);
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600649 return result;
650}
651
Chia-I Wu9ab61502015-11-06 06:42:02 +0800652VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800653 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600654 VkImage image,
655 VkImageLayout imageLayout,
656 const VkClearColorValue *pColor,
657 uint32_t rangeCount,
658 const VkImageSubresourceRange *pRanges)
659{
660 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800661 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600662 // For each range, image aspect must be color only
663 for (uint32_t i = 0; i < rangeCount; i++) {
664 if (pRanges[i].aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600665 char const str[] = "vkCmdClearColorImage aspectMasks for all subresource ranges must be set to VK_IMAGE_ASPECT_COLOR_BIT";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700666 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700667 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600668 }
669 }
670
671 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800672 device_data->device_dispatch_table->CmdClearColorImage(commandBuffer, image, imageLayout,
673 pColor, rangeCount, pRanges);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600674 }
675}
676
Chia-I Wu9ab61502015-11-06 06:42:02 +0800677VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800678 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600679 VkImage image,
680 VkImageLayout imageLayout,
681 const VkClearDepthStencilValue *pDepthStencil,
682 uint32_t rangeCount,
683 const VkImageSubresourceRange *pRanges)
684{
685 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800686 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600687 // For each range, Image aspect must be depth or stencil or both
688 for (uint32_t i = 0; i < rangeCount; i++) {
689 if (((pRanges[i].aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) &&
690 ((pRanges[i].aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT))
691 {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600692 char const str[] = "vkCmdClearDepthStencilImage aspectMasks for all subresource ranges must be "
693 "set to VK_IMAGE_ASPECT_DEPTH_BIT and/or VK_IMAGE_ASPECT_STENCIL_BIT";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700694 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700695 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600696 }
697 }
698
699 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800700 device_data->device_dispatch_table->CmdClearDepthStencilImage(commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600701 image, imageLayout, pDepthStencil, rangeCount, pRanges);
702 }
703}
704
Chia-I Wu9ab61502015-11-06 06:42:02 +0800705VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800706 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600707 VkImage srcImage,
708 VkImageLayout srcImageLayout,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800709 VkImage dstImage,
710 VkImageLayout dstImageLayout,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600711 uint32_t regionCount,
712 const VkImageCopy *pRegions)
713{
714 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800715 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Chia-I Wue2fc5522015-10-26 20:04:44 +0800716 auto srcImageEntry = device_data->imageMap.find(srcImage);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800717 auto dstImageEntry = device_data->imageMap.find(dstImage);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600718
Jeremy Hayes148bab22015-10-28 13:01:39 -0600719 // For each region, src and dst number of layers should not be zero
720 // For each region, src and dst number of layers must match
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600721 // For each region, src aspect mask must match dest aspect mask
722 // For each region, color aspects cannot be mixed with depth/stencil aspects
723 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800724 if(pRegions[i].srcSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600725 {
726 char const str[] = "vkCmdCopyImage: number of layers in source subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700727 // TODO: Verify against Valid Use section of spec
728 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700729 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600730 }
731
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800732 if(pRegions[i].dstSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600733 {
734 char const str[] = "vkCmdCopyImage: number of layers in destination subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700735 // TODO: Verify against Valid Use section of spec
736 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700737 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600738 }
739
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800740 if(pRegions[i].srcSubresource.layerCount != pRegions[i].dstSubresource.layerCount)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600741 {
742 char const str[] = "vkCmdCopyImage: number of layers in source and destination subresources must match";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700743 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700744 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600745 }
746
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800747 if (pRegions[i].srcSubresource.aspectMask != pRegions[i].dstSubresource.aspectMask) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600748 char const str[] = "vkCmdCopyImage: Src and dest aspectMasks for each region must match";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700749 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700750 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600751 }
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800752 if ((pRegions[i].srcSubresource.aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) &&
753 (pRegions[i].srcSubresource.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600754 char const str[] = "vkCmdCopyImage aspectMask cannot specify both COLOR and DEPTH/STENCIL aspects";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700755 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700756 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600757 }
758 }
759
Mike Stroyana3082432015-09-25 13:39:21 -0600760 if ((srcImageEntry != device_data->imageMap.end())
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800761 && (dstImageEntry != device_data->imageMap.end())) {
762 if (srcImageEntry->second.imageType != dstImageEntry->second.imageType) {
Mike Stroyana3082432015-09-25 13:39:21 -0600763 char const str[] = "vkCmdCopyImage called with unmatched source and dest image types.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700764 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700765 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_TYPE, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -0600766 }
767 // Check that format is same size or exact stencil/depth
Tobin Ehlisd923d152015-09-25 14:49:43 -0600768 if (is_depth_format(srcImageEntry->second.format)) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800769 if (srcImageEntry->second.format != dstImageEntry->second.format) {
Mike Stroyana3082432015-09-25 13:39:21 -0600770 char const str[] = "vkCmdCopyImage called with unmatched source and dest image depth/stencil formats.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700771 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700772 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -0600773 }
774 } else {
Tobin Ehlisd923d152015-09-25 14:49:43 -0600775 size_t srcSize = vk_format_get_size(srcImageEntry->second.format);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800776 size_t destSize = vk_format_get_size(dstImageEntry->second.format);
Mike Stroyana3082432015-09-25 13:39:21 -0600777 if (srcSize != destSize) {
778 char const str[] = "vkCmdCopyImage called with unmatched source and dest image format sizes.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700779 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700780 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -0600781 }
782 }
783 }
784
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600785 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800786 device_data->device_dispatch_table->CmdCopyImage(commandBuffer, srcImage,
787 srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600788 }
789}
790
Chia-I Wu9ab61502015-11-06 06:42:02 +0800791VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800792 VkCommandBuffer commandBuffer,
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600793 uint32_t attachmentCount,
794 const VkClearAttachment* pAttachments,
795 uint32_t rectCount,
Courtney Goeltzenleuchter4ca43f62015-10-15 18:22:08 -0600796 const VkClearRect* pRects)
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600797{
798 VkBool32 skipCall = VK_FALSE;
799 VkImageAspectFlags aspectMask;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800800 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600801 for (uint32_t i = 0; i < attachmentCount; i++) {
802 aspectMask = pAttachments[i].aspectMask;
803 if (aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) {
804 if (aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) {
805 // VK_IMAGE_ASPECT_COLOR_BIT is not the only bit set for this attachment
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600806 char const str[] = "vkCmdClearAttachments aspectMask [%d] must set only VK_IMAGE_ASPECT_COLOR_BIT of a color attachment.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700807 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700808 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str, i);
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600809 }
810 } else {
811 // Image aspect must be depth or stencil or both
812 if (((aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) &&
813 ((aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT))
814 {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600815 char const str[] = "vkCmdClearAttachments aspectMask [%d] must be set to VK_IMAGE_ASPECT_DEPTH_BIT and/or VK_IMAGE_ASPECT_STENCIL_BIT";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700816 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700817 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str, i);
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600818 }
819 }
820 }
821
822 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800823 device_data->device_dispatch_table->CmdClearAttachments(commandBuffer,
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600824 attachmentCount, pAttachments, rectCount, pRects);
825 }
826}
827
Chia-I Wu9ab61502015-11-06 06:42:02 +0800828VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800829 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600830 VkImage srcImage,
831 VkImageLayout srcImageLayout,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800832 VkBuffer dstBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600833 uint32_t regionCount,
834 const VkBufferImageCopy *pRegions)
835{
836 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800837 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600838 // For each region, the number of layers in the image subresource should not be zero
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600839 // Image aspect must be ONE OF color, depth, stencil
840 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800841 if(pRegions[i].imageSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600842 {
Jeremy Hayes148bab22015-10-28 13:01:39 -0600843 char const str[] = "vkCmdCopyImageToBuffer: number of layers in image subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700844 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
845 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700846 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600847 }
848
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800849 VkImageAspectFlags aspectMask = pRegions[i].imageSubresource.aspectMask;
850 if ((aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) &&
851 (aspectMask != VK_IMAGE_ASPECT_DEPTH_BIT) &&
852 (aspectMask != VK_IMAGE_ASPECT_STENCIL_BIT)) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600853 char const str[] = "vkCmdCopyImageToBuffer: aspectMasks for each region must specify only COLOR or DEPTH or STENCIL";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700854 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700855 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600856 }
857 }
858
859 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800860 device_data->device_dispatch_table->CmdCopyImageToBuffer(commandBuffer,
861 srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600862 }
863}
864
Chia-I Wu9ab61502015-11-06 06:42:02 +0800865VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800866 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600867 VkBuffer srcBuffer,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800868 VkImage dstImage,
869 VkImageLayout dstImageLayout,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600870 uint32_t regionCount,
871 const VkBufferImageCopy *pRegions)
872{
873 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800874 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600875 // For each region, the number of layers in the image subresource should not be zero
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600876 // Image aspect must be ONE OF color, depth, stencil
877 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800878 if(pRegions[i].imageSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600879 {
Jeremy Hayes148bab22015-10-28 13:01:39 -0600880 char const str[] = "vkCmdCopyBufferToImage: number of layers in image subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700881 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
882 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700883 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600884 }
885
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800886 VkImageAspectFlags aspectMask = pRegions[i].imageSubresource.aspectMask;
887 if ((aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) &&
888 (aspectMask != VK_IMAGE_ASPECT_DEPTH_BIT) &&
889 (aspectMask != VK_IMAGE_ASPECT_STENCIL_BIT)) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600890 char const str[] = "vkCmdCopyBufferToImage: aspectMasks for each region must specify only COLOR or DEPTH or STENCIL";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700891 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700892 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600893 }
894 }
895
896 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800897 device_data->device_dispatch_table->CmdCopyBufferToImage(commandBuffer,
898 srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600899 }
900}
901
Chia-I Wu9ab61502015-11-06 06:42:02 +0800902VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800903 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600904 VkImage srcImage,
905 VkImageLayout srcImageLayout,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800906 VkImage dstImage,
907 VkImageLayout dstImageLayout,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600908 uint32_t regionCount,
909 const VkImageBlit *pRegions,
Chia-I Wub99df442015-10-26 16:49:32 +0800910 VkFilter filter)
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600911{
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600912 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800913 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600914
Chia-I Wue2fc5522015-10-26 20:04:44 +0800915 auto srcImageEntry = device_data->imageMap.find(srcImage);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800916 auto dstImageEntry = device_data->imageMap.find(dstImage);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600917
918 if ((srcImageEntry != device_data->imageMap.end()) &&
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800919 (dstImageEntry != device_data->imageMap.end())) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600920
Tobin Ehlisd923d152015-09-25 14:49:43 -0600921 VkFormat srcFormat = srcImageEntry->second.format;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800922 VkFormat dstFormat = dstImageEntry->second.format;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600923
924 // Validate consistency for signed and unsigned formats
925 if ((vk_format_is_sint(srcFormat) && !vk_format_is_sint(dstFormat)) ||
926 (vk_format_is_uint(srcFormat) && !vk_format_is_uint(dstFormat))) {
927 std::stringstream ss;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800928 ss << "vkCmdBlitImage: If one of srcImage and dstImage images has signed/unsigned integer format, "
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600929 << "the other one must also have signed/unsigned integer format. "
Mark Lobodzinski2e8ccbb2015-12-31 09:49:50 -0700930 << "Source format is " << string_VkFormat(srcFormat) << " Destination format is " << string_VkFormat(dstFormat);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700931 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700932 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600933 }
934
935 // Validate aspect bits and formats for depth/stencil images
936 if (vk_format_is_depth_or_stencil(srcFormat) ||
937 vk_format_is_depth_or_stencil(dstFormat)) {
938 if (srcFormat != dstFormat) {
939 std::stringstream ss;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800940 ss << "vkCmdBlitImage: If one of srcImage and dstImage images has a format of depth, stencil or depth "
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600941 << "stencil, the other one must have exactly the same format. "
Mark Lobodzinski2e8ccbb2015-12-31 09:49:50 -0700942 << "Source format is " << string_VkFormat(srcFormat) << " Destination format is " << string_VkFormat(dstFormat);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700943 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700944 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600945 }
946
947 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800948 if(pRegions[i].srcSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600949 {
950 char const str[] = "vkCmdBlitImage: number of layers in source subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700951 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
952 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700953 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600954 }
955
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800956 if(pRegions[i].dstSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600957 {
958 char const str[] = "vkCmdBlitImage: number of layers in destination subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700959 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
960 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700961 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600962 }
963
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800964 if(pRegions[i].srcSubresource.layerCount != pRegions[i].dstSubresource.layerCount)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600965 {
966 char const str[] = "vkCmdBlitImage: number of layers in source and destination subresources must match";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700967 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700968 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600969 }
970
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800971 VkImageAspectFlags srcAspect = pRegions[i].srcSubresource.aspectMask;
972 VkImageAspectFlags dstAspect = pRegions[i].dstSubresource.aspectMask;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600973
974 if (srcAspect != dstAspect) {
975 std::stringstream ss;
976 ss << "vkCmdBlitImage: Image aspects of depth/stencil images should match";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700977 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
978 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700979 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600980 }
981 if (vk_format_is_depth_and_stencil(srcFormat)) {
Mark Lobodzinskib0166852016-01-12 13:18:44 -0700982 if ((srcAspect != VK_IMAGE_ASPECT_DEPTH_BIT) && (srcAspect != VK_IMAGE_ASPECT_STENCIL_BIT)) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600983 std::stringstream ss;
Mark Lobodzinskib0166852016-01-12 13:18:44 -0700984 ss << "vkCmdBlitImage: Combination depth/stencil image formats must have only one of VK_IMAGE_ASPECT_DEPTH_BIT "
985 << "and VK_IMAGE_ASPECT_STENCIL_BIT set in srcImage and dstImage";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700986 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700987 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600988 }
989 } else if (vk_format_is_stencil_only(srcFormat)) {
990 if (srcAspect != VK_IMAGE_ASPECT_STENCIL_BIT) {
991 std::stringstream ss;
992 ss << "vkCmdBlitImage: Stencil-only image formats must have only the VK_IMAGE_ASPECT_STENCIL_BIT "
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800993 << "set in both the srcImage and dstImage";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700994 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700995 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600996 }
997 } else if (vk_format_is_depth_only(srcFormat)) {
998 if (srcAspect != VK_IMAGE_ASPECT_DEPTH_BIT) {
999 std::stringstream ss;
1000 ss << "vkCmdBlitImage: Depth-only image formats must have only the VK_IMAGE_ASPECT_DEPTH "
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001001 << "set in both the srcImage and dstImage";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001002 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -07001003 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001004 }
1005 }
1006 }
1007 }
1008
1009 // Validate filter
1010 if (vk_format_is_depth_or_stencil(srcFormat) ||
1011 vk_format_is_int(srcFormat)) {
Chia-I Wub99df442015-10-26 16:49:32 +08001012 if (filter != VK_FILTER_NEAREST) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001013 std::stringstream ss;
1014 ss << "vkCmdBlitImage: If the format of srcImage is a depth, stencil, depth stencil or integer-based format "
Chia-I Wub99df442015-10-26 16:49:32 +08001015 << "then filter must be VK_FILTER_NEAREST.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001016 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -07001017 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_FILTER, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001018 }
1019 }
1020 }
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001021
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001022 device_data->device_dispatch_table->CmdBlitImage(commandBuffer, srcImage,
1023 srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001024}
1025
Jeremy Hayes01b38892015-11-17 18:19:55 -07001026VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(
1027 VkCommandBuffer commandBuffer,
1028 VkPipelineStageFlags srcStageMask,
1029 VkPipelineStageFlags dstStageMask,
1030 VkDependencyFlags dependencyFlags,
1031 uint32_t memoryBarrierCount,
Jon Ashburnf19916e2016-01-11 13:12:43 -07001032 const VkMemoryBarrier *pMemoryBarriers,
1033 uint32_t bufferMemoryBarrierCount,
1034 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
1035 uint32_t imageMemoryBarrierCount,
1036 const VkImageMemoryBarrier *pImageMemoryBarriers)
Jeremy Hayes01b38892015-11-17 18:19:55 -07001037{
1038 VkBool32 skipCall = VK_FALSE;
1039 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
1040
Jon Ashburnf19916e2016-01-11 13:12:43 -07001041 for (uint32_t i = 0; i < imageMemoryBarrierCount; ++i)
Jeremy Hayes01b38892015-11-17 18:19:55 -07001042 {
Jon Ashburnf19916e2016-01-11 13:12:43 -07001043 VkImageMemoryBarrier const*const barrier = (VkImageMemoryBarrier const*const) &pImageMemoryBarriers[i];
Jeremy Hayes01b38892015-11-17 18:19:55 -07001044 if (barrier->sType == VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER)
1045 {
1046 if (barrier->subresourceRange.layerCount == 0)
1047 {
1048 std::stringstream ss;
1049 ss << "vkCmdPipelineBarrier called with 0 in ppMemoryBarriers[" << i << "]->subresourceRange.layerCount.";
Mark Lobodzinski37a38b12016-01-04 13:32:45 -07001050 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0,
1051 0, __LINE__, IMAGE_INVALID_IMAGE_RESOURCE, "IMAGE", "%s", ss.str().c_str());
Jeremy Hayes01b38892015-11-17 18:19:55 -07001052 }
1053 }
1054 }
1055
1056 if (skipCall)
1057 {
1058 return;
1059 }
1060
1061 device_data->device_dispatch_table->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags,
Jon Ashburnf19916e2016-01-11 13:12:43 -07001062 memoryBarrierCount, pMemoryBarriers,
1063 bufferMemoryBarrierCount, pBufferMemoryBarriers,
1064 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Hayes01b38892015-11-17 18:19:55 -07001065}
1066
Chia-I Wu9ab61502015-11-06 06:42:02 +08001067VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001068 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001069 VkImage srcImage,
1070 VkImageLayout srcImageLayout,
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001071 VkImage dstImage,
1072 VkImageLayout dstImageLayout,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001073 uint32_t regionCount,
1074 const VkImageResolve *pRegions)
1075{
1076 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001077 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Chia-I Wue2fc5522015-10-26 20:04:44 +08001078 auto srcImageEntry = device_data->imageMap.find(srcImage);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001079 auto dstImageEntry = device_data->imageMap.find(dstImage);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001080
Jeremy Hayes148bab22015-10-28 13:01:39 -06001081 // For each region, the number of layers in the image subresource should not be zero
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001082 // For each region, src and dest image aspect must be color only
1083 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001084 if(pRegions[i].srcSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -06001085 {
1086 char const str[] = "vkCmdResolveImage: number of layers in source subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001087 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid/error
1088 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -07001089 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -06001090 }
1091
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001092 if(pRegions[i].dstSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -06001093 {
1094 char const str[] = "vkCmdResolveImage: number of layers in destination subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001095
1096 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid/error
1097 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -07001098 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -06001099 }
1100
Chia-I Wuab83a0e2015-10-27 19:00:15 +08001101 if ((pRegions[i].srcSubresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) ||
1102 (pRegions[i].dstSubresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT)) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001103 char const str[] = "vkCmdResolveImage: src and dest aspectMasks for each region must specify only VK_IMAGE_ASPECT_COLOR_BIT";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001104 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -07001105 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001106 }
1107 }
1108
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001109 if ((srcImageEntry != device_data->imageMap.end()) &&
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001110 (dstImageEntry != device_data->imageMap.end())) {
1111 if (srcImageEntry->second.format != dstImageEntry->second.format) {
Mike Stroyana3082432015-09-25 13:39:21 -06001112 char const str[] = "vkCmdResolveImage called with unmatched source and dest formats.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001113 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -07001114 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -06001115 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001116 if (srcImageEntry->second.imageType != dstImageEntry->second.imageType) {
Mike Stroyana3082432015-09-25 13:39:21 -06001117 char const str[] = "vkCmdResolveImage called with unmatched source and dest image types.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001118 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -07001119 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_TYPE, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -06001120 }
Chia-I Wu5c17c962015-10-31 00:31:16 +08001121 if (srcImageEntry->second.samples == VK_SAMPLE_COUNT_1_BIT) {
Mike Stroyana3082432015-09-25 13:39:21 -06001122 char const str[] = "vkCmdResolveImage called with source sample count less than 2.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001123 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -07001124 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_RESOLVE_SAMPLES, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -06001125 }
Chia-I Wu5c17c962015-10-31 00:31:16 +08001126 if (dstImageEntry->second.samples != VK_SAMPLE_COUNT_1_BIT) {
Mike Stroyana3082432015-09-25 13:39:21 -06001127 char const str[] = "vkCmdResolveImage called with dest sample count greater than 1.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001128 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -07001129 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_RESOLVE_SAMPLES, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -06001130 }
1131 }
1132
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001133 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001134 device_data->device_dispatch_table->CmdResolveImage(commandBuffer, srcImage,
1135 srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001136 }
1137}
1138
Chia-I Wu9ab61502015-11-06 06:42:02 +08001139VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout(
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001140 VkDevice device,
1141 VkImage image,
1142 const VkImageSubresource *pSubresource,
1143 VkSubresourceLayout *pLayout)
1144{
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001145 VkBool32 skipCall = VK_FALSE;
1146 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1147 VkFormat format;
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001148
Chia-I Wue2fc5522015-10-26 20:04:44 +08001149 auto imageEntry = device_data->imageMap.find(image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001150
1151 // Validate that image aspects match formats
1152 if (imageEntry != device_data->imageMap.end()) {
Tobin Ehlisd923d152015-09-25 14:49:43 -06001153 format = imageEntry->second.format;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001154 if (vk_format_is_color(format)) {
Chia-I Wu52b07e72015-10-27 19:55:05 +08001155 if (pSubresource->aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001156 std::stringstream ss;
Chia-I Wu52b07e72015-10-27 19:55:05 +08001157 ss << "vkGetImageSubresourceLayout: For color formats, the aspectMask field of VkImageSubresource must be VK_IMAGE_ASPECT_COLOR.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001158 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -07001159 (uint64_t)image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001160 }
1161 } else if (vk_format_is_depth_or_stencil(format)) {
Chia-I Wu52b07e72015-10-27 19:55:05 +08001162 if ((pSubresource->aspectMask != VK_IMAGE_ASPECT_DEPTH_BIT) &&
1163 (pSubresource->aspectMask != VK_IMAGE_ASPECT_STENCIL_BIT)) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001164 std::stringstream ss;
Chia-I Wu52b07e72015-10-27 19:55:05 +08001165 ss << "vkGetImageSubresourceLayout: For depth/stencil formats, the aspectMask selects either the depth or stencil image aspectMask.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001166 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski37a38b12016-01-04 13:32:45 -07001167 (uint64_t)image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001168 }
1169 }
1170 }
1171
1172 if (VK_FALSE == skipCall) {
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001173 device_data->device_dispatch_table->GetImageSubresourceLayout(device,
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001174 image, pSubresource, pLayout);
1175 }
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001176}
1177
Mark Lobodzinskid5a23822015-11-12 15:14:35 -07001178VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties)
1179{
1180 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1181 phy_dev_data->instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, pProperties);
1182}
1183
Chia-I Wu9ab61502015-11-06 06:42:02 +08001184VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001185{
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001186 if (!strcmp(funcName, "vkGetDeviceProcAddr"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001187 return (PFN_vkVoidFunction) vkGetDeviceProcAddr;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001188 if (!strcmp(funcName, "vkDestroyDevice"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001189 return (PFN_vkVoidFunction) vkDestroyDevice;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001190 if (!strcmp(funcName, "vkCreateImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001191 return (PFN_vkVoidFunction) vkCreateImage;
Mark Lobodzinski46fc3dd2015-10-29 12:58:33 -06001192 if (!strcmp(funcName, "vkDestroyImage"))
1193 return (PFN_vkVoidFunction) vkDestroyImage;
Tobin Ehliscde08892015-09-22 10:11:37 -06001194 if (!strcmp(funcName, "vkCreateImageView"))
1195 return (PFN_vkVoidFunction) vkCreateImageView;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001196 if (!strcmp(funcName, "vkCreateRenderPass"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001197 return (PFN_vkVoidFunction) vkCreateRenderPass;
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001198 if (!strcmp(funcName, "vkCmdClearColorImage"))
1199 return (PFN_vkVoidFunction) vkCmdClearColorImage;
1200 if (!strcmp(funcName, "vkCmdClearDepthStencilImage"))
1201 return (PFN_vkVoidFunction) vkCmdClearDepthStencilImage;
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06001202 if (!strcmp(funcName, "vkCmdClearAttachments"))
1203 return (PFN_vkVoidFunction) vkCmdClearAttachments;
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001204 if (!strcmp(funcName, "vkCmdCopyImage"))
1205 return (PFN_vkVoidFunction) vkCmdCopyImage;
1206 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
1207 return (PFN_vkVoidFunction) vkCmdCopyImageToBuffer;
1208 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
1209 return (PFN_vkVoidFunction) vkCmdCopyBufferToImage;
1210 if (!strcmp(funcName, "vkCmdBlitImage"))
1211 return (PFN_vkVoidFunction) vkCmdBlitImage;
Jeremy Hayes01b38892015-11-17 18:19:55 -07001212 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
1213 return (PFN_vkVoidFunction) vkCmdPipelineBarrier;
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001214 if (!strcmp(funcName, "vkCmdResolveImage"))
1215 return (PFN_vkVoidFunction) vkCmdResolveImage;
1216 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
1217 return (PFN_vkVoidFunction) vkGetImageSubresourceLayout;
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001218
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001219 if (device == NULL) {
1220 return NULL;
1221 }
1222
1223 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1224
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001225 VkLayerDispatchTable* pTable = my_data->device_dispatch_table;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001226 {
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001227 if (pTable->GetDeviceProcAddr == NULL)
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001228 return NULL;
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001229 return pTable->GetDeviceProcAddr(device, funcName);
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001230 }
1231}
1232
Chia-I Wu9ab61502015-11-06 06:42:02 +08001233VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001234{
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001235 if (!strcmp(funcName, "vkGetInstanceProcAddr"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001236 return (PFN_vkVoidFunction) vkGetInstanceProcAddr;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001237 if (!strcmp(funcName, "vkCreateInstance"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001238 return (PFN_vkVoidFunction) vkCreateInstance;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001239 if (!strcmp(funcName, "vkDestroyInstance"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001240 return (PFN_vkVoidFunction) vkDestroyInstance;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001241 if (!strcmp(funcName, "vkCreateDevice"))
1242 return (PFN_vkVoidFunction) vkCreateDevice;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06001243 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
1244 return (PFN_vkVoidFunction) vkEnumerateInstanceLayerProperties;
1245 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
1246 return (PFN_vkVoidFunction) vkEnumerateInstanceExtensionProperties;
1247 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
1248 return (PFN_vkVoidFunction) vkEnumerateDeviceLayerProperties;
1249 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
1250 return (PFN_vkVoidFunction) vkEnumerateDeviceExtensionProperties;
Mark Lobodzinskid5a23822015-11-12 15:14:35 -07001251 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
1252 return (PFN_vkVoidFunction) vkGetPhysicalDeviceProperties;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001253
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001254 if (instance == NULL) {
1255 return NULL;
1256 }
1257
1258 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
1259
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001260 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(my_data->report_data, funcName);
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001261 if(fptr)
1262 return fptr;
1263
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -07001264 VkLayerInstanceDispatchTable* pTable = my_data->instance_dispatch_table;
1265 if (pTable->GetInstanceProcAddr == NULL)
1266 return NULL;
1267 return pTable->GetInstanceProcAddr(instance, funcName);
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001268}