blob: 8fdcb8d60699a6175c3ae0cc3a793a55087e67b6 [file] [log] [blame]
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001/*
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002 * Vulkan
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28
29#include <iostream>
30#include <string>
31#include <sstream>
32
33#include "loader_platform.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060034#include "vkLayer.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060035#include "layers_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060036#include "vk_enum_validate_helper.h"
37#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060038//The following is #included again to catch certain OS-specific functions being used:
39#include "loader_platform.h"
40
41#include "layers_msg.h"
42
Jon Ashburnbacb0f52015-04-06 10:58:22 -060043static VkLayerDispatchTable nextTable;
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060044static VkLayerInstanceDispatchTable nextInstanceTable;
Jon Ashburnbacb0f52015-04-06 10:58:22 -060045static VkBaseLayerObject *pCurObj;
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060046static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(initOnce);
47static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(tabDeviceOnce);
48static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(tabInstanceOnce);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060049
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060050#include "vk_dispatch_table_helper.h"
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060051
52// TODO handle multiple GPUs/instances for both instance and device dispatch tables
53static void initDeviceTable(void)
54{
Jon Ashburn8d1b0b52015-05-18 13:20:15 -060055 PFN_vkGetDeviceProcAddr fpNextGPA;
56 fpNextGPA = (PFN_vkGetDeviceProcAddr) pCurObj->pGPA;
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060057 assert(fpNextGPA);
Jon Ashburn8d1b0b52015-05-18 13:20:15 -060058 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkDevice) pCurObj->nextObject);
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060059}
60
61static void initInstanceTable(void)
62{
63 PFN_vkGetInstanceProcAddr fpNextGPA;
64 fpNextGPA = (PFN_vkGetInstanceProcAddr) pCurObj->pGPA;
65 assert(fpNextGPA);
66 layer_init_instance_dispatch_table(&nextInstanceTable, fpNextGPA, (VkInstance) pCurObj->nextObject);
67}
68
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060069static void initParamChecker(void)
70{
71
72 const char *strOpt;
73 // initialize ParamChecker options
74 getLayerOptionEnum("ParamCheckerReportLevel", (uint32_t *) &g_reportingLevel);
75 g_actionIsDefault = getLayerOptionEnum("ParamCheckerDebugAction", (uint32_t *) &g_debugAction);
76
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060077 if (g_debugAction & VK_DBG_LAYER_ACTION_LOG_MSG)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060078 {
79 strOpt = getLayerOption("ParamCheckerLogFilename");
80 if (strOpt)
81 {
82 g_logFile = fopen(strOpt, "w");
83 }
84 if (g_logFile == NULL)
85 g_logFile = stdout;
86 }
87
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060088}
89
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -060090void PreCreateInstance(const VkApplicationInfo* pAppInfo, const VkAllocCallbacks* pAllocCb)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060091{
92 if(pAppInfo == nullptr)
93 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -060094 char const str[] = "vkCreateInstance parameter, VkApplicationInfo* pAppInfo, is "\
Mike Stroyan1c8d4d82015-04-06 15:24:46 -060095 "nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060096 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060097 return;
98 }
99
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600100 if(pAppInfo->sType != VK_STRUCTURE_TYPE_APPLICATION_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600101 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600102 char const str[] = "vkCreateInstance parameter, VK_STRUCTURE_TYPE_APPLICATION_INFO "\
103 "pAppInfo->sType, is not VK_STRUCTURE_TYPE_APPLICATION_INFO (precondition).";
104 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600105 return;
106 }
107
108 // TODO: What else can validated in pAppInfo?
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600109 // TODO: VK_API_VERSION validation.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600110
111 // It's okay if pAllocCb is a nullptr.
112 if(pAllocCb != nullptr)
113 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600114 if(!vk_validate_vkalloccallbacks(pAllocCb))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600115 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600116 char const str[] = "vkCreateInstance parameter, VkAllocCallbacks* pAllocCb, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600117 "contains an invalid value (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600118 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600119 return;
120 }
121 }
122}
123
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600124void PostCreateInstance(VkResult result, VkInstance* pInstance)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600125{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600126 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600127 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600128 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600129 char const str[] = "vkCreateInstance failed (postcondition).";
130 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600131 return;
132 }
133
134 if(pInstance == nullptr)
135 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600136 char const str[] = "vkCreateInstance parameter, VkInstance* pInstance, is nullptr "\
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600137 "(postcondition).";
138 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600139 return;
140 }
141}
142
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600143VK_LAYER_EXPORT VkResult VKAPI vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600144{
Jon Ashburnb317fad2015-04-04 14:52:07 -0600145 PreCreateInstance(pCreateInfo->pAppInfo, pCreateInfo->pAllocCb);
Jon Ashburn71836d92015-05-12 17:23:55 -0600146 VkResult result = nextInstanceTable.CreateInstance(pCreateInfo, pInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600147 PostCreateInstance(result, pInstance);
148 return result;
149}
150
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600151VK_LAYER_EXPORT VkResult VKAPI vkDestroyInstance(VkInstance instance)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600152{
153
Jon Ashburn71836d92015-05-12 17:23:55 -0600154 VkResult result = nextInstanceTable.DestroyInstance(instance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600155 return result;
156}
157
Tony Barbourd1c35722015-04-16 15:59:00 -0600158VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceInfo(VkPhysicalDevice gpu, VkPhysicalDeviceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600159{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600160 char str[1024];
Tony Barbourd1c35722015-04-16 15:59:00 -0600161 if (!validate_VkPhysicalDeviceInfoType(infoType)) {
162 sprintf(str, "Parameter infoType to function GetPhysicalDeviceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600163 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600164 }
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600165 VkResult result = nextInstanceTable.GetPhysicalDeviceInfo(gpu, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600166 return result;
167}
168
Tony Barbourd1c35722015-04-16 15:59:00 -0600169void PreCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600170{
171 if(gpu == nullptr)
172 {
Tony Barbourd1c35722015-04-16 15:59:00 -0600173 char const str[] = "vkCreateDevice parameter, VkPhysicalDevice gpu, is nullptr "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600174 "(precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600175 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600176 return;
177 }
178
179 if(pCreateInfo == nullptr)
180 {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600181 char const str[] = "vkCreateDevice parameter, VkDeviceCreateInfo* pCreateInfo, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600182 "nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600183 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600184 return;
185 }
186
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600187 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600188 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600189 char const str[] = "vkCreateDevice parameter, VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO "\
190 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO (precondition).";
191 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600192 return;
193 }
194
195 if(pCreateInfo->queueRecordCount == 0)
196 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600197 char const str[] = "vkCreateDevice parameter, uint32_t pCreateInfo->queueRecordCount, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600198 "zero (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600199 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600200 return;
201 }
202
203 if(pCreateInfo->pRequestedQueues == nullptr)
204 {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600205 char const str[] = "vkCreateDevice parameter, VkDeviceQueueCreateInfo* pCreateInfo->pRequestedQueues, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600206 "nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600207 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600208 return;
209 }
210
211 for(uint32_t i = 0; i < pCreateInfo->queueRecordCount; ++i)
212 {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600213 if(!vk_validate_vkdevicequeuecreateinfo(&(pCreateInfo->pRequestedQueues[i])))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600214 {
215 std::stringstream ss;
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600216 ss << "vkCreateDevice parameter, VkDeviceQueueCreateInfo pCreateInfo->pRequestedQueues[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600217 "], is invalid (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600218 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600219 continue;
220 }
221 }
222
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600223}
224
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600225void PostCreateDevice(VkResult result, VkDevice* pDevice)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600226{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600227 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600228 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600229 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600230 char const str[] = "vkCreateDevice failed (postcondition).";
231 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600232 return;
233 }
234
235 if(pDevice == nullptr)
236 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600237 char const str[] = "vkCreateDevice parameter, VkDevice* pDevice, is nullptr (postcondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600238 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600239 return;
240 }
241}
242
Tony Barbourd1c35722015-04-16 15:59:00 -0600243VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600244{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600245 PreCreateDevice(gpu, pCreateInfo);
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600246 VkResult result = nextInstanceTable.CreateDevice(gpu, pCreateInfo, pDevice);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600247 PostCreateDevice(result, pDevice);
248 return result;
249}
250
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600251VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice(VkDevice device)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600252{
253
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600254 VkResult result = nextTable.DestroyDevice(device);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600255 return result;
256}
257
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600258struct extProps {
259 uint32_t version;
260 const char * const name;
261};
262
Jon Ashburn120cfbe2015-04-14 14:12:59 -0600263#define PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE 2
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600264static const struct extProps pcExts[PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE] = {
265 // TODO what is the version?
266 0x10, "ParamChecker",
Jon Ashburn120cfbe2015-04-14 14:12:59 -0600267 0x10, "Validation",
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600268};
269
270VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo(
271 VkExtensionInfoType infoType,
272 uint32_t extensionIndex,
273 size_t* pDataSize,
274 void* pData)
275{
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600276 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
277 VkExtensionProperties *ext_props;
278 uint32_t *count;
279
280 if (pDataSize == NULL)
281 return VK_ERROR_INVALID_POINTER;
282
283 switch (infoType) {
284 case VK_EXTENSION_INFO_TYPE_COUNT:
285 *pDataSize = sizeof(uint32_t);
286 if (pData == NULL)
287 return VK_SUCCESS;
288 count = (uint32_t *) pData;
289 *count = PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE;
290 break;
291 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
292 *pDataSize = sizeof(VkExtensionProperties);
293 if (pData == NULL)
294 return VK_SUCCESS;
295 if (extensionIndex >= PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE)
296 return VK_ERROR_INVALID_VALUE;
297 ext_props = (VkExtensionProperties *) pData;
298 ext_props->version = pcExts[extensionIndex].version;
299 strncpy(ext_props->extName, pcExts[extensionIndex].name,
300 VK_MAX_EXTENSION_NAME);
301 ext_props->extName[VK_MAX_EXTENSION_NAME - 1] = '\0';
302 break;
303 default:
304 return VK_ERROR_INVALID_VALUE;
305 };
306
307 return VK_SUCCESS;
308}
309
Jeremy Hayesad367152015-04-17 10:36:53 -0600310VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionInfo(
311 VkPhysicalDevice gpu,
312 VkExtensionInfoType infoType,
313 uint32_t extensionIndex,
314 size_t* pDataSize,
315 void* pData)
316{
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600317 VkResult result = nextInstanceTable.GetPhysicalDeviceExtensionInfo(gpu, infoType, extensionIndex, pDataSize, pData);
Jeremy Hayesad367152015-04-17 10:36:53 -0600318 return result;
319}
320
Courtney Goeltzenleuchterd9dc0c72015-04-20 11:04:54 -0600321VK_LAYER_EXPORT VkResult VKAPI vkEnumerateLayers(VkPhysicalDevice gpu, size_t maxStringSize, size_t* pLayerCount, char* const* pOutLayers, void* pReserved)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600322{
323 char str[1024];
324 if (gpu != NULL) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600325 sprintf(str, "At start of layered EnumerateLayers\n");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600326 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, nullptr, 0, 0, "PARAMCHECK", str);
Jon Ashburn4d9f4652015-04-08 21:33:34 -0600327 pCurObj = (VkBaseLayerObject *) gpu;
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -0600328 loader_platform_thread_once(&initOnce, initParamChecker);
329 loader_platform_thread_once(&tabDeviceOnce, initDeviceTable);
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600330 VkResult result = nextInstanceTable.EnumerateLayers(gpu, maxStringSize, pLayerCount, pOutLayers, pReserved);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600331 sprintf(str, "Completed layered EnumerateLayers\n");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600332 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, nullptr, 0, 0, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600333 fflush(stdout);
334 return result;
335 } else {
Courtney Goeltzenleuchterd9dc0c72015-04-20 11:04:54 -0600336 if (pLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600337 return VK_ERROR_INVALID_POINTER;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600338 // This layer compatible with all GPUs
Courtney Goeltzenleuchterd9dc0c72015-04-20 11:04:54 -0600339 *pLayerCount = 1;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600340 strncpy(pOutLayers[0], "ParamChecker", maxStringSize);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600341 return VK_SUCCESS;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600342 }
343}
344
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600345VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex, VkQueue* pQueue)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600346{
347
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600348 VkResult result = nextTable.GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600349 return result;
350}
351
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600352VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600353{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600354 VkResult result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, fence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600355 return result;
356}
357
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600358VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(VkQueue queue)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600359{
360
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600361 VkResult result = nextTable.QueueWaitIdle(queue);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600362 return result;
363}
364
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600365VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle(VkDevice device)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600366{
367
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600368 VkResult result = nextTable.DeviceWaitIdle(device);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600369 return result;
370}
371
Tony Barbourd1c35722015-04-16 15:59:00 -0600372VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory(VkDevice device, const VkMemoryAllocInfo* pAllocInfo, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600373{
374 char str[1024];
375 if (!pAllocInfo) {
376 sprintf(str, "Struct ptr parameter pAllocInfo to function AllocMemory is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600377 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600378 } else if (!vk_validate_vkmemoryallocinfo(pAllocInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600379 sprintf(str, "Parameter pAllocInfo to function AllocMemory contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600380 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600381 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600382 VkResult result = nextTable.AllocMemory(device, pAllocInfo, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600383 return result;
384}
385
Mike Stroyanb050c682015-04-17 12:36:38 -0600386VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600387{
388
Mike Stroyanb050c682015-04-17 12:36:38 -0600389 VkResult result = nextTable.FreeMemory(device, mem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600390 return result;
391}
392
Mike Stroyanb050c682015-04-17 12:36:38 -0600393VK_LAYER_EXPORT VkResult VKAPI vkSetMemoryPriority(VkDevice device, VkDeviceMemory mem, VkMemoryPriority priority)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600394{
395 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600396 if (!validate_VkMemoryPriority(priority)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600397 sprintf(str, "Parameter priority to function SetMemoryPriority has invalid value of %i.", (int)priority);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600398 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600399 }
Mike Stroyanb050c682015-04-17 12:36:38 -0600400 VkResult result = nextTable.SetMemoryPriority(device, mem, priority);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600401 return result;
402}
403
Mike Stroyanb050c682015-04-17 12:36:38 -0600404VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkFlags flags, void** ppData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600405{
406
Mike Stroyanb050c682015-04-17 12:36:38 -0600407 VkResult result = nextTable.MapMemory(device, mem, offset, size, flags, ppData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600408 return result;
409}
410
Mike Stroyanb050c682015-04-17 12:36:38 -0600411VK_LAYER_EXPORT VkResult VKAPI vkUnmapMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600412{
413
Mike Stroyanb050c682015-04-17 12:36:38 -0600414 VkResult result = nextTable.UnmapMemory(device, mem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600415 return result;
416}
417
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -0600418VK_LAYER_EXPORT VkResult VKAPI vkFlushMappedMemoryRanges(
419 VkDevice device,
420 uint32_t memRangeCount,
421 const VkMappedMemoryRange* pMemRanges)
Tony Barbourb1250542015-04-16 19:23:13 -0600422{
423
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -0600424 VkResult result = nextTable.FlushMappedMemoryRanges(device, memRangeCount, pMemRanges);
425 return result;
426}
427
428VK_LAYER_EXPORT VkResult VKAPI vkInvalidateMappedMemoryRanges(
429 VkDevice device,
430 uint32_t memRangeCount,
431 const VkMappedMemoryRange* pMemRanges)
432{
433
434 VkResult result = nextTable.InvalidateMappedMemoryRanges(device, memRangeCount, pMemRanges);
Tony Barbourb1250542015-04-16 19:23:13 -0600435 return result;
436}
437
Tony Barbourd1c35722015-04-16 15:59:00 -0600438VK_LAYER_EXPORT VkResult VKAPI vkPinSystemMemory(VkDevice device, const void* pSysMem, size_t memSize, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600439{
440
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600441 VkResult result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600442 return result;
443}
444
Tony Barbourd1c35722015-04-16 15:59:00 -0600445VK_LAYER_EXPORT VkResult VKAPI vkGetMultiDeviceCompatibility(VkPhysicalDevice gpu0, VkPhysicalDevice gpu1, VkPhysicalDeviceCompatibilityInfo* pInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600446{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600447
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600448 VkResult result = nextInstanceTable.GetMultiDeviceCompatibility(gpu0, gpu1, pInfo);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600449 return result;
450}
451
Tony Barbourd1c35722015-04-16 15:59:00 -0600452VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedMemory(VkDevice device, const VkMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600453{
454 char str[1024];
455 if (!pOpenInfo) {
456 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedMemory is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600457 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600458 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600459 else if (!vk_validate_vkmemoryopeninfo(pOpenInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600460 sprintf(str, "Parameter pOpenInfo to function OpenSharedMemory contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600461 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600462 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600463 VkResult result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600464 return result;
465}
466
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600467VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedSemaphore(VkDevice device, const VkSemaphoreOpenInfo* pOpenInfo, VkSemaphore* pSemaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600468{
469 char str[1024];
470 if (!pOpenInfo) {
471 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedSemaphore is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600472 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600473 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600474 else if (!vk_validate_vksemaphoreopeninfo(pOpenInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600475 sprintf(str, "Parameter pOpenInfo to function OpenSharedSemaphore contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600476 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600477 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600478 VkResult result = nextTable.OpenSharedSemaphore(device, pOpenInfo, pSemaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600479 return result;
480}
481
Tony Barbourd1c35722015-04-16 15:59:00 -0600482VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerMemory(VkDevice device, const VkPeerMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600483{
484 char str[1024];
485 if (!pOpenInfo) {
486 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerMemory is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600487 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600488 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600489 else if (!vk_validate_vkpeermemoryopeninfo(pOpenInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600490 sprintf(str, "Parameter pOpenInfo to function OpenPeerMemory contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600491 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600492 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600493 VkResult result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600494 return result;
495}
496
Tony Barbourd1c35722015-04-16 15:59:00 -0600497VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerImage(VkDevice device, const VkPeerImageOpenInfo* pOpenInfo, VkImage* pImage, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600498{
499 char str[1024];
500 if (!pOpenInfo) {
501 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerImage is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600502 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600503 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600504 else if (!vk_validate_vkpeerimageopeninfo(pOpenInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600505 sprintf(str, "Parameter pOpenInfo to function OpenPeerImage contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600506 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600507 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600508 VkResult result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600509 return result;
510}
511
Mike Stroyanb050c682015-04-17 12:36:38 -0600512VK_LAYER_EXPORT VkResult VKAPI vkDestroyObject(VkDevice device, VkObjectType objType, VkObject object)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600513{
514
Mike Stroyanb050c682015-04-17 12:36:38 -0600515 VkResult result = nextTable.DestroyObject(device, objType, object);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600516 return result;
517}
518
Mike Stroyanb050c682015-04-17 12:36:38 -0600519VK_LAYER_EXPORT VkResult VKAPI vkGetObjectInfo(VkDevice device, VkObjectType objType, VkObject object, VkObjectInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600520{
521 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600522 if (!validate_VkObjectInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600523 sprintf(str, "Parameter infoType to function GetObjectInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600524 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600525 }
Mike Stroyanb050c682015-04-17 12:36:38 -0600526 VkResult result = nextTable.GetObjectInfo(device, objType, object, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600527 return result;
528}
529
Mark Lobodzinski23065352015-05-29 09:32:35 -0500530VK_LAYER_EXPORT VkResult VKAPI vkBindObjectMemory(VkDevice device, VkObjectType objType, VkObject object, VkDeviceMemory mem, VkDeviceSize offset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600531{
532
Mark Lobodzinski23065352015-05-29 09:32:35 -0500533 VkResult result = nextTable.BindObjectMemory(device, objType, object, mem, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600534 return result;
535}
536
Mark Lobodzinski23065352015-05-29 09:32:35 -0500537VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(VkQueue queue, VkBuffer buffer, VkDeviceSize rangeOffset, VkDeviceSize rangeSize, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600538{
539
Mark Lobodzinski23065352015-05-29 09:32:35 -0500540 VkResult result = nextTable.QueueBindSparseBufferMemory(queue, buffer, rangeOffset, rangeSize, mem, memOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600541 return result;
542}
543
Mark Lobodzinski23065352015-05-29 09:32:35 -0500544VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageMemory(VkQueue queue, VkImage image, const VkImageMemoryBindInfo* pBindInfo, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600545{
546 char str[1024];
Jeremy Hayesaf0d72c2015-04-15 15:20:03 -0600547 if (!pBindInfo) {
Mark Lobodzinski942b1722015-05-11 17:21:15 -0500548 sprintf(str, "Struct ptr parameter pBindInfo to function QueueBindSparseImageMemory is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600549 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600550 }
Jeremy Hayesaf0d72c2015-04-15 15:20:03 -0600551 else if (!vk_validate_vkimagememorybindinfo(pBindInfo)) {
552 sprintf(str, "Parameter pBindInfo to function BindImageMemoryRange contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600553 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600554 }
Mark Lobodzinski23065352015-05-29 09:32:35 -0500555 VkResult result = nextTable.QueueBindSparseImageMemory(queue, image, pBindInfo, mem, memOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600556 return result;
557}
558
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600559VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(VkDevice device, const VkFenceCreateInfo* pCreateInfo, VkFence* pFence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600560{
561 char str[1024];
562 if (!pCreateInfo) {
563 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFence is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600564 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600565 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600566 else if (!vk_validate_vkfencecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600567 sprintf(str, "Parameter pCreateInfo to function CreateFence contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600568 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600569 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600570 VkResult result = nextTable.CreateFence(device, pCreateInfo, pFence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600571 return result;
572}
573
Mike Stroyanb050c682015-04-17 12:36:38 -0600574VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(VkDevice device, VkFence fence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600575{
576
Mike Stroyanb050c682015-04-17 12:36:38 -0600577 VkResult result = nextTable.GetFenceStatus(device, fence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600578 return result;
579}
580
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600581VK_LAYER_EXPORT VkResult VKAPI vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences, bool32_t waitAll, uint64_t timeout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600582{
583
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600584 VkResult result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600585 return result;
586}
587
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600588VK_LAYER_EXPORT VkResult VKAPI vkResetFences(VkDevice device, uint32_t fenceCount, VkFence* pFences)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500589{
590
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600591 VkResult result = nextTable.ResetFences(device, fenceCount, pFences);
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500592 return result;
593}
594
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600595VK_LAYER_EXPORT VkResult VKAPI vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, VkSemaphore* pSemaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600596{
597 char str[1024];
598 if (!pCreateInfo) {
599 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSemaphore is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600600 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600601 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600602 else if (!vk_validate_vksemaphorecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600603 sprintf(str, "Parameter pCreateInfo to function CreateSemaphore contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600604 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600605 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600606 VkResult result = nextTable.CreateSemaphore(device, pCreateInfo, pSemaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600607 return result;
608}
609
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600610VK_LAYER_EXPORT VkResult VKAPI vkQueueSignalSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600611{
612
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600613 VkResult result = nextTable.QueueSignalSemaphore(queue, semaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600614 return result;
615}
616
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600617VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600618{
619
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600620 VkResult result = nextTable.QueueWaitSemaphore(queue, semaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600621 return result;
622}
623
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600624VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(VkDevice device, const VkEventCreateInfo* pCreateInfo, VkEvent* pEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600625{
626 char str[1024];
627 if (!pCreateInfo) {
628 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateEvent is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600629 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600630 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600631 else if (!vk_validate_vkeventcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600632 sprintf(str, "Parameter pCreateInfo to function CreateEvent contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600633 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600634 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600635 VkResult result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600636 return result;
637}
638
Mike Stroyanb050c682015-04-17 12:36:38 -0600639VK_LAYER_EXPORT VkResult VKAPI vkGetEventStatus(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600640{
641
Mike Stroyanb050c682015-04-17 12:36:38 -0600642 VkResult result = nextTable.GetEventStatus(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600643 return result;
644}
645
Mike Stroyanb050c682015-04-17 12:36:38 -0600646VK_LAYER_EXPORT VkResult VKAPI vkSetEvent(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600647{
648
Mike Stroyanb050c682015-04-17 12:36:38 -0600649 VkResult result = nextTable.SetEvent(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600650 return result;
651}
652
Mike Stroyanb050c682015-04-17 12:36:38 -0600653VK_LAYER_EXPORT VkResult VKAPI vkResetEvent(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600654{
655
Mike Stroyanb050c682015-04-17 12:36:38 -0600656 VkResult result = nextTable.ResetEvent(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600657 return result;
658}
659
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600660VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, VkQueryPool* pQueryPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600661{
662 char str[1024];
663 if (!pCreateInfo) {
664 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateQueryPool is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600665 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600666 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600667 else if (!vk_validate_vkquerypoolcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600668 sprintf(str, "Parameter pCreateInfo to function CreateQueryPool contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600669 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600670 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600671 VkResult result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600672 return result;
673}
674
Mike Stroyanb050c682015-04-17 12:36:38 -0600675VK_LAYER_EXPORT VkResult VKAPI vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData, VkQueryResultFlags flags)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600676{
677
Mike Stroyanb050c682015-04-17 12:36:38 -0600678 VkResult result = nextTable.GetQueryPoolResults(device, queryPool, startQuery, queryCount, pDataSize, pData, flags);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600679 return result;
680}
681
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600682VK_LAYER_EXPORT VkResult VKAPI vkGetFormatInfo(VkDevice device, VkFormat format, VkFormatInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600683{
684 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600685 if (!validate_VkFormat(format)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600686 sprintf(str, "Parameter format to function GetFormatInfo has invalid value of %i.", (int)format);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600687 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600688 }
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600689 if (!validate_VkFormatInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600690 sprintf(str, "Parameter infoType to function GetFormatInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600691 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600692 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600693 VkResult result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600694 return result;
695}
696
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600697VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600698{
699 char str[1024];
700 if (!pCreateInfo) {
701 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBuffer is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600702 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600703 }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600704 else if (!vk_validate_vkbuffercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600705 sprintf(str, "Parameter pCreateInfo to function CreateBuffer contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600706 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600707 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600708 VkResult result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600709 return result;
710}
711
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600712VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, VkBufferView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600713{
714 char str[1024];
715 if (!pCreateInfo) {
716 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBufferView is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600717 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600718 }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600719 else if (!vk_validate_vkbufferviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600720 sprintf(str, "Parameter pCreateInfo to function CreateBufferView contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600721 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600722 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600723 VkResult result = nextTable.CreateBufferView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600724 return result;
725}
726
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600727void PreCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600728{
729 if(pCreateInfo == nullptr)
730 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600731 char const str[] = "vkCreateImage parameter, VkImageCreateInfo* pCreateInfo, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600732 "nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600733 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600734 return;
735 }
736
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600737 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600738 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600739 char const str[] = "vkCreateImage parameter, VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO "\
740 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO (precondition).";
741 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600742 return;
743 }
744
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600745 if (!validate_VkImageType(pCreateInfo->imageType))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600746 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600747 char const str[] = "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600748 "unrecognized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600749 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600750 return;
751 }
752
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600753 if (!validate_VkFormat(pCreateInfo->format))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600754 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600755 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600756 "unrecognized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600757 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600758 return;
759 }
760
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600761 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600762 size_t size = sizeof(properties);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600763 VkResult result = nextTable.GetFormatInfo(device, pCreateInfo->format,
Tony Barbourd1c35722015-04-16 15:59:00 -0600764 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600765 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600766 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600767 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, cannot be "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600768 "validated (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600769 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600770 return;
771 }
772
773 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
774 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600775 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600776 "unsupported format (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600777 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600778 return;
779 }
780
781 // TODO: Can we check device-specific limits?
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600782 if (!vk_validate_vkextent3d(&pCreateInfo->extent))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600783 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600784 char const str[] = "vkCreateImage parameter, VkExtent3D pCreateInfo->extent, is invalid "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600785 "(precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600786 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600787 return;
788 }
789
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600790 if (!validate_VkImageTiling(pCreateInfo->tiling))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600791 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600792 char const str[] = "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600793 "unrecoginized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600794 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600795 return;
796 }
797}
798
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600799void PostCreateImage(VkResult result, VkImage* pImage)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600800{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600801 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600802 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600803 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600804 char const str[] = "vkCreateImage failed (postcondition).";
805 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600806 return;
807 }
808
809 if(pImage == nullptr)
810 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600811 char const str[] = "vkCreateImage parameter, VkImage* pImage, is nullptr (postcondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600812 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600813 return;
814 }
815}
816
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600817VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600818{
819 PreCreateImage(device, pCreateInfo);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600820 VkResult result = nextTable.CreateImage(device, pCreateInfo, pImage);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600821 PostCreateImage(result, pImage);
822 return result;
823}
824
Mike Stroyanb050c682015-04-17 12:36:38 -0600825VK_LAYER_EXPORT VkResult VKAPI vkGetImageSubresourceInfo(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600826{
827 char str[1024];
828 if (!pSubresource) {
829 sprintf(str, "Struct ptr parameter pSubresource to function GetImageSubresourceInfo is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600830 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600831 } else if (!vk_validate_vkimagesubresource(pSubresource)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600832 sprintf(str, "Parameter pSubresource to function GetImageSubresourceInfo contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600833 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600834 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600835 if (!validate_VkSubresourceInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600836 sprintf(str, "Parameter infoType to function GetImageSubresourceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600837 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600838 }
Mike Stroyanb050c682015-04-17 12:36:38 -0600839 VkResult result = nextTable.GetImageSubresourceInfo(device, image, pSubresource, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600840 return result;
841}
842
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600843VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, VkImageView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600844{
845 char str[1024];
846 if (!pCreateInfo) {
847 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateImageView is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600848 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600849 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600850 else if (!vk_validate_vkimageviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600851 sprintf(str, "Parameter pCreateInfo to function CreateImageView contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600852 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600853 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600854 VkResult result = nextTable.CreateImageView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600855 return result;
856}
857
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600858VK_LAYER_EXPORT VkResult VKAPI vkCreateColorAttachmentView(VkDevice device, const VkColorAttachmentViewCreateInfo* pCreateInfo, VkColorAttachmentView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600859{
860 char str[1024];
861 if (!pCreateInfo) {
862 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateColorAttachmentView is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600863 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600864 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600865 else if (!vk_validate_vkcolorattachmentviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600866 sprintf(str, "Parameter pCreateInfo to function CreateColorAttachmentView contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600867 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600868 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600869 VkResult result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600870 return result;
871}
872
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600873VK_LAYER_EXPORT VkResult VKAPI vkCreateDepthStencilView(VkDevice device, const VkDepthStencilViewCreateInfo* pCreateInfo, VkDepthStencilView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600874{
875 char str[1024];
876 if (!pCreateInfo) {
877 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDepthStencilView is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600878 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600879 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600880 else if (!vk_validate_vkdepthstencilviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600881 sprintf(str, "Parameter pCreateInfo to function CreateDepthStencilView contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600882 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600883 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600884 VkResult result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600885 return result;
886}
887
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600888VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(VkDevice device, const VkShaderCreateInfo* pCreateInfo, VkShader* pShader)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600889{
890 char str[1024];
891 if (!pCreateInfo) {
892 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateShader is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600893 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600894 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600895 else if (!vk_validate_vkshadercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600896 sprintf(str, "Parameter pCreateInfo to function CreateShader contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600897 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600898 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600899 VkResult result = nextTable.CreateShader(device, pCreateInfo, pShader);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600900 return result;
901}
902
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600903VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600904{
905 char str[1024];
906 if (!pCreateInfo) {
907 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipeline is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600908 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600909 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600910 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600911 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipeline contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600912 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600913 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600914 VkResult result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600915 return result;
916}
917
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600918VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelineDerivative(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600919{
920 char str[1024];
921 if (!pCreateInfo) {
922 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipelineDerivative is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600923 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600924 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600925 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600926 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipelineDerivative contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600927 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600928 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600929 VkResult result = nextTable.CreateGraphicsPipelineDerivative(device, pCreateInfo, basePipeline, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600930 return result;
931}
932
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600933VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipeline(VkDevice device, const VkComputePipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600934{
935 char str[1024];
936 if (!pCreateInfo) {
937 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateComputePipeline is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600938 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600939 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600940 else if (!vk_validate_vkcomputepipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600941 sprintf(str, "Parameter pCreateInfo to function CreateComputePipeline contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600942 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600943 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600944 VkResult result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600945 return result;
946}
947
Mike Stroyanb050c682015-04-17 12:36:38 -0600948VK_LAYER_EXPORT VkResult VKAPI vkStorePipeline(VkDevice device, VkPipeline pipeline, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600949{
950
Mike Stroyanb050c682015-04-17 12:36:38 -0600951 VkResult result = nextTable.StorePipeline(device, pipeline, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600952 return result;
953}
954
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600955VK_LAYER_EXPORT VkResult VKAPI vkLoadPipeline(VkDevice device, size_t dataSize, const void* pData, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600956{
957
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600958 VkResult result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600959 return result;
960}
961
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600962VK_LAYER_EXPORT VkResult VKAPI vkLoadPipelineDerivative(VkDevice device, size_t dataSize, const void* pData, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600963{
964
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600965 VkResult result = nextTable.LoadPipelineDerivative(device, dataSize, pData, basePipeline, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600966 return result;
967}
968
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600969VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, VkSampler* pSampler)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600970{
971 char str[1024];
972 if (!pCreateInfo) {
973 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSampler is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600974 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600975 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600976 else if (!vk_validate_vksamplercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600977 sprintf(str, "Parameter pCreateInfo to function CreateSampler contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600978 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600979 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600980 VkResult result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600981 return result;
982}
983
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600984VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayout* pSetLayout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600985{
986 char str[1024];
987 if (!pCreateInfo) {
988 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorSetLayout is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600989 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600990 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600991 else if (!vk_validate_vkdescriptorsetlayoutcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600992 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorSetLayout contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600993 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600994 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600995 VkResult result = nextTable.CreateDescriptorSetLayout(device, pCreateInfo, pSetLayout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600996 return result;
997}
998
Mark Lobodzinski0fadf5f2015-04-17 14:11:39 -0500999VK_LAYER_EXPORT VkResult VKAPI vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, VkPipelineLayout* pPipelineLayout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001000{
Mark Lobodzinski0fadf5f2015-04-17 14:11:39 -05001001 VkResult result = nextTable.CreatePipelineLayout(device, pCreateInfo, pPipelineLayout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001002 return result;
1003}
1004
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001005VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorPool(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001006{
1007 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001008 if (!validate_VkDescriptorPoolUsage(poolUsage)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001009 sprintf(str, "Parameter poolUsage to function CreateDescriptorPool has invalid value of %i.", (int)poolUsage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001010 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001011 }
1012 if (!pCreateInfo) {
1013 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorPool is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001014 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001015 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001016 else if (!vk_validate_vkdescriptorpoolcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001017 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorPool contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001018 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001019 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001020 VkResult result = nextTable.CreateDescriptorPool(device, poolUsage, maxSets, pCreateInfo, pDescriptorPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001021 return result;
1022}
1023
Mike Stroyanb050c682015-04-17 12:36:38 -06001024VK_LAYER_EXPORT VkResult VKAPI vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001025{
1026
Mike Stroyanb050c682015-04-17 12:36:38 -06001027 VkResult result = nextTable.ResetDescriptorPool(device, descriptorPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001028 return result;
1029}
1030
Mike Stroyanb050c682015-04-17 12:36:38 -06001031VK_LAYER_EXPORT VkResult VKAPI vkAllocDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorSetUsage setUsage, uint32_t count, const VkDescriptorSetLayout* pSetLayouts, VkDescriptorSet* pDescriptorSets, uint32_t* pCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001032{
1033 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001034 if (!validate_VkDescriptorSetUsage(setUsage)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001035 sprintf(str, "Parameter setUsage to function AllocDescriptorSets has invalid value of %i.", (int)setUsage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001036 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001037 }
Mike Stroyanb050c682015-04-17 12:36:38 -06001038 VkResult result = nextTable.AllocDescriptorSets(device, descriptorPool, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001039 return result;
1040}
1041
Mike Stroyanb050c682015-04-17 12:36:38 -06001042VK_LAYER_EXPORT void VKAPI vkClearDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, const VkDescriptorSet* pDescriptorSets)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001043{
1044
Mike Stroyanb050c682015-04-17 12:36:38 -06001045 nextTable.ClearDescriptorSets(device, descriptorPool, count, pDescriptorSets);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001046}
1047
Chia-I Wu9d00ed72015-05-25 16:27:55 +08001048VK_LAYER_EXPORT VkResult VKAPI vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001049{
1050
Chia-I Wu9d00ed72015-05-25 16:27:55 +08001051 return nextTable.UpdateDescriptorSets(device, writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001052}
1053
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001054VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(VkDevice device, const VkDynamicVpStateCreateInfo* pCreateInfo, VkDynamicVpState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001055{
1056 char str[1024];
1057 if (!pCreateInfo) {
1058 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicViewportState is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001059 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001060 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001061 else if (!vk_validate_vkdynamicvpstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001062 sprintf(str, "Parameter pCreateInfo to function CreateDynamicViewportState contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001063 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001064 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001065 VkResult result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001066 return result;
1067}
1068
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001069VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterState(VkDevice device, const VkDynamicRsStateCreateInfo* pCreateInfo, VkDynamicRsState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001070{
1071 char str[1024];
1072 if (!pCreateInfo) {
1073 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicRasterState is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001074 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001075 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001076 else if (!vk_validate_vkdynamicrsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001077 sprintf(str, "Parameter pCreateInfo to function CreateDynamicRasterState contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001078 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001079 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001080 VkResult result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001081 return result;
1082}
1083
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001084VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState(VkDevice device, const VkDynamicCbStateCreateInfo* pCreateInfo, VkDynamicCbState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001085{
1086 char str[1024];
1087 if (!pCreateInfo) {
1088 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicColorBlendState is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001089 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001090 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001091 else if (!vk_validate_vkdynamiccbstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001092 sprintf(str, "Parameter pCreateInfo to function CreateDynamicColorBlendState contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001093 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001094 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001095 VkResult result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001096 return result;
1097}
1098
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001099VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState(VkDevice device, const VkDynamicDsStateCreateInfo* pCreateInfo, VkDynamicDsState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001100{
1101 char str[1024];
1102 if (!pCreateInfo) {
1103 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicDepthStencilState is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001104 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001105 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001106 else if (!vk_validate_vkdynamicdsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001107 sprintf(str, "Parameter pCreateInfo to function CreateDynamicDepthStencilState contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001108 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001109 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001110 VkResult result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001111 return result;
1112}
1113
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001114void PreCreateCommandBuffer(VkDevice device, const VkCmdBufferCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001115{
1116 if(device == nullptr)
1117 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001118 char const str[] = "vkCreateCommandBuffer parameter, VkDevice device, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001119 "nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001120 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001121 return;
1122 }
1123
1124 if(pCreateInfo == nullptr)
1125 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001126 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBufferCreateInfo* pCreateInfo, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001127 "nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001128 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001129 return;
1130 }
1131
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001132 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001133 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001134 char const str[] = "vkCreateCommandBuffer parameter, VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO "\
1135 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO (precondition).";
1136 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001137 return;
1138 }
1139}
1140
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001141void PostCreateCommandBuffer(VkResult result, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001142{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001143 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001144 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001145 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001146 char const str[] = "vkCreateCommandBuffer failed (postcondition).";
1147 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001148 return;
1149 }
1150
1151 if(pCmdBuffer == nullptr)
1152 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001153 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBuffer* pCmdBuffer, is nullptr (postcondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001154 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001155 return;
1156 }
1157}
1158
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001159VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(VkDevice device,
1160 const VkCmdBufferCreateInfo* pCreateInfo, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001161{
1162 PreCreateCommandBuffer(device, pCreateInfo);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001163 VkResult result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001164 PostCreateCommandBuffer(result, pCmdBuffer);
1165 return result;
1166}
1167
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001168VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001169{
1170 char str[1024];
1171 if (!pBeginInfo) {
1172 sprintf(str, "Struct ptr parameter pBeginInfo to function BeginCommandBuffer is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001173 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001174 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001175 else if (!vk_validate_vkcmdbufferbegininfo(pBeginInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001176 sprintf(str, "Parameter pBeginInfo to function BeginCommandBuffer contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001177 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001178 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001179 VkResult result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001180 return result;
1181}
1182
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001183VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001184{
1185
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001186 VkResult result = nextTable.EndCommandBuffer(cmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001187 return result;
1188}
1189
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001190VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001191{
1192
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001193 VkResult result = nextTable.ResetCommandBuffer(cmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001194 return result;
1195}
1196
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001197VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001198{
1199 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001200 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001201 sprintf(str, "Parameter pipelineBindPoint to function CmdBindPipeline has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001202 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001203 }
1204 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1205}
1206
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001207VK_LAYER_EXPORT void VKAPI vkCmdBindDynamicStateObject(VkCmdBuffer cmdBuffer, VkStateBindPoint stateBindPoint, VkDynamicStateObject state)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001208{
1209 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001210 if (!validate_VkStateBindPoint(stateBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001211 sprintf(str, "Parameter stateBindPoint to function CmdBindDynamicStateObject has invalid value of %i.", (int)stateBindPoint);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001212 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001213 }
1214 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
1215}
1216
Cody Northropd4c1a502015-04-16 13:41:56 -06001217VK_LAYER_EXPORT void VKAPI vkCmdBindDescriptorSets(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t firstSet, uint32_t setCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001218{
1219 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001220 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001221 sprintf(str, "Parameter pipelineBindPoint to function CmdBindDescriptorSets has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001222 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001223 }
Cody Northropd4c1a502015-04-16 13:41:56 -06001224 nextTable.CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001225}
1226
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06001227VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
1228 VkCmdBuffer cmdBuffer,
1229 uint32_t startBinding,
1230 uint32_t bindingCount,
1231 const VkBuffer* pBuffers,
Tony Barbourd1c35722015-04-16 15:59:00 -06001232 const VkDeviceSize* pOffsets)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001233{
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06001234 nextTable.CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001235}
1236
Tony Barbourd1c35722015-04-16 15:59:00 -06001237VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001238{
1239 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001240 if (!validate_VkIndexType(indexType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001241 sprintf(str, "Parameter indexType to function CmdBindIndexBuffer has invalid value of %i.", (int)indexType);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001242 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001243 }
1244 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
1245}
1246
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001247VK_LAYER_EXPORT void VKAPI vkCmdDraw(VkCmdBuffer cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001248{
1249
1250 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
1251}
1252
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001253VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexed(VkCmdBuffer cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001254{
1255
1256 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
1257}
1258
Tony Barbourd1c35722015-04-16 15:59:00 -06001259VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001260{
1261
1262 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
1263}
1264
Tony Barbourd1c35722015-04-16 15:59:00 -06001265VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001266{
1267
1268 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
1269}
1270
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001271VK_LAYER_EXPORT void VKAPI vkCmdDispatch(VkCmdBuffer cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001272{
1273
1274 nextTable.CmdDispatch(cmdBuffer, x, y, z);
1275}
1276
Tony Barbourd1c35722015-04-16 15:59:00 -06001277VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001278{
1279
1280 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
1281}
1282
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001283VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkBuffer destBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001284{
1285 char str[1024];
1286 uint32_t i;
1287 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001288 if (!vk_validate_vkbuffercopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001289 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBuffer contains an invalid value.", i);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001290 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001291 }
1292 }
1293 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
1294}
1295
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001296VK_LAYER_EXPORT void VKAPI vkCmdCopyImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001297{
1298 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001299 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001300 sprintf(str, "Parameter srcImageLayout to function CmdCopyImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001301 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001302 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001303 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001304 sprintf(str, "Parameter destImageLayout to function CmdCopyImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001305 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001306 }
1307 uint32_t i;
1308 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001309 if (!vk_validate_vkimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001310 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImage contains an invalid value.", i);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001311 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001312 }
1313 }
1314 nextTable.CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
1315}
1316
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05001317VK_LAYER_EXPORT void VKAPI vkCmdBlitImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkTexFilter filter)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001318{
1319 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001320 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001321 sprintf(str, "Parameter srcImageLayout to function CmdBlitImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001322 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001323 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001324 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001325 sprintf(str, "Parameter destImageLayout to function CmdBlitImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001326 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001327 }
1328 uint32_t i;
1329 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001330 if (!vk_validate_vkimageblit(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001331 sprintf(str, "Parameter pRegions[%i] to function CmdBlitImage contains an invalid value.", i);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001332 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001333 }
1334 }
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05001335 //TODO: Add additional check for limitation from header rev 96.
1336 // VK_TEX_FILTER_NEAREST if the format that srcImage was created with is an integer-based format.
1337
1338 nextTable.CmdBlitImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001339}
1340
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001341VK_LAYER_EXPORT void VKAPI vkCmdCopyBufferToImage(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001342{
1343 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001344 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001345 sprintf(str, "Parameter destImageLayout to function CmdCopyBufferToImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001346 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001347 }
1348 uint32_t i;
1349 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001350 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001351 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBufferToImage contains an invalid value.", i);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001352 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001353 }
1354 }
1355 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
1356}
1357
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001358VK_LAYER_EXPORT void VKAPI vkCmdCopyImageToBuffer(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer destBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001359{
1360 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001361 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001362 sprintf(str, "Parameter srcImageLayout to function CmdCopyImageToBuffer has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001363 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001364 }
1365 uint32_t i;
1366 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001367 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001368 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImageToBuffer contains an invalid value.", i);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001369 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001370 }
1371 }
1372 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
1373}
1374
Tony Barbourd1c35722015-04-16 15:59:00 -06001375VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001376{
1377
1378 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
1379}
1380
Tony Barbourd1c35722015-04-16 15:59:00 -06001381VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001382{
1383
1384 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
1385}
1386
Courtney Goeltzenleuchterd7a5cff2015-04-23 17:49:22 -06001387VK_LAYER_EXPORT void VKAPI vkCmdClearColorImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColor* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001388{
1389 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001390 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001391 sprintf(str, "Parameter imageLayout to function CmdClearColorImage has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001392 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001393 }
1394 uint32_t i;
1395 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001396 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001397 sprintf(str, "Parameter pRanges[%i] to function CmdClearColorImage contains an invalid value.", i);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001398 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001399 }
1400 }
Courtney Goeltzenleuchterd7a5cff2015-04-23 17:49:22 -06001401 nextTable.CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001402}
1403
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001404VK_LAYER_EXPORT void VKAPI vkCmdClearDepthStencil(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001405{
1406 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001407 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001408 sprintf(str, "Parameter imageLayout to function CmdClearDepthStencil has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001409 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001410 }
1411 uint32_t i;
1412 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001413 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001414 sprintf(str, "Parameter pRanges[%i] to function CmdClearDepthStencil contains an invalid value.", i);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001415 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001416 }
1417 }
1418 nextTable.CmdClearDepthStencil(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
1419}
1420
Tony Barbour6865d4a2015-04-13 15:02:52 -06001421VK_LAYER_EXPORT void VKAPI vkCmdResolveImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageResolve* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001422{
1423 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001424 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001425 sprintf(str, "Parameter srcImageLayout to function CmdResolveImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001426 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001427 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001428 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001429 sprintf(str, "Parameter destImageLayout to function CmdResolveImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001430 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001431 }
1432 uint32_t i;
Tony Barbour6865d4a2015-04-13 15:02:52 -06001433 for (i = 0; i < regionCount; i++) {
1434 if (!vk_validate_vkimageresolve(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001435 sprintf(str, "Parameter pRects[%i] to function CmdResolveImage contains an invalid value.", i);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001436 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001437 }
1438 }
Tony Barbour6865d4a2015-04-13 15:02:52 -06001439 nextTable.CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001440}
1441
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001442VK_LAYER_EXPORT void VKAPI vkCmdSetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001443{
1444 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001445 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001446 sprintf(str, "Parameter pipeEvent to function CmdSetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001447 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001448 }
1449 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
1450}
1451
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001452VK_LAYER_EXPORT void VKAPI vkCmdResetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001453{
1454 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001455 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001456 sprintf(str, "Parameter pipeEvent to function CmdResetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001457 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001458 }
1459 nextTable.CmdResetEvent(cmdBuffer, event, pipeEvent);
1460}
1461
Tony Barbourd1c35722015-04-16 15:59:00 -06001462VK_LAYER_EXPORT void VKAPI vkCmdWaitEvents(VkCmdBuffer cmdBuffer, VkWaitEvent waitEvent, uint32_t eventCount, const VkEvent* pEvents, uint32_t memBarrierCount, const void** ppMemBarriers)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001463{
Tony Barbourd1c35722015-04-16 15:59:00 -06001464 nextTable.CmdWaitEvents(cmdBuffer, waitEvent, eventCount, pEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001465}
1466
Tony Barbourd1c35722015-04-16 15:59:00 -06001467VK_LAYER_EXPORT void VKAPI vkCmdPipelineBarrier(VkCmdBuffer cmdBuffer, VkWaitEvent waitEvent, uint32_t pipeEventCount, const VkPipeEvent* pPipeEvents, uint32_t memBarrierCount, const void** ppMemBarriers)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001468{
Tony Barbourd1c35722015-04-16 15:59:00 -06001469 nextTable.CmdPipelineBarrier(cmdBuffer, waitEvent, pipeEventCount, pPipeEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001470}
1471
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001472VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001473{
1474
1475 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
1476}
1477
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001478VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001479{
1480
1481 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
1482}
1483
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001484VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001485{
1486
1487 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
1488}
1489
Tony Barbourd1c35722015-04-16 15:59:00 -06001490VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkTimestampType timestampType, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001491{
1492 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001493 if (!validate_VkTimestampType(timestampType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001494 sprintf(str, "Parameter timestampType to function CmdWriteTimestamp has invalid value of %i.", (int)timestampType);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001495 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001496 }
1497 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
1498}
1499
Jeremy Hayesad367152015-04-17 10:36:53 -06001500VK_LAYER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(
1501 VkCmdBuffer cmdBuffer,
1502 VkQueryPool queryPool,
1503 uint32_t startQuery,
1504 uint32_t queryCount,
1505 VkBuffer destBuffer,
1506 VkDeviceSize destOffset,
1507 VkDeviceSize destStride,
1508 VkQueryResultFlags flags)
1509{
1510 nextTable.CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, destStride, flags);
1511}
1512
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001513VK_LAYER_EXPORT void VKAPI vkCmdInitAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, const uint32_t* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001514{
1515 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001516 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001517 sprintf(str, "Parameter pipelineBindPoint to function CmdInitAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001518 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001519 }
1520 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
1521}
1522
Tony Barbourd1c35722015-04-16 15:59:00 -06001523VK_LAYER_EXPORT void VKAPI vkCmdLoadAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, VkBuffer srcBuffer, VkDeviceSize srcOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001524{
1525 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001526 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001527 sprintf(str, "Parameter pipelineBindPoint to function CmdLoadAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001528 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001529 }
1530 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
1531}
1532
Tony Barbourd1c35722015-04-16 15:59:00 -06001533VK_LAYER_EXPORT void VKAPI vkCmdSaveAtomicCounters(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001534{
1535 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001536 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001537 sprintf(str, "Parameter pipelineBindPoint to function CmdSaveAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001538 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001539 }
1540 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
1541}
1542
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001543VK_LAYER_EXPORT VkResult VKAPI vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, VkFramebuffer* pFramebuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001544{
1545 char str[1024];
1546 if (!pCreateInfo) {
1547 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFramebuffer is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001548 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001549 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001550 else if (!vk_validate_vkframebuffercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001551 sprintf(str, "Parameter pCreateInfo to function CreateFramebuffer contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001552 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001553 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001554 VkResult result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001555 return result;
1556}
1557
1558
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001559void PreCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001560{
1561 if(pCreateInfo == nullptr)
1562 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001563 char const str[] = "vkCreateRenderPass parameter, VkRenderPassCreateInfo* pCreateInfo, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001564 "nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001565 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001566 return;
1567 }
1568
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001569 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001570 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001571 char const str[] = "vkCreateRenderPass parameter, VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO "\
1572 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO (precondition).";
1573 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001574 return;
1575 }
1576
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001577 if(!vk_validate_vkrect(&pCreateInfo->renderArea))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001578 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001579 char const str[] = "vkCreateRenderPass parameter, VkRect pCreateInfo->renderArea, is invalid "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001580 "(precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001581 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001582 return;
1583 }
1584
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001585 if(!vk_validate_vkextent2d(&pCreateInfo->extent))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001586 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001587 char const str[] = "vkCreateRenderPass parameter, VkExtent2D pCreateInfo->extent, is invalid "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001588 "(precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001589 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001590 return;
1591 }
1592
1593 if(pCreateInfo->pColorFormats == nullptr)
1594 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001595 char const str[] = "vkCreateRenderPass parameter, VkFormat* pCreateInfo->pColorFormats, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001596 "is nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001597 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001598 return;
1599 }
1600
1601 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1602 {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001603 if(!validate_VkFormat(pCreateInfo->pColorFormats[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001604 {
1605 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001606 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001607 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001608 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001609 continue;
1610 }
1611
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001612 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001613 size_t size = sizeof(properties);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001614 VkResult result = nextTable.GetFormatInfo(device, pCreateInfo->pColorFormats[i],
Tony Barbourd1c35722015-04-16 15:59:00 -06001615 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001616 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001617 {
1618 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001619 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001620 "], cannot be validated (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001621 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001622 continue;
1623 }
1624
1625 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1626 {
1627 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001628 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001629 "], contains unsupported format (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001630 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001631 continue;
1632 }
1633
1634 }
1635
1636 if(pCreateInfo->pColorLayouts == nullptr)
1637 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001638 char const str[] = "vkCreateRenderPass parameter, VkImageLayout* pCreateInfo->pColorLayouts, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001639 "is nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001640 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001641 return;
1642 }
1643
1644 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1645 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001646 if(!validate_VkImageLayout(pCreateInfo->pColorLayouts[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001647 {
1648 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001649 ss << "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pColorLayouts[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001650 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001651 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001652 continue;
1653 }
1654 }
1655
1656 if(pCreateInfo->pColorLoadOps == nullptr)
1657 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001658 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp* pCreateInfo->pColorLoadOps, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001659 "is nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001660 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001661 return;
1662 }
1663
1664 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1665 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001666 if(!validate_VkAttachmentLoadOp(pCreateInfo->pColorLoadOps[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001667 {
1668 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001669 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pColorLoadOps[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001670 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001671 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001672 continue;
1673 }
1674 }
1675
1676 if(pCreateInfo->pColorStoreOps == nullptr)
1677 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001678 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp* pCreateInfo->pColorStoreOps, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001679 "is nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001680 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001681 return;
1682 }
1683
1684 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1685 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001686 if(!validate_VkAttachmentStoreOp(pCreateInfo->pColorStoreOps[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001687 {
1688 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001689 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pColorStoreOps[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001690 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001691 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001692 continue;
1693 }
1694 }
1695
1696 if(pCreateInfo->pColorLoadClearValues == nullptr)
1697 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001698 char const str[] = "vkCreateRenderPass parameter, VkClearColor* pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001699 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001700 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001701 return;
1702 }
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001703
1704 if(pCreateInfo->pColorStoreOps == nullptr)
1705 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001706 char const str[] = "vkCreateRenderPass parameter, VK_ATTACHMENT_STORE_OP* pCreateInfo->pColorStoreOps, "\
Jeremy Hayes090f0ce2015-04-07 13:38:03 -06001707 "is nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001708 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001709 return;
1710 }
1711
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001712 if(pCreateInfo->pColorLoadClearValues == nullptr)
1713 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001714 char const str[] = "vkCreateRenderPass parameter, VK_CLEAR_COLOR* pCreateInfo->"\
Jeremy Hayes090f0ce2015-04-07 13:38:03 -06001715 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001716 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001717 return;
1718 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001719
1720 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1721 {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001722 if(!vk_validate_vkclearcolor(&(pCreateInfo->pColorLoadClearValues[i])))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001723 {
1724 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001725 ss << "vkCreateRenderPass parameter, VkClearColor pCreateInfo->pColorLoadClearValues[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001726 "], is invalid (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001727 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001728 continue;
1729 }
1730 }
1731
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001732 if(!validate_VkFormat(pCreateInfo->depthStencilFormat))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001733 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001734 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001735 "depthStencilFormat, is unrecognized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001736 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001737 return;
1738 }
1739
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001740 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001741 size_t size = sizeof(properties);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001742 VkResult result = nextTable.GetFormatInfo(device, pCreateInfo->depthStencilFormat,
Tony Barbourd1c35722015-04-16 15:59:00 -06001743 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001744 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001745 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001746 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001747 "depthStencilFormat, cannot be validated (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001748 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001749 return;
1750 }
1751
1752 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1753 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001754 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001755 "depthStencilFormat, contains unsupported format (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001756 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001757 return;
1758 }
1759
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001760 if(!validate_VkImageLayout(pCreateInfo->depthStencilLayout))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001761 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001762 char const str[] = "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001763 "depthStencilLayout, is unrecognized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001764 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001765 return;
1766 }
1767
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001768 if(!validate_VkAttachmentLoadOp(pCreateInfo->depthLoadOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001769 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001770 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001771 "depthLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001772 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001773 return;
1774 }
1775
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001776 if(!validate_VkAttachmentStoreOp(pCreateInfo->depthStoreOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001777 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001778 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001779 "depthStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001780 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001781 return;
1782 }
1783
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001784 if(!validate_VkAttachmentLoadOp(pCreateInfo->stencilLoadOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001785 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001786 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001787 "stencilLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001788 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001789 return;
1790 }
1791
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001792 if(!validate_VkAttachmentStoreOp(pCreateInfo->stencilStoreOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001793 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001794 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001795 "stencilStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001796 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001797 return;
1798 }
1799}
1800
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001801void PostCreateRenderPass(VkResult result, VkRenderPass* pRenderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001802{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001803 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001804 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001805 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001806 char const str[] = "vkCreateRenderPass failed (postcondition).";
1807 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001808 return;
1809 }
1810
1811 if(pRenderPass == nullptr)
1812 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001813 char const str[] = "vkCreateRenderPass parameter, VkRenderPass* pRenderPass, is nullptr (postcondition).";
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001814 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001815 return;
1816 }
1817}
1818
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001819VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, VkRenderPass* pRenderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001820{
1821 PreCreateRenderPass(device, pCreateInfo);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001822 VkResult result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001823 PostCreateRenderPass(result, pRenderPass);
1824 return result;
1825}
1826
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001827VK_LAYER_EXPORT void VKAPI vkCmdBeginRenderPass(VkCmdBuffer cmdBuffer, const VkRenderPassBegin* pRenderPassBegin)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001828{
1829 char str[1024];
1830 if (!pRenderPassBegin) {
1831 sprintf(str, "Struct ptr parameter pRenderPassBegin to function CmdBeginRenderPass is NULL.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001832 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001833 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001834 else if (!vk_validate_vkrenderpassbegin(pRenderPassBegin)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001835 sprintf(str, "Parameter pRenderPassBegin to function CmdBeginRenderPass contains an invalid value.");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001836 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001837 }
1838 nextTable.CmdBeginRenderPass(cmdBuffer, pRenderPassBegin);
1839}
1840
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001841VK_LAYER_EXPORT void VKAPI vkCmdEndRenderPass(VkCmdBuffer cmdBuffer, VkRenderPass renderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001842{
1843
1844 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
1845}
1846
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001847VK_LAYER_EXPORT VkResult VKAPI vkDbgSetValidationLevel(VkDevice device, VkValidationLevel validationLevel)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001848{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001849 VkResult result = nextTable.DbgSetValidationLevel(device, validationLevel);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001850 return result;
1851}
1852
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001853VK_LAYER_EXPORT VkResult VKAPI vkDbgRegisterMsgCallback(VkInstance instance, VK_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001854{
1855 // This layer intercepts callbacks
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001856 VK_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (VK_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(VK_LAYER_DBG_FUNCTION_NODE));
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001857 if (!pNewDbgFuncNode)
Tony Barbourd1c35722015-04-16 15:59:00 -06001858 return VK_ERROR_OUT_OF_HOST_MEMORY;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001859 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
1860 pNewDbgFuncNode->pUserData = pUserData;
1861 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
1862 g_pDbgFunctionHead = pNewDbgFuncNode;
1863 // force callbacks if DebugAction hasn't been set already other than initial value
1864 if (g_actionIsDefault) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001865 g_debugAction = VK_DBG_LAYER_ACTION_CALLBACK;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001866 }
Jon Ashburn71836d92015-05-12 17:23:55 -06001867 VkResult result = nextInstanceTable.DbgRegisterMsgCallback(instance, pfnMsgCallback, pUserData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001868 return result;
1869}
1870
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001871VK_LAYER_EXPORT VkResult VKAPI vkDbgUnregisterMsgCallback(VkInstance instance, VK_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001872{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001873 VK_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
1874 VK_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001875 while (pTrav) {
1876 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
1877 pPrev->pNext = pTrav->pNext;
1878 if (g_pDbgFunctionHead == pTrav)
1879 g_pDbgFunctionHead = pTrav->pNext;
1880 free(pTrav);
1881 break;
1882 }
1883 pPrev = pTrav;
1884 pTrav = pTrav->pNext;
1885 }
1886 if (g_pDbgFunctionHead == NULL)
1887 {
1888 if (g_actionIsDefault)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001889 g_debugAction = VK_DBG_LAYER_ACTION_LOG_MSG;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001890 else
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001891 g_debugAction = (VK_LAYER_DBG_ACTION)(g_debugAction & ~((uint32_t)VK_DBG_LAYER_ACTION_CALLBACK));
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001892 }
Jon Ashburn71836d92015-05-12 17:23:55 -06001893 VkResult result = nextInstanceTable.DbgUnregisterMsgCallback(instance, pfnMsgCallback);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001894 return result;
1895}
1896
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001897VK_LAYER_EXPORT VkResult VKAPI vkDbgSetMessageFilter(VkDevice device, int32_t msgCode, VK_DBG_MSG_FILTER filter)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001898{
1899
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001900 VkResult result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001901 return result;
1902}
1903
Mike Stroyanb050c682015-04-17 12:36:38 -06001904VK_LAYER_EXPORT VkResult VKAPI vkDbgSetObjectTag(VkDevice device, VkObject object, size_t tagSize, const void* pTag)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001905{
1906
Mike Stroyanb050c682015-04-17 12:36:38 -06001907 VkResult result = nextTable.DbgSetObjectTag(device, object, tagSize, pTag);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001908 return result;
1909}
1910
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001911VK_LAYER_EXPORT VkResult VKAPI vkDbgSetGlobalOption(VkInstance instance, VK_DBG_GLOBAL_OPTION dbgOption, size_t dataSize, const void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001912{
1913
Jon Ashburn71836d92015-05-12 17:23:55 -06001914 VkResult result = nextInstanceTable.DbgSetGlobalOption(instance, dbgOption, dataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001915 return result;
1916}
1917
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001918VK_LAYER_EXPORT VkResult VKAPI vkDbgSetDeviceOption(VkDevice device, VK_DBG_DEVICE_OPTION dbgOption, size_t dataSize, const void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001919{
1920
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001921 VkResult result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001922 return result;
1923}
1924
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001925VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerBegin(VkCmdBuffer cmdBuffer, const char* pMarker)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001926{
1927
1928 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
1929}
1930
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001931VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerEnd(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001932{
1933
1934 nextTable.CmdDbgMarkerEnd(cmdBuffer);
1935}
1936
Chia-I Wuf8693382015-04-16 22:02:10 +08001937VK_LAYER_EXPORT VkResult VKAPI vkGetDisplayInfoWSI(VkDisplayWSI display, VkDisplayInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001938{
Jon Ashburn95a77ba2015-05-15 15:09:35 -06001939 VkResult result = nextInstanceTable.GetDisplayInfoWSI(display, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001940 return result;
1941}
1942
Chia-I Wuf8693382015-04-16 22:02:10 +08001943VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI(VkDevice device, const VkSwapChainCreateInfoWSI* pCreateInfo, VkSwapChainWSI* pSwapChain)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001944{
Chia-I Wuf8693382015-04-16 22:02:10 +08001945 VkResult result = nextTable.CreateSwapChainWSI(device, pCreateInfo, pSwapChain);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001946 return result;
1947}
1948
Chia-I Wuf8693382015-04-16 22:02:10 +08001949VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapChainWSI(VkSwapChainWSI swapChain)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001950{
Chia-I Wuf8693382015-04-16 22:02:10 +08001951 VkResult result = nextTable.DestroySwapChainWSI(swapChain);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001952 return result;
1953}
1954
Chia-I Wuf8693382015-04-16 22:02:10 +08001955VK_LAYER_EXPORT VkResult VKAPI vkGetSwapChainInfoWSI(VkSwapChainWSI swapChain, VkSwapChainInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001956{
Chia-I Wuf8693382015-04-16 22:02:10 +08001957 VkResult result = nextTable.GetSwapChainInfoWSI(swapChain, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001958 return result;
1959}
1960
Chia-I Wuf8693382015-04-16 22:02:10 +08001961VK_LAYER_EXPORT VkResult VKAPI vkQueuePresentWSI(VkQueue queue, const VkPresentInfoWSI* pPresentInfo)
1962{
1963 VkResult result = nextTable.QueuePresentWSI(queue, pPresentInfo);
1964 return result;
1965}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001966
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001967static inline void* layer_intercept_proc(const char *name)
1968{
1969 if (!name || name[0] != 'v' || name[1] != 'k')
1970 return NULL;
1971
1972 name += 2;
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06001973 if (!strcmp(name, "GetDeviceProcAddr"))
1974 return (void*) vkGetDeviceProcAddr;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001975 if (!strcmp(name, "DestroyDevice"))
1976 return (void*) vkDestroyDevice;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001977 if (!strcmp(name, "GetDeviceQueue"))
1978 return (void*) vkGetDeviceQueue;
1979 if (!strcmp(name, "QueueSubmit"))
1980 return (void*) vkQueueSubmit;
1981 if (!strcmp(name, "QueueWaitIdle"))
1982 return (void*) vkQueueWaitIdle;
1983 if (!strcmp(name, "DeviceWaitIdle"))
1984 return (void*) vkDeviceWaitIdle;
1985 if (!strcmp(name, "AllocMemory"))
1986 return (void*) vkAllocMemory;
1987 if (!strcmp(name, "FreeMemory"))
1988 return (void*) vkFreeMemory;
1989 if (!strcmp(name, "SetMemoryPriority"))
1990 return (void*) vkSetMemoryPriority;
1991 if (!strcmp(name, "MapMemory"))
1992 return (void*) vkMapMemory;
1993 if (!strcmp(name, "UnmapMemory"))
1994 return (void*) vkUnmapMemory;
1995 if (!strcmp(name, "FlushMappedMemoryRanges"))
1996 return (void*) vkFlushMappedMemoryRanges;
1997 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
1998 return (void*) vkInvalidateMappedMemoryRanges;
1999 if (!strcmp(name, "PinSystemMemory"))
2000 return (void*) vkPinSystemMemory;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002001 if (!strcmp(name, "OpenSharedMemory"))
2002 return (void*) vkOpenSharedMemory;
2003 if (!strcmp(name, "OpenSharedSemaphore"))
2004 return (void*) vkOpenSharedSemaphore;
2005 if (!strcmp(name, "OpenPeerMemory"))
2006 return (void*) vkOpenPeerMemory;
2007 if (!strcmp(name, "OpenPeerImage"))
2008 return (void*) vkOpenPeerImage;
2009 if (!strcmp(name, "DestroyObject"))
2010 return (void*) vkDestroyObject;
2011 if (!strcmp(name, "GetObjectInfo"))
2012 return (void*) vkGetObjectInfo;
2013 if (!strcmp(name, "CreateFence"))
2014 return (void*) vkCreateFence;
2015 if (!strcmp(name, "ResetFences"))
2016 return (void*) vkResetFences;
2017 if (!strcmp(name, "GetFenceStatus"))
2018 return (void*) vkGetFenceStatus;
2019 if (!strcmp(name, "WaitForFences"))
2020 return (void*) vkWaitForFences;
2021 if (!strcmp(name, "CreateSemaphore"))
2022 return (void*) vkCreateSemaphore;
2023 if (!strcmp(name, "QueueSignalSemaphore"))
2024 return (void*) vkQueueSignalSemaphore;
2025 if (!strcmp(name, "QueueWaitSemaphore"))
2026 return (void*) vkQueueWaitSemaphore;
2027 if (!strcmp(name, "CreateEvent"))
2028 return (void*) vkCreateEvent;
2029 if (!strcmp(name, "GetEventStatus"))
2030 return (void*) vkGetEventStatus;
2031 if (!strcmp(name, "SetEvent"))
2032 return (void*) vkSetEvent;
2033 if (!strcmp(name, "ResetEvent"))
2034 return (void*) vkResetEvent;
2035 if (!strcmp(name, "CreateQueryPool"))
2036 return (void*) vkCreateQueryPool;
2037 if (!strcmp(name, "GetQueryPoolResults"))
2038 return (void*) vkGetQueryPoolResults;
2039 if (!strcmp(name, "GetFormatInfo"))
2040 return (void*) vkGetFormatInfo;
2041 if (!strcmp(name, "CreateBuffer"))
2042 return (void*) vkCreateBuffer;
2043 if (!strcmp(name, "CreateBufferView"))
2044 return (void*) vkCreateBufferView;
2045 if (!strcmp(name, "CreateImage"))
2046 return (void*) vkCreateImage;
2047 if (!strcmp(name, "GetImageSubresourceInfo"))
2048 return (void*) vkGetImageSubresourceInfo;
2049 if (!strcmp(name, "CreateImageView"))
2050 return (void*) vkCreateImageView;
2051 if (!strcmp(name, "CreateColorAttachmentView"))
2052 return (void*) vkCreateColorAttachmentView;
2053 if (!strcmp(name, "CreateDepthStencilView"))
2054 return (void*) vkCreateDepthStencilView;
2055 if (!strcmp(name, "CreateShader"))
2056 return (void*) vkCreateShader;
2057 if (!strcmp(name, "CreateGraphicsPipeline"))
2058 return (void*) vkCreateGraphicsPipeline;
2059 if (!strcmp(name, "CreateGraphicsPipelineDerivative"))
2060 return (void*) vkCreateGraphicsPipelineDerivative;
2061 if (!strcmp(name, "CreateComputePipeline"))
2062 return (void*) vkCreateComputePipeline;
2063 if (!strcmp(name, "StorePipeline"))
2064 return (void*) vkStorePipeline;
2065 if (!strcmp(name, "LoadPipeline"))
2066 return (void*) vkLoadPipeline;
2067 if (!strcmp(name, "LoadPipelineDerivative"))
2068 return (void*) vkLoadPipelineDerivative;
2069 if (!strcmp(name, "CreatePipelineLayout"))
2070 return (void*) vkCreatePipelineLayout;
2071 if (!strcmp(name, "CreateSampler"))
2072 return (void*) vkCreateSampler;
2073 if (!strcmp(name, "CreateDescriptorSetLayout"))
2074 return (void*) vkCreateDescriptorSetLayout;
2075 if (!strcmp(name, "CreateDescriptorPool"))
2076 return (void*) vkCreateDescriptorPool;
2077 if (!strcmp(name, "ResetDescriptorPool"))
2078 return (void*) vkResetDescriptorPool;
2079 if (!strcmp(name, "AllocDescriptorSets"))
2080 return (void*) vkAllocDescriptorSets;
2081 if (!strcmp(name, "ClearDescriptorSets"))
2082 return (void*) vkClearDescriptorSets;
2083 if (!strcmp(name, "CreateDynamicViewportState"))
2084 return (void*) vkCreateDynamicViewportState;
2085 if (!strcmp(name, "CreateDynamicRasterState"))
2086 return (void*) vkCreateDynamicRasterState;
2087 if (!strcmp(name, "CreateDynamicColorBlendState"))
2088 return (void*) vkCreateDynamicColorBlendState;
2089 if (!strcmp(name, "CreateDynamicDepthStencilState"))
2090 return (void*) vkCreateDynamicDepthStencilState;
2091 if (!strcmp(name, "CreateCommandBuffer"))
2092 return (void*) vkCreateCommandBuffer;
2093 if (!strcmp(name, "BeginCommandBuffer"))
2094 return (void*) vkBeginCommandBuffer;
2095 if (!strcmp(name, "EndCommandBuffer"))
2096 return (void*) vkEndCommandBuffer;
2097 if (!strcmp(name, "ResetCommandBuffer"))
2098 return (void*) vkResetCommandBuffer;
2099 if (!strcmp(name, "CmdBindPipeline"))
2100 return (void*) vkCmdBindPipeline;
2101 if (!strcmp(name, "CmdBindDynamicStateObject"))
2102 return (void*) vkCmdBindDynamicStateObject;
2103 if (!strcmp(name, "CmdBindDescriptorSets"))
2104 return (void*) vkCmdBindDescriptorSets;
2105 if (!strcmp(name, "CmdBindVertexBuffers"))
2106 return (void*) vkCmdBindVertexBuffers;
2107 if (!strcmp(name, "CmdBindIndexBuffer"))
2108 return (void*) vkCmdBindIndexBuffer;
2109 if (!strcmp(name, "CmdDraw"))
2110 return (void*) vkCmdDraw;
2111 if (!strcmp(name, "CmdDrawIndexed"))
2112 return (void*) vkCmdDrawIndexed;
2113 if (!strcmp(name, "CmdDrawIndirect"))
2114 return (void*) vkCmdDrawIndirect;
2115 if (!strcmp(name, "CmdDrawIndexedIndirect"))
2116 return (void*) vkCmdDrawIndexedIndirect;
2117 if (!strcmp(name, "CmdDispatch"))
2118 return (void*) vkCmdDispatch;
2119 if (!strcmp(name, "CmdDispatchIndirect"))
2120 return (void*) vkCmdDispatchIndirect;
2121 if (!strcmp(name, "CmdCopyBuffer"))
2122 return (void*) vkCmdCopyBuffer;
2123 if (!strcmp(name, "CmdCopyImage"))
2124 return (void*) vkCmdCopyImage;
2125 if (!strcmp(name, "CmdBlitImage"))
2126 return (void*) vkCmdBlitImage;
2127 if (!strcmp(name, "CmdCopyBufferToImage"))
2128 return (void*) vkCmdCopyBufferToImage;
2129 if (!strcmp(name, "CmdCopyImageToBuffer"))
2130 return (void*) vkCmdCopyImageToBuffer;
2131 if (!strcmp(name, "CmdUpdateBuffer"))
2132 return (void*) vkCmdUpdateBuffer;
2133 if (!strcmp(name, "CmdFillBuffer"))
2134 return (void*) vkCmdFillBuffer;
2135 if (!strcmp(name, "CmdClearColorImage"))
2136 return (void*) vkCmdClearColorImage;
2137 if (!strcmp(name, "CmdClearDepthStencil"))
2138 return (void*) vkCmdClearDepthStencil;
2139 if (!strcmp(name, "CmdResolveImage"))
2140 return (void*) vkCmdResolveImage;
2141 if (!strcmp(name, "CmdSetEvent"))
2142 return (void*) vkCmdSetEvent;
2143 if (!strcmp(name, "CmdResetEvent"))
2144 return (void*) vkCmdResetEvent;
2145 if (!strcmp(name, "CmdWaitEvents"))
2146 return (void*) vkCmdWaitEvents;
2147 if (!strcmp(name, "CmdPipelineBarrier"))
2148 return (void*) vkCmdPipelineBarrier;
2149 if (!strcmp(name, "CmdBeginQuery"))
2150 return (void*) vkCmdBeginQuery;
2151 if (!strcmp(name, "CmdEndQuery"))
2152 return (void*) vkCmdEndQuery;
2153 if (!strcmp(name, "CmdResetQueryPool"))
2154 return (void*) vkCmdResetQueryPool;
2155 if (!strcmp(name, "CmdWriteTimestamp"))
2156 return (void*) vkCmdWriteTimestamp;
2157 if (!strcmp(name, "CmdCopyQueryPoolResults"))
2158 return (void*) vkCmdCopyQueryPoolResults;
2159 if (!strcmp(name, "CmdInitAtomicCounters"))
2160 return (void*) vkCmdInitAtomicCounters;
2161 if (!strcmp(name, "CmdLoadAtomicCounters"))
2162 return (void*) vkCmdLoadAtomicCounters;
2163 if (!strcmp(name, "CmdSaveAtomicCounters"))
2164 return (void*) vkCmdSaveAtomicCounters;
2165 if (!strcmp(name, "CreateFramebuffer"))
2166 return (void*) vkCreateFramebuffer;
2167 if (!strcmp(name, "CreateRenderPass"))
2168 return (void*) vkCreateRenderPass;
2169 if (!strcmp(name, "CmdBeginRenderPass"))
2170 return (void*) vkCmdBeginRenderPass;
2171 if (!strcmp(name, "CmdEndRenderPass"))
2172 return (void*) vkCmdEndRenderPass;
2173 if (!strcmp(name, "DbgSetValidationLevel"))
2174 return (void*) vkDbgSetValidationLevel;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002175 if (!strcmp(name, "DbgSetMessageFilter"))
2176 return (void*) vkDbgSetMessageFilter;
2177 if (!strcmp(name, "DbgSetObjectTag"))
2178 return (void*) vkDbgSetObjectTag;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002179 if (!strcmp(name, "DbgSetDeviceOption"))
2180 return (void*) vkDbgSetDeviceOption;
2181 if (!strcmp(name, "CmdDbgMarkerBegin"))
2182 return (void*) vkCmdDbgMarkerBegin;
2183 if (!strcmp(name, "CmdDbgMarkerEnd"))
2184 return (void*) vkCmdDbgMarkerEnd;
2185 if (!strcmp(name, "GetDisplayInfoWSI"))
2186 return (void*) vkGetDisplayInfoWSI;
2187 if (!strcmp(name, "CreateSwapChainWSI"))
2188 return (void*) vkCreateSwapChainWSI;
2189 if (!strcmp(name, "DestroySwapChainWSI"))
2190 return (void*) vkDestroySwapChainWSI;
2191 if (!strcmp(name, "GetSwapChainInfoWSI"))
2192 return (void*) vkGetSwapChainInfoWSI;
2193 if (!strcmp(name, "QueuePresentWSI"))
2194 return (void*) vkQueuePresentWSI;
2195
2196 return NULL;
2197}
2198
2199static inline void* layer_intercept_instance_proc(const char *name)
2200{
2201 if (!name || name[0] != 'v' || name[1] != 'k')
2202 return NULL;
2203
2204 name += 2;
2205 if (!strcmp(name, "GetInstanceProcAddr"))
2206 return (void*) vkGetInstanceProcAddr;
2207 if (!strcmp(name, "CreateInstance"))
2208 return (void*) vkCreateInstance;
2209 if (!strcmp(name, "DestroyInstance"))
2210 return (void*) vkDestroyInstance;
2211 if (!strcmp(name, "GetPhysicalDeviceInfo"))
2212 return (void*) vkGetPhysicalDeviceInfo;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002213 if (!strcmp(name, "CreateDevice"))
2214 return (void*) vkCreateDevice;
2215 if (!strcmp(name, "GetGlobalExtensionInfo"))
2216 return (void*) vkGetGlobalExtensionInfo;
2217 if (!strcmp(name, "GetPhysicalDeviceExtensionInfo"))
2218 return (void*) vkGetPhysicalDeviceExtensionInfo;
2219 if (!strcmp(name, "EnumerateLayers"))
2220 return (void*) vkEnumerateLayers;
2221 if (!strcmp(name, "GetMultiDeviceCompatibility"))
2222 return (void*) vkGetMultiDeviceCompatibility;
2223 if (!strcmp(name, "DbgRegisterMsgCallback"))
2224 return (void*) vkDbgRegisterMsgCallback;
2225 if (!strcmp(name, "DbgUnregisterMsgCallback"))
2226 return (void*) vkDbgUnregisterMsgCallback;
2227 if (!strcmp(name, "DbgSetGlobalOption"))
2228 return (void*) vkDbgSetGlobalOption;
2229
2230 return NULL;
2231}
2232
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06002233VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002234{
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06002235 VkBaseLayerObject* devw = (VkBaseLayerObject *) device;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002236 void* addr;
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06002237 if (device == NULL)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002238 return NULL;
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06002239 pCurObj = devw;
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -06002240 loader_platform_thread_once(&initOnce, initParamChecker);
2241 loader_platform_thread_once(&tabDeviceOnce, initDeviceTable);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002242
2243 addr = layer_intercept_proc(funcName);
2244 if (addr)
2245 return addr;
2246 else {
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06002247 if (devw->pGPA == NULL)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002248 return NULL;
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06002249 return devw->pGPA((VkObject)devw->nextObject, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002250 }
2251}
2252
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002253VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr(VkInstance inst, const char* funcName)
2254{
2255 VkBaseLayerObject* instw = (VkBaseLayerObject *) inst;
2256 void* addr;
2257 if (inst == NULL)
2258 return NULL;
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -06002259 pCurObj = instw;
2260 loader_platform_thread_once(&initOnce, initParamChecker);
2261 loader_platform_thread_once(&tabInstanceOnce, initInstanceTable);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002262
2263 addr = layer_intercept_instance_proc(funcName);
2264 if (addr)
2265 return addr;
2266 else {
2267 if (instw->pGPA == NULL)
2268 return NULL;
2269 return instw->pGPA((VkObject)instw->nextObject, funcName);
2270 }
2271}