blob: fa8f316c56736f4cbf271b7f0b74678d252159a0 [file] [log] [blame]
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001/*
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002 * Vulkan
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28
29#include <iostream>
30#include <string>
31#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050032#include <unordered_map>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060033
34#include "loader_platform.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060035#include "vkLayer.h"
Jon Ashburne68a9ff2015-05-25 14:11:37 -060036#include "vk_debug_marker_layer.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060037#include "layers_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060038#include "vk_enum_validate_helper.h"
39#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060040//The following is #included again to catch certain OS-specific functions being used:
41#include "loader_platform.h"
42
43#include "layers_msg.h"
44
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060045static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(initOnce);
Mark Lobodzinski2eed1eb2015-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 Hayesa8b1a8d2015-04-06 13:46:11 -060063
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060064#include "vk_dispatch_table_helper.h"
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060065
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050066static VkLayerDispatchTable * initDeviceTable(const VkBaseLayerObject *devw)
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060067{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050068 VkLayerDispatchTable *pTable;
69 VkLayerDebugMarkerDispatchTable *pDebugMarkerTable;
Jon Ashburne68a9ff2015-05-25 14:11:37 -060070
Mark Lobodzinski2eed1eb2015-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 Ashburn8fd08252015-05-28 16:25:02 -060086 layer_initialize_dispatch_table(pTable, devw);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050087
Jon Ashburn8fd08252015-05-28 16:25:02 -060088 VkDevice device = (VkDevice) devw->baseObject;
Mark Lobodzinski2eed1eb2015-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 Ashburn8c5cbcf2015-05-07 10:27:37 -060096}
97
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050098static VkLayerInstanceDispatchTable * initInstanceTable(const VkBaseLayerObject *instw)
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060099{
Mark Lobodzinski2eed1eb2015-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 Ashburn8fd08252015-05-28 16:25:02 -0600114 layer_init_instance_dispatch_table(pTable, instw);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500115
116 return pTable;
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -0600117}
118
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600119static void initParamChecker(void)
120{
121
122 const char *strOpt;
123 // initialize ParamChecker options
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600124 getLayerOptionEnum("ParamCheckerReportLevel", (uint32_t *) &g_reportFlags);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600125 g_actionIsDefault = getLayerOptionEnum("ParamCheckerDebugAction", (uint32_t *) &g_debugAction);
126
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600127 if (g_debugAction & VK_DBG_LAYER_ACTION_LOG_MSG)
Jeremy Hayesa8b1a8d2015-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 Hayesa8b1a8d2015-04-06 13:46:11 -0600137}
138
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600139void PreCreateInstance(const VkApplicationInfo* pAppInfo, const VkAllocCallbacks* pAllocCb)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600140{
141 if(pAppInfo == nullptr)
142 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600143 char const str[] = "vkCreateInstance parameter, VkApplicationInfo* pAppInfo, is "\
Mike Stroyan1c8d4d82015-04-06 15:24:46 -0600144 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600145 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600146 return;
147 }
148
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600149 if(pAppInfo->sType != VK_STRUCTURE_TYPE_APPLICATION_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600150 {
Courtney Goeltzenleuchterd8e229c2015-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 Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600153 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600154 return;
155 }
156
157 // TODO: What else can validated in pAppInfo?
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600158 // TODO: VK_API_VERSION validation.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600159
160 // It's okay if pAllocCb is a nullptr.
161 if(pAllocCb != nullptr)
162 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600163 if(!vk_validate_vkalloccallbacks(pAllocCb))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600164 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600165 char const str[] = "vkCreateInstance parameter, VkAllocCallbacks* pAllocCb, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600166 "contains an invalid value (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600167 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600168 return;
169 }
170 }
171}
172
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600173void PostCreateInstance(VkResult result, const VkInstanceCreateInfo *pCreateInfo, VkInstance* pInstance)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600174{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600175 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600176 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600177 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600178 char const str[] = "vkCreateInstance failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600179 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600180 return;
181 }
182
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600183 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
184
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600185 if(pInstance == nullptr)
186 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600187 char const str[] = "vkCreateInstance parameter, VkInstance* pInstance, is nullptr "\
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600188 "(postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600189 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600190 return;
191 }
192}
193
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600194VK_LAYER_EXPORT VkResult VKAPI vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600195{
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600196 /* TODO: shouldn't we have initInstanceDispatch here? */
197 loader_platform_thread_once(&initOnce, initParamChecker);
198 initInstanceTable((const VkBaseLayerObject *) (*pInstance));
199
Jon Ashburnb317fad2015-04-04 14:52:07 -0600200 PreCreateInstance(pCreateInfo->pAppInfo, pCreateInfo->pAllocCb);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500201 VkResult result = instance_dispatch_table(*pInstance)->CreateInstance(pCreateInfo, pInstance);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600202 PostCreateInstance(result, pCreateInfo, pInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600203 return result;
204}
205
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600206VK_LAYER_EXPORT VkResult VKAPI vkDestroyInstance(VkInstance instance)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600207{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500208 VkLayerInstanceDispatchTable *pDisp = *(VkLayerInstanceDispatchTable **) instance;
209 VkResult res = instance_dispatch_table(instance)->DestroyInstance(instance);
210 tableInstanceMap.erase(pDisp);
211 return res;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600212}
213
Tony Barbourd1c35722015-04-16 15:59:00 -0600214VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceInfo(VkPhysicalDevice gpu, VkPhysicalDeviceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600215{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600216 char str[1024];
Tony Barbourd1c35722015-04-16 15:59:00 -0600217 if (!validate_VkPhysicalDeviceInfoType(infoType)) {
218 sprintf(str, "Parameter infoType to function GetPhysicalDeviceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600219 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600220 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500221 VkResult result = instance_dispatch_table(gpu)->GetPhysicalDeviceInfo(gpu, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600222 return result;
223}
224
Tony Barbourd1c35722015-04-16 15:59:00 -0600225void PreCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600226{
227 if(gpu == nullptr)
228 {
Tony Barbourd1c35722015-04-16 15:59:00 -0600229 char const str[] = "vkCreateDevice parameter, VkPhysicalDevice gpu, is nullptr "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600230 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600231 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600232 return;
233 }
234
235 if(pCreateInfo == nullptr)
236 {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600237 char const str[] = "vkCreateDevice parameter, VkDeviceCreateInfo* pCreateInfo, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600238 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600239 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600240 return;
241 }
242
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600243 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600244 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600245 char const str[] = "vkCreateDevice parameter, VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO "\
246 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600247 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600248 return;
249 }
250
251 if(pCreateInfo->queueRecordCount == 0)
252 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600253 char const str[] = "vkCreateDevice parameter, uint32_t pCreateInfo->queueRecordCount, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600254 "zero (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600255 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600256 return;
257 }
258
259 if(pCreateInfo->pRequestedQueues == nullptr)
260 {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600261 char const str[] = "vkCreateDevice parameter, VkDeviceQueueCreateInfo* pCreateInfo->pRequestedQueues, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600262 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600263 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600264 return;
265 }
266
267 for(uint32_t i = 0; i < pCreateInfo->queueRecordCount; ++i)
268 {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600269 if(!vk_validate_vkdevicequeuecreateinfo(&(pCreateInfo->pRequestedQueues[i])))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600270 {
271 std::stringstream ss;
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600272 ss << "vkCreateDevice parameter, VkDeviceQueueCreateInfo pCreateInfo->pRequestedQueues[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600273 "], is invalid (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600274 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600275 continue;
276 }
277 }
278
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600279}
280
Jon Ashburne68a9ff2015-05-25 14:11:37 -0600281static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
282{
283 uint32_t i, ext_idx;
284 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) device;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500285 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
Jon Ashburne68a9ff2015-05-25 14:11:37 -0600286
287 for (i = 0; i < pCreateInfo->extensionCount; i++) {
288 if (strcmp(pCreateInfo->pEnabledExtensions[i].name, DEBUG_MARKER_EXTENSION_NAME) == 0) {
289 /* Found a matching extension name, mark it enabled */
290 pTable->ext_enabled = true;
291 }
292
293 }
294}
295
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600296void PostCreateDevice(VkResult result, const VkDeviceCreateInfo *pCreateInfo, VkDevice* pDevice)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600297{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600298 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600299 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600300 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600301 char const str[] = "vkCreateDevice failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600302 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600303 return;
304 }
305
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600306 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
Jon Ashburne68a9ff2015-05-25 14:11:37 -0600307 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600308
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600309 if(pDevice == nullptr)
310 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600311 char const str[] = "vkCreateDevice parameter, VkDevice* pDevice, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600312 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600313 return;
314 }
315}
316
Tony Barbourd1c35722015-04-16 15:59:00 -0600317VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600318{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600319 PreCreateDevice(gpu, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500320 VkResult result = instance_dispatch_table(gpu)->CreateDevice(gpu, pCreateInfo, pDevice);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600321 PostCreateDevice(result, pCreateInfo, pDevice);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600322 return result;
323}
324
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600325VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice(VkDevice device)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600326{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500327 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
328 VkLayerDispatchTable *pTable = tableMap[pDisp];
329 VkResult result = pTable->DestroyDevice(device);
330 tableMap.erase(pDisp);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600331 return result;
332}
333
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600334#define PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE 2
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600335static const VkExtensionProperties pcExts[PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE] = {
336 {
337 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
338 "ParamChecker",
339 0x10,
340 "Sample layer: ParamChecker",
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600341 },
342 {
343 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
344 "Validation",
345 0x10,
346 "Sample layer: ParamChecker",
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600347 }
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600348};
349
350VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo(
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600351 VkExtensionInfoType infoType,
352 uint32_t extensionIndex,
353 size_t* pDataSize,
354 void* pData)
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600355{
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600356 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600357 uint32_t *count;
358
359 if (pDataSize == NULL)
360 return VK_ERROR_INVALID_POINTER;
361
362 switch (infoType) {
363 case VK_EXTENSION_INFO_TYPE_COUNT:
364 *pDataSize = sizeof(uint32_t);
365 if (pData == NULL)
366 return VK_SUCCESS;
367 count = (uint32_t *) pData;
368 *count = PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE;
369 break;
370 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
371 *pDataSize = sizeof(VkExtensionProperties);
372 if (pData == NULL)
373 return VK_SUCCESS;
374 if (extensionIndex >= PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE)
375 return VK_ERROR_INVALID_VALUE;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600376 memcpy((VkExtensionProperties *) pData, &pcExts[extensionIndex], sizeof(VkExtensionProperties));
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600377 break;
378 default:
379 return VK_ERROR_INVALID_VALUE;
380 };
381
382 return VK_SUCCESS;
383}
384
Jeremy Hayesad367152015-04-17 10:36:53 -0600385VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionInfo(
386 VkPhysicalDevice gpu,
387 VkExtensionInfoType infoType,
388 uint32_t extensionIndex,
389 size_t* pDataSize,
390 void* pData)
391{
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600392 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
393 uint32_t *count;
394
395 if (pDataSize == NULL)
396 return VK_ERROR_INVALID_POINTER;
397
398 switch (infoType) {
399 case VK_EXTENSION_INFO_TYPE_COUNT:
400 *pDataSize = sizeof(uint32_t);
401 if (pData == NULL)
402 return VK_SUCCESS;
403 count = (uint32_t *) pData;
404 *count = PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE;
405 break;
406 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
407 *pDataSize = sizeof(VkExtensionProperties);
408 if (pData == NULL)
409 return VK_SUCCESS;
410 if (extensionIndex >= PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE)
411 return VK_ERROR_INVALID_VALUE;
412 memcpy((VkExtensionProperties *) pData, &pcExts[extensionIndex], sizeof(VkExtensionProperties));
413 break;
414 default:
415 return VK_ERROR_INVALID_VALUE;
416 };
417
418 return VK_SUCCESS;
Jeremy Hayesad367152015-04-17 10:36:53 -0600419}
420
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600421VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex, VkQueue* pQueue)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600422{
423
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500424 VkResult result = device_dispatch_table(device)->GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600425 return result;
426}
427
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600428VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600429{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500430 VkResult result = device_dispatch_table(queue)->QueueSubmit(queue, cmdBufferCount, pCmdBuffers, fence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600431 return result;
432}
433
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600434VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(VkQueue queue)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600435{
436
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500437 VkResult result = device_dispatch_table(queue)->QueueWaitIdle(queue);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600438 return result;
439}
440
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600441VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle(VkDevice device)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600442{
443
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500444 VkResult result = device_dispatch_table(device)->DeviceWaitIdle(device);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600445 return result;
446}
447
Tony Barbourd1c35722015-04-16 15:59:00 -0600448VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory(VkDevice device, const VkMemoryAllocInfo* pAllocInfo, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600449{
450 char str[1024];
451 if (!pAllocInfo) {
452 sprintf(str, "Struct ptr parameter pAllocInfo to function AllocMemory is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600453 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600454 } else if (!vk_validate_vkmemoryallocinfo(pAllocInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600455 sprintf(str, "Parameter pAllocInfo to function AllocMemory contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600456 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600457 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500458 VkResult result = device_dispatch_table(device)->AllocMemory(device, pAllocInfo, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600459 return result;
460}
461
Mike Stroyanb050c682015-04-17 12:36:38 -0600462VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600463{
464
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500465 VkResult result = device_dispatch_table(device)->FreeMemory(device, mem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600466 return result;
467}
468
Mike Stroyanb050c682015-04-17 12:36:38 -0600469VK_LAYER_EXPORT VkResult VKAPI vkSetMemoryPriority(VkDevice device, VkDeviceMemory mem, VkMemoryPriority priority)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600470{
471 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600472 if (!validate_VkMemoryPriority(priority)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600473 sprintf(str, "Parameter priority to function SetMemoryPriority has invalid value of %i.", (int)priority);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600474 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600475 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500476 VkResult result = device_dispatch_table(device)->SetMemoryPriority(device, mem, priority);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600477 return result;
478}
479
Mike Stroyanb050c682015-04-17 12:36:38 -0600480VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkFlags flags, void** ppData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600481{
482
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500483 VkResult result = device_dispatch_table(device)->MapMemory(device, mem, offset, size, flags, ppData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600484 return result;
485}
486
Mike Stroyanb050c682015-04-17 12:36:38 -0600487VK_LAYER_EXPORT VkResult VKAPI vkUnmapMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600488{
489
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500490 VkResult result = device_dispatch_table(device)->UnmapMemory(device, mem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600491 return result;
492}
493
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -0600494VK_LAYER_EXPORT VkResult VKAPI vkFlushMappedMemoryRanges(
495 VkDevice device,
496 uint32_t memRangeCount,
497 const VkMappedMemoryRange* pMemRanges)
Tony Barbourb1250542015-04-16 19:23:13 -0600498{
499
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500500 VkResult result = device_dispatch_table(device)->FlushMappedMemoryRanges(device, memRangeCount, pMemRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -0600501 return result;
502}
503
504VK_LAYER_EXPORT VkResult VKAPI vkInvalidateMappedMemoryRanges(
505 VkDevice device,
506 uint32_t memRangeCount,
507 const VkMappedMemoryRange* pMemRanges)
508{
509
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500510 VkResult result = device_dispatch_table(device)->InvalidateMappedMemoryRanges(device, memRangeCount, pMemRanges);
Tony Barbourb1250542015-04-16 19:23:13 -0600511 return result;
512}
513
Tony Barbourd1c35722015-04-16 15:59:00 -0600514VK_LAYER_EXPORT VkResult VKAPI vkPinSystemMemory(VkDevice device, const void* pSysMem, size_t memSize, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600515{
516
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500517 VkResult result = device_dispatch_table(device)->PinSystemMemory(device, pSysMem, memSize, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600518 return result;
519}
520
Tony Barbourd1c35722015-04-16 15:59:00 -0600521VK_LAYER_EXPORT VkResult VKAPI vkGetMultiDeviceCompatibility(VkPhysicalDevice gpu0, VkPhysicalDevice gpu1, VkPhysicalDeviceCompatibilityInfo* pInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600522{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600523
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500524 VkResult result = instance_dispatch_table(gpu0)->GetMultiDeviceCompatibility(gpu0, gpu1, pInfo);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600525 return result;
526}
527
Tony Barbourd1c35722015-04-16 15:59:00 -0600528VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedMemory(VkDevice device, const VkMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600529{
530 char str[1024];
531 if (!pOpenInfo) {
532 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedMemory is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600533 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600534 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600535 else if (!vk_validate_vkmemoryopeninfo(pOpenInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600536 sprintf(str, "Parameter pOpenInfo to function OpenSharedMemory contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600537 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600538 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500539 VkResult result = device_dispatch_table(device)->OpenSharedMemory(device, pOpenInfo, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600540 return result;
541}
542
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600543VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedSemaphore(VkDevice device, const VkSemaphoreOpenInfo* pOpenInfo, VkSemaphore* pSemaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600544{
545 char str[1024];
546 if (!pOpenInfo) {
547 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedSemaphore is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600548 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600549 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600550 else if (!vk_validate_vksemaphoreopeninfo(pOpenInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600551 sprintf(str, "Parameter pOpenInfo to function OpenSharedSemaphore contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600552 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600553 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500554 VkResult result = device_dispatch_table(device)->OpenSharedSemaphore(device, pOpenInfo, pSemaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600555 return result;
556}
557
Tony Barbourd1c35722015-04-16 15:59:00 -0600558VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerMemory(VkDevice device, const VkPeerMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600559{
560 char str[1024];
561 if (!pOpenInfo) {
562 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerMemory is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600563 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600564 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600565 else if (!vk_validate_vkpeermemoryopeninfo(pOpenInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600566 sprintf(str, "Parameter pOpenInfo to function OpenPeerMemory contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600567 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600568 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500569 VkResult result = device_dispatch_table(device)->OpenPeerMemory(device, pOpenInfo, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600570 return result;
571}
572
Tony Barbourd1c35722015-04-16 15:59:00 -0600573VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerImage(VkDevice device, const VkPeerImageOpenInfo* pOpenInfo, VkImage* pImage, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600574{
575 char str[1024];
576 if (!pOpenInfo) {
577 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerImage is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600578 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600579 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600580 else if (!vk_validate_vkpeerimageopeninfo(pOpenInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600581 sprintf(str, "Parameter pOpenInfo to function OpenPeerImage contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600582 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600583 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500584 VkResult result = device_dispatch_table(device)->OpenPeerImage(device, pOpenInfo, pImage, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600585 return result;
586}
587
Mike Stroyanb050c682015-04-17 12:36:38 -0600588VK_LAYER_EXPORT VkResult VKAPI vkDestroyObject(VkDevice device, VkObjectType objType, VkObject object)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600589{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500590 VkResult result = device_dispatch_table(device)->DestroyObject(device, objType, object);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600591 return result;
592}
593
Mike Stroyanb050c682015-04-17 12:36:38 -0600594VK_LAYER_EXPORT VkResult VKAPI vkGetObjectInfo(VkDevice device, VkObjectType objType, VkObject object, VkObjectInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600595{
596 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600597 if (!validate_VkObjectInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600598 sprintf(str, "Parameter infoType to function GetObjectInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600599 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600600 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500601 VkResult result = device_dispatch_table(device)->GetObjectInfo(device, objType, object, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600602 return result;
603}
604
Mark Lobodzinski23065352015-05-29 09:32:35 -0500605VK_LAYER_EXPORT VkResult VKAPI vkBindObjectMemory(VkDevice device, VkObjectType objType, VkObject object, VkDeviceMemory mem, VkDeviceSize offset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600606{
607
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500608 VkResult result = device_dispatch_table(device)->BindObjectMemory(device, objType, object, mem, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600609 return result;
610}
611
Mark Lobodzinski23065352015-05-29 09:32:35 -0500612VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(VkQueue queue, VkBuffer buffer, VkDeviceSize rangeOffset, VkDeviceSize rangeSize, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600613{
614
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500615 VkResult result = device_dispatch_table(queue)->QueueBindSparseBufferMemory(queue, buffer, rangeOffset, rangeSize, mem, memOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600616 return result;
617}
618
Mark Lobodzinski23065352015-05-29 09:32:35 -0500619VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageMemory(VkQueue queue, VkImage image, const VkImageMemoryBindInfo* pBindInfo, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600620{
621 char str[1024];
Jeremy Hayesaf0d72c2015-04-15 15:20:03 -0600622 if (!pBindInfo) {
Mark Lobodzinski942b1722015-05-11 17:21:15 -0500623 sprintf(str, "Struct ptr parameter pBindInfo to function QueueBindSparseImageMemory is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600624 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600625 }
Jeremy Hayesaf0d72c2015-04-15 15:20:03 -0600626 else if (!vk_validate_vkimagememorybindinfo(pBindInfo)) {
627 sprintf(str, "Parameter pBindInfo to function BindImageMemoryRange contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600628 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600629 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500630 VkResult result = device_dispatch_table(queue)->QueueBindSparseImageMemory(queue, image, pBindInfo, mem, memOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600631 return result;
632}
633
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600634VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(VkDevice device, const VkFenceCreateInfo* pCreateInfo, VkFence* pFence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600635{
636 char str[1024];
637 if (!pCreateInfo) {
638 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFence is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600639 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600640 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600641 else if (!vk_validate_vkfencecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600642 sprintf(str, "Parameter pCreateInfo to function CreateFence contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600643 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600644 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500645 VkResult result = device_dispatch_table(device)->CreateFence(device, pCreateInfo, pFence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600646 return result;
647}
648
Mike Stroyanb050c682015-04-17 12:36:38 -0600649VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(VkDevice device, VkFence fence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600650{
651
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500652 VkResult result = device_dispatch_table(device)->GetFenceStatus(device, fence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600653 return result;
654}
655
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600656VK_LAYER_EXPORT VkResult VKAPI vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences, bool32_t waitAll, uint64_t timeout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600657{
658
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500659 VkResult result = device_dispatch_table(device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600660 return result;
661}
662
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600663VK_LAYER_EXPORT VkResult VKAPI vkResetFences(VkDevice device, uint32_t fenceCount, VkFence* pFences)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500664{
665
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500666 VkResult result = device_dispatch_table(device)->ResetFences(device, fenceCount, pFences);
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500667 return result;
668}
669
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600670VK_LAYER_EXPORT VkResult VKAPI vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, VkSemaphore* pSemaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600671{
672 char str[1024];
673 if (!pCreateInfo) {
674 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSemaphore is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600675 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600676 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600677 else if (!vk_validate_vksemaphorecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600678 sprintf(str, "Parameter pCreateInfo to function CreateSemaphore contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600679 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600680 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500681 VkResult result = device_dispatch_table(device)->CreateSemaphore(device, pCreateInfo, pSemaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600682 return result;
683}
684
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600685VK_LAYER_EXPORT VkResult VKAPI vkQueueSignalSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600686{
687
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500688 VkResult result = device_dispatch_table(queue)->QueueSignalSemaphore(queue, semaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600689 return result;
690}
691
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600692VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600693{
694
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500695 VkResult result = device_dispatch_table(queue)->QueueWaitSemaphore(queue, semaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600696 return result;
697}
698
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600699VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(VkDevice device, const VkEventCreateInfo* pCreateInfo, VkEvent* pEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600700{
701 char str[1024];
702 if (!pCreateInfo) {
703 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateEvent is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600704 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600705 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600706 else if (!vk_validate_vkeventcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600707 sprintf(str, "Parameter pCreateInfo to function CreateEvent contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600708 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600709 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500710 VkResult result = device_dispatch_table(device)->CreateEvent(device, pCreateInfo, pEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600711 return result;
712}
713
Mike Stroyanb050c682015-04-17 12:36:38 -0600714VK_LAYER_EXPORT VkResult VKAPI vkGetEventStatus(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600715{
716
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500717 VkResult result = device_dispatch_table(device)->GetEventStatus(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600718 return result;
719}
720
Mike Stroyanb050c682015-04-17 12:36:38 -0600721VK_LAYER_EXPORT VkResult VKAPI vkSetEvent(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600722{
723
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500724 VkResult result = device_dispatch_table(device)->SetEvent(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600725 return result;
726}
727
Mike Stroyanb050c682015-04-17 12:36:38 -0600728VK_LAYER_EXPORT VkResult VKAPI vkResetEvent(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600729{
730
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500731 VkResult result = device_dispatch_table(device)->ResetEvent(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600732 return result;
733}
734
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600735VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, VkQueryPool* pQueryPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600736{
737 char str[1024];
738 if (!pCreateInfo) {
739 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateQueryPool is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600740 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600741 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600742 else if (!vk_validate_vkquerypoolcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600743 sprintf(str, "Parameter pCreateInfo to function CreateQueryPool contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600744 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600745 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500746 VkResult result = device_dispatch_table(device)->CreateQueryPool(device, pCreateInfo, pQueryPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600747 return result;
748}
749
Mike Stroyanb050c682015-04-17 12:36:38 -0600750VK_LAYER_EXPORT VkResult VKAPI vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData, VkQueryResultFlags flags)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600751{
752
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500753 VkResult result = device_dispatch_table(device)->GetQueryPoolResults(device, queryPool, startQuery, queryCount, pDataSize, pData, flags);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600754 return result;
755}
756
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600757VK_LAYER_EXPORT VkResult VKAPI vkGetFormatInfo(VkDevice device, VkFormat format, VkFormatInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600758{
759 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600760 if (!validate_VkFormat(format)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600761 sprintf(str, "Parameter format to function GetFormatInfo has invalid value of %i.", (int)format);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600762 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600763 }
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600764 if (!validate_VkFormatInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600765 sprintf(str, "Parameter infoType to function GetFormatInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600766 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600767 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500768 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, format, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600769 return result;
770}
771
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600772VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600773{
774 char str[1024];
775 if (!pCreateInfo) {
776 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBuffer is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600777 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600778 }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600779 else if (!vk_validate_vkbuffercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600780 sprintf(str, "Parameter pCreateInfo to function CreateBuffer contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600781 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600782 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500783 VkResult result = device_dispatch_table(device)->CreateBuffer(device, pCreateInfo, pBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600784 return result;
785}
786
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600787VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, VkBufferView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600788{
789 char str[1024];
790 if (!pCreateInfo) {
791 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBufferView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600792 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600793 }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600794 else if (!vk_validate_vkbufferviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600795 sprintf(str, "Parameter pCreateInfo to function CreateBufferView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600796 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600797 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500798 VkResult result = device_dispatch_table(device)->CreateBufferView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600799 return result;
800}
801
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600802void PreCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600803{
804 if(pCreateInfo == nullptr)
805 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600806 char const str[] = "vkCreateImage parameter, VkImageCreateInfo* pCreateInfo, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600807 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600808 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600809 return;
810 }
811
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600812 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600813 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600814 char const str[] = "vkCreateImage parameter, VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO "\
815 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600816 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600817 return;
818 }
819
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600820 if (!validate_VkImageType(pCreateInfo->imageType))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600821 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600822 char const str[] = "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600823 "unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600824 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600825 return;
826 }
827
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600828 if (!validate_VkFormat(pCreateInfo->format))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600829 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600830 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600831 "unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600832 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600833 return;
834 }
835
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600836 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600837 size_t size = sizeof(properties);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500838 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->format,
Tony Barbourd1c35722015-04-16 15:59:00 -0600839 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600840 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600841 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600842 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, cannot be "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600843 "validated (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600844 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600845 return;
846 }
847
848 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
849 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600850 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600851 "unsupported format (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600852 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600853 return;
854 }
855
856 // TODO: Can we check device-specific limits?
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600857 if (!vk_validate_vkextent3d(&pCreateInfo->extent))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600858 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600859 char const str[] = "vkCreateImage parameter, VkExtent3D pCreateInfo->extent, is invalid "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600860 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600861 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600862 return;
863 }
864
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600865 if (!validate_VkImageTiling(pCreateInfo->tiling))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600866 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600867 char const str[] = "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600868 "unrecoginized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600869 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600870 return;
871 }
872}
873
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600874void PostCreateImage(VkResult result, VkImage* pImage)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600875{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600876 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600877 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600878 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600879 char const str[] = "vkCreateImage failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600880 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600881 return;
882 }
883
884 if(pImage == nullptr)
885 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600886 char const str[] = "vkCreateImage parameter, VkImage* pImage, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600887 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600888 return;
889 }
890}
891
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600892VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600893{
894 PreCreateImage(device, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500895 VkResult result = device_dispatch_table(device)->CreateImage(device, pCreateInfo, pImage);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600896 PostCreateImage(result, pImage);
897 return result;
898}
899
Mike Stroyanb050c682015-04-17 12:36:38 -0600900VK_LAYER_EXPORT VkResult VKAPI vkGetImageSubresourceInfo(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600901{
902 char str[1024];
903 if (!pSubresource) {
904 sprintf(str, "Struct ptr parameter pSubresource to function GetImageSubresourceInfo is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600905 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600906 } else if (!vk_validate_vkimagesubresource(pSubresource)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600907 sprintf(str, "Parameter pSubresource to function GetImageSubresourceInfo contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600908 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600909 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600910 if (!validate_VkSubresourceInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600911 sprintf(str, "Parameter infoType to function GetImageSubresourceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600912 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600913 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500914 VkResult result = device_dispatch_table(device)->GetImageSubresourceInfo(device, image, pSubresource, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600915 return result;
916}
917
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600918VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, VkImageView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600919{
920 char str[1024];
921 if (!pCreateInfo) {
922 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateImageView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600923 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600924 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600925 else if (!vk_validate_vkimageviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600926 sprintf(str, "Parameter pCreateInfo to function CreateImageView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600927 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600928 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500929 VkResult result = device_dispatch_table(device)->CreateImageView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600930 return result;
931}
932
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600933VK_LAYER_EXPORT VkResult VKAPI vkCreateColorAttachmentView(VkDevice device, const VkColorAttachmentViewCreateInfo* pCreateInfo, VkColorAttachmentView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600934{
935 char str[1024];
936 if (!pCreateInfo) {
937 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateColorAttachmentView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600938 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600939 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600940 else if (!vk_validate_vkcolorattachmentviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600941 sprintf(str, "Parameter pCreateInfo to function CreateColorAttachmentView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600942 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600943 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500944 VkResult result = device_dispatch_table(device)->CreateColorAttachmentView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600945 return result;
946}
947
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600948VK_LAYER_EXPORT VkResult VKAPI vkCreateDepthStencilView(VkDevice device, const VkDepthStencilViewCreateInfo* pCreateInfo, VkDepthStencilView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600949{
950 char str[1024];
951 if (!pCreateInfo) {
952 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDepthStencilView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600953 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600954 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600955 else if (!vk_validate_vkdepthstencilviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600956 sprintf(str, "Parameter pCreateInfo to function CreateDepthStencilView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600957 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600958 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500959 VkResult result = device_dispatch_table(device)->CreateDepthStencilView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600960 return result;
961}
962
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600963VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(VkDevice device, const VkShaderCreateInfo* pCreateInfo, VkShader* pShader)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600964{
965 char str[1024];
966 if (!pCreateInfo) {
967 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateShader is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600968 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600969 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600970 else if (!vk_validate_vkshadercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600971 sprintf(str, "Parameter pCreateInfo to function CreateShader contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600972 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600973 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500974 VkResult result = device_dispatch_table(device)->CreateShader(device, pCreateInfo, pShader);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600975 return result;
976}
977
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600978VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600979{
980 char str[1024];
981 if (!pCreateInfo) {
982 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipeline is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600983 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600984 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600985 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600986 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipeline contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600987 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600988 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500989 VkResult result = device_dispatch_table(device)->CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600990 return result;
991}
992
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600993VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelineDerivative(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600994{
995 char str[1024];
996 if (!pCreateInfo) {
997 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipelineDerivative is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600998 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600999 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001000 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001001 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipelineDerivative contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001002 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001003 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001004 VkResult result = device_dispatch_table(device)->CreateGraphicsPipelineDerivative(device, pCreateInfo, basePipeline, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001005 return result;
1006}
1007
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001008VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipeline(VkDevice device, const VkComputePipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001009{
1010 char str[1024];
1011 if (!pCreateInfo) {
1012 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateComputePipeline is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001013 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001014 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001015 else if (!vk_validate_vkcomputepipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001016 sprintf(str, "Parameter pCreateInfo to function CreateComputePipeline contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001017 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001018 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001019 VkResult result = device_dispatch_table(device)->CreateComputePipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001020 return result;
1021}
1022
Mike Stroyanb050c682015-04-17 12:36:38 -06001023VK_LAYER_EXPORT VkResult VKAPI vkStorePipeline(VkDevice device, VkPipeline pipeline, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001024{
1025
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001026 VkResult result = device_dispatch_table(device)->StorePipeline(device, pipeline, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001027 return result;
1028}
1029
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001030VK_LAYER_EXPORT VkResult VKAPI vkLoadPipeline(VkDevice device, size_t dataSize, const void* pData, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001031{
1032
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001033 VkResult result = device_dispatch_table(device)->LoadPipeline(device, dataSize, pData, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001034 return result;
1035}
1036
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001037VK_LAYER_EXPORT VkResult VKAPI vkLoadPipelineDerivative(VkDevice device, size_t dataSize, const void* pData, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001038{
1039
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001040 VkResult result = device_dispatch_table(device)->LoadPipelineDerivative(device, dataSize, pData, basePipeline, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001041 return result;
1042}
1043
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001044VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, VkSampler* pSampler)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001045{
1046 char str[1024];
1047 if (!pCreateInfo) {
1048 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSampler is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001049 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001050 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001051 else if (!vk_validate_vksamplercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001052 sprintf(str, "Parameter pCreateInfo to function CreateSampler contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001053 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001054 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001055 VkResult result = device_dispatch_table(device)->CreateSampler(device, pCreateInfo, pSampler);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001056 return result;
1057}
1058
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001059VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayout* pSetLayout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001060{
1061 char str[1024];
1062 if (!pCreateInfo) {
1063 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorSetLayout is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001064 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001065 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001066 else if (!vk_validate_vkdescriptorsetlayoutcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001067 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorSetLayout contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001068 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001069 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001070 VkResult result = device_dispatch_table(device)->CreateDescriptorSetLayout(device, pCreateInfo, pSetLayout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001071 return result;
1072}
1073
Mark Lobodzinski0fadf5f2015-04-17 14:11:39 -05001074VK_LAYER_EXPORT VkResult VKAPI vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, VkPipelineLayout* pPipelineLayout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001075{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001076 VkResult result = device_dispatch_table(device)->CreatePipelineLayout(device, pCreateInfo, pPipelineLayout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001077 return result;
1078}
1079
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001080VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorPool(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001081{
1082 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001083 if (!validate_VkDescriptorPoolUsage(poolUsage)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001084 sprintf(str, "Parameter poolUsage to function CreateDescriptorPool has invalid value of %i.", (int)poolUsage);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001085 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001086 }
1087 if (!pCreateInfo) {
1088 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorPool is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001089 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001090 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001091 else if (!vk_validate_vkdescriptorpoolcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001092 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorPool contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001093 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001094 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001095 VkResult result = device_dispatch_table(device)->CreateDescriptorPool(device, poolUsage, maxSets, pCreateInfo, pDescriptorPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001096 return result;
1097}
1098
Mike Stroyanb050c682015-04-17 12:36:38 -06001099VK_LAYER_EXPORT VkResult VKAPI vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001100{
1101
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001102 VkResult result = device_dispatch_table(device)->ResetDescriptorPool(device, descriptorPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001103 return result;
1104}
1105
Mike Stroyanb050c682015-04-17 12:36:38 -06001106VK_LAYER_EXPORT VkResult VKAPI vkAllocDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorSetUsage setUsage, uint32_t count, const VkDescriptorSetLayout* pSetLayouts, VkDescriptorSet* pDescriptorSets, uint32_t* pCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001107{
1108 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001109 if (!validate_VkDescriptorSetUsage(setUsage)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001110 sprintf(str, "Parameter setUsage to function AllocDescriptorSets has invalid value of %i.", (int)setUsage);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001111 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001112 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001113 VkResult result = device_dispatch_table(device)->AllocDescriptorSets(device, descriptorPool, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001114 return result;
1115}
1116
Mike Stroyanb050c682015-04-17 12:36:38 -06001117VK_LAYER_EXPORT void VKAPI vkClearDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, const VkDescriptorSet* pDescriptorSets)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001118{
1119
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001120 device_dispatch_table(device)->ClearDescriptorSets(device, descriptorPool, count, pDescriptorSets);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001121}
1122
Chia-I Wu9d00ed72015-05-25 16:27:55 +08001123VK_LAYER_EXPORT VkResult VKAPI vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001124{
1125
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001126 return device_dispatch_table(device)->UpdateDescriptorSets(device, writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001127}
1128
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001129VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(VkDevice device, const VkDynamicVpStateCreateInfo* pCreateInfo, VkDynamicVpState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001130{
1131 char str[1024];
1132 if (!pCreateInfo) {
1133 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicViewportState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001134 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001135 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001136 else if (!vk_validate_vkdynamicvpstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001137 sprintf(str, "Parameter pCreateInfo to function CreateDynamicViewportState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001138 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001139 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001140 VkResult result = device_dispatch_table(device)->CreateDynamicViewportState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001141 return result;
1142}
1143
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001144VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterState(VkDevice device, const VkDynamicRsStateCreateInfo* pCreateInfo, VkDynamicRsState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001145{
1146 char str[1024];
1147 if (!pCreateInfo) {
1148 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicRasterState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001149 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001150 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001151 else if (!vk_validate_vkdynamicrsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001152 sprintf(str, "Parameter pCreateInfo to function CreateDynamicRasterState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001153 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001154 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001155 VkResult result = device_dispatch_table(device)->CreateDynamicRasterState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001156 return result;
1157}
1158
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001159VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState(VkDevice device, const VkDynamicCbStateCreateInfo* pCreateInfo, VkDynamicCbState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001160{
1161 char str[1024];
1162 if (!pCreateInfo) {
1163 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicColorBlendState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001164 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001165 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001166 else if (!vk_validate_vkdynamiccbstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001167 sprintf(str, "Parameter pCreateInfo to function CreateDynamicColorBlendState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001168 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001169 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001170 VkResult result = device_dispatch_table(device)->CreateDynamicColorBlendState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001171 return result;
1172}
1173
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001174VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState(VkDevice device, const VkDynamicDsStateCreateInfo* pCreateInfo, VkDynamicDsState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001175{
1176 char str[1024];
1177 if (!pCreateInfo) {
1178 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicDepthStencilState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001179 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001180 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001181 else if (!vk_validate_vkdynamicdsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001182 sprintf(str, "Parameter pCreateInfo to function CreateDynamicDepthStencilState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001183 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001184 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001185 VkResult result = device_dispatch_table(device)->CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001186 return result;
1187}
1188
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001189void PreCreateCommandBuffer(VkDevice device, const VkCmdBufferCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001190{
1191 if(device == nullptr)
1192 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001193 char const str[] = "vkCreateCommandBuffer parameter, VkDevice device, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001194 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001195 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001196 return;
1197 }
1198
1199 if(pCreateInfo == nullptr)
1200 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001201 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBufferCreateInfo* pCreateInfo, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001202 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001203 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001204 return;
1205 }
1206
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001207 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001208 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001209 char const str[] = "vkCreateCommandBuffer parameter, VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO "\
1210 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001211 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001212 return;
1213 }
1214}
1215
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001216void PostCreateCommandBuffer(VkResult result, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001217{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001218 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001219 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001220 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001221 char const str[] = "vkCreateCommandBuffer failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001222 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001223 return;
1224 }
1225
1226 if(pCmdBuffer == nullptr)
1227 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001228 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBuffer* pCmdBuffer, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001229 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001230 return;
1231 }
1232}
1233
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001234VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(VkDevice device,
1235 const VkCmdBufferCreateInfo* pCreateInfo, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001236{
1237 PreCreateCommandBuffer(device, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001238 VkResult result = device_dispatch_table(device)->CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001239 PostCreateCommandBuffer(result, pCmdBuffer);
1240 return result;
1241}
1242
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001243VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001244{
1245 char str[1024];
1246 if (!pBeginInfo) {
1247 sprintf(str, "Struct ptr parameter pBeginInfo to function BeginCommandBuffer is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001248 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001249 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001250 else if (!vk_validate_vkcmdbufferbegininfo(pBeginInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001251 sprintf(str, "Parameter pBeginInfo to function BeginCommandBuffer contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001252 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001253 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001254 VkResult result = device_dispatch_table(cmdBuffer)->BeginCommandBuffer(cmdBuffer, pBeginInfo);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001255 return result;
1256}
1257
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001258VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001259{
1260
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001261 VkResult result = device_dispatch_table(cmdBuffer)->EndCommandBuffer(cmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001262 return result;
1263}
1264
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001265VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001266{
1267
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001268 VkResult result = device_dispatch_table(cmdBuffer)->ResetCommandBuffer(cmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001269 return result;
1270}
1271
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001272VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001273{
1274 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001275 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001276 sprintf(str, "Parameter pipelineBindPoint to function CmdBindPipeline has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001277 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001278 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001279 device_dispatch_table(cmdBuffer)->CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001280}
1281
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001282VK_LAYER_EXPORT void VKAPI vkCmdBindDynamicStateObject(VkCmdBuffer cmdBuffer, VkStateBindPoint stateBindPoint, VkDynamicStateObject state)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001283{
1284 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001285 if (!validate_VkStateBindPoint(stateBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001286 sprintf(str, "Parameter stateBindPoint to function CmdBindDynamicStateObject has invalid value of %i.", (int)stateBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001287 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001288 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001289 device_dispatch_table(cmdBuffer)->CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001290}
1291
Cody Northropd4c1a502015-04-16 13:41:56 -06001292VK_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 Hayesa8b1a8d2015-04-06 13:46:11 -06001293{
1294 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001295 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001296 sprintf(str, "Parameter pipelineBindPoint to function CmdBindDescriptorSets has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001297 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001298 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001299 device_dispatch_table(cmdBuffer)->CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001300}
1301
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06001302VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
1303 VkCmdBuffer cmdBuffer,
1304 uint32_t startBinding,
1305 uint32_t bindingCount,
1306 const VkBuffer* pBuffers,
Tony Barbourd1c35722015-04-16 15:59:00 -06001307 const VkDeviceSize* pOffsets)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001308{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001309 device_dispatch_table(cmdBuffer)->CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001310}
1311
Tony Barbourd1c35722015-04-16 15:59:00 -06001312VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001313{
1314 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001315 if (!validate_VkIndexType(indexType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001316 sprintf(str, "Parameter indexType to function CmdBindIndexBuffer has invalid value of %i.", (int)indexType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001317 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001318 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001319 device_dispatch_table(cmdBuffer)->CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001320}
1321
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001322VK_LAYER_EXPORT void VKAPI vkCmdDraw(VkCmdBuffer cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001323{
1324
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001325 device_dispatch_table(cmdBuffer)->CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001326}
1327
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001328VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexed(VkCmdBuffer cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001329{
1330
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001331 device_dispatch_table(cmdBuffer)->CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001332}
1333
Tony Barbourd1c35722015-04-16 15:59:00 -06001334VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001335{
1336
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001337 device_dispatch_table(cmdBuffer)->CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001338}
1339
Tony Barbourd1c35722015-04-16 15:59:00 -06001340VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001341{
1342
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001343 device_dispatch_table(cmdBuffer)->CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001344}
1345
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001346VK_LAYER_EXPORT void VKAPI vkCmdDispatch(VkCmdBuffer cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001347{
1348
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001349 device_dispatch_table(cmdBuffer)->CmdDispatch(cmdBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001350}
1351
Tony Barbourd1c35722015-04-16 15:59:00 -06001352VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001353{
1354
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001355 device_dispatch_table(cmdBuffer)->CmdDispatchIndirect(cmdBuffer, buffer, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001356}
1357
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001358VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkBuffer destBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001359{
1360 char str[1024];
1361 uint32_t i;
1362 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001363 if (!vk_validate_vkbuffercopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001364 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBuffer contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001365 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001366 }
1367 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001368 device_dispatch_table(cmdBuffer)->CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001369}
1370
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001371VK_LAYER_EXPORT void VKAPI vkCmdCopyImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001372{
1373 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001374 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001375 sprintf(str, "Parameter srcImageLayout to function CmdCopyImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001376 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001377 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001378 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001379 sprintf(str, "Parameter destImageLayout to function CmdCopyImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001380 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001381 }
1382 uint32_t i;
1383 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001384 if (!vk_validate_vkimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001385 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001386 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001387 }
1388 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001389 device_dispatch_table(cmdBuffer)->CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001390}
1391
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05001392VK_LAYER_EXPORT void VKAPI vkCmdBlitImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkTexFilter filter)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001393{
1394 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001395 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001396 sprintf(str, "Parameter srcImageLayout to function CmdBlitImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001397 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001398 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001399 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001400 sprintf(str, "Parameter destImageLayout to function CmdBlitImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001401 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001402 }
1403 uint32_t i;
1404 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001405 if (!vk_validate_vkimageblit(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001406 sprintf(str, "Parameter pRegions[%i] to function CmdBlitImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001407 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001408 }
1409 }
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05001410 //TODO: Add additional check for limitation from header rev 96.
1411 // VK_TEX_FILTER_NEAREST if the format that srcImage was created with is an integer-based format.
1412
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001413 device_dispatch_table(cmdBuffer)->CmdBlitImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001414}
1415
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001416VK_LAYER_EXPORT void VKAPI vkCmdCopyBufferToImage(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001417{
1418 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001419 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001420 sprintf(str, "Parameter destImageLayout to function CmdCopyBufferToImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001421 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001422 }
1423 uint32_t i;
1424 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001425 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001426 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBufferToImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001427 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001428 }
1429 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001430 device_dispatch_table(cmdBuffer)->CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001431}
1432
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001433VK_LAYER_EXPORT void VKAPI vkCmdCopyImageToBuffer(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer destBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001434{
1435 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001436 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001437 sprintf(str, "Parameter srcImageLayout to function CmdCopyImageToBuffer has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001438 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001439 }
1440 uint32_t i;
1441 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001442 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001443 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImageToBuffer contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001444 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001445 }
1446 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001447 device_dispatch_table(cmdBuffer)->CmdCopyImageToBuffer(cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001448}
1449
Tony Barbourd1c35722015-04-16 15:59:00 -06001450VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001451{
1452
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001453 device_dispatch_table(cmdBuffer)->CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001454}
1455
Tony Barbourd1c35722015-04-16 15:59:00 -06001456VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001457{
1458
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001459 device_dispatch_table(cmdBuffer)->CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001460}
1461
Courtney Goeltzenleuchterd7a5cff2015-04-23 17:49:22 -06001462VK_LAYER_EXPORT void VKAPI vkCmdClearColorImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColor* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001463{
1464 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001465 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001466 sprintf(str, "Parameter imageLayout to function CmdClearColorImage has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001467 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001468 }
1469 uint32_t i;
1470 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001471 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001472 sprintf(str, "Parameter pRanges[%i] to function CmdClearColorImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001473 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001474 }
1475 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001476 device_dispatch_table(cmdBuffer)->CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001477}
1478
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001479VK_LAYER_EXPORT void VKAPI vkCmdClearDepthStencil(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001480{
1481 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001482 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001483 sprintf(str, "Parameter imageLayout to function CmdClearDepthStencil has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001484 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001485 }
1486 uint32_t i;
1487 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001488 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001489 sprintf(str, "Parameter pRanges[%i] to function CmdClearDepthStencil contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001490 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001491 }
1492 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001493 device_dispatch_table(cmdBuffer)->CmdClearDepthStencil(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001494}
1495
Tony Barbour6865d4a2015-04-13 15:02:52 -06001496VK_LAYER_EXPORT void VKAPI vkCmdResolveImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageResolve* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001497{
1498 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001499 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001500 sprintf(str, "Parameter srcImageLayout to function CmdResolveImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001501 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001502 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001503 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001504 sprintf(str, "Parameter destImageLayout to function CmdResolveImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001505 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001506 }
1507 uint32_t i;
Tony Barbour6865d4a2015-04-13 15:02:52 -06001508 for (i = 0; i < regionCount; i++) {
1509 if (!vk_validate_vkimageresolve(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001510 sprintf(str, "Parameter pRects[%i] to function CmdResolveImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001511 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001512 }
1513 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001514 device_dispatch_table(cmdBuffer)->CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001515}
1516
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001517VK_LAYER_EXPORT void VKAPI vkCmdSetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001518{
1519 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001520 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001521 sprintf(str, "Parameter pipeEvent to function CmdSetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001522 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001523 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001524 device_dispatch_table(cmdBuffer)->CmdSetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001525}
1526
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001527VK_LAYER_EXPORT void VKAPI vkCmdResetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001528{
1529 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001530 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001531 sprintf(str, "Parameter pipeEvent to function CmdResetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001532 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001533 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001534 device_dispatch_table(cmdBuffer)->CmdResetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001535}
1536
Tony Barbourd1c35722015-04-16 15:59:00 -06001537VK_LAYER_EXPORT void VKAPI vkCmdWaitEvents(VkCmdBuffer cmdBuffer, VkWaitEvent waitEvent, uint32_t eventCount, const VkEvent* pEvents, uint32_t memBarrierCount, const void** ppMemBarriers)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001538{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001539 device_dispatch_table(cmdBuffer)->CmdWaitEvents(cmdBuffer, waitEvent, eventCount, pEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001540}
1541
Tony Barbourd1c35722015-04-16 15:59:00 -06001542VK_LAYER_EXPORT void VKAPI vkCmdPipelineBarrier(VkCmdBuffer cmdBuffer, VkWaitEvent waitEvent, uint32_t pipeEventCount, const VkPipeEvent* pPipeEvents, uint32_t memBarrierCount, const void** ppMemBarriers)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001543{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001544 device_dispatch_table(cmdBuffer)->CmdPipelineBarrier(cmdBuffer, waitEvent, pipeEventCount, pPipeEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001545}
1546
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001547VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001548{
1549
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001550 device_dispatch_table(cmdBuffer)->CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001551}
1552
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001553VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001554{
1555
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001556 device_dispatch_table(cmdBuffer)->CmdEndQuery(cmdBuffer, queryPool, slot);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001557}
1558
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001559VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001560{
1561
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001562 device_dispatch_table(cmdBuffer)->CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001563}
1564
Tony Barbourd1c35722015-04-16 15:59:00 -06001565VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkTimestampType timestampType, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001566{
1567 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001568 if (!validate_VkTimestampType(timestampType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001569 sprintf(str, "Parameter timestampType to function CmdWriteTimestamp has invalid value of %i.", (int)timestampType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001570 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001571 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001572 device_dispatch_table(cmdBuffer)->CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001573}
1574
Jeremy Hayesad367152015-04-17 10:36:53 -06001575VK_LAYER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(
1576 VkCmdBuffer cmdBuffer,
1577 VkQueryPool queryPool,
1578 uint32_t startQuery,
1579 uint32_t queryCount,
1580 VkBuffer destBuffer,
1581 VkDeviceSize destOffset,
1582 VkDeviceSize destStride,
1583 VkQueryResultFlags flags)
1584{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001585 device_dispatch_table(cmdBuffer)->CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, destStride, flags);
Jeremy Hayesad367152015-04-17 10:36:53 -06001586}
1587
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001588VK_LAYER_EXPORT void VKAPI vkCmdInitAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, const uint32_t* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001589{
1590 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001591 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001592 sprintf(str, "Parameter pipelineBindPoint to function CmdInitAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001593 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001594 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001595 device_dispatch_table(cmdBuffer)->CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001596}
1597
Tony Barbourd1c35722015-04-16 15:59:00 -06001598VK_LAYER_EXPORT void VKAPI vkCmdLoadAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, VkBuffer srcBuffer, VkDeviceSize srcOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001599{
1600 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001601 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001602 sprintf(str, "Parameter pipelineBindPoint to function CmdLoadAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001603 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001604 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001605 device_dispatch_table(cmdBuffer)->CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001606}
1607
Tony Barbourd1c35722015-04-16 15:59:00 -06001608VK_LAYER_EXPORT void VKAPI vkCmdSaveAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001609{
1610 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001611 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001612 sprintf(str, "Parameter pipelineBindPoint to function CmdSaveAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001613 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001614 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001615 device_dispatch_table(cmdBuffer)->CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001616}
1617
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001618VK_LAYER_EXPORT VkResult VKAPI vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, VkFramebuffer* pFramebuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001619{
1620 char str[1024];
1621 if (!pCreateInfo) {
1622 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFramebuffer is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001623 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001624 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001625 else if (!vk_validate_vkframebuffercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001626 sprintf(str, "Parameter pCreateInfo to function CreateFramebuffer contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001627 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001628 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001629 VkResult result = device_dispatch_table(device)->CreateFramebuffer(device, pCreateInfo, pFramebuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001630 return result;
1631}
1632
1633
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001634void PreCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001635{
1636 if(pCreateInfo == nullptr)
1637 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001638 char const str[] = "vkCreateRenderPass parameter, VkRenderPassCreateInfo* pCreateInfo, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001639 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001640 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001641 return;
1642 }
1643
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001644 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001645 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001646 char const str[] = "vkCreateRenderPass parameter, VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO "\
1647 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001648 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001649 return;
1650 }
1651
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001652 if(!vk_validate_vkrect(&pCreateInfo->renderArea))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001653 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001654 char const str[] = "vkCreateRenderPass parameter, VkRect pCreateInfo->renderArea, is invalid "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001655 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001656 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001657 return;
1658 }
1659
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001660 if(!vk_validate_vkextent2d(&pCreateInfo->extent))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001661 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001662 char const str[] = "vkCreateRenderPass parameter, VkExtent2D pCreateInfo->extent, is invalid "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001663 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001664 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001665 return;
1666 }
1667
1668 if(pCreateInfo->pColorFormats == nullptr)
1669 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001670 char const str[] = "vkCreateRenderPass parameter, VkFormat* pCreateInfo->pColorFormats, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001671 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001672 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001673 return;
1674 }
1675
1676 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1677 {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001678 if(!validate_VkFormat(pCreateInfo->pColorFormats[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001679 {
1680 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001681 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001682 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001683 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001684 continue;
1685 }
1686
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001687 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001688 size_t size = sizeof(properties);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001689 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->pColorFormats[i],
Tony Barbourd1c35722015-04-16 15:59:00 -06001690 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001691 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001692 {
1693 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001694 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001695 "], cannot be validated (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001696 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001697 continue;
1698 }
1699
1700 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1701 {
1702 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001703 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001704 "], contains unsupported format (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001705 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001706 continue;
1707 }
1708
1709 }
1710
1711 if(pCreateInfo->pColorLayouts == nullptr)
1712 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001713 char const str[] = "vkCreateRenderPass parameter, VkImageLayout* pCreateInfo->pColorLayouts, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001714 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001715 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001716 return;
1717 }
1718
1719 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1720 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001721 if(!validate_VkImageLayout(pCreateInfo->pColorLayouts[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001722 {
1723 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001724 ss << "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pColorLayouts[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001725 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001726 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001727 continue;
1728 }
1729 }
1730
1731 if(pCreateInfo->pColorLoadOps == nullptr)
1732 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001733 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp* pCreateInfo->pColorLoadOps, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001734 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001735 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001736 return;
1737 }
1738
1739 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1740 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001741 if(!validate_VkAttachmentLoadOp(pCreateInfo->pColorLoadOps[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001742 {
1743 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001744 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pColorLoadOps[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001745 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001746 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001747 continue;
1748 }
1749 }
1750
1751 if(pCreateInfo->pColorStoreOps == nullptr)
1752 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001753 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp* pCreateInfo->pColorStoreOps, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001754 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001755 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001756 return;
1757 }
1758
1759 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1760 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001761 if(!validate_VkAttachmentStoreOp(pCreateInfo->pColorStoreOps[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001762 {
1763 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001764 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pColorStoreOps[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001765 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001766 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001767 continue;
1768 }
1769 }
1770
1771 if(pCreateInfo->pColorLoadClearValues == nullptr)
1772 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001773 char const str[] = "vkCreateRenderPass parameter, VkClearColor* pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001774 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001775 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001776 return;
1777 }
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001778
1779 if(pCreateInfo->pColorStoreOps == nullptr)
1780 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001781 char const str[] = "vkCreateRenderPass parameter, VK_ATTACHMENT_STORE_OP* pCreateInfo->pColorStoreOps, "\
Jeremy Hayes090f0ce2015-04-07 13:38:03 -06001782 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001783 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001784 return;
1785 }
1786
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001787 if(pCreateInfo->pColorLoadClearValues == nullptr)
1788 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001789 char const str[] = "vkCreateRenderPass parameter, VK_CLEAR_COLOR* pCreateInfo->"\
Jeremy Hayes090f0ce2015-04-07 13:38:03 -06001790 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001791 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001792 return;
1793 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001794
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001795 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1796 {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001797 if(!vk_validate_vkclearcolor(&(pCreateInfo->pColorLoadClearValues[i])))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001798 {
1799 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001800 ss << "vkCreateRenderPass parameter, VkClearColor pCreateInfo->pColorLoadClearValues[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001801 "], is invalid (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001802 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001803 continue;
1804 }
1805 }
1806
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001807 if(!validate_VkFormat(pCreateInfo->depthStencilFormat))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001808 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001809 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001810 "depthStencilFormat, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001811 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001812 return;
1813 }
1814
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001815 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001816 size_t size = sizeof(properties);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001817 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->depthStencilFormat,
Tony Barbourd1c35722015-04-16 15:59:00 -06001818 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001819 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001820 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001821 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001822 "depthStencilFormat, cannot be validated (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001823 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001824 return;
1825 }
1826
1827 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1828 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001829 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001830 "depthStencilFormat, contains unsupported format (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001831 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001832 return;
1833 }
1834
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001835 if(!validate_VkImageLayout(pCreateInfo->depthStencilLayout))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001836 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001837 char const str[] = "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001838 "depthStencilLayout, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001839 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001840 return;
1841 }
1842
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001843 if(!validate_VkAttachmentLoadOp(pCreateInfo->depthLoadOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001844 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001845 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001846 "depthLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001847 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001848 return;
1849 }
1850
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001851 if(!validate_VkAttachmentStoreOp(pCreateInfo->depthStoreOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001852 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001853 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001854 "depthStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001855 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001856 return;
1857 }
1858
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001859 if(!validate_VkAttachmentLoadOp(pCreateInfo->stencilLoadOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001860 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001861 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001862 "stencilLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001863 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001864 return;
1865 }
1866
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001867 if(!validate_VkAttachmentStoreOp(pCreateInfo->stencilStoreOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001868 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001869 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001870 "stencilStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001871 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001872 return;
1873 }
1874}
1875
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001876void PostCreateRenderPass(VkResult result, VkRenderPass* pRenderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001877{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001878 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001879 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001880 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001881 char const str[] = "vkCreateRenderPass failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001882 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001883 return;
1884 }
1885
1886 if(pRenderPass == nullptr)
1887 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001888 char const str[] = "vkCreateRenderPass parameter, VkRenderPass* pRenderPass, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001889 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001890 return;
1891 }
1892}
1893
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001894VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, VkRenderPass* pRenderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001895{
1896 PreCreateRenderPass(device, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001897 VkResult result = device_dispatch_table(device)->CreateRenderPass(device, pCreateInfo, pRenderPass);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001898 PostCreateRenderPass(result, pRenderPass);
1899 return result;
1900}
1901
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001902VK_LAYER_EXPORT void VKAPI vkCmdBeginRenderPass(VkCmdBuffer cmdBuffer, const VkRenderPassBegin* pRenderPassBegin)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001903{
1904 char str[1024];
1905 if (!pRenderPassBegin) {
1906 sprintf(str, "Struct ptr parameter pRenderPassBegin to function CmdBeginRenderPass is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001907 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001908 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001909 else if (!vk_validate_vkrenderpassbegin(pRenderPassBegin)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001910 sprintf(str, "Parameter pRenderPassBegin to function CmdBeginRenderPass contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001911 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001912 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001913 device_dispatch_table(cmdBuffer)->CmdBeginRenderPass(cmdBuffer, pRenderPassBegin);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001914}
1915
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001916VK_LAYER_EXPORT void VKAPI vkCmdEndRenderPass(VkCmdBuffer cmdBuffer, VkRenderPass renderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001917{
1918
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001919 device_dispatch_table(cmdBuffer)->CmdEndRenderPass(cmdBuffer, renderPass);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001920}
1921
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001922VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback(
1923 VkInstance instance,
1924 VkFlags msgFlags,
1925 const PFN_vkDbgMsgCallback pfnMsgCallback,
1926 void* pUserData,
1927 VkDbgMsgCallback* pMsgCallback)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001928{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001929 VkLayerInstanceDispatchTable *pDisp = *(VkLayerInstanceDispatchTable **) instance;
1930 VkLayerInstanceDispatchTable *pTable = tableInstanceMap[pDisp];
1931 return layer_create_msg_callback(instance, pTable, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001932}
1933
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001934VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerBegin(VkCmdBuffer cmdBuffer, const char* pMarker)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001935{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001936 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) cmdBuffer;
1937 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001938 if (!pTable->ext_enabled) {
1939 char const str[] = "Attempt to use CmdDbgMarkerBegin but extension disabled!";
1940 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1941 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001942 pTable->CmdDbgMarkerBegin(cmdBuffer, pMarker);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001943}
1944
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001945VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerEnd(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001946{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001947 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) cmdBuffer;
1948 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001949 if (!pTable->ext_enabled) {
1950 char const str[] = "Attempt to use CmdDbgMarkerEnd but extension disabled!";
1951 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1952 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001953 pTable->CmdDbgMarkerEnd(cmdBuffer);
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001954}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001955
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001956VkResult VKAPI vkDbgSetObjectTag(VkDevice device, VkObjectType objType, VkObject object, size_t tagSize, const void* pTag)
1957{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001958 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) device;
1959 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001960 if (!pTable->ext_enabled) {
1961 char const str[] = "Attempt to use DbgSetObjectTag but extension disabled!";
1962 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1963 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001964 pTable->DbgSetObjectTag(device, objType, object, tagSize, pTag);
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001965}
1966
1967VkResult VKAPI vkDbgSetObjectName(VkDevice device, VkObjectType objType, VkObject object, size_t nameSize, const char* pName)
1968{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001969 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) device;
1970 VkLayerDebugMarkerDispatchTable *pTable = tableDebugMarkerMap[pDisp];
1971
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001972 if (!pTable->ext_enabled) {
1973 char const str[] = "Attempt to use DbgSetObjectName but extension disabled!";
1974 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1975 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001976 pTable->DbgSetObjectName(device, objType, object, nameSize, pName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001977}
1978
Chia-I Wuf8693382015-04-16 22:02:10 +08001979VK_LAYER_EXPORT VkResult VKAPI vkGetDisplayInfoWSI(VkDisplayWSI display, VkDisplayInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001980{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001981 VkResult result = instance_dispatch_table(display)->GetDisplayInfoWSI(display, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001982 return result;
1983}
1984
Chia-I Wuf8693382015-04-16 22:02:10 +08001985VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI(VkDevice device, const VkSwapChainCreateInfoWSI* pCreateInfo, VkSwapChainWSI* pSwapChain)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001986{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001987 VkResult result = device_dispatch_table(device)->CreateSwapChainWSI(device, pCreateInfo, pSwapChain);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001988 return result;
1989}
1990
Chia-I Wuf8693382015-04-16 22:02:10 +08001991VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapChainWSI(VkSwapChainWSI swapChain)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001992{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001993 VkResult result = device_dispatch_table(swapChain)->DestroySwapChainWSI(swapChain);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001994 return result;
1995}
1996
Chia-I Wuf8693382015-04-16 22:02:10 +08001997VK_LAYER_EXPORT VkResult VKAPI vkGetSwapChainInfoWSI(VkSwapChainWSI swapChain, VkSwapChainInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001998{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001999 VkResult result = device_dispatch_table(swapChain)->GetSwapChainInfoWSI(swapChain, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002000 return result;
2001}
2002
Chia-I Wuf8693382015-04-16 22:02:10 +08002003VK_LAYER_EXPORT VkResult VKAPI vkQueuePresentWSI(VkQueue queue, const VkPresentInfoWSI* pPresentInfo)
2004{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002005 VkResult result = device_dispatch_table(queue)->QueuePresentWSI(queue, pPresentInfo);
Chia-I Wuf8693382015-04-16 22:02:10 +08002006 return result;
2007}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002008
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002009static inline void* layer_intercept_proc(const char *name)
2010{
2011 if (!name || name[0] != 'v' || name[1] != 'k')
2012 return NULL;
2013
2014 name += 2;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002015 if (!strcmp(name, "DestroyDevice"))
2016 return (void*) vkDestroyDevice;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002017 if (!strcmp(name, "GetDeviceQueue"))
2018 return (void*) vkGetDeviceQueue;
2019 if (!strcmp(name, "QueueSubmit"))
2020 return (void*) vkQueueSubmit;
2021 if (!strcmp(name, "QueueWaitIdle"))
2022 return (void*) vkQueueWaitIdle;
2023 if (!strcmp(name, "DeviceWaitIdle"))
2024 return (void*) vkDeviceWaitIdle;
2025 if (!strcmp(name, "AllocMemory"))
2026 return (void*) vkAllocMemory;
2027 if (!strcmp(name, "FreeMemory"))
2028 return (void*) vkFreeMemory;
2029 if (!strcmp(name, "SetMemoryPriority"))
2030 return (void*) vkSetMemoryPriority;
2031 if (!strcmp(name, "MapMemory"))
2032 return (void*) vkMapMemory;
2033 if (!strcmp(name, "UnmapMemory"))
2034 return (void*) vkUnmapMemory;
2035 if (!strcmp(name, "FlushMappedMemoryRanges"))
2036 return (void*) vkFlushMappedMemoryRanges;
2037 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
2038 return (void*) vkInvalidateMappedMemoryRanges;
2039 if (!strcmp(name, "PinSystemMemory"))
2040 return (void*) vkPinSystemMemory;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002041 if (!strcmp(name, "OpenSharedMemory"))
2042 return (void*) vkOpenSharedMemory;
2043 if (!strcmp(name, "OpenSharedSemaphore"))
2044 return (void*) vkOpenSharedSemaphore;
2045 if (!strcmp(name, "OpenPeerMemory"))
2046 return (void*) vkOpenPeerMemory;
2047 if (!strcmp(name, "OpenPeerImage"))
2048 return (void*) vkOpenPeerImage;
2049 if (!strcmp(name, "DestroyObject"))
2050 return (void*) vkDestroyObject;
2051 if (!strcmp(name, "GetObjectInfo"))
2052 return (void*) vkGetObjectInfo;
2053 if (!strcmp(name, "CreateFence"))
2054 return (void*) vkCreateFence;
2055 if (!strcmp(name, "ResetFences"))
2056 return (void*) vkResetFences;
2057 if (!strcmp(name, "GetFenceStatus"))
2058 return (void*) vkGetFenceStatus;
2059 if (!strcmp(name, "WaitForFences"))
2060 return (void*) vkWaitForFences;
2061 if (!strcmp(name, "CreateSemaphore"))
2062 return (void*) vkCreateSemaphore;
2063 if (!strcmp(name, "QueueSignalSemaphore"))
2064 return (void*) vkQueueSignalSemaphore;
2065 if (!strcmp(name, "QueueWaitSemaphore"))
2066 return (void*) vkQueueWaitSemaphore;
2067 if (!strcmp(name, "CreateEvent"))
2068 return (void*) vkCreateEvent;
2069 if (!strcmp(name, "GetEventStatus"))
2070 return (void*) vkGetEventStatus;
2071 if (!strcmp(name, "SetEvent"))
2072 return (void*) vkSetEvent;
2073 if (!strcmp(name, "ResetEvent"))
2074 return (void*) vkResetEvent;
2075 if (!strcmp(name, "CreateQueryPool"))
2076 return (void*) vkCreateQueryPool;
2077 if (!strcmp(name, "GetQueryPoolResults"))
2078 return (void*) vkGetQueryPoolResults;
2079 if (!strcmp(name, "GetFormatInfo"))
2080 return (void*) vkGetFormatInfo;
2081 if (!strcmp(name, "CreateBuffer"))
2082 return (void*) vkCreateBuffer;
2083 if (!strcmp(name, "CreateBufferView"))
2084 return (void*) vkCreateBufferView;
2085 if (!strcmp(name, "CreateImage"))
2086 return (void*) vkCreateImage;
2087 if (!strcmp(name, "GetImageSubresourceInfo"))
2088 return (void*) vkGetImageSubresourceInfo;
2089 if (!strcmp(name, "CreateImageView"))
2090 return (void*) vkCreateImageView;
2091 if (!strcmp(name, "CreateColorAttachmentView"))
2092 return (void*) vkCreateColorAttachmentView;
2093 if (!strcmp(name, "CreateDepthStencilView"))
2094 return (void*) vkCreateDepthStencilView;
2095 if (!strcmp(name, "CreateShader"))
2096 return (void*) vkCreateShader;
2097 if (!strcmp(name, "CreateGraphicsPipeline"))
2098 return (void*) vkCreateGraphicsPipeline;
2099 if (!strcmp(name, "CreateGraphicsPipelineDerivative"))
2100 return (void*) vkCreateGraphicsPipelineDerivative;
2101 if (!strcmp(name, "CreateComputePipeline"))
2102 return (void*) vkCreateComputePipeline;
2103 if (!strcmp(name, "StorePipeline"))
2104 return (void*) vkStorePipeline;
2105 if (!strcmp(name, "LoadPipeline"))
2106 return (void*) vkLoadPipeline;
2107 if (!strcmp(name, "LoadPipelineDerivative"))
2108 return (void*) vkLoadPipelineDerivative;
2109 if (!strcmp(name, "CreatePipelineLayout"))
2110 return (void*) vkCreatePipelineLayout;
2111 if (!strcmp(name, "CreateSampler"))
2112 return (void*) vkCreateSampler;
2113 if (!strcmp(name, "CreateDescriptorSetLayout"))
2114 return (void*) vkCreateDescriptorSetLayout;
2115 if (!strcmp(name, "CreateDescriptorPool"))
2116 return (void*) vkCreateDescriptorPool;
2117 if (!strcmp(name, "ResetDescriptorPool"))
2118 return (void*) vkResetDescriptorPool;
2119 if (!strcmp(name, "AllocDescriptorSets"))
2120 return (void*) vkAllocDescriptorSets;
2121 if (!strcmp(name, "ClearDescriptorSets"))
2122 return (void*) vkClearDescriptorSets;
2123 if (!strcmp(name, "CreateDynamicViewportState"))
2124 return (void*) vkCreateDynamicViewportState;
2125 if (!strcmp(name, "CreateDynamicRasterState"))
2126 return (void*) vkCreateDynamicRasterState;
2127 if (!strcmp(name, "CreateDynamicColorBlendState"))
2128 return (void*) vkCreateDynamicColorBlendState;
2129 if (!strcmp(name, "CreateDynamicDepthStencilState"))
2130 return (void*) vkCreateDynamicDepthStencilState;
2131 if (!strcmp(name, "CreateCommandBuffer"))
2132 return (void*) vkCreateCommandBuffer;
2133 if (!strcmp(name, "BeginCommandBuffer"))
2134 return (void*) vkBeginCommandBuffer;
2135 if (!strcmp(name, "EndCommandBuffer"))
2136 return (void*) vkEndCommandBuffer;
2137 if (!strcmp(name, "ResetCommandBuffer"))
2138 return (void*) vkResetCommandBuffer;
2139 if (!strcmp(name, "CmdBindPipeline"))
2140 return (void*) vkCmdBindPipeline;
2141 if (!strcmp(name, "CmdBindDynamicStateObject"))
2142 return (void*) vkCmdBindDynamicStateObject;
2143 if (!strcmp(name, "CmdBindDescriptorSets"))
2144 return (void*) vkCmdBindDescriptorSets;
2145 if (!strcmp(name, "CmdBindVertexBuffers"))
2146 return (void*) vkCmdBindVertexBuffers;
2147 if (!strcmp(name, "CmdBindIndexBuffer"))
2148 return (void*) vkCmdBindIndexBuffer;
2149 if (!strcmp(name, "CmdDraw"))
2150 return (void*) vkCmdDraw;
2151 if (!strcmp(name, "CmdDrawIndexed"))
2152 return (void*) vkCmdDrawIndexed;
2153 if (!strcmp(name, "CmdDrawIndirect"))
2154 return (void*) vkCmdDrawIndirect;
2155 if (!strcmp(name, "CmdDrawIndexedIndirect"))
2156 return (void*) vkCmdDrawIndexedIndirect;
2157 if (!strcmp(name, "CmdDispatch"))
2158 return (void*) vkCmdDispatch;
2159 if (!strcmp(name, "CmdDispatchIndirect"))
2160 return (void*) vkCmdDispatchIndirect;
2161 if (!strcmp(name, "CmdCopyBuffer"))
2162 return (void*) vkCmdCopyBuffer;
2163 if (!strcmp(name, "CmdCopyImage"))
2164 return (void*) vkCmdCopyImage;
2165 if (!strcmp(name, "CmdBlitImage"))
2166 return (void*) vkCmdBlitImage;
2167 if (!strcmp(name, "CmdCopyBufferToImage"))
2168 return (void*) vkCmdCopyBufferToImage;
2169 if (!strcmp(name, "CmdCopyImageToBuffer"))
2170 return (void*) vkCmdCopyImageToBuffer;
2171 if (!strcmp(name, "CmdUpdateBuffer"))
2172 return (void*) vkCmdUpdateBuffer;
2173 if (!strcmp(name, "CmdFillBuffer"))
2174 return (void*) vkCmdFillBuffer;
2175 if (!strcmp(name, "CmdClearColorImage"))
2176 return (void*) vkCmdClearColorImage;
2177 if (!strcmp(name, "CmdClearDepthStencil"))
2178 return (void*) vkCmdClearDepthStencil;
2179 if (!strcmp(name, "CmdResolveImage"))
2180 return (void*) vkCmdResolveImage;
2181 if (!strcmp(name, "CmdSetEvent"))
2182 return (void*) vkCmdSetEvent;
2183 if (!strcmp(name, "CmdResetEvent"))
2184 return (void*) vkCmdResetEvent;
2185 if (!strcmp(name, "CmdWaitEvents"))
2186 return (void*) vkCmdWaitEvents;
2187 if (!strcmp(name, "CmdPipelineBarrier"))
2188 return (void*) vkCmdPipelineBarrier;
2189 if (!strcmp(name, "CmdBeginQuery"))
2190 return (void*) vkCmdBeginQuery;
2191 if (!strcmp(name, "CmdEndQuery"))
2192 return (void*) vkCmdEndQuery;
2193 if (!strcmp(name, "CmdResetQueryPool"))
2194 return (void*) vkCmdResetQueryPool;
2195 if (!strcmp(name, "CmdWriteTimestamp"))
2196 return (void*) vkCmdWriteTimestamp;
2197 if (!strcmp(name, "CmdCopyQueryPoolResults"))
2198 return (void*) vkCmdCopyQueryPoolResults;
2199 if (!strcmp(name, "CmdInitAtomicCounters"))
2200 return (void*) vkCmdInitAtomicCounters;
2201 if (!strcmp(name, "CmdLoadAtomicCounters"))
2202 return (void*) vkCmdLoadAtomicCounters;
2203 if (!strcmp(name, "CmdSaveAtomicCounters"))
2204 return (void*) vkCmdSaveAtomicCounters;
2205 if (!strcmp(name, "CreateFramebuffer"))
2206 return (void*) vkCreateFramebuffer;
2207 if (!strcmp(name, "CreateRenderPass"))
2208 return (void*) vkCreateRenderPass;
2209 if (!strcmp(name, "CmdBeginRenderPass"))
2210 return (void*) vkCmdBeginRenderPass;
2211 if (!strcmp(name, "CmdEndRenderPass"))
2212 return (void*) vkCmdEndRenderPass;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002213 if (!strcmp(name, "CmdDbgMarkerBegin"))
2214 return (void*) vkCmdDbgMarkerBegin;
2215 if (!strcmp(name, "CmdDbgMarkerEnd"))
2216 return (void*) vkCmdDbgMarkerEnd;
2217 if (!strcmp(name, "GetDisplayInfoWSI"))
2218 return (void*) vkGetDisplayInfoWSI;
2219 if (!strcmp(name, "CreateSwapChainWSI"))
2220 return (void*) vkCreateSwapChainWSI;
2221 if (!strcmp(name, "DestroySwapChainWSI"))
2222 return (void*) vkDestroySwapChainWSI;
2223 if (!strcmp(name, "GetSwapChainInfoWSI"))
2224 return (void*) vkGetSwapChainInfoWSI;
2225 if (!strcmp(name, "QueuePresentWSI"))
2226 return (void*) vkQueuePresentWSI;
2227
2228 return NULL;
2229}
2230
2231static inline void* layer_intercept_instance_proc(const char *name)
2232{
2233 if (!name || name[0] != 'v' || name[1] != 'k')
2234 return NULL;
2235
2236 name += 2;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002237 if (!strcmp(name, "CreateInstance"))
2238 return (void*) vkCreateInstance;
2239 if (!strcmp(name, "DestroyInstance"))
2240 return (void*) vkDestroyInstance;
2241 if (!strcmp(name, "GetPhysicalDeviceInfo"))
2242 return (void*) vkGetPhysicalDeviceInfo;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002243 if (!strcmp(name, "CreateDevice"))
2244 return (void*) vkCreateDevice;
2245 if (!strcmp(name, "GetGlobalExtensionInfo"))
2246 return (void*) vkGetGlobalExtensionInfo;
2247 if (!strcmp(name, "GetPhysicalDeviceExtensionInfo"))
2248 return (void*) vkGetPhysicalDeviceExtensionInfo;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002249 if (!strcmp(name, "GetMultiDeviceCompatibility"))
2250 return (void*) vkGetMultiDeviceCompatibility;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002251
2252 return NULL;
2253}
2254
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06002255VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002256{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002257 void* addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002258 if (device == NULL) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002259 return NULL;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002260 }
2261
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -06002262 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn8fd08252015-05-28 16:25:02 -06002263
2264 /* loader uses this to force layer initialization; device object is wrapped */
2265 if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
2266 initDeviceTable((const VkBaseLayerObject *) device);
2267 return (void*) vkGetDeviceProcAddr;
2268 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002269
2270 addr = layer_intercept_proc(funcName);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002271 if (addr) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002272 return addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002273 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002274 else {
Jon Ashburn8fd08252015-05-28 16:25:02 -06002275 VkLayerDispatchTable **ppDisp = (VkLayerDispatchTable **) device;
2276 VkLayerDispatchTable* pTable = tableMap[*ppDisp];
2277 if (pTable->GetDeviceProcAddr == NULL)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002278 return NULL;
Jon Ashburn8fd08252015-05-28 16:25:02 -06002279 return pTable->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002280 }
2281}
2282
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002283VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002284{
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002285 void* addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002286 if (instance == NULL) {
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002287 return NULL;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002288 }
2289
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -06002290 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn8fd08252015-05-28 16:25:02 -06002291
2292 /* loader uses this to force layer initialization; instance object is wrapped */
2293 if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
2294 initInstanceTable((const VkBaseLayerObject *) instance);
2295 return (void*) vkGetInstanceProcAddr;
2296 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002297
2298 addr = layer_intercept_instance_proc(funcName);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002299 if (addr) {
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002300 return addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002301 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002302 else {
Jon Ashburn8fd08252015-05-28 16:25:02 -06002303 VkLayerInstanceDispatchTable **ppDisp = (VkLayerInstanceDispatchTable **) instance;
2304 VkLayerInstanceDispatchTable* pTable = tableInstanceMap[*ppDisp];
2305 if (pTable->GetInstanceProcAddr == NULL)
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002306 return NULL;
Jon Ashburn8fd08252015-05-28 16:25:02 -06002307 return pTable->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002308 }
2309}