blob: 88d16c22ccbc4568583c638ca406fd5df2d90175 [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
Michael Lentine03107b42015-12-11 10:49:51 -08004 * Copyright (C) 2015 Google Inc.
Jeremy Hayes9cc31582015-06-18 10:12:39 -06005 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060023 *
24 * Author: Jeremy Hayes <jeremy@lunarg.com>
25 * Author: Mark Lobodzinski <mark@lunarg.com>
26 * Author: Mike Stroyan <mike@LunarG.com>
27 * Author: Tobin Ehlis <tobin@lunarg.com>
Jeremy Hayes9cc31582015-06-18 10:12:39 -060028 */
29
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060030#include <inttypes.h>
Jeremy Hayes9cc31582015-06-18 10:12:39 -060031#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060034#include <assert.h>
35#include <vector>
Jeremy Hayes9cc31582015-06-18 10:12:39 -060036#include <unordered_map>
Tobin Ehlisad8c4462015-09-21 15:20:28 -060037#include <memory>
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060038using namespace std;
Jeremy Hayes9cc31582015-06-18 10:12:39 -060039
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060040#include "vk_loader_platform.h"
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060041#include "vk_dispatch_table_helper.h"
42#include "vk_struct_string_helper_cpp.h"
Jeremy Hayes9cc31582015-06-18 10:12:39 -060043#include "vk_enum_validate_helper.h"
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060044#include "image.h"
45#include "vk_layer_config.h"
46#include "vk_layer_extension_utils.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060047#include "vk_layer_table.h"
48#include "vk_layer_data.h"
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -060049#include "vk_layer_extension_utils.h"
Mike Stroyana3082432015-09-25 13:39:21 -060050#include "vk_layer_utils.h"
Courtney Goeltzenleuchter8f8367e2015-10-07 08:38:30 -060051#include "vk_layer_logging.h"
Jeremy Hayes9cc31582015-06-18 10:12:39 -060052
Tobin Ehlisad8c4462015-09-21 15:20:28 -060053using namespace std;
54
Cody Northrop55443ef2015-09-28 15:09:32 -060055struct layer_data {
Mark Lobodzinskid5a23822015-11-12 15:14:35 -070056 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070057 vector<VkDebugReportCallbackEXT> logging_callback;
Mark Lobodzinskid5a23822015-11-12 15:14:35 -070058 VkLayerDispatchTable* device_dispatch_table;
59 VkLayerInstanceDispatchTable *instance_dispatch_table;
60 VkPhysicalDevice physicalDevice;
61 VkPhysicalDeviceProperties physicalDeviceProperties;
62
Chia-I Wue2fc5522015-10-26 20:04:44 +080063 unordered_map<VkImage, IMAGE_STATE> imageMap;
Cody Northrop55443ef2015-09-28 15:09:32 -060064
65 layer_data() :
66 report_data(nullptr),
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -060067 device_dispatch_table(nullptr),
68 instance_dispatch_table(nullptr),
Mark Lobodzinskid5a23822015-11-12 15:14:35 -070069 physicalDevice(0),
70 physicalDeviceProperties()
Cody Northrop55443ef2015-09-28 15:09:32 -060071 {};
72};
Jeremy Hayes9cc31582015-06-18 10:12:39 -060073
Tobin Ehlisad8c4462015-09-21 15:20:28 -060074static unordered_map<void*, layer_data*> layer_data_map;
Jeremy Hayes9cc31582015-06-18 10:12:39 -060075
Courtney Goeltzenleuchter6d8e8182015-11-25 14:31:49 -070076static void InitImage(layer_data *data, const VkAllocationCallbacks *pAllocator)
Jeremy Hayes9cc31582015-06-18 10:12:39 -060077{
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070078 VkDebugReportCallbackEXT callback;
Jeremy Hayes9cc31582015-06-18 10:12:39 -060079 uint32_t report_flags = getLayerOptionFlags("ImageReportFlags", 0);
80
81 uint32_t debug_action = 0;
82 getLayerOptionEnum("ImageDebugAction", (uint32_t *) &debug_action);
83 if(debug_action & VK_DBG_LAYER_ACTION_LOG_MSG)
84 {
85 FILE *log_output = NULL;
86 const char* option_str = getLayerOption("ImageLogFilename");
Tobin Ehlisb1df55e2015-09-15 09:55:54 -060087 log_output = getLayerLogOutput(option_str, "Image");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070088 VkDebugReportCallbackCreateInfoEXT dbgInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -070089 memset(&dbgInfo, 0, sizeof(dbgInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070090 dbgInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -070091 dbgInfo.pfnCallback = log_callback;
92 dbgInfo.pUserData = log_output;
93 dbgInfo.flags = report_flags;
94 layer_create_msg_callback(data->report_data, &dbgInfo, pAllocator, &callback);
Courtney Goeltzenleuchterffcdd8b2015-10-05 15:59:11 -060095 data->logging_callback.push_back(callback);
96 }
97
98 if (debug_action & VK_DBG_LAYER_ACTION_DEBUG_OUTPUT) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070099 VkDebugReportCallbackCreateInfoEXT dbgInfo;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700100 memset(&dbgInfo, 0, sizeof(dbgInfo));
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700101 dbgInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700102 dbgInfo.pfnCallback = win32_debug_output_msg;
103 dbgInfo.flags = report_flags;
104 layer_create_msg_callback(data->report_data, &dbgInfo, pAllocator, &callback);
Courtney Goeltzenleuchterffcdd8b2015-10-05 15:59:11 -0600105 data->logging_callback.push_back(callback);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600106 }
107}
108
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700109VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700110 VkInstance instance,
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700111 const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700112 const VkAllocationCallbacks* pAllocator,
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700113 VkDebugReportCallbackEXT* pMsgCallback)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600114{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600115 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700116 VkResult res = my_data->instance_dispatch_table->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600117 if (res == VK_SUCCESS) {
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700118 res = layer_create_msg_callback(my_data->report_data, pCreateInfo, pAllocator, pMsgCallback);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600119 }
120 return res;
121}
122
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700123VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700124 VkInstance instance,
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700125 VkDebugReportCallbackEXT msgCallback,
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700126 const VkAllocationCallbacks* pAllocator)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600127{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600128 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700129 my_data->instance_dispatch_table->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700130 layer_destroy_msg_callback(my_data->report_data, msgCallback, pAllocator);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600131}
132
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700133VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700134 VkInstance instance,
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700135 VkDebugReportFlagsEXT flags,
136 VkDebugReportObjectTypeEXT objType,
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700137 uint64_t object,
138 size_t location,
139 int32_t msgCode,
140 const char* pLayerPrefix,
141 const char* pMsg)
142{
143 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700144 my_data->instance_dispatch_table->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
Courtney Goeltzenleuchterf0de7242015-12-01 14:10:55 -0700145}
146
Chia-I Wu9ab61502015-11-06 06:42:02 +0800147VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkInstance* pInstance)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600148{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600149 layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
150 VkLayerInstanceDispatchTable *pTable = my_data->instance_dispatch_table;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800151 VkResult result = pTable->CreateInstance(pCreateInfo, pAllocator, pInstance);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600152
153 if (result == VK_SUCCESS) {
Chia-I Wud50a7d72015-10-26 20:48:51 +0800154 my_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionNameCount,
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600155 pCreateInfo->ppEnabledExtensionNames);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600156
Courtney Goeltzenleuchter6d8e8182015-11-25 14:31:49 -0700157 InitImage(my_data, pAllocator);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600158 }
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600159 return result;
160}
161
Chia-I Wu9ab61502015-11-06 06:42:02 +0800162VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks* pAllocator)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600163{
164 // Grab the key before the instance is destroyed.
165 dispatch_key key = get_dispatch_key(instance);
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600166 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
167 VkLayerInstanceDispatchTable *pTable = my_data->instance_dispatch_table;
Chia-I Wuf7458c52015-10-26 21:10:41 +0800168 pTable->DestroyInstance(instance, pAllocator);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600169
170 // Clean up logging callback, if any
Courtney Goeltzenleuchterffcdd8b2015-10-05 15:59:11 -0600171 while (my_data->logging_callback.size() > 0) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700172 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
Courtney Goeltzenleuchter05854bf2015-11-30 12:13:14 -0700173 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
Courtney Goeltzenleuchterffcdd8b2015-10-05 15:59:11 -0600174 my_data->logging_callback.pop_back();
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600175 }
176
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600177 layer_debug_report_destroy_instance(my_data->report_data);
178 delete my_data->instance_dispatch_table;
179 layer_data_map.erase(key);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600180
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600181}
182
Chia-I Wu9ab61502015-11-06 06:42:02 +0800183VK_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 -0600184{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600185 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
186 layer_data *device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
Chia-I Wuf7458c52015-10-26 21:10:41 +0800187 VkResult result = device_data->device_dispatch_table->CreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600188 if(result == VK_SUCCESS)
189 {
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600190 device_data->report_data = layer_debug_report_create_device(instance_data->report_data, *pDevice);
Chris Forbesbc0bb772015-06-21 22:55:02 +1200191 device_data->physicalDevice = physicalDevice;
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600192 }
193
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700194 instance_data->instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, &(device_data->physicalDeviceProperties));
195
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600196 return result;
197}
198
Chia-I Wu9ab61502015-11-06 06:42:02 +0800199VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600200{
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600201 dispatch_key key = get_dispatch_key(device);
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600202 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Chia-I Wuf7458c52015-10-26 21:10:41 +0800203 my_data->device_dispatch_table->DestroyDevice(device, pAllocator);
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600204 delete my_data->device_dispatch_table;
205 layer_data_map.erase(key);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600206}
207
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700208static const VkExtensionProperties instance_extensions[] = {
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600209 {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700210 VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
211 VK_EXT_DEBUG_REPORT_REVISION
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600212 }
213};
214
Chia-I Wu9ab61502015-11-06 06:42:02 +0800215VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600216 const char *pLayerName,
217 uint32_t *pCount,
218 VkExtensionProperties* pProperties)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600219{
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700220 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600221}
222
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700223static const VkLayerProperties pc_global_layers[] = {
224 {
Michael Lentine03107b42015-12-11 10:49:51 -0800225 "VK_LAYER_LUNARG_image",
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700226 VK_API_VERSION,
227 VK_MAKE_VERSION(0, 1, 0),
Mark Lobodzinski0d054fe2015-12-30 08:16:12 -0700228 "Validation layer: image",
Courtney Goeltzenleuchter52857662015-12-01 14:08:28 -0700229 }
230};
231
Chia-I Wu9ab61502015-11-06 06:42:02 +0800232VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600233 uint32_t *pCount,
234 VkLayerProperties* pProperties)
Tony Barbour59a47322015-06-24 16:06:58 -0600235{
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600236 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers),
237 pc_global_layers,
238 pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -0600239}
240
Chia-I Wu9ab61502015-11-06 06:42:02 +0800241VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600242 VkPhysicalDevice physicalDevice,
243 const char* pLayerName,
244 uint32_t* pCount,
245 VkExtensionProperties* pProperties)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600246{
Jon Ashburn751c4842015-11-02 17:37:20 -0700247 // Image does not have any physical device extensions
248 if (pLayerName == NULL) {
249 dispatch_key key = get_dispatch_key(physicalDevice);
250 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
251 VkLayerInstanceDispatchTable *pTable = my_data->instance_dispatch_table;
252 return pTable->EnumerateDeviceExtensionProperties(
253 physicalDevice,
254 NULL,
255 pCount,
256 pProperties);
257 } else {
258 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
259 }
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600260}
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600261
Chia-I Wu9ab61502015-11-06 06:42:02 +0800262VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600263 VkPhysicalDevice physicalDevice,
264 uint32_t* pCount,
265 VkLayerProperties* pProperties)
266{
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600267 // ParamChecker's physical device layers are the same as global
Courtney Goeltzenleuchter426e1872015-07-07 11:18:30 -0600268 return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers,
269 pCount, pProperties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600270}
271
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600272// Start of the Image layer proper
273
274// Returns TRUE if a format is a depth-compatible format
275bool is_depth_format(VkFormat format)
276{
277 bool result = VK_FALSE;
278 switch (format) {
279 case VK_FORMAT_D16_UNORM:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800280 case VK_FORMAT_X8_D24_UNORM_PACK32:
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600281 case VK_FORMAT_D32_SFLOAT:
282 case VK_FORMAT_S8_UINT:
283 case VK_FORMAT_D16_UNORM_S8_UINT:
284 case VK_FORMAT_D24_UNORM_S8_UINT:
285 case VK_FORMAT_D32_SFLOAT_S8_UINT:
286 result = VK_TRUE;
287 break;
288 default:
289 break;
290 }
291 return result;
292}
293
Mark Lobodzinski601ed152015-11-10 11:01:32 -0700294static inline uint32_t validate_VkImageLayoutKHR(VkImageLayout input_value)
295{
296 return ((validate_VkImageLayout(input_value) == 1) ||
Ian Elliott05846062015-11-20 14:13:17 -0700297 (input_value == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR));
Mark Lobodzinski601ed152015-11-10 11:01:32 -0700298}
299
Chia-I Wu9ab61502015-11-06 06:42:02 +0800300VK_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 -0600301{
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700302 VkBool32 skipCall = VK_FALSE;
Courtney Goeltzenleuchter52fee652015-12-10 16:41:22 -0700303 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700304 VkImageFormatProperties ImageFormatProperties = {0};
305
306 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
307 VkPhysicalDevice physicalDevice = device_data->physicalDevice;
308 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
309
310 if (pCreateInfo->format != VK_FORMAT_UNDEFINED)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600311 {
312 VkFormatProperties properties;
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700313 phy_dev_data->instance_dispatch_table->GetPhysicalDeviceFormatProperties(
Chris Forbesbc0bb772015-06-21 22:55:02 +1200314 device_data->physicalDevice, pCreateInfo->format, &properties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600315
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700316 if ((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600317 {
318 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains unsupported format";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700319 // 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 -0700320 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 -0600321 }
322 }
323
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700324 // Internal call to get format info. Still goes through layers, could potentially go directly to ICD.
325 phy_dev_data->instance_dispatch_table->GetPhysicalDeviceImageFormatProperties(
326 physicalDevice, pCreateInfo->format, pCreateInfo->imageType, pCreateInfo->tiling,
327 pCreateInfo->usage, pCreateInfo->flags, &ImageFormatProperties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600328
Mark Lobodzinskid5a23822015-11-12 15:14:35 -0700329 VkDeviceSize imageGranularity = device_data->physicalDeviceProperties.limits.bufferImageGranularity;
330 imageGranularity = imageGranularity == 1 ? 0 : imageGranularity;
331
332 if ((pCreateInfo->extent.depth > ImageFormatProperties.maxExtent.depth) ||
333 (pCreateInfo->extent.width > ImageFormatProperties.maxExtent.width) ||
334 (pCreateInfo->extent.height > ImageFormatProperties.maxExtent.height)) {
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700335 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 -0700336 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
337 "CreateImage extents exceed allowable limits for format: "
338 "Width = %d Height = %d Depth = %d: Limits for Width = %d Height = %d Depth = %d for format %s.",
339 pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth,
340 ImageFormatProperties.maxExtent.width, ImageFormatProperties.maxExtent.height, ImageFormatProperties.maxExtent.depth,
341 string_VkFormat(pCreateInfo->format));
342
343 }
344
345 uint64_t totalSize = ((uint64_t)pCreateInfo->extent.width *
346 (uint64_t)pCreateInfo->extent.height *
347 (uint64_t)pCreateInfo->extent.depth *
348 (uint64_t)pCreateInfo->arrayLayers *
349 (uint64_t)pCreateInfo->samples *
350 (uint64_t)vk_format_get_size(pCreateInfo->format) +
351 (uint64_t)imageGranularity ) & ~(uint64_t)imageGranularity;
352
353 if (totalSize > ImageFormatProperties.maxResourceSize) {
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700354 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 -0700355 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
356 "CreateImage resource size exceeds allowable maximum "
357 "Image resource size = %#" PRIxLEAST64 ", maximum resource size = %#" PRIxLEAST64 " ",
358 totalSize, ImageFormatProperties.maxResourceSize);
359 }
360
361 if (pCreateInfo->mipLevels > ImageFormatProperties.maxMipLevels) {
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700362 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 -0700363 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
364 "CreateImage mipLevels=%d exceeds allowable maximum supported by format of %d",
365 pCreateInfo->mipLevels, ImageFormatProperties.maxMipLevels);
366 }
367
368 if (pCreateInfo->arrayLayers > ImageFormatProperties.maxArrayLayers) {
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700369 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 -0700370 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
371 "CreateImage arrayLayers=%d exceeds allowable maximum supported by format of %d",
372 pCreateInfo->arrayLayers, ImageFormatProperties.maxArrayLayers);
373 }
374
375 if ((pCreateInfo->samples & ImageFormatProperties.sampleCounts) == 0) {
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700376 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 -0700377 IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image",
378 "CreateImage samples %s is not supported by format 0x%.8X",
379 string_VkSampleCountFlagBits(pCreateInfo->samples), ImageFormatProperties.sampleCounts);
380 }
381
382 if (VK_FALSE == skipCall) {
383 result = device_data->device_dispatch_table->CreateImage(device, pCreateInfo, pAllocator, pImage);
384 }
385 if (result == VK_SUCCESS) {
Chia-I Wue2fc5522015-10-26 20:04:44 +0800386 device_data->imageMap[*pImage] = IMAGE_STATE(pCreateInfo);
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600387 }
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600388 return result;
389}
390
Chia-I Wu9ab61502015-11-06 06:42:02 +0800391VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator)
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600392{
393 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chia-I Wue2fc5522015-10-26 20:04:44 +0800394 device_data->imageMap.erase(image);
Chia-I Wuf7458c52015-10-26 21:10:41 +0800395 device_data->device_dispatch_table->DestroyImage(device, image, pAllocator);
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600396}
397
Chia-I Wu9ab61502015-11-06 06:42:02 +0800398VK_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 -0600399{
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600400 layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Tobin Ehlisdea00952015-09-22 08:40:52 -0600401 VkBool32 skipCall = VK_FALSE;
Chia-I Wu08accc62015-07-07 11:50:03 +0800402 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600403 {
Chia-I Wu08accc62015-07-07 11:50:03 +0800404 if(pCreateInfo->pAttachments[i].format != VK_FORMAT_UNDEFINED)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600405 {
406 VkFormatProperties properties;
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -0600407 get_my_data_ptr(get_dispatch_key(my_data->physicalDevice), layer_data_map)->instance_dispatch_table->GetPhysicalDeviceFormatProperties(
408 my_data->physicalDevice, pCreateInfo->pAttachments[i].format, &properties);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600409
410 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
411 {
412 std::stringstream ss;
Chia-I Wu08accc62015-07-07 11:50:03 +0800413 ss << "vkCreateRenderPass parameter, VkFormat in pCreateInfo->pAttachments[" << i << "], contains unsupported format";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700414 // 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 -0700415 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 -0600416 }
417 }
418 }
419
Chia-I Wu08accc62015-07-07 11:50:03 +0800420 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600421 {
Mark Lobodzinski601ed152015-11-10 11:01:32 -0700422 if(!validate_VkImageLayoutKHR(pCreateInfo->pAttachments[i].initialLayout) ||
423 !validate_VkImageLayoutKHR(pCreateInfo->pAttachments[i].finalLayout))
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600424 {
425 std::stringstream ss;
Chia-I Wu08accc62015-07-07 11:50:03 +0800426 ss << "vkCreateRenderPass parameter, VkImageLayout in pCreateInfo->pAttachments[" << i << "], is unrecognized";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700427 // 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 -0700428 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 -0600429 }
430 }
431
Chia-I Wu08accc62015-07-07 11:50:03 +0800432 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600433 {
Chia-I Wu08accc62015-07-07 11:50:03 +0800434 if(!validate_VkAttachmentLoadOp(pCreateInfo->pAttachments[i].loadOp))
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600435 {
436 std::stringstream ss;
Chia-I Wu08accc62015-07-07 11:50:03 +0800437 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp in pCreateInfo->pAttachments[" << i << "], is unrecognized";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700438 // 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 -0700439 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 -0600440 }
441 }
442
Chia-I Wu08accc62015-07-07 11:50:03 +0800443 for(uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600444 {
Chia-I Wu08accc62015-07-07 11:50:03 +0800445 if(!validate_VkAttachmentStoreOp(pCreateInfo->pAttachments[i].storeOp))
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600446 {
447 std::stringstream ss;
Chia-I Wu08accc62015-07-07 11:50:03 +0800448 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp in pCreateInfo->pAttachments[" << i << "], is unrecognized";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700449 // 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 -0700450 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 -0600451 }
452 }
453
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600454 // Any depth buffers specified as attachments?
455 bool depthFormatPresent = VK_FALSE;
456 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i)
457 {
458 depthFormatPresent |= is_depth_format(pCreateInfo->pAttachments[i].format);
459 }
460
461 if (depthFormatPresent == VK_FALSE) {
462 // No depth attachment is present, validate that subpasses set depthStencilAttachment to VK_ATTACHMENT_UNUSED;
463 for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {
Chia-I Wu1efb7e52015-10-26 17:32:47 +0800464 if (pCreateInfo->pSubpasses[i].pDepthStencilAttachment &&
465 pCreateInfo->pSubpasses[i].pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) {
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600466 std::stringstream ss;
467 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 -0700468 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 -0600469 }
470 }
471 }
Tobin Ehlisdea00952015-09-22 08:40:52 -0600472 if (skipCall)
Courtney Goeltzenleuchter52fee652015-12-10 16:41:22 -0700473 return VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski2fd634c2015-07-29 09:21:22 -0600474
Chia-I Wuf7458c52015-10-26 21:10:41 +0800475 VkResult result = my_data->device_dispatch_table->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
Jeremy Hayes9cc31582015-06-18 10:12:39 -0600476
477 return result;
478}
479
Chia-I Wu9ab61502015-11-06 06:42:02 +0800480VK_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 -0600481{
482 VkBool32 skipCall = VK_FALSE;
483 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chia-I Wue2fc5522015-10-26 20:04:44 +0800484 auto imageEntry = device_data->imageMap.find(pCreateInfo->image);
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600485 if (imageEntry != device_data->imageMap.end()) {
Tobin Ehlisd923d152015-09-25 14:49:43 -0600486 if (pCreateInfo->subresourceRange.baseMipLevel >= imageEntry->second.mipLevels) {
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600487 std::stringstream ss;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600488 ss << "vkCreateImageView called with baseMipLevel " << pCreateInfo->subresourceRange.baseMipLevel
Chia-I Wue2fc5522015-10-26 20:04:44 +0800489 << " for image " << pCreateInfo->image << " that only has " << imageEntry->second.mipLevels << " mip levels.";
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700490 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 -0600491 }
Tobin Ehlisd923d152015-09-25 14:49:43 -0600492 if (pCreateInfo->subresourceRange.baseArrayLayer >= imageEntry->second.arraySize) {
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600493 std::stringstream ss;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600494 ss << "vkCreateImageView called with baseArrayLayer " << pCreateInfo->subresourceRange.baseArrayLayer << " for image "
Chia-I Wue2fc5522015-10-26 20:04:44 +0800495 << pCreateInfo->image << " that only has " << imageEntry->second.arraySize << " mip levels.";
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700496 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 -0600497 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800498 if (!pCreateInfo->subresourceRange.levelCount) {
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600499 std::stringstream ss;
Jeremy Hayes5097da02015-11-17 18:24:56 -0700500 ss << "vkCreateImageView called with 0 in pCreateInfo->subresourceRange.levelCount.";
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700501 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 -0600502 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800503 if (!pCreateInfo->subresourceRange.layerCount) {
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600504 std::stringstream ss;
Jeremy Hayes5097da02015-11-17 18:24:56 -0700505 ss << "vkCreateImageView called with 0 in pCreateInfo->subresourceRange.layerCount.";
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700506 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 -0600507 }
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600508
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600509 // Validate correct image aspect bits for desired formats and format consistency
Tobin Ehlisd923d152015-09-25 14:49:43 -0600510 VkFormat imageFormat = imageEntry->second.format;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600511 VkFormat ivciFormat = pCreateInfo->format;
512 VkImageAspectFlags aspectMask = pCreateInfo->subresourceRange.aspectMask;
513
514 if (vk_format_is_color(imageFormat)) {
515 if ((aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) != VK_IMAGE_ASPECT_COLOR_BIT) {
516 std::stringstream ss;
517 ss << "vkCreateImageView: Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700518 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 -0700519 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600520 }
521 if ((aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) != aspectMask) {
522 std::stringstream ss;
523 ss << "vkCreateImageView: Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700524 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 -0700525 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600526 }
527 if (VK_FALSE == vk_format_is_color(ivciFormat)) {
528 std::stringstream ss;
529 ss << "vkCreateImageView: The image view's format can differ from the parent image's format, but both must be "
530 << "color formats. ImageFormat is " << string_VkFormat(imageFormat) << " ImageViewFormat is " << string_VkFormat(ivciFormat);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700531 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 -0700532 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600533 }
534 // TODO: Uncompressed formats are compatible if they occupy they same number of bits per pixel.
535 // Compressed formats are compatible if the only difference between them is the numerical type of
536 // the uncompressed pixels (e.g. signed vs. unsigned, or sRGB vs. UNORM encoding).
537 } else if (vk_format_is_depth_and_stencil(imageFormat)) {
Mark Lobodzinskid21bbff2015-11-23 09:07:20 -0700538 if ((aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) == 0) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600539 std::stringstream ss;
Mark Lobodzinski26d58042015-11-18 09:14:04 -0700540 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 -0700541 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 -0700542 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600543 }
544 if ((aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != aspectMask) {
545 std::stringstream ss;
546 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 -0700547 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 -0700548 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600549 }
550 } else if (vk_format_is_depth_only(imageFormat)) {
551 if ((aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) {
552 std::stringstream ss;
553 ss << "vkCreateImageView: Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700554 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 -0700555 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600556 }
557 if ((aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != aspectMask) {
558 std::stringstream ss;
559 ss << "vkCreateImageView: Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700560 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 -0700561 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600562 }
563 } else if (vk_format_is_stencil_only(imageFormat)) {
564 if ((aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT) {
565 std::stringstream ss;
566 ss << "vkCreateImageView: Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700567 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 -0700568 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600569 }
570 if ((aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != aspectMask) {
571 std::stringstream ss;
572 ss << "vkCreateImageView: Stencil-only image formats can have only the VK_IMAGE_ASPECT_STENCIL_BIT set";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700573 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 -0700574 (uint64_t)pCreateInfo->image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600575 }
576 }
577 }
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600578
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600579 if (skipCall)
Courtney Goeltzenleuchter52fee652015-12-10 16:41:22 -0700580 return VK_ERROR_VALIDATION_FAILED_EXT;
Tobin Ehlisdea00952015-09-22 08:40:52 -0600581
Chia-I Wuf7458c52015-10-26 21:10:41 +0800582 VkResult result = device_data->device_dispatch_table->CreateImageView(device, pCreateInfo, pAllocator, pView);
Tobin Ehlisad8c4462015-09-21 15:20:28 -0600583 return result;
584}
585
Chia-I Wu9ab61502015-11-06 06:42:02 +0800586VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800587 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600588 VkImage image,
589 VkImageLayout imageLayout,
590 const VkClearColorValue *pColor,
591 uint32_t rangeCount,
592 const VkImageSubresourceRange *pRanges)
593{
594 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800595 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600596 // For each range, image aspect must be color only
597 for (uint32_t i = 0; i < rangeCount; i++) {
598 if (pRanges[i].aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600599 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 -0700600 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 -0700601 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600602 }
603 }
604
605 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800606 device_data->device_dispatch_table->CmdClearColorImage(commandBuffer, image, imageLayout,
607 pColor, rangeCount, pRanges);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600608 }
609}
610
Chia-I Wu9ab61502015-11-06 06:42:02 +0800611VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800612 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600613 VkImage image,
614 VkImageLayout imageLayout,
615 const VkClearDepthStencilValue *pDepthStencil,
616 uint32_t rangeCount,
617 const VkImageSubresourceRange *pRanges)
618{
619 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800620 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600621 // For each range, Image aspect must be depth or stencil or both
622 for (uint32_t i = 0; i < rangeCount; i++) {
623 if (((pRanges[i].aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) &&
624 ((pRanges[i].aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT))
625 {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600626 char const str[] = "vkCmdClearDepthStencilImage aspectMasks for all subresource ranges must be "
627 "set to VK_IMAGE_ASPECT_DEPTH_BIT and/or VK_IMAGE_ASPECT_STENCIL_BIT";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700628 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 -0700629 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600630 }
631 }
632
633 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800634 device_data->device_dispatch_table->CmdClearDepthStencilImage(commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600635 image, imageLayout, pDepthStencil, rangeCount, pRanges);
636 }
637}
638
Chia-I Wu9ab61502015-11-06 06:42:02 +0800639VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800640 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600641 VkImage srcImage,
642 VkImageLayout srcImageLayout,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800643 VkImage dstImage,
644 VkImageLayout dstImageLayout,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600645 uint32_t regionCount,
646 const VkImageCopy *pRegions)
647{
648 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800649 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Chia-I Wue2fc5522015-10-26 20:04:44 +0800650 auto srcImageEntry = device_data->imageMap.find(srcImage);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800651 auto dstImageEntry = device_data->imageMap.find(dstImage);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600652
Jeremy Hayes148bab22015-10-28 13:01:39 -0600653 // For each region, src and dst number of layers should not be zero
654 // For each region, src and dst number of layers must match
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600655 // For each region, src aspect mask must match dest aspect mask
656 // For each region, color aspects cannot be mixed with depth/stencil aspects
657 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800658 if(pRegions[i].srcSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600659 {
660 char const str[] = "vkCmdCopyImage: number of layers in source subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700661 // TODO: Verify against Valid Use section of spec
662 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 -0700663 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600664 }
665
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800666 if(pRegions[i].dstSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600667 {
668 char const str[] = "vkCmdCopyImage: number of layers in destination subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700669 // TODO: Verify against Valid Use section of spec
670 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 -0700671 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600672 }
673
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800674 if(pRegions[i].srcSubresource.layerCount != pRegions[i].dstSubresource.layerCount)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600675 {
676 char const str[] = "vkCmdCopyImage: number of layers in source and destination subresources must match";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700677 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 -0700678 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600679 }
680
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800681 if (pRegions[i].srcSubresource.aspectMask != pRegions[i].dstSubresource.aspectMask) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600682 char const str[] = "vkCmdCopyImage: Src and dest aspectMasks for each region must match";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700683 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 -0700684 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600685 }
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800686 if ((pRegions[i].srcSubresource.aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) &&
687 (pRegions[i].srcSubresource.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600688 char const str[] = "vkCmdCopyImage aspectMask cannot specify both COLOR and DEPTH/STENCIL aspects";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700689 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 -0700690 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600691 }
692 }
693
Mike Stroyana3082432015-09-25 13:39:21 -0600694 if ((srcImageEntry != device_data->imageMap.end())
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800695 && (dstImageEntry != device_data->imageMap.end())) {
696 if (srcImageEntry->second.imageType != dstImageEntry->second.imageType) {
Mike Stroyana3082432015-09-25 13:39:21 -0600697 char const str[] = "vkCmdCopyImage called with unmatched source and dest image types.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700698 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 -0700699 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_TYPE, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -0600700 }
701 // Check that format is same size or exact stencil/depth
Tobin Ehlisd923d152015-09-25 14:49:43 -0600702 if (is_depth_format(srcImageEntry->second.format)) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800703 if (srcImageEntry->second.format != dstImageEntry->second.format) {
Mike Stroyana3082432015-09-25 13:39:21 -0600704 char const str[] = "vkCmdCopyImage called with unmatched source and dest image depth/stencil formats.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700705 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 -0700706 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -0600707 }
708 } else {
Tobin Ehlisd923d152015-09-25 14:49:43 -0600709 size_t srcSize = vk_format_get_size(srcImageEntry->second.format);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800710 size_t destSize = vk_format_get_size(dstImageEntry->second.format);
Mike Stroyana3082432015-09-25 13:39:21 -0600711 if (srcSize != destSize) {
712 char const str[] = "vkCmdCopyImage called with unmatched source and dest image format sizes.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700713 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 -0700714 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -0600715 }
716 }
717 }
718
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600719 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800720 device_data->device_dispatch_table->CmdCopyImage(commandBuffer, srcImage,
721 srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600722 }
723}
724
Chia-I Wu9ab61502015-11-06 06:42:02 +0800725VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800726 VkCommandBuffer commandBuffer,
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600727 uint32_t attachmentCount,
728 const VkClearAttachment* pAttachments,
729 uint32_t rectCount,
Courtney Goeltzenleuchter4ca43f62015-10-15 18:22:08 -0600730 const VkClearRect* pRects)
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600731{
732 VkBool32 skipCall = VK_FALSE;
733 VkImageAspectFlags aspectMask;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800734 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600735 for (uint32_t i = 0; i < attachmentCount; i++) {
736 aspectMask = pAttachments[i].aspectMask;
737 if (aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) {
738 if (aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) {
739 // VK_IMAGE_ASPECT_COLOR_BIT is not the only bit set for this attachment
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600740 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 -0700741 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 -0700742 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str, i);
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600743 }
744 } else {
745 // Image aspect must be depth or stencil or both
746 if (((aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) &&
747 ((aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT))
748 {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600749 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 -0700750 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 -0700751 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str, i);
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600752 }
753 }
754 }
755
756 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800757 device_data->device_dispatch_table->CmdClearAttachments(commandBuffer,
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -0600758 attachmentCount, pAttachments, rectCount, pRects);
759 }
760}
761
Chia-I Wu9ab61502015-11-06 06:42:02 +0800762VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800763 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600764 VkImage srcImage,
765 VkImageLayout srcImageLayout,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800766 VkBuffer dstBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600767 uint32_t regionCount,
768 const VkBufferImageCopy *pRegions)
769{
770 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800771 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600772 // For each region, the number of layers in the image subresource should not be zero
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600773 // Image aspect must be ONE OF color, depth, stencil
774 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800775 if(pRegions[i].imageSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600776 {
Jeremy Hayes148bab22015-10-28 13:01:39 -0600777 char const str[] = "vkCmdCopyImageToBuffer: number of layers in image subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700778 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
779 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 -0700780 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600781 }
782
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800783 VkImageAspectFlags aspectMask = pRegions[i].imageSubresource.aspectMask;
784 if ((aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) &&
785 (aspectMask != VK_IMAGE_ASPECT_DEPTH_BIT) &&
786 (aspectMask != VK_IMAGE_ASPECT_STENCIL_BIT)) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600787 char const str[] = "vkCmdCopyImageToBuffer: aspectMasks for each region must specify only COLOR or DEPTH or STENCIL";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700788 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 -0700789 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600790 }
791 }
792
793 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800794 device_data->device_dispatch_table->CmdCopyImageToBuffer(commandBuffer,
795 srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600796 }
797}
798
Chia-I Wu9ab61502015-11-06 06:42:02 +0800799VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800800 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600801 VkBuffer srcBuffer,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800802 VkImage dstImage,
803 VkImageLayout dstImageLayout,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600804 uint32_t regionCount,
805 const VkBufferImageCopy *pRegions)
806{
807 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800808 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600809 // For each region, the number of layers in the image subresource should not be zero
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600810 // Image aspect must be ONE OF color, depth, stencil
811 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800812 if(pRegions[i].imageSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600813 {
Jeremy Hayes148bab22015-10-28 13:01:39 -0600814 char const str[] = "vkCmdCopyBufferToImage: number of layers in image subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700815 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
816 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 -0700817 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600818 }
819
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800820 VkImageAspectFlags aspectMask = pRegions[i].imageSubresource.aspectMask;
821 if ((aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) &&
822 (aspectMask != VK_IMAGE_ASPECT_DEPTH_BIT) &&
823 (aspectMask != VK_IMAGE_ASPECT_STENCIL_BIT)) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600824 char const str[] = "vkCmdCopyBufferToImage: aspectMasks for each region must specify only COLOR or DEPTH or STENCIL";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700825 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 -0700826 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600827 }
828 }
829
830 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800831 device_data->device_dispatch_table->CmdCopyBufferToImage(commandBuffer,
832 srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600833 }
834}
835
Chia-I Wu9ab61502015-11-06 06:42:02 +0800836VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800837 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600838 VkImage srcImage,
839 VkImageLayout srcImageLayout,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800840 VkImage dstImage,
841 VkImageLayout dstImageLayout,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600842 uint32_t regionCount,
843 const VkImageBlit *pRegions,
Chia-I Wub99df442015-10-26 16:49:32 +0800844 VkFilter filter)
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600845{
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600846 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800847 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600848
Chia-I Wue2fc5522015-10-26 20:04:44 +0800849 auto srcImageEntry = device_data->imageMap.find(srcImage);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800850 auto dstImageEntry = device_data->imageMap.find(dstImage);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600851
852 if ((srcImageEntry != device_data->imageMap.end()) &&
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800853 (dstImageEntry != device_data->imageMap.end())) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600854
Tobin Ehlisd923d152015-09-25 14:49:43 -0600855 VkFormat srcFormat = srcImageEntry->second.format;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800856 VkFormat dstFormat = dstImageEntry->second.format;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600857
858 // Validate consistency for signed and unsigned formats
859 if ((vk_format_is_sint(srcFormat) && !vk_format_is_sint(dstFormat)) ||
860 (vk_format_is_uint(srcFormat) && !vk_format_is_uint(dstFormat))) {
861 std::stringstream ss;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800862 ss << "vkCmdBlitImage: If one of srcImage and dstImage images has signed/unsigned integer format, "
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600863 << "the other one must also have signed/unsigned integer format. "
Mark Lobodzinski2e8ccbb2015-12-31 09:49:50 -0700864 << "Source format is " << string_VkFormat(srcFormat) << " Destination format is " << string_VkFormat(dstFormat);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700865 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 -0700866 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600867 }
868
869 // Validate aspect bits and formats for depth/stencil images
870 if (vk_format_is_depth_or_stencil(srcFormat) ||
871 vk_format_is_depth_or_stencil(dstFormat)) {
872 if (srcFormat != dstFormat) {
873 std::stringstream ss;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800874 ss << "vkCmdBlitImage: If one of srcImage and dstImage images has a format of depth, stencil or depth "
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600875 << "stencil, the other one must have exactly the same format. "
Mark Lobodzinski2e8ccbb2015-12-31 09:49:50 -0700876 << "Source format is " << string_VkFormat(srcFormat) << " Destination format is " << string_VkFormat(dstFormat);
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700877 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 -0700878 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600879 }
880
881 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800882 if(pRegions[i].srcSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600883 {
884 char const str[] = "vkCmdBlitImage: number of layers in source subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700885 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
886 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 -0700887 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600888 }
889
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800890 if(pRegions[i].dstSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600891 {
892 char const str[] = "vkCmdBlitImage: number of layers in destination subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700893 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
894 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 -0700895 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600896 }
897
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800898 if(pRegions[i].srcSubresource.layerCount != pRegions[i].dstSubresource.layerCount)
Jeremy Hayes148bab22015-10-28 13:01:39 -0600899 {
900 char const str[] = "vkCmdBlitImage: number of layers in source and destination subresources must match";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700901 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 -0700902 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -0600903 }
904
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800905 VkImageAspectFlags srcAspect = pRegions[i].srcSubresource.aspectMask;
906 VkImageAspectFlags dstAspect = pRegions[i].dstSubresource.aspectMask;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600907
908 if (srcAspect != dstAspect) {
909 std::stringstream ss;
910 ss << "vkCmdBlitImage: Image aspects of depth/stencil images should match";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700911 // TODO: Verify against Valid Use section of spec, if this case yields undefined results, then it's an error
912 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 -0700913 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600914 }
915 if (vk_format_is_depth_and_stencil(srcFormat)) {
916 if (srcAspect != (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
917 std::stringstream ss;
918 ss << "vkCmdBlitImage: Combination depth/stencil image formats must have both VK_IMAGE_ASPECT_DEPTH_BIT "
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800919 << "and VK_IMAGE_ASPECT_STENCIL_BIT set in both the srcImage and dstImage";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700920 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 -0700921 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600922 }
923 } else if (vk_format_is_stencil_only(srcFormat)) {
924 if (srcAspect != VK_IMAGE_ASPECT_STENCIL_BIT) {
925 std::stringstream ss;
926 ss << "vkCmdBlitImage: Stencil-only image formats must have only the VK_IMAGE_ASPECT_STENCIL_BIT "
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800927 << "set in both the srcImage and dstImage";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700928 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 -0700929 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600930 }
931 } else if (vk_format_is_depth_only(srcFormat)) {
932 if (srcAspect != VK_IMAGE_ASPECT_DEPTH_BIT) {
933 std::stringstream ss;
934 ss << "vkCmdBlitImage: Depth-only image formats must have only the VK_IMAGE_ASPECT_DEPTH "
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800935 << "set in both the srcImage and dstImage";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700936 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 -0700937 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600938 }
939 }
940 }
941 }
942
943 // Validate filter
944 if (vk_format_is_depth_or_stencil(srcFormat) ||
945 vk_format_is_int(srcFormat)) {
Chia-I Wub99df442015-10-26 16:49:32 +0800946 if (filter != VK_FILTER_NEAREST) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600947 std::stringstream ss;
948 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 +0800949 << "then filter must be VK_FILTER_NEAREST.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700950 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 -0700951 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_FILTER, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600952 }
953 }
954 }
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600955
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800956 device_data->device_dispatch_table->CmdBlitImage(commandBuffer, srcImage,
957 srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600958}
959
Jeremy Hayes01b38892015-11-17 18:19:55 -0700960VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(
961 VkCommandBuffer commandBuffer,
962 VkPipelineStageFlags srcStageMask,
963 VkPipelineStageFlags dstStageMask,
964 VkDependencyFlags dependencyFlags,
965 uint32_t memoryBarrierCount,
966 const void* const* ppMemoryBarriers)
967{
968 VkBool32 skipCall = VK_FALSE;
969 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
970
971 for (uint32_t i = 0; i < memoryBarrierCount; ++i)
972 {
973 VkImageMemoryBarrier const*const barrier = (VkImageMemoryBarrier const*const)ppMemoryBarriers[i];
974 if (barrier->sType == VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER)
975 {
976 if (barrier->subresourceRange.layerCount == 0)
977 {
978 std::stringstream ss;
979 ss << "vkCmdPipelineBarrier called with 0 in ppMemoryBarriers[" << i << "]->subresourceRange.layerCount.";
Mark Lobodzinski37a38b12016-01-04 13:32:45 -0700980 skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0,
981 0, __LINE__, IMAGE_INVALID_IMAGE_RESOURCE, "IMAGE", "%s", ss.str().c_str());
Jeremy Hayes01b38892015-11-17 18:19:55 -0700982 }
983 }
984 }
985
986 if (skipCall)
987 {
988 return;
989 }
990
991 device_data->device_dispatch_table->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags,
992 memoryBarrierCount, ppMemoryBarriers);
993}
994
Chia-I Wu9ab61502015-11-06 06:42:02 +0800995VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage(
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800996 VkCommandBuffer commandBuffer,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -0600997 VkImage srcImage,
998 VkImageLayout srcImageLayout,
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800999 VkImage dstImage,
1000 VkImageLayout dstImageLayout,
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001001 uint32_t regionCount,
1002 const VkImageResolve *pRegions)
1003{
1004 VkBool32 skipCall = VK_FALSE;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001005 layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
Chia-I Wue2fc5522015-10-26 20:04:44 +08001006 auto srcImageEntry = device_data->imageMap.find(srcImage);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001007 auto dstImageEntry = device_data->imageMap.find(dstImage);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001008
Jeremy Hayes148bab22015-10-28 13:01:39 -06001009 // For each region, the number of layers in the image subresource should not be zero
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001010 // For each region, src and dest image aspect must be color only
1011 for (uint32_t i = 0; i < regionCount; i++) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001012 if(pRegions[i].srcSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -06001013 {
1014 char const str[] = "vkCmdResolveImage: number of layers in source subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001015 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid/error
1016 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 -07001017 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -06001018 }
1019
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001020 if(pRegions[i].dstSubresource.layerCount == 0)
Jeremy Hayes148bab22015-10-28 13:01:39 -06001021 {
1022 char const str[] = "vkCmdResolveImage: number of layers in destination subresource is zero";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001023
1024 // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid/error
1025 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 -07001026 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str);
Jeremy Hayes148bab22015-10-28 13:01:39 -06001027 }
1028
Chia-I Wuab83a0e2015-10-27 19:00:15 +08001029 if ((pRegions[i].srcSubresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) ||
1030 (pRegions[i].dstSubresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT)) {
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001031 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 -07001032 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 -07001033 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", str);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001034 }
1035 }
1036
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001037 if ((srcImageEntry != device_data->imageMap.end()) &&
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001038 (dstImageEntry != device_data->imageMap.end())) {
1039 if (srcImageEntry->second.format != dstImageEntry->second.format) {
Mike Stroyana3082432015-09-25 13:39:21 -06001040 char const str[] = "vkCmdResolveImage called with unmatched source and dest formats.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001041 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 -07001042 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -06001043 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001044 if (srcImageEntry->second.imageType != dstImageEntry->second.imageType) {
Mike Stroyana3082432015-09-25 13:39:21 -06001045 char const str[] = "vkCmdResolveImage called with unmatched source and dest image types.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001046 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 -07001047 (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_TYPE, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -06001048 }
Chia-I Wu5c17c962015-10-31 00:31:16 +08001049 if (srcImageEntry->second.samples == VK_SAMPLE_COUNT_1_BIT) {
Mike Stroyana3082432015-09-25 13:39:21 -06001050 char const str[] = "vkCmdResolveImage called with source sample count less than 2.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001051 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 -07001052 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_RESOLVE_SAMPLES, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -06001053 }
Chia-I Wu5c17c962015-10-31 00:31:16 +08001054 if (dstImageEntry->second.samples != VK_SAMPLE_COUNT_1_BIT) {
Mike Stroyana3082432015-09-25 13:39:21 -06001055 char const str[] = "vkCmdResolveImage called with dest sample count greater than 1.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001056 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 -07001057 (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_RESOLVE_SAMPLES, "IMAGE", str);
Mike Stroyana3082432015-09-25 13:39:21 -06001058 }
1059 }
1060
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001061 if (VK_FALSE == skipCall) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001062 device_data->device_dispatch_table->CmdResolveImage(commandBuffer, srcImage,
1063 srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001064 }
1065}
1066
Chia-I Wu9ab61502015-11-06 06:42:02 +08001067VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout(
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001068 VkDevice device,
1069 VkImage image,
1070 const VkImageSubresource *pSubresource,
1071 VkSubresourceLayout *pLayout)
1072{
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001073 VkBool32 skipCall = VK_FALSE;
1074 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1075 VkFormat format;
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001076
Chia-I Wue2fc5522015-10-26 20:04:44 +08001077 auto imageEntry = device_data->imageMap.find(image);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001078
1079 // Validate that image aspects match formats
1080 if (imageEntry != device_data->imageMap.end()) {
Tobin Ehlisd923d152015-09-25 14:49:43 -06001081 format = imageEntry->second.format;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001082 if (vk_format_is_color(format)) {
Chia-I Wu52b07e72015-10-27 19:55:05 +08001083 if (pSubresource->aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001084 std::stringstream ss;
Chia-I Wu52b07e72015-10-27 19:55:05 +08001085 ss << "vkGetImageSubresourceLayout: For color formats, the aspectMask field of VkImageSubresource must be VK_IMAGE_ASPECT_COLOR.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001086 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 -07001087 (uint64_t)image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001088 }
1089 } else if (vk_format_is_depth_or_stencil(format)) {
Chia-I Wu52b07e72015-10-27 19:55:05 +08001090 if ((pSubresource->aspectMask != VK_IMAGE_ASPECT_DEPTH_BIT) &&
1091 (pSubresource->aspectMask != VK_IMAGE_ASPECT_STENCIL_BIT)) {
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001092 std::stringstream ss;
Chia-I Wu52b07e72015-10-27 19:55:05 +08001093 ss << "vkGetImageSubresourceLayout: For depth/stencil formats, the aspectMask selects either the depth or stencil image aspectMask.";
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001094 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 -07001095 (uint64_t)image, __LINE__, IMAGE_INVALID_IMAGE_ASPECT, "IMAGE", "%s", ss.str().c_str());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001096 }
1097 }
1098 }
1099
1100 if (VK_FALSE == skipCall) {
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001101 device_data->device_dispatch_table->GetImageSubresourceLayout(device,
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001102 image, pSubresource, pLayout);
1103 }
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001104}
1105
Mark Lobodzinskid5a23822015-11-12 15:14:35 -07001106VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties)
1107{
1108 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
1109 phy_dev_data->instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, pProperties);
1110}
1111
Chia-I Wu9ab61502015-11-06 06:42:02 +08001112VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001113{
1114 if (device == NULL) {
1115 return NULL;
1116 }
1117
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001118 layer_data *my_data;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001119 // loader uses this to force layer initialization; device object is wrapped
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001120 if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001121 VkBaseLayerObject* wrapped_dev = (VkBaseLayerObject*) device;
1122 my_data = get_my_data_ptr(get_dispatch_key(wrapped_dev->baseObject), layer_data_map);
1123 my_data->device_dispatch_table = new VkLayerDispatchTable;
1124 layer_initialize_dispatch_table(my_data->device_dispatch_table, wrapped_dev);
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001125 return (PFN_vkVoidFunction) vkGetDeviceProcAddr;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001126 }
1127
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001128 my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Courtney Goeltzenleuchterca173b82015-06-25 18:01:43 -06001129 if (!strcmp(funcName, "vkCreateDevice"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001130 return (PFN_vkVoidFunction) vkCreateDevice;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001131 if (!strcmp(funcName, "vkDestroyDevice"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001132 return (PFN_vkVoidFunction) vkDestroyDevice;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001133 if (!strcmp(funcName, "vkCreateImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001134 return (PFN_vkVoidFunction) vkCreateImage;
Mark Lobodzinski46fc3dd2015-10-29 12:58:33 -06001135 if (!strcmp(funcName, "vkDestroyImage"))
1136 return (PFN_vkVoidFunction) vkDestroyImage;
Tobin Ehliscde08892015-09-22 10:11:37 -06001137 if (!strcmp(funcName, "vkCreateImageView"))
1138 return (PFN_vkVoidFunction) vkCreateImageView;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001139 if (!strcmp(funcName, "vkCreateRenderPass"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001140 return (PFN_vkVoidFunction) vkCreateRenderPass;
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001141 if (!strcmp(funcName, "vkCmdClearColorImage"))
1142 return (PFN_vkVoidFunction) vkCmdClearColorImage;
1143 if (!strcmp(funcName, "vkCmdClearDepthStencilImage"))
1144 return (PFN_vkVoidFunction) vkCmdClearDepthStencilImage;
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06001145 if (!strcmp(funcName, "vkCmdClearAttachments"))
1146 return (PFN_vkVoidFunction) vkCmdClearAttachments;
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001147 if (!strcmp(funcName, "vkCmdCopyImage"))
1148 return (PFN_vkVoidFunction) vkCmdCopyImage;
1149 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
1150 return (PFN_vkVoidFunction) vkCmdCopyImageToBuffer;
1151 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
1152 return (PFN_vkVoidFunction) vkCmdCopyBufferToImage;
1153 if (!strcmp(funcName, "vkCmdBlitImage"))
1154 return (PFN_vkVoidFunction) vkCmdBlitImage;
Jeremy Hayes01b38892015-11-17 18:19:55 -07001155 if (!strcmp(funcName, "vkCmdPipelineBarrier"))
1156 return (PFN_vkVoidFunction) vkCmdPipelineBarrier;
Mark Lobodzinskia5eabe72015-10-05 17:16:05 -06001157 if (!strcmp(funcName, "vkCmdResolveImage"))
1158 return (PFN_vkVoidFunction) vkCmdResolveImage;
1159 if (!strcmp(funcName, "vkGetImageSubresourceLayout"))
1160 return (PFN_vkVoidFunction) vkGetImageSubresourceLayout;
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001161
1162 VkLayerDispatchTable* pTable = my_data->device_dispatch_table;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001163 {
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001164 if (pTable->GetDeviceProcAddr == NULL)
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001165 return NULL;
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001166 return pTable->GetDeviceProcAddr(device, funcName);
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001167 }
1168}
1169
Chia-I Wu9ab61502015-11-06 06:42:02 +08001170VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001171{
1172 if (instance == NULL) {
1173 return NULL;
1174 }
1175
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001176 layer_data *my_data;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -06001177 // loader uses this to force layer initialization; instance object is wrapped
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001178 if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001179 VkBaseLayerObject* wrapped_inst = (VkBaseLayerObject*) instance;
1180 my_data = get_my_data_ptr(get_dispatch_key(wrapped_inst->baseObject), layer_data_map);
1181 my_data->instance_dispatch_table = new VkLayerInstanceDispatchTable;
1182 layer_init_instance_dispatch_table(my_data->instance_dispatch_table, wrapped_inst);
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001183 return (PFN_vkVoidFunction) vkGetInstanceProcAddr;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001184 }
1185
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001186 my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001187 if (!strcmp(funcName, "vkCreateInstance"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001188 return (PFN_vkVoidFunction) vkCreateInstance;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001189 if (!strcmp(funcName, "vkDestroyInstance"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06001190 return (PFN_vkVoidFunction) vkDestroyInstance;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06001191 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
1192 return (PFN_vkVoidFunction) vkEnumerateInstanceLayerProperties;
1193 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
1194 return (PFN_vkVoidFunction) vkEnumerateInstanceExtensionProperties;
1195 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
1196 return (PFN_vkVoidFunction) vkEnumerateDeviceLayerProperties;
1197 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
1198 return (PFN_vkVoidFunction) vkEnumerateDeviceExtensionProperties;
Mark Lobodzinskid5a23822015-11-12 15:14:35 -07001199 if (!strcmp(funcName, "vkGetPhysicalDeviceProperties"))
1200 return (PFN_vkVoidFunction) vkGetPhysicalDeviceProperties;
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001201
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001202 PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(my_data->report_data, funcName);
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001203 if(fptr)
1204 return fptr;
1205
1206 {
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001207 VkLayerInstanceDispatchTable* pTable = my_data->instance_dispatch_table;
1208 if (pTable->GetInstanceProcAddr == NULL)
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001209 return NULL;
Tobin Ehlisb74f6ab2015-10-29 14:19:18 -06001210 return pTable->GetInstanceProcAddr(instance, funcName);
Jeremy Hayes9cc31582015-06-18 10:12:39 -06001211 }
1212}