blob: c45b743975449aaeac8d8d087822f2f976cc1595 [file] [log] [blame]
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001/*
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06002 * Vulkan
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06003 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28
29#include <iostream>
30#include <string>
31#include <sstream>
32
33#include "loader_platform.h"
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060034#include "vkLayer.h"
Jon Ashburnf0615e22015-05-25 14:11:37 -060035#include "vk_debug_marker_layer.h"
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060036#include "layers_config.h"
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060037#include "vk_enum_validate_helper.h"
38#include "vk_struct_validate_helper.h"
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060039//The following is #included again to catch certain OS-specific functions being used:
40#include "loader_platform.h"
41
42#include "layers_msg.h"
43
Jon Ashburn301c5f02015-04-06 10:58:22 -060044static VkLayerDispatchTable nextTable;
Jon Ashburnf0615e22015-05-25 14:11:37 -060045static VkLayerDebugMarkerDispatchTable nextDebugMarkerTable;
Jon Ashburnd9564002015-05-07 10:27:37 -060046static VkLayerInstanceDispatchTable nextInstanceTable;
Jon Ashburn301c5f02015-04-06 10:58:22 -060047static VkBaseLayerObject *pCurObj;
Jon Ashburnd9564002015-05-07 10:27:37 -060048static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(initOnce);
49static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(tabDeviceOnce);
50static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(tabInstanceOnce);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060051
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060052#include "vk_dispatch_table_helper.h"
Jon Ashburnd9564002015-05-07 10:27:37 -060053
54// TODO handle multiple GPUs/instances for both instance and device dispatch tables
55static void initDeviceTable(void)
56{
Jon Ashburn1245cec2015-05-18 13:20:15 -060057 PFN_vkGetDeviceProcAddr fpNextGPA;
Jon Ashburnf0615e22015-05-25 14:11:37 -060058 VkDevice device = (VkDevice) pCurObj->nextObject;
Jon Ashburn1245cec2015-05-18 13:20:15 -060059 fpNextGPA = (PFN_vkGetDeviceProcAddr) pCurObj->pGPA;
Jon Ashburnd9564002015-05-07 10:27:37 -060060 assert(fpNextGPA);
Jon Ashburnf0615e22015-05-25 14:11:37 -060061 layer_initialize_dispatch_table(&nextTable, fpNextGPA, device);
62
63 nextDebugMarkerTable.CmdDbgMarkerBegin = (PFN_vkCmdDbgMarkerBegin) fpNextGPA(device, "vkCmdDbgMarkerBegin");
64 nextDebugMarkerTable.CmdDbgMarkerEnd = (PFN_vkCmdDbgMarkerEnd) fpNextGPA(device, "vkCmdDbgMarkerEnd");
65 nextDebugMarkerTable.DbgSetObjectTag = (PFN_vkDbgSetObjectTag) fpNextGPA(device, "vkDbgSetObjectTag");
66 nextDebugMarkerTable.DbgSetObjectName = (PFN_vkDbgSetObjectName) fpNextGPA(device, "vkDbgSetObjectName");
Jon Ashburnd9564002015-05-07 10:27:37 -060067}
68
69static void initInstanceTable(void)
70{
71 PFN_vkGetInstanceProcAddr fpNextGPA;
72 fpNextGPA = (PFN_vkGetInstanceProcAddr) pCurObj->pGPA;
73 assert(fpNextGPA);
74 layer_init_instance_dispatch_table(&nextInstanceTable, fpNextGPA, (VkInstance) pCurObj->nextObject);
75}
76
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060077static void initParamChecker(void)
78{
79
80 const char *strOpt;
81 // initialize ParamChecker options
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -060082 getLayerOptionEnum("ParamCheckerReportLevel", (uint32_t *) &g_reportFlags);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060083 g_actionIsDefault = getLayerOptionEnum("ParamCheckerDebugAction", (uint32_t *) &g_debugAction);
84
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060085 if (g_debugAction & VK_DBG_LAYER_ACTION_LOG_MSG)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060086 {
87 strOpt = getLayerOption("ParamCheckerLogFilename");
88 if (strOpt)
89 {
90 g_logFile = fopen(strOpt, "w");
91 }
92 if (g_logFile == NULL)
93 g_logFile = stdout;
94 }
95
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060096}
97
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060098void PreCreateInstance(const VkApplicationInfo* pAppInfo, const VkAllocCallbacks* pAllocCb)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -060099{
100 if(pAppInfo == nullptr)
101 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600102 char const str[] = "vkCreateInstance parameter, VkApplicationInfo* pAppInfo, is "\
Mike Stroyan0ae32252015-04-06 15:24:46 -0600103 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600104 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600105 return;
106 }
107
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600108 if(pAppInfo->sType != VK_STRUCTURE_TYPE_APPLICATION_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600109 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600110 char const str[] = "vkCreateInstance parameter, VK_STRUCTURE_TYPE_APPLICATION_INFO "\
111 "pAppInfo->sType, is not VK_STRUCTURE_TYPE_APPLICATION_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600112 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600113 return;
114 }
115
116 // TODO: What else can validated in pAppInfo?
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600117 // TODO: VK_API_VERSION validation.
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600118
119 // It's okay if pAllocCb is a nullptr.
120 if(pAllocCb != nullptr)
121 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600122 if(!vk_validate_vkalloccallbacks(pAllocCb))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600123 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600124 char const str[] = "vkCreateInstance parameter, VkAllocCallbacks* pAllocCb, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600125 "contains an invalid value (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600126 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600127 return;
128 }
129 }
130}
131
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600132void PostCreateInstance(VkResult result, const VkInstanceCreateInfo *pCreateInfo, VkInstance* pInstance)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600133{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600134 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600135 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600136 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600137 char const str[] = "vkCreateInstance failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600138 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600139 return;
140 }
141
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600142 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
143
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600144 if(pInstance == nullptr)
145 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600146 char const str[] = "vkCreateInstance parameter, VkInstance* pInstance, is nullptr "\
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600147 "(postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600148 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600149 return;
150 }
151}
152
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600153VK_LAYER_EXPORT VkResult VKAPI vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600154{
Jon Ashburn29669a42015-04-04 14:52:07 -0600155 PreCreateInstance(pCreateInfo->pAppInfo, pCreateInfo->pAllocCb);
Jon Ashburn52c1d732015-05-12 17:23:55 -0600156 VkResult result = nextInstanceTable.CreateInstance(pCreateInfo, pInstance);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600157 PostCreateInstance(result, pCreateInfo, pInstance);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600158 return result;
159}
160
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600161VK_LAYER_EXPORT VkResult VKAPI vkDestroyInstance(VkInstance instance)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600162{
163
Jon Ashburn52c1d732015-05-12 17:23:55 -0600164 VkResult result = nextInstanceTable.DestroyInstance(instance);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600165 return result;
166}
167
Tony Barbour8205d902015-04-16 15:59:00 -0600168VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceInfo(VkPhysicalDevice gpu, VkPhysicalDeviceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600169{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600170 char str[1024];
Tony Barbour8205d902015-04-16 15:59:00 -0600171 if (!validate_VkPhysicalDeviceInfoType(infoType)) {
172 sprintf(str, "Parameter infoType to function GetPhysicalDeviceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600173 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600174 }
Jon Ashburn2666e2f2015-05-15 15:09:35 -0600175 VkResult result = nextInstanceTable.GetPhysicalDeviceInfo(gpu, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600176 return result;
177}
178
Tony Barbour8205d902015-04-16 15:59:00 -0600179void PreCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600180{
181 if(gpu == nullptr)
182 {
Tony Barbour8205d902015-04-16 15:59:00 -0600183 char const str[] = "vkCreateDevice parameter, VkPhysicalDevice gpu, is nullptr "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600184 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600185 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600186 return;
187 }
188
189 if(pCreateInfo == nullptr)
190 {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600191 char const str[] = "vkCreateDevice parameter, VkDeviceCreateInfo* pCreateInfo, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600192 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600193 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600194 return;
195 }
196
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600197 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600198 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600199 char const str[] = "vkCreateDevice parameter, VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO "\
200 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600201 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600202 return;
203 }
204
205 if(pCreateInfo->queueRecordCount == 0)
206 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600207 char const str[] = "vkCreateDevice parameter, uint32_t pCreateInfo->queueRecordCount, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600208 "zero (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600209 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600210 return;
211 }
212
213 if(pCreateInfo->pRequestedQueues == nullptr)
214 {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600215 char const str[] = "vkCreateDevice parameter, VkDeviceQueueCreateInfo* pCreateInfo->pRequestedQueues, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600216 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600217 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600218 return;
219 }
220
221 for(uint32_t i = 0; i < pCreateInfo->queueRecordCount; ++i)
222 {
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600223 if(!vk_validate_vkdevicequeuecreateinfo(&(pCreateInfo->pRequestedQueues[i])))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600224 {
225 std::stringstream ss;
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600226 ss << "vkCreateDevice parameter, VkDeviceQueueCreateInfo pCreateInfo->pRequestedQueues[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600227 "], is invalid (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600228 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600229 continue;
230 }
231 }
232
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600233}
234
Jon Ashburnf0615e22015-05-25 14:11:37 -0600235static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
236{
237 uint32_t i, ext_idx;
238 VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) device;
239 VkLayerDebugMarkerDispatchTable *pTable = &nextDebugMarkerTable;
240
241 for (i = 0; i < pCreateInfo->extensionCount; i++) {
242 if (strcmp(pCreateInfo->pEnabledExtensions[i].name, DEBUG_MARKER_EXTENSION_NAME) == 0) {
243 /* Found a matching extension name, mark it enabled */
244 pTable->ext_enabled = true;
245 }
246
247 }
248}
249
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600250void PostCreateDevice(VkResult result, const VkDeviceCreateInfo *pCreateInfo, VkDevice* pDevice)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600251{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600252 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600253 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600254 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600255 char const str[] = "vkCreateDevice failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600256 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600257 return;
258 }
259
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600260 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
Jon Ashburnf0615e22015-05-25 14:11:37 -0600261 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600262
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600263 if(pDevice == nullptr)
264 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600265 char const str[] = "vkCreateDevice parameter, VkDevice* pDevice, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600266 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600267 return;
268 }
269}
270
Tony Barbour8205d902015-04-16 15:59:00 -0600271VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600272{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600273 PreCreateDevice(gpu, pCreateInfo);
Jon Ashburn2666e2f2015-05-15 15:09:35 -0600274 VkResult result = nextInstanceTable.CreateDevice(gpu, pCreateInfo, pDevice);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600275 PostCreateDevice(result, pCreateInfo, pDevice);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600276 return result;
277}
278
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600279VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice(VkDevice device)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600280{
281
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600282 VkResult result = nextTable.DestroyDevice(device);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600283 return result;
284}
285
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600286#define PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE 1
287static const VkExtensionProperties pcExts[PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE] = {
288 {
289 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
290 "ParamChecker",
291 0x10,
292 "Sample layer: ParamChecker",
293 }
Jon Ashburneb2728b2015-04-10 14:33:07 -0600294};
295
296VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo(
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600297 VkExtensionInfoType infoType,
298 uint32_t extensionIndex,
299 size_t* pDataSize,
300 void* pData)
Jon Ashburneb2728b2015-04-10 14:33:07 -0600301{
Jon Ashburneb2728b2015-04-10 14:33:07 -0600302 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
Jon Ashburneb2728b2015-04-10 14:33:07 -0600303 uint32_t *count;
304
305 if (pDataSize == NULL)
306 return VK_ERROR_INVALID_POINTER;
307
308 switch (infoType) {
309 case VK_EXTENSION_INFO_TYPE_COUNT:
310 *pDataSize = sizeof(uint32_t);
311 if (pData == NULL)
312 return VK_SUCCESS;
313 count = (uint32_t *) pData;
314 *count = PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE;
315 break;
316 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
317 *pDataSize = sizeof(VkExtensionProperties);
318 if (pData == NULL)
319 return VK_SUCCESS;
320 if (extensionIndex >= PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE)
321 return VK_ERROR_INVALID_VALUE;
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600322 memcpy((VkExtensionProperties *) pData, &pcExts[extensionIndex], sizeof(VkExtensionProperties));
Jon Ashburneb2728b2015-04-10 14:33:07 -0600323 break;
324 default:
325 return VK_ERROR_INVALID_VALUE;
326 };
327
328 return VK_SUCCESS;
329}
330
Jeremy Hayescf469132015-04-17 10:36:53 -0600331VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionInfo(
332 VkPhysicalDevice gpu,
333 VkExtensionInfoType infoType,
334 uint32_t extensionIndex,
335 size_t* pDataSize,
336 void* pData)
337{
Jon Ashburnf0615e22015-05-25 14:11:37 -0600338 //TODO add DEBUG_MARKER to extension list
Jon Ashburn2666e2f2015-05-15 15:09:35 -0600339 VkResult result = nextInstanceTable.GetPhysicalDeviceExtensionInfo(gpu, infoType, extensionIndex, pDataSize, pData);
Jeremy Hayescf469132015-04-17 10:36:53 -0600340 return result;
341}
342
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600343VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex, VkQueue* pQueue)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600344{
345
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600346 VkResult result = nextTable.GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600347 return result;
348}
349
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600350VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600351{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600352 VkResult result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, fence);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600353 return result;
354}
355
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600356VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(VkQueue queue)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600357{
358
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600359 VkResult result = nextTable.QueueWaitIdle(queue);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600360 return result;
361}
362
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600363VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle(VkDevice device)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600364{
365
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600366 VkResult result = nextTable.DeviceWaitIdle(device);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600367 return result;
368}
369
Tony Barbour8205d902015-04-16 15:59:00 -0600370VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory(VkDevice device, const VkMemoryAllocInfo* pAllocInfo, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600371{
372 char str[1024];
373 if (!pAllocInfo) {
374 sprintf(str, "Struct ptr parameter pAllocInfo to function AllocMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600375 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600376 } else if (!vk_validate_vkmemoryallocinfo(pAllocInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600377 sprintf(str, "Parameter pAllocInfo to function AllocMemory contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600378 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600379 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600380 VkResult result = nextTable.AllocMemory(device, pAllocInfo, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600381 return result;
382}
383
Mike Stroyan230e6252015-04-17 12:36:38 -0600384VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600385{
386
Mike Stroyan230e6252015-04-17 12:36:38 -0600387 VkResult result = nextTable.FreeMemory(device, mem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600388 return result;
389}
390
Mike Stroyan230e6252015-04-17 12:36:38 -0600391VK_LAYER_EXPORT VkResult VKAPI vkSetMemoryPriority(VkDevice device, VkDeviceMemory mem, VkMemoryPriority priority)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600392{
393 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600394 if (!validate_VkMemoryPriority(priority)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600395 sprintf(str, "Parameter priority to function SetMemoryPriority has invalid value of %i.", (int)priority);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600396 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600397 }
Mike Stroyan230e6252015-04-17 12:36:38 -0600398 VkResult result = nextTable.SetMemoryPriority(device, mem, priority);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600399 return result;
400}
401
Mike Stroyan230e6252015-04-17 12:36:38 -0600402VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkFlags flags, void** ppData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600403{
404
Mike Stroyan230e6252015-04-17 12:36:38 -0600405 VkResult result = nextTable.MapMemory(device, mem, offset, size, flags, ppData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600406 return result;
407}
408
Mike Stroyan230e6252015-04-17 12:36:38 -0600409VK_LAYER_EXPORT VkResult VKAPI vkUnmapMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600410{
411
Mike Stroyan230e6252015-04-17 12:36:38 -0600412 VkResult result = nextTable.UnmapMemory(device, mem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600413 return result;
414}
415
Courtney Goeltzenleuchtera569a502015-04-29 17:16:21 -0600416VK_LAYER_EXPORT VkResult VKAPI vkFlushMappedMemoryRanges(
417 VkDevice device,
418 uint32_t memRangeCount,
419 const VkMappedMemoryRange* pMemRanges)
Tony Barbour859ceab2015-04-16 19:23:13 -0600420{
421
Courtney Goeltzenleuchtera569a502015-04-29 17:16:21 -0600422 VkResult result = nextTable.FlushMappedMemoryRanges(device, memRangeCount, pMemRanges);
423 return result;
424}
425
426VK_LAYER_EXPORT VkResult VKAPI vkInvalidateMappedMemoryRanges(
427 VkDevice device,
428 uint32_t memRangeCount,
429 const VkMappedMemoryRange* pMemRanges)
430{
431
432 VkResult result = nextTable.InvalidateMappedMemoryRanges(device, memRangeCount, pMemRanges);
Tony Barbour859ceab2015-04-16 19:23:13 -0600433 return result;
434}
435
Tony Barbour8205d902015-04-16 15:59:00 -0600436VK_LAYER_EXPORT VkResult VKAPI vkPinSystemMemory(VkDevice device, const void* pSysMem, size_t memSize, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600437{
438
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600439 VkResult result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600440 return result;
441}
442
Tony Barbour8205d902015-04-16 15:59:00 -0600443VK_LAYER_EXPORT VkResult VKAPI vkGetMultiDeviceCompatibility(VkPhysicalDevice gpu0, VkPhysicalDevice gpu1, VkPhysicalDeviceCompatibilityInfo* pInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600444{
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600445
Jon Ashburn2666e2f2015-05-15 15:09:35 -0600446 VkResult result = nextInstanceTable.GetMultiDeviceCompatibility(gpu0, gpu1, pInfo);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600447 return result;
448}
449
Tony Barbour8205d902015-04-16 15:59:00 -0600450VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedMemory(VkDevice device, const VkMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600451{
452 char str[1024];
453 if (!pOpenInfo) {
454 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600455 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600456 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600457 else if (!vk_validate_vkmemoryopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600458 sprintf(str, "Parameter pOpenInfo to function OpenSharedMemory contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600459 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600460 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600461 VkResult result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600462 return result;
463}
464
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600465VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedSemaphore(VkDevice device, const VkSemaphoreOpenInfo* pOpenInfo, VkSemaphore* pSemaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600466{
467 char str[1024];
468 if (!pOpenInfo) {
469 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedSemaphore is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600470 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600471 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600472 else if (!vk_validate_vksemaphoreopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600473 sprintf(str, "Parameter pOpenInfo to function OpenSharedSemaphore contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600474 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600475 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600476 VkResult result = nextTable.OpenSharedSemaphore(device, pOpenInfo, pSemaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600477 return result;
478}
479
Tony Barbour8205d902015-04-16 15:59:00 -0600480VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerMemory(VkDevice device, const VkPeerMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600481{
482 char str[1024];
483 if (!pOpenInfo) {
484 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600485 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600486 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600487 else if (!vk_validate_vkpeermemoryopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600488 sprintf(str, "Parameter pOpenInfo to function OpenPeerMemory contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600489 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600490 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600491 VkResult result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600492 return result;
493}
494
Tony Barbour8205d902015-04-16 15:59:00 -0600495VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerImage(VkDevice device, const VkPeerImageOpenInfo* pOpenInfo, VkImage* pImage, VkDeviceMemory* pMem)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600496{
497 char str[1024];
498 if (!pOpenInfo) {
499 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerImage is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600500 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600501 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600502 else if (!vk_validate_vkpeerimageopeninfo(pOpenInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600503 sprintf(str, "Parameter pOpenInfo to function OpenPeerImage contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600504 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600505 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600506 VkResult result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600507 return result;
508}
509
Mike Stroyan230e6252015-04-17 12:36:38 -0600510VK_LAYER_EXPORT VkResult VKAPI vkDestroyObject(VkDevice device, VkObjectType objType, VkObject object)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600511{
Mike Stroyan230e6252015-04-17 12:36:38 -0600512 VkResult result = nextTable.DestroyObject(device, objType, object);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600513 return result;
514}
515
Mike Stroyan230e6252015-04-17 12:36:38 -0600516VK_LAYER_EXPORT VkResult VKAPI vkGetObjectInfo(VkDevice device, VkObjectType objType, VkObject object, VkObjectInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600517{
518 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600519 if (!validate_VkObjectInfoType(infoType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600520 sprintf(str, "Parameter infoType to function GetObjectInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600521 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600522 }
Mike Stroyan230e6252015-04-17 12:36:38 -0600523 VkResult result = nextTable.GetObjectInfo(device, objType, object, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600524 return result;
525}
526
Mark Lobodzinski23182612015-05-29 09:32:35 -0500527VK_LAYER_EXPORT VkResult VKAPI vkBindObjectMemory(VkDevice device, VkObjectType objType, VkObject object, VkDeviceMemory mem, VkDeviceSize offset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600528{
529
Mark Lobodzinski23182612015-05-29 09:32:35 -0500530 VkResult result = nextTable.BindObjectMemory(device, objType, object, mem, offset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600531 return result;
532}
533
Mark Lobodzinski23182612015-05-29 09:32:35 -0500534VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(VkQueue queue, VkBuffer buffer, VkDeviceSize rangeOffset, VkDeviceSize rangeSize, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600535{
536
Mark Lobodzinski23182612015-05-29 09:32:35 -0500537 VkResult result = nextTable.QueueBindSparseBufferMemory(queue, buffer, rangeOffset, rangeSize, mem, memOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600538 return result;
539}
540
Mark Lobodzinski23182612015-05-29 09:32:35 -0500541VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageMemory(VkQueue queue, VkImage image, const VkImageMemoryBindInfo* pBindInfo, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600542{
543 char str[1024];
Jeremy Hayes47536532015-04-15 15:20:03 -0600544 if (!pBindInfo) {
Mark Lobodzinskifb9f5642015-05-11 17:21:15 -0500545 sprintf(str, "Struct ptr parameter pBindInfo to function QueueBindSparseImageMemory is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600546 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600547 }
Jeremy Hayes47536532015-04-15 15:20:03 -0600548 else if (!vk_validate_vkimagememorybindinfo(pBindInfo)) {
549 sprintf(str, "Parameter pBindInfo to function BindImageMemoryRange contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600550 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600551 }
Mark Lobodzinski23182612015-05-29 09:32:35 -0500552 VkResult result = nextTable.QueueBindSparseImageMemory(queue, image, pBindInfo, mem, memOffset);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600553 return result;
554}
555
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600556VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(VkDevice device, const VkFenceCreateInfo* pCreateInfo, VkFence* pFence)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600557{
558 char str[1024];
559 if (!pCreateInfo) {
560 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFence is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600561 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600562 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600563 else if (!vk_validate_vkfencecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600564 sprintf(str, "Parameter pCreateInfo to function CreateFence contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600565 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600566 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600567 VkResult result = nextTable.CreateFence(device, pCreateInfo, pFence);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600568 return result;
569}
570
Mike Stroyan230e6252015-04-17 12:36:38 -0600571VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(VkDevice device, VkFence fence)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600572{
573
Mike Stroyan230e6252015-04-17 12:36:38 -0600574 VkResult result = nextTable.GetFenceStatus(device, fence);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600575 return result;
576}
577
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600578VK_LAYER_EXPORT VkResult VKAPI vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences, bool32_t waitAll, uint64_t timeout)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600579{
580
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600581 VkResult result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600582 return result;
583}
584
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600585VK_LAYER_EXPORT VkResult VKAPI vkResetFences(VkDevice device, uint32_t fenceCount, VkFence* pFences)
Mark Lobodzinskiebe814d2015-04-07 16:07:57 -0500586{
587
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600588 VkResult result = nextTable.ResetFences(device, fenceCount, pFences);
Mark Lobodzinskiebe814d2015-04-07 16:07:57 -0500589 return result;
590}
591
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600592VK_LAYER_EXPORT VkResult VKAPI vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, VkSemaphore* pSemaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600593{
594 char str[1024];
595 if (!pCreateInfo) {
596 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSemaphore is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600597 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600598 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600599 else if (!vk_validate_vksemaphorecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600600 sprintf(str, "Parameter pCreateInfo to function CreateSemaphore contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600601 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600602 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600603 VkResult result = nextTable.CreateSemaphore(device, pCreateInfo, pSemaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600604 return result;
605}
606
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600607VK_LAYER_EXPORT VkResult VKAPI vkQueueSignalSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600608{
609
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600610 VkResult result = nextTable.QueueSignalSemaphore(queue, semaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600611 return result;
612}
613
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600614VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600615{
616
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600617 VkResult result = nextTable.QueueWaitSemaphore(queue, semaphore);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600618 return result;
619}
620
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600621VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(VkDevice device, const VkEventCreateInfo* pCreateInfo, VkEvent* pEvent)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600622{
623 char str[1024];
624 if (!pCreateInfo) {
625 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateEvent is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600626 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600627 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600628 else if (!vk_validate_vkeventcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600629 sprintf(str, "Parameter pCreateInfo to function CreateEvent contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600630 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600631 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600632 VkResult result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600633 return result;
634}
635
Mike Stroyan230e6252015-04-17 12:36:38 -0600636VK_LAYER_EXPORT VkResult VKAPI vkGetEventStatus(VkDevice device, VkEvent event)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600637{
638
Mike Stroyan230e6252015-04-17 12:36:38 -0600639 VkResult result = nextTable.GetEventStatus(device, event);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600640 return result;
641}
642
Mike Stroyan230e6252015-04-17 12:36:38 -0600643VK_LAYER_EXPORT VkResult VKAPI vkSetEvent(VkDevice device, VkEvent event)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600644{
645
Mike Stroyan230e6252015-04-17 12:36:38 -0600646 VkResult result = nextTable.SetEvent(device, event);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600647 return result;
648}
649
Mike Stroyan230e6252015-04-17 12:36:38 -0600650VK_LAYER_EXPORT VkResult VKAPI vkResetEvent(VkDevice device, VkEvent event)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600651{
652
Mike Stroyan230e6252015-04-17 12:36:38 -0600653 VkResult result = nextTable.ResetEvent(device, event);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600654 return result;
655}
656
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600657VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, VkQueryPool* pQueryPool)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600658{
659 char str[1024];
660 if (!pCreateInfo) {
661 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateQueryPool is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600662 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600663 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600664 else if (!vk_validate_vkquerypoolcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600665 sprintf(str, "Parameter pCreateInfo to function CreateQueryPool contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600666 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600667 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600668 VkResult result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600669 return result;
670}
671
Mike Stroyan230e6252015-04-17 12:36:38 -0600672VK_LAYER_EXPORT VkResult VKAPI vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData, VkQueryResultFlags flags)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600673{
674
Mike Stroyan230e6252015-04-17 12:36:38 -0600675 VkResult result = nextTable.GetQueryPoolResults(device, queryPool, startQuery, queryCount, pDataSize, pData, flags);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600676 return result;
677}
678
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600679VK_LAYER_EXPORT VkResult VKAPI vkGetFormatInfo(VkDevice device, VkFormat format, VkFormatInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600680{
681 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600682 if (!validate_VkFormat(format)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600683 sprintf(str, "Parameter format to function GetFormatInfo has invalid value of %i.", (int)format);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600684 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600685 }
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600686 if (!validate_VkFormatInfoType(infoType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600687 sprintf(str, "Parameter infoType to function GetFormatInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600688 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600689 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600690 VkResult result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600691 return result;
692}
693
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600694VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600695{
696 char str[1024];
697 if (!pCreateInfo) {
698 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBuffer is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600699 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600700 }
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600701 else if (!vk_validate_vkbuffercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600702 sprintf(str, "Parameter pCreateInfo to function CreateBuffer contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600703 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600704 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600705 VkResult result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600706 return result;
707}
708
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600709VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, VkBufferView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600710{
711 char str[1024];
712 if (!pCreateInfo) {
713 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBufferView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600714 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600715 }
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600716 else if (!vk_validate_vkbufferviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600717 sprintf(str, "Parameter pCreateInfo to function CreateBufferView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600718 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600719 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600720 VkResult result = nextTable.CreateBufferView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600721 return result;
722}
723
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600724void PreCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600725{
726 if(pCreateInfo == nullptr)
727 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600728 char const str[] = "vkCreateImage parameter, VkImageCreateInfo* pCreateInfo, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600729 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600730 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600731 return;
732 }
733
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600734 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600735 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600736 char const str[] = "vkCreateImage parameter, VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO "\
737 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600738 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600739 return;
740 }
741
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600742 if (!validate_VkImageType(pCreateInfo->imageType))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600743 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600744 char const str[] = "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600745 "unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600746 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600747 return;
748 }
749
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600750 if (!validate_VkFormat(pCreateInfo->format))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600751 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600752 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600753 "unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600754 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600755 return;
756 }
757
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600758 VkFormatProperties properties;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600759 size_t size = sizeof(properties);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600760 VkResult result = nextTable.GetFormatInfo(device, pCreateInfo->format,
Tony Barbour8205d902015-04-16 15:59:00 -0600761 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600762 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600763 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600764 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, cannot be "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600765 "validated (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600766 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600767 return;
768 }
769
770 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
771 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600772 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600773 "unsupported format (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600774 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600775 return;
776 }
777
778 // TODO: Can we check device-specific limits?
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600779 if (!vk_validate_vkextent3d(&pCreateInfo->extent))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600780 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600781 char const str[] = "vkCreateImage parameter, VkExtent3D pCreateInfo->extent, is invalid "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600782 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600783 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600784 return;
785 }
786
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600787 if (!validate_VkImageTiling(pCreateInfo->tiling))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600788 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600789 char const str[] = "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is "\
Jeremy Hayes6b7060b2015-04-07 09:49:05 -0600790 "unrecoginized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600791 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600792 return;
793 }
794}
795
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600796void PostCreateImage(VkResult result, VkImage* pImage)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600797{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600798 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600799 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600800 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600801 char const str[] = "vkCreateImage failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600802 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600803 return;
804 }
805
806 if(pImage == nullptr)
807 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600808 char const str[] = "vkCreateImage parameter, VkImage* pImage, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600809 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600810 return;
811 }
812}
813
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600814VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600815{
816 PreCreateImage(device, pCreateInfo);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600817 VkResult result = nextTable.CreateImage(device, pCreateInfo, pImage);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600818 PostCreateImage(result, pImage);
819 return result;
820}
821
Mike Stroyan230e6252015-04-17 12:36:38 -0600822VK_LAYER_EXPORT VkResult VKAPI vkGetImageSubresourceInfo(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600823{
824 char str[1024];
825 if (!pSubresource) {
826 sprintf(str, "Struct ptr parameter pSubresource to function GetImageSubresourceInfo is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600827 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -0600828 } else if (!vk_validate_vkimagesubresource(pSubresource)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600829 sprintf(str, "Parameter pSubresource to function GetImageSubresourceInfo contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600830 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600831 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600832 if (!validate_VkSubresourceInfoType(infoType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600833 sprintf(str, "Parameter infoType to function GetImageSubresourceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600834 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600835 }
Mike Stroyan230e6252015-04-17 12:36:38 -0600836 VkResult result = nextTable.GetImageSubresourceInfo(device, image, pSubresource, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600837 return result;
838}
839
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600840VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, VkImageView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600841{
842 char str[1024];
843 if (!pCreateInfo) {
844 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateImageView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600845 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600846 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600847 else if (!vk_validate_vkimageviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600848 sprintf(str, "Parameter pCreateInfo to function CreateImageView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600849 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600850 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600851 VkResult result = nextTable.CreateImageView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600852 return result;
853}
854
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600855VK_LAYER_EXPORT VkResult VKAPI vkCreateColorAttachmentView(VkDevice device, const VkColorAttachmentViewCreateInfo* pCreateInfo, VkColorAttachmentView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600856{
857 char str[1024];
858 if (!pCreateInfo) {
859 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateColorAttachmentView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600860 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600861 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600862 else if (!vk_validate_vkcolorattachmentviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600863 sprintf(str, "Parameter pCreateInfo to function CreateColorAttachmentView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600864 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600865 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600866 VkResult result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600867 return result;
868}
869
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600870VK_LAYER_EXPORT VkResult VKAPI vkCreateDepthStencilView(VkDevice device, const VkDepthStencilViewCreateInfo* pCreateInfo, VkDepthStencilView* pView)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600871{
872 char str[1024];
873 if (!pCreateInfo) {
874 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDepthStencilView is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600875 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600876 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600877 else if (!vk_validate_vkdepthstencilviewcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600878 sprintf(str, "Parameter pCreateInfo to function CreateDepthStencilView contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600879 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600880 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600881 VkResult result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600882 return result;
883}
884
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600885VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(VkDevice device, const VkShaderCreateInfo* pCreateInfo, VkShader* pShader)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600886{
887 char str[1024];
888 if (!pCreateInfo) {
889 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateShader is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600890 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600891 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600892 else if (!vk_validate_vkshadercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600893 sprintf(str, "Parameter pCreateInfo to function CreateShader contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600894 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600895 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600896 VkResult result = nextTable.CreateShader(device, pCreateInfo, pShader);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600897 return result;
898}
899
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600900VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600901{
902 char str[1024];
903 if (!pCreateInfo) {
904 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipeline is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600905 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600906 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600907 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600908 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipeline contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600909 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600910 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600911 VkResult result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600912 return result;
913}
914
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600915VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelineDerivative(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600916{
917 char str[1024];
918 if (!pCreateInfo) {
919 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipelineDerivative is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600920 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600921 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600922 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600923 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipelineDerivative contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600924 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600925 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600926 VkResult result = nextTable.CreateGraphicsPipelineDerivative(device, pCreateInfo, basePipeline, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600927 return result;
928}
929
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600930VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipeline(VkDevice device, const VkComputePipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600931{
932 char str[1024];
933 if (!pCreateInfo) {
934 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateComputePipeline is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600935 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600936 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600937 else if (!vk_validate_vkcomputepipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600938 sprintf(str, "Parameter pCreateInfo to function CreateComputePipeline contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600939 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600940 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600941 VkResult result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600942 return result;
943}
944
Mike Stroyan230e6252015-04-17 12:36:38 -0600945VK_LAYER_EXPORT VkResult VKAPI vkStorePipeline(VkDevice device, VkPipeline pipeline, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600946{
947
Mike Stroyan230e6252015-04-17 12:36:38 -0600948 VkResult result = nextTable.StorePipeline(device, pipeline, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600949 return result;
950}
951
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600952VK_LAYER_EXPORT VkResult VKAPI vkLoadPipeline(VkDevice device, size_t dataSize, const void* pData, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600953{
954
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600955 VkResult result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600956 return result;
957}
958
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600959VK_LAYER_EXPORT VkResult VKAPI vkLoadPipelineDerivative(VkDevice device, size_t dataSize, const void* pData, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600960{
961
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600962 VkResult result = nextTable.LoadPipelineDerivative(device, dataSize, pData, basePipeline, pPipeline);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600963 return result;
964}
965
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600966VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, VkSampler* pSampler)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600967{
968 char str[1024];
969 if (!pCreateInfo) {
970 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSampler is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600971 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600972 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600973 else if (!vk_validate_vksamplercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600974 sprintf(str, "Parameter pCreateInfo to function CreateSampler contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600975 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600976 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600977 VkResult result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600978 return result;
979}
980
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600981VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayout* pSetLayout)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600982{
983 char str[1024];
984 if (!pCreateInfo) {
985 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorSetLayout is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600986 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600987 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -0600988 else if (!vk_validate_vkdescriptorsetlayoutcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600989 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorSetLayout contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600990 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600991 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600992 VkResult result = nextTable.CreateDescriptorSetLayout(device, pCreateInfo, pSetLayout);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600993 return result;
994}
995
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500996VK_LAYER_EXPORT VkResult VKAPI vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, VkPipelineLayout* pPipelineLayout)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600997{
Mark Lobodzinski556f7212015-04-17 14:11:39 -0500998 VkResult result = nextTable.CreatePipelineLayout(device, pCreateInfo, pPipelineLayout);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -0600999 return result;
1000}
1001
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001002VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorPool(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001003{
1004 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001005 if (!validate_VkDescriptorPoolUsage(poolUsage)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001006 sprintf(str, "Parameter poolUsage to function CreateDescriptorPool has invalid value of %i.", (int)poolUsage);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001007 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001008 }
1009 if (!pCreateInfo) {
1010 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorPool is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001011 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001012 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001013 else if (!vk_validate_vkdescriptorpoolcreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001014 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorPool contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001015 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001016 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001017 VkResult result = nextTable.CreateDescriptorPool(device, poolUsage, maxSets, pCreateInfo, pDescriptorPool);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001018 return result;
1019}
1020
Mike Stroyan230e6252015-04-17 12:36:38 -06001021VK_LAYER_EXPORT VkResult VKAPI vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001022{
1023
Mike Stroyan230e6252015-04-17 12:36:38 -06001024 VkResult result = nextTable.ResetDescriptorPool(device, descriptorPool);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001025 return result;
1026}
1027
Mike Stroyan230e6252015-04-17 12:36:38 -06001028VK_LAYER_EXPORT VkResult VKAPI vkAllocDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorSetUsage setUsage, uint32_t count, const VkDescriptorSetLayout* pSetLayouts, VkDescriptorSet* pDescriptorSets, uint32_t* pCount)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001029{
1030 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001031 if (!validate_VkDescriptorSetUsage(setUsage)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001032 sprintf(str, "Parameter setUsage to function AllocDescriptorSets has invalid value of %i.", (int)setUsage);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001033 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001034 }
Mike Stroyan230e6252015-04-17 12:36:38 -06001035 VkResult result = nextTable.AllocDescriptorSets(device, descriptorPool, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001036 return result;
1037}
1038
Mike Stroyan230e6252015-04-17 12:36:38 -06001039VK_LAYER_EXPORT void VKAPI vkClearDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, const VkDescriptorSet* pDescriptorSets)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001040{
1041
Mike Stroyan230e6252015-04-17 12:36:38 -06001042 nextTable.ClearDescriptorSets(device, descriptorPool, count, pDescriptorSets);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001043}
1044
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001045VK_LAYER_EXPORT VkResult VKAPI vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001046{
1047
Chia-I Wu8cd8ecd2015-05-25 16:27:55 +08001048 return nextTable.UpdateDescriptorSets(device, writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001049}
1050
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001051VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(VkDevice device, const VkDynamicVpStateCreateInfo* pCreateInfo, VkDynamicVpState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001052{
1053 char str[1024];
1054 if (!pCreateInfo) {
1055 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicViewportState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001056 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001057 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001058 else if (!vk_validate_vkdynamicvpstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001059 sprintf(str, "Parameter pCreateInfo to function CreateDynamicViewportState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001060 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001061 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001062 VkResult result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001063 return result;
1064}
1065
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001066VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterState(VkDevice device, const VkDynamicRsStateCreateInfo* pCreateInfo, VkDynamicRsState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001067{
1068 char str[1024];
1069 if (!pCreateInfo) {
1070 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicRasterState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001071 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001072 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001073 else if (!vk_validate_vkdynamicrsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001074 sprintf(str, "Parameter pCreateInfo to function CreateDynamicRasterState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001075 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001076 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001077 VkResult result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001078 return result;
1079}
1080
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001081VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState(VkDevice device, const VkDynamicCbStateCreateInfo* pCreateInfo, VkDynamicCbState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001082{
1083 char str[1024];
1084 if (!pCreateInfo) {
1085 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicColorBlendState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001086 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001087 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001088 else if (!vk_validate_vkdynamiccbstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001089 sprintf(str, "Parameter pCreateInfo to function CreateDynamicColorBlendState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001090 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001091 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001092 VkResult result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001093 return result;
1094}
1095
Courtney Goeltzenleuchterfcf855f2015-04-10 16:24:50 -06001096VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState(VkDevice device, const VkDynamicDsStateCreateInfo* pCreateInfo, VkDynamicDsState* pState)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001097{
1098 char str[1024];
1099 if (!pCreateInfo) {
1100 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicDepthStencilState is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001101 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001102 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001103 else if (!vk_validate_vkdynamicdsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001104 sprintf(str, "Parameter pCreateInfo to function CreateDynamicDepthStencilState contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001105 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001106 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001107 VkResult result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001108 return result;
1109}
1110
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001111void PreCreateCommandBuffer(VkDevice device, const VkCmdBufferCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001112{
1113 if(device == nullptr)
1114 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001115 char const str[] = "vkCreateCommandBuffer parameter, VkDevice device, is "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001116 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001117 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001118 return;
1119 }
1120
1121 if(pCreateInfo == nullptr)
1122 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001123 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBufferCreateInfo* pCreateInfo, is "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001124 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001125 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001126 return;
1127 }
1128
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001129 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001130 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001131 char const str[] = "vkCreateCommandBuffer parameter, VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO "\
1132 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001133 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001134 return;
1135 }
1136}
1137
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001138void PostCreateCommandBuffer(VkResult result, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001139{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001140 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001141 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001142 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001143 char const str[] = "vkCreateCommandBuffer failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001144 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001145 return;
1146 }
1147
1148 if(pCmdBuffer == nullptr)
1149 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001150 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBuffer* pCmdBuffer, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001151 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001152 return;
1153 }
1154}
1155
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001156VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(VkDevice device,
1157 const VkCmdBufferCreateInfo* pCreateInfo, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001158{
1159 PreCreateCommandBuffer(device, pCreateInfo);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001160 VkResult result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001161 PostCreateCommandBuffer(result, pCmdBuffer);
1162 return result;
1163}
1164
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001165VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001166{
1167 char str[1024];
1168 if (!pBeginInfo) {
1169 sprintf(str, "Struct ptr parameter pBeginInfo to function BeginCommandBuffer is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001170 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001171 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001172 else if (!vk_validate_vkcmdbufferbegininfo(pBeginInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001173 sprintf(str, "Parameter pBeginInfo to function BeginCommandBuffer contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001174 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001175 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001176 VkResult result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001177 return result;
1178}
1179
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001180VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001181{
1182
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001183 VkResult result = nextTable.EndCommandBuffer(cmdBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001184 return result;
1185}
1186
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001187VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001188{
1189
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001190 VkResult result = nextTable.ResetCommandBuffer(cmdBuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001191 return result;
1192}
1193
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001194VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001195{
1196 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001197 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001198 sprintf(str, "Parameter pipelineBindPoint to function CmdBindPipeline has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001199 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001200 }
1201 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1202}
1203
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001204VK_LAYER_EXPORT void VKAPI vkCmdBindDynamicStateObject(VkCmdBuffer cmdBuffer, VkStateBindPoint stateBindPoint, VkDynamicStateObject state)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001205{
1206 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001207 if (!validate_VkStateBindPoint(stateBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001208 sprintf(str, "Parameter stateBindPoint to function CmdBindDynamicStateObject has invalid value of %i.", (int)stateBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001209 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001210 }
1211 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
1212}
1213
Cody Northrop1a01b1d2015-04-16 13:41:56 -06001214VK_LAYER_EXPORT void VKAPI vkCmdBindDescriptorSets(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t firstSet, uint32_t setCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001215{
1216 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001217 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001218 sprintf(str, "Parameter pipelineBindPoint to function CmdBindDescriptorSets has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001219 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001220 }
Cody Northrop1a01b1d2015-04-16 13:41:56 -06001221 nextTable.CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001222}
1223
Courtney Goeltzenleuchter46962942015-04-16 13:38:46 -06001224VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
1225 VkCmdBuffer cmdBuffer,
1226 uint32_t startBinding,
1227 uint32_t bindingCount,
1228 const VkBuffer* pBuffers,
Tony Barbour8205d902015-04-16 15:59:00 -06001229 const VkDeviceSize* pOffsets)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001230{
Courtney Goeltzenleuchter46962942015-04-16 13:38:46 -06001231 nextTable.CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001232}
1233
Tony Barbour8205d902015-04-16 15:59:00 -06001234VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001235{
1236 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001237 if (!validate_VkIndexType(indexType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001238 sprintf(str, "Parameter indexType to function CmdBindIndexBuffer has invalid value of %i.", (int)indexType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001239 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001240 }
1241 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
1242}
1243
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001244VK_LAYER_EXPORT void VKAPI vkCmdDraw(VkCmdBuffer cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001245{
1246
1247 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
1248}
1249
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001250VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexed(VkCmdBuffer cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001251{
1252
1253 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
1254}
1255
Tony Barbour8205d902015-04-16 15:59:00 -06001256VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001257{
1258
1259 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
1260}
1261
Tony Barbour8205d902015-04-16 15:59:00 -06001262VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001263{
1264
1265 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
1266}
1267
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001268VK_LAYER_EXPORT void VKAPI vkCmdDispatch(VkCmdBuffer cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001269{
1270
1271 nextTable.CmdDispatch(cmdBuffer, x, y, z);
1272}
1273
Tony Barbour8205d902015-04-16 15:59:00 -06001274VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001275{
1276
1277 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
1278}
1279
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001280VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkBuffer destBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001281{
1282 char str[1024];
1283 uint32_t i;
1284 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001285 if (!vk_validate_vkbuffercopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001286 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBuffer contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001287 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001288 }
1289 }
1290 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
1291}
1292
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001293VK_LAYER_EXPORT void VKAPI vkCmdCopyImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageCopy* pRegions)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001294{
1295 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001296 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001297 sprintf(str, "Parameter srcImageLayout to function CmdCopyImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001298 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001299 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001300 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001301 sprintf(str, "Parameter destImageLayout to function CmdCopyImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001302 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001303 }
1304 uint32_t i;
1305 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001306 if (!vk_validate_vkimagecopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001307 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001308 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001309 }
1310 }
1311 nextTable.CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
1312}
1313
Mark Lobodzinski20f68592015-05-22 14:43:25 -05001314VK_LAYER_EXPORT void VKAPI vkCmdBlitImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkTexFilter filter)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001315{
1316 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001317 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001318 sprintf(str, "Parameter srcImageLayout to function CmdBlitImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001319 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001320 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001321 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001322 sprintf(str, "Parameter destImageLayout to function CmdBlitImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001323 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001324 }
1325 uint32_t i;
1326 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001327 if (!vk_validate_vkimageblit(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001328 sprintf(str, "Parameter pRegions[%i] to function CmdBlitImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001329 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001330 }
1331 }
Mark Lobodzinski20f68592015-05-22 14:43:25 -05001332 //TODO: Add additional check for limitation from header rev 96.
1333 // VK_TEX_FILTER_NEAREST if the format that srcImage was created with is an integer-based format.
1334
1335 nextTable.CmdBlitImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001336}
1337
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001338VK_LAYER_EXPORT void VKAPI vkCmdCopyBufferToImage(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001339{
1340 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001341 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001342 sprintf(str, "Parameter destImageLayout to function CmdCopyBufferToImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001343 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001344 }
1345 uint32_t i;
1346 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001347 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001348 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBufferToImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001349 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001350 }
1351 }
1352 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
1353}
1354
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001355VK_LAYER_EXPORT void VKAPI vkCmdCopyImageToBuffer(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer destBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001356{
1357 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001358 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001359 sprintf(str, "Parameter srcImageLayout to function CmdCopyImageToBuffer has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001360 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001361 }
1362 uint32_t i;
1363 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001364 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001365 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImageToBuffer contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001366 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001367 }
1368 }
1369 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
1370}
1371
Tony Barbour8205d902015-04-16 15:59:00 -06001372VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001373{
1374
1375 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
1376}
1377
Tony Barbour8205d902015-04-16 15:59:00 -06001378VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001379{
1380
1381 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
1382}
1383
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -06001384VK_LAYER_EXPORT void VKAPI vkCmdClearColorImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColor* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001385{
1386 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001387 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001388 sprintf(str, "Parameter imageLayout to function CmdClearColorImage has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001389 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001390 }
1391 uint32_t i;
1392 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001393 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001394 sprintf(str, "Parameter pRanges[%i] to function CmdClearColorImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001395 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001396 }
1397 }
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -06001398 nextTable.CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001399}
1400
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001401VK_LAYER_EXPORT void VKAPI vkCmdClearDepthStencil(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001402{
1403 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001404 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001405 sprintf(str, "Parameter imageLayout to function CmdClearDepthStencil has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001406 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001407 }
1408 uint32_t i;
1409 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001410 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001411 sprintf(str, "Parameter pRanges[%i] to function CmdClearDepthStencil contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001412 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001413 }
1414 }
1415 nextTable.CmdClearDepthStencil(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
1416}
1417
Tony Barbour11f74372015-04-13 15:02:52 -06001418VK_LAYER_EXPORT void VKAPI vkCmdResolveImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageResolve* pRegions)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001419{
1420 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001421 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001422 sprintf(str, "Parameter srcImageLayout to function CmdResolveImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001423 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001424 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001425 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001426 sprintf(str, "Parameter destImageLayout to function CmdResolveImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001427 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001428 }
1429 uint32_t i;
Tony Barbour11f74372015-04-13 15:02:52 -06001430 for (i = 0; i < regionCount; i++) {
1431 if (!vk_validate_vkimageresolve(&pRegions[i])) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001432 sprintf(str, "Parameter pRects[%i] to function CmdResolveImage contains an invalid value.", i);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001433 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001434 }
1435 }
Tony Barbour11f74372015-04-13 15:02:52 -06001436 nextTable.CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001437}
1438
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001439VK_LAYER_EXPORT void VKAPI vkCmdSetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001440{
1441 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001442 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001443 sprintf(str, "Parameter pipeEvent to function CmdSetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001444 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001445 }
1446 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
1447}
1448
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001449VK_LAYER_EXPORT void VKAPI vkCmdResetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001450{
1451 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001452 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001453 sprintf(str, "Parameter pipeEvent to function CmdResetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001454 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001455 }
1456 nextTable.CmdResetEvent(cmdBuffer, event, pipeEvent);
1457}
1458
Tony Barbour8205d902015-04-16 15:59:00 -06001459VK_LAYER_EXPORT void VKAPI vkCmdWaitEvents(VkCmdBuffer cmdBuffer, VkWaitEvent waitEvent, uint32_t eventCount, const VkEvent* pEvents, uint32_t memBarrierCount, const void** ppMemBarriers)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001460{
Tony Barbour8205d902015-04-16 15:59:00 -06001461 nextTable.CmdWaitEvents(cmdBuffer, waitEvent, eventCount, pEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001462}
1463
Tony Barbour8205d902015-04-16 15:59:00 -06001464VK_LAYER_EXPORT void VKAPI vkCmdPipelineBarrier(VkCmdBuffer cmdBuffer, VkWaitEvent waitEvent, uint32_t pipeEventCount, const VkPipeEvent* pPipeEvents, uint32_t memBarrierCount, const void** ppMemBarriers)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001465{
Tony Barbour8205d902015-04-16 15:59:00 -06001466 nextTable.CmdPipelineBarrier(cmdBuffer, waitEvent, pipeEventCount, pPipeEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001467}
1468
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001469VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001470{
1471
1472 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
1473}
1474
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001475VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001476{
1477
1478 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
1479}
1480
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001481VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001482{
1483
1484 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
1485}
1486
Tony Barbour8205d902015-04-16 15:59:00 -06001487VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkTimestampType timestampType, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001488{
1489 char str[1024];
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001490 if (!validate_VkTimestampType(timestampType)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001491 sprintf(str, "Parameter timestampType to function CmdWriteTimestamp has invalid value of %i.", (int)timestampType);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001492 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001493 }
1494 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
1495}
1496
Jeremy Hayescf469132015-04-17 10:36:53 -06001497VK_LAYER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(
1498 VkCmdBuffer cmdBuffer,
1499 VkQueryPool queryPool,
1500 uint32_t startQuery,
1501 uint32_t queryCount,
1502 VkBuffer destBuffer,
1503 VkDeviceSize destOffset,
1504 VkDeviceSize destStride,
1505 VkQueryResultFlags flags)
1506{
1507 nextTable.CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, destStride, flags);
1508}
1509
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001510VK_LAYER_EXPORT void VKAPI vkCmdInitAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, const uint32_t* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001511{
1512 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001513 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001514 sprintf(str, "Parameter pipelineBindPoint to function CmdInitAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001515 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001516 }
1517 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
1518}
1519
Tony Barbour8205d902015-04-16 15:59:00 -06001520VK_LAYER_EXPORT void VKAPI vkCmdLoadAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, VkBuffer srcBuffer, VkDeviceSize srcOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001521{
1522 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001523 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001524 sprintf(str, "Parameter pipelineBindPoint to function CmdLoadAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001525 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001526 }
1527 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
1528}
1529
Tony Barbour8205d902015-04-16 15:59:00 -06001530VK_LAYER_EXPORT void VKAPI vkCmdSaveAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001531{
1532 char str[1024];
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001533 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001534 sprintf(str, "Parameter pipelineBindPoint to function CmdSaveAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001535 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001536 }
1537 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
1538}
1539
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001540VK_LAYER_EXPORT VkResult VKAPI vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, VkFramebuffer* pFramebuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001541{
1542 char str[1024];
1543 if (!pCreateInfo) {
1544 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFramebuffer is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001545 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001546 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001547 else if (!vk_validate_vkframebuffercreateinfo(pCreateInfo)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001548 sprintf(str, "Parameter pCreateInfo to function CreateFramebuffer contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001549 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001550 }
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001551 VkResult result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001552 return result;
1553}
1554
1555
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001556void PreCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001557{
1558 if(pCreateInfo == nullptr)
1559 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001560 char const str[] = "vkCreateRenderPass parameter, VkRenderPassCreateInfo* pCreateInfo, is "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001561 "nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001562 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001563 return;
1564 }
1565
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001566 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001567 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001568 char const str[] = "vkCreateRenderPass parameter, VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO "\
1569 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001570 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001571 return;
1572 }
1573
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001574 if(!vk_validate_vkrect(&pCreateInfo->renderArea))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001575 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001576 char const str[] = "vkCreateRenderPass parameter, VkRect pCreateInfo->renderArea, is invalid "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001577 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001578 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001579 return;
1580 }
1581
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001582 if(!vk_validate_vkextent2d(&pCreateInfo->extent))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001583 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001584 char const str[] = "vkCreateRenderPass parameter, VkExtent2D pCreateInfo->extent, is invalid "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001585 "(precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001586 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001587 return;
1588 }
1589
1590 if(pCreateInfo->pColorFormats == nullptr)
1591 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001592 char const str[] = "vkCreateRenderPass parameter, VkFormat* pCreateInfo->pColorFormats, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001593 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001594 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001595 return;
1596 }
1597
1598 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1599 {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001600 if(!validate_VkFormat(pCreateInfo->pColorFormats[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001601 {
1602 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001603 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001604 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001605 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001606 continue;
1607 }
1608
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001609 VkFormatProperties properties;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001610 size_t size = sizeof(properties);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001611 VkResult result = nextTable.GetFormatInfo(device, pCreateInfo->pColorFormats[i],
Tony Barbour8205d902015-04-16 15:59:00 -06001612 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001613 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001614 {
1615 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001616 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001617 "], cannot be validated (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001618 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001619 continue;
1620 }
1621
1622 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1623 {
1624 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001625 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001626 "], contains unsupported format (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001627 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001628 continue;
1629 }
1630
1631 }
1632
1633 if(pCreateInfo->pColorLayouts == nullptr)
1634 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001635 char const str[] = "vkCreateRenderPass parameter, VkImageLayout* pCreateInfo->pColorLayouts, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001636 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001637 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001638 return;
1639 }
1640
1641 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1642 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001643 if(!validate_VkImageLayout(pCreateInfo->pColorLayouts[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001644 {
1645 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001646 ss << "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pColorLayouts[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001647 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001648 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001649 continue;
1650 }
1651 }
1652
1653 if(pCreateInfo->pColorLoadOps == nullptr)
1654 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001655 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp* pCreateInfo->pColorLoadOps, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001656 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001657 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001658 return;
1659 }
1660
1661 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1662 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001663 if(!validate_VkAttachmentLoadOp(pCreateInfo->pColorLoadOps[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001664 {
1665 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001666 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pColorLoadOps[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001667 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001668 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001669 continue;
1670 }
1671 }
1672
1673 if(pCreateInfo->pColorStoreOps == nullptr)
1674 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001675 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp* pCreateInfo->pColorStoreOps, "\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001676 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001677 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001678 return;
1679 }
1680
1681 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1682 {
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001683 if(!validate_VkAttachmentStoreOp(pCreateInfo->pColorStoreOps[i]))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001684 {
1685 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001686 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pColorStoreOps[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001687 "], is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001688 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001689 continue;
1690 }
1691 }
1692
1693 if(pCreateInfo->pColorLoadClearValues == nullptr)
1694 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001695 char const str[] = "vkCreateRenderPass parameter, VkClearColor* pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001696 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001697 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001698 return;
1699 }
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001700
1701 if(pCreateInfo->pColorStoreOps == nullptr)
1702 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001703 char const str[] = "vkCreateRenderPass parameter, VK_ATTACHMENT_STORE_OP* pCreateInfo->pColorStoreOps, "\
Jeremy Hayes9bafb9f2015-04-07 13:38:03 -06001704 "is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001705 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001706 return;
1707 }
1708
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001709 if(pCreateInfo->pColorLoadClearValues == nullptr)
1710 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001711 char const str[] = "vkCreateRenderPass parameter, VK_CLEAR_COLOR* pCreateInfo->"\
Jeremy Hayes9bafb9f2015-04-07 13:38:03 -06001712 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001713 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayes6b7060b2015-04-07 09:49:05 -06001714 return;
1715 }
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001716
1717 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1718 {
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001719 if(!vk_validate_vkclearcolor(&(pCreateInfo->pColorLoadClearValues[i])))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001720 {
1721 std::stringstream ss;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001722 ss << "vkCreateRenderPass parameter, VkClearColor pCreateInfo->pColorLoadClearValues[" << i <<
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001723 "], is invalid (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001724 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001725 continue;
1726 }
1727 }
1728
Courtney Goeltzenleuchter33318172015-04-10 17:06:20 -06001729 if(!validate_VkFormat(pCreateInfo->depthStencilFormat))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001730 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001731 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001732 "depthStencilFormat, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001733 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001734 return;
1735 }
1736
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001737 VkFormatProperties properties;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001738 size_t size = sizeof(properties);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001739 VkResult result = nextTable.GetFormatInfo(device, pCreateInfo->depthStencilFormat,
Tony Barbour8205d902015-04-16 15:59:00 -06001740 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001741 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001742 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001743 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001744 "depthStencilFormat, cannot be validated (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001745 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001746 return;
1747 }
1748
1749 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1750 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001751 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001752 "depthStencilFormat, contains unsupported format (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001753 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001754 return;
1755 }
1756
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001757 if(!validate_VkImageLayout(pCreateInfo->depthStencilLayout))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001758 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001759 char const str[] = "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001760 "depthStencilLayout, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001761 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001762 return;
1763 }
1764
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001765 if(!validate_VkAttachmentLoadOp(pCreateInfo->depthLoadOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001766 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001767 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001768 "depthLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001769 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001770 return;
1771 }
1772
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001773 if(!validate_VkAttachmentStoreOp(pCreateInfo->depthStoreOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001774 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001775 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001776 "depthStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001777 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001778 return;
1779 }
1780
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001781 if(!validate_VkAttachmentLoadOp(pCreateInfo->stencilLoadOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001782 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001783 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001784 "stencilLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001785 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001786 return;
1787 }
1788
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001789 if(!validate_VkAttachmentStoreOp(pCreateInfo->stencilStoreOp))
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001790 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001791 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001792 "stencilStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001793 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001794 return;
1795 }
1796}
1797
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001798void PostCreateRenderPass(VkResult result, VkRenderPass* pRenderPass)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001799{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001800 if(result != VK_SUCCESS)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001801 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001802 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001803 char const str[] = "vkCreateRenderPass failed (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001804 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001805 return;
1806 }
1807
1808 if(pRenderPass == nullptr)
1809 {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001810 char const str[] = "vkCreateRenderPass parameter, VkRenderPass* pRenderPass, is nullptr (postcondition).";
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001811 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001812 return;
1813 }
1814}
1815
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001816VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, VkRenderPass* pRenderPass)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001817{
1818 PreCreateRenderPass(device, pCreateInfo);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001819 VkResult result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001820 PostCreateRenderPass(result, pRenderPass);
1821 return result;
1822}
1823
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001824VK_LAYER_EXPORT void VKAPI vkCmdBeginRenderPass(VkCmdBuffer cmdBuffer, const VkRenderPassBegin* pRenderPassBegin)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001825{
1826 char str[1024];
1827 if (!pRenderPassBegin) {
1828 sprintf(str, "Struct ptr parameter pRenderPassBegin to function CmdBeginRenderPass is NULL.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001829 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001830 }
Courtney Goeltzenleuchterdfd1b2a2015-04-15 00:14:36 -06001831 else if (!vk_validate_vkrenderpassbegin(pRenderPassBegin)) {
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001832 sprintf(str, "Parameter pRenderPassBegin to function CmdBeginRenderPass contains an invalid value.");
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001833 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001834 }
1835 nextTable.CmdBeginRenderPass(cmdBuffer, pRenderPassBegin);
1836}
1837
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001838VK_LAYER_EXPORT void VKAPI vkCmdEndRenderPass(VkCmdBuffer cmdBuffer, VkRenderPass renderPass)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001839{
1840
1841 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
1842}
1843
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001844VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback(
1845 VkInstance instance,
1846 VkFlags msgFlags,
1847 const PFN_vkDbgMsgCallback pfnMsgCallback,
1848 void* pUserData,
1849 VkDbgMsgCallback* pMsgCallback)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001850{
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -06001851 return layer_create_msg_callback(instance, &nextInstanceTable, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001852}
1853
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001854VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerBegin(VkCmdBuffer cmdBuffer, const char* pMarker)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001855{
Jon Ashburnf0615e22015-05-25 14:11:37 -06001856 //VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) cmdBuffer;
1857 VkLayerDebugMarkerDispatchTable *pTable = &nextDebugMarkerTable;
1858 if (!pTable->ext_enabled) {
1859 char const str[] = "Attempt to use CmdDbgMarkerBegin but extension disabled!";
1860 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1861 }
1862 nextDebugMarkerTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001863}
1864
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001865VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerEnd(VkCmdBuffer cmdBuffer)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001866{
Jon Ashburnf0615e22015-05-25 14:11:37 -06001867 //VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) cmdBuffer;
1868 VkLayerDebugMarkerDispatchTable *pTable = &nextDebugMarkerTable;
1869 if (!pTable->ext_enabled) {
1870 char const str[] = "Attempt to use CmdDbgMarkerEnd but extension disabled!";
1871 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1872 }
1873 nextDebugMarkerTable.CmdDbgMarkerEnd(cmdBuffer);
1874}
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001875
Jon Ashburnf0615e22015-05-25 14:11:37 -06001876VkResult VKAPI vkDbgSetObjectTag(VkDevice device, VkObjectType objType, VkObject object, size_t tagSize, const void* pTag)
1877{
1878 //VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) cmdBuffer;
1879 VkLayerDebugMarkerDispatchTable *pTable = &nextDebugMarkerTable;
1880 if (!pTable->ext_enabled) {
1881 char const str[] = "Attempt to use DbgSetObjectTag but extension disabled!";
1882 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1883 }
1884 nextDebugMarkerTable.DbgSetObjectTag(device, objType, object, tagSize, pTag);
1885}
1886
1887VkResult VKAPI vkDbgSetObjectName(VkDevice device, VkObjectType objType, VkObject object, size_t nameSize, const char* pName)
1888{
1889 //VkLayerDebugMarkerDispatchTable *pDisp = *(VkLayerDebugMarkerDispatchTable **) cmdBuffer;
1890 VkLayerDebugMarkerDispatchTable *pTable = &nextDebugMarkerTable;
1891 if (!pTable->ext_enabled) {
1892 char const str[] = "Attempt to use DbgSetObjectName but extension disabled!";
1893 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
1894 }
1895 nextDebugMarkerTable.DbgSetObjectName(device, objType, object, nameSize, pName);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001896}
1897
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001898VK_LAYER_EXPORT VkResult VKAPI vkGetDisplayInfoWSI(VkDisplayWSI display, VkDisplayInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001899{
Jon Ashburn2666e2f2015-05-15 15:09:35 -06001900 VkResult result = nextInstanceTable.GetDisplayInfoWSI(display, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001901 return result;
1902}
1903
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001904VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI(VkDevice device, const VkSwapChainCreateInfoWSI* pCreateInfo, VkSwapChainWSI* pSwapChain)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001905{
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001906 VkResult result = nextTable.CreateSwapChainWSI(device, pCreateInfo, pSwapChain);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001907 return result;
1908}
1909
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001910VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapChainWSI(VkSwapChainWSI swapChain)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001911{
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001912 VkResult result = nextTable.DestroySwapChainWSI(swapChain);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001913 return result;
1914}
1915
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001916VK_LAYER_EXPORT VkResult VKAPI vkGetSwapChainInfoWSI(VkSwapChainWSI swapChain, VkSwapChainInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001917{
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001918 VkResult result = nextTable.GetSwapChainInfoWSI(swapChain, infoType, pDataSize, pData);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001919 return result;
1920}
1921
Chia-I Wu5b66aa52015-04-16 22:02:10 +08001922VK_LAYER_EXPORT VkResult VKAPI vkQueuePresentWSI(VkQueue queue, const VkPresentInfoWSI* pPresentInfo)
1923{
1924 VkResult result = nextTable.QueuePresentWSI(queue, pPresentInfo);
1925 return result;
1926}
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06001927
Jon Ashburn79b78ac2015-05-05 14:22:52 -06001928static inline void* layer_intercept_proc(const char *name)
1929{
1930 if (!name || name[0] != 'v' || name[1] != 'k')
1931 return NULL;
1932
1933 name += 2;
Jon Ashburn1245cec2015-05-18 13:20:15 -06001934 if (!strcmp(name, "GetDeviceProcAddr"))
1935 return (void*) vkGetDeviceProcAddr;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06001936 if (!strcmp(name, "DestroyDevice"))
1937 return (void*) vkDestroyDevice;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06001938 if (!strcmp(name, "GetDeviceQueue"))
1939 return (void*) vkGetDeviceQueue;
1940 if (!strcmp(name, "QueueSubmit"))
1941 return (void*) vkQueueSubmit;
1942 if (!strcmp(name, "QueueWaitIdle"))
1943 return (void*) vkQueueWaitIdle;
1944 if (!strcmp(name, "DeviceWaitIdle"))
1945 return (void*) vkDeviceWaitIdle;
1946 if (!strcmp(name, "AllocMemory"))
1947 return (void*) vkAllocMemory;
1948 if (!strcmp(name, "FreeMemory"))
1949 return (void*) vkFreeMemory;
1950 if (!strcmp(name, "SetMemoryPriority"))
1951 return (void*) vkSetMemoryPriority;
1952 if (!strcmp(name, "MapMemory"))
1953 return (void*) vkMapMemory;
1954 if (!strcmp(name, "UnmapMemory"))
1955 return (void*) vkUnmapMemory;
1956 if (!strcmp(name, "FlushMappedMemoryRanges"))
1957 return (void*) vkFlushMappedMemoryRanges;
1958 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
1959 return (void*) vkInvalidateMappedMemoryRanges;
1960 if (!strcmp(name, "PinSystemMemory"))
1961 return (void*) vkPinSystemMemory;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06001962 if (!strcmp(name, "OpenSharedMemory"))
1963 return (void*) vkOpenSharedMemory;
1964 if (!strcmp(name, "OpenSharedSemaphore"))
1965 return (void*) vkOpenSharedSemaphore;
1966 if (!strcmp(name, "OpenPeerMemory"))
1967 return (void*) vkOpenPeerMemory;
1968 if (!strcmp(name, "OpenPeerImage"))
1969 return (void*) vkOpenPeerImage;
1970 if (!strcmp(name, "DestroyObject"))
1971 return (void*) vkDestroyObject;
1972 if (!strcmp(name, "GetObjectInfo"))
1973 return (void*) vkGetObjectInfo;
1974 if (!strcmp(name, "CreateFence"))
1975 return (void*) vkCreateFence;
1976 if (!strcmp(name, "ResetFences"))
1977 return (void*) vkResetFences;
1978 if (!strcmp(name, "GetFenceStatus"))
1979 return (void*) vkGetFenceStatus;
1980 if (!strcmp(name, "WaitForFences"))
1981 return (void*) vkWaitForFences;
1982 if (!strcmp(name, "CreateSemaphore"))
1983 return (void*) vkCreateSemaphore;
1984 if (!strcmp(name, "QueueSignalSemaphore"))
1985 return (void*) vkQueueSignalSemaphore;
1986 if (!strcmp(name, "QueueWaitSemaphore"))
1987 return (void*) vkQueueWaitSemaphore;
1988 if (!strcmp(name, "CreateEvent"))
1989 return (void*) vkCreateEvent;
1990 if (!strcmp(name, "GetEventStatus"))
1991 return (void*) vkGetEventStatus;
1992 if (!strcmp(name, "SetEvent"))
1993 return (void*) vkSetEvent;
1994 if (!strcmp(name, "ResetEvent"))
1995 return (void*) vkResetEvent;
1996 if (!strcmp(name, "CreateQueryPool"))
1997 return (void*) vkCreateQueryPool;
1998 if (!strcmp(name, "GetQueryPoolResults"))
1999 return (void*) vkGetQueryPoolResults;
2000 if (!strcmp(name, "GetFormatInfo"))
2001 return (void*) vkGetFormatInfo;
2002 if (!strcmp(name, "CreateBuffer"))
2003 return (void*) vkCreateBuffer;
2004 if (!strcmp(name, "CreateBufferView"))
2005 return (void*) vkCreateBufferView;
2006 if (!strcmp(name, "CreateImage"))
2007 return (void*) vkCreateImage;
2008 if (!strcmp(name, "GetImageSubresourceInfo"))
2009 return (void*) vkGetImageSubresourceInfo;
2010 if (!strcmp(name, "CreateImageView"))
2011 return (void*) vkCreateImageView;
2012 if (!strcmp(name, "CreateColorAttachmentView"))
2013 return (void*) vkCreateColorAttachmentView;
2014 if (!strcmp(name, "CreateDepthStencilView"))
2015 return (void*) vkCreateDepthStencilView;
2016 if (!strcmp(name, "CreateShader"))
2017 return (void*) vkCreateShader;
2018 if (!strcmp(name, "CreateGraphicsPipeline"))
2019 return (void*) vkCreateGraphicsPipeline;
2020 if (!strcmp(name, "CreateGraphicsPipelineDerivative"))
2021 return (void*) vkCreateGraphicsPipelineDerivative;
2022 if (!strcmp(name, "CreateComputePipeline"))
2023 return (void*) vkCreateComputePipeline;
2024 if (!strcmp(name, "StorePipeline"))
2025 return (void*) vkStorePipeline;
2026 if (!strcmp(name, "LoadPipeline"))
2027 return (void*) vkLoadPipeline;
2028 if (!strcmp(name, "LoadPipelineDerivative"))
2029 return (void*) vkLoadPipelineDerivative;
2030 if (!strcmp(name, "CreatePipelineLayout"))
2031 return (void*) vkCreatePipelineLayout;
2032 if (!strcmp(name, "CreateSampler"))
2033 return (void*) vkCreateSampler;
2034 if (!strcmp(name, "CreateDescriptorSetLayout"))
2035 return (void*) vkCreateDescriptorSetLayout;
2036 if (!strcmp(name, "CreateDescriptorPool"))
2037 return (void*) vkCreateDescriptorPool;
2038 if (!strcmp(name, "ResetDescriptorPool"))
2039 return (void*) vkResetDescriptorPool;
2040 if (!strcmp(name, "AllocDescriptorSets"))
2041 return (void*) vkAllocDescriptorSets;
2042 if (!strcmp(name, "ClearDescriptorSets"))
2043 return (void*) vkClearDescriptorSets;
2044 if (!strcmp(name, "CreateDynamicViewportState"))
2045 return (void*) vkCreateDynamicViewportState;
2046 if (!strcmp(name, "CreateDynamicRasterState"))
2047 return (void*) vkCreateDynamicRasterState;
2048 if (!strcmp(name, "CreateDynamicColorBlendState"))
2049 return (void*) vkCreateDynamicColorBlendState;
2050 if (!strcmp(name, "CreateDynamicDepthStencilState"))
2051 return (void*) vkCreateDynamicDepthStencilState;
2052 if (!strcmp(name, "CreateCommandBuffer"))
2053 return (void*) vkCreateCommandBuffer;
2054 if (!strcmp(name, "BeginCommandBuffer"))
2055 return (void*) vkBeginCommandBuffer;
2056 if (!strcmp(name, "EndCommandBuffer"))
2057 return (void*) vkEndCommandBuffer;
2058 if (!strcmp(name, "ResetCommandBuffer"))
2059 return (void*) vkResetCommandBuffer;
2060 if (!strcmp(name, "CmdBindPipeline"))
2061 return (void*) vkCmdBindPipeline;
2062 if (!strcmp(name, "CmdBindDynamicStateObject"))
2063 return (void*) vkCmdBindDynamicStateObject;
2064 if (!strcmp(name, "CmdBindDescriptorSets"))
2065 return (void*) vkCmdBindDescriptorSets;
2066 if (!strcmp(name, "CmdBindVertexBuffers"))
2067 return (void*) vkCmdBindVertexBuffers;
2068 if (!strcmp(name, "CmdBindIndexBuffer"))
2069 return (void*) vkCmdBindIndexBuffer;
2070 if (!strcmp(name, "CmdDraw"))
2071 return (void*) vkCmdDraw;
2072 if (!strcmp(name, "CmdDrawIndexed"))
2073 return (void*) vkCmdDrawIndexed;
2074 if (!strcmp(name, "CmdDrawIndirect"))
2075 return (void*) vkCmdDrawIndirect;
2076 if (!strcmp(name, "CmdDrawIndexedIndirect"))
2077 return (void*) vkCmdDrawIndexedIndirect;
2078 if (!strcmp(name, "CmdDispatch"))
2079 return (void*) vkCmdDispatch;
2080 if (!strcmp(name, "CmdDispatchIndirect"))
2081 return (void*) vkCmdDispatchIndirect;
2082 if (!strcmp(name, "CmdCopyBuffer"))
2083 return (void*) vkCmdCopyBuffer;
2084 if (!strcmp(name, "CmdCopyImage"))
2085 return (void*) vkCmdCopyImage;
2086 if (!strcmp(name, "CmdBlitImage"))
2087 return (void*) vkCmdBlitImage;
2088 if (!strcmp(name, "CmdCopyBufferToImage"))
2089 return (void*) vkCmdCopyBufferToImage;
2090 if (!strcmp(name, "CmdCopyImageToBuffer"))
2091 return (void*) vkCmdCopyImageToBuffer;
2092 if (!strcmp(name, "CmdUpdateBuffer"))
2093 return (void*) vkCmdUpdateBuffer;
2094 if (!strcmp(name, "CmdFillBuffer"))
2095 return (void*) vkCmdFillBuffer;
2096 if (!strcmp(name, "CmdClearColorImage"))
2097 return (void*) vkCmdClearColorImage;
2098 if (!strcmp(name, "CmdClearDepthStencil"))
2099 return (void*) vkCmdClearDepthStencil;
2100 if (!strcmp(name, "CmdResolveImage"))
2101 return (void*) vkCmdResolveImage;
2102 if (!strcmp(name, "CmdSetEvent"))
2103 return (void*) vkCmdSetEvent;
2104 if (!strcmp(name, "CmdResetEvent"))
2105 return (void*) vkCmdResetEvent;
2106 if (!strcmp(name, "CmdWaitEvents"))
2107 return (void*) vkCmdWaitEvents;
2108 if (!strcmp(name, "CmdPipelineBarrier"))
2109 return (void*) vkCmdPipelineBarrier;
2110 if (!strcmp(name, "CmdBeginQuery"))
2111 return (void*) vkCmdBeginQuery;
2112 if (!strcmp(name, "CmdEndQuery"))
2113 return (void*) vkCmdEndQuery;
2114 if (!strcmp(name, "CmdResetQueryPool"))
2115 return (void*) vkCmdResetQueryPool;
2116 if (!strcmp(name, "CmdWriteTimestamp"))
2117 return (void*) vkCmdWriteTimestamp;
2118 if (!strcmp(name, "CmdCopyQueryPoolResults"))
2119 return (void*) vkCmdCopyQueryPoolResults;
2120 if (!strcmp(name, "CmdInitAtomicCounters"))
2121 return (void*) vkCmdInitAtomicCounters;
2122 if (!strcmp(name, "CmdLoadAtomicCounters"))
2123 return (void*) vkCmdLoadAtomicCounters;
2124 if (!strcmp(name, "CmdSaveAtomicCounters"))
2125 return (void*) vkCmdSaveAtomicCounters;
2126 if (!strcmp(name, "CreateFramebuffer"))
2127 return (void*) vkCreateFramebuffer;
2128 if (!strcmp(name, "CreateRenderPass"))
2129 return (void*) vkCreateRenderPass;
2130 if (!strcmp(name, "CmdBeginRenderPass"))
2131 return (void*) vkCmdBeginRenderPass;
2132 if (!strcmp(name, "CmdEndRenderPass"))
2133 return (void*) vkCmdEndRenderPass;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002134 if (!strcmp(name, "CmdDbgMarkerBegin"))
2135 return (void*) vkCmdDbgMarkerBegin;
2136 if (!strcmp(name, "CmdDbgMarkerEnd"))
2137 return (void*) vkCmdDbgMarkerEnd;
2138 if (!strcmp(name, "GetDisplayInfoWSI"))
2139 return (void*) vkGetDisplayInfoWSI;
2140 if (!strcmp(name, "CreateSwapChainWSI"))
2141 return (void*) vkCreateSwapChainWSI;
2142 if (!strcmp(name, "DestroySwapChainWSI"))
2143 return (void*) vkDestroySwapChainWSI;
2144 if (!strcmp(name, "GetSwapChainInfoWSI"))
2145 return (void*) vkGetSwapChainInfoWSI;
2146 if (!strcmp(name, "QueuePresentWSI"))
2147 return (void*) vkQueuePresentWSI;
2148
2149 return NULL;
2150}
2151
2152static inline void* layer_intercept_instance_proc(const char *name)
2153{
2154 if (!name || name[0] != 'v' || name[1] != 'k')
2155 return NULL;
2156
2157 name += 2;
2158 if (!strcmp(name, "GetInstanceProcAddr"))
2159 return (void*) vkGetInstanceProcAddr;
2160 if (!strcmp(name, "CreateInstance"))
2161 return (void*) vkCreateInstance;
2162 if (!strcmp(name, "DestroyInstance"))
2163 return (void*) vkDestroyInstance;
2164 if (!strcmp(name, "GetPhysicalDeviceInfo"))
2165 return (void*) vkGetPhysicalDeviceInfo;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002166 if (!strcmp(name, "CreateDevice"))
2167 return (void*) vkCreateDevice;
2168 if (!strcmp(name, "GetGlobalExtensionInfo"))
2169 return (void*) vkGetGlobalExtensionInfo;
2170 if (!strcmp(name, "GetPhysicalDeviceExtensionInfo"))
2171 return (void*) vkGetPhysicalDeviceExtensionInfo;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002172 if (!strcmp(name, "GetMultiDeviceCompatibility"))
2173 return (void*) vkGetMultiDeviceCompatibility;
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002174
2175 return NULL;
2176}
2177
Jon Ashburn1245cec2015-05-18 13:20:15 -06002178VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002179{
Jon Ashburn1245cec2015-05-18 13:20:15 -06002180 VkBaseLayerObject* devw = (VkBaseLayerObject *) device;
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002181 void* addr;
Jon Ashburn1245cec2015-05-18 13:20:15 -06002182 if (device == NULL)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002183 return NULL;
Jon Ashburn1245cec2015-05-18 13:20:15 -06002184 pCurObj = devw;
Jon Ashburnd9564002015-05-07 10:27:37 -06002185 loader_platform_thread_once(&initOnce, initParamChecker);
2186 loader_platform_thread_once(&tabDeviceOnce, initDeviceTable);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002187
2188 addr = layer_intercept_proc(funcName);
2189 if (addr)
2190 return addr;
2191 else {
Jon Ashburn1245cec2015-05-18 13:20:15 -06002192 if (devw->pGPA == NULL)
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002193 return NULL;
Jon Ashburn1245cec2015-05-18 13:20:15 -06002194 return devw->pGPA((VkObject)devw->nextObject, funcName);
Jeremy Hayesc6cfa572015-04-06 13:46:11 -06002195 }
2196}
2197
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002198VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr(VkInstance inst, const char* funcName)
2199{
2200 VkBaseLayerObject* instw = (VkBaseLayerObject *) inst;
2201 void* addr;
2202 if (inst == NULL)
2203 return NULL;
Jon Ashburnd9564002015-05-07 10:27:37 -06002204 pCurObj = instw;
2205 loader_platform_thread_once(&initOnce, initParamChecker);
2206 loader_platform_thread_once(&tabInstanceOnce, initInstanceTable);
Jon Ashburn79b78ac2015-05-05 14:22:52 -06002207
2208 addr = layer_intercept_instance_proc(funcName);
2209 if (addr)
2210 return addr;
2211 else {
2212 if (instw->pGPA == NULL)
2213 return NULL;
2214 return instw->pGPA((VkObject)instw->nextObject, funcName);
2215 }
2216}