blob: 771054e119570029e97e1249ebea26fa5f36283a [file] [log] [blame]
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001/*
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06002 * Vulkan
Jeremy Hayesc6cfa572015-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 Lobodzinski3723c512015-05-26 10:58:40 -050032#include <unordered_map>
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060033
34#include "loader_platform.h"
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060035#include "vkLayer.h"
Jon Ashburnf0615e22015-05-25 14:11:37 -060036#include "vk_debug_marker_layer.h"
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060037#include "layers_config.h"
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060038#include "vk_enum_validate_helper.h"
39#include "vk_struct_validate_helper.h"
Jeremy Hayesc6cfa572015-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 Ashburn6f8cd632015-06-01 09:37:38 -060044#include "layers_debug_marker_table.h"
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060045
Jon Ashburnd9564002015-05-07 10:27:37 -060046static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(initOnce);
Jon Ashburn6f8cd632015-06-01 09:37:38 -060047struct devExts {
48 bool debug_marker_enabled;
49};
Mark Lobodzinski3723c512015-05-26 10:58:40 -050050static std::unordered_map<void *, VkLayerDispatchTable *> tableMap;
Mark Lobodzinski3723c512015-05-26 10:58:40 -050051static std::unordered_map<void *, VkLayerInstanceDispatchTable *> tableInstanceMap;
Jon Ashburn6f8cd632015-06-01 09:37:38 -060052static std::unordered_map<void *, struct devExts> deviceExtMap;
Mark Lobodzinski3723c512015-05-26 10:58:40 -050053
54static inline VkLayerDispatchTable *device_dispatch_table(VkObject object) {
55 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) object;
56 VkLayerDispatchTable *pTable = tableMap[pDisp];
57 return pTable;
58}
59
60static inline VkLayerInstanceDispatchTable *instance_dispatch_table(VkObject object) {
61 VkLayerInstanceDispatchTable **ppDisp = (VkLayerInstanceDispatchTable **) object;
62 VkLayerInstanceDispatchTable *pInstanceTable = tableInstanceMap[*ppDisp];
63 return pInstanceTable;
64}
65
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060066
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060067#include "vk_dispatch_table_helper.h"
Jon Ashburnd9564002015-05-07 10:27:37 -060068
Mark Lobodzinski3723c512015-05-26 10:58:40 -050069static VkLayerDispatchTable * initDeviceTable(const VkBaseLayerObject *devw)
Jon Ashburnd9564002015-05-07 10:27:37 -060070{
Mark Lobodzinski3723c512015-05-26 10:58:40 -050071 VkLayerDispatchTable *pTable;
Jon Ashburnf0615e22015-05-25 14:11:37 -060072
Mark Lobodzinski3723c512015-05-26 10:58:40 -050073 assert(devw);
74 VkLayerDispatchTable **ppDisp = (VkLayerDispatchTable **) (devw->baseObject);
75
76 std::unordered_map<void *, VkLayerDispatchTable *>::const_iterator it = tableMap.find((void *) *ppDisp);
77 if (it == tableMap.end())
78 {
79 pTable = new VkLayerDispatchTable;
80 tableMap[(void *) *ppDisp] = pTable;
Mark Lobodzinski3723c512015-05-26 10:58:40 -050081 } else
82 {
83 return it->second;
84 }
85
Jon Ashburn4f2575f2015-05-28 16:25:02 -060086 layer_initialize_dispatch_table(pTable, devw);
Mark Lobodzinski3723c512015-05-26 10:58:40 -050087
Mark Lobodzinski3723c512015-05-26 10:58:40 -050088 return pTable;
Jon Ashburnd9564002015-05-07 10:27:37 -060089}
90
Mark Lobodzinski3723c512015-05-26 10:58:40 -050091static VkLayerInstanceDispatchTable * initInstanceTable(const VkBaseLayerObject *instw)
Jon Ashburnd9564002015-05-07 10:27:37 -060092{
Mark Lobodzinski3723c512015-05-26 10:58:40 -050093 VkLayerInstanceDispatchTable *pTable;
94 assert(instw);
95 VkLayerInstanceDispatchTable **ppDisp = (VkLayerInstanceDispatchTable **) instw->baseObject;
96
97 std::unordered_map<void *, VkLayerInstanceDispatchTable *>::const_iterator it = tableInstanceMap.find((void *) *ppDisp);
98 if (it == tableInstanceMap.end())
99 {
100 pTable = new VkLayerInstanceDispatchTable;
101 tableInstanceMap[(void *) *ppDisp] = pTable;
102 } else
103 {
104 return it->second;
105 }
106
Jon Ashburn4f2575f2015-05-28 16:25:02 -0600107 layer_init_instance_dispatch_table(pTable, instw);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500108
109 return pTable;
Jon Ashburnd9564002015-05-07 10:27:37 -0600110}
111
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600112static void initParamChecker(void)
113{
114
115 const char *strOpt;
116 // initialize ParamChecker options
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600117 getLayerOptionEnum("ParamCheckerReportLevel", (uint32_t *) &g_reportFlags);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600118 g_actionIsDefault = getLayerOptionEnum("ParamCheckerDebugAction", (uint32_t *) &g_debugAction);
119
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600120 if (g_debugAction & VK_DBG_LAYER_ACTION_LOG_MSG)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600121 {
122 strOpt = getLayerOption("ParamCheckerLogFilename");
123 if (strOpt)
124 {
125 g_logFile = fopen(strOpt, "w");
126 }
127 if (g_logFile == NULL)
128 g_logFile = stdout;
129 }
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600130}
131
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600132void PreCreateInstance(const VkApplicationInfo* pAppInfo, const VkAllocCallbacks* pAllocCb)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600133{
134 if(pAppInfo == nullptr)
135 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600136 char const str[] = "vkCreateInstance parameter, VkApplicationInfo* pAppInfo, is "\
Mike Stroyan0ae32252015-04-06 15:24:46 -0600137 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600138 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600139 return;
140 }
141
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600142 if(pAppInfo->sType != VK_STRUCTURE_TYPE_APPLICATION_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600143 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600144 char const str[] = "vkCreateInstance parameter, VK_STRUCTURE_TYPE_APPLICATION_INFO "\
145 "pAppInfo->sType, is not VK_STRUCTURE_TYPE_APPLICATION_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600146 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600147 return;
148 }
149
150 // TODO: What else can validated in pAppInfo?
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600151 // TODO: VK_API_VERSION validation.
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600152
153 // It's okay if pAllocCb is a nullptr.
154 if(pAllocCb != nullptr)
155 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600156 if(!vk_validate_vkalloccallbacks(pAllocCb))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600157 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600158 char const str[] = "vkCreateInstance parameter, VkAllocCallbacks* pAllocCb, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600159 "contains an invalid value (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600160 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600161 return;
162 }
163 }
164}
165
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600166void PostCreateInstance(VkResult result, const VkInstanceCreateInfo *pCreateInfo, VkInstance* pInstance)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600167{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600168 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600169 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600170 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600171 char const str[] = "vkCreateInstance failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600172 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600173 return;
174 }
175
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600176 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
177
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600178 if(pInstance == nullptr)
179 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600180 char const str[] = "vkCreateInstance parameter, VkInstance* pInstance, is nullptr "\
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600181 "(postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600182 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600183 return;
184 }
Courtney Goeltzenleuchterf4a2eba2015-06-08 14:58:39 -0600185
186 VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(*pInstance);
187 debug_report_init_instance_extension_dispatch_table(
188 pTable,
189 pTable->GetInstanceProcAddr,
190 *pInstance);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600191}
192
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600193VK_LAYER_EXPORT VkResult VKAPI vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600194{
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600195 loader_platform_thread_once(&initOnce, initParamChecker);
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600196
Jon Ashburn29669a42015-04-04 14:52:07 -0600197 PreCreateInstance(pCreateInfo->pAppInfo, pCreateInfo->pAllocCb);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500198 VkResult result = instance_dispatch_table(*pInstance)->CreateInstance(pCreateInfo, pInstance);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600199 PostCreateInstance(result, pCreateInfo, pInstance);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600200 return result;
201}
202
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600203VK_LAYER_EXPORT VkResult VKAPI vkDestroyInstance(VkInstance instance)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600204{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500205 VkLayerInstanceDispatchTable *pDisp = *(VkLayerInstanceDispatchTable **) instance;
206 VkResult res = instance_dispatch_table(instance)->DestroyInstance(instance);
207 tableInstanceMap.erase(pDisp);
208 return res;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600209}
210
Tony Barbour8205d902015-04-16 15:59:00 -0600211VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceInfo(VkPhysicalDevice gpu, VkPhysicalDeviceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600212{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600213 char str[1024];
Tony Barbour8205d902015-04-16 15:59:00 -0600214 if (!validate_VkPhysicalDeviceInfoType(infoType)) {
215 sprintf(str, "Parameter infoType to function GetPhysicalDeviceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600216 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600217 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500218 VkResult result = instance_dispatch_table(gpu)->GetPhysicalDeviceInfo(gpu, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600219 return result;
220}
221
Tony Barbour8205d902015-04-16 15:59:00 -0600222void PreCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600223{
224 if(gpu == nullptr)
225 {
Tony Barbour8205d902015-04-16 15:59:00 -0600226 char const str[] = "vkCreateDevice parameter, VkPhysicalDevice gpu, is nullptr "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600227 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600228 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600229 return;
230 }
231
232 if(pCreateInfo == nullptr)
233 {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600234 char const str[] = "vkCreateDevice parameter, VkDeviceCreateInfo* pCreateInfo, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600235 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600236 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600237 return;
238 }
239
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600240 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600241 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600242 char const str[] = "vkCreateDevice parameter, VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO "\
243 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600244 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600245 return;
246 }
247
248 if(pCreateInfo->queueRecordCount == 0)
249 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600250 char const str[] = "vkCreateDevice parameter, uint32_t pCreateInfo->queueRecordCount, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600251 "zero (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600252 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600253 return;
254 }
255
256 if(pCreateInfo->pRequestedQueues == nullptr)
257 {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600258 char const str[] = "vkCreateDevice parameter, VkDeviceQueueCreateInfo* pCreateInfo->pRequestedQueues, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600259 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600260 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600261 return;
262 }
263
264 for(uint32_t i = 0; i < pCreateInfo->queueRecordCount; ++i)
265 {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600266 if(!vk_validate_vkdevicequeuecreateinfo(&(pCreateInfo->pRequestedQueues[i])))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600267 {
268 std::stringstream ss;
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600269 ss << "vkCreateDevice parameter, VkDeviceQueueCreateInfo pCreateInfo->pRequestedQueues[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600270 "], is invalid (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600271 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600272 continue;
273 }
274 }
275
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600276}
277
Jon Ashburnf0615e22015-05-25 14:11:37 -0600278static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
279{
280 uint32_t i, ext_idx;
Jon Ashburn6f8cd632015-06-01 09:37:38 -0600281 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
282 deviceExtMap[pDisp].debug_marker_enabled = false;
Jon Ashburnf0615e22015-05-25 14:11:37 -0600283 for (i = 0; i < pCreateInfo->extensionCount; i++) {
284 if (strcmp(pCreateInfo->pEnabledExtensions[i].name, DEBUG_MARKER_EXTENSION_NAME) == 0) {
Jon Ashburn6f8cd632015-06-01 09:37:38 -0600285 /* Found a matching extension name, mark it enabled and init dispatch table*/
286 initDebugMarkerTable(device);
287 deviceExtMap[pDisp].debug_marker_enabled = true;
288
Jon Ashburnf0615e22015-05-25 14:11:37 -0600289 }
290
291 }
292}
293
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600294void PostCreateDevice(VkResult result, const VkDeviceCreateInfo *pCreateInfo, VkDevice* pDevice)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600295{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600296 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600297 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600298 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600299 char const str[] = "vkCreateDevice failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600300 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600301 return;
302 }
303
304 if(pDevice == nullptr)
305 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600306 char const str[] = "vkCreateDevice parameter, VkDevice* pDevice, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600307 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600308 return;
309 }
Jon Ashburn6f8cd632015-06-01 09:37:38 -0600310 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) *pDevice;
311 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
312 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600313}
314
Tony Barbour8205d902015-04-16 15:59:00 -0600315VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600316{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600317 PreCreateDevice(gpu, pCreateInfo);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500318 VkResult result = instance_dispatch_table(gpu)->CreateDevice(gpu, pCreateInfo, pDevice);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600319 PostCreateDevice(result, pCreateInfo, pDevice);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600320 return result;
321}
322
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600323VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice(VkDevice device)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600324{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500325 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
326 VkLayerDispatchTable *pTable = tableMap[pDisp];
327 VkResult result = pTable->DestroyDevice(device);
328 tableMap.erase(pDisp);
Jon Ashburn6f8cd632015-06-01 09:37:38 -0600329 tableDebugMarkerMap.erase(pDisp);
330 deviceExtMap.erase(pDisp);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600331 return result;
332}
333
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600334#define PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE 2
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600335static const VkExtensionProperties pcExts[PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE] = {
336 {
337 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
338 "ParamChecker",
339 0x10,
340 "Sample layer: ParamChecker",
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600341 },
342 {
343 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
344 "Validation",
345 0x10,
346 "Sample layer: ParamChecker",
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600347 }
Jon Ashburneb2728b2015-04-10 14:33:07 -0600348};
349
350VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo(
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600351 VkExtensionInfoType infoType,
352 uint32_t extensionIndex,
353 size_t* pDataSize,
354 void* pData)
Jon Ashburneb2728b2015-04-10 14:33:07 -0600355{
Jon Ashburneb2728b2015-04-10 14:33:07 -0600356 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
Jon Ashburneb2728b2015-04-10 14:33:07 -0600357 uint32_t *count;
358
359 if (pDataSize == NULL)
360 return VK_ERROR_INVALID_POINTER;
361
362 switch (infoType) {
363 case VK_EXTENSION_INFO_TYPE_COUNT:
364 *pDataSize = sizeof(uint32_t);
365 if (pData == NULL)
366 return VK_SUCCESS;
367 count = (uint32_t *) pData;
368 *count = PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE;
369 break;
370 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
371 *pDataSize = sizeof(VkExtensionProperties);
372 if (pData == NULL)
373 return VK_SUCCESS;
374 if (extensionIndex >= PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE)
375 return VK_ERROR_INVALID_VALUE;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600376 memcpy((VkExtensionProperties *) pData, &pcExts[extensionIndex], sizeof(VkExtensionProperties));
Jon Ashburneb2728b2015-04-10 14:33:07 -0600377 break;
378 default:
379 return VK_ERROR_INVALID_VALUE;
380 };
381
382 return VK_SUCCESS;
383}
384
Jeremy Hayescf469132015-04-17 10:36:53 -0600385VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionInfo(
386 VkPhysicalDevice gpu,
387 VkExtensionInfoType infoType,
388 uint32_t extensionIndex,
389 size_t* pDataSize,
390 void* pData)
391{
Jon Ashburn6f8cd632015-06-01 09:37:38 -0600392 //TODO add debug_marker
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600393 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
394 uint32_t *count;
395
396 if (pDataSize == NULL)
397 return VK_ERROR_INVALID_POINTER;
398
399 switch (infoType) {
400 case VK_EXTENSION_INFO_TYPE_COUNT:
401 *pDataSize = sizeof(uint32_t);
402 if (pData == NULL)
403 return VK_SUCCESS;
404 count = (uint32_t *) pData;
405 *count = PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE;
406 break;
407 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
408 *pDataSize = sizeof(VkExtensionProperties);
409 if (pData == NULL)
410 return VK_SUCCESS;
411 if (extensionIndex >= PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE)
412 return VK_ERROR_INVALID_VALUE;
413 memcpy((VkExtensionProperties *) pData, &pcExts[extensionIndex], sizeof(VkExtensionProperties));
414 break;
415 default:
416 return VK_ERROR_INVALID_VALUE;
417 };
418
419 return VK_SUCCESS;
Jeremy Hayescf469132015-04-17 10:36:53 -0600420}
421
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600422VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex, VkQueue* pQueue)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600423{
424
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500425 VkResult result = device_dispatch_table(device)->GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600426 return result;
427}
428
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600429VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600430{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500431 VkResult result = device_dispatch_table(queue)->QueueSubmit(queue, cmdBufferCount, pCmdBuffers, fence);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600432 return result;
433}
434
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600435VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(VkQueue queue)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600436{
437
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500438 VkResult result = device_dispatch_table(queue)->QueueWaitIdle(queue);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600439 return result;
440}
441
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600442VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle(VkDevice device)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600443{
444
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500445 VkResult result = device_dispatch_table(device)->DeviceWaitIdle(device);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600446 return result;
447}
448
Tony Barbour8205d902015-04-16 15:59:00 -0600449VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory(VkDevice device, const VkMemoryAllocInfo* pAllocInfo, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600450{
451 char str[1024];
452 if (!pAllocInfo) {
453 sprintf(str, "Struct ptr parameter pAllocInfo to function AllocMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600454 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600455 } else if (!vk_validate_vkmemoryallocinfo(pAllocInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600456 sprintf(str, "Parameter pAllocInfo to function AllocMemory contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600457 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600458 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500459 VkResult result = device_dispatch_table(device)->AllocMemory(device, pAllocInfo, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600460 return result;
461}
462
Mike Stroyan230e6252015-04-17 12:36:38 -0600463VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600464{
465
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500466 VkResult result = device_dispatch_table(device)->FreeMemory(device, mem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600467 return result;
468}
469
Mike Stroyan230e6252015-04-17 12:36:38 -0600470VK_LAYER_EXPORT VkResult VKAPI vkSetMemoryPriority(VkDevice device, VkDeviceMemory mem, VkMemoryPriority priority)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600471{
472 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600473 if (!validate_VkMemoryPriority(priority)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600474 sprintf(str, "Parameter priority to function SetMemoryPriority has invalid value of %i.", (int)priority);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600475 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600476 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500477 VkResult result = device_dispatch_table(device)->SetMemoryPriority(device, mem, priority);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600478 return result;
479}
480
Mike Stroyan230e6252015-04-17 12:36:38 -0600481VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkFlags flags, void** ppData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600482{
483
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500484 VkResult result = device_dispatch_table(device)->MapMemory(device, mem, offset, size, flags, ppData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600485 return result;
486}
487
Mike Stroyan230e6252015-04-17 12:36:38 -0600488VK_LAYER_EXPORT VkResult VKAPI vkUnmapMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600489{
490
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500491 VkResult result = device_dispatch_table(device)->UnmapMemory(device, mem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600492 return result;
493}
494
Courtney Goeltzenleuchtera569a502015-04-29 17:16:21 -0600495VK_LAYER_EXPORT VkResult VKAPI vkFlushMappedMemoryRanges(
496 VkDevice device,
497 uint32_t memRangeCount,
498 const VkMappedMemoryRange* pMemRanges)
Tony Barbour859ceab2015-04-16 19:23:13 -0600499{
500
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500501 VkResult result = device_dispatch_table(device)->FlushMappedMemoryRanges(device, memRangeCount, pMemRanges);
Courtney Goeltzenleuchtera569a502015-04-29 17:16:21 -0600502 return result;
503}
504
505VK_LAYER_EXPORT VkResult VKAPI vkInvalidateMappedMemoryRanges(
506 VkDevice device,
507 uint32_t memRangeCount,
508 const VkMappedMemoryRange* pMemRanges)
509{
510
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500511 VkResult result = device_dispatch_table(device)->InvalidateMappedMemoryRanges(device, memRangeCount, pMemRanges);
Tony Barbour859ceab2015-04-16 19:23:13 -0600512 return result;
513}
514
Tony Barbour8205d902015-04-16 15:59:00 -0600515VK_LAYER_EXPORT VkResult VKAPI vkPinSystemMemory(VkDevice device, const void* pSysMem, size_t memSize, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600516{
517
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500518 VkResult result = device_dispatch_table(device)->PinSystemMemory(device, pSysMem, memSize, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600519 return result;
520}
521
Tony Barbour8205d902015-04-16 15:59:00 -0600522VK_LAYER_EXPORT VkResult VKAPI vkGetMultiDeviceCompatibility(VkPhysicalDevice gpu0, VkPhysicalDevice gpu1, VkPhysicalDeviceCompatibilityInfo* pInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600523{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600524
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500525 VkResult result = instance_dispatch_table(gpu0)->GetMultiDeviceCompatibility(gpu0, gpu1, pInfo);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600526 return result;
527}
528
Tony Barbour8205d902015-04-16 15:59:00 -0600529VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedMemory(VkDevice device, const VkMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600530{
531 char str[1024];
532 if (!pOpenInfo) {
533 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600534 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600535 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600536 else if (!vk_validate_vkmemoryopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600537 sprintf(str, "Parameter pOpenInfo to function OpenSharedMemory contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600538 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600539 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500540 VkResult result = device_dispatch_table(device)->OpenSharedMemory(device, pOpenInfo, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600541 return result;
542}
543
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600544VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedSemaphore(VkDevice device, const VkSemaphoreOpenInfo* pOpenInfo, VkSemaphore* pSemaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600545{
546 char str[1024];
547 if (!pOpenInfo) {
548 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedSemaphore is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600549 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600550 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600551 else if (!vk_validate_vksemaphoreopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600552 sprintf(str, "Parameter pOpenInfo to function OpenSharedSemaphore contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600553 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600554 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500555 VkResult result = device_dispatch_table(device)->OpenSharedSemaphore(device, pOpenInfo, pSemaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600556 return result;
557}
558
Tony Barbour8205d902015-04-16 15:59:00 -0600559VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerMemory(VkDevice device, const VkPeerMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600560{
561 char str[1024];
562 if (!pOpenInfo) {
563 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600564 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600565 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600566 else if (!vk_validate_vkpeermemoryopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600567 sprintf(str, "Parameter pOpenInfo to function OpenPeerMemory contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600568 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600569 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500570 VkResult result = device_dispatch_table(device)->OpenPeerMemory(device, pOpenInfo, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600571 return result;
572}
573
Tony Barbour8205d902015-04-16 15:59:00 -0600574VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerImage(VkDevice device, const VkPeerImageOpenInfo* pOpenInfo, VkImage* pImage, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600575{
576 char str[1024];
577 if (!pOpenInfo) {
578 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerImage is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600579 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600580 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600581 else if (!vk_validate_vkpeerimageopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600582 sprintf(str, "Parameter pOpenInfo to function OpenPeerImage contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600583 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600584 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500585 VkResult result = device_dispatch_table(device)->OpenPeerImage(device, pOpenInfo, pImage, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600586 return result;
587}
588
Mike Stroyan230e6252015-04-17 12:36:38 -0600589VK_LAYER_EXPORT VkResult VKAPI vkDestroyObject(VkDevice device, VkObjectType objType, VkObject object)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600590{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500591 VkResult result = device_dispatch_table(device)->DestroyObject(device, objType, object);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600592 return result;
593}
594
Mike Stroyan230e6252015-04-17 12:36:38 -0600595VK_LAYER_EXPORT VkResult VKAPI vkGetObjectInfo(VkDevice device, VkObjectType objType, VkObject object, VkObjectInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600596{
597 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600598 if (!validate_VkObjectInfoType(infoType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600599 sprintf(str, "Parameter infoType to function GetObjectInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600600 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600601 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500602 VkResult result = device_dispatch_table(device)->GetObjectInfo(device, objType, object, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600603 return result;
604}
605
Mark Lobodzinski23182612015-05-29 09:32:35 -0500606VK_LAYER_EXPORT VkResult VKAPI vkBindObjectMemory(VkDevice device, VkObjectType objType, VkObject object, VkDeviceMemory mem, VkDeviceSize offset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600607{
608
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500609 VkResult result = device_dispatch_table(device)->BindObjectMemory(device, objType, object, mem, offset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600610 return result;
611}
612
Mark Lobodzinski23182612015-05-29 09:32:35 -0500613VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(VkQueue queue, VkBuffer buffer, VkDeviceSize rangeOffset, VkDeviceSize rangeSize, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600614{
615
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500616 VkResult result = device_dispatch_table(queue)->QueueBindSparseBufferMemory(queue, buffer, rangeOffset, rangeSize, mem, memOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600617 return result;
618}
619
Mark Lobodzinski23182612015-05-29 09:32:35 -0500620VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageMemory(VkQueue queue, VkImage image, const VkImageMemoryBindInfo* pBindInfo, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600621{
622 char str[1024];
Jeremy Hayes47536532015-04-15 15:20:03 -0600623 if (!pBindInfo) {
Mark Lobodzinskifb9f5642015-05-11 17:21:15 -0500624 sprintf(str, "Struct ptr parameter pBindInfo to function QueueBindSparseImageMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600625 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600626 }
Jeremy Hayes47536532015-04-15 15:20:03 -0600627 else if (!vk_validate_vkimagememorybindinfo(pBindInfo)) {
628 sprintf(str, "Parameter pBindInfo to function BindImageMemoryRange contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600629 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600630 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500631 VkResult result = device_dispatch_table(queue)->QueueBindSparseImageMemory(queue, image, pBindInfo, mem, memOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600632 return result;
633}
634
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600635VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(VkDevice device, const VkFenceCreateInfo* pCreateInfo, VkFence* pFence)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600636{
637 char str[1024];
638 if (!pCreateInfo) {
639 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFence is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600640 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600641 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600642 else if (!vk_validate_vkfencecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600643 sprintf(str, "Parameter pCreateInfo to function CreateFence contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600644 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600645 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500646 VkResult result = device_dispatch_table(device)->CreateFence(device, pCreateInfo, pFence);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600647 return result;
648}
649
Mike Stroyan230e6252015-04-17 12:36:38 -0600650VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(VkDevice device, VkFence fence)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600651{
652
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500653 VkResult result = device_dispatch_table(device)->GetFenceStatus(device, fence);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600654 return result;
655}
656
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600657VK_LAYER_EXPORT VkResult VKAPI vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences, bool32_t waitAll, uint64_t timeout)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600658{
659
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500660 VkResult result = device_dispatch_table(device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600661 return result;
662}
663
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600664VK_LAYER_EXPORT VkResult VKAPI vkResetFences(VkDevice device, uint32_t fenceCount, VkFence* pFences)
Mark Lobodzinskiebe814d2015-04-07 16:07:57 -0500665{
666
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500667 VkResult result = device_dispatch_table(device)->ResetFences(device, fenceCount, pFences);
Mark Lobodzinskiebe814d2015-04-07 16:07:57 -0500668 return result;
669}
670
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600671VK_LAYER_EXPORT VkResult VKAPI vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, VkSemaphore* pSemaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600672{
673 char str[1024];
674 if (!pCreateInfo) {
675 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSemaphore is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600676 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600677 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600678 else if (!vk_validate_vksemaphorecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600679 sprintf(str, "Parameter pCreateInfo to function CreateSemaphore contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600680 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600681 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500682 VkResult result = device_dispatch_table(device)->CreateSemaphore(device, pCreateInfo, pSemaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600683 return result;
684}
685
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600686VK_LAYER_EXPORT VkResult VKAPI vkQueueSignalSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600687{
688
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500689 VkResult result = device_dispatch_table(queue)->QueueSignalSemaphore(queue, semaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600690 return result;
691}
692
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600693VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600694{
695
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500696 VkResult result = device_dispatch_table(queue)->QueueWaitSemaphore(queue, semaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600697 return result;
698}
699
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600700VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(VkDevice device, const VkEventCreateInfo* pCreateInfo, VkEvent* pEvent)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600701{
702 char str[1024];
703 if (!pCreateInfo) {
704 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateEvent is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600705 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600706 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600707 else if (!vk_validate_vkeventcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600708 sprintf(str, "Parameter pCreateInfo to function CreateEvent contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600709 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600710 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500711 VkResult result = device_dispatch_table(device)->CreateEvent(device, pCreateInfo, pEvent);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600712 return result;
713}
714
Mike Stroyan230e6252015-04-17 12:36:38 -0600715VK_LAYER_EXPORT VkResult VKAPI vkGetEventStatus(VkDevice device, VkEvent event)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600716{
717
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500718 VkResult result = device_dispatch_table(device)->GetEventStatus(device, event);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600719 return result;
720}
721
Mike Stroyan230e6252015-04-17 12:36:38 -0600722VK_LAYER_EXPORT VkResult VKAPI vkSetEvent(VkDevice device, VkEvent event)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600723{
724
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500725 VkResult result = device_dispatch_table(device)->SetEvent(device, event);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600726 return result;
727}
728
Mike Stroyan230e6252015-04-17 12:36:38 -0600729VK_LAYER_EXPORT VkResult VKAPI vkResetEvent(VkDevice device, VkEvent event)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600730{
731
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500732 VkResult result = device_dispatch_table(device)->ResetEvent(device, event);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600733 return result;
734}
735
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600736VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, VkQueryPool* pQueryPool)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600737{
738 char str[1024];
739 if (!pCreateInfo) {
740 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateQueryPool is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600741 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600742 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600743 else if (!vk_validate_vkquerypoolcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600744 sprintf(str, "Parameter pCreateInfo to function CreateQueryPool contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600745 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600746 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500747 VkResult result = device_dispatch_table(device)->CreateQueryPool(device, pCreateInfo, pQueryPool);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600748 return result;
749}
750
Mike Stroyan230e6252015-04-17 12:36:38 -0600751VK_LAYER_EXPORT VkResult VKAPI vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData, VkQueryResultFlags flags)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600752{
753
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500754 VkResult result = device_dispatch_table(device)->GetQueryPoolResults(device, queryPool, startQuery, queryCount, pDataSize, pData, flags);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600755 return result;
756}
757
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600758VK_LAYER_EXPORT VkResult VKAPI vkGetFormatInfo(VkDevice device, VkFormat format, VkFormatInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600759{
760 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600761 if (!validate_VkFormat(format)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600762 sprintf(str, "Parameter format to function GetFormatInfo has invalid value of %i.", (int)format);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600763 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600764 }
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600765 if (!validate_VkFormatInfoType(infoType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600766 sprintf(str, "Parameter infoType to function GetFormatInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600767 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600768 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500769 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, format, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600770 return result;
771}
772
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600773VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600774{
775 char str[1024];
776 if (!pCreateInfo) {
777 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBuffer is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600778 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600779 }
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600780 else if (!vk_validate_vkbuffercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600781 sprintf(str, "Parameter pCreateInfo to function CreateBuffer contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600782 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600783 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500784 VkResult result = device_dispatch_table(device)->CreateBuffer(device, pCreateInfo, pBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600785 return result;
786}
787
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600788VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, VkBufferView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600789{
790 char str[1024];
791 if (!pCreateInfo) {
792 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBufferView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600793 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600794 }
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600795 else if (!vk_validate_vkbufferviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600796 sprintf(str, "Parameter pCreateInfo to function CreateBufferView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600797 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600798 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500799 VkResult result = device_dispatch_table(device)->CreateBufferView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600800 return result;
801}
802
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600803void PreCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600804{
805 if(pCreateInfo == nullptr)
806 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600807 char const str[] = "vkCreateImage parameter, VkImageCreateInfo* pCreateInfo, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600808 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600809 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600810 return;
811 }
812
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600813 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600814 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600815 char const str[] = "vkCreateImage parameter, VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO "\
816 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600817 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600818 return;
819 }
820
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600821 if (!validate_VkImageType(pCreateInfo->imageType))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600822 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600823 char const str[] = "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600824 "unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600825 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600826 return;
827 }
828
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600829 if (!validate_VkFormat(pCreateInfo->format))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600830 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600831 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600832 "unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600833 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600834 return;
835 }
836
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600837 VkFormatProperties properties;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600838 size_t size = sizeof(properties);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500839 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->format,
Tony Barbour8205d902015-04-16 15:59:00 -0600840 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600841 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600842 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600843 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, cannot be "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600844 "validated (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600845 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600846 return;
847 }
848
849 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
850 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600851 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600852 "unsupported format (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600853 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600854 return;
855 }
856
857 // TODO: Can we check device-specific limits?
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600858 if (!vk_validate_vkextent3d(&pCreateInfo->extent))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600859 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600860 char const str[] = "vkCreateImage parameter, VkExtent3D pCreateInfo->extent, is invalid "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600861 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600862 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600863 return;
864 }
865
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600866 if (!validate_VkImageTiling(pCreateInfo->tiling))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600867 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600868 char const str[] = "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600869 "unrecoginized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600870 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600871 return;
872 }
873}
874
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600875void PostCreateImage(VkResult result, VkImage* pImage)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600876{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600877 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600878 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600879 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600880 char const str[] = "vkCreateImage failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600881 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600882 return;
883 }
884
885 if(pImage == nullptr)
886 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600887 char const str[] = "vkCreateImage parameter, VkImage* pImage, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600888 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600889 return;
890 }
891}
892
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600893VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600894{
895 PreCreateImage(device, pCreateInfo);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500896 VkResult result = device_dispatch_table(device)->CreateImage(device, pCreateInfo, pImage);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600897 PostCreateImage(result, pImage);
898 return result;
899}
900
Mike Stroyan230e6252015-04-17 12:36:38 -0600901VK_LAYER_EXPORT VkResult VKAPI vkGetImageSubresourceInfo(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600902{
903 char str[1024];
904 if (!pSubresource) {
905 sprintf(str, "Struct ptr parameter pSubresource to function GetImageSubresourceInfo is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600906 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600907 } else if (!vk_validate_vkimagesubresource(pSubresource)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600908 sprintf(str, "Parameter pSubresource to function GetImageSubresourceInfo contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600909 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600910 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600911 if (!validate_VkSubresourceInfoType(infoType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600912 sprintf(str, "Parameter infoType to function GetImageSubresourceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600913 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600914 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500915 VkResult result = device_dispatch_table(device)->GetImageSubresourceInfo(device, image, pSubresource, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600916 return result;
917}
918
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600919VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, VkImageView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600920{
921 char str[1024];
922 if (!pCreateInfo) {
923 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateImageView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600924 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600925 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600926 else if (!vk_validate_vkimageviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600927 sprintf(str, "Parameter pCreateInfo to function CreateImageView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600928 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600929 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500930 VkResult result = device_dispatch_table(device)->CreateImageView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600931 return result;
932}
933
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600934VK_LAYER_EXPORT VkResult VKAPI vkCreateColorAttachmentView(VkDevice device, const VkColorAttachmentViewCreateInfo* pCreateInfo, VkColorAttachmentView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600935{
936 char str[1024];
937 if (!pCreateInfo) {
938 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateColorAttachmentView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600939 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600940 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600941 else if (!vk_validate_vkcolorattachmentviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600942 sprintf(str, "Parameter pCreateInfo to function CreateColorAttachmentView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600943 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600944 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500945 VkResult result = device_dispatch_table(device)->CreateColorAttachmentView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600946 return result;
947}
948
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600949VK_LAYER_EXPORT VkResult VKAPI vkCreateDepthStencilView(VkDevice device, const VkDepthStencilViewCreateInfo* pCreateInfo, VkDepthStencilView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600950{
951 char str[1024];
952 if (!pCreateInfo) {
953 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDepthStencilView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600954 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600955 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600956 else if (!vk_validate_vkdepthstencilviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600957 sprintf(str, "Parameter pCreateInfo to function CreateDepthStencilView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600958 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600959 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500960 VkResult result = device_dispatch_table(device)->CreateDepthStencilView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600961 return result;
962}
963
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600964VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(VkDevice device, const VkShaderCreateInfo* pCreateInfo, VkShader* pShader)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600965{
966 char str[1024];
967 if (!pCreateInfo) {
968 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateShader is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600969 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600970 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600971 else if (!vk_validate_vkshadercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600972 sprintf(str, "Parameter pCreateInfo to function CreateShader contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600973 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600974 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500975 VkResult result = device_dispatch_table(device)->CreateShader(device, pCreateInfo, pShader);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600976 return result;
977}
978
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600979VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600980{
981 char str[1024];
982 if (!pCreateInfo) {
983 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipeline is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600984 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600985 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600986 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600987 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipeline contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600988 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600989 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500990 VkResult result = device_dispatch_table(device)->CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600991 return result;
992}
993
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600994VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelineDerivative(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600995{
996 char str[1024];
997 if (!pCreateInfo) {
998 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipelineDerivative is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600999 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001000 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001001 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001002 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipelineDerivative contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001003 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001004 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001005 VkResult result = device_dispatch_table(device)->CreateGraphicsPipelineDerivative(device, pCreateInfo, basePipeline, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001006 return result;
1007}
1008
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001009VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipeline(VkDevice device, const VkComputePipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001010{
1011 char str[1024];
1012 if (!pCreateInfo) {
1013 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateComputePipeline is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001014 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001015 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001016 else if (!vk_validate_vkcomputepipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001017 sprintf(str, "Parameter pCreateInfo to function CreateComputePipeline contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001018 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001019 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001020 VkResult result = device_dispatch_table(device)->CreateComputePipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001021 return result;
1022}
1023
Mike Stroyan230e6252015-04-17 12:36:38 -06001024VK_LAYER_EXPORT VkResult VKAPI vkStorePipeline(VkDevice device, VkPipeline pipeline, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001025{
1026
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001027 VkResult result = device_dispatch_table(device)->StorePipeline(device, pipeline, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001028 return result;
1029}
1030
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001031VK_LAYER_EXPORT VkResult VKAPI vkLoadPipeline(VkDevice device, size_t dataSize, const void* pData, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001032{
1033
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001034 VkResult result = device_dispatch_table(device)->LoadPipeline(device, dataSize, pData, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001035 return result;
1036}
1037
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001038VK_LAYER_EXPORT VkResult VKAPI vkLoadPipelineDerivative(VkDevice device, size_t dataSize, const void* pData, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001039{
1040
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001041 VkResult result = device_dispatch_table(device)->LoadPipelineDerivative(device, dataSize, pData, basePipeline, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001042 return result;
1043}
1044
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001045VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, VkSampler* pSampler)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001046{
1047 char str[1024];
1048 if (!pCreateInfo) {
1049 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSampler is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001050 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001051 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001052 else if (!vk_validate_vksamplercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001053 sprintf(str, "Parameter pCreateInfo to function CreateSampler contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001054 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001055 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001056 VkResult result = device_dispatch_table(device)->CreateSampler(device, pCreateInfo, pSampler);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001057 return result;
1058}
1059
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001060VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayout* pSetLayout)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001061{
1062 char str[1024];
1063 if (!pCreateInfo) {
1064 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorSetLayout is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001065 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001066 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001067 else if (!vk_validate_vkdescriptorsetlayoutcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001068 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorSetLayout contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001069 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001070 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001071 VkResult result = device_dispatch_table(device)->CreateDescriptorSetLayout(device, pCreateInfo, pSetLayout);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001072 return result;
1073}
1074
Mark Lobodzinski556f7212015-04-17 14:11:39 -05001075VK_LAYER_EXPORT VkResult VKAPI vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, VkPipelineLayout* pPipelineLayout)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001076{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001077 VkResult result = device_dispatch_table(device)->CreatePipelineLayout(device, pCreateInfo, pPipelineLayout);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001078 return result;
1079}
1080
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001081VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorPool(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001082{
1083 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001084 if (!validate_VkDescriptorPoolUsage(poolUsage)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001085 sprintf(str, "Parameter poolUsage to function CreateDescriptorPool has invalid value of %i.", (int)poolUsage);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001086 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001087 }
1088 if (!pCreateInfo) {
1089 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorPool is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001090 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001091 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001092 else if (!vk_validate_vkdescriptorpoolcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001093 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorPool contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001094 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001095 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001096 VkResult result = device_dispatch_table(device)->CreateDescriptorPool(device, poolUsage, maxSets, pCreateInfo, pDescriptorPool);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001097 return result;
1098}
1099
Mike Stroyan230e6252015-04-17 12:36:38 -06001100VK_LAYER_EXPORT VkResult VKAPI vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001101{
1102
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001103 VkResult result = device_dispatch_table(device)->ResetDescriptorPool(device, descriptorPool);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001104 return result;
1105}
1106
Mike Stroyan230e6252015-04-17 12:36:38 -06001107VK_LAYER_EXPORT VkResult VKAPI vkAllocDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorSetUsage setUsage, uint32_t count, const VkDescriptorSetLayout* pSetLayouts, VkDescriptorSet* pDescriptorSets, uint32_t* pCount)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001108{
1109 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001110 if (!validate_VkDescriptorSetUsage(setUsage)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001111 sprintf(str, "Parameter setUsage to function AllocDescriptorSets has invalid value of %i.", (int)setUsage);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001112 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001113 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001114 VkResult result = device_dispatch_table(device)->AllocDescriptorSets(device, descriptorPool, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001115 return result;
1116}
1117
Mike Stroyan230e6252015-04-17 12:36:38 -06001118VK_LAYER_EXPORT void VKAPI vkClearDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, const VkDescriptorSet* pDescriptorSets)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001119{
1120
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001121 device_dispatch_table(device)->ClearDescriptorSets(device, descriptorPool, count, pDescriptorSets);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001122}
1123
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001124VK_LAYER_EXPORT VkResult VKAPI vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001125{
1126
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001127 return device_dispatch_table(device)->UpdateDescriptorSets(device, writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001128}
1129
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001130VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(VkDevice device, const VkDynamicVpStateCreateInfo* pCreateInfo, VkDynamicVpState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001131{
1132 char str[1024];
1133 if (!pCreateInfo) {
1134 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicViewportState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001135 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001136 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001137 else if (!vk_validate_vkdynamicvpstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001138 sprintf(str, "Parameter pCreateInfo to function CreateDynamicViewportState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001139 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001140 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001141 VkResult result = device_dispatch_table(device)->CreateDynamicViewportState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001142 return result;
1143}
1144
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001145VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterState(VkDevice device, const VkDynamicRsStateCreateInfo* pCreateInfo, VkDynamicRsState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001146{
1147 char str[1024];
1148 if (!pCreateInfo) {
1149 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicRasterState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001150 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001151 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001152 else if (!vk_validate_vkdynamicrsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001153 sprintf(str, "Parameter pCreateInfo to function CreateDynamicRasterState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001154 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001155 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001156 VkResult result = device_dispatch_table(device)->CreateDynamicRasterState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001157 return result;
1158}
1159
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001160VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState(VkDevice device, const VkDynamicCbStateCreateInfo* pCreateInfo, VkDynamicCbState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001161{
1162 char str[1024];
1163 if (!pCreateInfo) {
1164 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicColorBlendState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001165 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001166 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001167 else if (!vk_validate_vkdynamiccbstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001168 sprintf(str, "Parameter pCreateInfo to function CreateDynamicColorBlendState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001169 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001170 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001171 VkResult result = device_dispatch_table(device)->CreateDynamicColorBlendState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001172 return result;
1173}
1174
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001175VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState(VkDevice device, const VkDynamicDsStateCreateInfo* pCreateInfo, VkDynamicDsState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001176{
1177 char str[1024];
1178 if (!pCreateInfo) {
1179 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicDepthStencilState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001180 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001181 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001182 else if (!vk_validate_vkdynamicdsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001183 sprintf(str, "Parameter pCreateInfo to function CreateDynamicDepthStencilState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001184 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001185 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001186 VkResult result = device_dispatch_table(device)->CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001187 return result;
1188}
1189
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001190void PreCreateCommandBuffer(VkDevice device, const VkCmdBufferCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001191{
1192 if(device == nullptr)
1193 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001194 char const str[] = "vkCreateCommandBuffer parameter, VkDevice device, is "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001195 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001196 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001197 return;
1198 }
1199
1200 if(pCreateInfo == nullptr)
1201 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001202 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBufferCreateInfo* pCreateInfo, is "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001203 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001204 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001205 return;
1206 }
1207
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001208 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001209 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001210 char const str[] = "vkCreateCommandBuffer parameter, VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO "\
1211 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001212 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001213 return;
1214 }
1215}
1216
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001217void PostCreateCommandBuffer(VkResult result, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001218{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001219 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001220 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001221 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001222 char const str[] = "vkCreateCommandBuffer failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001223 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001224 return;
1225 }
1226
1227 if(pCmdBuffer == nullptr)
1228 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001229 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBuffer* pCmdBuffer, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001230 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001231 return;
1232 }
1233}
1234
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001235VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(VkDevice device,
1236 const VkCmdBufferCreateInfo* pCreateInfo, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001237{
1238 PreCreateCommandBuffer(device, pCreateInfo);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001239 VkResult result = device_dispatch_table(device)->CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001240 PostCreateCommandBuffer(result, pCmdBuffer);
1241 return result;
1242}
1243
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001244VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001245{
1246 char str[1024];
1247 if (!pBeginInfo) {
1248 sprintf(str, "Struct ptr parameter pBeginInfo to function BeginCommandBuffer is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001249 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001250 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001251 else if (!vk_validate_vkcmdbufferbegininfo(pBeginInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001252 sprintf(str, "Parameter pBeginInfo to function BeginCommandBuffer contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001253 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001254 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001255 VkResult result = device_dispatch_table(cmdBuffer)->BeginCommandBuffer(cmdBuffer, pBeginInfo);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001256 return result;
1257}
1258
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001259VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001260{
1261
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001262 VkResult result = device_dispatch_table(cmdBuffer)->EndCommandBuffer(cmdBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001263 return result;
1264}
1265
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001266VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001267{
1268
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001269 VkResult result = device_dispatch_table(cmdBuffer)->ResetCommandBuffer(cmdBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001270 return result;
1271}
1272
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001273VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001274{
1275 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001276 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001277 sprintf(str, "Parameter pipelineBindPoint to function CmdBindPipeline has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001278 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001279 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001280 device_dispatch_table(cmdBuffer)->CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001281}
1282
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001283VK_LAYER_EXPORT void VKAPI vkCmdBindDynamicStateObject(VkCmdBuffer cmdBuffer, VkStateBindPoint stateBindPoint, VkDynamicStateObject state)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001284{
1285 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001286 if (!validate_VkStateBindPoint(stateBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001287 sprintf(str, "Parameter stateBindPoint to function CmdBindDynamicStateObject has invalid value of %i.", (int)stateBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001288 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001289 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001290 device_dispatch_table(cmdBuffer)->CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001291}
1292
Cody Northrop1a01b1d2015-04-16 13:41:56 -06001293VK_LAYER_EXPORT void VKAPI vkCmdBindDescriptorSets(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t firstSet, uint32_t setCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001294{
1295 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001296 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001297 sprintf(str, "Parameter pipelineBindPoint to function CmdBindDescriptorSets has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001298 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001299 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001300 device_dispatch_table(cmdBuffer)->CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001301}
1302
Courtney Goeltzenleuchter46962942015-04-16 13:38:46 -06001303VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
1304 VkCmdBuffer cmdBuffer,
1305 uint32_t startBinding,
1306 uint32_t bindingCount,
1307 const VkBuffer* pBuffers,
Tony Barbour8205d902015-04-16 15:59:00 -06001308 const VkDeviceSize* pOffsets)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001309{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001310 device_dispatch_table(cmdBuffer)->CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001311}
1312
Tony Barbour8205d902015-04-16 15:59:00 -06001313VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001314{
1315 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001316 if (!validate_VkIndexType(indexType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001317 sprintf(str, "Parameter indexType to function CmdBindIndexBuffer has invalid value of %i.", (int)indexType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001318 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001319 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001320 device_dispatch_table(cmdBuffer)->CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001321}
1322
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001323VK_LAYER_EXPORT void VKAPI vkCmdDraw(VkCmdBuffer cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001324{
1325
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001326 device_dispatch_table(cmdBuffer)->CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001327}
1328
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001329VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexed(VkCmdBuffer cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001330{
1331
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001332 device_dispatch_table(cmdBuffer)->CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001333}
1334
Tony Barbour8205d902015-04-16 15:59:00 -06001335VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001336{
1337
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001338 device_dispatch_table(cmdBuffer)->CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001339}
1340
Tony Barbour8205d902015-04-16 15:59:00 -06001341VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001342{
1343
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001344 device_dispatch_table(cmdBuffer)->CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001345}
1346
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001347VK_LAYER_EXPORT void VKAPI vkCmdDispatch(VkCmdBuffer cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001348{
1349
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001350 device_dispatch_table(cmdBuffer)->CmdDispatch(cmdBuffer, x, y, z);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001351}
1352
Tony Barbour8205d902015-04-16 15:59:00 -06001353VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001354{
1355
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001356 device_dispatch_table(cmdBuffer)->CmdDispatchIndirect(cmdBuffer, buffer, offset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001357}
1358
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001359VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkBuffer destBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001360{
1361 char str[1024];
1362 uint32_t i;
1363 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001364 if (!vk_validate_vkbuffercopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001365 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBuffer contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001366 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001367 }
1368 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001369 device_dispatch_table(cmdBuffer)->CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001370}
1371
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001372VK_LAYER_EXPORT void VKAPI vkCmdCopyImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageCopy* pRegions)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001373{
1374 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001375 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001376 sprintf(str, "Parameter srcImageLayout to function CmdCopyImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001377 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001378 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001379 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001380 sprintf(str, "Parameter destImageLayout to function CmdCopyImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001381 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001382 }
1383 uint32_t i;
1384 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001385 if (!vk_validate_vkimagecopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001386 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001387 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001388 }
1389 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001390 device_dispatch_table(cmdBuffer)->CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001391}
1392
Mark Lobodzinski20f68592015-05-22 14:43:25 -05001393VK_LAYER_EXPORT void VKAPI vkCmdBlitImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkTexFilter filter)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001394{
1395 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001396 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001397 sprintf(str, "Parameter srcImageLayout to function CmdBlitImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001398 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001399 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001400 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001401 sprintf(str, "Parameter destImageLayout to function CmdBlitImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001402 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001403 }
1404 uint32_t i;
1405 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001406 if (!vk_validate_vkimageblit(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001407 sprintf(str, "Parameter pRegions[%i] to function CmdBlitImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001408 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001409 }
1410 }
Mark Lobodzinski20f68592015-05-22 14:43:25 -05001411 //TODO: Add additional check for limitation from header rev 96.
1412 // VK_TEX_FILTER_NEAREST if the format that srcImage was created with is an integer-based format.
1413
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001414 device_dispatch_table(cmdBuffer)->CmdBlitImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001415}
1416
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001417VK_LAYER_EXPORT void VKAPI vkCmdCopyBufferToImage(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001418{
1419 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001420 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001421 sprintf(str, "Parameter destImageLayout to function CmdCopyBufferToImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001422 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001423 }
1424 uint32_t i;
1425 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001426 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001427 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBufferToImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001428 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001429 }
1430 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001431 device_dispatch_table(cmdBuffer)->CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001432}
1433
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001434VK_LAYER_EXPORT void VKAPI vkCmdCopyImageToBuffer(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer destBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001435{
1436 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001437 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001438 sprintf(str, "Parameter srcImageLayout to function CmdCopyImageToBuffer has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001439 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001440 }
1441 uint32_t i;
1442 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001443 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001444 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImageToBuffer contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001445 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001446 }
1447 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001448 device_dispatch_table(cmdBuffer)->CmdCopyImageToBuffer(cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001449}
1450
Tony Barbour8205d902015-04-16 15:59:00 -06001451VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001452{
1453
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001454 device_dispatch_table(cmdBuffer)->CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001455}
1456
Tony Barbour8205d902015-04-16 15:59:00 -06001457VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001458{
1459
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001460 device_dispatch_table(cmdBuffer)->CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001461}
1462
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -06001463VK_LAYER_EXPORT void VKAPI vkCmdClearColorImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColor* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001464{
1465 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001466 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001467 sprintf(str, "Parameter imageLayout to function CmdClearColorImage has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001468 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001469 }
1470 uint32_t i;
1471 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001472 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001473 sprintf(str, "Parameter pRanges[%i] to function CmdClearColorImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001474 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001475 }
1476 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001477 device_dispatch_table(cmdBuffer)->CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001478}
1479
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001480VK_LAYER_EXPORT void VKAPI vkCmdClearDepthStencil(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001481{
1482 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001483 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001484 sprintf(str, "Parameter imageLayout to function CmdClearDepthStencil has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001485 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001486 }
1487 uint32_t i;
1488 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001489 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001490 sprintf(str, "Parameter pRanges[%i] to function CmdClearDepthStencil contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001491 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001492 }
1493 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001494 device_dispatch_table(cmdBuffer)->CmdClearDepthStencil(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001495}
1496
Tony Barbour11f74372015-04-13 15:02:52 -06001497VK_LAYER_EXPORT void VKAPI vkCmdResolveImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageResolve* pRegions)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001498{
1499 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001500 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001501 sprintf(str, "Parameter srcImageLayout to function CmdResolveImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001502 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001503 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001504 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001505 sprintf(str, "Parameter destImageLayout to function CmdResolveImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001506 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001507 }
1508 uint32_t i;
Tony Barbour11f74372015-04-13 15:02:52 -06001509 for (i = 0; i < regionCount; i++) {
1510 if (!vk_validate_vkimageresolve(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001511 sprintf(str, "Parameter pRects[%i] to function CmdResolveImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001512 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001513 }
1514 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001515 device_dispatch_table(cmdBuffer)->CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001516}
1517
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001518VK_LAYER_EXPORT void VKAPI vkCmdSetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001519{
1520 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001521 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001522 sprintf(str, "Parameter pipeEvent to function CmdSetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001523 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001524 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001525 device_dispatch_table(cmdBuffer)->CmdSetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001526}
1527
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001528VK_LAYER_EXPORT void VKAPI vkCmdResetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001529{
1530 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001531 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001532 sprintf(str, "Parameter pipeEvent to function CmdResetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001533 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001534 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001535 device_dispatch_table(cmdBuffer)->CmdResetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001536}
1537
Tony Barbour8205d902015-04-16 15:59:00 -06001538VK_LAYER_EXPORT void VKAPI vkCmdWaitEvents(VkCmdBuffer cmdBuffer, VkWaitEvent waitEvent, uint32_t eventCount, const VkEvent* pEvents, uint32_t memBarrierCount, const void** ppMemBarriers)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001539{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001540 device_dispatch_table(cmdBuffer)->CmdWaitEvents(cmdBuffer, waitEvent, eventCount, pEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001541}
1542
Tony Barbour8205d902015-04-16 15:59:00 -06001543VK_LAYER_EXPORT void VKAPI vkCmdPipelineBarrier(VkCmdBuffer cmdBuffer, VkWaitEvent waitEvent, uint32_t pipeEventCount, const VkPipeEvent* pPipeEvents, uint32_t memBarrierCount, const void** ppMemBarriers)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001544{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001545 device_dispatch_table(cmdBuffer)->CmdPipelineBarrier(cmdBuffer, waitEvent, pipeEventCount, pPipeEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001546}
1547
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001548VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001549{
1550
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001551 device_dispatch_table(cmdBuffer)->CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001552}
1553
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001554VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001555{
1556
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001557 device_dispatch_table(cmdBuffer)->CmdEndQuery(cmdBuffer, queryPool, slot);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001558}
1559
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001560VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001561{
1562
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001563 device_dispatch_table(cmdBuffer)->CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001564}
1565
Tony Barbour8205d902015-04-16 15:59:00 -06001566VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkTimestampType timestampType, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001567{
1568 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001569 if (!validate_VkTimestampType(timestampType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001570 sprintf(str, "Parameter timestampType to function CmdWriteTimestamp has invalid value of %i.", (int)timestampType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001571 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001572 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001573 device_dispatch_table(cmdBuffer)->CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001574}
1575
Jeremy Hayescf469132015-04-17 10:36:53 -06001576VK_LAYER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(
1577 VkCmdBuffer cmdBuffer,
1578 VkQueryPool queryPool,
1579 uint32_t startQuery,
1580 uint32_t queryCount,
1581 VkBuffer destBuffer,
1582 VkDeviceSize destOffset,
1583 VkDeviceSize destStride,
1584 VkQueryResultFlags flags)
1585{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001586 device_dispatch_table(cmdBuffer)->CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, destStride, flags);
Jeremy Hayescf469132015-04-17 10:36:53 -06001587}
1588
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001589VK_LAYER_EXPORT void VKAPI vkCmdInitAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, const uint32_t* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001590{
1591 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001592 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001593 sprintf(str, "Parameter pipelineBindPoint to function CmdInitAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001594 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001595 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001596 device_dispatch_table(cmdBuffer)->CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001597}
1598
Tony Barbour8205d902015-04-16 15:59:00 -06001599VK_LAYER_EXPORT void VKAPI vkCmdLoadAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, VkBuffer srcBuffer, VkDeviceSize srcOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001600{
1601 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001602 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001603 sprintf(str, "Parameter pipelineBindPoint to function CmdLoadAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001604 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001605 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001606 device_dispatch_table(cmdBuffer)->CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001607}
1608
Tony Barbour8205d902015-04-16 15:59:00 -06001609VK_LAYER_EXPORT void VKAPI vkCmdSaveAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001610{
1611 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001612 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001613 sprintf(str, "Parameter pipelineBindPoint to function CmdSaveAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001614 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001615 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001616 device_dispatch_table(cmdBuffer)->CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001617}
1618
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001619VK_LAYER_EXPORT VkResult VKAPI vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, VkFramebuffer* pFramebuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001620{
1621 char str[1024];
1622 if (!pCreateInfo) {
1623 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFramebuffer is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001624 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001625 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001626 else if (!vk_validate_vkframebuffercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001627 sprintf(str, "Parameter pCreateInfo to function CreateFramebuffer contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001628 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001629 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001630 VkResult result = device_dispatch_table(device)->CreateFramebuffer(device, pCreateInfo, pFramebuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001631 return result;
1632}
1633
1634
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001635void PreCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001636{
1637 if(pCreateInfo == nullptr)
1638 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001639 char const str[] = "vkCreateRenderPass parameter, VkRenderPassCreateInfo* pCreateInfo, is "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001640 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001641 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001642 return;
1643 }
1644
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001645 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001646 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001647 char const str[] = "vkCreateRenderPass parameter, VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO "\
1648 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001649 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001650 return;
1651 }
1652
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001653 if(!vk_validate_vkrect(&pCreateInfo->renderArea))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001654 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001655 char const str[] = "vkCreateRenderPass parameter, VkRect pCreateInfo->renderArea, is invalid "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001656 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001657 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001658 return;
1659 }
1660
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001661 if(!vk_validate_vkextent2d(&pCreateInfo->extent))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001662 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001663 char const str[] = "vkCreateRenderPass parameter, VkExtent2D pCreateInfo->extent, is invalid "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001664 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001665 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001666 return;
1667 }
1668
1669 if(pCreateInfo->pColorFormats == nullptr)
1670 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001671 char const str[] = "vkCreateRenderPass parameter, VkFormat* pCreateInfo->pColorFormats, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001672 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001673 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001674 return;
1675 }
1676
1677 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1678 {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001679 if(!validate_VkFormat(pCreateInfo->pColorFormats[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001680 {
1681 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001682 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001683 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001684 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001685 continue;
1686 }
1687
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001688 VkFormatProperties properties;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001689 size_t size = sizeof(properties);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001690 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->pColorFormats[i],
Tony Barbour8205d902015-04-16 15:59:00 -06001691 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001692 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001693 {
1694 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001695 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001696 "], cannot be validated (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001697 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001698 continue;
1699 }
1700
1701 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1702 {
1703 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001704 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001705 "], contains unsupported format (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001706 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001707 continue;
1708 }
1709
1710 }
1711
1712 if(pCreateInfo->pColorLayouts == nullptr)
1713 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001714 char const str[] = "vkCreateRenderPass parameter, VkImageLayout* pCreateInfo->pColorLayouts, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001715 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001716 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001717 return;
1718 }
1719
1720 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1721 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001722 if(!validate_VkImageLayout(pCreateInfo->pColorLayouts[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001723 {
1724 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001725 ss << "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pColorLayouts[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001726 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001727 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001728 continue;
1729 }
1730 }
1731
1732 if(pCreateInfo->pColorLoadOps == nullptr)
1733 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001734 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp* pCreateInfo->pColorLoadOps, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001735 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001736 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001737 return;
1738 }
1739
1740 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1741 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001742 if(!validate_VkAttachmentLoadOp(pCreateInfo->pColorLoadOps[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001743 {
1744 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001745 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pColorLoadOps[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001746 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001747 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001748 continue;
1749 }
1750 }
1751
1752 if(pCreateInfo->pColorStoreOps == nullptr)
1753 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001754 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp* pCreateInfo->pColorStoreOps, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001755 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001756 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001757 return;
1758 }
1759
1760 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1761 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001762 if(!validate_VkAttachmentStoreOp(pCreateInfo->pColorStoreOps[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001763 {
1764 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001765 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pColorStoreOps[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001766 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001767 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001768 continue;
1769 }
1770 }
1771
1772 if(pCreateInfo->pColorLoadClearValues == nullptr)
1773 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001774 char const str[] = "vkCreateRenderPass parameter, VkClearColor* pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001775 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001776 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001777 return;
1778 }
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001779
1780 if(pCreateInfo->pColorStoreOps == nullptr)
1781 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001782 char const str[] = "vkCreateRenderPass parameter, VK_ATTACHMENT_STORE_OP* pCreateInfo->pColorStoreOps, "\
Jeremy Hayes9bafb9f2015-04-07 13:38:03 -06001783 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001784 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001785 return;
1786 }
1787
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001788 if(pCreateInfo->pColorLoadClearValues == nullptr)
1789 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001790 char const str[] = "vkCreateRenderPass parameter, VK_CLEAR_COLOR* pCreateInfo->"\
Jeremy Hayes9bafb9f2015-04-07 13:38:03 -06001791 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001792 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001793 return;
1794 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001795
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001796 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1797 {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001798 if(!vk_validate_vkclearcolor(&(pCreateInfo->pColorLoadClearValues[i])))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001799 {
1800 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001801 ss << "vkCreateRenderPass parameter, VkClearColor pCreateInfo->pColorLoadClearValues[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001802 "], is invalid (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001803 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001804 continue;
1805 }
1806 }
1807
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001808 if(!validate_VkFormat(pCreateInfo->depthStencilFormat))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001809 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001810 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001811 "depthStencilFormat, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001812 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001813 return;
1814 }
1815
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001816 VkFormatProperties properties;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001817 size_t size = sizeof(properties);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001818 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->depthStencilFormat,
Tony Barbour8205d902015-04-16 15:59:00 -06001819 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001820 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001821 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001822 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001823 "depthStencilFormat, cannot be validated (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001824 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001825 return;
1826 }
1827
1828 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1829 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001830 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001831 "depthStencilFormat, contains unsupported format (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001832 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001833 return;
1834 }
1835
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001836 if(!validate_VkImageLayout(pCreateInfo->depthStencilLayout))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001837 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001838 char const str[] = "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001839 "depthStencilLayout, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001840 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001841 return;
1842 }
1843
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001844 if(!validate_VkAttachmentLoadOp(pCreateInfo->depthLoadOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001845 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001846 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001847 "depthLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001848 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001849 return;
1850 }
1851
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001852 if(!validate_VkAttachmentStoreOp(pCreateInfo->depthStoreOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001853 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001854 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001855 "depthStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001856 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001857 return;
1858 }
1859
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001860 if(!validate_VkAttachmentLoadOp(pCreateInfo->stencilLoadOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001861 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001862 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001863 "stencilLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001864 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001865 return;
1866 }
1867
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001868 if(!validate_VkAttachmentStoreOp(pCreateInfo->stencilStoreOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001869 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001870 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001871 "stencilStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001872 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001873 return;
1874 }
1875}
1876
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001877void PostCreateRenderPass(VkResult result, VkRenderPass* pRenderPass)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001878{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001879 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001880 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001881 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001882 char const str[] = "vkCreateRenderPass failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001883 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001884 return;
1885 }
1886
1887 if(pRenderPass == nullptr)
1888 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001889 char const str[] = "vkCreateRenderPass parameter, VkRenderPass* pRenderPass, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001890 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001891 return;
1892 }
1893}
1894
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001895VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, VkRenderPass* pRenderPass)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001896{
1897 PreCreateRenderPass(device, pCreateInfo);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001898 VkResult result = device_dispatch_table(device)->CreateRenderPass(device, pCreateInfo, pRenderPass);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001899 PostCreateRenderPass(result, pRenderPass);
1900 return result;
1901}
1902
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001903VK_LAYER_EXPORT void VKAPI vkCmdBeginRenderPass(VkCmdBuffer cmdBuffer, const VkRenderPassBegin* pRenderPassBegin)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001904{
1905 char str[1024];
1906 if (!pRenderPassBegin) {
1907 sprintf(str, "Struct ptr parameter pRenderPassBegin to function CmdBeginRenderPass is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001908 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001909 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001910 else if (!vk_validate_vkrenderpassbegin(pRenderPassBegin)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001911 sprintf(str, "Parameter pRenderPassBegin to function CmdBeginRenderPass contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001912 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001913 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001914 device_dispatch_table(cmdBuffer)->CmdBeginRenderPass(cmdBuffer, pRenderPassBegin);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001915}
1916
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001917VK_LAYER_EXPORT void VKAPI vkCmdEndRenderPass(VkCmdBuffer cmdBuffer, VkRenderPass renderPass)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001918{
1919
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001920 device_dispatch_table(cmdBuffer)->CmdEndRenderPass(cmdBuffer, renderPass);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001921}
1922
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001923VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback(
1924 VkInstance instance,
1925 VkFlags msgFlags,
1926 const PFN_vkDbgMsgCallback pfnMsgCallback,
1927 void* pUserData,
1928 VkDbgMsgCallback* pMsgCallback)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001929{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001930 VkLayerInstanceDispatchTable *pDisp = *(VkLayerInstanceDispatchTable **) instance;
1931 VkLayerInstanceDispatchTable *pTable = tableInstanceMap[pDisp];
1932 return layer_create_msg_callback(instance, pTable, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001933}
1934
Courtney Goeltzenleuchter09f85042015-06-01 14:45:27 -06001935VK_LAYER_EXPORT VkResult VKAPI vkDbgDestroyMsgCallback(
1936 VkInstance instance,
1937 VkDbgMsgCallback msgCallback)
1938{
1939 VkLayerInstanceDispatchTable *pDisp = *(VkLayerInstanceDispatchTable **) instance;
1940 VkLayerInstanceDispatchTable *pTable = tableInstanceMap[pDisp];
1941 return layer_destroy_msg_callback(instance, pTable, msgCallback);
1942}
1943
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001944VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerBegin(VkCmdBuffer cmdBuffer, const char* pMarker)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001945{
Jon Ashburn6f8cd632015-06-01 09:37:38 -06001946 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) cmdBuffer;
1947 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburnf0615e22015-05-25 14:11:37 -06001948 char const str[] = "Attempt to use CmdDbgMarkerBegin but extension disabled!";
1949 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburn6f8cd632015-06-01 09:37:38 -06001950 return;
Jon Ashburnf0615e22015-05-25 14:11:37 -06001951 }
Jon Ashburn6f8cd632015-06-01 09:37:38 -06001952 debug_marker_dispatch_table(cmdBuffer)->CmdDbgMarkerBegin(cmdBuffer, pMarker);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001953}
1954
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001955VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerEnd(VkCmdBuffer cmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001956{
Jon Ashburn6f8cd632015-06-01 09:37:38 -06001957 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) cmdBuffer;
1958 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburnf0615e22015-05-25 14:11:37 -06001959 char const str[] = "Attempt to use CmdDbgMarkerEnd but extension disabled!";
1960 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburn6f8cd632015-06-01 09:37:38 -06001961 return;
Jon Ashburnf0615e22015-05-25 14:11:37 -06001962 }
Jon Ashburn6f8cd632015-06-01 09:37:38 -06001963 debug_marker_dispatch_table(cmdBuffer)->CmdDbgMarkerEnd(cmdBuffer);
Jon Ashburnf0615e22015-05-25 14:11:37 -06001964}
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001965
Jon Ashburnf0615e22015-05-25 14:11:37 -06001966VkResult VKAPI vkDbgSetObjectTag(VkDevice device, VkObjectType objType, VkObject object, size_t tagSize, const void* pTag)
1967{
Jon Ashburn6f8cd632015-06-01 09:37:38 -06001968 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
1969 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburnf0615e22015-05-25 14:11:37 -06001970 char const str[] = "Attempt to use DbgSetObjectTag but extension disabled!";
1971 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburn6f8cd632015-06-01 09:37:38 -06001972 return VK_ERROR_UNAVAILABLE;
Jon Ashburnf0615e22015-05-25 14:11:37 -06001973 }
Jon Ashburn6f8cd632015-06-01 09:37:38 -06001974 debug_marker_dispatch_table(device)->DbgSetObjectTag(device, objType, object, tagSize, pTag);
Jon Ashburnf0615e22015-05-25 14:11:37 -06001975}
1976
1977VkResult VKAPI vkDbgSetObjectName(VkDevice device, VkObjectType objType, VkObject object, size_t nameSize, const char* pName)
1978{
Jon Ashburn6f8cd632015-06-01 09:37:38 -06001979 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
1980 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburnf0615e22015-05-25 14:11:37 -06001981 char const str[] = "Attempt to use DbgSetObjectName but extension disabled!";
1982 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburn6f8cd632015-06-01 09:37:38 -06001983 return VK_ERROR_UNAVAILABLE;
Jon Ashburnf0615e22015-05-25 14:11:37 -06001984 }
Jon Ashburn6f8cd632015-06-01 09:37:38 -06001985 debug_marker_dispatch_table(device)->DbgSetObjectName(device, objType, object, nameSize, pName);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001986}
1987
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001988VK_LAYER_EXPORT VkResult VKAPI vkGetDisplayInfoWSI(VkDisplayWSI display, VkDisplayInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001989{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001990 VkResult result = instance_dispatch_table(display)->GetDisplayInfoWSI(display, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001991 return result;
1992}
1993
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001994VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI(VkDevice device, const VkSwapChainCreateInfoWSI* pCreateInfo, VkSwapChainWSI* pSwapChain)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001995{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001996 VkResult result = device_dispatch_table(device)->CreateSwapChainWSI(device, pCreateInfo, pSwapChain);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001997 return result;
1998}
1999
Chia-I Wu5b66aa52015-04-16 22:02:10 +08002000VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapChainWSI(VkSwapChainWSI swapChain)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002001{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002002 VkResult result = device_dispatch_table(swapChain)->DestroySwapChainWSI(swapChain);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002003 return result;
2004}
2005
Chia-I Wu5b66aa52015-04-16 22:02:10 +08002006VK_LAYER_EXPORT VkResult VKAPI vkGetSwapChainInfoWSI(VkSwapChainWSI swapChain, VkSwapChainInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002007{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002008 VkResult result = device_dispatch_table(swapChain)->GetSwapChainInfoWSI(swapChain, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002009 return result;
2010}
2011
Chia-I Wu5b66aa52015-04-16 22:02:10 +08002012VK_LAYER_EXPORT VkResult VKAPI vkQueuePresentWSI(VkQueue queue, const VkPresentInfoWSI* pPresentInfo)
2013{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002014 VkResult result = device_dispatch_table(queue)->QueuePresentWSI(queue, pPresentInfo);
Chia-I Wu5b66aa52015-04-16 22:02:10 +08002015 return result;
2016}
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002017
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002018static inline void* layer_intercept_proc(const char *name)
2019{
2020 if (!name || name[0] != 'v' || name[1] != 'k')
2021 return NULL;
2022
2023 name += 2;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002024 if (!strcmp(name, "DestroyDevice"))
2025 return (void*) vkDestroyDevice;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002026 if (!strcmp(name, "GetDeviceQueue"))
2027 return (void*) vkGetDeviceQueue;
2028 if (!strcmp(name, "QueueSubmit"))
2029 return (void*) vkQueueSubmit;
2030 if (!strcmp(name, "QueueWaitIdle"))
2031 return (void*) vkQueueWaitIdle;
2032 if (!strcmp(name, "DeviceWaitIdle"))
2033 return (void*) vkDeviceWaitIdle;
2034 if (!strcmp(name, "AllocMemory"))
2035 return (void*) vkAllocMemory;
2036 if (!strcmp(name, "FreeMemory"))
2037 return (void*) vkFreeMemory;
2038 if (!strcmp(name, "SetMemoryPriority"))
2039 return (void*) vkSetMemoryPriority;
2040 if (!strcmp(name, "MapMemory"))
2041 return (void*) vkMapMemory;
2042 if (!strcmp(name, "UnmapMemory"))
2043 return (void*) vkUnmapMemory;
2044 if (!strcmp(name, "FlushMappedMemoryRanges"))
2045 return (void*) vkFlushMappedMemoryRanges;
2046 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
2047 return (void*) vkInvalidateMappedMemoryRanges;
2048 if (!strcmp(name, "PinSystemMemory"))
2049 return (void*) vkPinSystemMemory;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002050 if (!strcmp(name, "OpenSharedMemory"))
2051 return (void*) vkOpenSharedMemory;
2052 if (!strcmp(name, "OpenSharedSemaphore"))
2053 return (void*) vkOpenSharedSemaphore;
2054 if (!strcmp(name, "OpenPeerMemory"))
2055 return (void*) vkOpenPeerMemory;
2056 if (!strcmp(name, "OpenPeerImage"))
2057 return (void*) vkOpenPeerImage;
2058 if (!strcmp(name, "DestroyObject"))
2059 return (void*) vkDestroyObject;
2060 if (!strcmp(name, "GetObjectInfo"))
2061 return (void*) vkGetObjectInfo;
2062 if (!strcmp(name, "CreateFence"))
2063 return (void*) vkCreateFence;
2064 if (!strcmp(name, "ResetFences"))
2065 return (void*) vkResetFences;
2066 if (!strcmp(name, "GetFenceStatus"))
2067 return (void*) vkGetFenceStatus;
2068 if (!strcmp(name, "WaitForFences"))
2069 return (void*) vkWaitForFences;
2070 if (!strcmp(name, "CreateSemaphore"))
2071 return (void*) vkCreateSemaphore;
2072 if (!strcmp(name, "QueueSignalSemaphore"))
2073 return (void*) vkQueueSignalSemaphore;
2074 if (!strcmp(name, "QueueWaitSemaphore"))
2075 return (void*) vkQueueWaitSemaphore;
2076 if (!strcmp(name, "CreateEvent"))
2077 return (void*) vkCreateEvent;
2078 if (!strcmp(name, "GetEventStatus"))
2079 return (void*) vkGetEventStatus;
2080 if (!strcmp(name, "SetEvent"))
2081 return (void*) vkSetEvent;
2082 if (!strcmp(name, "ResetEvent"))
2083 return (void*) vkResetEvent;
2084 if (!strcmp(name, "CreateQueryPool"))
2085 return (void*) vkCreateQueryPool;
2086 if (!strcmp(name, "GetQueryPoolResults"))
2087 return (void*) vkGetQueryPoolResults;
2088 if (!strcmp(name, "GetFormatInfo"))
2089 return (void*) vkGetFormatInfo;
2090 if (!strcmp(name, "CreateBuffer"))
2091 return (void*) vkCreateBuffer;
2092 if (!strcmp(name, "CreateBufferView"))
2093 return (void*) vkCreateBufferView;
2094 if (!strcmp(name, "CreateImage"))
2095 return (void*) vkCreateImage;
2096 if (!strcmp(name, "GetImageSubresourceInfo"))
2097 return (void*) vkGetImageSubresourceInfo;
2098 if (!strcmp(name, "CreateImageView"))
2099 return (void*) vkCreateImageView;
2100 if (!strcmp(name, "CreateColorAttachmentView"))
2101 return (void*) vkCreateColorAttachmentView;
2102 if (!strcmp(name, "CreateDepthStencilView"))
2103 return (void*) vkCreateDepthStencilView;
2104 if (!strcmp(name, "CreateShader"))
2105 return (void*) vkCreateShader;
2106 if (!strcmp(name, "CreateGraphicsPipeline"))
2107 return (void*) vkCreateGraphicsPipeline;
2108 if (!strcmp(name, "CreateGraphicsPipelineDerivative"))
2109 return (void*) vkCreateGraphicsPipelineDerivative;
2110 if (!strcmp(name, "CreateComputePipeline"))
2111 return (void*) vkCreateComputePipeline;
2112 if (!strcmp(name, "StorePipeline"))
2113 return (void*) vkStorePipeline;
2114 if (!strcmp(name, "LoadPipeline"))
2115 return (void*) vkLoadPipeline;
2116 if (!strcmp(name, "LoadPipelineDerivative"))
2117 return (void*) vkLoadPipelineDerivative;
2118 if (!strcmp(name, "CreatePipelineLayout"))
2119 return (void*) vkCreatePipelineLayout;
2120 if (!strcmp(name, "CreateSampler"))
2121 return (void*) vkCreateSampler;
2122 if (!strcmp(name, "CreateDescriptorSetLayout"))
2123 return (void*) vkCreateDescriptorSetLayout;
2124 if (!strcmp(name, "CreateDescriptorPool"))
2125 return (void*) vkCreateDescriptorPool;
2126 if (!strcmp(name, "ResetDescriptorPool"))
2127 return (void*) vkResetDescriptorPool;
2128 if (!strcmp(name, "AllocDescriptorSets"))
2129 return (void*) vkAllocDescriptorSets;
2130 if (!strcmp(name, "ClearDescriptorSets"))
2131 return (void*) vkClearDescriptorSets;
2132 if (!strcmp(name, "CreateDynamicViewportState"))
2133 return (void*) vkCreateDynamicViewportState;
2134 if (!strcmp(name, "CreateDynamicRasterState"))
2135 return (void*) vkCreateDynamicRasterState;
2136 if (!strcmp(name, "CreateDynamicColorBlendState"))
2137 return (void*) vkCreateDynamicColorBlendState;
2138 if (!strcmp(name, "CreateDynamicDepthStencilState"))
2139 return (void*) vkCreateDynamicDepthStencilState;
2140 if (!strcmp(name, "CreateCommandBuffer"))
2141 return (void*) vkCreateCommandBuffer;
2142 if (!strcmp(name, "BeginCommandBuffer"))
2143 return (void*) vkBeginCommandBuffer;
2144 if (!strcmp(name, "EndCommandBuffer"))
2145 return (void*) vkEndCommandBuffer;
2146 if (!strcmp(name, "ResetCommandBuffer"))
2147 return (void*) vkResetCommandBuffer;
2148 if (!strcmp(name, "CmdBindPipeline"))
2149 return (void*) vkCmdBindPipeline;
2150 if (!strcmp(name, "CmdBindDynamicStateObject"))
2151 return (void*) vkCmdBindDynamicStateObject;
2152 if (!strcmp(name, "CmdBindDescriptorSets"))
2153 return (void*) vkCmdBindDescriptorSets;
2154 if (!strcmp(name, "CmdBindVertexBuffers"))
2155 return (void*) vkCmdBindVertexBuffers;
2156 if (!strcmp(name, "CmdBindIndexBuffer"))
2157 return (void*) vkCmdBindIndexBuffer;
2158 if (!strcmp(name, "CmdDraw"))
2159 return (void*) vkCmdDraw;
2160 if (!strcmp(name, "CmdDrawIndexed"))
2161 return (void*) vkCmdDrawIndexed;
2162 if (!strcmp(name, "CmdDrawIndirect"))
2163 return (void*) vkCmdDrawIndirect;
2164 if (!strcmp(name, "CmdDrawIndexedIndirect"))
2165 return (void*) vkCmdDrawIndexedIndirect;
2166 if (!strcmp(name, "CmdDispatch"))
2167 return (void*) vkCmdDispatch;
2168 if (!strcmp(name, "CmdDispatchIndirect"))
2169 return (void*) vkCmdDispatchIndirect;
2170 if (!strcmp(name, "CmdCopyBuffer"))
2171 return (void*) vkCmdCopyBuffer;
2172 if (!strcmp(name, "CmdCopyImage"))
2173 return (void*) vkCmdCopyImage;
2174 if (!strcmp(name, "CmdBlitImage"))
2175 return (void*) vkCmdBlitImage;
2176 if (!strcmp(name, "CmdCopyBufferToImage"))
2177 return (void*) vkCmdCopyBufferToImage;
2178 if (!strcmp(name, "CmdCopyImageToBuffer"))
2179 return (void*) vkCmdCopyImageToBuffer;
2180 if (!strcmp(name, "CmdUpdateBuffer"))
2181 return (void*) vkCmdUpdateBuffer;
2182 if (!strcmp(name, "CmdFillBuffer"))
2183 return (void*) vkCmdFillBuffer;
2184 if (!strcmp(name, "CmdClearColorImage"))
2185 return (void*) vkCmdClearColorImage;
2186 if (!strcmp(name, "CmdClearDepthStencil"))
2187 return (void*) vkCmdClearDepthStencil;
2188 if (!strcmp(name, "CmdResolveImage"))
2189 return (void*) vkCmdResolveImage;
2190 if (!strcmp(name, "CmdSetEvent"))
2191 return (void*) vkCmdSetEvent;
2192 if (!strcmp(name, "CmdResetEvent"))
2193 return (void*) vkCmdResetEvent;
2194 if (!strcmp(name, "CmdWaitEvents"))
2195 return (void*) vkCmdWaitEvents;
2196 if (!strcmp(name, "CmdPipelineBarrier"))
2197 return (void*) vkCmdPipelineBarrier;
2198 if (!strcmp(name, "CmdBeginQuery"))
2199 return (void*) vkCmdBeginQuery;
2200 if (!strcmp(name, "CmdEndQuery"))
2201 return (void*) vkCmdEndQuery;
2202 if (!strcmp(name, "CmdResetQueryPool"))
2203 return (void*) vkCmdResetQueryPool;
2204 if (!strcmp(name, "CmdWriteTimestamp"))
2205 return (void*) vkCmdWriteTimestamp;
2206 if (!strcmp(name, "CmdCopyQueryPoolResults"))
2207 return (void*) vkCmdCopyQueryPoolResults;
2208 if (!strcmp(name, "CmdInitAtomicCounters"))
2209 return (void*) vkCmdInitAtomicCounters;
2210 if (!strcmp(name, "CmdLoadAtomicCounters"))
2211 return (void*) vkCmdLoadAtomicCounters;
2212 if (!strcmp(name, "CmdSaveAtomicCounters"))
2213 return (void*) vkCmdSaveAtomicCounters;
2214 if (!strcmp(name, "CreateFramebuffer"))
2215 return (void*) vkCreateFramebuffer;
2216 if (!strcmp(name, "CreateRenderPass"))
2217 return (void*) vkCreateRenderPass;
2218 if (!strcmp(name, "CmdBeginRenderPass"))
2219 return (void*) vkCmdBeginRenderPass;
2220 if (!strcmp(name, "CmdEndRenderPass"))
2221 return (void*) vkCmdEndRenderPass;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002222 if (!strcmp(name, "GetDisplayInfoWSI"))
2223 return (void*) vkGetDisplayInfoWSI;
2224 if (!strcmp(name, "CreateSwapChainWSI"))
2225 return (void*) vkCreateSwapChainWSI;
2226 if (!strcmp(name, "DestroySwapChainWSI"))
2227 return (void*) vkDestroySwapChainWSI;
2228 if (!strcmp(name, "GetSwapChainInfoWSI"))
2229 return (void*) vkGetSwapChainInfoWSI;
2230 if (!strcmp(name, "QueuePresentWSI"))
2231 return (void*) vkQueuePresentWSI;
2232
2233 return NULL;
2234}
2235
2236static inline void* layer_intercept_instance_proc(const char *name)
2237{
2238 if (!name || name[0] != 'v' || name[1] != 'k')
2239 return NULL;
2240
2241 name += 2;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002242 if (!strcmp(name, "CreateInstance"))
2243 return (void*) vkCreateInstance;
2244 if (!strcmp(name, "DestroyInstance"))
2245 return (void*) vkDestroyInstance;
2246 if (!strcmp(name, "GetPhysicalDeviceInfo"))
2247 return (void*) vkGetPhysicalDeviceInfo;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002248 if (!strcmp(name, "CreateDevice"))
2249 return (void*) vkCreateDevice;
2250 if (!strcmp(name, "GetGlobalExtensionInfo"))
2251 return (void*) vkGetGlobalExtensionInfo;
2252 if (!strcmp(name, "GetPhysicalDeviceExtensionInfo"))
2253 return (void*) vkGetPhysicalDeviceExtensionInfo;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002254 if (!strcmp(name, "GetMultiDeviceCompatibility"))
2255 return (void*) vkGetMultiDeviceCompatibility;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002256
2257 return NULL;
2258}
2259
Jon Ashburn1245cec2015-05-18 13:20:15 -06002260VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002261{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002262 void* addr;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002263 if (device == NULL) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002264 return NULL;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002265 }
2266
Jon Ashburnd9564002015-05-07 10:27:37 -06002267 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002268
2269 /* loader uses this to force layer initialization; device object is wrapped */
2270 if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
2271 initDeviceTable((const VkBaseLayerObject *) device);
2272 return (void*) vkGetDeviceProcAddr;
2273 }
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002274
2275 addr = layer_intercept_proc(funcName);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002276 if (addr) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002277 return addr;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002278 }
Jon Ashburn6f8cd632015-06-01 09:37:38 -06002279
2280 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
2281 if (!deviceExtMap[pDisp].debug_marker_enabled)
2282 {
2283 if (!strcmp(funcName, "CmdDbgMarkerBegin"))
2284 return (void*) vkCmdDbgMarkerBegin;
2285 if (!strcmp(funcName, "CmdDbgMarkerEnd"))
2286 return (void*) vkCmdDbgMarkerEnd;
2287 if (!strcmp(funcName, "DbgSetObjectTag"))
2288 return (void*) vkDbgSetObjectTag;
2289 if (!strcmp(funcName, "DbgSetObjectName"))
2290 return (void*) vkDbgSetObjectName;
2291 }
2292 {
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002293 VkLayerDispatchTable **ppDisp = (VkLayerDispatchTable **) device;
2294 VkLayerDispatchTable* pTable = tableMap[*ppDisp];
2295 if (pTable->GetDeviceProcAddr == NULL)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002296 return NULL;
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002297 return pTable->GetDeviceProcAddr(device, funcName);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002298 }
2299}
2300
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002301VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002302{
Courtney Goeltzenleuchter09f85042015-06-01 14:45:27 -06002303 void *fptr;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002304 void* addr;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002305 if (instance == NULL) {
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002306 return NULL;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002307 }
2308
Jon Ashburnd9564002015-05-07 10:27:37 -06002309 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002310
2311 /* loader uses this to force layer initialization; instance object is wrapped */
2312 if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
2313 initInstanceTable((const VkBaseLayerObject *) instance);
2314 return (void*) vkGetInstanceProcAddr;
2315 }
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002316
2317 addr = layer_intercept_instance_proc(funcName);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002318 if (addr) {
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002319 return addr;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002320 }
Courtney Goeltzenleuchter09f85042015-06-01 14:45:27 -06002321
2322 fptr = msg_callback_get_proc_addr(funcName);
2323 if (fptr)
2324 return fptr;
2325
2326 {
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002327 VkLayerInstanceDispatchTable **ppDisp = (VkLayerInstanceDispatchTable **) instance;
2328 VkLayerInstanceDispatchTable* pTable = tableInstanceMap[*ppDisp];
2329 if (pTable->GetInstanceProcAddr == NULL)
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002330 return NULL;
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002331 return pTable->GetInstanceProcAddr(instance, funcName);
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002332 }
2333}