blob: 15056f5af9aaf926c51143c0e4206fe029ee9bb4 [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"
44
Jon Ashburnd9564002015-05-07 10:27:37 -060045static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(initOnce);
Mark Lobodzinski3723c512015-05-26 10:58:40 -050046
47static std::unordered_map<void *, VkLayerDispatchTable *> tableMap;
48static std::unordered_map<void *, VkLayerDebugMarkerDispatchTable *> tableDebugMarkerMap;
49static std::unordered_map<void *, VkLayerInstanceDispatchTable *> tableInstanceMap;
50
51static inline VkLayerDispatchTable *device_dispatch_table(VkObject object) {
52 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) object;
53 VkLayerDispatchTable *pTable = tableMap[pDisp];
54 return pTable;
55}
56
57static inline VkLayerInstanceDispatchTable *instance_dispatch_table(VkObject object) {
58 VkLayerInstanceDispatchTable **ppDisp = (VkLayerInstanceDispatchTable **) object;
59 VkLayerInstanceDispatchTable *pInstanceTable = tableInstanceMap[*ppDisp];
60 return pInstanceTable;
61}
62
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060063
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060064#include "vk_dispatch_table_helper.h"
Jon Ashburnd9564002015-05-07 10:27:37 -060065
Mark Lobodzinski3723c512015-05-26 10:58:40 -050066static VkLayerDispatchTable * initDeviceTable(const VkBaseLayerObject *devw)
Jon Ashburnd9564002015-05-07 10:27:37 -060067{
Mark Lobodzinski3723c512015-05-26 10:58:40 -050068 VkLayerDispatchTable *pTable;
69 VkLayerDebugMarkerDispatchTable *pDebugMarkerTable;
Jon Ashburnf0615e22015-05-25 14:11:37 -060070
Mark Lobodzinski3723c512015-05-26 10:58:40 -050071 assert(devw);
72 VkLayerDispatchTable **ppDisp = (VkLayerDispatchTable **) (devw->baseObject);
73
74 std::unordered_map<void *, VkLayerDispatchTable *>::const_iterator it = tableMap.find((void *) *ppDisp);
75 if (it == tableMap.end())
76 {
77 pTable = new VkLayerDispatchTable;
78 tableMap[(void *) *ppDisp] = pTable;
79 pDebugMarkerTable = new VkLayerDebugMarkerDispatchTable;
80 tableDebugMarkerMap[(void *) *ppDisp] = pDebugMarkerTable;
81 } 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
Jon Ashburn4f2575f2015-05-28 16:25:02 -060088 VkDevice device = (VkDevice) devw->baseObject;
Mark Lobodzinski3723c512015-05-26 10:58:40 -050089 pDebugMarkerTable->CmdDbgMarkerBegin = (PFN_vkCmdDbgMarkerBegin) devw->pGPA(device, "vkCmdDbgMarkerBegin");
90 pDebugMarkerTable->CmdDbgMarkerEnd = (PFN_vkCmdDbgMarkerEnd) devw->pGPA(device, "vkCmdDbgMarkerEnd");
91 pDebugMarkerTable->DbgSetObjectTag = (PFN_vkDbgSetObjectTag) devw->pGPA(device, "vkDbgSetObjectTag");
92 pDebugMarkerTable->DbgSetObjectName = (PFN_vkDbgSetObjectName) devw->pGPA(device, "vkDbgSetObjectName");
93 pDebugMarkerTable->ext_enabled = false;
94
95 return pTable;
Jon Ashburnd9564002015-05-07 10:27:37 -060096}
97
Mark Lobodzinski3723c512015-05-26 10:58:40 -050098static VkLayerInstanceDispatchTable * initInstanceTable(const VkBaseLayerObject *instw)
Jon Ashburnd9564002015-05-07 10:27:37 -060099{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500100 VkLayerInstanceDispatchTable *pTable;
101 assert(instw);
102 VkLayerInstanceDispatchTable **ppDisp = (VkLayerInstanceDispatchTable **) instw->baseObject;
103
104 std::unordered_map<void *, VkLayerInstanceDispatchTable *>::const_iterator it = tableInstanceMap.find((void *) *ppDisp);
105 if (it == tableInstanceMap.end())
106 {
107 pTable = new VkLayerInstanceDispatchTable;
108 tableInstanceMap[(void *) *ppDisp] = pTable;
109 } else
110 {
111 return it->second;
112 }
113
Jon Ashburn4f2575f2015-05-28 16:25:02 -0600114 layer_init_instance_dispatch_table(pTable, instw);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500115
116 return pTable;
Jon Ashburnd9564002015-05-07 10:27:37 -0600117}
118
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600119static void initParamChecker(void)
120{
121
122 const char *strOpt;
123 // initialize ParamChecker options
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600124 getLayerOptionEnum("ParamCheckerReportLevel", (uint32_t *) &g_reportFlags);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600125 g_actionIsDefault = getLayerOptionEnum("ParamCheckerDebugAction", (uint32_t *) &g_debugAction);
126
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600127 if (g_debugAction & VK_DBG_LAYER_ACTION_LOG_MSG)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600128 {
129 strOpt = getLayerOption("ParamCheckerLogFilename");
130 if (strOpt)
131 {
132 g_logFile = fopen(strOpt, "w");
133 }
134 if (g_logFile == NULL)
135 g_logFile = stdout;
136 }
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600137}
138
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600139void PreCreateInstance(const VkApplicationInfo* pAppInfo, const VkAllocCallbacks* pAllocCb)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600140{
141 if(pAppInfo == nullptr)
142 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600143 char const str[] = "vkCreateInstance parameter, VkApplicationInfo* pAppInfo, is "\
Mike Stroyan0ae32252015-04-06 15:24:46 -0600144 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600145 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600146 return;
147 }
148
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600149 if(pAppInfo->sType != VK_STRUCTURE_TYPE_APPLICATION_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600150 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600151 char const str[] = "vkCreateInstance parameter, VK_STRUCTURE_TYPE_APPLICATION_INFO "\
152 "pAppInfo->sType, is not VK_STRUCTURE_TYPE_APPLICATION_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600153 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600154 return;
155 }
156
157 // TODO: What else can validated in pAppInfo?
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600158 // TODO: VK_API_VERSION validation.
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600159
160 // It's okay if pAllocCb is a nullptr.
161 if(pAllocCb != nullptr)
162 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600163 if(!vk_validate_vkalloccallbacks(pAllocCb))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600164 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600165 char const str[] = "vkCreateInstance parameter, VkAllocCallbacks* pAllocCb, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600166 "contains an invalid value (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600167 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600168 return;
169 }
170 }
171}
172
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600173void PostCreateInstance(VkResult result, const VkInstanceCreateInfo *pCreateInfo, VkInstance* pInstance)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600174{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600175 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600176 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600177 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600178 char const str[] = "vkCreateInstance failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600179 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600180 return;
181 }
182
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600183 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
184
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600185 if(pInstance == nullptr)
186 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600187 char const str[] = "vkCreateInstance parameter, VkInstance* pInstance, is nullptr "\
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600188 "(postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600189 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600190 return;
191 }
Courtney Goeltzenleuchterf4a2eba2015-06-08 14:58:39 -0600192
193 VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(*pInstance);
194 debug_report_init_instance_extension_dispatch_table(
195 pTable,
196 pTable->GetInstanceProcAddr,
197 *pInstance);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600198}
199
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600200VK_LAYER_EXPORT VkResult VKAPI vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600201{
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600202 loader_platform_thread_once(&initOnce, initParamChecker);
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600203
Jon Ashburn29669a42015-04-04 14:52:07 -0600204 PreCreateInstance(pCreateInfo->pAppInfo, pCreateInfo->pAllocCb);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500205 VkResult result = instance_dispatch_table(*pInstance)->CreateInstance(pCreateInfo, pInstance);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600206 PostCreateInstance(result, pCreateInfo, pInstance);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600207 return result;
208}
209
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600210VK_LAYER_EXPORT VkResult VKAPI vkDestroyInstance(VkInstance instance)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600211{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500212 VkLayerInstanceDispatchTable *pDisp = *(VkLayerInstanceDispatchTable **) instance;
213 VkResult res = instance_dispatch_table(instance)->DestroyInstance(instance);
214 tableInstanceMap.erase(pDisp);
215 return res;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600216}
217
Tony Barbour8205d902015-04-16 15:59:00 -0600218VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceInfo(VkPhysicalDevice gpu, VkPhysicalDeviceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600219{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600220 char str[1024];
Tony Barbour8205d902015-04-16 15:59:00 -0600221 if (!validate_VkPhysicalDeviceInfoType(infoType)) {
222 sprintf(str, "Parameter infoType to function GetPhysicalDeviceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600223 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600224 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500225 VkResult result = instance_dispatch_table(gpu)->GetPhysicalDeviceInfo(gpu, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600226 return result;
227}
228
Tony Barbour8205d902015-04-16 15:59:00 -0600229void PreCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600230{
231 if(gpu == nullptr)
232 {
Tony Barbour8205d902015-04-16 15:59:00 -0600233 char const str[] = "vkCreateDevice parameter, VkPhysicalDevice gpu, is nullptr "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600234 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600235 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600236 return;
237 }
238
239 if(pCreateInfo == nullptr)
240 {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600241 char const str[] = "vkCreateDevice parameter, VkDeviceCreateInfo* pCreateInfo, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600242 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600243 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600244 return;
245 }
246
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600247 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600248 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600249 char const str[] = "vkCreateDevice parameter, VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO "\
250 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600251 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600252 return;
253 }
254
255 if(pCreateInfo->queueRecordCount == 0)
256 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600257 char const str[] = "vkCreateDevice parameter, uint32_t pCreateInfo->queueRecordCount, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600258 "zero (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600259 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600260 return;
261 }
262
263 if(pCreateInfo->pRequestedQueues == nullptr)
264 {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600265 char const str[] = "vkCreateDevice parameter, VkDeviceQueueCreateInfo* pCreateInfo->pRequestedQueues, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600266 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600267 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600268 return;
269 }
270
271 for(uint32_t i = 0; i < pCreateInfo->queueRecordCount; ++i)
272 {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600273 if(!vk_validate_vkdevicequeuecreateinfo(&(pCreateInfo->pRequestedQueues[i])))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600274 {
275 std::stringstream ss;
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600276 ss << "vkCreateDevice parameter, VkDeviceQueueCreateInfo pCreateInfo->pRequestedQueues[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600277 "], is invalid (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600278 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600279 continue;
280 }
281 }
282
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600283}
284
Jon Ashburnf0615e22015-05-25 14:11:37 -0600285static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
286{
287 uint32_t i, ext_idx;
288 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) device;
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500289 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
Jon Ashburnf0615e22015-05-25 14:11:37 -0600290
291 for (i = 0; i < pCreateInfo->extensionCount; i++) {
292 if (strcmp(pCreateInfo->pEnabledExtensions[i].name, DEBUG_MARKER_EXTENSION_NAME) == 0) {
293 /* Found a matching extension name, mark it enabled */
294 pTable->ext_enabled = true;
295 }
296
297 }
298}
299
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600300void PostCreateDevice(VkResult result, const VkDeviceCreateInfo *pCreateInfo, VkDevice* pDevice)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600301{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600302 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600303 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600304 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600305 char const str[] = "vkCreateDevice failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600306 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600307 return;
308 }
309
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600310 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
Jon Ashburnf0615e22015-05-25 14:11:37 -0600311 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600312
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600313 if(pDevice == nullptr)
314 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600315 char const str[] = "vkCreateDevice parameter, VkDevice* pDevice, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600316 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600317 return;
318 }
319}
320
Tony Barbour8205d902015-04-16 15:59:00 -0600321VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600322{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600323 PreCreateDevice(gpu, pCreateInfo);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500324 VkResult result = instance_dispatch_table(gpu)->CreateDevice(gpu, pCreateInfo, pDevice);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600325 PostCreateDevice(result, pCreateInfo, pDevice);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600326 return result;
327}
328
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600329VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice(VkDevice device)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600330{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500331 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
332 VkLayerDispatchTable *pTable = tableMap[pDisp];
333 VkResult result = pTable->DestroyDevice(device);
334 tableMap.erase(pDisp);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600335 return result;
336}
337
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600338#define PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE 2
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600339static const VkExtensionProperties pcExts[PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE] = {
340 {
341 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
342 "ParamChecker",
343 0x10,
344 "Sample layer: ParamChecker",
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600345 },
346 {
347 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
348 "Validation",
349 0x10,
350 "Sample layer: ParamChecker",
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600351 }
Jon Ashburneb2728b2015-04-10 14:33:07 -0600352};
353
354VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo(
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600355 VkExtensionInfoType infoType,
356 uint32_t extensionIndex,
357 size_t* pDataSize,
358 void* pData)
Jon Ashburneb2728b2015-04-10 14:33:07 -0600359{
Jon Ashburneb2728b2015-04-10 14:33:07 -0600360 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
Jon Ashburneb2728b2015-04-10 14:33:07 -0600361 uint32_t *count;
362
363 if (pDataSize == NULL)
364 return VK_ERROR_INVALID_POINTER;
365
366 switch (infoType) {
367 case VK_EXTENSION_INFO_TYPE_COUNT:
368 *pDataSize = sizeof(uint32_t);
369 if (pData == NULL)
370 return VK_SUCCESS;
371 count = (uint32_t *) pData;
372 *count = PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE;
373 break;
374 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
375 *pDataSize = sizeof(VkExtensionProperties);
376 if (pData == NULL)
377 return VK_SUCCESS;
378 if (extensionIndex >= PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE)
379 return VK_ERROR_INVALID_VALUE;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600380 memcpy((VkExtensionProperties *) pData, &pcExts[extensionIndex], sizeof(VkExtensionProperties));
Jon Ashburneb2728b2015-04-10 14:33:07 -0600381 break;
382 default:
383 return VK_ERROR_INVALID_VALUE;
384 };
385
386 return VK_SUCCESS;
387}
388
Jeremy Hayescf469132015-04-17 10:36:53 -0600389VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionInfo(
390 VkPhysicalDevice gpu,
391 VkExtensionInfoType infoType,
392 uint32_t extensionIndex,
393 size_t* pDataSize,
394 void* pData)
395{
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600396 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
397 uint32_t *count;
398
399 if (pDataSize == NULL)
400 return VK_ERROR_INVALID_POINTER;
401
402 switch (infoType) {
403 case VK_EXTENSION_INFO_TYPE_COUNT:
404 *pDataSize = sizeof(uint32_t);
405 if (pData == NULL)
406 return VK_SUCCESS;
407 count = (uint32_t *) pData;
408 *count = PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE;
409 break;
410 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
411 *pDataSize = sizeof(VkExtensionProperties);
412 if (pData == NULL)
413 return VK_SUCCESS;
414 if (extensionIndex >= PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE)
415 return VK_ERROR_INVALID_VALUE;
416 memcpy((VkExtensionProperties *) pData, &pcExts[extensionIndex], sizeof(VkExtensionProperties));
417 break;
418 default:
419 return VK_ERROR_INVALID_VALUE;
420 };
421
422 return VK_SUCCESS;
Jeremy Hayescf469132015-04-17 10:36:53 -0600423}
424
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600425VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex, VkQueue* pQueue)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600426{
427
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500428 VkResult result = device_dispatch_table(device)->GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600429 return result;
430}
431
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600432VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600433{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500434 VkResult result = device_dispatch_table(queue)->QueueSubmit(queue, cmdBufferCount, pCmdBuffers, fence);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600435 return result;
436}
437
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600438VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(VkQueue queue)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600439{
440
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500441 VkResult result = device_dispatch_table(queue)->QueueWaitIdle(queue);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600442 return result;
443}
444
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600445VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle(VkDevice device)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600446{
447
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500448 VkResult result = device_dispatch_table(device)->DeviceWaitIdle(device);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600449 return result;
450}
451
Tony Barbour8205d902015-04-16 15:59:00 -0600452VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory(VkDevice device, const VkMemoryAllocInfo* pAllocInfo, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600453{
454 char str[1024];
455 if (!pAllocInfo) {
456 sprintf(str, "Struct ptr parameter pAllocInfo to function AllocMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600457 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600458 } else if (!vk_validate_vkmemoryallocinfo(pAllocInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600459 sprintf(str, "Parameter pAllocInfo to function AllocMemory contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600460 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600461 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500462 VkResult result = device_dispatch_table(device)->AllocMemory(device, pAllocInfo, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600463 return result;
464}
465
Mike Stroyan230e6252015-04-17 12:36:38 -0600466VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600467{
468
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500469 VkResult result = device_dispatch_table(device)->FreeMemory(device, mem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600470 return result;
471}
472
Mike Stroyan230e6252015-04-17 12:36:38 -0600473VK_LAYER_EXPORT VkResult VKAPI vkSetMemoryPriority(VkDevice device, VkDeviceMemory mem, VkMemoryPriority priority)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600474{
475 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600476 if (!validate_VkMemoryPriority(priority)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600477 sprintf(str, "Parameter priority to function SetMemoryPriority has invalid value of %i.", (int)priority);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600478 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600479 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500480 VkResult result = device_dispatch_table(device)->SetMemoryPriority(device, mem, priority);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600481 return result;
482}
483
Mike Stroyan230e6252015-04-17 12:36:38 -0600484VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkFlags flags, void** ppData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600485{
486
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500487 VkResult result = device_dispatch_table(device)->MapMemory(device, mem, offset, size, flags, ppData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600488 return result;
489}
490
Mike Stroyan230e6252015-04-17 12:36:38 -0600491VK_LAYER_EXPORT VkResult VKAPI vkUnmapMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600492{
493
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500494 VkResult result = device_dispatch_table(device)->UnmapMemory(device, mem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600495 return result;
496}
497
Courtney Goeltzenleuchtera569a502015-04-29 17:16:21 -0600498VK_LAYER_EXPORT VkResult VKAPI vkFlushMappedMemoryRanges(
499 VkDevice device,
500 uint32_t memRangeCount,
501 const VkMappedMemoryRange* pMemRanges)
Tony Barbour859ceab2015-04-16 19:23:13 -0600502{
503
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500504 VkResult result = device_dispatch_table(device)->FlushMappedMemoryRanges(device, memRangeCount, pMemRanges);
Courtney Goeltzenleuchtera569a502015-04-29 17:16:21 -0600505 return result;
506}
507
508VK_LAYER_EXPORT VkResult VKAPI vkInvalidateMappedMemoryRanges(
509 VkDevice device,
510 uint32_t memRangeCount,
511 const VkMappedMemoryRange* pMemRanges)
512{
513
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500514 VkResult result = device_dispatch_table(device)->InvalidateMappedMemoryRanges(device, memRangeCount, pMemRanges);
Tony Barbour859ceab2015-04-16 19:23:13 -0600515 return result;
516}
517
Tony Barbour8205d902015-04-16 15:59:00 -0600518VK_LAYER_EXPORT VkResult VKAPI vkPinSystemMemory(VkDevice device, const void* pSysMem, size_t memSize, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600519{
520
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500521 VkResult result = device_dispatch_table(device)->PinSystemMemory(device, pSysMem, memSize, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600522 return result;
523}
524
Tony Barbour8205d902015-04-16 15:59:00 -0600525VK_LAYER_EXPORT VkResult VKAPI vkGetMultiDeviceCompatibility(VkPhysicalDevice gpu0, VkPhysicalDevice gpu1, VkPhysicalDeviceCompatibilityInfo* pInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600526{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600527
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500528 VkResult result = instance_dispatch_table(gpu0)->GetMultiDeviceCompatibility(gpu0, gpu1, pInfo);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600529 return result;
530}
531
Tony Barbour8205d902015-04-16 15:59:00 -0600532VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedMemory(VkDevice device, const VkMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600533{
534 char str[1024];
535 if (!pOpenInfo) {
536 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600537 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600538 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600539 else if (!vk_validate_vkmemoryopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600540 sprintf(str, "Parameter pOpenInfo to function OpenSharedMemory contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600541 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600542 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500543 VkResult result = device_dispatch_table(device)->OpenSharedMemory(device, pOpenInfo, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600544 return result;
545}
546
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600547VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedSemaphore(VkDevice device, const VkSemaphoreOpenInfo* pOpenInfo, VkSemaphore* pSemaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600548{
549 char str[1024];
550 if (!pOpenInfo) {
551 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedSemaphore is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600552 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600553 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600554 else if (!vk_validate_vksemaphoreopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600555 sprintf(str, "Parameter pOpenInfo to function OpenSharedSemaphore contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600556 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600557 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500558 VkResult result = device_dispatch_table(device)->OpenSharedSemaphore(device, pOpenInfo, pSemaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600559 return result;
560}
561
Tony Barbour8205d902015-04-16 15:59:00 -0600562VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerMemory(VkDevice device, const VkPeerMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600563{
564 char str[1024];
565 if (!pOpenInfo) {
566 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600567 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600568 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600569 else if (!vk_validate_vkpeermemoryopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600570 sprintf(str, "Parameter pOpenInfo to function OpenPeerMemory contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600571 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600572 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500573 VkResult result = device_dispatch_table(device)->OpenPeerMemory(device, pOpenInfo, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600574 return result;
575}
576
Tony Barbour8205d902015-04-16 15:59:00 -0600577VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerImage(VkDevice device, const VkPeerImageOpenInfo* pOpenInfo, VkImage* pImage, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600578{
579 char str[1024];
580 if (!pOpenInfo) {
581 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerImage is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600582 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600583 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600584 else if (!vk_validate_vkpeerimageopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600585 sprintf(str, "Parameter pOpenInfo to function OpenPeerImage contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600586 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600587 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500588 VkResult result = device_dispatch_table(device)->OpenPeerImage(device, pOpenInfo, pImage, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600589 return result;
590}
591
Mike Stroyan230e6252015-04-17 12:36:38 -0600592VK_LAYER_EXPORT VkResult VKAPI vkDestroyObject(VkDevice device, VkObjectType objType, VkObject object)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600593{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500594 VkResult result = device_dispatch_table(device)->DestroyObject(device, objType, object);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600595 return result;
596}
597
Mike Stroyan230e6252015-04-17 12:36:38 -0600598VK_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 -0600599{
600 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600601 if (!validate_VkObjectInfoType(infoType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600602 sprintf(str, "Parameter infoType to function GetObjectInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600603 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600604 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500605 VkResult result = device_dispatch_table(device)->GetObjectInfo(device, objType, object, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600606 return result;
607}
608
Mark Lobodzinski23182612015-05-29 09:32:35 -0500609VK_LAYER_EXPORT VkResult VKAPI vkBindObjectMemory(VkDevice device, VkObjectType objType, VkObject object, VkDeviceMemory mem, VkDeviceSize offset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600610{
611
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500612 VkResult result = device_dispatch_table(device)->BindObjectMemory(device, objType, object, mem, offset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600613 return result;
614}
615
Mark Lobodzinski23182612015-05-29 09:32:35 -0500616VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(VkQueue queue, VkBuffer buffer, VkDeviceSize rangeOffset, VkDeviceSize rangeSize, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600617{
618
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500619 VkResult result = device_dispatch_table(queue)->QueueBindSparseBufferMemory(queue, buffer, rangeOffset, rangeSize, mem, memOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600620 return result;
621}
622
Mark Lobodzinski23182612015-05-29 09:32:35 -0500623VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageMemory(VkQueue queue, VkImage image, const VkImageMemoryBindInfo* pBindInfo, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600624{
625 char str[1024];
Jeremy Hayes47536532015-04-15 15:20:03 -0600626 if (!pBindInfo) {
Mark Lobodzinskifb9f5642015-05-11 17:21:15 -0500627 sprintf(str, "Struct ptr parameter pBindInfo to function QueueBindSparseImageMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600628 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600629 }
Jeremy Hayes47536532015-04-15 15:20:03 -0600630 else if (!vk_validate_vkimagememorybindinfo(pBindInfo)) {
631 sprintf(str, "Parameter pBindInfo to function BindImageMemoryRange contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600632 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600633 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500634 VkResult result = device_dispatch_table(queue)->QueueBindSparseImageMemory(queue, image, pBindInfo, mem, memOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600635 return result;
636}
637
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600638VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(VkDevice device, const VkFenceCreateInfo* pCreateInfo, VkFence* pFence)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600639{
640 char str[1024];
641 if (!pCreateInfo) {
642 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFence is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600643 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600644 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600645 else if (!vk_validate_vkfencecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600646 sprintf(str, "Parameter pCreateInfo to function CreateFence contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600647 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600648 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500649 VkResult result = device_dispatch_table(device)->CreateFence(device, pCreateInfo, pFence);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600650 return result;
651}
652
Mike Stroyan230e6252015-04-17 12:36:38 -0600653VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(VkDevice device, VkFence fence)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600654{
655
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500656 VkResult result = device_dispatch_table(device)->GetFenceStatus(device, fence);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600657 return result;
658}
659
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600660VK_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 -0600661{
662
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500663 VkResult result = device_dispatch_table(device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600664 return result;
665}
666
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600667VK_LAYER_EXPORT VkResult VKAPI vkResetFences(VkDevice device, uint32_t fenceCount, VkFence* pFences)
Mark Lobodzinskiebe814d2015-04-07 16:07:57 -0500668{
669
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500670 VkResult result = device_dispatch_table(device)->ResetFences(device, fenceCount, pFences);
Mark Lobodzinskiebe814d2015-04-07 16:07:57 -0500671 return result;
672}
673
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600674VK_LAYER_EXPORT VkResult VKAPI vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, VkSemaphore* pSemaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600675{
676 char str[1024];
677 if (!pCreateInfo) {
678 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSemaphore is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600679 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600680 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600681 else if (!vk_validate_vksemaphorecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600682 sprintf(str, "Parameter pCreateInfo to function CreateSemaphore contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600683 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600684 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500685 VkResult result = device_dispatch_table(device)->CreateSemaphore(device, pCreateInfo, pSemaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600686 return result;
687}
688
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600689VK_LAYER_EXPORT VkResult VKAPI vkQueueSignalSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600690{
691
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500692 VkResult result = device_dispatch_table(queue)->QueueSignalSemaphore(queue, semaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600693 return result;
694}
695
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600696VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600697{
698
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500699 VkResult result = device_dispatch_table(queue)->QueueWaitSemaphore(queue, semaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600700 return result;
701}
702
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600703VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(VkDevice device, const VkEventCreateInfo* pCreateInfo, VkEvent* pEvent)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600704{
705 char str[1024];
706 if (!pCreateInfo) {
707 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateEvent is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600708 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600709 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600710 else if (!vk_validate_vkeventcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600711 sprintf(str, "Parameter pCreateInfo to function CreateEvent contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600712 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600713 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500714 VkResult result = device_dispatch_table(device)->CreateEvent(device, pCreateInfo, pEvent);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600715 return result;
716}
717
Mike Stroyan230e6252015-04-17 12:36:38 -0600718VK_LAYER_EXPORT VkResult VKAPI vkGetEventStatus(VkDevice device, VkEvent event)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600719{
720
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500721 VkResult result = device_dispatch_table(device)->GetEventStatus(device, event);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600722 return result;
723}
724
Mike Stroyan230e6252015-04-17 12:36:38 -0600725VK_LAYER_EXPORT VkResult VKAPI vkSetEvent(VkDevice device, VkEvent event)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600726{
727
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500728 VkResult result = device_dispatch_table(device)->SetEvent(device, event);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600729 return result;
730}
731
Mike Stroyan230e6252015-04-17 12:36:38 -0600732VK_LAYER_EXPORT VkResult VKAPI vkResetEvent(VkDevice device, VkEvent event)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600733{
734
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500735 VkResult result = device_dispatch_table(device)->ResetEvent(device, event);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600736 return result;
737}
738
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600739VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, VkQueryPool* pQueryPool)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600740{
741 char str[1024];
742 if (!pCreateInfo) {
743 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateQueryPool is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600744 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600745 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600746 else if (!vk_validate_vkquerypoolcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600747 sprintf(str, "Parameter pCreateInfo to function CreateQueryPool contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600748 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600749 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500750 VkResult result = device_dispatch_table(device)->CreateQueryPool(device, pCreateInfo, pQueryPool);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600751 return result;
752}
753
Mike Stroyan230e6252015-04-17 12:36:38 -0600754VK_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 -0600755{
756
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500757 VkResult result = device_dispatch_table(device)->GetQueryPoolResults(device, queryPool, startQuery, queryCount, pDataSize, pData, flags);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600758 return result;
759}
760
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600761VK_LAYER_EXPORT VkResult VKAPI vkGetFormatInfo(VkDevice device, VkFormat format, VkFormatInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600762{
763 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600764 if (!validate_VkFormat(format)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600765 sprintf(str, "Parameter format to function GetFormatInfo has invalid value of %i.", (int)format);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600766 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600767 }
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600768 if (!validate_VkFormatInfoType(infoType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600769 sprintf(str, "Parameter infoType to function GetFormatInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600770 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600771 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500772 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, format, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600773 return result;
774}
775
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600776VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600777{
778 char str[1024];
779 if (!pCreateInfo) {
780 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBuffer is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600781 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600782 }
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600783 else if (!vk_validate_vkbuffercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600784 sprintf(str, "Parameter pCreateInfo to function CreateBuffer contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600785 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600786 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500787 VkResult result = device_dispatch_table(device)->CreateBuffer(device, pCreateInfo, pBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600788 return result;
789}
790
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600791VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, VkBufferView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600792{
793 char str[1024];
794 if (!pCreateInfo) {
795 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBufferView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600796 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600797 }
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600798 else if (!vk_validate_vkbufferviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600799 sprintf(str, "Parameter pCreateInfo to function CreateBufferView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600800 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600801 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500802 VkResult result = device_dispatch_table(device)->CreateBufferView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600803 return result;
804}
805
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600806void PreCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600807{
808 if(pCreateInfo == nullptr)
809 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600810 char const str[] = "vkCreateImage parameter, VkImageCreateInfo* pCreateInfo, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600811 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600812 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600813 return;
814 }
815
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600816 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600817 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600818 char const str[] = "vkCreateImage parameter, VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO "\
819 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600820 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600821 return;
822 }
823
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600824 if (!validate_VkImageType(pCreateInfo->imageType))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600825 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600826 char const str[] = "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600827 "unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600828 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600829 return;
830 }
831
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600832 if (!validate_VkFormat(pCreateInfo->format))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600833 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600834 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600835 "unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600836 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600837 return;
838 }
839
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600840 VkFormatProperties properties;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600841 size_t size = sizeof(properties);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500842 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->format,
Tony Barbour8205d902015-04-16 15:59:00 -0600843 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600844 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600845 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600846 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, cannot be "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600847 "validated (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600848 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600849 return;
850 }
851
852 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
853 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600854 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600855 "unsupported format (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600856 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600857 return;
858 }
859
860 // TODO: Can we check device-specific limits?
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600861 if (!vk_validate_vkextent3d(&pCreateInfo->extent))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600862 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600863 char const str[] = "vkCreateImage parameter, VkExtent3D pCreateInfo->extent, is invalid "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600864 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600865 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600866 return;
867 }
868
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600869 if (!validate_VkImageTiling(pCreateInfo->tiling))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600870 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600871 char const str[] = "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600872 "unrecoginized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600873 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600874 return;
875 }
876}
877
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600878void PostCreateImage(VkResult result, VkImage* pImage)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600879{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600880 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600881 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600882 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600883 char const str[] = "vkCreateImage failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600884 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600885 return;
886 }
887
888 if(pImage == nullptr)
889 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600890 char const str[] = "vkCreateImage parameter, VkImage* pImage, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600891 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600892 return;
893 }
894}
895
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600896VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600897{
898 PreCreateImage(device, pCreateInfo);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500899 VkResult result = device_dispatch_table(device)->CreateImage(device, pCreateInfo, pImage);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600900 PostCreateImage(result, pImage);
901 return result;
902}
903
Mike Stroyan230e6252015-04-17 12:36:38 -0600904VK_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 -0600905{
906 char str[1024];
907 if (!pSubresource) {
908 sprintf(str, "Struct ptr parameter pSubresource to function GetImageSubresourceInfo is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600909 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600910 } else if (!vk_validate_vkimagesubresource(pSubresource)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600911 sprintf(str, "Parameter pSubresource to function GetImageSubresourceInfo contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600912 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600913 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600914 if (!validate_VkSubresourceInfoType(infoType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600915 sprintf(str, "Parameter infoType to function GetImageSubresourceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600916 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600917 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500918 VkResult result = device_dispatch_table(device)->GetImageSubresourceInfo(device, image, pSubresource, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600919 return result;
920}
921
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600922VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, VkImageView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600923{
924 char str[1024];
925 if (!pCreateInfo) {
926 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateImageView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600927 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600928 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600929 else if (!vk_validate_vkimageviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600930 sprintf(str, "Parameter pCreateInfo to function CreateImageView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600931 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600932 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500933 VkResult result = device_dispatch_table(device)->CreateImageView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600934 return result;
935}
936
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600937VK_LAYER_EXPORT VkResult VKAPI vkCreateColorAttachmentView(VkDevice device, const VkColorAttachmentViewCreateInfo* pCreateInfo, VkColorAttachmentView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600938{
939 char str[1024];
940 if (!pCreateInfo) {
941 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateColorAttachmentView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600942 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600943 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600944 else if (!vk_validate_vkcolorattachmentviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600945 sprintf(str, "Parameter pCreateInfo to function CreateColorAttachmentView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600946 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600947 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500948 VkResult result = device_dispatch_table(device)->CreateColorAttachmentView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600949 return result;
950}
951
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600952VK_LAYER_EXPORT VkResult VKAPI vkCreateDepthStencilView(VkDevice device, const VkDepthStencilViewCreateInfo* pCreateInfo, VkDepthStencilView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600953{
954 char str[1024];
955 if (!pCreateInfo) {
956 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDepthStencilView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600957 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600958 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600959 else if (!vk_validate_vkdepthstencilviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600960 sprintf(str, "Parameter pCreateInfo to function CreateDepthStencilView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600961 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600962 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500963 VkResult result = device_dispatch_table(device)->CreateDepthStencilView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600964 return result;
965}
966
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600967VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(VkDevice device, const VkShaderCreateInfo* pCreateInfo, VkShader* pShader)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600968{
969 char str[1024];
970 if (!pCreateInfo) {
971 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateShader is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600972 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600973 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600974 else if (!vk_validate_vkshadercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600975 sprintf(str, "Parameter pCreateInfo to function CreateShader contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600976 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600977 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500978 VkResult result = device_dispatch_table(device)->CreateShader(device, pCreateInfo, pShader);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600979 return result;
980}
981
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600982VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600983{
984 char str[1024];
985 if (!pCreateInfo) {
986 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipeline is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600987 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600988 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600989 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600990 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipeline contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600991 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600992 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500993 VkResult result = device_dispatch_table(device)->CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600994 return result;
995}
996
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600997VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelineDerivative(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600998{
999 char str[1024];
1000 if (!pCreateInfo) {
1001 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipelineDerivative is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001002 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001003 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001004 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001005 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipelineDerivative contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001006 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001007 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001008 VkResult result = device_dispatch_table(device)->CreateGraphicsPipelineDerivative(device, pCreateInfo, basePipeline, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001009 return result;
1010}
1011
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001012VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipeline(VkDevice device, const VkComputePipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001013{
1014 char str[1024];
1015 if (!pCreateInfo) {
1016 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateComputePipeline is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001017 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001018 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001019 else if (!vk_validate_vkcomputepipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001020 sprintf(str, "Parameter pCreateInfo to function CreateComputePipeline contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001021 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001022 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001023 VkResult result = device_dispatch_table(device)->CreateComputePipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001024 return result;
1025}
1026
Mike Stroyan230e6252015-04-17 12:36:38 -06001027VK_LAYER_EXPORT VkResult VKAPI vkStorePipeline(VkDevice device, VkPipeline pipeline, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001028{
1029
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001030 VkResult result = device_dispatch_table(device)->StorePipeline(device, pipeline, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001031 return result;
1032}
1033
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001034VK_LAYER_EXPORT VkResult VKAPI vkLoadPipeline(VkDevice device, size_t dataSize, const void* pData, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001035{
1036
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001037 VkResult result = device_dispatch_table(device)->LoadPipeline(device, dataSize, pData, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001038 return result;
1039}
1040
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001041VK_LAYER_EXPORT VkResult VKAPI vkLoadPipelineDerivative(VkDevice device, size_t dataSize, const void* pData, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001042{
1043
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001044 VkResult result = device_dispatch_table(device)->LoadPipelineDerivative(device, dataSize, pData, basePipeline, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001045 return result;
1046}
1047
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001048VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, VkSampler* pSampler)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001049{
1050 char str[1024];
1051 if (!pCreateInfo) {
1052 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSampler is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001053 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001054 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001055 else if (!vk_validate_vksamplercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001056 sprintf(str, "Parameter pCreateInfo to function CreateSampler contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001057 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001058 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001059 VkResult result = device_dispatch_table(device)->CreateSampler(device, pCreateInfo, pSampler);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001060 return result;
1061}
1062
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001063VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayout* pSetLayout)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001064{
1065 char str[1024];
1066 if (!pCreateInfo) {
1067 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorSetLayout is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001068 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001069 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001070 else if (!vk_validate_vkdescriptorsetlayoutcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001071 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorSetLayout contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001072 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001073 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001074 VkResult result = device_dispatch_table(device)->CreateDescriptorSetLayout(device, pCreateInfo, pSetLayout);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001075 return result;
1076}
1077
Mark Lobodzinski556f7212015-04-17 14:11:39 -05001078VK_LAYER_EXPORT VkResult VKAPI vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, VkPipelineLayout* pPipelineLayout)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001079{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001080 VkResult result = device_dispatch_table(device)->CreatePipelineLayout(device, pCreateInfo, pPipelineLayout);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001081 return result;
1082}
1083
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001084VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorPool(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001085{
1086 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001087 if (!validate_VkDescriptorPoolUsage(poolUsage)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001088 sprintf(str, "Parameter poolUsage to function CreateDescriptorPool has invalid value of %i.", (int)poolUsage);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001089 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001090 }
1091 if (!pCreateInfo) {
1092 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorPool is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001093 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001094 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001095 else if (!vk_validate_vkdescriptorpoolcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001096 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorPool contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001097 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001098 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001099 VkResult result = device_dispatch_table(device)->CreateDescriptorPool(device, poolUsage, maxSets, pCreateInfo, pDescriptorPool);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001100 return result;
1101}
1102
Mike Stroyan230e6252015-04-17 12:36:38 -06001103VK_LAYER_EXPORT VkResult VKAPI vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001104{
1105
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001106 VkResult result = device_dispatch_table(device)->ResetDescriptorPool(device, descriptorPool);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001107 return result;
1108}
1109
Mike Stroyan230e6252015-04-17 12:36:38 -06001110VK_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 -06001111{
1112 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001113 if (!validate_VkDescriptorSetUsage(setUsage)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001114 sprintf(str, "Parameter setUsage to function AllocDescriptorSets has invalid value of %i.", (int)setUsage);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001115 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001116 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001117 VkResult result = device_dispatch_table(device)->AllocDescriptorSets(device, descriptorPool, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001118 return result;
1119}
1120
Mike Stroyan230e6252015-04-17 12:36:38 -06001121VK_LAYER_EXPORT void VKAPI vkClearDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, const VkDescriptorSet* pDescriptorSets)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001122{
1123
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001124 device_dispatch_table(device)->ClearDescriptorSets(device, descriptorPool, count, pDescriptorSets);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001125}
1126
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001127VK_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 -06001128{
1129
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001130 return device_dispatch_table(device)->UpdateDescriptorSets(device, writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001131}
1132
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001133VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(VkDevice device, const VkDynamicVpStateCreateInfo* pCreateInfo, VkDynamicVpState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001134{
1135 char str[1024];
1136 if (!pCreateInfo) {
1137 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicViewportState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001138 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001139 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001140 else if (!vk_validate_vkdynamicvpstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001141 sprintf(str, "Parameter pCreateInfo to function CreateDynamicViewportState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001142 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001143 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001144 VkResult result = device_dispatch_table(device)->CreateDynamicViewportState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001145 return result;
1146}
1147
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001148VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterState(VkDevice device, const VkDynamicRsStateCreateInfo* pCreateInfo, VkDynamicRsState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001149{
1150 char str[1024];
1151 if (!pCreateInfo) {
1152 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicRasterState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001153 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001154 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001155 else if (!vk_validate_vkdynamicrsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001156 sprintf(str, "Parameter pCreateInfo to function CreateDynamicRasterState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001157 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001158 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001159 VkResult result = device_dispatch_table(device)->CreateDynamicRasterState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001160 return result;
1161}
1162
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001163VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState(VkDevice device, const VkDynamicCbStateCreateInfo* pCreateInfo, VkDynamicCbState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001164{
1165 char str[1024];
1166 if (!pCreateInfo) {
1167 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicColorBlendState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001168 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001169 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001170 else if (!vk_validate_vkdynamiccbstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001171 sprintf(str, "Parameter pCreateInfo to function CreateDynamicColorBlendState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001172 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001173 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001174 VkResult result = device_dispatch_table(device)->CreateDynamicColorBlendState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001175 return result;
1176}
1177
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001178VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState(VkDevice device, const VkDynamicDsStateCreateInfo* pCreateInfo, VkDynamicDsState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001179{
1180 char str[1024];
1181 if (!pCreateInfo) {
1182 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicDepthStencilState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001183 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001184 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001185 else if (!vk_validate_vkdynamicdsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001186 sprintf(str, "Parameter pCreateInfo to function CreateDynamicDepthStencilState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001187 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001188 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001189 VkResult result = device_dispatch_table(device)->CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001190 return result;
1191}
1192
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001193void PreCreateCommandBuffer(VkDevice device, const VkCmdBufferCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001194{
1195 if(device == nullptr)
1196 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001197 char const str[] = "vkCreateCommandBuffer parameter, VkDevice device, is "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001198 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001199 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001200 return;
1201 }
1202
1203 if(pCreateInfo == nullptr)
1204 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001205 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBufferCreateInfo* pCreateInfo, is "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001206 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001207 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001208 return;
1209 }
1210
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001211 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001212 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001213 char const str[] = "vkCreateCommandBuffer parameter, VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO "\
1214 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001215 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001216 return;
1217 }
1218}
1219
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001220void PostCreateCommandBuffer(VkResult result, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001221{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001222 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001223 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001224 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001225 char const str[] = "vkCreateCommandBuffer failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001226 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001227 return;
1228 }
1229
1230 if(pCmdBuffer == nullptr)
1231 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001232 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBuffer* pCmdBuffer, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001233 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001234 return;
1235 }
1236}
1237
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001238VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(VkDevice device,
1239 const VkCmdBufferCreateInfo* pCreateInfo, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001240{
1241 PreCreateCommandBuffer(device, pCreateInfo);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001242 VkResult result = device_dispatch_table(device)->CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001243 PostCreateCommandBuffer(result, pCmdBuffer);
1244 return result;
1245}
1246
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001247VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001248{
1249 char str[1024];
1250 if (!pBeginInfo) {
1251 sprintf(str, "Struct ptr parameter pBeginInfo to function BeginCommandBuffer is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001252 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001253 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001254 else if (!vk_validate_vkcmdbufferbegininfo(pBeginInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001255 sprintf(str, "Parameter pBeginInfo to function BeginCommandBuffer contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001256 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001257 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001258 VkResult result = device_dispatch_table(cmdBuffer)->BeginCommandBuffer(cmdBuffer, pBeginInfo);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001259 return result;
1260}
1261
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001262VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001263{
1264
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001265 VkResult result = device_dispatch_table(cmdBuffer)->EndCommandBuffer(cmdBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001266 return result;
1267}
1268
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001269VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001270{
1271
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001272 VkResult result = device_dispatch_table(cmdBuffer)->ResetCommandBuffer(cmdBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001273 return result;
1274}
1275
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001276VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001277{
1278 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001279 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001280 sprintf(str, "Parameter pipelineBindPoint to function CmdBindPipeline has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001281 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001282 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001283 device_dispatch_table(cmdBuffer)->CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001284}
1285
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001286VK_LAYER_EXPORT void VKAPI vkCmdBindDynamicStateObject(VkCmdBuffer cmdBuffer, VkStateBindPoint stateBindPoint, VkDynamicStateObject state)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001287{
1288 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001289 if (!validate_VkStateBindPoint(stateBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001290 sprintf(str, "Parameter stateBindPoint to function CmdBindDynamicStateObject has invalid value of %i.", (int)stateBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001291 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001292 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001293 device_dispatch_table(cmdBuffer)->CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001294}
1295
Cody Northrop1a01b1d2015-04-16 13:41:56 -06001296VK_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 -06001297{
1298 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001299 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001300 sprintf(str, "Parameter pipelineBindPoint to function CmdBindDescriptorSets has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001301 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001302 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001303 device_dispatch_table(cmdBuffer)->CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001304}
1305
Courtney Goeltzenleuchter46962942015-04-16 13:38:46 -06001306VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
1307 VkCmdBuffer cmdBuffer,
1308 uint32_t startBinding,
1309 uint32_t bindingCount,
1310 const VkBuffer* pBuffers,
Tony Barbour8205d902015-04-16 15:59:00 -06001311 const VkDeviceSize* pOffsets)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001312{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001313 device_dispatch_table(cmdBuffer)->CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001314}
1315
Tony Barbour8205d902015-04-16 15:59:00 -06001316VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001317{
1318 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001319 if (!validate_VkIndexType(indexType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001320 sprintf(str, "Parameter indexType to function CmdBindIndexBuffer has invalid value of %i.", (int)indexType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001321 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001322 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001323 device_dispatch_table(cmdBuffer)->CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001324}
1325
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001326VK_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 -06001327{
1328
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001329 device_dispatch_table(cmdBuffer)->CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001330}
1331
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001332VK_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 -06001333{
1334
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001335 device_dispatch_table(cmdBuffer)->CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001336}
1337
Tony Barbour8205d902015-04-16 15:59:00 -06001338VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001339{
1340
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001341 device_dispatch_table(cmdBuffer)->CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001342}
1343
Tony Barbour8205d902015-04-16 15:59:00 -06001344VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001345{
1346
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001347 device_dispatch_table(cmdBuffer)->CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001348}
1349
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001350VK_LAYER_EXPORT void VKAPI vkCmdDispatch(VkCmdBuffer cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001351{
1352
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001353 device_dispatch_table(cmdBuffer)->CmdDispatch(cmdBuffer, x, y, z);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001354}
1355
Tony Barbour8205d902015-04-16 15:59:00 -06001356VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001357{
1358
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001359 device_dispatch_table(cmdBuffer)->CmdDispatchIndirect(cmdBuffer, buffer, offset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001360}
1361
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001362VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkBuffer destBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001363{
1364 char str[1024];
1365 uint32_t i;
1366 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001367 if (!vk_validate_vkbuffercopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001368 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBuffer contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001369 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001370 }
1371 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001372 device_dispatch_table(cmdBuffer)->CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001373}
1374
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001375VK_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 -06001376{
1377 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001378 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001379 sprintf(str, "Parameter srcImageLayout to function CmdCopyImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001380 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001381 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001382 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001383 sprintf(str, "Parameter destImageLayout to function CmdCopyImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001384 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001385 }
1386 uint32_t i;
1387 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001388 if (!vk_validate_vkimagecopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001389 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001390 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001391 }
1392 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001393 device_dispatch_table(cmdBuffer)->CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001394}
1395
Mark Lobodzinski20f68592015-05-22 14:43:25 -05001396VK_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 -06001397{
1398 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001399 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001400 sprintf(str, "Parameter srcImageLayout to function CmdBlitImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001401 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001402 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001403 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001404 sprintf(str, "Parameter destImageLayout to function CmdBlitImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001405 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001406 }
1407 uint32_t i;
1408 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001409 if (!vk_validate_vkimageblit(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001410 sprintf(str, "Parameter pRegions[%i] to function CmdBlitImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001411 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001412 }
1413 }
Mark Lobodzinski20f68592015-05-22 14:43:25 -05001414 //TODO: Add additional check for limitation from header rev 96.
1415 // VK_TEX_FILTER_NEAREST if the format that srcImage was created with is an integer-based format.
1416
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001417 device_dispatch_table(cmdBuffer)->CmdBlitImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001418}
1419
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001420VK_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 -06001421{
1422 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001423 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001424 sprintf(str, "Parameter destImageLayout to function CmdCopyBufferToImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001425 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001426 }
1427 uint32_t i;
1428 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001429 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001430 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBufferToImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001431 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001432 }
1433 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001434 device_dispatch_table(cmdBuffer)->CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001435}
1436
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001437VK_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 -06001438{
1439 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001440 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001441 sprintf(str, "Parameter srcImageLayout to function CmdCopyImageToBuffer has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001442 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001443 }
1444 uint32_t i;
1445 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001446 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001447 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImageToBuffer contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001448 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001449 }
1450 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001451 device_dispatch_table(cmdBuffer)->CmdCopyImageToBuffer(cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001452}
1453
Tony Barbour8205d902015-04-16 15:59:00 -06001454VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001455{
1456
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001457 device_dispatch_table(cmdBuffer)->CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001458}
1459
Tony Barbour8205d902015-04-16 15:59:00 -06001460VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001461{
1462
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001463 device_dispatch_table(cmdBuffer)->CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001464}
1465
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -06001466VK_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 -06001467{
1468 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001469 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001470 sprintf(str, "Parameter imageLayout to function CmdClearColorImage has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001471 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001472 }
1473 uint32_t i;
1474 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001475 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001476 sprintf(str, "Parameter pRanges[%i] to function CmdClearColorImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001477 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001478 }
1479 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001480 device_dispatch_table(cmdBuffer)->CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001481}
1482
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001483VK_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 -06001484{
1485 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001486 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001487 sprintf(str, "Parameter imageLayout to function CmdClearDepthStencil has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001488 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001489 }
1490 uint32_t i;
1491 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001492 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001493 sprintf(str, "Parameter pRanges[%i] to function CmdClearDepthStencil contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001494 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001495 }
1496 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001497 device_dispatch_table(cmdBuffer)->CmdClearDepthStencil(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001498}
1499
Tony Barbour11f74372015-04-13 15:02:52 -06001500VK_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 -06001501{
1502 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001503 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001504 sprintf(str, "Parameter srcImageLayout to function CmdResolveImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001505 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001506 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001507 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001508 sprintf(str, "Parameter destImageLayout to function CmdResolveImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001509 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001510 }
1511 uint32_t i;
Tony Barbour11f74372015-04-13 15:02:52 -06001512 for (i = 0; i < regionCount; i++) {
1513 if (!vk_validate_vkimageresolve(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001514 sprintf(str, "Parameter pRects[%i] to function CmdResolveImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001515 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001516 }
1517 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001518 device_dispatch_table(cmdBuffer)->CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001519}
1520
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001521VK_LAYER_EXPORT void VKAPI vkCmdSetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001522{
1523 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001524 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001525 sprintf(str, "Parameter pipeEvent to function CmdSetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001526 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001527 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001528 device_dispatch_table(cmdBuffer)->CmdSetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001529}
1530
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001531VK_LAYER_EXPORT void VKAPI vkCmdResetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001532{
1533 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001534 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001535 sprintf(str, "Parameter pipeEvent to function CmdResetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001536 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001537 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001538 device_dispatch_table(cmdBuffer)->CmdResetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001539}
1540
Tony Barbour8205d902015-04-16 15:59:00 -06001541VK_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 -06001542{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001543 device_dispatch_table(cmdBuffer)->CmdWaitEvents(cmdBuffer, waitEvent, eventCount, pEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001544}
1545
Tony Barbour8205d902015-04-16 15:59:00 -06001546VK_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 -06001547{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001548 device_dispatch_table(cmdBuffer)->CmdPipelineBarrier(cmdBuffer, waitEvent, pipeEventCount, pPipeEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001549}
1550
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001551VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001552{
1553
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001554 device_dispatch_table(cmdBuffer)->CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001555}
1556
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001557VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001558{
1559
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001560 device_dispatch_table(cmdBuffer)->CmdEndQuery(cmdBuffer, queryPool, slot);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001561}
1562
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001563VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001564{
1565
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001566 device_dispatch_table(cmdBuffer)->CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001567}
1568
Tony Barbour8205d902015-04-16 15:59:00 -06001569VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkTimestampType timestampType, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001570{
1571 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001572 if (!validate_VkTimestampType(timestampType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001573 sprintf(str, "Parameter timestampType to function CmdWriteTimestamp has invalid value of %i.", (int)timestampType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001574 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001575 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001576 device_dispatch_table(cmdBuffer)->CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001577}
1578
Jeremy Hayescf469132015-04-17 10:36:53 -06001579VK_LAYER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(
1580 VkCmdBuffer cmdBuffer,
1581 VkQueryPool queryPool,
1582 uint32_t startQuery,
1583 uint32_t queryCount,
1584 VkBuffer destBuffer,
1585 VkDeviceSize destOffset,
1586 VkDeviceSize destStride,
1587 VkQueryResultFlags flags)
1588{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001589 device_dispatch_table(cmdBuffer)->CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, destStride, flags);
Jeremy Hayescf469132015-04-17 10:36:53 -06001590}
1591
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001592VK_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 -06001593{
1594 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001595 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001596 sprintf(str, "Parameter pipelineBindPoint to function CmdInitAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001597 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001598 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001599 device_dispatch_table(cmdBuffer)->CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001600}
1601
Tony Barbour8205d902015-04-16 15:59:00 -06001602VK_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 -06001603{
1604 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001605 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001606 sprintf(str, "Parameter pipelineBindPoint to function CmdLoadAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001607 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001608 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001609 device_dispatch_table(cmdBuffer)->CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001610}
1611
Tony Barbour8205d902015-04-16 15:59:00 -06001612VK_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 -06001613{
1614 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001615 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001616 sprintf(str, "Parameter pipelineBindPoint to function CmdSaveAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001617 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001618 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001619 device_dispatch_table(cmdBuffer)->CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001620}
1621
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001622VK_LAYER_EXPORT VkResult VKAPI vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, VkFramebuffer* pFramebuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001623{
1624 char str[1024];
1625 if (!pCreateInfo) {
1626 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFramebuffer is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001627 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001628 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001629 else if (!vk_validate_vkframebuffercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001630 sprintf(str, "Parameter pCreateInfo to function CreateFramebuffer contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001631 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001632 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001633 VkResult result = device_dispatch_table(device)->CreateFramebuffer(device, pCreateInfo, pFramebuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001634 return result;
1635}
1636
1637
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001638void PreCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001639{
1640 if(pCreateInfo == nullptr)
1641 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001642 char const str[] = "vkCreateRenderPass parameter, VkRenderPassCreateInfo* pCreateInfo, is "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001643 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001644 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001645 return;
1646 }
1647
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001648 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001649 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001650 char const str[] = "vkCreateRenderPass parameter, VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO "\
1651 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001652 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001653 return;
1654 }
1655
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001656 if(!vk_validate_vkrect(&pCreateInfo->renderArea))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001657 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001658 char const str[] = "vkCreateRenderPass parameter, VkRect pCreateInfo->renderArea, is invalid "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001659 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001660 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001661 return;
1662 }
1663
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001664 if(!vk_validate_vkextent2d(&pCreateInfo->extent))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001665 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001666 char const str[] = "vkCreateRenderPass parameter, VkExtent2D pCreateInfo->extent, is invalid "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001667 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001668 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001669 return;
1670 }
1671
1672 if(pCreateInfo->pColorFormats == nullptr)
1673 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001674 char const str[] = "vkCreateRenderPass parameter, VkFormat* pCreateInfo->pColorFormats, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001675 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001676 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001677 return;
1678 }
1679
1680 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1681 {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001682 if(!validate_VkFormat(pCreateInfo->pColorFormats[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001683 {
1684 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001685 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001686 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001687 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001688 continue;
1689 }
1690
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001691 VkFormatProperties properties;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001692 size_t size = sizeof(properties);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001693 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->pColorFormats[i],
Tony Barbour8205d902015-04-16 15:59:00 -06001694 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001695 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001696 {
1697 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001698 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001699 "], cannot be validated (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001700 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001701 continue;
1702 }
1703
1704 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1705 {
1706 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001707 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001708 "], contains unsupported format (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001709 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001710 continue;
1711 }
1712
1713 }
1714
1715 if(pCreateInfo->pColorLayouts == nullptr)
1716 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001717 char const str[] = "vkCreateRenderPass parameter, VkImageLayout* pCreateInfo->pColorLayouts, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001718 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001719 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001720 return;
1721 }
1722
1723 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1724 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001725 if(!validate_VkImageLayout(pCreateInfo->pColorLayouts[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001726 {
1727 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001728 ss << "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pColorLayouts[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001729 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001730 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001731 continue;
1732 }
1733 }
1734
1735 if(pCreateInfo->pColorLoadOps == nullptr)
1736 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001737 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp* pCreateInfo->pColorLoadOps, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001738 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001739 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001740 return;
1741 }
1742
1743 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1744 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001745 if(!validate_VkAttachmentLoadOp(pCreateInfo->pColorLoadOps[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001746 {
1747 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001748 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pColorLoadOps[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001749 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001750 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001751 continue;
1752 }
1753 }
1754
1755 if(pCreateInfo->pColorStoreOps == nullptr)
1756 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001757 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp* pCreateInfo->pColorStoreOps, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001758 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001759 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001760 return;
1761 }
1762
1763 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1764 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001765 if(!validate_VkAttachmentStoreOp(pCreateInfo->pColorStoreOps[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001766 {
1767 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001768 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pColorStoreOps[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001769 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001770 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001771 continue;
1772 }
1773 }
1774
1775 if(pCreateInfo->pColorLoadClearValues == nullptr)
1776 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001777 char const str[] = "vkCreateRenderPass parameter, VkClearColor* pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001778 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001779 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001780 return;
1781 }
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001782
1783 if(pCreateInfo->pColorStoreOps == nullptr)
1784 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001785 char const str[] = "vkCreateRenderPass parameter, VK_ATTACHMENT_STORE_OP* pCreateInfo->pColorStoreOps, "\
Jeremy Hayes9bafb9f2015-04-07 13:38:03 -06001786 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001787 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001788 return;
1789 }
1790
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001791 if(pCreateInfo->pColorLoadClearValues == nullptr)
1792 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001793 char const str[] = "vkCreateRenderPass parameter, VK_CLEAR_COLOR* pCreateInfo->"\
Jeremy Hayes9bafb9f2015-04-07 13:38:03 -06001794 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001795 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001796 return;
1797 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001798
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001799 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1800 {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001801 if(!vk_validate_vkclearcolor(&(pCreateInfo->pColorLoadClearValues[i])))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001802 {
1803 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001804 ss << "vkCreateRenderPass parameter, VkClearColor pCreateInfo->pColorLoadClearValues[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001805 "], is invalid (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001806 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001807 continue;
1808 }
1809 }
1810
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001811 if(!validate_VkFormat(pCreateInfo->depthStencilFormat))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001812 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001813 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001814 "depthStencilFormat, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001815 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001816 return;
1817 }
1818
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001819 VkFormatProperties properties;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001820 size_t size = sizeof(properties);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001821 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->depthStencilFormat,
Tony Barbour8205d902015-04-16 15:59:00 -06001822 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001823 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001824 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001825 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001826 "depthStencilFormat, cannot be validated (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001827 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001828 return;
1829 }
1830
1831 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1832 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001833 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001834 "depthStencilFormat, contains unsupported format (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001835 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001836 return;
1837 }
1838
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001839 if(!validate_VkImageLayout(pCreateInfo->depthStencilLayout))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001840 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001841 char const str[] = "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001842 "depthStencilLayout, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001843 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001844 return;
1845 }
1846
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001847 if(!validate_VkAttachmentLoadOp(pCreateInfo->depthLoadOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001848 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001849 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001850 "depthLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001851 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001852 return;
1853 }
1854
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001855 if(!validate_VkAttachmentStoreOp(pCreateInfo->depthStoreOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001856 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001857 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001858 "depthStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001859 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001860 return;
1861 }
1862
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001863 if(!validate_VkAttachmentLoadOp(pCreateInfo->stencilLoadOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001864 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001865 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001866 "stencilLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001867 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001868 return;
1869 }
1870
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001871 if(!validate_VkAttachmentStoreOp(pCreateInfo->stencilStoreOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001872 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001873 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001874 "stencilStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001875 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001876 return;
1877 }
1878}
1879
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001880void PostCreateRenderPass(VkResult result, VkRenderPass* pRenderPass)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001881{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001882 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001883 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001884 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001885 char const str[] = "vkCreateRenderPass failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001886 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001887 return;
1888 }
1889
1890 if(pRenderPass == nullptr)
1891 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001892 char const str[] = "vkCreateRenderPass parameter, VkRenderPass* pRenderPass, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001893 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001894 return;
1895 }
1896}
1897
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001898VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, VkRenderPass* pRenderPass)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001899{
1900 PreCreateRenderPass(device, pCreateInfo);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001901 VkResult result = device_dispatch_table(device)->CreateRenderPass(device, pCreateInfo, pRenderPass);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001902 PostCreateRenderPass(result, pRenderPass);
1903 return result;
1904}
1905
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001906VK_LAYER_EXPORT void VKAPI vkCmdBeginRenderPass(VkCmdBuffer cmdBuffer, const VkRenderPassBegin* pRenderPassBegin)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001907{
1908 char str[1024];
1909 if (!pRenderPassBegin) {
1910 sprintf(str, "Struct ptr parameter pRenderPassBegin to function CmdBeginRenderPass is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001911 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001912 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001913 else if (!vk_validate_vkrenderpassbegin(pRenderPassBegin)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001914 sprintf(str, "Parameter pRenderPassBegin to function CmdBeginRenderPass contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001915 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001916 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001917 device_dispatch_table(cmdBuffer)->CmdBeginRenderPass(cmdBuffer, pRenderPassBegin);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001918}
1919
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001920VK_LAYER_EXPORT void VKAPI vkCmdEndRenderPass(VkCmdBuffer cmdBuffer, VkRenderPass renderPass)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001921{
1922
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001923 device_dispatch_table(cmdBuffer)->CmdEndRenderPass(cmdBuffer, renderPass);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001924}
1925
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001926VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback(
1927 VkInstance instance,
1928 VkFlags msgFlags,
1929 const PFN_vkDbgMsgCallback pfnMsgCallback,
1930 void* pUserData,
1931 VkDbgMsgCallback* pMsgCallback)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001932{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001933 VkLayerInstanceDispatchTable *pDisp = *(VkLayerInstanceDispatchTable **) instance;
1934 VkLayerInstanceDispatchTable *pTable = tableInstanceMap[pDisp];
1935 return layer_create_msg_callback(instance, pTable, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001936}
1937
Courtney Goeltzenleuchter09f85042015-06-01 14:45:27 -06001938VK_LAYER_EXPORT VkResult VKAPI vkDbgDestroyMsgCallback(
1939 VkInstance instance,
1940 VkDbgMsgCallback msgCallback)
1941{
1942 VkLayerInstanceDispatchTable *pDisp = *(VkLayerInstanceDispatchTable **) instance;
1943 VkLayerInstanceDispatchTable *pTable = tableInstanceMap[pDisp];
1944 return layer_destroy_msg_callback(instance, pTable, msgCallback);
1945}
1946
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001947VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerBegin(VkCmdBuffer cmdBuffer, const char* pMarker)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001948{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001949 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) cmdBuffer;
1950 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
Jon Ashburnf0615e22015-05-25 14:11:37 -06001951 if (!pTable->ext_enabled) {
1952 char const str[] = "Attempt to use CmdDbgMarkerBegin but extension disabled!";
1953 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1954 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001955 pTable->CmdDbgMarkerBegin(cmdBuffer, pMarker);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001956}
1957
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001958VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerEnd(VkCmdBuffer cmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001959{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001960 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) cmdBuffer;
1961 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
Jon Ashburnf0615e22015-05-25 14:11:37 -06001962 if (!pTable->ext_enabled) {
1963 char const str[] = "Attempt to use CmdDbgMarkerEnd but extension disabled!";
1964 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1965 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001966 pTable->CmdDbgMarkerEnd(cmdBuffer);
Jon Ashburnf0615e22015-05-25 14:11:37 -06001967}
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001968
Jon Ashburnf0615e22015-05-25 14:11:37 -06001969VkResult VKAPI vkDbgSetObjectTag(VkDevice device, VkObjectType objType, VkObject object, size_t tagSize, const void* pTag)
1970{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001971 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) device;
1972 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
Jon Ashburnf0615e22015-05-25 14:11:37 -06001973 if (!pTable->ext_enabled) {
1974 char const str[] = "Attempt to use DbgSetObjectTag but extension disabled!";
1975 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1976 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001977 pTable->DbgSetObjectTag(device, objType, object, tagSize, pTag);
Jon Ashburnf0615e22015-05-25 14:11:37 -06001978}
1979
1980VkResult VKAPI vkDbgSetObjectName(VkDevice device, VkObjectType objType, VkObject object, size_t nameSize, const char* pName)
1981{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001982 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) device;
1983 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
1984
Jon Ashburnf0615e22015-05-25 14:11:37 -06001985 if (!pTable->ext_enabled) {
1986 char const str[] = "Attempt to use DbgSetObjectName but extension disabled!";
1987 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1988 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001989 pTable->DbgSetObjectName(device, objType, object, nameSize, pName);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001990}
1991
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001992VK_LAYER_EXPORT VkResult VKAPI vkGetDisplayInfoWSI(VkDisplayWSI display, VkDisplayInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001993{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001994 VkResult result = instance_dispatch_table(display)->GetDisplayInfoWSI(display, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001995 return result;
1996}
1997
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001998VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI(VkDevice device, const VkSwapChainCreateInfoWSI* pCreateInfo, VkSwapChainWSI* pSwapChain)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001999{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002000 VkResult result = device_dispatch_table(device)->CreateSwapChainWSI(device, pCreateInfo, pSwapChain);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002001 return result;
2002}
2003
Chia-I Wu5b66aa52015-04-16 22:02:10 +08002004VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapChainWSI(VkSwapChainWSI swapChain)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002005{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002006 VkResult result = device_dispatch_table(swapChain)->DestroySwapChainWSI(swapChain);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002007 return result;
2008}
2009
Chia-I Wu5b66aa52015-04-16 22:02:10 +08002010VK_LAYER_EXPORT VkResult VKAPI vkGetSwapChainInfoWSI(VkSwapChainWSI swapChain, VkSwapChainInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002011{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002012 VkResult result = device_dispatch_table(swapChain)->GetSwapChainInfoWSI(swapChain, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002013 return result;
2014}
2015
Chia-I Wu5b66aa52015-04-16 22:02:10 +08002016VK_LAYER_EXPORT VkResult VKAPI vkQueuePresentWSI(VkQueue queue, const VkPresentInfoWSI* pPresentInfo)
2017{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002018 VkResult result = device_dispatch_table(queue)->QueuePresentWSI(queue, pPresentInfo);
Chia-I Wu5b66aa52015-04-16 22:02:10 +08002019 return result;
2020}
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002021
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002022static inline void* layer_intercept_proc(const char *name)
2023{
2024 if (!name || name[0] != 'v' || name[1] != 'k')
2025 return NULL;
2026
2027 name += 2;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002028 if (!strcmp(name, "DestroyDevice"))
2029 return (void*) vkDestroyDevice;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002030 if (!strcmp(name, "GetDeviceQueue"))
2031 return (void*) vkGetDeviceQueue;
2032 if (!strcmp(name, "QueueSubmit"))
2033 return (void*) vkQueueSubmit;
2034 if (!strcmp(name, "QueueWaitIdle"))
2035 return (void*) vkQueueWaitIdle;
2036 if (!strcmp(name, "DeviceWaitIdle"))
2037 return (void*) vkDeviceWaitIdle;
2038 if (!strcmp(name, "AllocMemory"))
2039 return (void*) vkAllocMemory;
2040 if (!strcmp(name, "FreeMemory"))
2041 return (void*) vkFreeMemory;
2042 if (!strcmp(name, "SetMemoryPriority"))
2043 return (void*) vkSetMemoryPriority;
2044 if (!strcmp(name, "MapMemory"))
2045 return (void*) vkMapMemory;
2046 if (!strcmp(name, "UnmapMemory"))
2047 return (void*) vkUnmapMemory;
2048 if (!strcmp(name, "FlushMappedMemoryRanges"))
2049 return (void*) vkFlushMappedMemoryRanges;
2050 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
2051 return (void*) vkInvalidateMappedMemoryRanges;
2052 if (!strcmp(name, "PinSystemMemory"))
2053 return (void*) vkPinSystemMemory;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002054 if (!strcmp(name, "OpenSharedMemory"))
2055 return (void*) vkOpenSharedMemory;
2056 if (!strcmp(name, "OpenSharedSemaphore"))
2057 return (void*) vkOpenSharedSemaphore;
2058 if (!strcmp(name, "OpenPeerMemory"))
2059 return (void*) vkOpenPeerMemory;
2060 if (!strcmp(name, "OpenPeerImage"))
2061 return (void*) vkOpenPeerImage;
2062 if (!strcmp(name, "DestroyObject"))
2063 return (void*) vkDestroyObject;
2064 if (!strcmp(name, "GetObjectInfo"))
2065 return (void*) vkGetObjectInfo;
2066 if (!strcmp(name, "CreateFence"))
2067 return (void*) vkCreateFence;
2068 if (!strcmp(name, "ResetFences"))
2069 return (void*) vkResetFences;
2070 if (!strcmp(name, "GetFenceStatus"))
2071 return (void*) vkGetFenceStatus;
2072 if (!strcmp(name, "WaitForFences"))
2073 return (void*) vkWaitForFences;
2074 if (!strcmp(name, "CreateSemaphore"))
2075 return (void*) vkCreateSemaphore;
2076 if (!strcmp(name, "QueueSignalSemaphore"))
2077 return (void*) vkQueueSignalSemaphore;
2078 if (!strcmp(name, "QueueWaitSemaphore"))
2079 return (void*) vkQueueWaitSemaphore;
2080 if (!strcmp(name, "CreateEvent"))
2081 return (void*) vkCreateEvent;
2082 if (!strcmp(name, "GetEventStatus"))
2083 return (void*) vkGetEventStatus;
2084 if (!strcmp(name, "SetEvent"))
2085 return (void*) vkSetEvent;
2086 if (!strcmp(name, "ResetEvent"))
2087 return (void*) vkResetEvent;
2088 if (!strcmp(name, "CreateQueryPool"))
2089 return (void*) vkCreateQueryPool;
2090 if (!strcmp(name, "GetQueryPoolResults"))
2091 return (void*) vkGetQueryPoolResults;
2092 if (!strcmp(name, "GetFormatInfo"))
2093 return (void*) vkGetFormatInfo;
2094 if (!strcmp(name, "CreateBuffer"))
2095 return (void*) vkCreateBuffer;
2096 if (!strcmp(name, "CreateBufferView"))
2097 return (void*) vkCreateBufferView;
2098 if (!strcmp(name, "CreateImage"))
2099 return (void*) vkCreateImage;
2100 if (!strcmp(name, "GetImageSubresourceInfo"))
2101 return (void*) vkGetImageSubresourceInfo;
2102 if (!strcmp(name, "CreateImageView"))
2103 return (void*) vkCreateImageView;
2104 if (!strcmp(name, "CreateColorAttachmentView"))
2105 return (void*) vkCreateColorAttachmentView;
2106 if (!strcmp(name, "CreateDepthStencilView"))
2107 return (void*) vkCreateDepthStencilView;
2108 if (!strcmp(name, "CreateShader"))
2109 return (void*) vkCreateShader;
2110 if (!strcmp(name, "CreateGraphicsPipeline"))
2111 return (void*) vkCreateGraphicsPipeline;
2112 if (!strcmp(name, "CreateGraphicsPipelineDerivative"))
2113 return (void*) vkCreateGraphicsPipelineDerivative;
2114 if (!strcmp(name, "CreateComputePipeline"))
2115 return (void*) vkCreateComputePipeline;
2116 if (!strcmp(name, "StorePipeline"))
2117 return (void*) vkStorePipeline;
2118 if (!strcmp(name, "LoadPipeline"))
2119 return (void*) vkLoadPipeline;
2120 if (!strcmp(name, "LoadPipelineDerivative"))
2121 return (void*) vkLoadPipelineDerivative;
2122 if (!strcmp(name, "CreatePipelineLayout"))
2123 return (void*) vkCreatePipelineLayout;
2124 if (!strcmp(name, "CreateSampler"))
2125 return (void*) vkCreateSampler;
2126 if (!strcmp(name, "CreateDescriptorSetLayout"))
2127 return (void*) vkCreateDescriptorSetLayout;
2128 if (!strcmp(name, "CreateDescriptorPool"))
2129 return (void*) vkCreateDescriptorPool;
2130 if (!strcmp(name, "ResetDescriptorPool"))
2131 return (void*) vkResetDescriptorPool;
2132 if (!strcmp(name, "AllocDescriptorSets"))
2133 return (void*) vkAllocDescriptorSets;
2134 if (!strcmp(name, "ClearDescriptorSets"))
2135 return (void*) vkClearDescriptorSets;
2136 if (!strcmp(name, "CreateDynamicViewportState"))
2137 return (void*) vkCreateDynamicViewportState;
2138 if (!strcmp(name, "CreateDynamicRasterState"))
2139 return (void*) vkCreateDynamicRasterState;
2140 if (!strcmp(name, "CreateDynamicColorBlendState"))
2141 return (void*) vkCreateDynamicColorBlendState;
2142 if (!strcmp(name, "CreateDynamicDepthStencilState"))
2143 return (void*) vkCreateDynamicDepthStencilState;
2144 if (!strcmp(name, "CreateCommandBuffer"))
2145 return (void*) vkCreateCommandBuffer;
2146 if (!strcmp(name, "BeginCommandBuffer"))
2147 return (void*) vkBeginCommandBuffer;
2148 if (!strcmp(name, "EndCommandBuffer"))
2149 return (void*) vkEndCommandBuffer;
2150 if (!strcmp(name, "ResetCommandBuffer"))
2151 return (void*) vkResetCommandBuffer;
2152 if (!strcmp(name, "CmdBindPipeline"))
2153 return (void*) vkCmdBindPipeline;
2154 if (!strcmp(name, "CmdBindDynamicStateObject"))
2155 return (void*) vkCmdBindDynamicStateObject;
2156 if (!strcmp(name, "CmdBindDescriptorSets"))
2157 return (void*) vkCmdBindDescriptorSets;
2158 if (!strcmp(name, "CmdBindVertexBuffers"))
2159 return (void*) vkCmdBindVertexBuffers;
2160 if (!strcmp(name, "CmdBindIndexBuffer"))
2161 return (void*) vkCmdBindIndexBuffer;
2162 if (!strcmp(name, "CmdDraw"))
2163 return (void*) vkCmdDraw;
2164 if (!strcmp(name, "CmdDrawIndexed"))
2165 return (void*) vkCmdDrawIndexed;
2166 if (!strcmp(name, "CmdDrawIndirect"))
2167 return (void*) vkCmdDrawIndirect;
2168 if (!strcmp(name, "CmdDrawIndexedIndirect"))
2169 return (void*) vkCmdDrawIndexedIndirect;
2170 if (!strcmp(name, "CmdDispatch"))
2171 return (void*) vkCmdDispatch;
2172 if (!strcmp(name, "CmdDispatchIndirect"))
2173 return (void*) vkCmdDispatchIndirect;
2174 if (!strcmp(name, "CmdCopyBuffer"))
2175 return (void*) vkCmdCopyBuffer;
2176 if (!strcmp(name, "CmdCopyImage"))
2177 return (void*) vkCmdCopyImage;
2178 if (!strcmp(name, "CmdBlitImage"))
2179 return (void*) vkCmdBlitImage;
2180 if (!strcmp(name, "CmdCopyBufferToImage"))
2181 return (void*) vkCmdCopyBufferToImage;
2182 if (!strcmp(name, "CmdCopyImageToBuffer"))
2183 return (void*) vkCmdCopyImageToBuffer;
2184 if (!strcmp(name, "CmdUpdateBuffer"))
2185 return (void*) vkCmdUpdateBuffer;
2186 if (!strcmp(name, "CmdFillBuffer"))
2187 return (void*) vkCmdFillBuffer;
2188 if (!strcmp(name, "CmdClearColorImage"))
2189 return (void*) vkCmdClearColorImage;
2190 if (!strcmp(name, "CmdClearDepthStencil"))
2191 return (void*) vkCmdClearDepthStencil;
2192 if (!strcmp(name, "CmdResolveImage"))
2193 return (void*) vkCmdResolveImage;
2194 if (!strcmp(name, "CmdSetEvent"))
2195 return (void*) vkCmdSetEvent;
2196 if (!strcmp(name, "CmdResetEvent"))
2197 return (void*) vkCmdResetEvent;
2198 if (!strcmp(name, "CmdWaitEvents"))
2199 return (void*) vkCmdWaitEvents;
2200 if (!strcmp(name, "CmdPipelineBarrier"))
2201 return (void*) vkCmdPipelineBarrier;
2202 if (!strcmp(name, "CmdBeginQuery"))
2203 return (void*) vkCmdBeginQuery;
2204 if (!strcmp(name, "CmdEndQuery"))
2205 return (void*) vkCmdEndQuery;
2206 if (!strcmp(name, "CmdResetQueryPool"))
2207 return (void*) vkCmdResetQueryPool;
2208 if (!strcmp(name, "CmdWriteTimestamp"))
2209 return (void*) vkCmdWriteTimestamp;
2210 if (!strcmp(name, "CmdCopyQueryPoolResults"))
2211 return (void*) vkCmdCopyQueryPoolResults;
2212 if (!strcmp(name, "CmdInitAtomicCounters"))
2213 return (void*) vkCmdInitAtomicCounters;
2214 if (!strcmp(name, "CmdLoadAtomicCounters"))
2215 return (void*) vkCmdLoadAtomicCounters;
2216 if (!strcmp(name, "CmdSaveAtomicCounters"))
2217 return (void*) vkCmdSaveAtomicCounters;
2218 if (!strcmp(name, "CreateFramebuffer"))
2219 return (void*) vkCreateFramebuffer;
2220 if (!strcmp(name, "CreateRenderPass"))
2221 return (void*) vkCreateRenderPass;
2222 if (!strcmp(name, "CmdBeginRenderPass"))
2223 return (void*) vkCmdBeginRenderPass;
2224 if (!strcmp(name, "CmdEndRenderPass"))
2225 return (void*) vkCmdEndRenderPass;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002226 if (!strcmp(name, "CmdDbgMarkerBegin"))
2227 return (void*) vkCmdDbgMarkerBegin;
2228 if (!strcmp(name, "CmdDbgMarkerEnd"))
2229 return (void*) vkCmdDbgMarkerEnd;
2230 if (!strcmp(name, "GetDisplayInfoWSI"))
2231 return (void*) vkGetDisplayInfoWSI;
2232 if (!strcmp(name, "CreateSwapChainWSI"))
2233 return (void*) vkCreateSwapChainWSI;
2234 if (!strcmp(name, "DestroySwapChainWSI"))
2235 return (void*) vkDestroySwapChainWSI;
2236 if (!strcmp(name, "GetSwapChainInfoWSI"))
2237 return (void*) vkGetSwapChainInfoWSI;
2238 if (!strcmp(name, "QueuePresentWSI"))
2239 return (void*) vkQueuePresentWSI;
2240
2241 return NULL;
2242}
2243
2244static inline void* layer_intercept_instance_proc(const char *name)
2245{
2246 if (!name || name[0] != 'v' || name[1] != 'k')
2247 return NULL;
2248
2249 name += 2;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002250 if (!strcmp(name, "CreateInstance"))
2251 return (void*) vkCreateInstance;
2252 if (!strcmp(name, "DestroyInstance"))
2253 return (void*) vkDestroyInstance;
2254 if (!strcmp(name, "GetPhysicalDeviceInfo"))
2255 return (void*) vkGetPhysicalDeviceInfo;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002256 if (!strcmp(name, "CreateDevice"))
2257 return (void*) vkCreateDevice;
2258 if (!strcmp(name, "GetGlobalExtensionInfo"))
2259 return (void*) vkGetGlobalExtensionInfo;
2260 if (!strcmp(name, "GetPhysicalDeviceExtensionInfo"))
2261 return (void*) vkGetPhysicalDeviceExtensionInfo;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002262 if (!strcmp(name, "GetMultiDeviceCompatibility"))
2263 return (void*) vkGetMultiDeviceCompatibility;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002264
2265 return NULL;
2266}
2267
Jon Ashburn1245cec2015-05-18 13:20:15 -06002268VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002269{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002270 void* addr;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002271 if (device == NULL) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002272 return NULL;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002273 }
2274
Jon Ashburnd9564002015-05-07 10:27:37 -06002275 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002276
2277 /* loader uses this to force layer initialization; device object is wrapped */
2278 if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
2279 initDeviceTable((const VkBaseLayerObject *) device);
2280 return (void*) vkGetDeviceProcAddr;
2281 }
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002282
2283 addr = layer_intercept_proc(funcName);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002284 if (addr) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002285 return addr;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002286 }
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002287 else {
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002288 VkLayerDispatchTable **ppDisp = (VkLayerDispatchTable **) device;
2289 VkLayerDispatchTable* pTable = tableMap[*ppDisp];
2290 if (pTable->GetDeviceProcAddr == NULL)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002291 return NULL;
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002292 return pTable->GetDeviceProcAddr(device, funcName);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002293 }
2294}
2295
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002296VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002297{
Courtney Goeltzenleuchter09f85042015-06-01 14:45:27 -06002298 void *fptr;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002299 void* addr;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002300 if (instance == NULL) {
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002301 return NULL;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002302 }
2303
Jon Ashburnd9564002015-05-07 10:27:37 -06002304 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002305
2306 /* loader uses this to force layer initialization; instance object is wrapped */
2307 if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
2308 initInstanceTable((const VkBaseLayerObject *) instance);
2309 return (void*) vkGetInstanceProcAddr;
2310 }
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002311
2312 addr = layer_intercept_instance_proc(funcName);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002313 if (addr) {
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002314 return addr;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002315 }
Courtney Goeltzenleuchter09f85042015-06-01 14:45:27 -06002316
2317 fptr = msg_callback_get_proc_addr(funcName);
2318 if (fptr)
2319 return fptr;
2320
2321 {
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002322 VkLayerInstanceDispatchTable **ppDisp = (VkLayerInstanceDispatchTable **) instance;
2323 VkLayerInstanceDispatchTable* pTable = tableInstanceMap[*ppDisp];
2324 if (pTable->GetInstanceProcAddr == NULL)
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002325 return NULL;
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002326 return pTable->GetInstanceProcAddr(instance, funcName);
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002327 }
2328}