blob: 79903f3feecdb68fccc93845586401224ef58063 [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 }
192}
193
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600194VK_LAYER_EXPORT VkResult VKAPI vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600195{
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600196 loader_platform_thread_once(&initOnce, initParamChecker);
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600197
Jon Ashburn29669a42015-04-04 14:52:07 -0600198 PreCreateInstance(pCreateInfo->pAppInfo, pCreateInfo->pAllocCb);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500199 VkResult result = instance_dispatch_table(*pInstance)->CreateInstance(pCreateInfo, pInstance);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600200 PostCreateInstance(result, pCreateInfo, pInstance);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600201 return result;
202}
203
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600204VK_LAYER_EXPORT VkResult VKAPI vkDestroyInstance(VkInstance instance)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600205{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500206 VkLayerInstanceDispatchTable *pDisp = *(VkLayerInstanceDispatchTable **) instance;
207 VkResult res = instance_dispatch_table(instance)->DestroyInstance(instance);
208 tableInstanceMap.erase(pDisp);
209 return res;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600210}
211
Tony Barbour8205d902015-04-16 15:59:00 -0600212VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceInfo(VkPhysicalDevice gpu, VkPhysicalDeviceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600213{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600214 char str[1024];
Tony Barbour8205d902015-04-16 15:59:00 -0600215 if (!validate_VkPhysicalDeviceInfoType(infoType)) {
216 sprintf(str, "Parameter infoType to function GetPhysicalDeviceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600217 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600218 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500219 VkResult result = instance_dispatch_table(gpu)->GetPhysicalDeviceInfo(gpu, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600220 return result;
221}
222
Tony Barbour8205d902015-04-16 15:59:00 -0600223void PreCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600224{
225 if(gpu == nullptr)
226 {
Tony Barbour8205d902015-04-16 15:59:00 -0600227 char const str[] = "vkCreateDevice parameter, VkPhysicalDevice gpu, is nullptr "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600228 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600229 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600230 return;
231 }
232
233 if(pCreateInfo == nullptr)
234 {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600235 char const str[] = "vkCreateDevice parameter, VkDeviceCreateInfo* pCreateInfo, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600236 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600237 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600238 return;
239 }
240
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600241 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600242 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600243 char const str[] = "vkCreateDevice parameter, VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO "\
244 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600245 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600246 return;
247 }
248
249 if(pCreateInfo->queueRecordCount == 0)
250 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600251 char const str[] = "vkCreateDevice parameter, uint32_t pCreateInfo->queueRecordCount, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600252 "zero (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600253 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600254 return;
255 }
256
257 if(pCreateInfo->pRequestedQueues == nullptr)
258 {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600259 char const str[] = "vkCreateDevice parameter, VkDeviceQueueCreateInfo* pCreateInfo->pRequestedQueues, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600260 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600261 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600262 return;
263 }
264
265 for(uint32_t i = 0; i < pCreateInfo->queueRecordCount; ++i)
266 {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600267 if(!vk_validate_vkdevicequeuecreateinfo(&(pCreateInfo->pRequestedQueues[i])))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600268 {
269 std::stringstream ss;
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600270 ss << "vkCreateDevice parameter, VkDeviceQueueCreateInfo pCreateInfo->pRequestedQueues[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600271 "], is invalid (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600272 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600273 continue;
274 }
275 }
276
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600277}
278
Jon Ashburnf0615e22015-05-25 14:11:37 -0600279static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
280{
281 uint32_t i, ext_idx;
282 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) device;
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500283 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
Jon Ashburnf0615e22015-05-25 14:11:37 -0600284
285 for (i = 0; i < pCreateInfo->extensionCount; i++) {
286 if (strcmp(pCreateInfo->pEnabledExtensions[i].name, DEBUG_MARKER_EXTENSION_NAME) == 0) {
287 /* Found a matching extension name, mark it enabled */
288 pTable->ext_enabled = true;
289 }
290
291 }
292}
293
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600294void PostCreateDevice(VkResult result, const VkDeviceCreateInfo *pCreateInfo, VkDevice* pDevice)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600295{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600296 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600297 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600298 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600299 char const str[] = "vkCreateDevice failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600300 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600301 return;
302 }
303
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600304 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
Jon Ashburnf0615e22015-05-25 14:11:37 -0600305 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600306
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600307 if(pDevice == nullptr)
308 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600309 char const str[] = "vkCreateDevice parameter, VkDevice* pDevice, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600310 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600311 return;
312 }
313}
314
Tony Barbour8205d902015-04-16 15:59:00 -0600315VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600316{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600317 PreCreateDevice(gpu, pCreateInfo);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500318 VkResult result = instance_dispatch_table(gpu)->CreateDevice(gpu, pCreateInfo, pDevice);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600319 PostCreateDevice(result, pCreateInfo, pDevice);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600320 return result;
321}
322
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600323VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice(VkDevice device)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600324{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500325 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
326 VkLayerDispatchTable *pTable = tableMap[pDisp];
327 VkResult result = pTable->DestroyDevice(device);
328 tableMap.erase(pDisp);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600329 return result;
330}
331
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600332#define PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE 2
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600333static const VkExtensionProperties pcExts[PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE] = {
334 {
335 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
336 "ParamChecker",
337 0x10,
338 "Sample layer: ParamChecker",
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600339 },
340 {
341 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
342 "Validation",
343 0x10,
344 "Sample layer: ParamChecker",
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600345 }
Jon Ashburneb2728b2015-04-10 14:33:07 -0600346};
347
348VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo(
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600349 VkExtensionInfoType infoType,
350 uint32_t extensionIndex,
351 size_t* pDataSize,
352 void* pData)
Jon Ashburneb2728b2015-04-10 14:33:07 -0600353{
Jon Ashburneb2728b2015-04-10 14:33:07 -0600354 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
Jon Ashburneb2728b2015-04-10 14:33:07 -0600355 uint32_t *count;
356
357 if (pDataSize == NULL)
358 return VK_ERROR_INVALID_POINTER;
359
360 switch (infoType) {
361 case VK_EXTENSION_INFO_TYPE_COUNT:
362 *pDataSize = sizeof(uint32_t);
363 if (pData == NULL)
364 return VK_SUCCESS;
365 count = (uint32_t *) pData;
366 *count = PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE;
367 break;
368 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
369 *pDataSize = sizeof(VkExtensionProperties);
370 if (pData == NULL)
371 return VK_SUCCESS;
372 if (extensionIndex >= PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE)
373 return VK_ERROR_INVALID_VALUE;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600374 memcpy((VkExtensionProperties *) pData, &pcExts[extensionIndex], sizeof(VkExtensionProperties));
Jon Ashburneb2728b2015-04-10 14:33:07 -0600375 break;
376 default:
377 return VK_ERROR_INVALID_VALUE;
378 };
379
380 return VK_SUCCESS;
381}
382
Jeremy Hayescf469132015-04-17 10:36:53 -0600383VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionInfo(
384 VkPhysicalDevice gpu,
385 VkExtensionInfoType infoType,
386 uint32_t extensionIndex,
387 size_t* pDataSize,
388 void* pData)
389{
Courtney Goeltzenleuchter23b5f8d2015-06-17 20:51:59 -0600390 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
391 uint32_t *count;
392
393 if (pDataSize == NULL)
394 return VK_ERROR_INVALID_POINTER;
395
396 switch (infoType) {
397 case VK_EXTENSION_INFO_TYPE_COUNT:
398 *pDataSize = sizeof(uint32_t);
399 if (pData == NULL)
400 return VK_SUCCESS;
401 count = (uint32_t *) pData;
402 *count = PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE;
403 break;
404 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
405 *pDataSize = sizeof(VkExtensionProperties);
406 if (pData == NULL)
407 return VK_SUCCESS;
408 if (extensionIndex >= PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE)
409 return VK_ERROR_INVALID_VALUE;
410 memcpy((VkExtensionProperties *) pData, &pcExts[extensionIndex], sizeof(VkExtensionProperties));
411 break;
412 default:
413 return VK_ERROR_INVALID_VALUE;
414 };
415
416 return VK_SUCCESS;
Jeremy Hayescf469132015-04-17 10:36:53 -0600417}
418
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600419VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex, VkQueue* pQueue)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600420{
421
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500422 VkResult result = device_dispatch_table(device)->GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600423 return result;
424}
425
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600426VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600427{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500428 VkResult result = device_dispatch_table(queue)->QueueSubmit(queue, cmdBufferCount, pCmdBuffers, fence);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600429 return result;
430}
431
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600432VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(VkQueue queue)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600433{
434
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500435 VkResult result = device_dispatch_table(queue)->QueueWaitIdle(queue);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600436 return result;
437}
438
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600439VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle(VkDevice device)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600440{
441
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500442 VkResult result = device_dispatch_table(device)->DeviceWaitIdle(device);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600443 return result;
444}
445
Tony Barbour8205d902015-04-16 15:59:00 -0600446VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory(VkDevice device, const VkMemoryAllocInfo* pAllocInfo, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600447{
448 char str[1024];
449 if (!pAllocInfo) {
450 sprintf(str, "Struct ptr parameter pAllocInfo to function AllocMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600451 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600452 } else if (!vk_validate_vkmemoryallocinfo(pAllocInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600453 sprintf(str, "Parameter pAllocInfo to function AllocMemory contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600454 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600455 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500456 VkResult result = device_dispatch_table(device)->AllocMemory(device, pAllocInfo, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600457 return result;
458}
459
Mike Stroyan230e6252015-04-17 12:36:38 -0600460VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600461{
462
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500463 VkResult result = device_dispatch_table(device)->FreeMemory(device, mem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600464 return result;
465}
466
Mike Stroyan230e6252015-04-17 12:36:38 -0600467VK_LAYER_EXPORT VkResult VKAPI vkSetMemoryPriority(VkDevice device, VkDeviceMemory mem, VkMemoryPriority priority)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600468{
469 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600470 if (!validate_VkMemoryPriority(priority)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600471 sprintf(str, "Parameter priority to function SetMemoryPriority has invalid value of %i.", (int)priority);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600472 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600473 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500474 VkResult result = device_dispatch_table(device)->SetMemoryPriority(device, mem, priority);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600475 return result;
476}
477
Mike Stroyan230e6252015-04-17 12:36:38 -0600478VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkFlags flags, void** ppData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600479{
480
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500481 VkResult result = device_dispatch_table(device)->MapMemory(device, mem, offset, size, flags, ppData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600482 return result;
483}
484
Mike Stroyan230e6252015-04-17 12:36:38 -0600485VK_LAYER_EXPORT VkResult VKAPI vkUnmapMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600486{
487
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500488 VkResult result = device_dispatch_table(device)->UnmapMemory(device, mem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600489 return result;
490}
491
Courtney Goeltzenleuchtera569a502015-04-29 17:16:21 -0600492VK_LAYER_EXPORT VkResult VKAPI vkFlushMappedMemoryRanges(
493 VkDevice device,
494 uint32_t memRangeCount,
495 const VkMappedMemoryRange* pMemRanges)
Tony Barbour859ceab2015-04-16 19:23:13 -0600496{
497
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500498 VkResult result = device_dispatch_table(device)->FlushMappedMemoryRanges(device, memRangeCount, pMemRanges);
Courtney Goeltzenleuchtera569a502015-04-29 17:16:21 -0600499 return result;
500}
501
502VK_LAYER_EXPORT VkResult VKAPI vkInvalidateMappedMemoryRanges(
503 VkDevice device,
504 uint32_t memRangeCount,
505 const VkMappedMemoryRange* pMemRanges)
506{
507
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500508 VkResult result = device_dispatch_table(device)->InvalidateMappedMemoryRanges(device, memRangeCount, pMemRanges);
Tony Barbour859ceab2015-04-16 19:23:13 -0600509 return result;
510}
511
Tony Barbour8205d902015-04-16 15:59:00 -0600512VK_LAYER_EXPORT VkResult VKAPI vkPinSystemMemory(VkDevice device, const void* pSysMem, size_t memSize, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600513{
514
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500515 VkResult result = device_dispatch_table(device)->PinSystemMemory(device, pSysMem, memSize, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600516 return result;
517}
518
Tony Barbour8205d902015-04-16 15:59:00 -0600519VK_LAYER_EXPORT VkResult VKAPI vkGetMultiDeviceCompatibility(VkPhysicalDevice gpu0, VkPhysicalDevice gpu1, VkPhysicalDeviceCompatibilityInfo* pInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600520{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600521
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500522 VkResult result = instance_dispatch_table(gpu0)->GetMultiDeviceCompatibility(gpu0, gpu1, pInfo);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600523 return result;
524}
525
Tony Barbour8205d902015-04-16 15:59:00 -0600526VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedMemory(VkDevice device, const VkMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600527{
528 char str[1024];
529 if (!pOpenInfo) {
530 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600531 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600532 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600533 else if (!vk_validate_vkmemoryopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600534 sprintf(str, "Parameter pOpenInfo to function OpenSharedMemory contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600535 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600536 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500537 VkResult result = device_dispatch_table(device)->OpenSharedMemory(device, pOpenInfo, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600538 return result;
539}
540
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600541VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedSemaphore(VkDevice device, const VkSemaphoreOpenInfo* pOpenInfo, VkSemaphore* pSemaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600542{
543 char str[1024];
544 if (!pOpenInfo) {
545 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedSemaphore is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600546 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600547 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600548 else if (!vk_validate_vksemaphoreopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600549 sprintf(str, "Parameter pOpenInfo to function OpenSharedSemaphore contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600550 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600551 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500552 VkResult result = device_dispatch_table(device)->OpenSharedSemaphore(device, pOpenInfo, pSemaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600553 return result;
554}
555
Tony Barbour8205d902015-04-16 15:59:00 -0600556VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerMemory(VkDevice device, const VkPeerMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600557{
558 char str[1024];
559 if (!pOpenInfo) {
560 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600561 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600562 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600563 else if (!vk_validate_vkpeermemoryopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600564 sprintf(str, "Parameter pOpenInfo to function OpenPeerMemory contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600565 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600566 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500567 VkResult result = device_dispatch_table(device)->OpenPeerMemory(device, pOpenInfo, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600568 return result;
569}
570
Tony Barbour8205d902015-04-16 15:59:00 -0600571VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerImage(VkDevice device, const VkPeerImageOpenInfo* pOpenInfo, VkImage* pImage, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600572{
573 char str[1024];
574 if (!pOpenInfo) {
575 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerImage is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600576 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600577 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600578 else if (!vk_validate_vkpeerimageopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600579 sprintf(str, "Parameter pOpenInfo to function OpenPeerImage contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600580 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600581 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500582 VkResult result = device_dispatch_table(device)->OpenPeerImage(device, pOpenInfo, pImage, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600583 return result;
584}
585
Mike Stroyan230e6252015-04-17 12:36:38 -0600586VK_LAYER_EXPORT VkResult VKAPI vkDestroyObject(VkDevice device, VkObjectType objType, VkObject object)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600587{
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500588 VkResult result = device_dispatch_table(device)->DestroyObject(device, objType, object);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600589 return result;
590}
591
Mike Stroyan230e6252015-04-17 12:36:38 -0600592VK_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 -0600593{
594 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600595 if (!validate_VkObjectInfoType(infoType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600596 sprintf(str, "Parameter infoType to function GetObjectInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600597 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600598 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500599 VkResult result = device_dispatch_table(device)->GetObjectInfo(device, objType, object, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600600 return result;
601}
602
Mark Lobodzinski23182612015-05-29 09:32:35 -0500603VK_LAYER_EXPORT VkResult VKAPI vkBindObjectMemory(VkDevice device, VkObjectType objType, VkObject object, VkDeviceMemory mem, VkDeviceSize offset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600604{
605
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500606 VkResult result = device_dispatch_table(device)->BindObjectMemory(device, objType, object, mem, offset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600607 return result;
608}
609
Mark Lobodzinski23182612015-05-29 09:32:35 -0500610VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(VkQueue queue, VkBuffer buffer, VkDeviceSize rangeOffset, VkDeviceSize rangeSize, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600611{
612
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500613 VkResult result = device_dispatch_table(queue)->QueueBindSparseBufferMemory(queue, buffer, rangeOffset, rangeSize, mem, memOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600614 return result;
615}
616
Mark Lobodzinski23182612015-05-29 09:32:35 -0500617VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageMemory(VkQueue queue, VkImage image, const VkImageMemoryBindInfo* pBindInfo, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600618{
619 char str[1024];
Jeremy Hayes47536532015-04-15 15:20:03 -0600620 if (!pBindInfo) {
Mark Lobodzinskifb9f5642015-05-11 17:21:15 -0500621 sprintf(str, "Struct ptr parameter pBindInfo to function QueueBindSparseImageMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600622 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600623 }
Jeremy Hayes47536532015-04-15 15:20:03 -0600624 else if (!vk_validate_vkimagememorybindinfo(pBindInfo)) {
625 sprintf(str, "Parameter pBindInfo to function BindImageMemoryRange contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600626 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600627 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500628 VkResult result = device_dispatch_table(queue)->QueueBindSparseImageMemory(queue, image, pBindInfo, mem, memOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600629 return result;
630}
631
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600632VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(VkDevice device, const VkFenceCreateInfo* pCreateInfo, VkFence* pFence)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600633{
634 char str[1024];
635 if (!pCreateInfo) {
636 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFence is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600637 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600638 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600639 else if (!vk_validate_vkfencecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600640 sprintf(str, "Parameter pCreateInfo to function CreateFence contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600641 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600642 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500643 VkResult result = device_dispatch_table(device)->CreateFence(device, pCreateInfo, pFence);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600644 return result;
645}
646
Mike Stroyan230e6252015-04-17 12:36:38 -0600647VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(VkDevice device, VkFence fence)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600648{
649
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500650 VkResult result = device_dispatch_table(device)->GetFenceStatus(device, fence);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600651 return result;
652}
653
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600654VK_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 -0600655{
656
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500657 VkResult result = device_dispatch_table(device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600658 return result;
659}
660
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600661VK_LAYER_EXPORT VkResult VKAPI vkResetFences(VkDevice device, uint32_t fenceCount, VkFence* pFences)
Mark Lobodzinskiebe814d2015-04-07 16:07:57 -0500662{
663
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500664 VkResult result = device_dispatch_table(device)->ResetFences(device, fenceCount, pFences);
Mark Lobodzinskiebe814d2015-04-07 16:07:57 -0500665 return result;
666}
667
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600668VK_LAYER_EXPORT VkResult VKAPI vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, VkSemaphore* pSemaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600669{
670 char str[1024];
671 if (!pCreateInfo) {
672 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSemaphore is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600673 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600674 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600675 else if (!vk_validate_vksemaphorecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600676 sprintf(str, "Parameter pCreateInfo to function CreateSemaphore contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600677 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600678 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500679 VkResult result = device_dispatch_table(device)->CreateSemaphore(device, pCreateInfo, pSemaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600680 return result;
681}
682
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600683VK_LAYER_EXPORT VkResult VKAPI vkQueueSignalSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600684{
685
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500686 VkResult result = device_dispatch_table(queue)->QueueSignalSemaphore(queue, semaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600687 return result;
688}
689
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600690VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600691{
692
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500693 VkResult result = device_dispatch_table(queue)->QueueWaitSemaphore(queue, semaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600694 return result;
695}
696
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600697VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(VkDevice device, const VkEventCreateInfo* pCreateInfo, VkEvent* pEvent)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600698{
699 char str[1024];
700 if (!pCreateInfo) {
701 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateEvent is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600702 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600703 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600704 else if (!vk_validate_vkeventcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600705 sprintf(str, "Parameter pCreateInfo to function CreateEvent contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600706 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600707 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500708 VkResult result = device_dispatch_table(device)->CreateEvent(device, pCreateInfo, pEvent);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600709 return result;
710}
711
Mike Stroyan230e6252015-04-17 12:36:38 -0600712VK_LAYER_EXPORT VkResult VKAPI vkGetEventStatus(VkDevice device, VkEvent event)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600713{
714
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500715 VkResult result = device_dispatch_table(device)->GetEventStatus(device, event);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600716 return result;
717}
718
Mike Stroyan230e6252015-04-17 12:36:38 -0600719VK_LAYER_EXPORT VkResult VKAPI vkSetEvent(VkDevice device, VkEvent event)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600720{
721
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500722 VkResult result = device_dispatch_table(device)->SetEvent(device, event);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600723 return result;
724}
725
Mike Stroyan230e6252015-04-17 12:36:38 -0600726VK_LAYER_EXPORT VkResult VKAPI vkResetEvent(VkDevice device, VkEvent event)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600727{
728
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500729 VkResult result = device_dispatch_table(device)->ResetEvent(device, event);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600730 return result;
731}
732
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600733VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, VkQueryPool* pQueryPool)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600734{
735 char str[1024];
736 if (!pCreateInfo) {
737 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateQueryPool is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600738 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600739 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600740 else if (!vk_validate_vkquerypoolcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600741 sprintf(str, "Parameter pCreateInfo to function CreateQueryPool contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600742 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600743 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500744 VkResult result = device_dispatch_table(device)->CreateQueryPool(device, pCreateInfo, pQueryPool);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600745 return result;
746}
747
Mike Stroyan230e6252015-04-17 12:36:38 -0600748VK_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 -0600749{
750
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500751 VkResult result = device_dispatch_table(device)->GetQueryPoolResults(device, queryPool, startQuery, queryCount, pDataSize, pData, flags);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600752 return result;
753}
754
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600755VK_LAYER_EXPORT VkResult VKAPI vkGetFormatInfo(VkDevice device, VkFormat format, VkFormatInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600756{
757 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600758 if (!validate_VkFormat(format)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600759 sprintf(str, "Parameter format to function GetFormatInfo has invalid value of %i.", (int)format);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600760 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600761 }
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600762 if (!validate_VkFormatInfoType(infoType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600763 sprintf(str, "Parameter infoType to function GetFormatInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600764 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600765 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500766 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, format, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600767 return result;
768}
769
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600770VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600771{
772 char str[1024];
773 if (!pCreateInfo) {
774 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBuffer is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600775 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600776 }
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600777 else if (!vk_validate_vkbuffercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600778 sprintf(str, "Parameter pCreateInfo to function CreateBuffer contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600779 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600780 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500781 VkResult result = device_dispatch_table(device)->CreateBuffer(device, pCreateInfo, pBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600782 return result;
783}
784
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600785VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, VkBufferView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600786{
787 char str[1024];
788 if (!pCreateInfo) {
789 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBufferView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600790 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600791 }
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600792 else if (!vk_validate_vkbufferviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600793 sprintf(str, "Parameter pCreateInfo to function CreateBufferView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600794 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600795 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500796 VkResult result = device_dispatch_table(device)->CreateBufferView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600797 return result;
798}
799
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600800void PreCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600801{
802 if(pCreateInfo == nullptr)
803 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600804 char const str[] = "vkCreateImage parameter, VkImageCreateInfo* pCreateInfo, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600805 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600806 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600807 return;
808 }
809
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600810 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600811 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600812 char const str[] = "vkCreateImage parameter, VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO "\
813 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600814 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600815 return;
816 }
817
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600818 if (!validate_VkImageType(pCreateInfo->imageType))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600819 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600820 char const str[] = "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600821 "unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600822 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600823 return;
824 }
825
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600826 if (!validate_VkFormat(pCreateInfo->format))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600827 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600828 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600829 "unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600830 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600831 return;
832 }
833
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600834 VkFormatProperties properties;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600835 size_t size = sizeof(properties);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500836 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->format,
Tony Barbour8205d902015-04-16 15:59:00 -0600837 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600838 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600839 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600840 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, cannot be "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600841 "validated (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600842 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600843 return;
844 }
845
846 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
847 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600848 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600849 "unsupported format (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600850 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600851 return;
852 }
853
854 // TODO: Can we check device-specific limits?
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600855 if (!vk_validate_vkextent3d(&pCreateInfo->extent))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600856 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600857 char const str[] = "vkCreateImage parameter, VkExtent3D pCreateInfo->extent, is invalid "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600858 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600859 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600860 return;
861 }
862
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600863 if (!validate_VkImageTiling(pCreateInfo->tiling))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600864 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600865 char const str[] = "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600866 "unrecoginized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600867 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600868 return;
869 }
870}
871
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600872void PostCreateImage(VkResult result, VkImage* pImage)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600873{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600874 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600875 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600876 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600877 char const str[] = "vkCreateImage failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600878 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600879 return;
880 }
881
882 if(pImage == nullptr)
883 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600884 char const str[] = "vkCreateImage parameter, VkImage* pImage, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600885 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600886 return;
887 }
888}
889
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600890VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600891{
892 PreCreateImage(device, pCreateInfo);
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500893 VkResult result = device_dispatch_table(device)->CreateImage(device, pCreateInfo, pImage);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600894 PostCreateImage(result, pImage);
895 return result;
896}
897
Mike Stroyan230e6252015-04-17 12:36:38 -0600898VK_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 -0600899{
900 char str[1024];
901 if (!pSubresource) {
902 sprintf(str, "Struct ptr parameter pSubresource to function GetImageSubresourceInfo is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600903 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600904 } else if (!vk_validate_vkimagesubresource(pSubresource)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600905 sprintf(str, "Parameter pSubresource to function GetImageSubresourceInfo contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600906 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600907 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600908 if (!validate_VkSubresourceInfoType(infoType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600909 sprintf(str, "Parameter infoType to function GetImageSubresourceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600910 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600911 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500912 VkResult result = device_dispatch_table(device)->GetImageSubresourceInfo(device, image, pSubresource, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600913 return result;
914}
915
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600916VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, VkImageView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600917{
918 char str[1024];
919 if (!pCreateInfo) {
920 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateImageView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600921 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600922 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600923 else if (!vk_validate_vkimageviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600924 sprintf(str, "Parameter pCreateInfo to function CreateImageView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600925 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600926 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500927 VkResult result = device_dispatch_table(device)->CreateImageView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600928 return result;
929}
930
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600931VK_LAYER_EXPORT VkResult VKAPI vkCreateColorAttachmentView(VkDevice device, const VkColorAttachmentViewCreateInfo* pCreateInfo, VkColorAttachmentView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600932{
933 char str[1024];
934 if (!pCreateInfo) {
935 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateColorAttachmentView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600936 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600937 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600938 else if (!vk_validate_vkcolorattachmentviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600939 sprintf(str, "Parameter pCreateInfo to function CreateColorAttachmentView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600940 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600941 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500942 VkResult result = device_dispatch_table(device)->CreateColorAttachmentView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600943 return result;
944}
945
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600946VK_LAYER_EXPORT VkResult VKAPI vkCreateDepthStencilView(VkDevice device, const VkDepthStencilViewCreateInfo* pCreateInfo, VkDepthStencilView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600947{
948 char str[1024];
949 if (!pCreateInfo) {
950 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDepthStencilView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600951 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600952 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600953 else if (!vk_validate_vkdepthstencilviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600954 sprintf(str, "Parameter pCreateInfo to function CreateDepthStencilView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600955 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600956 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500957 VkResult result = device_dispatch_table(device)->CreateDepthStencilView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600958 return result;
959}
960
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600961VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(VkDevice device, const VkShaderCreateInfo* pCreateInfo, VkShader* pShader)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600962{
963 char str[1024];
964 if (!pCreateInfo) {
965 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateShader is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600966 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600967 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600968 else if (!vk_validate_vkshadercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600969 sprintf(str, "Parameter pCreateInfo to function CreateShader contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600970 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600971 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500972 VkResult result = device_dispatch_table(device)->CreateShader(device, pCreateInfo, pShader);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600973 return result;
974}
975
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600976VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600977{
978 char str[1024];
979 if (!pCreateInfo) {
980 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipeline is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600981 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600982 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600983 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600984 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipeline contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600985 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600986 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -0500987 VkResult result = device_dispatch_table(device)->CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600988 return result;
989}
990
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600991VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelineDerivative(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600992{
993 char str[1024];
994 if (!pCreateInfo) {
995 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipelineDerivative is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600996 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600997 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600998 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600999 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipelineDerivative contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001000 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001001 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001002 VkResult result = device_dispatch_table(device)->CreateGraphicsPipelineDerivative(device, pCreateInfo, basePipeline, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001003 return result;
1004}
1005
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001006VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipeline(VkDevice device, const VkComputePipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001007{
1008 char str[1024];
1009 if (!pCreateInfo) {
1010 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateComputePipeline is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001011 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001012 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001013 else if (!vk_validate_vkcomputepipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001014 sprintf(str, "Parameter pCreateInfo to function CreateComputePipeline contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001015 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001016 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001017 VkResult result = device_dispatch_table(device)->CreateComputePipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001018 return result;
1019}
1020
Mike Stroyan230e6252015-04-17 12:36:38 -06001021VK_LAYER_EXPORT VkResult VKAPI vkStorePipeline(VkDevice device, VkPipeline pipeline, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001022{
1023
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001024 VkResult result = device_dispatch_table(device)->StorePipeline(device, pipeline, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001025 return result;
1026}
1027
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001028VK_LAYER_EXPORT VkResult VKAPI vkLoadPipeline(VkDevice device, size_t dataSize, const void* pData, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001029{
1030
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001031 VkResult result = device_dispatch_table(device)->LoadPipeline(device, dataSize, pData, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001032 return result;
1033}
1034
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001035VK_LAYER_EXPORT VkResult VKAPI vkLoadPipelineDerivative(VkDevice device, size_t dataSize, const void* pData, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001036{
1037
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001038 VkResult result = device_dispatch_table(device)->LoadPipelineDerivative(device, dataSize, pData, basePipeline, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001039 return result;
1040}
1041
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001042VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, VkSampler* pSampler)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001043{
1044 char str[1024];
1045 if (!pCreateInfo) {
1046 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSampler is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001047 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001048 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001049 else if (!vk_validate_vksamplercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001050 sprintf(str, "Parameter pCreateInfo to function CreateSampler contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001051 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001052 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001053 VkResult result = device_dispatch_table(device)->CreateSampler(device, pCreateInfo, pSampler);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001054 return result;
1055}
1056
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001057VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayout* pSetLayout)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001058{
1059 char str[1024];
1060 if (!pCreateInfo) {
1061 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorSetLayout is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001062 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001063 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001064 else if (!vk_validate_vkdescriptorsetlayoutcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001065 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorSetLayout contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001066 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001067 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001068 VkResult result = device_dispatch_table(device)->CreateDescriptorSetLayout(device, pCreateInfo, pSetLayout);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001069 return result;
1070}
1071
Mark Lobodzinski556f7212015-04-17 14:11:39 -05001072VK_LAYER_EXPORT VkResult VKAPI vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, VkPipelineLayout* pPipelineLayout)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001073{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001074 VkResult result = device_dispatch_table(device)->CreatePipelineLayout(device, pCreateInfo, pPipelineLayout);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001075 return result;
1076}
1077
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001078VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorPool(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001079{
1080 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001081 if (!validate_VkDescriptorPoolUsage(poolUsage)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001082 sprintf(str, "Parameter poolUsage to function CreateDescriptorPool has invalid value of %i.", (int)poolUsage);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001083 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001084 }
1085 if (!pCreateInfo) {
1086 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorPool is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001087 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001088 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001089 else if (!vk_validate_vkdescriptorpoolcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001090 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorPool contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001091 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001092 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001093 VkResult result = device_dispatch_table(device)->CreateDescriptorPool(device, poolUsage, maxSets, pCreateInfo, pDescriptorPool);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001094 return result;
1095}
1096
Mike Stroyan230e6252015-04-17 12:36:38 -06001097VK_LAYER_EXPORT VkResult VKAPI vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001098{
1099
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001100 VkResult result = device_dispatch_table(device)->ResetDescriptorPool(device, descriptorPool);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001101 return result;
1102}
1103
Mike Stroyan230e6252015-04-17 12:36:38 -06001104VK_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 -06001105{
1106 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001107 if (!validate_VkDescriptorSetUsage(setUsage)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001108 sprintf(str, "Parameter setUsage to function AllocDescriptorSets has invalid value of %i.", (int)setUsage);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001109 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001110 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001111 VkResult result = device_dispatch_table(device)->AllocDescriptorSets(device, descriptorPool, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001112 return result;
1113}
1114
Mike Stroyan230e6252015-04-17 12:36:38 -06001115VK_LAYER_EXPORT void VKAPI vkClearDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, const VkDescriptorSet* pDescriptorSets)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001116{
1117
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001118 device_dispatch_table(device)->ClearDescriptorSets(device, descriptorPool, count, pDescriptorSets);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001119}
1120
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001121VK_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 -06001122{
1123
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001124 return device_dispatch_table(device)->UpdateDescriptorSets(device, writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001125}
1126
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001127VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(VkDevice device, const VkDynamicVpStateCreateInfo* pCreateInfo, VkDynamicVpState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001128{
1129 char str[1024];
1130 if (!pCreateInfo) {
1131 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicViewportState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001132 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001133 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001134 else if (!vk_validate_vkdynamicvpstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001135 sprintf(str, "Parameter pCreateInfo to function CreateDynamicViewportState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001136 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001137 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001138 VkResult result = device_dispatch_table(device)->CreateDynamicViewportState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001139 return result;
1140}
1141
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001142VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterState(VkDevice device, const VkDynamicRsStateCreateInfo* pCreateInfo, VkDynamicRsState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001143{
1144 char str[1024];
1145 if (!pCreateInfo) {
1146 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicRasterState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001147 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001148 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001149 else if (!vk_validate_vkdynamicrsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001150 sprintf(str, "Parameter pCreateInfo to function CreateDynamicRasterState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001151 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001152 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001153 VkResult result = device_dispatch_table(device)->CreateDynamicRasterState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001154 return result;
1155}
1156
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001157VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState(VkDevice device, const VkDynamicCbStateCreateInfo* pCreateInfo, VkDynamicCbState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001158{
1159 char str[1024];
1160 if (!pCreateInfo) {
1161 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicColorBlendState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001162 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001163 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001164 else if (!vk_validate_vkdynamiccbstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001165 sprintf(str, "Parameter pCreateInfo to function CreateDynamicColorBlendState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001166 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001167 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001168 VkResult result = device_dispatch_table(device)->CreateDynamicColorBlendState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001169 return result;
1170}
1171
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001172VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState(VkDevice device, const VkDynamicDsStateCreateInfo* pCreateInfo, VkDynamicDsState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001173{
1174 char str[1024];
1175 if (!pCreateInfo) {
1176 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicDepthStencilState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001177 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001178 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001179 else if (!vk_validate_vkdynamicdsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001180 sprintf(str, "Parameter pCreateInfo to function CreateDynamicDepthStencilState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001181 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001182 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001183 VkResult result = device_dispatch_table(device)->CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001184 return result;
1185}
1186
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001187void PreCreateCommandBuffer(VkDevice device, const VkCmdBufferCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001188{
1189 if(device == nullptr)
1190 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001191 char const str[] = "vkCreateCommandBuffer parameter, VkDevice device, is "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001192 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001193 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001194 return;
1195 }
1196
1197 if(pCreateInfo == nullptr)
1198 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001199 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBufferCreateInfo* pCreateInfo, is "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001200 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001201 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001202 return;
1203 }
1204
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001205 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001206 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001207 char const str[] = "vkCreateCommandBuffer parameter, VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO "\
1208 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001209 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001210 return;
1211 }
1212}
1213
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001214void PostCreateCommandBuffer(VkResult result, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001215{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001216 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001217 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001218 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001219 char const str[] = "vkCreateCommandBuffer failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001220 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001221 return;
1222 }
1223
1224 if(pCmdBuffer == nullptr)
1225 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001226 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBuffer* pCmdBuffer, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001227 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001228 return;
1229 }
1230}
1231
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001232VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(VkDevice device,
1233 const VkCmdBufferCreateInfo* pCreateInfo, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001234{
1235 PreCreateCommandBuffer(device, pCreateInfo);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001236 VkResult result = device_dispatch_table(device)->CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001237 PostCreateCommandBuffer(result, pCmdBuffer);
1238 return result;
1239}
1240
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001241VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001242{
1243 char str[1024];
1244 if (!pBeginInfo) {
1245 sprintf(str, "Struct ptr parameter pBeginInfo to function BeginCommandBuffer is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001246 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001247 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001248 else if (!vk_validate_vkcmdbufferbegininfo(pBeginInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001249 sprintf(str, "Parameter pBeginInfo to function BeginCommandBuffer contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001250 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001251 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001252 VkResult result = device_dispatch_table(cmdBuffer)->BeginCommandBuffer(cmdBuffer, pBeginInfo);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001253 return result;
1254}
1255
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001256VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001257{
1258
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001259 VkResult result = device_dispatch_table(cmdBuffer)->EndCommandBuffer(cmdBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001260 return result;
1261}
1262
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001263VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001264{
1265
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001266 VkResult result = device_dispatch_table(cmdBuffer)->ResetCommandBuffer(cmdBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001267 return result;
1268}
1269
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001270VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001271{
1272 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001273 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001274 sprintf(str, "Parameter pipelineBindPoint to function CmdBindPipeline has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001275 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001276 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001277 device_dispatch_table(cmdBuffer)->CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001278}
1279
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001280VK_LAYER_EXPORT void VKAPI vkCmdBindDynamicStateObject(VkCmdBuffer cmdBuffer, VkStateBindPoint stateBindPoint, VkDynamicStateObject state)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001281{
1282 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001283 if (!validate_VkStateBindPoint(stateBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001284 sprintf(str, "Parameter stateBindPoint to function CmdBindDynamicStateObject has invalid value of %i.", (int)stateBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001285 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001286 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001287 device_dispatch_table(cmdBuffer)->CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001288}
1289
Cody Northrop1a01b1d2015-04-16 13:41:56 -06001290VK_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 -06001291{
1292 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001293 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001294 sprintf(str, "Parameter pipelineBindPoint to function CmdBindDescriptorSets has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001295 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001296 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001297 device_dispatch_table(cmdBuffer)->CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001298}
1299
Courtney Goeltzenleuchter46962942015-04-16 13:38:46 -06001300VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
1301 VkCmdBuffer cmdBuffer,
1302 uint32_t startBinding,
1303 uint32_t bindingCount,
1304 const VkBuffer* pBuffers,
Tony Barbour8205d902015-04-16 15:59:00 -06001305 const VkDeviceSize* pOffsets)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001306{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001307 device_dispatch_table(cmdBuffer)->CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001308}
1309
Tony Barbour8205d902015-04-16 15:59:00 -06001310VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001311{
1312 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001313 if (!validate_VkIndexType(indexType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001314 sprintf(str, "Parameter indexType to function CmdBindIndexBuffer has invalid value of %i.", (int)indexType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001315 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001316 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001317 device_dispatch_table(cmdBuffer)->CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001318}
1319
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001320VK_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 -06001321{
1322
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001323 device_dispatch_table(cmdBuffer)->CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001324}
1325
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001326VK_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 -06001327{
1328
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001329 device_dispatch_table(cmdBuffer)->CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001330}
1331
Tony Barbour8205d902015-04-16 15:59:00 -06001332VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001333{
1334
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001335 device_dispatch_table(cmdBuffer)->CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001336}
1337
Tony Barbour8205d902015-04-16 15:59:00 -06001338VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(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)->CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001342}
1343
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001344VK_LAYER_EXPORT void VKAPI vkCmdDispatch(VkCmdBuffer cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001345{
1346
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001347 device_dispatch_table(cmdBuffer)->CmdDispatch(cmdBuffer, x, y, z);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001348}
1349
Tony Barbour8205d902015-04-16 15:59:00 -06001350VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001351{
1352
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001353 device_dispatch_table(cmdBuffer)->CmdDispatchIndirect(cmdBuffer, buffer, offset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001354}
1355
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001356VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkBuffer destBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001357{
1358 char str[1024];
1359 uint32_t i;
1360 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001361 if (!vk_validate_vkbuffercopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001362 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBuffer contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001363 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001364 }
1365 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001366 device_dispatch_table(cmdBuffer)->CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001367}
1368
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001369VK_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 -06001370{
1371 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001372 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001373 sprintf(str, "Parameter srcImageLayout to function CmdCopyImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001374 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001375 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001376 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001377 sprintf(str, "Parameter destImageLayout to function CmdCopyImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001378 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001379 }
1380 uint32_t i;
1381 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001382 if (!vk_validate_vkimagecopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001383 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImage contains an invalid value.", i);
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 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001387 device_dispatch_table(cmdBuffer)->CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001388}
1389
Mark Lobodzinski20f68592015-05-22 14:43:25 -05001390VK_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 -06001391{
1392 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001393 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001394 sprintf(str, "Parameter srcImageLayout to function CmdBlitImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001395 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001396 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001397 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001398 sprintf(str, "Parameter destImageLayout to function CmdBlitImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001399 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001400 }
1401 uint32_t i;
1402 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001403 if (!vk_validate_vkimageblit(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001404 sprintf(str, "Parameter pRegions[%i] to function CmdBlitImage contains an invalid value.", i);
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 }
Mark Lobodzinski20f68592015-05-22 14:43:25 -05001408 //TODO: Add additional check for limitation from header rev 96.
1409 // VK_TEX_FILTER_NEAREST if the format that srcImage was created with is an integer-based format.
1410
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001411 device_dispatch_table(cmdBuffer)->CmdBlitImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001412}
1413
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001414VK_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 -06001415{
1416 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001417 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001418 sprintf(str, "Parameter destImageLayout to function CmdCopyBufferToImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001419 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001420 }
1421 uint32_t i;
1422 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001423 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001424 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBufferToImage contains an invalid value.", i);
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 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001428 device_dispatch_table(cmdBuffer)->CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001429}
1430
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001431VK_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 -06001432{
1433 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001434 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001435 sprintf(str, "Parameter srcImageLayout to function CmdCopyImageToBuffer has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001436 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001437 }
1438 uint32_t i;
1439 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001440 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001441 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImageToBuffer contains an invalid value.", i);
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 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001445 device_dispatch_table(cmdBuffer)->CmdCopyImageToBuffer(cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001446}
1447
Tony Barbour8205d902015-04-16 15:59:00 -06001448VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001449{
1450
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001451 device_dispatch_table(cmdBuffer)->CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001452}
1453
Tony Barbour8205d902015-04-16 15:59:00 -06001454VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001455{
1456
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001457 device_dispatch_table(cmdBuffer)->CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001458}
1459
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -06001460VK_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 -06001461{
1462 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001463 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001464 sprintf(str, "Parameter imageLayout to function CmdClearColorImage has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001465 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001466 }
1467 uint32_t i;
1468 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001469 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001470 sprintf(str, "Parameter pRanges[%i] to function CmdClearColorImage contains an invalid value.", i);
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 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001474 device_dispatch_table(cmdBuffer)->CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001475}
1476
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001477VK_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 -06001478{
1479 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001480 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001481 sprintf(str, "Parameter imageLayout to function CmdClearDepthStencil has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001482 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001483 }
1484 uint32_t i;
1485 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001486 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001487 sprintf(str, "Parameter pRanges[%i] to function CmdClearDepthStencil contains an invalid value.", i);
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 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001491 device_dispatch_table(cmdBuffer)->CmdClearDepthStencil(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001492}
1493
Tony Barbour11f74372015-04-13 15:02:52 -06001494VK_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 -06001495{
1496 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001497 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001498 sprintf(str, "Parameter srcImageLayout to function CmdResolveImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001499 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001500 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001501 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001502 sprintf(str, "Parameter destImageLayout to function CmdResolveImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001503 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001504 }
1505 uint32_t i;
Tony Barbour11f74372015-04-13 15:02:52 -06001506 for (i = 0; i < regionCount; i++) {
1507 if (!vk_validate_vkimageresolve(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001508 sprintf(str, "Parameter pRects[%i] to function CmdResolveImage contains an invalid value.", i);
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 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001512 device_dispatch_table(cmdBuffer)->CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001513}
1514
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001515VK_LAYER_EXPORT void VKAPI vkCmdSetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001516{
1517 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001518 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001519 sprintf(str, "Parameter pipeEvent to function CmdSetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001520 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001521 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001522 device_dispatch_table(cmdBuffer)->CmdSetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001523}
1524
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001525VK_LAYER_EXPORT void VKAPI vkCmdResetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001526{
1527 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001528 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001529 sprintf(str, "Parameter pipeEvent to function CmdResetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001530 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001531 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001532 device_dispatch_table(cmdBuffer)->CmdResetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001533}
1534
Tony Barbour8205d902015-04-16 15:59:00 -06001535VK_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 -06001536{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001537 device_dispatch_table(cmdBuffer)->CmdWaitEvents(cmdBuffer, waitEvent, eventCount, pEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001538}
1539
Tony Barbour8205d902015-04-16 15:59:00 -06001540VK_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 -06001541{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001542 device_dispatch_table(cmdBuffer)->CmdPipelineBarrier(cmdBuffer, waitEvent, pipeEventCount, pPipeEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001543}
1544
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001545VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001546{
1547
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001548 device_dispatch_table(cmdBuffer)->CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001549}
1550
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001551VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001552{
1553
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001554 device_dispatch_table(cmdBuffer)->CmdEndQuery(cmdBuffer, queryPool, slot);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001555}
1556
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001557VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001558{
1559
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001560 device_dispatch_table(cmdBuffer)->CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001561}
1562
Tony Barbour8205d902015-04-16 15:59:00 -06001563VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkTimestampType timestampType, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001564{
1565 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001566 if (!validate_VkTimestampType(timestampType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001567 sprintf(str, "Parameter timestampType to function CmdWriteTimestamp has invalid value of %i.", (int)timestampType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001568 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001569 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001570 device_dispatch_table(cmdBuffer)->CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001571}
1572
Jeremy Hayescf469132015-04-17 10:36:53 -06001573VK_LAYER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(
1574 VkCmdBuffer cmdBuffer,
1575 VkQueryPool queryPool,
1576 uint32_t startQuery,
1577 uint32_t queryCount,
1578 VkBuffer destBuffer,
1579 VkDeviceSize destOffset,
1580 VkDeviceSize destStride,
1581 VkQueryResultFlags flags)
1582{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001583 device_dispatch_table(cmdBuffer)->CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, destStride, flags);
Jeremy Hayescf469132015-04-17 10:36:53 -06001584}
1585
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001586VK_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 -06001587{
1588 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001589 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001590 sprintf(str, "Parameter pipelineBindPoint to function CmdInitAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001591 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001592 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001593 device_dispatch_table(cmdBuffer)->CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001594}
1595
Tony Barbour8205d902015-04-16 15:59:00 -06001596VK_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 -06001597{
1598 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001599 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001600 sprintf(str, "Parameter pipelineBindPoint to function CmdLoadAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001601 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001602 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001603 device_dispatch_table(cmdBuffer)->CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001604}
1605
Tony Barbour8205d902015-04-16 15:59:00 -06001606VK_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 -06001607{
1608 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001609 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001610 sprintf(str, "Parameter pipelineBindPoint to function CmdSaveAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001611 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001612 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001613 device_dispatch_table(cmdBuffer)->CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001614}
1615
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001616VK_LAYER_EXPORT VkResult VKAPI vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, VkFramebuffer* pFramebuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001617{
1618 char str[1024];
1619 if (!pCreateInfo) {
1620 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFramebuffer is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001621 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001622 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001623 else if (!vk_validate_vkframebuffercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001624 sprintf(str, "Parameter pCreateInfo to function CreateFramebuffer contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001625 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001626 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001627 VkResult result = device_dispatch_table(device)->CreateFramebuffer(device, pCreateInfo, pFramebuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001628 return result;
1629}
1630
1631
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001632void PreCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001633{
1634 if(pCreateInfo == nullptr)
1635 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001636 char const str[] = "vkCreateRenderPass parameter, VkRenderPassCreateInfo* pCreateInfo, is "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001637 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001638 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001639 return;
1640 }
1641
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001642 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001643 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001644 char const str[] = "vkCreateRenderPass parameter, VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO "\
1645 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001646 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001647 return;
1648 }
1649
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001650 if(!vk_validate_vkrect(&pCreateInfo->renderArea))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001651 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001652 char const str[] = "vkCreateRenderPass parameter, VkRect pCreateInfo->renderArea, is invalid "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001653 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001654 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001655 return;
1656 }
1657
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001658 if(!vk_validate_vkextent2d(&pCreateInfo->extent))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001659 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001660 char const str[] = "vkCreateRenderPass parameter, VkExtent2D pCreateInfo->extent, is invalid "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001661 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001662 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001663 return;
1664 }
1665
1666 if(pCreateInfo->pColorFormats == nullptr)
1667 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001668 char const str[] = "vkCreateRenderPass parameter, VkFormat* pCreateInfo->pColorFormats, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001669 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001670 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001671 return;
1672 }
1673
1674 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1675 {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001676 if(!validate_VkFormat(pCreateInfo->pColorFormats[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001677 {
1678 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001679 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001680 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001681 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001682 continue;
1683 }
1684
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001685 VkFormatProperties properties;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001686 size_t size = sizeof(properties);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001687 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->pColorFormats[i],
Tony Barbour8205d902015-04-16 15:59:00 -06001688 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001689 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001690 {
1691 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001692 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001693 "], cannot be validated (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001694 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001695 continue;
1696 }
1697
1698 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1699 {
1700 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001701 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001702 "], contains unsupported format (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001703 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001704 continue;
1705 }
1706
1707 }
1708
1709 if(pCreateInfo->pColorLayouts == nullptr)
1710 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001711 char const str[] = "vkCreateRenderPass parameter, VkImageLayout* pCreateInfo->pColorLayouts, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001712 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001713 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001714 return;
1715 }
1716
1717 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1718 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001719 if(!validate_VkImageLayout(pCreateInfo->pColorLayouts[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001720 {
1721 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001722 ss << "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pColorLayouts[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001723 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001724 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001725 continue;
1726 }
1727 }
1728
1729 if(pCreateInfo->pColorLoadOps == nullptr)
1730 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001731 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp* pCreateInfo->pColorLoadOps, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001732 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001733 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001734 return;
1735 }
1736
1737 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1738 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001739 if(!validate_VkAttachmentLoadOp(pCreateInfo->pColorLoadOps[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001740 {
1741 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001742 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pColorLoadOps[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001743 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001744 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001745 continue;
1746 }
1747 }
1748
1749 if(pCreateInfo->pColorStoreOps == nullptr)
1750 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001751 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp* pCreateInfo->pColorStoreOps, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001752 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001753 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001754 return;
1755 }
1756
1757 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1758 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001759 if(!validate_VkAttachmentStoreOp(pCreateInfo->pColorStoreOps[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001760 {
1761 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001762 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pColorStoreOps[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001763 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001764 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001765 continue;
1766 }
1767 }
1768
1769 if(pCreateInfo->pColorLoadClearValues == nullptr)
1770 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001771 char const str[] = "vkCreateRenderPass parameter, VkClearColor* pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001772 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001773 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001774 return;
1775 }
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001776
1777 if(pCreateInfo->pColorStoreOps == nullptr)
1778 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001779 char const str[] = "vkCreateRenderPass parameter, VK_ATTACHMENT_STORE_OP* pCreateInfo->pColorStoreOps, "\
Jeremy Hayes9bafb9f2015-04-07 13:38:03 -06001780 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001781 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001782 return;
1783 }
1784
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001785 if(pCreateInfo->pColorLoadClearValues == nullptr)
1786 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001787 char const str[] = "vkCreateRenderPass parameter, VK_CLEAR_COLOR* pCreateInfo->"\
Jeremy Hayes9bafb9f2015-04-07 13:38:03 -06001788 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001789 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001790 return;
1791 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001792
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001793 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1794 {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001795 if(!vk_validate_vkclearcolor(&(pCreateInfo->pColorLoadClearValues[i])))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001796 {
1797 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001798 ss << "vkCreateRenderPass parameter, VkClearColor pCreateInfo->pColorLoadClearValues[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001799 "], is invalid (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001800 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001801 continue;
1802 }
1803 }
1804
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001805 if(!validate_VkFormat(pCreateInfo->depthStencilFormat))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001806 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001807 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001808 "depthStencilFormat, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001809 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001810 return;
1811 }
1812
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001813 VkFormatProperties properties;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001814 size_t size = sizeof(properties);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001815 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->depthStencilFormat,
Tony Barbour8205d902015-04-16 15:59:00 -06001816 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001817 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001818 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001819 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001820 "depthStencilFormat, cannot be validated (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001821 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001822 return;
1823 }
1824
1825 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1826 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001827 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001828 "depthStencilFormat, contains unsupported format (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001829 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001830 return;
1831 }
1832
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001833 if(!validate_VkImageLayout(pCreateInfo->depthStencilLayout))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001834 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001835 char const str[] = "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001836 "depthStencilLayout, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001837 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001838 return;
1839 }
1840
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001841 if(!validate_VkAttachmentLoadOp(pCreateInfo->depthLoadOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001842 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001843 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001844 "depthLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001845 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001846 return;
1847 }
1848
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001849 if(!validate_VkAttachmentStoreOp(pCreateInfo->depthStoreOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001850 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001851 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001852 "depthStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001853 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001854 return;
1855 }
1856
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001857 if(!validate_VkAttachmentLoadOp(pCreateInfo->stencilLoadOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001858 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001859 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001860 "stencilLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001861 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001862 return;
1863 }
1864
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001865 if(!validate_VkAttachmentStoreOp(pCreateInfo->stencilStoreOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001866 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001867 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001868 "stencilStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001869 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001870 return;
1871 }
1872}
1873
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001874void PostCreateRenderPass(VkResult result, VkRenderPass* pRenderPass)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001875{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001876 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001877 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001878 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001879 char const str[] = "vkCreateRenderPass failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001880 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001881 return;
1882 }
1883
1884 if(pRenderPass == nullptr)
1885 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001886 char const str[] = "vkCreateRenderPass parameter, VkRenderPass* pRenderPass, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001887 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001888 return;
1889 }
1890}
1891
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001892VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, VkRenderPass* pRenderPass)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001893{
1894 PreCreateRenderPass(device, pCreateInfo);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001895 VkResult result = device_dispatch_table(device)->CreateRenderPass(device, pCreateInfo, pRenderPass);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001896 PostCreateRenderPass(result, pRenderPass);
1897 return result;
1898}
1899
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001900VK_LAYER_EXPORT void VKAPI vkCmdBeginRenderPass(VkCmdBuffer cmdBuffer, const VkRenderPassBegin* pRenderPassBegin)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001901{
1902 char str[1024];
1903 if (!pRenderPassBegin) {
1904 sprintf(str, "Struct ptr parameter pRenderPassBegin to function CmdBeginRenderPass is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001905 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001906 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001907 else if (!vk_validate_vkrenderpassbegin(pRenderPassBegin)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001908 sprintf(str, "Parameter pRenderPassBegin to function CmdBeginRenderPass contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001909 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001910 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001911 device_dispatch_table(cmdBuffer)->CmdBeginRenderPass(cmdBuffer, pRenderPassBegin);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001912}
1913
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001914VK_LAYER_EXPORT void VKAPI vkCmdEndRenderPass(VkCmdBuffer cmdBuffer, VkRenderPass renderPass)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001915{
1916
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001917 device_dispatch_table(cmdBuffer)->CmdEndRenderPass(cmdBuffer, renderPass);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001918}
1919
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001920VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback(
1921 VkInstance instance,
1922 VkFlags msgFlags,
1923 const PFN_vkDbgMsgCallback pfnMsgCallback,
1924 void* pUserData,
1925 VkDbgMsgCallback* pMsgCallback)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001926{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001927 VkLayerInstanceDispatchTable *pDisp = *(VkLayerInstanceDispatchTable **) instance;
1928 VkLayerInstanceDispatchTable *pTable = tableInstanceMap[pDisp];
1929 return layer_create_msg_callback(instance, pTable, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001930}
1931
Courtney Goeltzenleuchter09f85042015-06-01 14:45:27 -06001932VK_LAYER_EXPORT VkResult VKAPI vkDbgDestroyMsgCallback(
1933 VkInstance instance,
1934 VkDbgMsgCallback msgCallback)
1935{
1936 VkLayerInstanceDispatchTable *pDisp = *(VkLayerInstanceDispatchTable **) instance;
1937 VkLayerInstanceDispatchTable *pTable = tableInstanceMap[pDisp];
1938 return layer_destroy_msg_callback(instance, pTable, msgCallback);
1939}
1940
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001941VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerBegin(VkCmdBuffer cmdBuffer, const char* pMarker)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001942{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001943 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) cmdBuffer;
1944 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
Jon Ashburnf0615e22015-05-25 14:11:37 -06001945 if (!pTable->ext_enabled) {
1946 char const str[] = "Attempt to use CmdDbgMarkerBegin but extension disabled!";
1947 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1948 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001949 pTable->CmdDbgMarkerBegin(cmdBuffer, pMarker);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001950}
1951
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001952VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerEnd(VkCmdBuffer cmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001953{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001954 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) cmdBuffer;
1955 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
Jon Ashburnf0615e22015-05-25 14:11:37 -06001956 if (!pTable->ext_enabled) {
1957 char const str[] = "Attempt to use CmdDbgMarkerEnd but extension disabled!";
1958 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1959 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001960 pTable->CmdDbgMarkerEnd(cmdBuffer);
Jon Ashburnf0615e22015-05-25 14:11:37 -06001961}
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001962
Jon Ashburnf0615e22015-05-25 14:11:37 -06001963VkResult VKAPI vkDbgSetObjectTag(VkDevice device, VkObjectType objType, VkObject object, size_t tagSize, const void* pTag)
1964{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001965 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) device;
1966 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
Jon Ashburnf0615e22015-05-25 14:11:37 -06001967 if (!pTable->ext_enabled) {
1968 char const str[] = "Attempt to use DbgSetObjectTag but extension disabled!";
1969 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1970 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001971 pTable->DbgSetObjectTag(device, objType, object, tagSize, pTag);
Jon Ashburnf0615e22015-05-25 14:11:37 -06001972}
1973
1974VkResult VKAPI vkDbgSetObjectName(VkDevice device, VkObjectType objType, VkObject object, size_t nameSize, const char* pName)
1975{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001976 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) device;
1977 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
1978
Jon Ashburnf0615e22015-05-25 14:11:37 -06001979 if (!pTable->ext_enabled) {
1980 char const str[] = "Attempt to use DbgSetObjectName but extension disabled!";
1981 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1982 }
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001983 pTable->DbgSetObjectName(device, objType, object, nameSize, pName);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001984}
1985
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001986VK_LAYER_EXPORT VkResult VKAPI vkGetDisplayInfoWSI(VkDisplayWSI display, VkDisplayInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001987{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001988 VkResult result = instance_dispatch_table(display)->GetDisplayInfoWSI(display, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001989 return result;
1990}
1991
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001992VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI(VkDevice device, const VkSwapChainCreateInfoWSI* pCreateInfo, VkSwapChainWSI* pSwapChain)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001993{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05001994 VkResult result = device_dispatch_table(device)->CreateSwapChainWSI(device, pCreateInfo, pSwapChain);
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 vkDestroySwapChainWSI(VkSwapChainWSI swapChain)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001999{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002000 VkResult result = device_dispatch_table(swapChain)->DestroySwapChainWSI(swapChain);
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 vkGetSwapChainInfoWSI(VkSwapChainWSI swapChain, VkSwapChainInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002005{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002006 VkResult result = device_dispatch_table(swapChain)->GetSwapChainInfoWSI(swapChain, infoType, pDataSize, pData);
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 vkQueuePresentWSI(VkQueue queue, const VkPresentInfoWSI* pPresentInfo)
2011{
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002012 VkResult result = device_dispatch_table(queue)->QueuePresentWSI(queue, pPresentInfo);
Chia-I Wu5b66aa52015-04-16 22:02:10 +08002013 return result;
2014}
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002015
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002016static inline void* layer_intercept_proc(const char *name)
2017{
2018 if (!name || name[0] != 'v' || name[1] != 'k')
2019 return NULL;
2020
2021 name += 2;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002022 if (!strcmp(name, "DestroyDevice"))
2023 return (void*) vkDestroyDevice;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002024 if (!strcmp(name, "GetDeviceQueue"))
2025 return (void*) vkGetDeviceQueue;
2026 if (!strcmp(name, "QueueSubmit"))
2027 return (void*) vkQueueSubmit;
2028 if (!strcmp(name, "QueueWaitIdle"))
2029 return (void*) vkQueueWaitIdle;
2030 if (!strcmp(name, "DeviceWaitIdle"))
2031 return (void*) vkDeviceWaitIdle;
2032 if (!strcmp(name, "AllocMemory"))
2033 return (void*) vkAllocMemory;
2034 if (!strcmp(name, "FreeMemory"))
2035 return (void*) vkFreeMemory;
2036 if (!strcmp(name, "SetMemoryPriority"))
2037 return (void*) vkSetMemoryPriority;
2038 if (!strcmp(name, "MapMemory"))
2039 return (void*) vkMapMemory;
2040 if (!strcmp(name, "UnmapMemory"))
2041 return (void*) vkUnmapMemory;
2042 if (!strcmp(name, "FlushMappedMemoryRanges"))
2043 return (void*) vkFlushMappedMemoryRanges;
2044 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
2045 return (void*) vkInvalidateMappedMemoryRanges;
2046 if (!strcmp(name, "PinSystemMemory"))
2047 return (void*) vkPinSystemMemory;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002048 if (!strcmp(name, "OpenSharedMemory"))
2049 return (void*) vkOpenSharedMemory;
2050 if (!strcmp(name, "OpenSharedSemaphore"))
2051 return (void*) vkOpenSharedSemaphore;
2052 if (!strcmp(name, "OpenPeerMemory"))
2053 return (void*) vkOpenPeerMemory;
2054 if (!strcmp(name, "OpenPeerImage"))
2055 return (void*) vkOpenPeerImage;
2056 if (!strcmp(name, "DestroyObject"))
2057 return (void*) vkDestroyObject;
2058 if (!strcmp(name, "GetObjectInfo"))
2059 return (void*) vkGetObjectInfo;
2060 if (!strcmp(name, "CreateFence"))
2061 return (void*) vkCreateFence;
2062 if (!strcmp(name, "ResetFences"))
2063 return (void*) vkResetFences;
2064 if (!strcmp(name, "GetFenceStatus"))
2065 return (void*) vkGetFenceStatus;
2066 if (!strcmp(name, "WaitForFences"))
2067 return (void*) vkWaitForFences;
2068 if (!strcmp(name, "CreateSemaphore"))
2069 return (void*) vkCreateSemaphore;
2070 if (!strcmp(name, "QueueSignalSemaphore"))
2071 return (void*) vkQueueSignalSemaphore;
2072 if (!strcmp(name, "QueueWaitSemaphore"))
2073 return (void*) vkQueueWaitSemaphore;
2074 if (!strcmp(name, "CreateEvent"))
2075 return (void*) vkCreateEvent;
2076 if (!strcmp(name, "GetEventStatus"))
2077 return (void*) vkGetEventStatus;
2078 if (!strcmp(name, "SetEvent"))
2079 return (void*) vkSetEvent;
2080 if (!strcmp(name, "ResetEvent"))
2081 return (void*) vkResetEvent;
2082 if (!strcmp(name, "CreateQueryPool"))
2083 return (void*) vkCreateQueryPool;
2084 if (!strcmp(name, "GetQueryPoolResults"))
2085 return (void*) vkGetQueryPoolResults;
2086 if (!strcmp(name, "GetFormatInfo"))
2087 return (void*) vkGetFormatInfo;
2088 if (!strcmp(name, "CreateBuffer"))
2089 return (void*) vkCreateBuffer;
2090 if (!strcmp(name, "CreateBufferView"))
2091 return (void*) vkCreateBufferView;
2092 if (!strcmp(name, "CreateImage"))
2093 return (void*) vkCreateImage;
2094 if (!strcmp(name, "GetImageSubresourceInfo"))
2095 return (void*) vkGetImageSubresourceInfo;
2096 if (!strcmp(name, "CreateImageView"))
2097 return (void*) vkCreateImageView;
2098 if (!strcmp(name, "CreateColorAttachmentView"))
2099 return (void*) vkCreateColorAttachmentView;
2100 if (!strcmp(name, "CreateDepthStencilView"))
2101 return (void*) vkCreateDepthStencilView;
2102 if (!strcmp(name, "CreateShader"))
2103 return (void*) vkCreateShader;
2104 if (!strcmp(name, "CreateGraphicsPipeline"))
2105 return (void*) vkCreateGraphicsPipeline;
2106 if (!strcmp(name, "CreateGraphicsPipelineDerivative"))
2107 return (void*) vkCreateGraphicsPipelineDerivative;
2108 if (!strcmp(name, "CreateComputePipeline"))
2109 return (void*) vkCreateComputePipeline;
2110 if (!strcmp(name, "StorePipeline"))
2111 return (void*) vkStorePipeline;
2112 if (!strcmp(name, "LoadPipeline"))
2113 return (void*) vkLoadPipeline;
2114 if (!strcmp(name, "LoadPipelineDerivative"))
2115 return (void*) vkLoadPipelineDerivative;
2116 if (!strcmp(name, "CreatePipelineLayout"))
2117 return (void*) vkCreatePipelineLayout;
2118 if (!strcmp(name, "CreateSampler"))
2119 return (void*) vkCreateSampler;
2120 if (!strcmp(name, "CreateDescriptorSetLayout"))
2121 return (void*) vkCreateDescriptorSetLayout;
2122 if (!strcmp(name, "CreateDescriptorPool"))
2123 return (void*) vkCreateDescriptorPool;
2124 if (!strcmp(name, "ResetDescriptorPool"))
2125 return (void*) vkResetDescriptorPool;
2126 if (!strcmp(name, "AllocDescriptorSets"))
2127 return (void*) vkAllocDescriptorSets;
2128 if (!strcmp(name, "ClearDescriptorSets"))
2129 return (void*) vkClearDescriptorSets;
2130 if (!strcmp(name, "CreateDynamicViewportState"))
2131 return (void*) vkCreateDynamicViewportState;
2132 if (!strcmp(name, "CreateDynamicRasterState"))
2133 return (void*) vkCreateDynamicRasterState;
2134 if (!strcmp(name, "CreateDynamicColorBlendState"))
2135 return (void*) vkCreateDynamicColorBlendState;
2136 if (!strcmp(name, "CreateDynamicDepthStencilState"))
2137 return (void*) vkCreateDynamicDepthStencilState;
2138 if (!strcmp(name, "CreateCommandBuffer"))
2139 return (void*) vkCreateCommandBuffer;
2140 if (!strcmp(name, "BeginCommandBuffer"))
2141 return (void*) vkBeginCommandBuffer;
2142 if (!strcmp(name, "EndCommandBuffer"))
2143 return (void*) vkEndCommandBuffer;
2144 if (!strcmp(name, "ResetCommandBuffer"))
2145 return (void*) vkResetCommandBuffer;
2146 if (!strcmp(name, "CmdBindPipeline"))
2147 return (void*) vkCmdBindPipeline;
2148 if (!strcmp(name, "CmdBindDynamicStateObject"))
2149 return (void*) vkCmdBindDynamicStateObject;
2150 if (!strcmp(name, "CmdBindDescriptorSets"))
2151 return (void*) vkCmdBindDescriptorSets;
2152 if (!strcmp(name, "CmdBindVertexBuffers"))
2153 return (void*) vkCmdBindVertexBuffers;
2154 if (!strcmp(name, "CmdBindIndexBuffer"))
2155 return (void*) vkCmdBindIndexBuffer;
2156 if (!strcmp(name, "CmdDraw"))
2157 return (void*) vkCmdDraw;
2158 if (!strcmp(name, "CmdDrawIndexed"))
2159 return (void*) vkCmdDrawIndexed;
2160 if (!strcmp(name, "CmdDrawIndirect"))
2161 return (void*) vkCmdDrawIndirect;
2162 if (!strcmp(name, "CmdDrawIndexedIndirect"))
2163 return (void*) vkCmdDrawIndexedIndirect;
2164 if (!strcmp(name, "CmdDispatch"))
2165 return (void*) vkCmdDispatch;
2166 if (!strcmp(name, "CmdDispatchIndirect"))
2167 return (void*) vkCmdDispatchIndirect;
2168 if (!strcmp(name, "CmdCopyBuffer"))
2169 return (void*) vkCmdCopyBuffer;
2170 if (!strcmp(name, "CmdCopyImage"))
2171 return (void*) vkCmdCopyImage;
2172 if (!strcmp(name, "CmdBlitImage"))
2173 return (void*) vkCmdBlitImage;
2174 if (!strcmp(name, "CmdCopyBufferToImage"))
2175 return (void*) vkCmdCopyBufferToImage;
2176 if (!strcmp(name, "CmdCopyImageToBuffer"))
2177 return (void*) vkCmdCopyImageToBuffer;
2178 if (!strcmp(name, "CmdUpdateBuffer"))
2179 return (void*) vkCmdUpdateBuffer;
2180 if (!strcmp(name, "CmdFillBuffer"))
2181 return (void*) vkCmdFillBuffer;
2182 if (!strcmp(name, "CmdClearColorImage"))
2183 return (void*) vkCmdClearColorImage;
2184 if (!strcmp(name, "CmdClearDepthStencil"))
2185 return (void*) vkCmdClearDepthStencil;
2186 if (!strcmp(name, "CmdResolveImage"))
2187 return (void*) vkCmdResolveImage;
2188 if (!strcmp(name, "CmdSetEvent"))
2189 return (void*) vkCmdSetEvent;
2190 if (!strcmp(name, "CmdResetEvent"))
2191 return (void*) vkCmdResetEvent;
2192 if (!strcmp(name, "CmdWaitEvents"))
2193 return (void*) vkCmdWaitEvents;
2194 if (!strcmp(name, "CmdPipelineBarrier"))
2195 return (void*) vkCmdPipelineBarrier;
2196 if (!strcmp(name, "CmdBeginQuery"))
2197 return (void*) vkCmdBeginQuery;
2198 if (!strcmp(name, "CmdEndQuery"))
2199 return (void*) vkCmdEndQuery;
2200 if (!strcmp(name, "CmdResetQueryPool"))
2201 return (void*) vkCmdResetQueryPool;
2202 if (!strcmp(name, "CmdWriteTimestamp"))
2203 return (void*) vkCmdWriteTimestamp;
2204 if (!strcmp(name, "CmdCopyQueryPoolResults"))
2205 return (void*) vkCmdCopyQueryPoolResults;
2206 if (!strcmp(name, "CmdInitAtomicCounters"))
2207 return (void*) vkCmdInitAtomicCounters;
2208 if (!strcmp(name, "CmdLoadAtomicCounters"))
2209 return (void*) vkCmdLoadAtomicCounters;
2210 if (!strcmp(name, "CmdSaveAtomicCounters"))
2211 return (void*) vkCmdSaveAtomicCounters;
2212 if (!strcmp(name, "CreateFramebuffer"))
2213 return (void*) vkCreateFramebuffer;
2214 if (!strcmp(name, "CreateRenderPass"))
2215 return (void*) vkCreateRenderPass;
2216 if (!strcmp(name, "CmdBeginRenderPass"))
2217 return (void*) vkCmdBeginRenderPass;
2218 if (!strcmp(name, "CmdEndRenderPass"))
2219 return (void*) vkCmdEndRenderPass;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002220 if (!strcmp(name, "CmdDbgMarkerBegin"))
2221 return (void*) vkCmdDbgMarkerBegin;
2222 if (!strcmp(name, "CmdDbgMarkerEnd"))
2223 return (void*) vkCmdDbgMarkerEnd;
2224 if (!strcmp(name, "GetDisplayInfoWSI"))
2225 return (void*) vkGetDisplayInfoWSI;
2226 if (!strcmp(name, "CreateSwapChainWSI"))
2227 return (void*) vkCreateSwapChainWSI;
2228 if (!strcmp(name, "DestroySwapChainWSI"))
2229 return (void*) vkDestroySwapChainWSI;
2230 if (!strcmp(name, "GetSwapChainInfoWSI"))
2231 return (void*) vkGetSwapChainInfoWSI;
2232 if (!strcmp(name, "QueuePresentWSI"))
2233 return (void*) vkQueuePresentWSI;
2234
2235 return NULL;
2236}
2237
2238static inline void* layer_intercept_instance_proc(const char *name)
2239{
2240 if (!name || name[0] != 'v' || name[1] != 'k')
2241 return NULL;
2242
2243 name += 2;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002244 if (!strcmp(name, "CreateInstance"))
2245 return (void*) vkCreateInstance;
2246 if (!strcmp(name, "DestroyInstance"))
2247 return (void*) vkDestroyInstance;
2248 if (!strcmp(name, "GetPhysicalDeviceInfo"))
2249 return (void*) vkGetPhysicalDeviceInfo;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002250 if (!strcmp(name, "CreateDevice"))
2251 return (void*) vkCreateDevice;
2252 if (!strcmp(name, "GetGlobalExtensionInfo"))
2253 return (void*) vkGetGlobalExtensionInfo;
2254 if (!strcmp(name, "GetPhysicalDeviceExtensionInfo"))
2255 return (void*) vkGetPhysicalDeviceExtensionInfo;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002256 if (!strcmp(name, "GetMultiDeviceCompatibility"))
2257 return (void*) vkGetMultiDeviceCompatibility;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002258
2259 return NULL;
2260}
2261
Jon Ashburn1245cec2015-05-18 13:20:15 -06002262VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002263{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002264 void* addr;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002265 if (device == NULL) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002266 return NULL;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002267 }
2268
Jon Ashburnd9564002015-05-07 10:27:37 -06002269 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002270
2271 /* loader uses this to force layer initialization; device object is wrapped */
2272 if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
2273 initDeviceTable((const VkBaseLayerObject *) device);
2274 return (void*) vkGetDeviceProcAddr;
2275 }
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002276
2277 addr = layer_intercept_proc(funcName);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002278 if (addr) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002279 return addr;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002280 }
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002281 else {
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002282 VkLayerDispatchTable **ppDisp = (VkLayerDispatchTable **) device;
2283 VkLayerDispatchTable* pTable = tableMap[*ppDisp];
2284 if (pTable->GetDeviceProcAddr == NULL)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002285 return NULL;
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002286 return pTable->GetDeviceProcAddr(device, funcName);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002287 }
2288}
2289
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002290VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002291{
Courtney Goeltzenleuchter09f85042015-06-01 14:45:27 -06002292 void *fptr;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002293 void* addr;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002294 if (instance == NULL) {
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002295 return NULL;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002296 }
2297
Jon Ashburnd9564002015-05-07 10:27:37 -06002298 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002299
2300 /* loader uses this to force layer initialization; instance object is wrapped */
2301 if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
2302 initInstanceTable((const VkBaseLayerObject *) instance);
2303 return (void*) vkGetInstanceProcAddr;
2304 }
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002305
2306 addr = layer_intercept_instance_proc(funcName);
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002307 if (addr) {
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002308 return addr;
Mark Lobodzinski3723c512015-05-26 10:58:40 -05002309 }
Courtney Goeltzenleuchter09f85042015-06-01 14:45:27 -06002310
2311 fptr = msg_callback_get_proc_addr(funcName);
2312 if (fptr)
2313 return fptr;
2314
2315 {
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002316 VkLayerInstanceDispatchTable **ppDisp = (VkLayerInstanceDispatchTable **) instance;
2317 VkLayerInstanceDispatchTable* pTable = tableInstanceMap[*ppDisp];
2318 if (pTable->GetInstanceProcAddr == NULL)
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002319 return NULL;
Jon Ashburn4f2575f2015-05-28 16:25:02 -06002320 return pTable->GetInstanceProcAddr(instance, funcName);
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002321 }
2322}