blob: cf7d630291330fb947e9ae3ee423df9ed4c0caa9 [file] [log] [blame]
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001/*
Jeremy Hayes9cc31582015-06-18 10:12:39 -06002 *
Courtney Goeltzenleuchterfcbe16f2015-10-29 13:50:34 -06003 * Copyright (C) 2015 Valve Corporation
Jeremy Hayes9cc31582015-06-18 10:12:39 -06004 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included
13 * in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060022 *
23 * Author: Jeremy Hayes <jeremy@lunarg.com>
24 * Author: Mark Lobodzinski <mark@lunarg.com>
25 * Author: Mike Stroyan <mike@LunarG.com>
26 * Author: Tobin Ehlis <tobin@lunarg.com>
Jeremy Hayes9cc31582015-06-18 10:12:39 -060027 */
28
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060029#include <inttypes.h>
Jeremy Hayes9cc31582015-06-18 10:12:39 -060030#include <stdio.h>
31#include <stdlib.h>
32#include <string.h>
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060033#include <assert.h>
34#include <vector>
Jeremy Hayes9cc31582015-06-18 10:12:39 -060035#include <unordered_map>
Tobin Ehlisad8c4462015-09-21 15:20:28 -060036#include <memory>
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060037using namespace std;
Jeremy Hayes9cc31582015-06-18 10:12:39 -060038
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060039#include "vk_loader_platform.h"
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060040#include "vk_dispatch_table_helper.h"
41#include "vk_struct_string_helper_cpp.h"
Jeremy Hayes9cc31582015-06-18 10:12:39 -060042#include "vk_enum_validate_helper.h"
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060043#include "image.h"
44#include "vk_layer_config.h"
45#include "vk_layer_extension_utils.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060046#include "vk_layer_table.h"
47#include "vk_layer_data.h"
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -060048#include "vk_layer_extension_utils.h"
Mike Stroyana3082432015-09-25 13:39:21 -060049#include "vk_layer_utils.h"
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060050#include "vk_layer_logging.h"
Jeremy Hayes9cc31582015-06-18 10:12:39 -060051
Tobin Ehlisad8c4462015-09-21 15:20:28 -060052using namespace std;
53
Cody Northrop55443ef2015-09-28 15:09:32 -060054struct layer_data {
Mark Lobodzinskid5a23822015-11-12 15:14:35 -070055 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070056 vector<VkDebugReportCallbackEXT> logging_callback;
Mark Lobodzinskid5a23822015-11-12 15:14:35 -070057 VkLayerDispatchTable* device_dispatch_table;
58 VkLayerInstanceDispatchTable *instance_dispatch_table;
59 VkPhysicalDevice physicalDevice;
60 VkPhysicalDeviceProperties physicalDeviceProperties;
61
Chia-I Wue2fc5522015-10-26 20:04:44 +080062 unordered_map<VkImage, IMAGE_STATE> imageMap;
Cody Northrop55443ef2015-09-28 15:09:32 -060063
64 layer_data() :
65 report_data(nullptr),
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -060066 device_dispatch_table(nullptr),
67 instance_dispatch_table(nullptr),
Mark Lobodzinskid5a23822015-11-12 15:14:35 -070068 physicalDevice(0),
69 physicalDeviceProperties()
Cody Northrop55443ef2015-09-28 15:09:32 -060070 {};
71};
Jeremy Hayes9cc31582015-06-18 10:12:39 -060072
Tobin Ehlisad8c4462015-09-21 15:20:28 -060073static unordered_map<void*, layer_data*> layer_data_map;
Jeremy Hayes9cc31582015-06-18 10:12:39 -060074
Courtney Goeltzenleuchter6d8e8182015-11-25 14:31:49 -070075static void InitImage(layer_data *data, const VkAllocationCallbacks *pAllocator)
Jeremy Hayes9cc31582015-06-18 10:12:39 -060076{
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070077 VkDebugReportCallbackEXT callback;
Jeremy Hayes9cc31582015-06-18 10:12:39 -060078 uint32_t report_flags = getLayerOptionFlags("ImageReportFlags", 0);
79
80 uint32_t debug_action = 0;
81 getLayerOptionEnum("ImageDebugAction", (uint32_t *) &debug_action);
82 if(debug_action & VK_DBG_LAYER_ACTION_LOG_MSG)
83 {
84 FILE *log_output = NULL;
85 const char* option_str = getLayerOption("ImageLogFilename");
Tobin Ehlisb1df55e2015-09-15 09:55:54 -060086 log_output = getLayerLogOutput(option_str, "Image");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070087 VkDebugReportCallbackCreateInfoEXT dbgInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -070088 memset(&dbgInfo, 0, sizeof(dbgInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070089 dbgInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -070090 dbgInfo.pfnCallback = log_callback;
91 dbgInfo.pUserData = log_output;
92 dbgInfo.flags = report_flags;
93 layer_create_msg_callback(data->report_data, &dbgInfo, pAllocator, &callback);
Courtney Goeltzenleuchterffcdd8b2015-10-05 15:59:11 -060094 data->logging_callback.push_back(callback);
95 }
96
97 if (debug_action & VK_DBG_LAYER_ACTION_DEBUG_OUTPUT) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070098 VkDebugReportCallbackCreateInfoEXT dbgInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -070099 memset(&dbgInfo, 0, sizeof(dbgInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700100 dbgInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700101 dbgInfo.pfnCallback = win32_debug_output_msg;
102 dbgInfo.flags = report_flags;
103 layer_create_msg_callback(data->report_data, &dbgInfo, pAllocator, &callback);
Courtney Goeltzenleuchterffcdd8b2015-10-05 15:59:11 -0600104 data->logging_callback.push_back(callback);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600105 }
106}
107
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700108VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700109 VkInstance instance,
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700110 const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700111 const VkAllocationCallbacks* pAllocator,
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700112 VkDebugReportCallbackEXT* pMsgCallback)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600113{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600114 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700115 VkResult res = my_data->instance_dispatch_table->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600116 if (res == VK_SUCCESS) {
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700117 res = layer_create_msg_callback(my_data->report_data, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600118 }
119 return res;
120}
121
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700122VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700123 VkInstance instance,
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700124 VkDebugReportCallbackEXT msgCallback,
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700125 const VkAllocationCallbacks* pAllocator)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600126{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600127 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700128 my_data->instance_dispatch_table->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700129 layer_destroy_msg_callback(my_data->report_data, msgCallback, pAllocator);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600130}
131
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700132VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700133 VkInstance instance,
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700134 VkDebugReportFlagsEXT flags,
135 VkDebugReportObjectTypeEXT objType,
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700136 uint64_t object,
137 size_t location,
138 int32_t msgCode,
139 const char* pLayerPrefix,
140 const char* pMsg)
141{
142 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700143 my_data->instance_dispatch_table->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700144}
145
Chia-I Wu9ab61502015-11-06 06:42:02 +0800146VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkInstance* pInstance)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600147{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600148 layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
149 VkLayerInstanceDispatchTable *pTable = my_data->instance_dispatch_table;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800150 VkResult result = pTable->CreateInstance(pCreateInfo, pAllocator, pInstance);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600151
152 if (result == VK_SUCCESS) {
Chia-I Wud50a7d72015-10-26 20:48:51 +0800153 my_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionNameCount,
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600154 pCreateInfo->ppEnabledExtensionNames);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600155
Courtney Goeltzenleuchter6d8e8182015-11-25 14:31:49 -0700156 InitImage(my_data, pAllocator);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600157 }
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600158 return result;
159}
160
Chia-I Wu9ab61502015-11-06 06:42:02 +0800161VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks* pAllocator)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600162{
163 // Grab the key before the instance is destroyed.
164 dispatch_key key = get_dispatch_key(instance);
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600165 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
166 VkLayerInstanceDispatchTable *pTable = my_data->instance_dispatch_table;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800167 pTable->DestroyInstance(instance, pAllocator);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600168
169 // Clean up logging callback, if any
Courtney Goeltzenleuchterffcdd8b2015-10-05 15:59:11 -0600170 while (my_data->logging_callback.size() > 0) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700171 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700172 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Courtney Goeltzenleuchterffcdd8b2015-10-05 15:59:11 -0600173 my_data->logging_callback.pop_back();
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600174 }
175
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600176 layer_debug_report_destroy_instance(my_data->report_data);
177 delete my_data->instance_dispatch_table;
178 layer_data_map.erase(key);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600179
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600180}
181
Chia-I Wu9ab61502015-11-06 06:42:02 +0800182VK_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 -0600183{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600184 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
185 layer_data *device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
Chia-I Wuf7458c52015-10-26 21:10:41 +0800186 VkResult result = device_data->device_dispatch_table->CreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600187 if(result == VK_SUCCESS)
188 {
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600189 device_data->report_data = layer_debug_report_create_device(instance_data->report_data, *pDevice);
Chris Forbesbc0bb772015-06-21 22:55:02 +1200190 device_data->physicalDevice = physicalDevice;
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600191 }
192
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700193 instance_data->instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &(device_data->physicalDeviceProperties));
194
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600195 return result;
196}
197
Chia-I Wu9ab61502015-11-06 06:42:02 +0800198VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600199{
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600200 dispatch_key key = get_dispatch_key(device);
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600201 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Chia-I Wuf7458c52015-10-26 21:10:41 +0800202 my_data->device_dispatch_table->DestroyDevice(device, pAllocator);
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600203 delete my_data->device_dispatch_table;
204 layer_data_map.erase(key);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600205}
206
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700207static const VkExtensionProperties instance_extensions[] = {
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600208 {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700209 VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
210 VK_EXT_DEBUG_REPORT_REVISION
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600211 }
212};
213
Chia-I Wu9ab61502015-11-06 06:42:02 +0800214VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600215 const char *pLayerName,
216 uint32_t *pCount,
217 VkExtensionProperties* pProperties)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600218{
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700219 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600220}
221
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700222static const VkLayerProperties pc_global_layers[] = {
223 {
224 "Image",
225 VK_API_VERSION,
226 VK_MAKE_VERSION(0, 1, 0),
227 "Validation layer: Image ParamChecker",
228 }
229};
230
Chia-I Wu9ab61502015-11-06 06:42:02 +0800231VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600232 uint32_t *pCount,
233 VkLayerProperties* pProperties)
Tony Barbour59a47322015-06-24 16:06:58 -0600234{
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600235 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers),
236 pc_global_layers,
237 pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -0600238}
239
Chia-I Wu9ab61502015-11-06 06:42:02 +0800240VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600241 VkPhysicalDevice physicalDevice,
242 const char* pLayerName,
243 uint32_t* pCount,
244 VkExtensionProperties* pProperties)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600245{
Jon Ashburn751c4842015-11-02 17:37:20 -0700246 // Image does not have any physical device extensions
247 if (pLayerName == NULL) {
248 dispatch_key key = get_dispatch_key(physicalDevice);
249 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
250 VkLayerInstanceDispatchTable *pTable = my_data->instance_dispatch_table;
251 return pTable->EnumerateDeviceExtensionProperties(
252 physicalDevice,
253 NULL,
254 pCount,
255 pProperties);
256 } else {
257 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
258 }
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600259}
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600260
Chia-I Wu9ab61502015-11-06 06:42:02 +0800261VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600262 VkPhysicalDevice physicalDevice,
263 uint32_t* pCount,
264 VkLayerProperties* pProperties)
265{
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600266 // ParamChecker's physical device layers are the same as global
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600267 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers,
268 pCount, pProperties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600269}
270
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600271// Start of the Image layer proper
272
273// Returns TRUE if a format is a depth-compatible format
274bool is_depth_format(VkFormat format)
275{
276 bool result = VK_FALSE;
277 switch (format) {
278 case VK_FORMAT_D16_UNORM:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800279 case VK_FORMAT_X8_D24_UNORM_PACK32:
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600280 case VK_FORMAT_D32_SFLOAT:
281 case VK_FORMAT_S8_UINT:
282 case VK_FORMAT_D16_UNORM_S8_UINT:
283 case VK_FORMAT_D24_UNORM_S8_UINT:
284 case VK_FORMAT_D32_SFLOAT_S8_UINT:
285 result = VK_TRUE;
286 break;
287 default:
288 break;
289 }
290 return result;
291}
292
Mark Lobodzinski601ed152015-11-10 11:01:32 -0700293static inline uint32_t validate_VkImageLayoutKHR(VkImageLayout input_value)
294{
295 return ((validate_VkImageLayout(input_value) == 1) ||
Ian Elliott05846062015-11-20 14:13:17 -0700296 (input_value == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR));
Mark Lobodzinski601ed152015-11-10 11:01:32 -0700297}
298
Chia-I Wu9ab61502015-11-06 06:42:02 +0800299VK_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 -0600300{
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700301 VkBool32 skipCall = VK_FALSE;
Courtney Goeltzenleuchter52fee652015-12-10 16:41:22 -0700302 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700303 VkImageFormatProperties ImageFormatProperties = {0};
304
305 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
306 VkPhysicalDevice physicalDevice = device_data->physicalDevice;
307 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
308
309 if (pCreateInfo->format != VK_FORMAT_UNDEFINED)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600310 {
311 VkFormatProperties properties;
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700312 phy_dev_data->instance_dispatch_table->GetPhysicalDeviceFormatProperties(
Chris Forbesbc0bb772015-06-21 22:55:02 +1200313 device_data->physicalDevice, pCreateInfo->format, &properties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600314
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700315 if ((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600316 {
317 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains unsupported format";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700318 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid
319 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, 0, IMAGE_FORMAT_UNSUPPORTED, "IMAGE", str);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600320 }
321 }
322
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700323 // Internal call to get format info. Still goes through layers, could potentially go directly to ICD.
324 phy_dev_data->instance_dispatch_table->GetPhysicalDeviceImageFormatProperties(
325 physicalDevice, pCreateInfo->format, pCreateInfo->imageType, pCreateInfo->tiling,
326 pCreateInfo->usage, pCreateInfo->flags, &ImageFormatProperties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600327
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700328 VkDeviceSize imageGranularity = device_data->physicalDeviceProperties.limits.bufferImageGranularity;
329 imageGranularity = imageGranularity == 1 ? 0 : imageGranularity;
330
331 if ((pCreateInfo->extent.depth > ImageFormatProperties.maxExtent.depth) ||
332 (pCreateInfo->extent.width > ImageFormatProperties.maxExtent.width) ||
333 (pCreateInfo->extent.height > ImageFormatProperties.maxExtent.height)) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700334 skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, (uint64_t)pImage, 0,
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700335 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
336 "CreateImage extents exceed allowable limits for format: "
337 "Width = %d Height = %d Depth = %d: Limits for Width = %d Height = %d Depth = %d for format %s.",
338 pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth,
339 ImageFormatProperties.maxExtent.width, ImageFormatProperties.maxExtent.height, ImageFormatProperties.maxExtent.depth,
340 string_VkFormat(pCreateInfo->format));
341
342 }
343
344 uint64_t totalSize = ((uint64_t)pCreateInfo->extent.width *
345 (uint64_t)pCreateInfo->extent.height *
346 (uint64_t)pCreateInfo->extent.depth *
347 (uint64_t)pCreateInfo->arrayLayers *
348 (uint64_t)pCreateInfo->samples *
349 (uint64_t)vk_format_get_size(pCreateInfo->format) +
350 (uint64_t)imageGranularity ) & ~(uint64_t)imageGranularity;
351
352 if (totalSize > ImageFormatProperties.maxResourceSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700353 skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, (uint64_t)pImage, 0,
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700354 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
355 "CreateImage resource size exceeds allowable maximum "
356 "Image resource size = %#" PRIxLEAST64 ", maximum resource size = %#" PRIxLEAST64 " ",
357 totalSize, ImageFormatProperties.maxResourceSize);
358 }
359
360 if (pCreateInfo->mipLevels > ImageFormatProperties.maxMipLevels) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700361 skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, (uint64_t)pImage, 0,
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700362 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
363 "CreateImage mipLevels=%d exceeds allowable maximum supported by format of %d",
364 pCreateInfo->mipLevels, ImageFormatProperties.maxMipLevels);
365 }
366
367 if (pCreateInfo->arrayLayers > ImageFormatProperties.maxArrayLayers) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700368 skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, (uint64_t)pImage, 0,
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700369 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
370 "CreateImage arrayLayers=%d exceeds allowable maximum supported by format of %d",
371 pCreateInfo->arrayLayers, ImageFormatProperties.maxArrayLayers);
372 }
373
374 if ((pCreateInfo->samples & ImageFormatProperties.sampleCounts) == 0) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700375 skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, (uint64_t)pImage, 0,
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700376 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
377 "CreateImage samples %s is not supported by format 0x%.8X",
378 string_VkSampleCountFlagBits(pCreateInfo->samples), ImageFormatProperties.sampleCounts);
379 }
380
381 if (VK_FALSE == skipCall) {
382 result = device_data->device_dispatch_table->CreateImage(device, pCreateInfo, pAllocator, pImage);
383 }
384 if (result == VK_SUCCESS) {
Chia-I Wue2fc5522015-10-26 20:04:44 +0800385 device_data->imageMap[*pImage] = IMAGE_STATE(pCreateInfo);
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600386 }
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600387 return result;
388}
389
Chia-I Wu9ab61502015-11-06 06:42:02 +0800390VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator)
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600391{
392 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chia-I Wue2fc5522015-10-26 20:04:44 +0800393 device_data->imageMap.erase(image);
Chia-I Wuf7458c52015-10-26 21:10:41 +0800394 device_data->device_dispatch_table->DestroyImage(device, image, pAllocator);
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600395}
396
Chia-I Wu9ab61502015-11-06 06:42:02 +0800397VK_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 -0600398{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600399 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Tobin Ehlisdea00952015-09-22 08:40:52 -0600400 VkBool32 skipCall = VK_FALSE;
Chia-I Wu08accc62015-07-07 11:50:03 +0800401 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600402 {
Chia-I Wu08accc62015-07-07 11:50:03 +0800403 if(pCreateInfo->pAttachments[i].format != VK_FORMAT_UNDEFINED)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600404 {
405 VkFormatProperties properties;
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600406 get_my_data_ptr(get_dispatch_key(my_data->physicalDevice), layer_data_map)->instance_dispatch_table->GetPhysicalDeviceFormatProperties(
407 my_data->physicalDevice, pCreateInfo->pAttachments[i].format, &properties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600408
409 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
410 {
411 std::stringstream ss;
Chia-I Wu08accc62015-07-07 11:50:03 +0800412 ss << "vkCreateRenderPass parameter, VkFormat in pCreateInfo->pAttachments[" << i << "], contains unsupported format";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700413 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid
414 skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, 0, IMAGE_FORMAT_UNSUPPORTED, "IMAGE", "%s", ss.str().c_str());
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600415 }
416 }
417 }
418
Chia-I Wu08accc62015-07-07 11:50:03 +0800419 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600420 {
Mark Lobodzinski601ed152015-11-10 11:01:32 -0700421 if(!validate_VkImageLayoutKHR(pCreateInfo->pAttachments[i].initialLayout) ||
422 !validate_VkImageLayoutKHR(pCreateInfo->pAttachments[i].finalLayout))
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600423 {
424 std::stringstream ss;
Chia-I Wu08accc62015-07-07 11:50:03 +0800425 ss << "vkCreateRenderPass parameter, VkImageLayout in pCreateInfo->pAttachments[" << i << "], is unrecognized";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700426 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid
427 skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, 0, IMAGE_RENDERPASS_INVALID_ATTACHMENT, "IMAGE", "%s", ss.str().c_str());
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600428 }
429 }
430
Chia-I Wu08accc62015-07-07 11:50:03 +0800431 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600432 {
Chia-I Wu08accc62015-07-07 11:50:03 +0800433 if(!validate_VkAttachmentLoadOp(pCreateInfo->pAttachments[i].loadOp))
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600434 {
435 std::stringstream ss;
Chia-I Wu08accc62015-07-07 11:50:03 +0800436 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp in pCreateInfo->pAttachments[" << i << "], is unrecognized";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700437 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid
438 skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, 0, IMAGE_RENDERPASS_INVALID_ATTACHMENT, "IMAGE", "%s", ss.str().c_str());
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600439 }
440 }
441
Chia-I Wu08accc62015-07-07 11:50:03 +0800442 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600443 {
Chia-I Wu08accc62015-07-07 11:50:03 +0800444 if(!validate_VkAttachmentStoreOp(pCreateInfo->pAttachments[i].storeOp))
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600445 {
446 std::stringstream ss;
Chia-I Wu08accc62015-07-07 11:50:03 +0800447 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp in pCreateInfo->pAttachments[" << i << "], is unrecognized";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700448 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid
449 skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, 0, IMAGE_RENDERPASS_INVALID_ATTACHMENT, "IMAGE", "%s", ss.str().c_str());
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600450 }
451 }
452
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600453 // Any depth buffers specified as attachments?
454 bool depthFormatPresent = VK_FALSE;
455 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
456 {
457 depthFormatPresent |= is_depth_format(pCreateInfo->pAttachments[i].format);
458 }
459
460 if (depthFormatPresent == VK_FALSE) {
461 // No depth attachment is present, validate that subpasses set depthStencilAttachment to VK_ATTACHMENT_UNUSED;
462 for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {
Chia-I Wu1efb7e52015-10-26 17:32:47 +0800463 if (pCreateInfo->pSubpasses[i].pDepthStencilAttachment &&
464 pCreateInfo->pSubpasses[i].pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) {
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600465 std::stringstream ss;
466 ss << "vkCreateRenderPass has no depth/stencil attachment, yet subpass[" << i << "] has VkSubpassDescription::depthStencilAttachment value that is not VK_ATTACHMENT_UNUSED";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700467 skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, 0, IMAGE_RENDERPASS_INVALID_DS_ATTACHMENT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600468 }
469 }
470 }
Tobin Ehlisdea00952015-09-22 08:40:52 -0600471 if (skipCall)
Courtney Goeltzenleuchter52fee652015-12-10 16:41:22 -0700472 return VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600473
Chia-I Wuf7458c52015-10-26 21:10:41 +0800474 VkResult result = my_data->device_dispatch_table->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600475
476 return result;
477}
478
Chia-I Wu9ab61502015-11-06 06:42:02 +0800479VK_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 -0600480{
481 VkBool32 skipCall = VK_FALSE;
482 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chia-I Wue2fc5522015-10-26 20:04:44 +0800483 auto imageEntry = device_data->imageMap.find(pCreateInfo->image);
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600484 if (imageEntry != device_data->imageMap.end()) {
Tobin Ehlisd923d152015-09-25 14:49:43 -0600485 if (pCreateInfo->subresourceRange.baseMipLevel >= imageEntry->second.mipLevels) {
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600486 std::stringstream ss;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600487 ss << "vkCreateImageView called with baseMipLevel " << pCreateInfo->subresourceRange.baseMipLevel
Chia-I Wue2fc5522015-10-26 20:04:44 +0800488 << " for image " << pCreateInfo->image << " that only has " << imageEntry->second.mipLevels << " mip levels.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700489 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, 0, IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str());
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600490 }
Tobin Ehlisd923d152015-09-25 14:49:43 -0600491 if (pCreateInfo->subresourceRange.baseArrayLayer >= imageEntry->second.arraySize) {
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600492 std::stringstream ss;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600493 ss << "vkCreateImageView called with baseArrayLayer " << pCreateInfo->subresourceRange.baseArrayLayer << " for image "
Chia-I Wue2fc5522015-10-26 20:04:44 +0800494 << pCreateInfo->image << " that only has " << imageEntry->second.arraySize << " mip levels.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700495 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, 0, IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str());
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600496 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800497 if (!pCreateInfo->subresourceRange.levelCount) {
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600498 std::stringstream ss;
Jeremy Hayes5097da02015-11-17 18:24:56 -0700499 ss << "vkCreateImageView called with 0 in pCreateInfo->subresourceRange.levelCount.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700500 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, 0, IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str());
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600501 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800502 if (!pCreateInfo->subresourceRange.layerCount) {
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600503 std::stringstream ss;
Jeremy Hayes5097da02015-11-17 18:24:56 -0700504 ss << "vkCreateImageView called with 0 in pCreateInfo->subresourceRange.layerCount.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700505 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, 0, IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str());
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600506 }
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600507
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600508 // Validate correct image aspect bits for desired formats and format consistency
Tobin Ehlisd923d152015-09-25 14:49:43 -0600509 VkFormat imageFormat = imageEntry->second.format;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600510 VkFormat ivciFormat = pCreateInfo->format;
511 VkImageAspectFlags aspectMask = pCreateInfo->subresourceRange.aspectMask;
512
513 if (vk_format_is_color(imageFormat)) {
514 if ((aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) != VK_IMAGE_ASPECT_COLOR_BIT) {
515 std::stringstream ss;
516 ss << "vkCreateImageView: Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700517 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800518 (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600519 }
520 if ((aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) != aspectMask) {
521 std::stringstream ss;
522 ss << "vkCreateImageView: Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700523 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800524 (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600525 }
526 if (VK_FALSE == vk_format_is_color(ivciFormat)) {
527 std::stringstream ss;
528 ss << "vkCreateImageView: The image view's format can differ from the parent image's format, but both must be "
529 << "color formats. ImageFormat is " << string_VkFormat(imageFormat) << " ImageViewFormat is " << string_VkFormat(ivciFormat);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700530 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800531 (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600532 }
533 // TODO: Uncompressed formats are compatible if they occupy they same number of bits per pixel.
534 // Compressed formats are compatible if the only difference between them is the numerical type of
535 // the uncompressed pixels (e.g. signed vs. unsigned, or sRGB vs. UNORM encoding).
536 } else if (vk_format_is_depth_and_stencil(imageFormat)) {
Mark Lobodzinskid21bbff2015-11-23 09:07:20 -0700537 if ((aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) == 0) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600538 std::stringstream ss;
Mark Lobodzinski26d58042015-11-18 09:14:04 -0700539 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 -0700540 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800541 (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600542 }
543 if ((aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != aspectMask) {
544 std::stringstream ss;
545 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 -0700546 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800547 (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600548 }
549 } else if (vk_format_is_depth_only(imageFormat)) {
550 if ((aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) {
551 std::stringstream ss;
552 ss << "vkCreateImageView: Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700553 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800554 (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600555 }
556 if ((aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != aspectMask) {
557 std::stringstream ss;
558 ss << "vkCreateImageView: Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700559 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800560 (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600561 }
562 } else if (vk_format_is_stencil_only(imageFormat)) {
563 if ((aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT) {
564 std::stringstream ss;
565 ss << "vkCreateImageView: Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700566 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800567 (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600568 }
569 if ((aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != aspectMask) {
570 std::stringstream ss;
571 ss << "vkCreateImageView: Stencil-only image formats can have only the VK_IMAGE_ASPECT_STENCIL_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700572 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800573 (uint64_t)pCreateInfo->image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600574 }
575 }
576 }
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600577
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600578 if (skipCall)
Courtney Goeltzenleuchter52fee652015-12-10 16:41:22 -0700579 return VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlisdea00952015-09-22 08:40:52 -0600580
Chia-I Wuf7458c52015-10-26 21:10:41 +0800581 VkResult result = device_data->device_dispatch_table->CreateImageView(device, pCreateInfo, pAllocator, pView);
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600582 return result;
583}
584
Chia-I Wu9ab61502015-11-06 06:42:02 +0800585VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800586 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600587 VkImage image,
588 VkImageLayout imageLayout,
589 const VkClearColorValue *pColor,
590 uint32_t rangeCount,
591 const VkImageSubresourceRange *pRanges)
592{
593 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800594 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600595 // For each range, image aspect must be color only
596 for (uint32_t i = 0; i < rangeCount; i++) {
597 if (pRanges[i].aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600598 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 -0700599 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800600 (uint64_t)commandBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600601 }
602 }
603
604 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800605 device_data->device_dispatch_table->CmdClearColorImage(commandBuffer, image, imageLayout,
606 pColor, rangeCount, pRanges);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600607 }
608}
609
Chia-I Wu9ab61502015-11-06 06:42:02 +0800610VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800611 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600612 VkImage image,
613 VkImageLayout imageLayout,
614 const VkClearDepthStencilValue *pDepthStencil,
615 uint32_t rangeCount,
616 const VkImageSubresourceRange *pRanges)
617{
618 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800619 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600620 // For each range, Image aspect must be depth or stencil or both
621 for (uint32_t i = 0; i < rangeCount; i++) {
622 if (((pRanges[i].aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) &&
623 ((pRanges[i].aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT))
624 {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600625 char const str[] = "vkCmdClearDepthStencilImage aspectMasks for all subresource ranges must be "
626 "set to VK_IMAGE_ASPECT_DEPTH_BIT and/or VK_IMAGE_ASPECT_STENCIL_BIT";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700627 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800628 (uint64_t)commandBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600629 }
630 }
631
632 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800633 device_data->device_dispatch_table->CmdClearDepthStencilImage(commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600634 image, imageLayout, pDepthStencil, rangeCount, pRanges);
635 }
636}
637
Chia-I Wu9ab61502015-11-06 06:42:02 +0800638VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800639 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600640 VkImage srcImage,
641 VkImageLayout srcImageLayout,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800642 VkImage dstImage,
643 VkImageLayout dstImageLayout,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600644 uint32_t regionCount,
645 const VkImageCopy *pRegions)
646{
647 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800648 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Chia-I Wue2fc5522015-10-26 20:04:44 +0800649 auto srcImageEntry = device_data->imageMap.find(srcImage);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800650 auto dstImageEntry = device_data->imageMap.find(dstImage);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600651
Jeremy Hayes148bab22015-10-28 13:01:39 -0600652 // For each region, src and dst number of layers should not be zero
653 // For each region, src and dst number of layers must match
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600654 // For each region, src aspect mask must match dest aspect mask
655 // For each region, color aspects cannot be mixed with depth/stencil aspects
656 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800657 if(pRegions[i].srcSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600658 {
659 char const str[] = "vkCmdCopyImage: number of layers in source subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700660 // TODO: Verify against Valid Use section of spec
661 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800662 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600663 }
664
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800665 if(pRegions[i].dstSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600666 {
667 char const str[] = "vkCmdCopyImage: number of layers in destination subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700668 // TODO: Verify against Valid Use section of spec
669 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800670 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600671 }
672
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800673 if(pRegions[i].srcSubresource.layerCount != pRegions[i].dstSubresource.layerCount)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600674 {
675 char const str[] = "vkCmdCopyImage: number of layers in source and destination subresources must match";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700676 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800677 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600678 }
679
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800680 if (pRegions[i].srcSubresource.aspectMask != pRegions[i].dstSubresource.aspectMask) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600681 char const str[] = "vkCmdCopyImage: Src and dest aspectMasks for each region must match";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700682 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800683 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600684 }
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800685 if ((pRegions[i].srcSubresource.aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) &&
686 (pRegions[i].srcSubresource.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600687 char const str[] = "vkCmdCopyImage aspectMask cannot specify both COLOR and DEPTH/STENCIL aspects";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700688 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800689 (uint64_t)commandBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600690 }
691 }
692
Mike Stroyana3082432015-09-25 13:39:21 -0600693 if ((srcImageEntry != device_data->imageMap.end())
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800694 && (dstImageEntry != device_data->imageMap.end())) {
695 if (srcImageEntry->second.imageType != dstImageEntry->second.imageType) {
Mike Stroyana3082432015-09-25 13:39:21 -0600696 char const str[] = "vkCmdCopyImage called with unmatched source and dest image types.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700697 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800698 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_TYPE, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -0600699 }
700 // Check that format is same size or exact stencil/depth
Tobin Ehlisd923d152015-09-25 14:49:43 -0600701 if (is_depth_format(srcImageEntry->second.format)) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800702 if (srcImageEntry->second.format != dstImageEntry->second.format) {
Mike Stroyana3082432015-09-25 13:39:21 -0600703 char const str[] = "vkCmdCopyImage called with unmatched source and dest image depth/stencil formats.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700704 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800705 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -0600706 }
707 } else {
Tobin Ehlisd923d152015-09-25 14:49:43 -0600708 size_t srcSize = vk_format_get_size(srcImageEntry->second.format);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800709 size_t destSize = vk_format_get_size(dstImageEntry->second.format);
Mike Stroyana3082432015-09-25 13:39:21 -0600710 if (srcSize != destSize) {
711 char const str[] = "vkCmdCopyImage called with unmatched source and dest image format sizes.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700712 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800713 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -0600714 }
715 }
716 }
717
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600718 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800719 device_data->device_dispatch_table->CmdCopyImage(commandBuffer, srcImage,
720 srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600721 }
722}
723
Chia-I Wu9ab61502015-11-06 06:42:02 +0800724VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800725 VkCommandBuffer commandBuffer,
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600726 uint32_t attachmentCount,
727 const VkClearAttachment* pAttachments,
728 uint32_t rectCount,
Courtney Goeltzenleuchter4ca43f62015-10-15 18:22:08 -0600729 const VkClearRect* pRects)
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600730{
731 VkBool32 skipCall = VK_FALSE;
732 VkImageAspectFlags aspectMask;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800733 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600734 for (uint32_t i = 0; i < attachmentCount; i++) {
735 aspectMask = pAttachments[i].aspectMask;
736 if (aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) {
737 if (aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) {
738 // VK_IMAGE_ASPECT_COLOR_BIT is not the only bit set for this attachment
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600739 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 -0700740 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800741 (uint64_t)commandBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str, i);
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600742 }
743 } else {
744 // Image aspect must be depth or stencil or both
745 if (((aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) &&
746 ((aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT))
747 {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600748 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 -0700749 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800750 (uint64_t)commandBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str, i);
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600751 }
752 }
753 }
754
755 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800756 device_data->device_dispatch_table->CmdClearAttachments(commandBuffer,
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600757 attachmentCount, pAttachments, rectCount, pRects);
758 }
759}
760
Chia-I Wu9ab61502015-11-06 06:42:02 +0800761VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800762 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600763 VkImage srcImage,
764 VkImageLayout srcImageLayout,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800765 VkBuffer dstBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600766 uint32_t regionCount,
767 const VkBufferImageCopy *pRegions)
768{
769 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800770 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600771 // For each region, the number of layers in the image subresource should not be zero
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600772 // Image aspect must be ONE OF color, depth, stencil
773 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800774 if(pRegions[i].imageSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600775 {
Jeremy Hayes148bab22015-10-28 13:01:39 -0600776 char const str[] = "vkCmdCopyImageToBuffer: number of layers in image subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700777 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
778 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800779 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600780 }
781
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800782 VkImageAspectFlags aspectMask = pRegions[i].imageSubresource.aspectMask;
783 if ((aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) &&
784 (aspectMask != VK_IMAGE_ASPECT_DEPTH_BIT) &&
785 (aspectMask != VK_IMAGE_ASPECT_STENCIL_BIT)) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600786 char const str[] = "vkCmdCopyImageToBuffer: aspectMasks for each region must specify only COLOR or DEPTH or STENCIL";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700787 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800788 (uint64_t)commandBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600789 }
790 }
791
792 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800793 device_data->device_dispatch_table->CmdCopyImageToBuffer(commandBuffer,
794 srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600795 }
796}
797
Chia-I Wu9ab61502015-11-06 06:42:02 +0800798VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800799 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600800 VkBuffer srcBuffer,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800801 VkImage dstImage,
802 VkImageLayout dstImageLayout,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600803 uint32_t regionCount,
804 const VkBufferImageCopy *pRegions)
805{
806 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800807 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600808 // For each region, the number of layers in the image subresource should not be zero
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600809 // Image aspect must be ONE OF color, depth, stencil
810 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800811 if(pRegions[i].imageSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600812 {
Jeremy Hayes148bab22015-10-28 13:01:39 -0600813 char const str[] = "vkCmdCopyBufferToImage: number of layers in image subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700814 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
815 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800816 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600817 }
818
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800819 VkImageAspectFlags aspectMask = pRegions[i].imageSubresource.aspectMask;
820 if ((aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) &&
821 (aspectMask != VK_IMAGE_ASPECT_DEPTH_BIT) &&
822 (aspectMask != VK_IMAGE_ASPECT_STENCIL_BIT)) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600823 char const str[] = "vkCmdCopyBufferToImage: aspectMasks for each region must specify only COLOR or DEPTH or STENCIL";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700824 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800825 (uint64_t)commandBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600826 }
827 }
828
829 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800830 device_data->device_dispatch_table->CmdCopyBufferToImage(commandBuffer,
831 srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600832 }
833}
834
Chia-I Wu9ab61502015-11-06 06:42:02 +0800835VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800836 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600837 VkImage srcImage,
838 VkImageLayout srcImageLayout,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800839 VkImage dstImage,
840 VkImageLayout dstImageLayout,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600841 uint32_t regionCount,
842 const VkImageBlit *pRegions,
Chia-I Wub99df442015-10-26 16:49:32 +0800843 VkFilter filter)
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600844{
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600845 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800846 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600847
Chia-I Wue2fc5522015-10-26 20:04:44 +0800848 auto srcImageEntry = device_data->imageMap.find(srcImage);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800849 auto dstImageEntry = device_data->imageMap.find(dstImage);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600850
851 if ((srcImageEntry != device_data->imageMap.end()) &&
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800852 (dstImageEntry != device_data->imageMap.end())) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600853
Tobin Ehlisd923d152015-09-25 14:49:43 -0600854 VkFormat srcFormat = srcImageEntry->second.format;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800855 VkFormat dstFormat = dstImageEntry->second.format;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600856
857 // Validate consistency for signed and unsigned formats
858 if ((vk_format_is_sint(srcFormat) && !vk_format_is_sint(dstFormat)) ||
859 (vk_format_is_uint(srcFormat) && !vk_format_is_uint(dstFormat))) {
860 std::stringstream ss;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800861 ss << "vkCmdBlitImage: If one of srcImage and dstImage images has signed/unsigned integer format, "
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600862 << "the other one must also have signed/unsigned integer format. "
863 << "Source format is " << string_VkFormat(srcFormat) << " Destinatino format is " << string_VkFormat(dstFormat);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700864 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800865 (uint64_t)commandBuffer, 0, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600866 }
867
868 // Validate aspect bits and formats for depth/stencil images
869 if (vk_format_is_depth_or_stencil(srcFormat) ||
870 vk_format_is_depth_or_stencil(dstFormat)) {
871 if (srcFormat != dstFormat) {
872 std::stringstream ss;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800873 ss << "vkCmdBlitImage: If one of srcImage and dstImage images has a format of depth, stencil or depth "
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600874 << "stencil, the other one must have exactly the same format. "
875 << "Source format is " << string_VkFormat(srcFormat) << " Destinatino format is " << string_VkFormat(dstFormat);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700876 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800877 (uint64_t)commandBuffer, 0, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600878 }
879
880 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800881 if(pRegions[i].srcSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600882 {
883 char const str[] = "vkCmdBlitImage: number of layers in source subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700884 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
885 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800886 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600887 }
888
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800889 if(pRegions[i].dstSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600890 {
891 char const str[] = "vkCmdBlitImage: number of layers in destination subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700892 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
893 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800894 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600895 }
896
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800897 if(pRegions[i].srcSubresource.layerCount != pRegions[i].dstSubresource.layerCount)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600898 {
899 char const str[] = "vkCmdBlitImage: number of layers in source and destination subresources must match";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700900 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800901 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600902 }
903
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800904 VkImageAspectFlags srcAspect = pRegions[i].srcSubresource.aspectMask;
905 VkImageAspectFlags dstAspect = pRegions[i].dstSubresource.aspectMask;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600906
907 if (srcAspect != dstAspect) {
908 std::stringstream ss;
909 ss << "vkCmdBlitImage: Image aspects of depth/stencil images should match";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700910 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
911 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800912 (uint64_t)commandBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600913 }
914 if (vk_format_is_depth_and_stencil(srcFormat)) {
915 if (srcAspect != (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
916 std::stringstream ss;
917 ss << "vkCmdBlitImage: Combination depth/stencil image formats must have both VK_IMAGE_ASPECT_DEPTH_BIT "
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800918 << "and VK_IMAGE_ASPECT_STENCIL_BIT set in both the srcImage and dstImage";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700919 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800920 (uint64_t)commandBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600921 }
922 } else if (vk_format_is_stencil_only(srcFormat)) {
923 if (srcAspect != VK_IMAGE_ASPECT_STENCIL_BIT) {
924 std::stringstream ss;
925 ss << "vkCmdBlitImage: Stencil-only image formats must have only the VK_IMAGE_ASPECT_STENCIL_BIT "
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800926 << "set in both the srcImage and dstImage";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700927 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800928 (uint64_t)commandBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600929 }
930 } else if (vk_format_is_depth_only(srcFormat)) {
931 if (srcAspect != VK_IMAGE_ASPECT_DEPTH_BIT) {
932 std::stringstream ss;
933 ss << "vkCmdBlitImage: Depth-only image formats must have only the VK_IMAGE_ASPECT_DEPTH "
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800934 << "set in both the srcImage and dstImage";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700935 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800936 (uint64_t)commandBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600937 }
938 }
939 }
940 }
941
942 // Validate filter
943 if (vk_format_is_depth_or_stencil(srcFormat) ||
944 vk_format_is_int(srcFormat)) {
Chia-I Wub99df442015-10-26 16:49:32 +0800945 if (filter != VK_FILTER_NEAREST) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600946 std::stringstream ss;
947 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 +0800948 << "then filter must be VK_FILTER_NEAREST.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700949 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -0800950 (uint64_t)commandBuffer, 0, IMAGE_INVALID_FILTER, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600951 }
952 }
953 }
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600954
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800955 device_data->device_dispatch_table->CmdBlitImage(commandBuffer, srcImage,
956 srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600957}
958
Jeremy Hayes01b38892015-11-17 18:19:55 -0700959VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(
960 VkCommandBuffer commandBuffer,
961 VkPipelineStageFlags srcStageMask,
962 VkPipelineStageFlags dstStageMask,
963 VkDependencyFlags dependencyFlags,
964 uint32_t memoryBarrierCount,
965 const void* const* ppMemoryBarriers)
966{
967 VkBool32 skipCall = VK_FALSE;
968 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
969
970 for (uint32_t i = 0; i < memoryBarrierCount; ++i)
971 {
972 VkImageMemoryBarrier const*const barrier = (VkImageMemoryBarrier const*const)ppMemoryBarriers[i];
973 if (barrier->sType == VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER)
974 {
975 if (barrier->subresourceRange.layerCount == 0)
976 {
977 std::stringstream ss;
978 ss << "vkCmdPipelineBarrier called with 0 in ppMemoryBarriers[" << i << "]->subresourceRange.layerCount.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700979 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, 0, 0, "IMAGE", "%s", ss.str().c_str());
Jeremy Hayes01b38892015-11-17 18:19:55 -0700980 }
981 }
982 }
983
984 if (skipCall)
985 {
986 return;
987 }
988
989 device_data->device_dispatch_table->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags,
990 memoryBarrierCount, ppMemoryBarriers);
991}
992
Chia-I Wu9ab61502015-11-06 06:42:02 +0800993VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800994 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600995 VkImage srcImage,
996 VkImageLayout srcImageLayout,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800997 VkImage dstImage,
998 VkImageLayout dstImageLayout,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600999 uint32_t regionCount,
1000 const VkImageResolve *pRegions)
1001{
1002 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001003 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Chia-I Wue2fc5522015-10-26 20:04:44 +08001004 auto srcImageEntry = device_data->imageMap.find(srcImage);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001005 auto dstImageEntry = device_data->imageMap.find(dstImage);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001006
Jeremy Hayes148bab22015-10-28 13:01:39 -06001007 // For each region, the number of layers in the image subresource should not be zero
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001008 // For each region, src and dest image aspect must be color only
1009 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001010 if(pRegions[i].srcSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -06001011 {
1012 char const str[] = "vkCmdResolveImage: number of layers in source subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001013 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid/error
1014 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001015 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -06001016 }
1017
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001018 if(pRegions[i].dstSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -06001019 {
1020 char const str[] = "vkCmdResolveImage: number of layers in destination subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001021
1022 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid/error
1023 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001024 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -06001025 }
1026
Chia-I Wuab83a0e2015-10-27 19:00:15 +08001027 if ((pRegions[i].srcSubresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) ||
1028 (pRegions[i].dstSubresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT)) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001029 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 -07001030 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001031 (uint64_t)commandBuffer, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001032 }
1033 }
1034
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001035 if ((srcImageEntry != device_data->imageMap.end()) &&
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001036 (dstImageEntry != device_data->imageMap.end())) {
1037 if (srcImageEntry->second.format != dstImageEntry->second.format) {
Mike Stroyana3082432015-09-25 13:39:21 -06001038 char const str[] = "vkCmdResolveImage called with unmatched source and dest formats.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001039 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001040 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -06001041 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001042 if (srcImageEntry->second.imageType != dstImageEntry->second.imageType) {
Mike Stroyana3082432015-09-25 13:39:21 -06001043 char const str[] = "vkCmdResolveImage called with unmatched source and dest image types.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001044 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001045 (uint64_t)commandBuffer, 0, IMAGE_MISMATCHED_IMAGE_TYPE, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -06001046 }
Chia-I Wu5c17c962015-10-31 00:31:16 +08001047 if (srcImageEntry->second.samples == VK_SAMPLE_COUNT_1_BIT) {
Mike Stroyana3082432015-09-25 13:39:21 -06001048 char const str[] = "vkCmdResolveImage called with source sample count less than 2.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001049 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001050 (uint64_t)commandBuffer, 0, IMAGE_INVALID_RESOLVE_SAMPLES, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -06001051 }
Chia-I Wu5c17c962015-10-31 00:31:16 +08001052 if (dstImageEntry->second.samples != VK_SAMPLE_COUNT_1_BIT) {
Mike Stroyana3082432015-09-25 13:39:21 -06001053 char const str[] = "vkCmdResolveImage called with dest sample count greater than 1.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001054 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001055 (uint64_t)commandBuffer, 0, IMAGE_INVALID_RESOLVE_SAMPLES, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -06001056 }
1057 }
1058
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001059 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001060 device_data->device_dispatch_table->CmdResolveImage(commandBuffer, srcImage,
1061 srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001062 }
1063}
1064
Chia-I Wu9ab61502015-11-06 06:42:02 +08001065VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout(
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001066 VkDevice device,
1067 VkImage image,
1068 const VkImageSubresource *pSubresource,
1069 VkSubresourceLayout *pLayout)
1070{
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001071 VkBool32 skipCall = VK_FALSE;
1072 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1073 VkFormat format;
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001074
Chia-I Wue2fc5522015-10-26 20:04:44 +08001075 auto imageEntry = device_data->imageMap.find(image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001076
1077 // Validate that image aspects match formats
1078 if (imageEntry != device_data->imageMap.end()) {
Tobin Ehlisd923d152015-09-25 14:49:43 -06001079 format = imageEntry->second.format;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001080 if (vk_format_is_color(format)) {
Chia-I Wu52b07e72015-10-27 19:55:05 +08001081 if (pSubresource->aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001082 std::stringstream ss;
Chia-I Wu52b07e72015-10-27 19:55:05 +08001083 ss << "vkGetImageSubresourceLayout: For color formats, the aspectMask field of VkImageSubresource must be VK_IMAGE_ASPECT_COLOR.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001084 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -08001085 (uint64_t)image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001086 }
1087 } else if (vk_format_is_depth_or_stencil(format)) {
Chia-I Wu52b07e72015-10-27 19:55:05 +08001088 if ((pSubresource->aspectMask != VK_IMAGE_ASPECT_DEPTH_BIT) &&
1089 (pSubresource->aspectMask != VK_IMAGE_ASPECT_STENCIL_BIT)) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001090 std::stringstream ss;
Chia-I Wu52b07e72015-10-27 19:55:05 +08001091 ss << "vkGetImageSubresourceLayout: For depth/stencil formats, the aspectMask selects either the depth or stencil image aspectMask.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001092 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Michael Lentine010f4692015-11-03 16:19:46 -08001093 (uint64_t)image, 0, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001094 }
1095 }
1096 }
1097
1098 if (VK_FALSE == skipCall) {
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001099 device_data->device_dispatch_table->GetImageSubresourceLayout(device,
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001100 image, pSubresource, pLayout);
1101 }
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001102}
1103
Mark Lobodzinskid5a23822015-11-12 15:14:35 -07001104VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties)
1105{
1106 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1107 phy_dev_data->instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, pProperties);
1108}
1109
Chia-I Wu9ab61502015-11-06 06:42:02 +08001110VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001111{
1112 if (device == NULL) {
1113 return NULL;
1114 }
1115
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001116 layer_data *my_data;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001117 // loader uses this to force layer initialization; device object is wrapped
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001118 if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001119 VkBaseLayerObject* wrapped_dev = (VkBaseLayerObject*) device;
1120 my_data = get_my_data_ptr(get_dispatch_key(wrapped_dev->baseObject), layer_data_map);
1121 my_data->device_dispatch_table = new VkLayerDispatchTable;
1122 layer_initialize_dispatch_table(my_data->device_dispatch_table, wrapped_dev);
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001123 return (PFN_vkVoidFunction) vkGetDeviceProcAddr;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001124 }
1125
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001126 my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Courtney Goeltzenleuchterca173b82015-06-25 18:01:43 -06001127 if (!strcmp(funcName, "vkCreateDevice"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001128 return (PFN_vkVoidFunction) vkCreateDevice;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001129 if (!strcmp(funcName, "vkDestroyDevice"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001130 return (PFN_vkVoidFunction) vkDestroyDevice;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001131 if (!strcmp(funcName, "vkCreateImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001132 return (PFN_vkVoidFunction) vkCreateImage;
Mark Lobodzinski46fc3dd2015-10-29 12:58:33 -06001133 if (!strcmp(funcName, "vkDestroyImage"))
1134 return (PFN_vkVoidFunction) vkDestroyImage;
Tobin Ehliscde08892015-09-22 10:11:37 -06001135 if (!strcmp(funcName, "vkCreateImageView"))
1136 return (PFN_vkVoidFunction) vkCreateImageView;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001137 if (!strcmp(funcName, "vkCreateRenderPass"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001138 return (PFN_vkVoidFunction) vkCreateRenderPass;
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001139 if (!strcmp(funcName, "vkCmdClearColorImage"))
1140 return (PFN_vkVoidFunction) vkCmdClearColorImage;
1141 if (!strcmp(funcName, "vkCmdClearDepthStencilImage"))
1142 return (PFN_vkVoidFunction) vkCmdClearDepthStencilImage;
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06001143 if (!strcmp(funcName, "vkCmdClearAttachments"))
1144 return (PFN_vkVoidFunction) vkCmdClearAttachments;
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001145 if (!strcmp(funcName, "vkCmdCopyImage"))
1146 return (PFN_vkVoidFunction) vkCmdCopyImage;
1147 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
1148 return (PFN_vkVoidFunction) vkCmdCopyImageToBuffer;
1149 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
1150 return (PFN_vkVoidFunction) vkCmdCopyBufferToImage;
1151 if (!strcmp(funcName, "vkCmdBlitImage"))
1152 return (PFN_vkVoidFunction) vkCmdBlitImage;
Jeremy Hayes01b38892015-11-17 18:19:55 -07001153 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
1154 return (PFN_vkVoidFunction) vkCmdPipelineBarrier;
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001155 if (!strcmp(funcName, "vkCmdResolveImage"))
1156 return (PFN_vkVoidFunction) vkCmdResolveImage;
1157 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
1158 return (PFN_vkVoidFunction) vkGetImageSubresourceLayout;
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001159
1160 VkLayerDispatchTable* pTable = my_data->device_dispatch_table;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001161 {
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001162 if (pTable->GetDeviceProcAddr == NULL)
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001163 return NULL;
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001164 return pTable->GetDeviceProcAddr(device, funcName);
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001165 }
1166}
1167
Chia-I Wu9ab61502015-11-06 06:42:02 +08001168VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001169{
1170 if (instance == NULL) {
1171 return NULL;
1172 }
1173
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001174 layer_data *my_data;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001175 // loader uses this to force layer initialization; instance object is wrapped
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001176 if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001177 VkBaseLayerObject* wrapped_inst = (VkBaseLayerObject*) instance;
1178 my_data = get_my_data_ptr(get_dispatch_key(wrapped_inst->baseObject), layer_data_map);
1179 my_data->instance_dispatch_table = new VkLayerInstanceDispatchTable;
1180 layer_init_instance_dispatch_table(my_data->instance_dispatch_table, wrapped_inst);
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001181 return (PFN_vkVoidFunction) vkGetInstanceProcAddr;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001182 }
1183
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001184 my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001185 if (!strcmp(funcName, "vkCreateInstance"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001186 return (PFN_vkVoidFunction) vkCreateInstance;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001187 if (!strcmp(funcName, "vkDestroyInstance"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001188 return (PFN_vkVoidFunction) vkDestroyInstance;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06001189 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
1190 return (PFN_vkVoidFunction) vkEnumerateInstanceLayerProperties;
1191 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
1192 return (PFN_vkVoidFunction) vkEnumerateInstanceExtensionProperties;
1193 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
1194 return (PFN_vkVoidFunction) vkEnumerateDeviceLayerProperties;
1195 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
1196 return (PFN_vkVoidFunction) vkEnumerateDeviceExtensionProperties;
Mark Lobodzinskid5a23822015-11-12 15:14:35 -07001197 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
1198 return (PFN_vkVoidFunction) vkGetPhysicalDeviceProperties;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001199
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001200 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(my_data->report_data, funcName);
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001201 if(fptr)
1202 return fptr;
1203
1204 {
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001205 VkLayerInstanceDispatchTable* pTable = my_data->instance_dispatch_table;
1206 if (pTable->GetInstanceProcAddr == NULL)
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001207 return NULL;
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001208 return pTable->GetInstanceProcAddr(instance, funcName);
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001209 }
1210}