blob: 822cb42d21fa3b4da3d40a5d1055338677fa7fb5 [file] [log] [blame]
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001/*
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002 * Vulkan
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28
29#include <iostream>
30#include <string>
31#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050032#include <unordered_map>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060033
34#include "loader_platform.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060035#include "vkLayer.h"
Jon Ashburne68a9ff2015-05-25 14:11:37 -060036#include "vk_debug_marker_layer.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060037#include "layers_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060038#include "vk_enum_validate_helper.h"
39#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060040//The following is #included again to catch certain OS-specific functions being used:
41#include "loader_platform.h"
42
43#include "layers_msg.h"
Jon Ashburneab34492015-06-01 09:37:38 -060044#include "layers_debug_marker_table.h"
Jon Ashburn9eed2892015-06-01 10:02:09 -060045#include "layers_table.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060046
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060047static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(initOnce);
Jon Ashburneab34492015-06-01 09:37:38 -060048struct devExts {
49 bool debug_marker_enabled;
Jon Ashburn747f2b62015-06-18 15:02:58 -060050 bool wsi_lunarg_enabled;
Jon Ashburneab34492015-06-01 09:37:38 -060051};
Jon Ashburneab34492015-06-01 09:37:38 -060052static std::unordered_map<void *, struct devExts> deviceExtMap;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050053
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060054
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060055#include "vk_dispatch_table_helper.h"
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060056
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060057static void initParamChecker(void)
58{
59
60 const char *strOpt;
61 // initialize ParamChecker options
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -060062 getLayerOptionEnum("ParamCheckerReportLevel", (uint32_t *) &g_reportFlags);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060063 g_actionIsDefault = getLayerOptionEnum("ParamCheckerDebugAction", (uint32_t *) &g_debugAction);
64
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060065 if (g_debugAction & VK_DBG_LAYER_ACTION_LOG_MSG)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060066 {
67 strOpt = getLayerOption("ParamCheckerLogFilename");
68 if (strOpt)
69 {
70 g_logFile = fopen(strOpt, "w");
71 }
72 if (g_logFile == NULL)
73 g_logFile = stdout;
74 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060075}
76
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -060077void PreCreateInstance(const VkApplicationInfo* pAppInfo, const VkAllocCallbacks* pAllocCb)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060078{
79 if(pAppInfo == nullptr)
80 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -060081 char const str[] = "vkCreateInstance parameter, VkApplicationInfo* pAppInfo, is "\
Mike Stroyan1c8d4d82015-04-06 15:24:46 -060082 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -060083 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060084 return;
85 }
86
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060087 if(pAppInfo->sType != VK_STRUCTURE_TYPE_APPLICATION_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060088 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060089 char const str[] = "vkCreateInstance parameter, VK_STRUCTURE_TYPE_APPLICATION_INFO "\
90 "pAppInfo->sType, is not VK_STRUCTURE_TYPE_APPLICATION_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -060091 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060092 return;
93 }
94
95 // TODO: What else can validated in pAppInfo?
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060096 // TODO: VK_API_VERSION validation.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060097
98 // It's okay if pAllocCb is a nullptr.
99 if(pAllocCb != nullptr)
100 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600101 if(!vk_validate_vkalloccallbacks(pAllocCb))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600102 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600103 char const str[] = "vkCreateInstance parameter, VkAllocCallbacks* pAllocCb, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600104 "contains an invalid value (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600105 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600106 return;
107 }
108 }
109}
110
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600111void PostCreateInstance(VkResult result, const VkInstanceCreateInfo *pCreateInfo, VkInstance* pInstance)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600112{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600113 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600114 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600115 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600116 char const str[] = "vkCreateInstance failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600117 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600118 return;
119 }
120
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600121 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
122
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600123 if(pInstance == nullptr)
124 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600125 char const str[] = "vkCreateInstance parameter, VkInstance* pInstance, is nullptr "\
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600126 "(postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600127 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600128 return;
129 }
Courtney Goeltzenleuchterd02a9642015-06-08 14:58:39 -0600130
131 VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(*pInstance);
132 debug_report_init_instance_extension_dispatch_table(
133 pTable,
134 pTable->GetInstanceProcAddr,
135 *pInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600136}
137
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600138VK_LAYER_EXPORT VkResult VKAPI vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600139{
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600140 loader_platform_thread_once(&initOnce, initParamChecker);
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600141
Jon Ashburnb317fad2015-04-04 14:52:07 -0600142 PreCreateInstance(pCreateInfo->pAppInfo, pCreateInfo->pAllocCb);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500143 VkResult result = instance_dispatch_table(*pInstance)->CreateInstance(pCreateInfo, pInstance);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600144 PostCreateInstance(result, pCreateInfo, pInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600145 return result;
146}
147
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600148VK_LAYER_EXPORT VkResult VKAPI vkDestroyInstance(VkInstance instance)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600149{
Courtney Goeltzenleuchter0daf2282015-06-13 21:22:12 -0600150 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500151 VkResult res = instance_dispatch_table(instance)->DestroyInstance(instance);
Courtney Goeltzenleuchter0daf2282015-06-13 21:22:12 -0600152 destroy_instance_dispatch_table(key);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500153 return res;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600154}
155
Tony Barbourd1c35722015-04-16 15:59:00 -0600156VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceInfo(VkPhysicalDevice gpu, VkPhysicalDeviceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600157{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600158 char str[1024];
Tony Barbourd1c35722015-04-16 15:59:00 -0600159 if (!validate_VkPhysicalDeviceInfoType(infoType)) {
160 sprintf(str, "Parameter infoType to function GetPhysicalDeviceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600161 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600162 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500163 VkResult result = instance_dispatch_table(gpu)->GetPhysicalDeviceInfo(gpu, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600164 return result;
165}
166
Tony Barbourd1c35722015-04-16 15:59:00 -0600167void PreCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600168{
169 if(gpu == nullptr)
170 {
Tony Barbourd1c35722015-04-16 15:59:00 -0600171 char const str[] = "vkCreateDevice parameter, VkPhysicalDevice gpu, is nullptr "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600172 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600173 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600174 return;
175 }
176
177 if(pCreateInfo == nullptr)
178 {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600179 char const str[] = "vkCreateDevice parameter, VkDeviceCreateInfo* pCreateInfo, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600180 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600181 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600182 return;
183 }
184
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600185 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600186 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600187 char const str[] = "vkCreateDevice parameter, VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO "\
188 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600189 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600190 return;
191 }
192
193 if(pCreateInfo->queueRecordCount == 0)
194 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600195 char const str[] = "vkCreateDevice parameter, uint32_t pCreateInfo->queueRecordCount, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600196 "zero (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600197 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600198 return;
199 }
200
201 if(pCreateInfo->pRequestedQueues == nullptr)
202 {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600203 char const str[] = "vkCreateDevice parameter, VkDeviceQueueCreateInfo* pCreateInfo->pRequestedQueues, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600204 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600205 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600206 return;
207 }
208
209 for(uint32_t i = 0; i < pCreateInfo->queueRecordCount; ++i)
210 {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600211 if(!vk_validate_vkdevicequeuecreateinfo(&(pCreateInfo->pRequestedQueues[i])))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600212 {
213 std::stringstream ss;
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600214 ss << "vkCreateDevice parameter, VkDeviceQueueCreateInfo pCreateInfo->pRequestedQueues[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600215 "], is invalid (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600216 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600217 continue;
218 }
219 }
220
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600221}
222
Jon Ashburne68a9ff2015-05-25 14:11:37 -0600223static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
224{
225 uint32_t i, ext_idx;
Jon Ashburn747f2b62015-06-18 15:02:58 -0600226 VkLayerDispatchTable *pDisp = device_dispatch_table(device);
Jon Ashburneab34492015-06-01 09:37:38 -0600227 deviceExtMap[pDisp].debug_marker_enabled = false;
Jon Ashburn747f2b62015-06-18 15:02:58 -0600228 deviceExtMap[pDisp].wsi_lunarg_enabled = false;
Jon Ashburne68a9ff2015-05-25 14:11:37 -0600229 for (i = 0; i < pCreateInfo->extensionCount; i++) {
230 if (strcmp(pCreateInfo->pEnabledExtensions[i].name, DEBUG_MARKER_EXTENSION_NAME) == 0) {
Jon Ashburneab34492015-06-01 09:37:38 -0600231 /* Found a matching extension name, mark it enabled and init dispatch table*/
232 initDebugMarkerTable(device);
233 deviceExtMap[pDisp].debug_marker_enabled = true;
234
Jon Ashburne68a9ff2015-05-25 14:11:37 -0600235
Jon Ashburn747f2b62015-06-18 15:02:58 -0600236 }
237 if (strcmp(pCreateInfo->pEnabledExtensions[i].name, VK_WSI_LUNARG_EXTENSION_NAME) == 0)
238 deviceExtMap[pDisp].wsi_lunarg_enabled = true;
Jon Ashburne68a9ff2015-05-25 14:11:37 -0600239 }
240}
241
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600242void PostCreateDevice(VkResult result, const VkDeviceCreateInfo *pCreateInfo, VkDevice* pDevice)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600243{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600244 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600245 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600246 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600247 char const str[] = "vkCreateDevice failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600248 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600249 return;
250 }
251
252 if(pDevice == nullptr)
253 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600254 char const str[] = "vkCreateDevice parameter, VkDevice* pDevice, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600255 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600256 return;
257 }
Jon Ashburneab34492015-06-01 09:37:38 -0600258 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) *pDevice;
259 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
260 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600261}
262
Tony Barbourd1c35722015-04-16 15:59:00 -0600263VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600264{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600265 PreCreateDevice(gpu, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500266 VkResult result = instance_dispatch_table(gpu)->CreateDevice(gpu, pCreateInfo, pDevice);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600267 PostCreateDevice(result, pCreateInfo, pDevice);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600268 return result;
269}
270
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600271VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice(VkDevice device)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600272{
Jon Ashburn747f2b62015-06-18 15:02:58 -0600273 VkLayerDispatchTable *pDisp = device_dispatch_table(device);
Courtney Goeltzenleuchter0daf2282015-06-13 21:22:12 -0600274 dispatch_key key = get_dispatch_key(device);
Jon Ashburn747f2b62015-06-18 15:02:58 -0600275 VkResult result = pDisp->DestroyDevice(device);
276 deviceExtMap.erase(pDisp);
Courtney Goeltzenleuchter0daf2282015-06-13 21:22:12 -0600277 destroy_device_dispatch_table(key);
Jon Ashburneab34492015-06-01 09:37:38 -0600278 tableDebugMarkerMap.erase(pDisp);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600279 return result;
280}
281
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600282#define PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE 2
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600283static const VkExtensionProperties pcExts[PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE] = {
284 {
285 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
286 "ParamChecker",
287 0x10,
288 "Sample layer: ParamChecker",
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600289 },
290 {
291 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
292 "Validation",
293 0x10,
294 "Sample layer: ParamChecker",
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600295 }
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600296};
297
298VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo(
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600299 VkExtensionInfoType infoType,
300 uint32_t extensionIndex,
301 size_t* pDataSize,
302 void* pData)
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600303{
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600304 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600305 uint32_t *count;
306
307 if (pDataSize == NULL)
308 return VK_ERROR_INVALID_POINTER;
309
310 switch (infoType) {
311 case VK_EXTENSION_INFO_TYPE_COUNT:
312 *pDataSize = sizeof(uint32_t);
313 if (pData == NULL)
314 return VK_SUCCESS;
315 count = (uint32_t *) pData;
316 *count = PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE;
317 break;
318 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
319 *pDataSize = sizeof(VkExtensionProperties);
320 if (pData == NULL)
321 return VK_SUCCESS;
322 if (extensionIndex >= PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE)
323 return VK_ERROR_INVALID_VALUE;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600324 memcpy((VkExtensionProperties *) pData, &pcExts[extensionIndex], sizeof(VkExtensionProperties));
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600325 break;
326 default:
327 return VK_ERROR_INVALID_VALUE;
328 };
329
330 return VK_SUCCESS;
331}
332
Jon Ashburn747f2b62015-06-18 15:02:58 -0600333#define PARAM_CHECKER_LAYER_DEV_EXT_ARRAY_SIZE 4
Jon Ashburna050a8a2015-06-15 16:08:39 -0600334static const VkExtensionProperties pcDevExts[PARAM_CHECKER_LAYER_DEV_EXT_ARRAY_SIZE] = {
335 {
336 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
337 "ParamChecker",
338 0x10,
339 "Sample layer: ParamChecker",
340 },
341 {
342 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
343 "Validation",
344 0x10,
345 "Sample layer: ParamChecker",
346 },
347 {
348 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
349 DEBUG_MARKER_EXTENSION_NAME,
350 0x10,
351 "Sample layer: ParamChecker",
Jon Ashburn747f2b62015-06-18 15:02:58 -0600352 },
353 {
354 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
355 VK_WSI_LUNARG_EXTENSION_NAME,
356 0x10,
357 "Sample layer: ParamChecker",
Jon Ashburna050a8a2015-06-15 16:08:39 -0600358 }
359};
Jeremy Hayesad367152015-04-17 10:36:53 -0600360VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionInfo(
361 VkPhysicalDevice gpu,
362 VkExtensionInfoType infoType,
363 uint32_t extensionIndex,
364 size_t* pDataSize,
365 void* pData)
366{
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600367 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
368 uint32_t *count;
369
370 if (pDataSize == NULL)
371 return VK_ERROR_INVALID_POINTER;
372
373 switch (infoType) {
374 case VK_EXTENSION_INFO_TYPE_COUNT:
375 *pDataSize = sizeof(uint32_t);
376 if (pData == NULL)
377 return VK_SUCCESS;
378 count = (uint32_t *) pData;
Jon Ashburna050a8a2015-06-15 16:08:39 -0600379 *count = PARAM_CHECKER_LAYER_DEV_EXT_ARRAY_SIZE;
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600380 break;
381 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
382 *pDataSize = sizeof(VkExtensionProperties);
383 if (pData == NULL)
384 return VK_SUCCESS;
Jon Ashburna050a8a2015-06-15 16:08:39 -0600385 if (extensionIndex >= PARAM_CHECKER_LAYER_DEV_EXT_ARRAY_SIZE)
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600386 return VK_ERROR_INVALID_VALUE;
Jon Ashburna050a8a2015-06-15 16:08:39 -0600387 memcpy((VkExtensionProperties *) pData, &pcDevExts[extensionIndex], sizeof(VkExtensionProperties));
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600388 break;
389 default:
390 return VK_ERROR_INVALID_VALUE;
391 };
392
393 return VK_SUCCESS;
Jeremy Hayesad367152015-04-17 10:36:53 -0600394}
395
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600396VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex, VkQueue* pQueue)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600397{
398
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500399 VkResult result = device_dispatch_table(device)->GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600400 return result;
401}
402
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600403VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600404{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500405 VkResult result = device_dispatch_table(queue)->QueueSubmit(queue, cmdBufferCount, pCmdBuffers, fence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600406 return result;
407}
408
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600409VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(VkQueue queue)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600410{
411
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500412 VkResult result = device_dispatch_table(queue)->QueueWaitIdle(queue);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600413 return result;
414}
415
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600416VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle(VkDevice device)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600417{
418
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500419 VkResult result = device_dispatch_table(device)->DeviceWaitIdle(device);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600420 return result;
421}
422
Tony Barbourd1c35722015-04-16 15:59:00 -0600423VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory(VkDevice device, const VkMemoryAllocInfo* pAllocInfo, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600424{
425 char str[1024];
426 if (!pAllocInfo) {
427 sprintf(str, "Struct ptr parameter pAllocInfo to function AllocMemory is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600428 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600429 } else if (!vk_validate_vkmemoryallocinfo(pAllocInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600430 sprintf(str, "Parameter pAllocInfo to function AllocMemory contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600431 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600432 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500433 VkResult result = device_dispatch_table(device)->AllocMemory(device, pAllocInfo, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600434 return result;
435}
436
Mike Stroyanb050c682015-04-17 12:36:38 -0600437VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600438{
439
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500440 VkResult result = device_dispatch_table(device)->FreeMemory(device, mem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600441 return result;
442}
443
Mike Stroyanb050c682015-04-17 12:36:38 -0600444VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkFlags flags, void** ppData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600445{
446
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500447 VkResult result = device_dispatch_table(device)->MapMemory(device, mem, offset, size, flags, ppData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600448 return result;
449}
450
Mike Stroyanb050c682015-04-17 12:36:38 -0600451VK_LAYER_EXPORT VkResult VKAPI vkUnmapMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600452{
453
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500454 VkResult result = device_dispatch_table(device)->UnmapMemory(device, mem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600455 return result;
456}
457
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -0600458VK_LAYER_EXPORT VkResult VKAPI vkFlushMappedMemoryRanges(
459 VkDevice device,
460 uint32_t memRangeCount,
461 const VkMappedMemoryRange* pMemRanges)
Tony Barbourb1250542015-04-16 19:23:13 -0600462{
463
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500464 VkResult result = device_dispatch_table(device)->FlushMappedMemoryRanges(device, memRangeCount, pMemRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -0600465 return result;
466}
467
468VK_LAYER_EXPORT VkResult VKAPI vkInvalidateMappedMemoryRanges(
469 VkDevice device,
470 uint32_t memRangeCount,
471 const VkMappedMemoryRange* pMemRanges)
472{
473
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500474 VkResult result = device_dispatch_table(device)->InvalidateMappedMemoryRanges(device, memRangeCount, pMemRanges);
Tony Barbourb1250542015-04-16 19:23:13 -0600475 return result;
476}
477
Mike Stroyanb050c682015-04-17 12:36:38 -0600478VK_LAYER_EXPORT VkResult VKAPI vkDestroyObject(VkDevice device, VkObjectType objType, VkObject object)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600479{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500480 VkResult result = device_dispatch_table(device)->DestroyObject(device, objType, object);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600481 return result;
482}
483
Mike Stroyanb050c682015-04-17 12:36:38 -0600484VK_LAYER_EXPORT VkResult VKAPI vkGetObjectInfo(VkDevice device, VkObjectType objType, VkObject object, VkObjectInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600485{
486 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600487 if (!validate_VkObjectInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600488 sprintf(str, "Parameter infoType to function GetObjectInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600489 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600490 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500491 VkResult result = device_dispatch_table(device)->GetObjectInfo(device, objType, object, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600492 return result;
493}
494
Mark Lobodzinski23065352015-05-29 09:32:35 -0500495VK_LAYER_EXPORT VkResult VKAPI vkBindObjectMemory(VkDevice device, VkObjectType objType, VkObject object, VkDeviceMemory mem, VkDeviceSize offset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600496{
497
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500498 VkResult result = device_dispatch_table(device)->BindObjectMemory(device, objType, object, mem, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600499 return result;
500}
501
Mark Lobodzinski23065352015-05-29 09:32:35 -0500502VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(VkQueue queue, VkBuffer buffer, VkDeviceSize rangeOffset, VkDeviceSize rangeSize, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600503{
504
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500505 VkResult result = device_dispatch_table(queue)->QueueBindSparseBufferMemory(queue, buffer, rangeOffset, rangeSize, mem, memOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600506 return result;
507}
508
Mark Lobodzinski23065352015-05-29 09:32:35 -0500509VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageMemory(VkQueue queue, VkImage image, const VkImageMemoryBindInfo* pBindInfo, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600510{
511 char str[1024];
Jeremy Hayesaf0d72c2015-04-15 15:20:03 -0600512 if (!pBindInfo) {
Mark Lobodzinski942b1722015-05-11 17:21:15 -0500513 sprintf(str, "Struct ptr parameter pBindInfo to function QueueBindSparseImageMemory is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600514 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600515 }
Jeremy Hayesaf0d72c2015-04-15 15:20:03 -0600516 else if (!vk_validate_vkimagememorybindinfo(pBindInfo)) {
517 sprintf(str, "Parameter pBindInfo to function BindImageMemoryRange contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600518 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600519 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500520 VkResult result = device_dispatch_table(queue)->QueueBindSparseImageMemory(queue, image, pBindInfo, mem, memOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600521 return result;
522}
523
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600524VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(VkDevice device, const VkFenceCreateInfo* pCreateInfo, VkFence* pFence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600525{
526 char str[1024];
527 if (!pCreateInfo) {
528 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFence is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600529 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600530 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600531 else if (!vk_validate_vkfencecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600532 sprintf(str, "Parameter pCreateInfo to function CreateFence contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600533 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600534 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500535 VkResult result = device_dispatch_table(device)->CreateFence(device, pCreateInfo, pFence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600536 return result;
537}
538
Mike Stroyanb050c682015-04-17 12:36:38 -0600539VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(VkDevice device, VkFence fence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600540{
541
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500542 VkResult result = device_dispatch_table(device)->GetFenceStatus(device, fence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600543 return result;
544}
545
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600546VK_LAYER_EXPORT VkResult VKAPI vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences, bool32_t waitAll, uint64_t timeout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600547{
548
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500549 VkResult result = device_dispatch_table(device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600550 return result;
551}
552
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600553VK_LAYER_EXPORT VkResult VKAPI vkResetFences(VkDevice device, uint32_t fenceCount, VkFence* pFences)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500554{
555
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500556 VkResult result = device_dispatch_table(device)->ResetFences(device, fenceCount, pFences);
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500557 return result;
558}
559
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600560VK_LAYER_EXPORT VkResult VKAPI vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, VkSemaphore* pSemaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600561{
562 char str[1024];
563 if (!pCreateInfo) {
564 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSemaphore is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600565 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600566 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600567 else if (!vk_validate_vksemaphorecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600568 sprintf(str, "Parameter pCreateInfo to function CreateSemaphore contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600569 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600570 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500571 VkResult result = device_dispatch_table(device)->CreateSemaphore(device, pCreateInfo, pSemaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600572 return result;
573}
574
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600575VK_LAYER_EXPORT VkResult VKAPI vkQueueSignalSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600576{
577
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500578 VkResult result = device_dispatch_table(queue)->QueueSignalSemaphore(queue, semaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600579 return result;
580}
581
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600582VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600583{
584
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500585 VkResult result = device_dispatch_table(queue)->QueueWaitSemaphore(queue, semaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600586 return result;
587}
588
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600589VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(VkDevice device, const VkEventCreateInfo* pCreateInfo, VkEvent* pEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600590{
591 char str[1024];
592 if (!pCreateInfo) {
593 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateEvent is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600594 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600595 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600596 else if (!vk_validate_vkeventcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600597 sprintf(str, "Parameter pCreateInfo to function CreateEvent contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600598 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600599 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500600 VkResult result = device_dispatch_table(device)->CreateEvent(device, pCreateInfo, pEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600601 return result;
602}
603
Mike Stroyanb050c682015-04-17 12:36:38 -0600604VK_LAYER_EXPORT VkResult VKAPI vkGetEventStatus(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600605{
606
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500607 VkResult result = device_dispatch_table(device)->GetEventStatus(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600608 return result;
609}
610
Mike Stroyanb050c682015-04-17 12:36:38 -0600611VK_LAYER_EXPORT VkResult VKAPI vkSetEvent(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600612{
613
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500614 VkResult result = device_dispatch_table(device)->SetEvent(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600615 return result;
616}
617
Mike Stroyanb050c682015-04-17 12:36:38 -0600618VK_LAYER_EXPORT VkResult VKAPI vkResetEvent(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600619{
620
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500621 VkResult result = device_dispatch_table(device)->ResetEvent(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600622 return result;
623}
624
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600625VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, VkQueryPool* pQueryPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600626{
627 char str[1024];
628 if (!pCreateInfo) {
629 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateQueryPool is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600630 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600631 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600632 else if (!vk_validate_vkquerypoolcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600633 sprintf(str, "Parameter pCreateInfo to function CreateQueryPool contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600634 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600635 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500636 VkResult result = device_dispatch_table(device)->CreateQueryPool(device, pCreateInfo, pQueryPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600637 return result;
638}
639
Mike Stroyanb050c682015-04-17 12:36:38 -0600640VK_LAYER_EXPORT VkResult VKAPI vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData, VkQueryResultFlags flags)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600641{
642
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500643 VkResult result = device_dispatch_table(device)->GetQueryPoolResults(device, queryPool, startQuery, queryCount, pDataSize, pData, flags);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600644 return result;
645}
646
Chris Forbesbc0bb772015-06-21 22:55:02 +1200647VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceFormatInfo(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600648{
649 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600650 if (!validate_VkFormat(format)) {
Chris Forbesbc0bb772015-06-21 22:55:02 +1200651 sprintf(str, "Parameter format to function GetPhysicalDeviceFormatInfo has invalid value of %i.", (int)format);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600652 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600653 }
Chris Forbesbc0bb772015-06-21 22:55:02 +1200654 VkResult result = instance_dispatch_table(physicalDevice)->GetPhysicalDeviceFormatInfo(physicalDevice, format, pFormatInfo);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600655 return result;
656}
657
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600658VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600659{
660 char str[1024];
661 if (!pCreateInfo) {
662 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBuffer is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600663 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600664 }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600665 else if (!vk_validate_vkbuffercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600666 sprintf(str, "Parameter pCreateInfo to function CreateBuffer contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600667 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600668 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500669 VkResult result = device_dispatch_table(device)->CreateBuffer(device, pCreateInfo, pBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600670 return result;
671}
672
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600673VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, VkBufferView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600674{
675 char str[1024];
676 if (!pCreateInfo) {
677 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBufferView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600678 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600679 }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600680 else if (!vk_validate_vkbufferviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600681 sprintf(str, "Parameter pCreateInfo to function CreateBufferView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600682 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600683 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500684 VkResult result = device_dispatch_table(device)->CreateBufferView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600685 return result;
686}
687
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600688void PreCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600689{
690 if(pCreateInfo == nullptr)
691 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600692 char const str[] = "vkCreateImage parameter, VkImageCreateInfo* pCreateInfo, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600693 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600694 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600695 return;
696 }
697
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600698 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600699 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600700 char const str[] = "vkCreateImage parameter, VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO "\
701 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600702 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600703 return;
704 }
705
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600706 if (!validate_VkImageType(pCreateInfo->imageType))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600707 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600708 char const str[] = "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600709 "unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600710 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600711 return;
712 }
713
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600714 if (!validate_VkFormat(pCreateInfo->format))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600715 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600716 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600717 "unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600718 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600719 return;
720 }
721
Chris Forbesbc0bb772015-06-21 22:55:02 +1200722 /*
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600723 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600724 size_t size = sizeof(properties);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500725 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->format,
Tony Barbourd1c35722015-04-16 15:59:00 -0600726 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600727 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600728 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600729 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, cannot be "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600730 "validated (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600731 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600732 return;
733 }
734
735 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
736 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600737 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600738 "unsupported format (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600739 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600740 return;
741 }
Chris Forbesbc0bb772015-06-21 22:55:02 +1200742 */
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600743
744 // TODO: Can we check device-specific limits?
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600745 if (!vk_validate_vkextent3d(&pCreateInfo->extent))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600746 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600747 char const str[] = "vkCreateImage parameter, VkExtent3D pCreateInfo->extent, is invalid "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600748 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600749 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600750 return;
751 }
752
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600753 if (!validate_VkImageTiling(pCreateInfo->tiling))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600754 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600755 char const str[] = "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600756 "unrecoginized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600757 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600758 return;
759 }
760}
761
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600762void PostCreateImage(VkResult result, VkImage* pImage)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600763{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600764 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600765 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600766 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600767 char const str[] = "vkCreateImage failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600768 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600769 return;
770 }
771
772 if(pImage == nullptr)
773 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600774 char const str[] = "vkCreateImage parameter, VkImage* pImage, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600775 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600776 return;
777 }
778}
779
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600780VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600781{
782 PreCreateImage(device, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500783 VkResult result = device_dispatch_table(device)->CreateImage(device, pCreateInfo, pImage);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600784 PostCreateImage(result, pImage);
785 return result;
786}
787
Mike Stroyanb050c682015-04-17 12:36:38 -0600788VK_LAYER_EXPORT VkResult VKAPI vkGetImageSubresourceInfo(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600789{
790 char str[1024];
791 if (!pSubresource) {
792 sprintf(str, "Struct ptr parameter pSubresource to function GetImageSubresourceInfo is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600793 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600794 } else if (!vk_validate_vkimagesubresource(pSubresource)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600795 sprintf(str, "Parameter pSubresource to function GetImageSubresourceInfo contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600796 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600797 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600798 if (!validate_VkSubresourceInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600799 sprintf(str, "Parameter infoType to function GetImageSubresourceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600800 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600801 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500802 VkResult result = device_dispatch_table(device)->GetImageSubresourceInfo(device, image, pSubresource, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600803 return result;
804}
805
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600806VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, VkImageView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600807{
808 char str[1024];
809 if (!pCreateInfo) {
810 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateImageView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600811 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600812 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600813 else if (!vk_validate_vkimageviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600814 sprintf(str, "Parameter pCreateInfo to function CreateImageView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600815 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600816 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500817 VkResult result = device_dispatch_table(device)->CreateImageView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600818 return result;
819}
820
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600821VK_LAYER_EXPORT VkResult VKAPI vkCreateColorAttachmentView(VkDevice device, const VkColorAttachmentViewCreateInfo* pCreateInfo, VkColorAttachmentView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600822{
823 char str[1024];
824 if (!pCreateInfo) {
825 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateColorAttachmentView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600826 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600827 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600828 else if (!vk_validate_vkcolorattachmentviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600829 sprintf(str, "Parameter pCreateInfo to function CreateColorAttachmentView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600830 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600831 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500832 VkResult result = device_dispatch_table(device)->CreateColorAttachmentView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600833 return result;
834}
835
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600836VK_LAYER_EXPORT VkResult VKAPI vkCreateDepthStencilView(VkDevice device, const VkDepthStencilViewCreateInfo* pCreateInfo, VkDepthStencilView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600837{
838 char str[1024];
839 if (!pCreateInfo) {
840 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDepthStencilView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600841 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600842 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600843 else if (!vk_validate_vkdepthstencilviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600844 sprintf(str, "Parameter pCreateInfo to function CreateDepthStencilView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600845 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600846 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500847 VkResult result = device_dispatch_table(device)->CreateDepthStencilView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600848 return result;
849}
850
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600851VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(VkDevice device, const VkShaderCreateInfo* pCreateInfo, VkShader* pShader)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600852{
853 char str[1024];
854 if (!pCreateInfo) {
855 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateShader is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600856 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600857 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600858 else if (!vk_validate_vkshadercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600859 sprintf(str, "Parameter pCreateInfo to function CreateShader contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600860 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600861 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500862 VkResult result = device_dispatch_table(device)->CreateShader(device, pCreateInfo, pShader);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600863 return result;
864}
865
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600866VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600867{
868 char str[1024];
869 if (!pCreateInfo) {
870 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipeline is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600871 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600872 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600873 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600874 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipeline contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600875 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600876 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500877 VkResult result = device_dispatch_table(device)->CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600878 return result;
879}
880
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600881VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelineDerivative(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600882{
883 char str[1024];
884 if (!pCreateInfo) {
885 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipelineDerivative is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600886 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600887 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600888 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600889 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipelineDerivative contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600890 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600891 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500892 VkResult result = device_dispatch_table(device)->CreateGraphicsPipelineDerivative(device, pCreateInfo, basePipeline, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600893 return result;
894}
895
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600896VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipeline(VkDevice device, const VkComputePipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600897{
898 char str[1024];
899 if (!pCreateInfo) {
900 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateComputePipeline is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600901 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600902 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600903 else if (!vk_validate_vkcomputepipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600904 sprintf(str, "Parameter pCreateInfo to function CreateComputePipeline contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600905 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600906 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500907 VkResult result = device_dispatch_table(device)->CreateComputePipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600908 return result;
909}
910
Mike Stroyanb050c682015-04-17 12:36:38 -0600911VK_LAYER_EXPORT VkResult VKAPI vkStorePipeline(VkDevice device, VkPipeline pipeline, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600912{
913
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500914 VkResult result = device_dispatch_table(device)->StorePipeline(device, pipeline, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600915 return result;
916}
917
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600918VK_LAYER_EXPORT VkResult VKAPI vkLoadPipeline(VkDevice device, size_t dataSize, const void* pData, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600919{
920
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500921 VkResult result = device_dispatch_table(device)->LoadPipeline(device, dataSize, pData, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600922 return result;
923}
924
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600925VK_LAYER_EXPORT VkResult VKAPI vkLoadPipelineDerivative(VkDevice device, size_t dataSize, const void* pData, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600926{
927
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500928 VkResult result = device_dispatch_table(device)->LoadPipelineDerivative(device, dataSize, pData, basePipeline, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600929 return result;
930}
931
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600932VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, VkSampler* pSampler)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600933{
934 char str[1024];
935 if (!pCreateInfo) {
936 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSampler is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600937 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600938 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600939 else if (!vk_validate_vksamplercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600940 sprintf(str, "Parameter pCreateInfo to function CreateSampler contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600941 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600942 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500943 VkResult result = device_dispatch_table(device)->CreateSampler(device, pCreateInfo, pSampler);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600944 return result;
945}
946
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600947VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayout* pSetLayout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600948{
949 char str[1024];
950 if (!pCreateInfo) {
951 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorSetLayout is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600952 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600953 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600954 else if (!vk_validate_vkdescriptorsetlayoutcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600955 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorSetLayout contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600956 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600957 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500958 VkResult result = device_dispatch_table(device)->CreateDescriptorSetLayout(device, pCreateInfo, pSetLayout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600959 return result;
960}
961
Mark Lobodzinski0fadf5f2015-04-17 14:11:39 -0500962VK_LAYER_EXPORT VkResult VKAPI vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, VkPipelineLayout* pPipelineLayout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600963{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500964 VkResult result = device_dispatch_table(device)->CreatePipelineLayout(device, pCreateInfo, pPipelineLayout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600965 return result;
966}
967
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600968VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorPool(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600969{
970 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600971 if (!validate_VkDescriptorPoolUsage(poolUsage)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600972 sprintf(str, "Parameter poolUsage to function CreateDescriptorPool has invalid value of %i.", (int)poolUsage);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600973 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600974 }
975 if (!pCreateInfo) {
976 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorPool is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600977 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600978 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600979 else if (!vk_validate_vkdescriptorpoolcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600980 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorPool contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600981 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600982 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500983 VkResult result = device_dispatch_table(device)->CreateDescriptorPool(device, poolUsage, maxSets, pCreateInfo, pDescriptorPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600984 return result;
985}
986
Mike Stroyanb050c682015-04-17 12:36:38 -0600987VK_LAYER_EXPORT VkResult VKAPI vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600988{
989
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500990 VkResult result = device_dispatch_table(device)->ResetDescriptorPool(device, descriptorPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600991 return result;
992}
993
Mike Stroyanb050c682015-04-17 12:36:38 -0600994VK_LAYER_EXPORT VkResult VKAPI vkAllocDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorSetUsage setUsage, uint32_t count, const VkDescriptorSetLayout* pSetLayouts, VkDescriptorSet* pDescriptorSets, uint32_t* pCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600995{
996 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600997 if (!validate_VkDescriptorSetUsage(setUsage)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600998 sprintf(str, "Parameter setUsage to function AllocDescriptorSets has invalid value of %i.", (int)setUsage);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600999 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001000 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001001 VkResult result = device_dispatch_table(device)->AllocDescriptorSets(device, descriptorPool, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001002 return result;
1003}
1004
Chia-I Wu9d00ed72015-05-25 16:27:55 +08001005VK_LAYER_EXPORT VkResult VKAPI vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001006{
1007
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001008 return device_dispatch_table(device)->UpdateDescriptorSets(device, writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001009}
1010
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001011VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(VkDevice device, const VkDynamicVpStateCreateInfo* pCreateInfo, VkDynamicVpState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001012{
1013 char str[1024];
1014 if (!pCreateInfo) {
1015 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicViewportState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001016 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001017 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001018 else if (!vk_validate_vkdynamicvpstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001019 sprintf(str, "Parameter pCreateInfo to function CreateDynamicViewportState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001020 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001021 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001022 VkResult result = device_dispatch_table(device)->CreateDynamicViewportState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001023 return result;
1024}
1025
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001026VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterState(VkDevice device, const VkDynamicRsStateCreateInfo* pCreateInfo, VkDynamicRsState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001027{
1028 char str[1024];
1029 if (!pCreateInfo) {
1030 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicRasterState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001031 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001032 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001033 else if (!vk_validate_vkdynamicrsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001034 sprintf(str, "Parameter pCreateInfo to function CreateDynamicRasterState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001035 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001036 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001037 VkResult result = device_dispatch_table(device)->CreateDynamicRasterState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001038 return result;
1039}
1040
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001041VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState(VkDevice device, const VkDynamicCbStateCreateInfo* pCreateInfo, VkDynamicCbState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001042{
1043 char str[1024];
1044 if (!pCreateInfo) {
1045 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicColorBlendState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001046 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001047 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001048 else if (!vk_validate_vkdynamiccbstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001049 sprintf(str, "Parameter pCreateInfo to function CreateDynamicColorBlendState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001050 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001051 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001052 VkResult result = device_dispatch_table(device)->CreateDynamicColorBlendState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001053 return result;
1054}
1055
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001056VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState(VkDevice device, const VkDynamicDsStateCreateInfo* pCreateInfo, VkDynamicDsState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001057{
1058 char str[1024];
1059 if (!pCreateInfo) {
1060 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicDepthStencilState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001061 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001062 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001063 else if (!vk_validate_vkdynamicdsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001064 sprintf(str, "Parameter pCreateInfo to function CreateDynamicDepthStencilState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001065 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001066 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001067 VkResult result = device_dispatch_table(device)->CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001068 return result;
1069}
1070
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001071void PreCreateCommandBuffer(VkDevice device, const VkCmdBufferCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001072{
1073 if(device == nullptr)
1074 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001075 char const str[] = "vkCreateCommandBuffer parameter, VkDevice device, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001076 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001077 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001078 return;
1079 }
1080
1081 if(pCreateInfo == nullptr)
1082 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001083 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBufferCreateInfo* pCreateInfo, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001084 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001085 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001086 return;
1087 }
1088
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001089 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001090 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001091 char const str[] = "vkCreateCommandBuffer parameter, VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO "\
1092 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001093 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001094 return;
1095 }
1096}
1097
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001098void PostCreateCommandBuffer(VkResult result, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001099{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001100 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001101 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001102 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001103 char const str[] = "vkCreateCommandBuffer failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001104 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001105 return;
1106 }
1107
1108 if(pCmdBuffer == nullptr)
1109 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001110 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBuffer* pCmdBuffer, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001111 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001112 return;
1113 }
1114}
1115
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001116VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(VkDevice device,
1117 const VkCmdBufferCreateInfo* pCreateInfo, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001118{
1119 PreCreateCommandBuffer(device, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001120 VkResult result = device_dispatch_table(device)->CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001121 PostCreateCommandBuffer(result, pCmdBuffer);
1122 return result;
1123}
1124
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001125VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001126{
1127 char str[1024];
1128 if (!pBeginInfo) {
1129 sprintf(str, "Struct ptr parameter pBeginInfo to function BeginCommandBuffer is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001130 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001131 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001132 else if (!vk_validate_vkcmdbufferbegininfo(pBeginInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001133 sprintf(str, "Parameter pBeginInfo to function BeginCommandBuffer contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001134 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001135 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001136 VkResult result = device_dispatch_table(cmdBuffer)->BeginCommandBuffer(cmdBuffer, pBeginInfo);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001137 return result;
1138}
1139
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001140VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001141{
1142
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001143 VkResult result = device_dispatch_table(cmdBuffer)->EndCommandBuffer(cmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001144 return result;
1145}
1146
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001147VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001148{
1149
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001150 VkResult result = device_dispatch_table(cmdBuffer)->ResetCommandBuffer(cmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001151 return result;
1152}
1153
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001154VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001155{
1156 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001157 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001158 sprintf(str, "Parameter pipelineBindPoint to function CmdBindPipeline has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001159 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001160 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001161 device_dispatch_table(cmdBuffer)->CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001162}
1163
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001164VK_LAYER_EXPORT void VKAPI vkCmdBindDynamicStateObject(VkCmdBuffer cmdBuffer, VkStateBindPoint stateBindPoint, VkDynamicStateObject state)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001165{
1166 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001167 if (!validate_VkStateBindPoint(stateBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001168 sprintf(str, "Parameter stateBindPoint to function CmdBindDynamicStateObject has invalid value of %i.", (int)stateBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001169 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001170 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001171 device_dispatch_table(cmdBuffer)->CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001172}
1173
Mark Lobodzinskif2093b62015-06-15 13:21:21 -06001174VK_LAYER_EXPORT void VKAPI vkCmdBindDescriptorSets(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001175{
1176 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001177 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001178 sprintf(str, "Parameter pipelineBindPoint to function CmdBindDescriptorSets has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001179 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001180 }
Mark Lobodzinskif2093b62015-06-15 13:21:21 -06001181 device_dispatch_table(cmdBuffer)->CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, layout, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001182}
1183
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06001184VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
1185 VkCmdBuffer cmdBuffer,
1186 uint32_t startBinding,
1187 uint32_t bindingCount,
1188 const VkBuffer* pBuffers,
Tony Barbourd1c35722015-04-16 15:59:00 -06001189 const VkDeviceSize* pOffsets)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001190{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001191 device_dispatch_table(cmdBuffer)->CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001192}
1193
Tony Barbourd1c35722015-04-16 15:59:00 -06001194VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001195{
1196 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001197 if (!validate_VkIndexType(indexType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001198 sprintf(str, "Parameter indexType to function CmdBindIndexBuffer has invalid value of %i.", (int)indexType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001199 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001200 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001201 device_dispatch_table(cmdBuffer)->CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001202}
1203
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001204VK_LAYER_EXPORT void VKAPI vkCmdDraw(VkCmdBuffer cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001205{
1206
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001207 device_dispatch_table(cmdBuffer)->CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001208}
1209
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001210VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexed(VkCmdBuffer cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001211{
1212
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001213 device_dispatch_table(cmdBuffer)->CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001214}
1215
Tony Barbourd1c35722015-04-16 15:59:00 -06001216VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001217{
1218
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001219 device_dispatch_table(cmdBuffer)->CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001220}
1221
Tony Barbourd1c35722015-04-16 15:59:00 -06001222VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001223{
1224
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001225 device_dispatch_table(cmdBuffer)->CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001226}
1227
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001228VK_LAYER_EXPORT void VKAPI vkCmdDispatch(VkCmdBuffer cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001229{
1230
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001231 device_dispatch_table(cmdBuffer)->CmdDispatch(cmdBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001232}
1233
Tony Barbourd1c35722015-04-16 15:59:00 -06001234VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001235{
1236
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001237 device_dispatch_table(cmdBuffer)->CmdDispatchIndirect(cmdBuffer, buffer, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001238}
1239
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001240VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkBuffer destBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001241{
1242 char str[1024];
1243 uint32_t i;
1244 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001245 if (!vk_validate_vkbuffercopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001246 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBuffer contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001247 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001248 }
1249 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001250 device_dispatch_table(cmdBuffer)->CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001251}
1252
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001253VK_LAYER_EXPORT void VKAPI vkCmdCopyImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001254{
1255 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001256 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001257 sprintf(str, "Parameter srcImageLayout to function CmdCopyImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001258 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001259 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001260 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001261 sprintf(str, "Parameter destImageLayout to function CmdCopyImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001262 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001263 }
1264 uint32_t i;
1265 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001266 if (!vk_validate_vkimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001267 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001268 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001269 }
1270 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001271 device_dispatch_table(cmdBuffer)->CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001272}
1273
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05001274VK_LAYER_EXPORT void VKAPI vkCmdBlitImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkTexFilter filter)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001275{
1276 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001277 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001278 sprintf(str, "Parameter srcImageLayout to function CmdBlitImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001279 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001280 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001281 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001282 sprintf(str, "Parameter destImageLayout to function CmdBlitImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001283 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001284 }
1285 uint32_t i;
1286 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001287 if (!vk_validate_vkimageblit(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001288 sprintf(str, "Parameter pRegions[%i] to function CmdBlitImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001289 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001290 }
1291 }
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05001292 //TODO: Add additional check for limitation from header rev 96.
1293 // VK_TEX_FILTER_NEAREST if the format that srcImage was created with is an integer-based format.
1294
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001295 device_dispatch_table(cmdBuffer)->CmdBlitImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001296}
1297
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001298VK_LAYER_EXPORT void VKAPI vkCmdCopyBufferToImage(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001299{
1300 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001301 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001302 sprintf(str, "Parameter destImageLayout to function CmdCopyBufferToImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001303 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001304 }
1305 uint32_t i;
1306 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001307 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001308 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBufferToImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001309 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001310 }
1311 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001312 device_dispatch_table(cmdBuffer)->CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001313}
1314
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001315VK_LAYER_EXPORT void VKAPI vkCmdCopyImageToBuffer(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer destBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001316{
1317 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001318 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001319 sprintf(str, "Parameter srcImageLayout to function CmdCopyImageToBuffer has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001320 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001321 }
1322 uint32_t i;
1323 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001324 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001325 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImageToBuffer contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001326 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001327 }
1328 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001329 device_dispatch_table(cmdBuffer)->CmdCopyImageToBuffer(cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001330}
1331
Tony Barbourd1c35722015-04-16 15:59:00 -06001332VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001333{
1334
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001335 device_dispatch_table(cmdBuffer)->CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001336}
1337
Tony Barbourd1c35722015-04-16 15:59:00 -06001338VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001339{
1340
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001341 device_dispatch_table(cmdBuffer)->CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001342}
1343
Courtney Goeltzenleuchterd7a5cff2015-04-23 17:49:22 -06001344VK_LAYER_EXPORT void VKAPI vkCmdClearColorImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColor* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001345{
1346 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001347 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001348 sprintf(str, "Parameter imageLayout to function CmdClearColorImage has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001349 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001350 }
1351 uint32_t i;
1352 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001353 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001354 sprintf(str, "Parameter pRanges[%i] to function CmdClearColorImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001355 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001356 }
1357 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001358 device_dispatch_table(cmdBuffer)->CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001359}
1360
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001361VK_LAYER_EXPORT void VKAPI vkCmdClearDepthStencil(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001362{
1363 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001364 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001365 sprintf(str, "Parameter imageLayout to function CmdClearDepthStencil has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001366 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001367 }
1368 uint32_t i;
1369 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001370 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001371 sprintf(str, "Parameter pRanges[%i] to function CmdClearDepthStencil contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001372 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001373 }
1374 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001375 device_dispatch_table(cmdBuffer)->CmdClearDepthStencil(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001376}
1377
Tony Barbour6865d4a2015-04-13 15:02:52 -06001378VK_LAYER_EXPORT void VKAPI vkCmdResolveImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageResolve* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001379{
1380 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001381 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001382 sprintf(str, "Parameter srcImageLayout to function CmdResolveImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001383 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001384 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001385 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001386 sprintf(str, "Parameter destImageLayout to function CmdResolveImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001387 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001388 }
1389 uint32_t i;
Tony Barbour6865d4a2015-04-13 15:02:52 -06001390 for (i = 0; i < regionCount; i++) {
1391 if (!vk_validate_vkimageresolve(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001392 sprintf(str, "Parameter pRects[%i] to function CmdResolveImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001393 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001394 }
1395 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001396 device_dispatch_table(cmdBuffer)->CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001397}
1398
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001399VK_LAYER_EXPORT void VKAPI vkCmdSetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001400{
1401 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001402 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001403 sprintf(str, "Parameter pipeEvent to function CmdSetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001404 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001405 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001406 device_dispatch_table(cmdBuffer)->CmdSetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001407}
1408
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001409VK_LAYER_EXPORT void VKAPI vkCmdResetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001410{
1411 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001412 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001413 sprintf(str, "Parameter pipeEvent to function CmdResetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001414 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001415 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001416 device_dispatch_table(cmdBuffer)->CmdResetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001417}
1418
Tony Barbourd1c35722015-04-16 15:59:00 -06001419VK_LAYER_EXPORT void VKAPI vkCmdWaitEvents(VkCmdBuffer cmdBuffer, VkWaitEvent waitEvent, uint32_t eventCount, const VkEvent* pEvents, uint32_t memBarrierCount, const void** ppMemBarriers)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001420{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001421 device_dispatch_table(cmdBuffer)->CmdWaitEvents(cmdBuffer, waitEvent, eventCount, pEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001422}
1423
Tony Barbourd1c35722015-04-16 15:59:00 -06001424VK_LAYER_EXPORT void VKAPI vkCmdPipelineBarrier(VkCmdBuffer cmdBuffer, VkWaitEvent waitEvent, uint32_t pipeEventCount, const VkPipeEvent* pPipeEvents, uint32_t memBarrierCount, const void** ppMemBarriers)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001425{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001426 device_dispatch_table(cmdBuffer)->CmdPipelineBarrier(cmdBuffer, waitEvent, pipeEventCount, pPipeEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001427}
1428
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001429VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001430{
1431
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001432 device_dispatch_table(cmdBuffer)->CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001433}
1434
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001435VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001436{
1437
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001438 device_dispatch_table(cmdBuffer)->CmdEndQuery(cmdBuffer, queryPool, slot);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001439}
1440
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001441VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001442{
1443
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001444 device_dispatch_table(cmdBuffer)->CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001445}
1446
Tony Barbourd1c35722015-04-16 15:59:00 -06001447VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkTimestampType timestampType, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001448{
1449 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001450 if (!validate_VkTimestampType(timestampType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001451 sprintf(str, "Parameter timestampType to function CmdWriteTimestamp has invalid value of %i.", (int)timestampType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001452 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001453 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001454 device_dispatch_table(cmdBuffer)->CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001455}
1456
Jeremy Hayesad367152015-04-17 10:36:53 -06001457VK_LAYER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(
1458 VkCmdBuffer cmdBuffer,
1459 VkQueryPool queryPool,
1460 uint32_t startQuery,
1461 uint32_t queryCount,
1462 VkBuffer destBuffer,
1463 VkDeviceSize destOffset,
1464 VkDeviceSize destStride,
1465 VkQueryResultFlags flags)
1466{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001467 device_dispatch_table(cmdBuffer)->CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, destStride, flags);
Jeremy Hayesad367152015-04-17 10:36:53 -06001468}
1469
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001470VK_LAYER_EXPORT void VKAPI vkCmdInitAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, const uint32_t* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001471{
1472 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001473 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001474 sprintf(str, "Parameter pipelineBindPoint to function CmdInitAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001475 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001476 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001477 device_dispatch_table(cmdBuffer)->CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001478}
1479
Tony Barbourd1c35722015-04-16 15:59:00 -06001480VK_LAYER_EXPORT void VKAPI vkCmdLoadAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, VkBuffer srcBuffer, VkDeviceSize srcOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001481{
1482 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001483 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001484 sprintf(str, "Parameter pipelineBindPoint to function CmdLoadAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001485 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001486 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001487 device_dispatch_table(cmdBuffer)->CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001488}
1489
Tony Barbourd1c35722015-04-16 15:59:00 -06001490VK_LAYER_EXPORT void VKAPI vkCmdSaveAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001491{
1492 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001493 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001494 sprintf(str, "Parameter pipelineBindPoint to function CmdSaveAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001495 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001496 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001497 device_dispatch_table(cmdBuffer)->CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001498}
1499
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001500VK_LAYER_EXPORT VkResult VKAPI vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, VkFramebuffer* pFramebuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001501{
1502 char str[1024];
1503 if (!pCreateInfo) {
1504 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFramebuffer is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001505 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001506 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001507 else if (!vk_validate_vkframebuffercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001508 sprintf(str, "Parameter pCreateInfo to function CreateFramebuffer contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001509 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001510 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001511 VkResult result = device_dispatch_table(device)->CreateFramebuffer(device, pCreateInfo, pFramebuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001512 return result;
1513}
1514
1515
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001516void PreCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001517{
1518 if(pCreateInfo == nullptr)
1519 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001520 char const str[] = "vkCreateRenderPass parameter, VkRenderPassCreateInfo* pCreateInfo, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001521 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001522 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001523 return;
1524 }
1525
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001526 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001527 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001528 char const str[] = "vkCreateRenderPass parameter, VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO "\
1529 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001530 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001531 return;
1532 }
1533
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001534 if(!vk_validate_vkrect(&pCreateInfo->renderArea))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001535 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001536 char const str[] = "vkCreateRenderPass parameter, VkRect pCreateInfo->renderArea, is invalid "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001537 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001538 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001539 return;
1540 }
1541
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001542 if(!vk_validate_vkextent2d(&pCreateInfo->extent))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001543 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001544 char const str[] = "vkCreateRenderPass parameter, VkExtent2D pCreateInfo->extent, is invalid "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001545 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001546 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001547 return;
1548 }
1549
1550 if(pCreateInfo->pColorFormats == nullptr)
1551 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001552 char const str[] = "vkCreateRenderPass parameter, VkFormat* pCreateInfo->pColorFormats, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001553 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001554 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001555 return;
1556 }
1557
1558 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1559 {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001560 if(!validate_VkFormat(pCreateInfo->pColorFormats[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001561 {
1562 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001563 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001564 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001565 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001566 continue;
1567 }
1568
Chris Forbesbc0bb772015-06-21 22:55:02 +12001569 /*
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001570 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001571 size_t size = sizeof(properties);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001572 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->pColorFormats[i],
Tony Barbourd1c35722015-04-16 15:59:00 -06001573 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001574 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001575 {
1576 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001577 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001578 "], cannot be validated (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001579 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001580 continue;
1581 }
1582
1583 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1584 {
1585 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001586 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001587 "], contains unsupported format (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001588 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001589 continue;
1590 }
Chris Forbesbc0bb772015-06-21 22:55:02 +12001591 */
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001592
1593 }
1594
1595 if(pCreateInfo->pColorLayouts == nullptr)
1596 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001597 char const str[] = "vkCreateRenderPass parameter, VkImageLayout* pCreateInfo->pColorLayouts, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001598 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001599 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001600 return;
1601 }
1602
1603 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1604 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001605 if(!validate_VkImageLayout(pCreateInfo->pColorLayouts[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001606 {
1607 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001608 ss << "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pColorLayouts[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001609 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001610 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001611 continue;
1612 }
1613 }
1614
1615 if(pCreateInfo->pColorLoadOps == nullptr)
1616 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001617 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp* pCreateInfo->pColorLoadOps, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001618 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001619 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001620 return;
1621 }
1622
1623 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1624 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001625 if(!validate_VkAttachmentLoadOp(pCreateInfo->pColorLoadOps[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001626 {
1627 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001628 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pColorLoadOps[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001629 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001630 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001631 continue;
1632 }
1633 }
1634
1635 if(pCreateInfo->pColorStoreOps == nullptr)
1636 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001637 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp* pCreateInfo->pColorStoreOps, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001638 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001639 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001640 return;
1641 }
1642
1643 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1644 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001645 if(!validate_VkAttachmentStoreOp(pCreateInfo->pColorStoreOps[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001646 {
1647 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001648 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pColorStoreOps[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001649 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001650 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001651 continue;
1652 }
1653 }
1654
1655 if(pCreateInfo->pColorLoadClearValues == nullptr)
1656 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001657 char const str[] = "vkCreateRenderPass parameter, VkClearColor* pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001658 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001659 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001660 return;
1661 }
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001662
1663 if(pCreateInfo->pColorStoreOps == nullptr)
1664 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001665 char const str[] = "vkCreateRenderPass parameter, VK_ATTACHMENT_STORE_OP* pCreateInfo->pColorStoreOps, "\
Jeremy Hayes090f0ce2015-04-07 13:38:03 -06001666 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001667 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001668 return;
1669 }
1670
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001671 if(pCreateInfo->pColorLoadClearValues == nullptr)
1672 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001673 char const str[] = "vkCreateRenderPass parameter, VK_CLEAR_COLOR* pCreateInfo->"\
Jeremy Hayes090f0ce2015-04-07 13:38:03 -06001674 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001675 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001676 return;
1677 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001678
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001679 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1680 {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001681 if(!vk_validate_vkclearcolor(&(pCreateInfo->pColorLoadClearValues[i])))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001682 {
1683 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001684 ss << "vkCreateRenderPass parameter, VkClearColor pCreateInfo->pColorLoadClearValues[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001685 "], is invalid (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001686 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001687 continue;
1688 }
1689 }
1690
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001691 if(!validate_VkFormat(pCreateInfo->depthStencilFormat))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001692 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001693 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001694 "depthStencilFormat, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001695 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001696 return;
1697 }
1698
Chris Forbesbc0bb772015-06-21 22:55:02 +12001699 /*
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001700 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001701 size_t size = sizeof(properties);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001702 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->depthStencilFormat,
Tony Barbourd1c35722015-04-16 15:59:00 -06001703 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001704 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001705 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001706 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001707 "depthStencilFormat, cannot be validated (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001708 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001709 return;
1710 }
1711
1712 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1713 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001714 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001715 "depthStencilFormat, contains unsupported format (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001716 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001717 return;
1718 }
Chris Forbesbc0bb772015-06-21 22:55:02 +12001719 */
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001720
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001721 if(!validate_VkImageLayout(pCreateInfo->depthStencilLayout))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001722 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001723 char const str[] = "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001724 "depthStencilLayout, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001725 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001726 return;
1727 }
1728
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001729 if(!validate_VkAttachmentLoadOp(pCreateInfo->depthLoadOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001730 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001731 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001732 "depthLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001733 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001734 return;
1735 }
1736
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001737 if(!validate_VkAttachmentStoreOp(pCreateInfo->depthStoreOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001738 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001739 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001740 "depthStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001741 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001742 return;
1743 }
1744
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001745 if(!validate_VkAttachmentLoadOp(pCreateInfo->stencilLoadOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001746 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001747 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001748 "stencilLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001749 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001750 return;
1751 }
1752
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001753 if(!validate_VkAttachmentStoreOp(pCreateInfo->stencilStoreOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001754 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001755 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001756 "stencilStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001757 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001758 return;
1759 }
1760}
1761
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001762void PostCreateRenderPass(VkResult result, VkRenderPass* pRenderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001763{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001764 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001765 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001766 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001767 char const str[] = "vkCreateRenderPass failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001768 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001769 return;
1770 }
1771
1772 if(pRenderPass == nullptr)
1773 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001774 char const str[] = "vkCreateRenderPass parameter, VkRenderPass* pRenderPass, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001775 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001776 return;
1777 }
1778}
1779
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001780VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, VkRenderPass* pRenderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001781{
1782 PreCreateRenderPass(device, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001783 VkResult result = device_dispatch_table(device)->CreateRenderPass(device, pCreateInfo, pRenderPass);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001784 PostCreateRenderPass(result, pRenderPass);
1785 return result;
1786}
1787
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001788VK_LAYER_EXPORT void VKAPI vkCmdBeginRenderPass(VkCmdBuffer cmdBuffer, const VkRenderPassBegin* pRenderPassBegin)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001789{
1790 char str[1024];
1791 if (!pRenderPassBegin) {
1792 sprintf(str, "Struct ptr parameter pRenderPassBegin to function CmdBeginRenderPass is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001793 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001794 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001795 else if (!vk_validate_vkrenderpassbegin(pRenderPassBegin)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001796 sprintf(str, "Parameter pRenderPassBegin to function CmdBeginRenderPass contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001797 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001798 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001799 device_dispatch_table(cmdBuffer)->CmdBeginRenderPass(cmdBuffer, pRenderPassBegin);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001800}
1801
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001802VK_LAYER_EXPORT void VKAPI vkCmdEndRenderPass(VkCmdBuffer cmdBuffer, VkRenderPass renderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001803{
1804
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001805 device_dispatch_table(cmdBuffer)->CmdEndRenderPass(cmdBuffer, renderPass);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001806}
1807
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001808VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback(
1809 VkInstance instance,
1810 VkFlags msgFlags,
1811 const PFN_vkDbgMsgCallback pfnMsgCallback,
1812 void* pUserData,
1813 VkDbgMsgCallback* pMsgCallback)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001814{
Jon Ashburn9eed2892015-06-01 10:02:09 -06001815 VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(instance);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001816 return layer_create_msg_callback(instance, pTable, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001817}
1818
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06001819VK_LAYER_EXPORT VkResult VKAPI vkDbgDestroyMsgCallback(
1820 VkInstance instance,
1821 VkDbgMsgCallback msgCallback)
1822{
Courtney Goeltzenleuchter0daf2282015-06-13 21:22:12 -06001823 VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(instance);
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06001824 return layer_destroy_msg_callback(instance, pTable, msgCallback);
1825}
1826
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001827VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerBegin(VkCmdBuffer cmdBuffer, const char* pMarker)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001828{
Jon Ashburneab34492015-06-01 09:37:38 -06001829 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) cmdBuffer;
1830 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001831 char const str[] = "Attempt to use CmdDbgMarkerBegin but extension disabled!";
1832 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburneab34492015-06-01 09:37:38 -06001833 return;
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001834 }
Jon Ashburneab34492015-06-01 09:37:38 -06001835 debug_marker_dispatch_table(cmdBuffer)->CmdDbgMarkerBegin(cmdBuffer, pMarker);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001836}
1837
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001838VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerEnd(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001839{
Jon Ashburneab34492015-06-01 09:37:38 -06001840 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) cmdBuffer;
1841 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001842 char const str[] = "Attempt to use CmdDbgMarkerEnd but extension disabled!";
1843 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburneab34492015-06-01 09:37:38 -06001844 return;
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001845 }
Jon Ashburneab34492015-06-01 09:37:38 -06001846 debug_marker_dispatch_table(cmdBuffer)->CmdDbgMarkerEnd(cmdBuffer);
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001847}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001848
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001849VkResult VKAPI vkDbgSetObjectTag(VkDevice device, VkObjectType objType, VkObject object, size_t tagSize, const void* pTag)
1850{
Jon Ashburneab34492015-06-01 09:37:38 -06001851 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
1852 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001853 char const str[] = "Attempt to use DbgSetObjectTag but extension disabled!";
1854 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburneab34492015-06-01 09:37:38 -06001855 return VK_ERROR_UNAVAILABLE;
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001856 }
Jon Ashburneab34492015-06-01 09:37:38 -06001857 debug_marker_dispatch_table(device)->DbgSetObjectTag(device, objType, object, tagSize, pTag);
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001858}
1859
1860VkResult VKAPI vkDbgSetObjectName(VkDevice device, VkObjectType objType, VkObject object, size_t nameSize, const char* pName)
1861{
Jon Ashburneab34492015-06-01 09:37:38 -06001862 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
1863 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001864 char const str[] = "Attempt to use DbgSetObjectName but extension disabled!";
1865 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburneab34492015-06-01 09:37:38 -06001866 return VK_ERROR_UNAVAILABLE;
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001867 }
Jon Ashburneab34492015-06-01 09:37:38 -06001868 debug_marker_dispatch_table(device)->DbgSetObjectName(device, objType, object, nameSize, pName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001869}
1870
Chia-I Wuf8693382015-04-16 22:02:10 +08001871VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI(VkDevice device, const VkSwapChainCreateInfoWSI* pCreateInfo, VkSwapChainWSI* pSwapChain)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001872{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001873 VkResult result = device_dispatch_table(device)->CreateSwapChainWSI(device, pCreateInfo, pSwapChain);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001874 return result;
1875}
1876
Chia-I Wuf8693382015-04-16 22:02:10 +08001877VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapChainWSI(VkSwapChainWSI swapChain)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001878{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001879 VkResult result = device_dispatch_table(swapChain)->DestroySwapChainWSI(swapChain);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001880 return result;
1881}
1882
Chia-I Wuf8693382015-04-16 22:02:10 +08001883VK_LAYER_EXPORT VkResult VKAPI vkGetSwapChainInfoWSI(VkSwapChainWSI swapChain, VkSwapChainInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001884{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001885 VkResult result = device_dispatch_table(swapChain)->GetSwapChainInfoWSI(swapChain, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001886 return result;
1887}
1888
Chia-I Wuf8693382015-04-16 22:02:10 +08001889VK_LAYER_EXPORT VkResult VKAPI vkQueuePresentWSI(VkQueue queue, const VkPresentInfoWSI* pPresentInfo)
1890{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001891 VkResult result = device_dispatch_table(queue)->QueuePresentWSI(queue, pPresentInfo);
Chia-I Wuf8693382015-04-16 22:02:10 +08001892 return result;
1893}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001894
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001895static inline void* layer_intercept_proc(const char *name)
1896{
1897 if (!name || name[0] != 'v' || name[1] != 'k')
1898 return NULL;
1899
1900 name += 2;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001901 if (!strcmp(name, "DestroyDevice"))
1902 return (void*) vkDestroyDevice;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001903 if (!strcmp(name, "GetDeviceQueue"))
1904 return (void*) vkGetDeviceQueue;
1905 if (!strcmp(name, "QueueSubmit"))
1906 return (void*) vkQueueSubmit;
1907 if (!strcmp(name, "QueueWaitIdle"))
1908 return (void*) vkQueueWaitIdle;
1909 if (!strcmp(name, "DeviceWaitIdle"))
1910 return (void*) vkDeviceWaitIdle;
1911 if (!strcmp(name, "AllocMemory"))
1912 return (void*) vkAllocMemory;
1913 if (!strcmp(name, "FreeMemory"))
1914 return (void*) vkFreeMemory;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001915 if (!strcmp(name, "MapMemory"))
1916 return (void*) vkMapMemory;
1917 if (!strcmp(name, "UnmapMemory"))
1918 return (void*) vkUnmapMemory;
1919 if (!strcmp(name, "FlushMappedMemoryRanges"))
1920 return (void*) vkFlushMappedMemoryRanges;
1921 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
1922 return (void*) vkInvalidateMappedMemoryRanges;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001923 if (!strcmp(name, "DestroyObject"))
1924 return (void*) vkDestroyObject;
1925 if (!strcmp(name, "GetObjectInfo"))
1926 return (void*) vkGetObjectInfo;
1927 if (!strcmp(name, "CreateFence"))
1928 return (void*) vkCreateFence;
1929 if (!strcmp(name, "ResetFences"))
1930 return (void*) vkResetFences;
1931 if (!strcmp(name, "GetFenceStatus"))
1932 return (void*) vkGetFenceStatus;
1933 if (!strcmp(name, "WaitForFences"))
1934 return (void*) vkWaitForFences;
1935 if (!strcmp(name, "CreateSemaphore"))
1936 return (void*) vkCreateSemaphore;
1937 if (!strcmp(name, "QueueSignalSemaphore"))
1938 return (void*) vkQueueSignalSemaphore;
1939 if (!strcmp(name, "QueueWaitSemaphore"))
1940 return (void*) vkQueueWaitSemaphore;
1941 if (!strcmp(name, "CreateEvent"))
1942 return (void*) vkCreateEvent;
1943 if (!strcmp(name, "GetEventStatus"))
1944 return (void*) vkGetEventStatus;
1945 if (!strcmp(name, "SetEvent"))
1946 return (void*) vkSetEvent;
1947 if (!strcmp(name, "ResetEvent"))
1948 return (void*) vkResetEvent;
1949 if (!strcmp(name, "CreateQueryPool"))
1950 return (void*) vkCreateQueryPool;
1951 if (!strcmp(name, "GetQueryPoolResults"))
1952 return (void*) vkGetQueryPoolResults;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001953 if (!strcmp(name, "CreateBuffer"))
1954 return (void*) vkCreateBuffer;
1955 if (!strcmp(name, "CreateBufferView"))
1956 return (void*) vkCreateBufferView;
1957 if (!strcmp(name, "CreateImage"))
1958 return (void*) vkCreateImage;
1959 if (!strcmp(name, "GetImageSubresourceInfo"))
1960 return (void*) vkGetImageSubresourceInfo;
1961 if (!strcmp(name, "CreateImageView"))
1962 return (void*) vkCreateImageView;
1963 if (!strcmp(name, "CreateColorAttachmentView"))
1964 return (void*) vkCreateColorAttachmentView;
1965 if (!strcmp(name, "CreateDepthStencilView"))
1966 return (void*) vkCreateDepthStencilView;
1967 if (!strcmp(name, "CreateShader"))
1968 return (void*) vkCreateShader;
1969 if (!strcmp(name, "CreateGraphicsPipeline"))
1970 return (void*) vkCreateGraphicsPipeline;
1971 if (!strcmp(name, "CreateGraphicsPipelineDerivative"))
1972 return (void*) vkCreateGraphicsPipelineDerivative;
1973 if (!strcmp(name, "CreateComputePipeline"))
1974 return (void*) vkCreateComputePipeline;
1975 if (!strcmp(name, "StorePipeline"))
1976 return (void*) vkStorePipeline;
1977 if (!strcmp(name, "LoadPipeline"))
1978 return (void*) vkLoadPipeline;
1979 if (!strcmp(name, "LoadPipelineDerivative"))
1980 return (void*) vkLoadPipelineDerivative;
1981 if (!strcmp(name, "CreatePipelineLayout"))
1982 return (void*) vkCreatePipelineLayout;
1983 if (!strcmp(name, "CreateSampler"))
1984 return (void*) vkCreateSampler;
1985 if (!strcmp(name, "CreateDescriptorSetLayout"))
1986 return (void*) vkCreateDescriptorSetLayout;
1987 if (!strcmp(name, "CreateDescriptorPool"))
1988 return (void*) vkCreateDescriptorPool;
1989 if (!strcmp(name, "ResetDescriptorPool"))
1990 return (void*) vkResetDescriptorPool;
1991 if (!strcmp(name, "AllocDescriptorSets"))
1992 return (void*) vkAllocDescriptorSets;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001993 if (!strcmp(name, "CreateDynamicViewportState"))
1994 return (void*) vkCreateDynamicViewportState;
1995 if (!strcmp(name, "CreateDynamicRasterState"))
1996 return (void*) vkCreateDynamicRasterState;
1997 if (!strcmp(name, "CreateDynamicColorBlendState"))
1998 return (void*) vkCreateDynamicColorBlendState;
1999 if (!strcmp(name, "CreateDynamicDepthStencilState"))
2000 return (void*) vkCreateDynamicDepthStencilState;
2001 if (!strcmp(name, "CreateCommandBuffer"))
2002 return (void*) vkCreateCommandBuffer;
2003 if (!strcmp(name, "BeginCommandBuffer"))
2004 return (void*) vkBeginCommandBuffer;
2005 if (!strcmp(name, "EndCommandBuffer"))
2006 return (void*) vkEndCommandBuffer;
2007 if (!strcmp(name, "ResetCommandBuffer"))
2008 return (void*) vkResetCommandBuffer;
2009 if (!strcmp(name, "CmdBindPipeline"))
2010 return (void*) vkCmdBindPipeline;
2011 if (!strcmp(name, "CmdBindDynamicStateObject"))
2012 return (void*) vkCmdBindDynamicStateObject;
2013 if (!strcmp(name, "CmdBindDescriptorSets"))
2014 return (void*) vkCmdBindDescriptorSets;
2015 if (!strcmp(name, "CmdBindVertexBuffers"))
2016 return (void*) vkCmdBindVertexBuffers;
2017 if (!strcmp(name, "CmdBindIndexBuffer"))
2018 return (void*) vkCmdBindIndexBuffer;
2019 if (!strcmp(name, "CmdDraw"))
2020 return (void*) vkCmdDraw;
2021 if (!strcmp(name, "CmdDrawIndexed"))
2022 return (void*) vkCmdDrawIndexed;
2023 if (!strcmp(name, "CmdDrawIndirect"))
2024 return (void*) vkCmdDrawIndirect;
2025 if (!strcmp(name, "CmdDrawIndexedIndirect"))
2026 return (void*) vkCmdDrawIndexedIndirect;
2027 if (!strcmp(name, "CmdDispatch"))
2028 return (void*) vkCmdDispatch;
2029 if (!strcmp(name, "CmdDispatchIndirect"))
2030 return (void*) vkCmdDispatchIndirect;
2031 if (!strcmp(name, "CmdCopyBuffer"))
2032 return (void*) vkCmdCopyBuffer;
2033 if (!strcmp(name, "CmdCopyImage"))
2034 return (void*) vkCmdCopyImage;
2035 if (!strcmp(name, "CmdBlitImage"))
2036 return (void*) vkCmdBlitImage;
2037 if (!strcmp(name, "CmdCopyBufferToImage"))
2038 return (void*) vkCmdCopyBufferToImage;
2039 if (!strcmp(name, "CmdCopyImageToBuffer"))
2040 return (void*) vkCmdCopyImageToBuffer;
2041 if (!strcmp(name, "CmdUpdateBuffer"))
2042 return (void*) vkCmdUpdateBuffer;
2043 if (!strcmp(name, "CmdFillBuffer"))
2044 return (void*) vkCmdFillBuffer;
2045 if (!strcmp(name, "CmdClearColorImage"))
2046 return (void*) vkCmdClearColorImage;
2047 if (!strcmp(name, "CmdClearDepthStencil"))
2048 return (void*) vkCmdClearDepthStencil;
2049 if (!strcmp(name, "CmdResolveImage"))
2050 return (void*) vkCmdResolveImage;
2051 if (!strcmp(name, "CmdSetEvent"))
2052 return (void*) vkCmdSetEvent;
2053 if (!strcmp(name, "CmdResetEvent"))
2054 return (void*) vkCmdResetEvent;
2055 if (!strcmp(name, "CmdWaitEvents"))
2056 return (void*) vkCmdWaitEvents;
2057 if (!strcmp(name, "CmdPipelineBarrier"))
2058 return (void*) vkCmdPipelineBarrier;
2059 if (!strcmp(name, "CmdBeginQuery"))
2060 return (void*) vkCmdBeginQuery;
2061 if (!strcmp(name, "CmdEndQuery"))
2062 return (void*) vkCmdEndQuery;
2063 if (!strcmp(name, "CmdResetQueryPool"))
2064 return (void*) vkCmdResetQueryPool;
2065 if (!strcmp(name, "CmdWriteTimestamp"))
2066 return (void*) vkCmdWriteTimestamp;
2067 if (!strcmp(name, "CmdCopyQueryPoolResults"))
2068 return (void*) vkCmdCopyQueryPoolResults;
2069 if (!strcmp(name, "CmdInitAtomicCounters"))
2070 return (void*) vkCmdInitAtomicCounters;
2071 if (!strcmp(name, "CmdLoadAtomicCounters"))
2072 return (void*) vkCmdLoadAtomicCounters;
2073 if (!strcmp(name, "CmdSaveAtomicCounters"))
2074 return (void*) vkCmdSaveAtomicCounters;
2075 if (!strcmp(name, "CreateFramebuffer"))
2076 return (void*) vkCreateFramebuffer;
2077 if (!strcmp(name, "CreateRenderPass"))
2078 return (void*) vkCreateRenderPass;
2079 if (!strcmp(name, "CmdBeginRenderPass"))
2080 return (void*) vkCmdBeginRenderPass;
2081 if (!strcmp(name, "CmdEndRenderPass"))
2082 return (void*) vkCmdEndRenderPass;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002083
2084 return NULL;
2085}
2086
2087static inline void* layer_intercept_instance_proc(const char *name)
2088{
2089 if (!name || name[0] != 'v' || name[1] != 'k')
2090 return NULL;
2091
2092 name += 2;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002093 if (!strcmp(name, "CreateInstance"))
2094 return (void*) vkCreateInstance;
2095 if (!strcmp(name, "DestroyInstance"))
2096 return (void*) vkDestroyInstance;
2097 if (!strcmp(name, "GetPhysicalDeviceInfo"))
2098 return (void*) vkGetPhysicalDeviceInfo;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002099 if (!strcmp(name, "CreateDevice"))
2100 return (void*) vkCreateDevice;
2101 if (!strcmp(name, "GetGlobalExtensionInfo"))
2102 return (void*) vkGetGlobalExtensionInfo;
2103 if (!strcmp(name, "GetPhysicalDeviceExtensionInfo"))
2104 return (void*) vkGetPhysicalDeviceExtensionInfo;
Chris Forbesbc0bb772015-06-21 22:55:02 +12002105 if (!strcmp(name, "GetPhysicalDeviceFormatInfo"))
2106 return (void*) vkGetPhysicalDeviceFormatInfo;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002107
2108 return NULL;
2109}
2110
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06002111VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002112{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002113 void* addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002114 if (device == NULL) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002115 return NULL;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002116 }
2117
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -06002118 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn8fd08252015-05-28 16:25:02 -06002119
2120 /* loader uses this to force layer initialization; device object is wrapped */
2121 if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
2122 initDeviceTable((const VkBaseLayerObject *) device);
2123 return (void*) vkGetDeviceProcAddr;
2124 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002125
2126 addr = layer_intercept_proc(funcName);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002127 if (addr) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002128 return addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002129 }
Jon Ashburneab34492015-06-01 09:37:38 -06002130
Jon Ashburn747f2b62015-06-18 15:02:58 -06002131 VkLayerDispatchTable *pDisp = device_dispatch_table(device);
2132 if (deviceExtMap.size() == 0 || deviceExtMap[pDisp].wsi_lunarg_enabled)
Jon Ashburneab34492015-06-01 09:37:38 -06002133 {
Jon Ashburn747f2b62015-06-18 15:02:58 -06002134 if (!strcmp(funcName, "vkCreateSwapChainWSI"))
2135 return (void*) vkCreateSwapChainWSI;
2136 if (!strcmp(funcName, "vkDestroySwapChainWSI"))
2137 return (void*) vkDestroySwapChainWSI;
2138 if (!strcmp(funcName, "vkGetSwapChainInfoWSI"))
2139 return (void*) vkGetSwapChainInfoWSI;
2140 if (!strcmp(funcName, "vkQueuePresentWSI"))
2141 return (void*) vkQueuePresentWSI;
2142 }
2143 if (deviceExtMap.size() == 0 || deviceExtMap[pDisp].debug_marker_enabled)
2144 {
2145 if (!strcmp(funcName, "vkCmdDbgMarkerBegin"))
Jon Ashburneab34492015-06-01 09:37:38 -06002146 return (void*) vkCmdDbgMarkerBegin;
Jon Ashburn747f2b62015-06-18 15:02:58 -06002147 if (!strcmp(funcName, "vkCmdDbgMarkerEnd"))
Jon Ashburneab34492015-06-01 09:37:38 -06002148 return (void*) vkCmdDbgMarkerEnd;
Jon Ashburn747f2b62015-06-18 15:02:58 -06002149 if (!strcmp(funcName, "vkDbgSetObjectTag"))
Jon Ashburneab34492015-06-01 09:37:38 -06002150 return (void*) vkDbgSetObjectTag;
Jon Ashburn747f2b62015-06-18 15:02:58 -06002151 if (!strcmp(funcName, "vkDbgSetObjectName"))
Jon Ashburneab34492015-06-01 09:37:38 -06002152 return (void*) vkDbgSetObjectName;
2153 }
2154 {
Jon Ashburn747f2b62015-06-18 15:02:58 -06002155 if (pDisp->GetDeviceProcAddr == NULL)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002156 return NULL;
Jon Ashburn747f2b62015-06-18 15:02:58 -06002157 return pDisp->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002158 }
2159}
2160
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002161VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002162{
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06002163 void *fptr;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002164 void* addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002165 if (instance == NULL) {
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002166 return NULL;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002167 }
2168
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -06002169 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn8fd08252015-05-28 16:25:02 -06002170
2171 /* loader uses this to force layer initialization; instance object is wrapped */
2172 if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
2173 initInstanceTable((const VkBaseLayerObject *) instance);
2174 return (void*) vkGetInstanceProcAddr;
2175 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002176
2177 addr = layer_intercept_instance_proc(funcName);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002178 if (addr) {
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002179 return addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002180 }
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06002181
2182 fptr = msg_callback_get_proc_addr(funcName);
2183 if (fptr)
2184 return fptr;
2185
Jon Ashburn9eed2892015-06-01 10:02:09 -06002186 VkLayerInstanceDispatchTable* pTable = instance_dispatch_table(instance);
2187 if (pTable->GetInstanceProcAddr == NULL)
2188 return NULL;
2189 return pTable->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002190}