blob: 4d05ba17aae07c1b1b447e3497863c1cf9164523 [file] [log] [blame]
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001/*
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002 * Vulkan
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06003 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28
29#include <iostream>
30#include <string>
31#include <sstream>
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050032#include <unordered_map>
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060033
34#include "loader_platform.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060035#include "vkLayer.h"
Jon Ashburne68a9ff2015-05-25 14:11:37 -060036#include "vk_debug_marker_layer.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060037#include "layers_config.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060038#include "vk_enum_validate_helper.h"
39#include "vk_struct_validate_helper.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060040//The following is #included again to catch certain OS-specific functions being used:
41#include "loader_platform.h"
42
43#include "layers_msg.h"
Jon Ashburneab34492015-06-01 09:37:38 -060044#include "layers_debug_marker_table.h"
Jon Ashburn9eed2892015-06-01 10:02:09 -060045#include "layers_table.h"
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060046
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060047static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(initOnce);
Jon Ashburneab34492015-06-01 09:37:38 -060048struct devExts {
49 bool debug_marker_enabled;
Jon Ashburn747f2b62015-06-18 15:02:58 -060050 bool wsi_lunarg_enabled;
Jon Ashburneab34492015-06-01 09:37:38 -060051};
Jon Ashburneab34492015-06-01 09:37:38 -060052static std::unordered_map<void *, struct devExts> deviceExtMap;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -050053
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060054
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060055#include "vk_dispatch_table_helper.h"
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060056
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060057static void initParamChecker(void)
58{
59
60 const char *strOpt;
61 // initialize ParamChecker options
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -060062 getLayerOptionEnum("ParamCheckerReportLevel", (uint32_t *) &g_reportFlags);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060063 g_actionIsDefault = getLayerOptionEnum("ParamCheckerDebugAction", (uint32_t *) &g_debugAction);
64
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060065 if (g_debugAction & VK_DBG_LAYER_ACTION_LOG_MSG)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060066 {
67 strOpt = getLayerOption("ParamCheckerLogFilename");
68 if (strOpt)
69 {
70 g_logFile = fopen(strOpt, "w");
71 }
72 if (g_logFile == NULL)
73 g_logFile = stdout;
74 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060075}
76
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -060077void PreCreateInstance(const VkApplicationInfo* pAppInfo, const VkAllocCallbacks* pAllocCb)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060078{
79 if(pAppInfo == nullptr)
80 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -060081 char const str[] = "vkCreateInstance parameter, VkApplicationInfo* pAppInfo, is "\
Mike Stroyan1c8d4d82015-04-06 15:24:46 -060082 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -060083 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060084 return;
85 }
86
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060087 if(pAppInfo->sType != VK_STRUCTURE_TYPE_APPLICATION_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060088 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060089 char const str[] = "vkCreateInstance parameter, VK_STRUCTURE_TYPE_APPLICATION_INFO "\
90 "pAppInfo->sType, is not VK_STRUCTURE_TYPE_APPLICATION_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -060091 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060092 return;
93 }
94
95 // TODO: What else can validated in pAppInfo?
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060096 // TODO: VK_API_VERSION validation.
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -060097
98 // It's okay if pAllocCb is a nullptr.
99 if(pAllocCb != nullptr)
100 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600101 if(!vk_validate_vkalloccallbacks(pAllocCb))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600102 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600103 char const str[] = "vkCreateInstance parameter, VkAllocCallbacks* pAllocCb, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600104 "contains an invalid value (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600105 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600106 return;
107 }
108 }
109}
110
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600111void PostCreateInstance(VkResult result, const VkInstanceCreateInfo *pCreateInfo, VkInstance* pInstance)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600112{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600113 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600114 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600115 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600116 char const str[] = "vkCreateInstance failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600117 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600118 return;
119 }
120
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600121 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
122
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600123 if(pInstance == nullptr)
124 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600125 char const str[] = "vkCreateInstance parameter, VkInstance* pInstance, is nullptr "\
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600126 "(postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600127 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600128 return;
129 }
Courtney Goeltzenleuchterd02a9642015-06-08 14:58:39 -0600130
131 VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(*pInstance);
132 debug_report_init_instance_extension_dispatch_table(
133 pTable,
134 pTable->GetInstanceProcAddr,
135 *pInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600136}
137
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600138VK_LAYER_EXPORT VkResult VKAPI vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600139{
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600140 loader_platform_thread_once(&initOnce, initParamChecker);
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600141
Jon Ashburnb317fad2015-04-04 14:52:07 -0600142 PreCreateInstance(pCreateInfo->pAppInfo, pCreateInfo->pAllocCb);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500143 VkResult result = instance_dispatch_table(*pInstance)->CreateInstance(pCreateInfo, pInstance);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600144 PostCreateInstance(result, pCreateInfo, pInstance);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600145 return result;
146}
147
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600148VK_LAYER_EXPORT VkResult VKAPI vkDestroyInstance(VkInstance instance)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600149{
Courtney Goeltzenleuchter0daf2282015-06-13 21:22:12 -0600150 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500151 VkResult res = instance_dispatch_table(instance)->DestroyInstance(instance);
Courtney Goeltzenleuchter0daf2282015-06-13 21:22:12 -0600152 destroy_instance_dispatch_table(key);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500153 return res;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600154}
155
Tony Barbourd1c35722015-04-16 15:59:00 -0600156VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceInfo(VkPhysicalDevice gpu, VkPhysicalDeviceInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600157{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600158 char str[1024];
Tony Barbourd1c35722015-04-16 15:59:00 -0600159 if (!validate_VkPhysicalDeviceInfoType(infoType)) {
160 sprintf(str, "Parameter infoType to function GetPhysicalDeviceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600161 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600162 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500163 VkResult result = instance_dispatch_table(gpu)->GetPhysicalDeviceInfo(gpu, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600164 return result;
165}
166
Tony Barbourd1c35722015-04-16 15:59:00 -0600167void PreCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600168{
169 if(gpu == nullptr)
170 {
Tony Barbourd1c35722015-04-16 15:59:00 -0600171 char const str[] = "vkCreateDevice parameter, VkPhysicalDevice gpu, is nullptr "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600172 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600173 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600174 return;
175 }
176
177 if(pCreateInfo == nullptr)
178 {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600179 char const str[] = "vkCreateDevice parameter, VkDeviceCreateInfo* pCreateInfo, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600180 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600181 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600182 return;
183 }
184
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600185 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600186 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600187 char const str[] = "vkCreateDevice parameter, VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO "\
188 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600189 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600190 return;
191 }
192
193 if(pCreateInfo->queueRecordCount == 0)
194 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600195 char const str[] = "vkCreateDevice parameter, uint32_t pCreateInfo->queueRecordCount, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600196 "zero (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600197 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600198 return;
199 }
200
201 if(pCreateInfo->pRequestedQueues == nullptr)
202 {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600203 char const str[] = "vkCreateDevice parameter, VkDeviceQueueCreateInfo* pCreateInfo->pRequestedQueues, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600204 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600205 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600206 return;
207 }
208
209 for(uint32_t i = 0; i < pCreateInfo->queueRecordCount; ++i)
210 {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600211 if(!vk_validate_vkdevicequeuecreateinfo(&(pCreateInfo->pRequestedQueues[i])))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600212 {
213 std::stringstream ss;
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600214 ss << "vkCreateDevice parameter, VkDeviceQueueCreateInfo pCreateInfo->pRequestedQueues[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600215 "], is invalid (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600216 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600217 continue;
218 }
219 }
220
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600221}
222
Jon Ashburne68a9ff2015-05-25 14:11:37 -0600223static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
224{
225 uint32_t i, ext_idx;
Jon Ashburn747f2b62015-06-18 15:02:58 -0600226 VkLayerDispatchTable *pDisp = device_dispatch_table(device);
Jon Ashburneab34492015-06-01 09:37:38 -0600227 deviceExtMap[pDisp].debug_marker_enabled = false;
Jon Ashburn747f2b62015-06-18 15:02:58 -0600228 deviceExtMap[pDisp].wsi_lunarg_enabled = false;
Jon Ashburne68a9ff2015-05-25 14:11:37 -0600229 for (i = 0; i < pCreateInfo->extensionCount; i++) {
230 if (strcmp(pCreateInfo->pEnabledExtensions[i].name, DEBUG_MARKER_EXTENSION_NAME) == 0) {
Jon Ashburneab34492015-06-01 09:37:38 -0600231 /* Found a matching extension name, mark it enabled and init dispatch table*/
232 initDebugMarkerTable(device);
233 deviceExtMap[pDisp].debug_marker_enabled = true;
234
Jon Ashburne68a9ff2015-05-25 14:11:37 -0600235
Jon Ashburn747f2b62015-06-18 15:02:58 -0600236 }
237 if (strcmp(pCreateInfo->pEnabledExtensions[i].name, VK_WSI_LUNARG_EXTENSION_NAME) == 0)
238 deviceExtMap[pDisp].wsi_lunarg_enabled = true;
Jon Ashburne68a9ff2015-05-25 14:11:37 -0600239 }
240}
241
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600242void PostCreateDevice(VkResult result, const VkDeviceCreateInfo *pCreateInfo, VkDevice* pDevice)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600243{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600244 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600245 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600246 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600247 char const str[] = "vkCreateDevice failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600248 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600249 return;
250 }
251
252 if(pDevice == nullptr)
253 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600254 char const str[] = "vkCreateDevice parameter, VkDevice* pDevice, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600255 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600256 return;
257 }
Jon Ashburneab34492015-06-01 09:37:38 -0600258 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) *pDevice;
259 enable_debug_report(pCreateInfo->extensionCount, pCreateInfo->pEnabledExtensions);
260 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600261}
262
Tony Barbourd1c35722015-04-16 15:59:00 -0600263VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600264{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600265 PreCreateDevice(gpu, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500266 VkResult result = instance_dispatch_table(gpu)->CreateDevice(gpu, pCreateInfo, pDevice);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600267 PostCreateDevice(result, pCreateInfo, pDevice);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600268 return result;
269}
270
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600271VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice(VkDevice device)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600272{
Jon Ashburn747f2b62015-06-18 15:02:58 -0600273 VkLayerDispatchTable *pDisp = device_dispatch_table(device);
Courtney Goeltzenleuchter0daf2282015-06-13 21:22:12 -0600274 dispatch_key key = get_dispatch_key(device);
Jon Ashburn747f2b62015-06-18 15:02:58 -0600275 VkResult result = pDisp->DestroyDevice(device);
276 deviceExtMap.erase(pDisp);
Courtney Goeltzenleuchter0daf2282015-06-13 21:22:12 -0600277 destroy_device_dispatch_table(key);
Jon Ashburneab34492015-06-01 09:37:38 -0600278 tableDebugMarkerMap.erase(pDisp);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600279 return result;
280}
281
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600282#define PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE 2
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600283static const VkExtensionProperties pcExts[PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE] = {
284 {
285 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
286 "ParamChecker",
287 0x10,
288 "Sample layer: ParamChecker",
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600289 },
290 {
291 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
292 "Validation",
293 0x10,
294 "Sample layer: ParamChecker",
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600295 }
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600296};
297
298VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo(
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600299 VkExtensionInfoType infoType,
300 uint32_t extensionIndex,
301 size_t* pDataSize,
302 void* pData)
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600303{
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600304 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600305 uint32_t *count;
306
307 if (pDataSize == NULL)
308 return VK_ERROR_INVALID_POINTER;
309
310 switch (infoType) {
311 case VK_EXTENSION_INFO_TYPE_COUNT:
312 *pDataSize = sizeof(uint32_t);
313 if (pData == NULL)
314 return VK_SUCCESS;
315 count = (uint32_t *) pData;
316 *count = PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE;
317 break;
318 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
319 *pDataSize = sizeof(VkExtensionProperties);
320 if (pData == NULL)
321 return VK_SUCCESS;
322 if (extensionIndex >= PARAM_CHECKER_LAYER_EXT_ARRAY_SIZE)
323 return VK_ERROR_INVALID_VALUE;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600324 memcpy((VkExtensionProperties *) pData, &pcExts[extensionIndex], sizeof(VkExtensionProperties));
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600325 break;
326 default:
327 return VK_ERROR_INVALID_VALUE;
328 };
329
330 return VK_SUCCESS;
331}
332
Jon Ashburn747f2b62015-06-18 15:02:58 -0600333#define PARAM_CHECKER_LAYER_DEV_EXT_ARRAY_SIZE 4
Jon Ashburna050a8a2015-06-15 16:08:39 -0600334static const VkExtensionProperties pcDevExts[PARAM_CHECKER_LAYER_DEV_EXT_ARRAY_SIZE] = {
335 {
336 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
337 "ParamChecker",
338 0x10,
339 "Sample layer: ParamChecker",
340 },
341 {
342 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
343 "Validation",
344 0x10,
345 "Sample layer: ParamChecker",
346 },
347 {
348 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
349 DEBUG_MARKER_EXTENSION_NAME,
350 0x10,
351 "Sample layer: ParamChecker",
Jon Ashburn747f2b62015-06-18 15:02:58 -0600352 },
353 {
354 VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
355 VK_WSI_LUNARG_EXTENSION_NAME,
356 0x10,
357 "Sample layer: ParamChecker",
Jon Ashburna050a8a2015-06-15 16:08:39 -0600358 }
359};
Jeremy Hayesad367152015-04-17 10:36:53 -0600360VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionInfo(
361 VkPhysicalDevice gpu,
362 VkExtensionInfoType infoType,
363 uint32_t extensionIndex,
364 size_t* pDataSize,
365 void* pData)
366{
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600367 /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
368 uint32_t *count;
369
370 if (pDataSize == NULL)
371 return VK_ERROR_INVALID_POINTER;
372
373 switch (infoType) {
374 case VK_EXTENSION_INFO_TYPE_COUNT:
375 *pDataSize = sizeof(uint32_t);
376 if (pData == NULL)
377 return VK_SUCCESS;
378 count = (uint32_t *) pData;
Jon Ashburna050a8a2015-06-15 16:08:39 -0600379 *count = PARAM_CHECKER_LAYER_DEV_EXT_ARRAY_SIZE;
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600380 break;
381 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
382 *pDataSize = sizeof(VkExtensionProperties);
383 if (pData == NULL)
384 return VK_SUCCESS;
Jon Ashburna050a8a2015-06-15 16:08:39 -0600385 if (extensionIndex >= PARAM_CHECKER_LAYER_DEV_EXT_ARRAY_SIZE)
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600386 return VK_ERROR_INVALID_VALUE;
Jon Ashburna050a8a2015-06-15 16:08:39 -0600387 memcpy((VkExtensionProperties *) pData, &pcDevExts[extensionIndex], sizeof(VkExtensionProperties));
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600388 break;
389 default:
390 return VK_ERROR_INVALID_VALUE;
391 };
392
393 return VK_SUCCESS;
Jeremy Hayesad367152015-04-17 10:36:53 -0600394}
395
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600396VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex, VkQueue* pQueue)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600397{
398
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500399 VkResult result = device_dispatch_table(device)->GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600400 return result;
401}
402
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600403VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600404{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500405 VkResult result = device_dispatch_table(queue)->QueueSubmit(queue, cmdBufferCount, pCmdBuffers, fence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600406 return result;
407}
408
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600409VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(VkQueue queue)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600410{
411
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500412 VkResult result = device_dispatch_table(queue)->QueueWaitIdle(queue);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600413 return result;
414}
415
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600416VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle(VkDevice device)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600417{
418
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500419 VkResult result = device_dispatch_table(device)->DeviceWaitIdle(device);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600420 return result;
421}
422
Tony Barbourd1c35722015-04-16 15:59:00 -0600423VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory(VkDevice device, const VkMemoryAllocInfo* pAllocInfo, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600424{
425 char str[1024];
426 if (!pAllocInfo) {
427 sprintf(str, "Struct ptr parameter pAllocInfo to function AllocMemory is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600428 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600429 } else if (!vk_validate_vkmemoryallocinfo(pAllocInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600430 sprintf(str, "Parameter pAllocInfo to function AllocMemory contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600431 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600432 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500433 VkResult result = device_dispatch_table(device)->AllocMemory(device, pAllocInfo, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600434 return result;
435}
436
Mike Stroyanb050c682015-04-17 12:36:38 -0600437VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600438{
439
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500440 VkResult result = device_dispatch_table(device)->FreeMemory(device, mem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600441 return result;
442}
443
Mike Stroyanb050c682015-04-17 12:36:38 -0600444VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkFlags flags, void** ppData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600445{
446
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500447 VkResult result = device_dispatch_table(device)->MapMemory(device, mem, offset, size, flags, ppData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600448 return result;
449}
450
Mike Stroyanb050c682015-04-17 12:36:38 -0600451VK_LAYER_EXPORT VkResult VKAPI vkUnmapMemory(VkDevice device, VkDeviceMemory mem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600452{
453
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500454 VkResult result = device_dispatch_table(device)->UnmapMemory(device, mem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600455 return result;
456}
457
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -0600458VK_LAYER_EXPORT VkResult VKAPI vkFlushMappedMemoryRanges(
459 VkDevice device,
460 uint32_t memRangeCount,
461 const VkMappedMemoryRange* pMemRanges)
Tony Barbourb1250542015-04-16 19:23:13 -0600462{
463
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500464 VkResult result = device_dispatch_table(device)->FlushMappedMemoryRanges(device, memRangeCount, pMemRanges);
Courtney Goeltzenleuchterf69f8a22015-04-29 17:16:21 -0600465 return result;
466}
467
468VK_LAYER_EXPORT VkResult VKAPI vkInvalidateMappedMemoryRanges(
469 VkDevice device,
470 uint32_t memRangeCount,
471 const VkMappedMemoryRange* pMemRanges)
472{
473
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500474 VkResult result = device_dispatch_table(device)->InvalidateMappedMemoryRanges(device, memRangeCount, pMemRanges);
Tony Barbourb1250542015-04-16 19:23:13 -0600475 return result;
476}
477
Mike Stroyanb050c682015-04-17 12:36:38 -0600478VK_LAYER_EXPORT VkResult VKAPI vkDestroyObject(VkDevice device, VkObjectType objType, VkObject object)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600479{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500480 VkResult result = device_dispatch_table(device)->DestroyObject(device, objType, object);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600481 return result;
482}
483
Mike Stroyanb050c682015-04-17 12:36:38 -0600484VK_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 -0600485{
486 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600487 if (!validate_VkObjectInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600488 sprintf(str, "Parameter infoType to function GetObjectInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600489 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600490 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500491 VkResult result = device_dispatch_table(device)->GetObjectInfo(device, objType, object, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600492 return result;
493}
494
Mark Lobodzinski23065352015-05-29 09:32:35 -0500495VK_LAYER_EXPORT VkResult VKAPI vkBindObjectMemory(VkDevice device, VkObjectType objType, VkObject object, VkDeviceMemory mem, VkDeviceSize offset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600496{
497
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500498 VkResult result = device_dispatch_table(device)->BindObjectMemory(device, objType, object, mem, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600499 return result;
500}
501
Mark Lobodzinski23065352015-05-29 09:32:35 -0500502VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(VkQueue queue, VkBuffer buffer, VkDeviceSize rangeOffset, VkDeviceSize rangeSize, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600503{
504
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500505 VkResult result = device_dispatch_table(queue)->QueueBindSparseBufferMemory(queue, buffer, rangeOffset, rangeSize, mem, memOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600506 return result;
507}
508
Mark Lobodzinski23065352015-05-29 09:32:35 -0500509VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageMemory(VkQueue queue, VkImage image, const VkImageMemoryBindInfo* pBindInfo, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600510{
511 char str[1024];
Jeremy Hayesaf0d72c2015-04-15 15:20:03 -0600512 if (!pBindInfo) {
Mark Lobodzinski942b1722015-05-11 17:21:15 -0500513 sprintf(str, "Struct ptr parameter pBindInfo to function QueueBindSparseImageMemory is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600514 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600515 }
Jeremy Hayesaf0d72c2015-04-15 15:20:03 -0600516 else if (!vk_validate_vkimagememorybindinfo(pBindInfo)) {
517 sprintf(str, "Parameter pBindInfo to function BindImageMemoryRange contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600518 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600519 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500520 VkResult result = device_dispatch_table(queue)->QueueBindSparseImageMemory(queue, image, pBindInfo, mem, memOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600521 return result;
522}
523
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600524VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(VkDevice device, const VkFenceCreateInfo* pCreateInfo, VkFence* pFence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600525{
526 char str[1024];
527 if (!pCreateInfo) {
528 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFence is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600529 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600530 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600531 else if (!vk_validate_vkfencecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600532 sprintf(str, "Parameter pCreateInfo to function CreateFence contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600533 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600534 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500535 VkResult result = device_dispatch_table(device)->CreateFence(device, pCreateInfo, pFence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600536 return result;
537}
538
Mike Stroyanb050c682015-04-17 12:36:38 -0600539VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(VkDevice device, VkFence fence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600540{
541
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500542 VkResult result = device_dispatch_table(device)->GetFenceStatus(device, fence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600543 return result;
544}
545
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600546VK_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 -0600547{
548
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500549 VkResult result = device_dispatch_table(device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600550 return result;
551}
552
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600553VK_LAYER_EXPORT VkResult VKAPI vkResetFences(VkDevice device, uint32_t fenceCount, VkFence* pFences)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500554{
555
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500556 VkResult result = device_dispatch_table(device)->ResetFences(device, fenceCount, pFences);
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500557 return result;
558}
559
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600560VK_LAYER_EXPORT VkResult VKAPI vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, VkSemaphore* pSemaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600561{
562 char str[1024];
563 if (!pCreateInfo) {
564 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSemaphore is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600565 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600566 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600567 else if (!vk_validate_vksemaphorecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600568 sprintf(str, "Parameter pCreateInfo to function CreateSemaphore contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600569 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600570 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500571 VkResult result = device_dispatch_table(device)->CreateSemaphore(device, pCreateInfo, pSemaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600572 return result;
573}
574
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600575VK_LAYER_EXPORT VkResult VKAPI vkQueueSignalSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600576{
577
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500578 VkResult result = device_dispatch_table(queue)->QueueSignalSemaphore(queue, semaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600579 return result;
580}
581
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600582VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600583{
584
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500585 VkResult result = device_dispatch_table(queue)->QueueWaitSemaphore(queue, semaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600586 return result;
587}
588
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600589VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(VkDevice device, const VkEventCreateInfo* pCreateInfo, VkEvent* pEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600590{
591 char str[1024];
592 if (!pCreateInfo) {
593 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateEvent is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600594 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600595 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600596 else if (!vk_validate_vkeventcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600597 sprintf(str, "Parameter pCreateInfo to function CreateEvent contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600598 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600599 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500600 VkResult result = device_dispatch_table(device)->CreateEvent(device, pCreateInfo, pEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600601 return result;
602}
603
Mike Stroyanb050c682015-04-17 12:36:38 -0600604VK_LAYER_EXPORT VkResult VKAPI vkGetEventStatus(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600605{
606
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500607 VkResult result = device_dispatch_table(device)->GetEventStatus(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600608 return result;
609}
610
Mike Stroyanb050c682015-04-17 12:36:38 -0600611VK_LAYER_EXPORT VkResult VKAPI vkSetEvent(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600612{
613
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500614 VkResult result = device_dispatch_table(device)->SetEvent(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600615 return result;
616}
617
Mike Stroyanb050c682015-04-17 12:36:38 -0600618VK_LAYER_EXPORT VkResult VKAPI vkResetEvent(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600619{
620
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500621 VkResult result = device_dispatch_table(device)->ResetEvent(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600622 return result;
623}
624
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600625VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, VkQueryPool* pQueryPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600626{
627 char str[1024];
628 if (!pCreateInfo) {
629 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateQueryPool is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600630 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600631 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600632 else if (!vk_validate_vkquerypoolcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600633 sprintf(str, "Parameter pCreateInfo to function CreateQueryPool contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600634 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600635 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500636 VkResult result = device_dispatch_table(device)->CreateQueryPool(device, pCreateInfo, pQueryPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600637 return result;
638}
639
Mike Stroyanb050c682015-04-17 12:36:38 -0600640VK_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 -0600641{
642
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500643 VkResult result = device_dispatch_table(device)->GetQueryPoolResults(device, queryPool, startQuery, queryCount, pDataSize, pData, flags);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600644 return result;
645}
646
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600647VK_LAYER_EXPORT VkResult VKAPI vkGetFormatInfo(VkDevice device, VkFormat format, VkFormatInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600648{
649 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600650 if (!validate_VkFormat(format)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600651 sprintf(str, "Parameter format to function GetFormatInfo has invalid value of %i.", (int)format);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600652 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600653 }
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600654 if (!validate_VkFormatInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600655 sprintf(str, "Parameter infoType to function GetFormatInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600656 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600657 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500658 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, format, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600659 return result;
660}
661
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600662VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600663{
664 char str[1024];
665 if (!pCreateInfo) {
666 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBuffer is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600667 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600668 }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600669 else if (!vk_validate_vkbuffercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600670 sprintf(str, "Parameter pCreateInfo to function CreateBuffer contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600671 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600672 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500673 VkResult result = device_dispatch_table(device)->CreateBuffer(device, pCreateInfo, pBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600674 return result;
675}
676
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600677VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, VkBufferView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600678{
679 char str[1024];
680 if (!pCreateInfo) {
681 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBufferView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600682 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600683 }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600684 else if (!vk_validate_vkbufferviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600685 sprintf(str, "Parameter pCreateInfo to function CreateBufferView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600686 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600687 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500688 VkResult result = device_dispatch_table(device)->CreateBufferView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600689 return result;
690}
691
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600692void PreCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600693{
694 if(pCreateInfo == nullptr)
695 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600696 char const str[] = "vkCreateImage parameter, VkImageCreateInfo* pCreateInfo, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600697 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600698 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600699 return;
700 }
701
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600702 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600703 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600704 char const str[] = "vkCreateImage parameter, VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO "\
705 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600706 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600707 return;
708 }
709
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600710 if (!validate_VkImageType(pCreateInfo->imageType))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600711 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600712 char const str[] = "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600713 "unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600714 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600715 return;
716 }
717
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600718 if (!validate_VkFormat(pCreateInfo->format))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600719 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600720 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600721 "unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600722 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600723 return;
724 }
725
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600726 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600727 size_t size = sizeof(properties);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500728 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->format,
Tony Barbourd1c35722015-04-16 15:59:00 -0600729 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600730 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600731 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600732 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, cannot be "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600733 "validated (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600734 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600735 return;
736 }
737
738 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
739 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600740 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600741 "unsupported format (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600742 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600743 return;
744 }
745
746 // TODO: Can we check device-specific limits?
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600747 if (!vk_validate_vkextent3d(&pCreateInfo->extent))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600748 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600749 char const str[] = "vkCreateImage parameter, VkExtent3D pCreateInfo->extent, is invalid "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600750 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600751 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600752 return;
753 }
754
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600755 if (!validate_VkImageTiling(pCreateInfo->tiling))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600756 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600757 char const str[] = "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600758 "unrecoginized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600759 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600760 return;
761 }
762}
763
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600764void PostCreateImage(VkResult result, VkImage* pImage)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600765{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600766 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600767 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600768 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600769 char const str[] = "vkCreateImage failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600770 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600771 return;
772 }
773
774 if(pImage == nullptr)
775 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600776 char const str[] = "vkCreateImage parameter, VkImage* pImage, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600777 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600778 return;
779 }
780}
781
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600782VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600783{
784 PreCreateImage(device, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500785 VkResult result = device_dispatch_table(device)->CreateImage(device, pCreateInfo, pImage);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600786 PostCreateImage(result, pImage);
787 return result;
788}
789
Mike Stroyanb050c682015-04-17 12:36:38 -0600790VK_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 -0600791{
792 char str[1024];
793 if (!pSubresource) {
794 sprintf(str, "Struct ptr parameter pSubresource to function GetImageSubresourceInfo is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600795 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600796 } else if (!vk_validate_vkimagesubresource(pSubresource)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600797 sprintf(str, "Parameter pSubresource to function GetImageSubresourceInfo contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600798 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600799 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600800 if (!validate_VkSubresourceInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600801 sprintf(str, "Parameter infoType to function GetImageSubresourceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600802 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600803 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500804 VkResult result = device_dispatch_table(device)->GetImageSubresourceInfo(device, image, pSubresource, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600805 return result;
806}
807
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600808VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, VkImageView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600809{
810 char str[1024];
811 if (!pCreateInfo) {
812 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateImageView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600813 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600814 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600815 else if (!vk_validate_vkimageviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600816 sprintf(str, "Parameter pCreateInfo to function CreateImageView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600817 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600818 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500819 VkResult result = device_dispatch_table(device)->CreateImageView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600820 return result;
821}
822
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600823VK_LAYER_EXPORT VkResult VKAPI vkCreateColorAttachmentView(VkDevice device, const VkColorAttachmentViewCreateInfo* pCreateInfo, VkColorAttachmentView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600824{
825 char str[1024];
826 if (!pCreateInfo) {
827 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateColorAttachmentView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600828 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600829 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600830 else if (!vk_validate_vkcolorattachmentviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600831 sprintf(str, "Parameter pCreateInfo to function CreateColorAttachmentView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600832 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600833 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500834 VkResult result = device_dispatch_table(device)->CreateColorAttachmentView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600835 return result;
836}
837
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600838VK_LAYER_EXPORT VkResult VKAPI vkCreateDepthStencilView(VkDevice device, const VkDepthStencilViewCreateInfo* pCreateInfo, VkDepthStencilView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600839{
840 char str[1024];
841 if (!pCreateInfo) {
842 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDepthStencilView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600843 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600844 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600845 else if (!vk_validate_vkdepthstencilviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600846 sprintf(str, "Parameter pCreateInfo to function CreateDepthStencilView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600847 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600848 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500849 VkResult result = device_dispatch_table(device)->CreateDepthStencilView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600850 return result;
851}
852
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600853VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(VkDevice device, const VkShaderCreateInfo* pCreateInfo, VkShader* pShader)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600854{
855 char str[1024];
856 if (!pCreateInfo) {
857 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateShader is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600858 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600859 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600860 else if (!vk_validate_vkshadercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600861 sprintf(str, "Parameter pCreateInfo to function CreateShader contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600862 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600863 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500864 VkResult result = device_dispatch_table(device)->CreateShader(device, pCreateInfo, pShader);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600865 return result;
866}
867
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600868VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600869{
870 char str[1024];
871 if (!pCreateInfo) {
872 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipeline is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600873 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600874 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600875 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600876 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipeline contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600877 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600878 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500879 VkResult result = device_dispatch_table(device)->CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600880 return result;
881}
882
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600883VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelineDerivative(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600884{
885 char str[1024];
886 if (!pCreateInfo) {
887 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipelineDerivative is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600888 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600889 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600890 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600891 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipelineDerivative contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600892 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600893 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500894 VkResult result = device_dispatch_table(device)->CreateGraphicsPipelineDerivative(device, pCreateInfo, basePipeline, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600895 return result;
896}
897
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600898VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipeline(VkDevice device, const VkComputePipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600899{
900 char str[1024];
901 if (!pCreateInfo) {
902 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateComputePipeline is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600903 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600904 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600905 else if (!vk_validate_vkcomputepipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600906 sprintf(str, "Parameter pCreateInfo to function CreateComputePipeline contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600907 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600908 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500909 VkResult result = device_dispatch_table(device)->CreateComputePipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600910 return result;
911}
912
Mike Stroyanb050c682015-04-17 12:36:38 -0600913VK_LAYER_EXPORT VkResult VKAPI vkStorePipeline(VkDevice device, VkPipeline pipeline, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600914{
915
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500916 VkResult result = device_dispatch_table(device)->StorePipeline(device, pipeline, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600917 return result;
918}
919
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600920VK_LAYER_EXPORT VkResult VKAPI vkLoadPipeline(VkDevice device, size_t dataSize, const void* pData, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600921{
922
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500923 VkResult result = device_dispatch_table(device)->LoadPipeline(device, dataSize, pData, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600924 return result;
925}
926
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600927VK_LAYER_EXPORT VkResult VKAPI vkLoadPipelineDerivative(VkDevice device, size_t dataSize, const void* pData, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600928{
929
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500930 VkResult result = device_dispatch_table(device)->LoadPipelineDerivative(device, dataSize, pData, basePipeline, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600931 return result;
932}
933
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600934VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, VkSampler* pSampler)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600935{
936 char str[1024];
937 if (!pCreateInfo) {
938 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSampler is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600939 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600940 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600941 else if (!vk_validate_vksamplercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600942 sprintf(str, "Parameter pCreateInfo to function CreateSampler contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600943 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600944 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500945 VkResult result = device_dispatch_table(device)->CreateSampler(device, pCreateInfo, pSampler);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600946 return result;
947}
948
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600949VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayout* pSetLayout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600950{
951 char str[1024];
952 if (!pCreateInfo) {
953 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorSetLayout is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600954 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600955 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600956 else if (!vk_validate_vkdescriptorsetlayoutcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600957 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorSetLayout contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600958 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600959 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500960 VkResult result = device_dispatch_table(device)->CreateDescriptorSetLayout(device, pCreateInfo, pSetLayout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600961 return result;
962}
963
Mark Lobodzinski0fadf5f2015-04-17 14:11:39 -0500964VK_LAYER_EXPORT VkResult VKAPI vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, VkPipelineLayout* pPipelineLayout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600965{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500966 VkResult result = device_dispatch_table(device)->CreatePipelineLayout(device, pCreateInfo, pPipelineLayout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600967 return result;
968}
969
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600970VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorPool(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600971{
972 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600973 if (!validate_VkDescriptorPoolUsage(poolUsage)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600974 sprintf(str, "Parameter poolUsage to function CreateDescriptorPool has invalid value of %i.", (int)poolUsage);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600975 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600976 }
977 if (!pCreateInfo) {
978 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorPool is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600979 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600980 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600981 else if (!vk_validate_vkdescriptorpoolcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600982 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorPool contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600983 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600984 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500985 VkResult result = device_dispatch_table(device)->CreateDescriptorPool(device, poolUsage, maxSets, pCreateInfo, pDescriptorPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600986 return result;
987}
988
Mike Stroyanb050c682015-04-17 12:36:38 -0600989VK_LAYER_EXPORT VkResult VKAPI vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600990{
991
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500992 VkResult result = device_dispatch_table(device)->ResetDescriptorPool(device, descriptorPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600993 return result;
994}
995
Mike Stroyanb050c682015-04-17 12:36:38 -0600996VK_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 -0600997{
998 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600999 if (!validate_VkDescriptorSetUsage(setUsage)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001000 sprintf(str, "Parameter setUsage to function AllocDescriptorSets has invalid value of %i.", (int)setUsage);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001001 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001002 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001003 VkResult result = device_dispatch_table(device)->AllocDescriptorSets(device, descriptorPool, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001004 return result;
1005}
1006
Chia-I Wu9d00ed72015-05-25 16:27:55 +08001007VK_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 -06001008{
1009
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001010 return device_dispatch_table(device)->UpdateDescriptorSets(device, writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001011}
1012
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001013VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(VkDevice device, const VkDynamicVpStateCreateInfo* pCreateInfo, VkDynamicVpState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001014{
1015 char str[1024];
1016 if (!pCreateInfo) {
1017 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicViewportState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001018 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001019 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001020 else if (!vk_validate_vkdynamicvpstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001021 sprintf(str, "Parameter pCreateInfo to function CreateDynamicViewportState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001022 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001023 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001024 VkResult result = device_dispatch_table(device)->CreateDynamicViewportState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001025 return result;
1026}
1027
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001028VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterState(VkDevice device, const VkDynamicRsStateCreateInfo* pCreateInfo, VkDynamicRsState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001029{
1030 char str[1024];
1031 if (!pCreateInfo) {
1032 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicRasterState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001033 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001034 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001035 else if (!vk_validate_vkdynamicrsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001036 sprintf(str, "Parameter pCreateInfo to function CreateDynamicRasterState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001037 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001038 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001039 VkResult result = device_dispatch_table(device)->CreateDynamicRasterState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001040 return result;
1041}
1042
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001043VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState(VkDevice device, const VkDynamicCbStateCreateInfo* pCreateInfo, VkDynamicCbState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001044{
1045 char str[1024];
1046 if (!pCreateInfo) {
1047 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicColorBlendState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001048 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001049 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001050 else if (!vk_validate_vkdynamiccbstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001051 sprintf(str, "Parameter pCreateInfo to function CreateDynamicColorBlendState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001052 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001053 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001054 VkResult result = device_dispatch_table(device)->CreateDynamicColorBlendState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001055 return result;
1056}
1057
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001058VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState(VkDevice device, const VkDynamicDsStateCreateInfo* pCreateInfo, VkDynamicDsState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001059{
1060 char str[1024];
1061 if (!pCreateInfo) {
1062 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicDepthStencilState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001063 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001064 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001065 else if (!vk_validate_vkdynamicdsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001066 sprintf(str, "Parameter pCreateInfo to function CreateDynamicDepthStencilState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001067 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001068 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001069 VkResult result = device_dispatch_table(device)->CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001070 return result;
1071}
1072
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001073void PreCreateCommandBuffer(VkDevice device, const VkCmdBufferCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001074{
1075 if(device == nullptr)
1076 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001077 char const str[] = "vkCreateCommandBuffer parameter, VkDevice device, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001078 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001079 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001080 return;
1081 }
1082
1083 if(pCreateInfo == nullptr)
1084 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001085 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBufferCreateInfo* pCreateInfo, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001086 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001087 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001088 return;
1089 }
1090
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001091 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001092 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001093 char const str[] = "vkCreateCommandBuffer parameter, VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO "\
1094 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001095 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001096 return;
1097 }
1098}
1099
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001100void PostCreateCommandBuffer(VkResult result, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001101{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001102 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001103 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001104 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001105 char const str[] = "vkCreateCommandBuffer failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001106 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001107 return;
1108 }
1109
1110 if(pCmdBuffer == nullptr)
1111 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001112 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBuffer* pCmdBuffer, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001113 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001114 return;
1115 }
1116}
1117
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001118VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(VkDevice device,
1119 const VkCmdBufferCreateInfo* pCreateInfo, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001120{
1121 PreCreateCommandBuffer(device, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001122 VkResult result = device_dispatch_table(device)->CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001123 PostCreateCommandBuffer(result, pCmdBuffer);
1124 return result;
1125}
1126
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001127VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001128{
1129 char str[1024];
1130 if (!pBeginInfo) {
1131 sprintf(str, "Struct ptr parameter pBeginInfo to function BeginCommandBuffer is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001132 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001133 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001134 else if (!vk_validate_vkcmdbufferbegininfo(pBeginInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001135 sprintf(str, "Parameter pBeginInfo to function BeginCommandBuffer contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001136 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001137 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001138 VkResult result = device_dispatch_table(cmdBuffer)->BeginCommandBuffer(cmdBuffer, pBeginInfo);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001139 return result;
1140}
1141
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001142VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001143{
1144
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001145 VkResult result = device_dispatch_table(cmdBuffer)->EndCommandBuffer(cmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001146 return result;
1147}
1148
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001149VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001150{
1151
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001152 VkResult result = device_dispatch_table(cmdBuffer)->ResetCommandBuffer(cmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001153 return result;
1154}
1155
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001156VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001157{
1158 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001159 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001160 sprintf(str, "Parameter pipelineBindPoint to function CmdBindPipeline has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001161 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001162 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001163 device_dispatch_table(cmdBuffer)->CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001164}
1165
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001166VK_LAYER_EXPORT void VKAPI vkCmdBindDynamicStateObject(VkCmdBuffer cmdBuffer, VkStateBindPoint stateBindPoint, VkDynamicStateObject state)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001167{
1168 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001169 if (!validate_VkStateBindPoint(stateBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001170 sprintf(str, "Parameter stateBindPoint to function CmdBindDynamicStateObject has invalid value of %i.", (int)stateBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001171 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001172 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001173 device_dispatch_table(cmdBuffer)->CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001174}
1175
Mark Lobodzinskif2093b62015-06-15 13:21:21 -06001176VK_LAYER_EXPORT void VKAPI vkCmdBindDescriptorSets(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001177{
1178 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001179 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001180 sprintf(str, "Parameter pipelineBindPoint to function CmdBindDescriptorSets has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001181 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001182 }
Mark Lobodzinskif2093b62015-06-15 13:21:21 -06001183 device_dispatch_table(cmdBuffer)->CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, layout, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001184}
1185
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06001186VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
1187 VkCmdBuffer cmdBuffer,
1188 uint32_t startBinding,
1189 uint32_t bindingCount,
1190 const VkBuffer* pBuffers,
Tony Barbourd1c35722015-04-16 15:59:00 -06001191 const VkDeviceSize* pOffsets)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001192{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001193 device_dispatch_table(cmdBuffer)->CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001194}
1195
Tony Barbourd1c35722015-04-16 15:59:00 -06001196VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001197{
1198 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001199 if (!validate_VkIndexType(indexType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001200 sprintf(str, "Parameter indexType to function CmdBindIndexBuffer has invalid value of %i.", (int)indexType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001201 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001202 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001203 device_dispatch_table(cmdBuffer)->CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001204}
1205
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001206VK_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 -06001207{
1208
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001209 device_dispatch_table(cmdBuffer)->CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001210}
1211
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001212VK_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 -06001213{
1214
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001215 device_dispatch_table(cmdBuffer)->CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001216}
1217
Tony Barbourd1c35722015-04-16 15:59:00 -06001218VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001219{
1220
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001221 device_dispatch_table(cmdBuffer)->CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001222}
1223
Tony Barbourd1c35722015-04-16 15:59:00 -06001224VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001225{
1226
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001227 device_dispatch_table(cmdBuffer)->CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001228}
1229
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001230VK_LAYER_EXPORT void VKAPI vkCmdDispatch(VkCmdBuffer cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001231{
1232
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001233 device_dispatch_table(cmdBuffer)->CmdDispatch(cmdBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001234}
1235
Tony Barbourd1c35722015-04-16 15:59:00 -06001236VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001237{
1238
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001239 device_dispatch_table(cmdBuffer)->CmdDispatchIndirect(cmdBuffer, buffer, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001240}
1241
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001242VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkBuffer destBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001243{
1244 char str[1024];
1245 uint32_t i;
1246 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001247 if (!vk_validate_vkbuffercopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001248 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBuffer contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001249 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001250 }
1251 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001252 device_dispatch_table(cmdBuffer)->CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001253}
1254
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001255VK_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 -06001256{
1257 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001258 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001259 sprintf(str, "Parameter srcImageLayout to function CmdCopyImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001260 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001261 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001262 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001263 sprintf(str, "Parameter destImageLayout to function CmdCopyImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001264 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001265 }
1266 uint32_t i;
1267 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001268 if (!vk_validate_vkimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001269 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001270 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001271 }
1272 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001273 device_dispatch_table(cmdBuffer)->CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001274}
1275
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05001276VK_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 -06001277{
1278 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001279 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001280 sprintf(str, "Parameter srcImageLayout to function CmdBlitImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001281 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001282 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001283 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001284 sprintf(str, "Parameter destImageLayout to function CmdBlitImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001285 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001286 }
1287 uint32_t i;
1288 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001289 if (!vk_validate_vkimageblit(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001290 sprintf(str, "Parameter pRegions[%i] to function CmdBlitImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001291 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001292 }
1293 }
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05001294 //TODO: Add additional check for limitation from header rev 96.
1295 // VK_TEX_FILTER_NEAREST if the format that srcImage was created with is an integer-based format.
1296
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001297 device_dispatch_table(cmdBuffer)->CmdBlitImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001298}
1299
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001300VK_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 -06001301{
1302 char str[1024];
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 CmdCopyBufferToImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001305 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 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_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001310 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBufferToImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001311 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001312 }
1313 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001314 device_dispatch_table(cmdBuffer)->CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001315}
1316
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001317VK_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 -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 CmdCopyImageToBuffer has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001322 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001323 }
1324 uint32_t i;
1325 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001326 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001327 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImageToBuffer contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001328 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001329 }
1330 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001331 device_dispatch_table(cmdBuffer)->CmdCopyImageToBuffer(cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001332}
1333
Tony Barbourd1c35722015-04-16 15:59:00 -06001334VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001335{
1336
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001337 device_dispatch_table(cmdBuffer)->CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001338}
1339
Tony Barbourd1c35722015-04-16 15:59:00 -06001340VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001341{
1342
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001343 device_dispatch_table(cmdBuffer)->CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001344}
1345
Courtney Goeltzenleuchterd7a5cff2015-04-23 17:49:22 -06001346VK_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 -06001347{
1348 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001349 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001350 sprintf(str, "Parameter imageLayout to function CmdClearColorImage has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001351 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001352 }
1353 uint32_t i;
1354 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001355 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001356 sprintf(str, "Parameter pRanges[%i] to function CmdClearColorImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001357 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001358 }
1359 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001360 device_dispatch_table(cmdBuffer)->CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001361}
1362
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001363VK_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 -06001364{
1365 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001366 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001367 sprintf(str, "Parameter imageLayout to function CmdClearDepthStencil has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001368 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001369 }
1370 uint32_t i;
1371 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001372 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001373 sprintf(str, "Parameter pRanges[%i] to function CmdClearDepthStencil contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001374 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001375 }
1376 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001377 device_dispatch_table(cmdBuffer)->CmdClearDepthStencil(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001378}
1379
Tony Barbour6865d4a2015-04-13 15:02:52 -06001380VK_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 -06001381{
1382 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001383 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001384 sprintf(str, "Parameter srcImageLayout to function CmdResolveImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001385 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001386 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001387 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001388 sprintf(str, "Parameter destImageLayout to function CmdResolveImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001389 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001390 }
1391 uint32_t i;
Tony Barbour6865d4a2015-04-13 15:02:52 -06001392 for (i = 0; i < regionCount; i++) {
1393 if (!vk_validate_vkimageresolve(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001394 sprintf(str, "Parameter pRects[%i] to function CmdResolveImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001395 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001396 }
1397 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001398 device_dispatch_table(cmdBuffer)->CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001399}
1400
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001401VK_LAYER_EXPORT void VKAPI vkCmdSetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001402{
1403 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001404 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001405 sprintf(str, "Parameter pipeEvent to function CmdSetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001406 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001407 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001408 device_dispatch_table(cmdBuffer)->CmdSetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001409}
1410
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001411VK_LAYER_EXPORT void VKAPI vkCmdResetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001412{
1413 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001414 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001415 sprintf(str, "Parameter pipeEvent to function CmdResetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001416 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001417 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001418 device_dispatch_table(cmdBuffer)->CmdResetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001419}
1420
Tony Barbourd1c35722015-04-16 15:59:00 -06001421VK_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 -06001422{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001423 device_dispatch_table(cmdBuffer)->CmdWaitEvents(cmdBuffer, waitEvent, eventCount, pEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001424}
1425
Tony Barbourd1c35722015-04-16 15:59:00 -06001426VK_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 -06001427{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001428 device_dispatch_table(cmdBuffer)->CmdPipelineBarrier(cmdBuffer, waitEvent, pipeEventCount, pPipeEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001429}
1430
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001431VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001432{
1433
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001434 device_dispatch_table(cmdBuffer)->CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001435}
1436
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001437VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001438{
1439
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001440 device_dispatch_table(cmdBuffer)->CmdEndQuery(cmdBuffer, queryPool, slot);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001441}
1442
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001443VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001444{
1445
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001446 device_dispatch_table(cmdBuffer)->CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001447}
1448
Tony Barbourd1c35722015-04-16 15:59:00 -06001449VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkTimestampType timestampType, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001450{
1451 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001452 if (!validate_VkTimestampType(timestampType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001453 sprintf(str, "Parameter timestampType to function CmdWriteTimestamp has invalid value of %i.", (int)timestampType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001454 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001455 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001456 device_dispatch_table(cmdBuffer)->CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001457}
1458
Jeremy Hayesad367152015-04-17 10:36:53 -06001459VK_LAYER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(
1460 VkCmdBuffer cmdBuffer,
1461 VkQueryPool queryPool,
1462 uint32_t startQuery,
1463 uint32_t queryCount,
1464 VkBuffer destBuffer,
1465 VkDeviceSize destOffset,
1466 VkDeviceSize destStride,
1467 VkQueryResultFlags flags)
1468{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001469 device_dispatch_table(cmdBuffer)->CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, destStride, flags);
Jeremy Hayesad367152015-04-17 10:36:53 -06001470}
1471
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001472VK_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 -06001473{
1474 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001475 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001476 sprintf(str, "Parameter pipelineBindPoint to function CmdInitAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001477 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001478 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001479 device_dispatch_table(cmdBuffer)->CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001480}
1481
Tony Barbourd1c35722015-04-16 15:59:00 -06001482VK_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 -06001483{
1484 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001485 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001486 sprintf(str, "Parameter pipelineBindPoint to function CmdLoadAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001487 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001488 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001489 device_dispatch_table(cmdBuffer)->CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001490}
1491
Tony Barbourd1c35722015-04-16 15:59:00 -06001492VK_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 -06001493{
1494 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001495 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001496 sprintf(str, "Parameter pipelineBindPoint to function CmdSaveAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001497 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001498 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001499 device_dispatch_table(cmdBuffer)->CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001500}
1501
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001502VK_LAYER_EXPORT VkResult VKAPI vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, VkFramebuffer* pFramebuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001503{
1504 char str[1024];
1505 if (!pCreateInfo) {
1506 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFramebuffer is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001507 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001508 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001509 else if (!vk_validate_vkframebuffercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001510 sprintf(str, "Parameter pCreateInfo to function CreateFramebuffer contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001511 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001512 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001513 VkResult result = device_dispatch_table(device)->CreateFramebuffer(device, pCreateInfo, pFramebuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001514 return result;
1515}
1516
1517
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001518void PreCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001519{
1520 if(pCreateInfo == nullptr)
1521 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001522 char const str[] = "vkCreateRenderPass parameter, VkRenderPassCreateInfo* pCreateInfo, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001523 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001524 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001525 return;
1526 }
1527
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001528 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001529 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001530 char const str[] = "vkCreateRenderPass parameter, VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO "\
1531 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001532 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001533 return;
1534 }
1535
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001536 if(!vk_validate_vkrect(&pCreateInfo->renderArea))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001537 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001538 char const str[] = "vkCreateRenderPass parameter, VkRect pCreateInfo->renderArea, is invalid "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001539 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001540 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001541 return;
1542 }
1543
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001544 if(!vk_validate_vkextent2d(&pCreateInfo->extent))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001545 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001546 char const str[] = "vkCreateRenderPass parameter, VkExtent2D pCreateInfo->extent, is invalid "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001547 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001548 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001549 return;
1550 }
1551
1552 if(pCreateInfo->pColorFormats == nullptr)
1553 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001554 char const str[] = "vkCreateRenderPass parameter, VkFormat* pCreateInfo->pColorFormats, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001555 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001556 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001557 return;
1558 }
1559
1560 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1561 {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001562 if(!validate_VkFormat(pCreateInfo->pColorFormats[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001563 {
1564 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001565 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001566 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001567 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001568 continue;
1569 }
1570
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001571 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001572 size_t size = sizeof(properties);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001573 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->pColorFormats[i],
Tony Barbourd1c35722015-04-16 15:59:00 -06001574 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001575 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001576 {
1577 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001578 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001579 "], cannot be validated (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001580 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001581 continue;
1582 }
1583
1584 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1585 {
1586 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001587 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001588 "], contains unsupported format (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001589 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001590 continue;
1591 }
1592
1593 }
1594
1595 if(pCreateInfo->pColorLayouts == nullptr)
1596 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001597 char const str[] = "vkCreateRenderPass parameter, VkImageLayout* pCreateInfo->pColorLayouts, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001598 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001599 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001600 return;
1601 }
1602
1603 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1604 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001605 if(!validate_VkImageLayout(pCreateInfo->pColorLayouts[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001606 {
1607 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001608 ss << "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pColorLayouts[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001609 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001610 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001611 continue;
1612 }
1613 }
1614
1615 if(pCreateInfo->pColorLoadOps == nullptr)
1616 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001617 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp* pCreateInfo->pColorLoadOps, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001618 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001619 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001620 return;
1621 }
1622
1623 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1624 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001625 if(!validate_VkAttachmentLoadOp(pCreateInfo->pColorLoadOps[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001626 {
1627 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001628 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pColorLoadOps[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001629 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001630 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001631 continue;
1632 }
1633 }
1634
1635 if(pCreateInfo->pColorStoreOps == nullptr)
1636 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001637 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp* pCreateInfo->pColorStoreOps, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001638 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001639 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001640 return;
1641 }
1642
1643 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1644 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001645 if(!validate_VkAttachmentStoreOp(pCreateInfo->pColorStoreOps[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001646 {
1647 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001648 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pColorStoreOps[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001649 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001650 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001651 continue;
1652 }
1653 }
1654
1655 if(pCreateInfo->pColorLoadClearValues == nullptr)
1656 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001657 char const str[] = "vkCreateRenderPass parameter, VkClearColor* pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001658 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001659 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001660 return;
1661 }
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001662
1663 if(pCreateInfo->pColorStoreOps == nullptr)
1664 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001665 char const str[] = "vkCreateRenderPass parameter, VK_ATTACHMENT_STORE_OP* pCreateInfo->pColorStoreOps, "\
Jeremy Hayes090f0ce2015-04-07 13:38:03 -06001666 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001667 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001668 return;
1669 }
1670
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001671 if(pCreateInfo->pColorLoadClearValues == nullptr)
1672 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001673 char const str[] = "vkCreateRenderPass parameter, VK_CLEAR_COLOR* pCreateInfo->"\
Jeremy Hayes090f0ce2015-04-07 13:38:03 -06001674 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001675 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001676 return;
1677 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001678
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001679 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1680 {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001681 if(!vk_validate_vkclearcolor(&(pCreateInfo->pColorLoadClearValues[i])))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001682 {
1683 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001684 ss << "vkCreateRenderPass parameter, VkClearColor pCreateInfo->pColorLoadClearValues[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001685 "], is invalid (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001686 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001687 continue;
1688 }
1689 }
1690
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001691 if(!validate_VkFormat(pCreateInfo->depthStencilFormat))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001692 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001693 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001694 "depthStencilFormat, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001695 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001696 return;
1697 }
1698
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001699 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001700 size_t size = sizeof(properties);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001701 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->depthStencilFormat,
Tony Barbourd1c35722015-04-16 15:59:00 -06001702 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001703 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001704 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001705 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001706 "depthStencilFormat, cannot be validated (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001707 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001708 return;
1709 }
1710
1711 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1712 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001713 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001714 "depthStencilFormat, contains unsupported format (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001715 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001716 return;
1717 }
1718
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001719 if(!validate_VkImageLayout(pCreateInfo->depthStencilLayout))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001720 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001721 char const str[] = "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001722 "depthStencilLayout, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001723 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001724 return;
1725 }
1726
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001727 if(!validate_VkAttachmentLoadOp(pCreateInfo->depthLoadOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001728 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001729 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001730 "depthLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001731 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001732 return;
1733 }
1734
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001735 if(!validate_VkAttachmentStoreOp(pCreateInfo->depthStoreOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001736 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001737 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001738 "depthStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001739 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001740 return;
1741 }
1742
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001743 if(!validate_VkAttachmentLoadOp(pCreateInfo->stencilLoadOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001744 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001745 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001746 "stencilLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001747 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001748 return;
1749 }
1750
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001751 if(!validate_VkAttachmentStoreOp(pCreateInfo->stencilStoreOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001752 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001753 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001754 "stencilStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001755 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001756 return;
1757 }
1758}
1759
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001760void PostCreateRenderPass(VkResult result, VkRenderPass* pRenderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001761{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001762 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001763 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001764 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001765 char const str[] = "vkCreateRenderPass failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001766 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001767 return;
1768 }
1769
1770 if(pRenderPass == nullptr)
1771 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001772 char const str[] = "vkCreateRenderPass parameter, VkRenderPass* pRenderPass, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001773 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001774 return;
1775 }
1776}
1777
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001778VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, VkRenderPass* pRenderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001779{
1780 PreCreateRenderPass(device, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001781 VkResult result = device_dispatch_table(device)->CreateRenderPass(device, pCreateInfo, pRenderPass);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001782 PostCreateRenderPass(result, pRenderPass);
1783 return result;
1784}
1785
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001786VK_LAYER_EXPORT void VKAPI vkCmdBeginRenderPass(VkCmdBuffer cmdBuffer, const VkRenderPassBegin* pRenderPassBegin)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001787{
1788 char str[1024];
1789 if (!pRenderPassBegin) {
1790 sprintf(str, "Struct ptr parameter pRenderPassBegin to function CmdBeginRenderPass is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001791 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001792 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001793 else if (!vk_validate_vkrenderpassbegin(pRenderPassBegin)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001794 sprintf(str, "Parameter pRenderPassBegin to function CmdBeginRenderPass contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001795 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001796 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001797 device_dispatch_table(cmdBuffer)->CmdBeginRenderPass(cmdBuffer, pRenderPassBegin);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001798}
1799
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001800VK_LAYER_EXPORT void VKAPI vkCmdEndRenderPass(VkCmdBuffer cmdBuffer, VkRenderPass renderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001801{
1802
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001803 device_dispatch_table(cmdBuffer)->CmdEndRenderPass(cmdBuffer, renderPass);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001804}
1805
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001806VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback(
1807 VkInstance instance,
1808 VkFlags msgFlags,
1809 const PFN_vkDbgMsgCallback pfnMsgCallback,
1810 void* pUserData,
1811 VkDbgMsgCallback* pMsgCallback)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001812{
Jon Ashburn9eed2892015-06-01 10:02:09 -06001813 VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(instance);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001814 return layer_create_msg_callback(instance, pTable, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001815}
1816
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06001817VK_LAYER_EXPORT VkResult VKAPI vkDbgDestroyMsgCallback(
1818 VkInstance instance,
1819 VkDbgMsgCallback msgCallback)
1820{
Courtney Goeltzenleuchter0daf2282015-06-13 21:22:12 -06001821 VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(instance);
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06001822 return layer_destroy_msg_callback(instance, pTable, msgCallback);
1823}
1824
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001825VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerBegin(VkCmdBuffer cmdBuffer, const char* pMarker)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001826{
Jon Ashburneab34492015-06-01 09:37:38 -06001827 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) cmdBuffer;
1828 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001829 char const str[] = "Attempt to use CmdDbgMarkerBegin but extension disabled!";
1830 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburneab34492015-06-01 09:37:38 -06001831 return;
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001832 }
Jon Ashburneab34492015-06-01 09:37:38 -06001833 debug_marker_dispatch_table(cmdBuffer)->CmdDbgMarkerBegin(cmdBuffer, pMarker);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001834}
1835
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001836VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerEnd(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001837{
Jon Ashburneab34492015-06-01 09:37:38 -06001838 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) cmdBuffer;
1839 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001840 char const str[] = "Attempt to use CmdDbgMarkerEnd but extension disabled!";
1841 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburneab34492015-06-01 09:37:38 -06001842 return;
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001843 }
Jon Ashburneab34492015-06-01 09:37:38 -06001844 debug_marker_dispatch_table(cmdBuffer)->CmdDbgMarkerEnd(cmdBuffer);
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001845}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001846
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001847VkResult VKAPI vkDbgSetObjectTag(VkDevice device, VkObjectType objType, VkObject object, size_t tagSize, const void* pTag)
1848{
Jon Ashburneab34492015-06-01 09:37:38 -06001849 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
1850 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001851 char const str[] = "Attempt to use DbgSetObjectTag but extension disabled!";
1852 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburneab34492015-06-01 09:37:38 -06001853 return VK_ERROR_UNAVAILABLE;
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001854 }
Jon Ashburneab34492015-06-01 09:37:38 -06001855 debug_marker_dispatch_table(device)->DbgSetObjectTag(device, objType, object, tagSize, pTag);
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001856}
1857
1858VkResult VKAPI vkDbgSetObjectName(VkDevice device, VkObjectType objType, VkObject object, size_t nameSize, const char* pName)
1859{
Jon Ashburneab34492015-06-01 09:37:38 -06001860 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
1861 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001862 char const str[] = "Attempt to use DbgSetObjectName but extension disabled!";
1863 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburneab34492015-06-01 09:37:38 -06001864 return VK_ERROR_UNAVAILABLE;
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001865 }
Jon Ashburneab34492015-06-01 09:37:38 -06001866 debug_marker_dispatch_table(device)->DbgSetObjectName(device, objType, object, nameSize, pName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001867}
1868
Chia-I Wuf8693382015-04-16 22:02:10 +08001869VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI(VkDevice device, const VkSwapChainCreateInfoWSI* pCreateInfo, VkSwapChainWSI* pSwapChain)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001870{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001871 VkResult result = device_dispatch_table(device)->CreateSwapChainWSI(device, pCreateInfo, pSwapChain);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001872 return result;
1873}
1874
Chia-I Wuf8693382015-04-16 22:02:10 +08001875VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapChainWSI(VkSwapChainWSI swapChain)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001876{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001877 VkResult result = device_dispatch_table(swapChain)->DestroySwapChainWSI(swapChain);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001878 return result;
1879}
1880
Chia-I Wuf8693382015-04-16 22:02:10 +08001881VK_LAYER_EXPORT VkResult VKAPI vkGetSwapChainInfoWSI(VkSwapChainWSI swapChain, VkSwapChainInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001882{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001883 VkResult result = device_dispatch_table(swapChain)->GetSwapChainInfoWSI(swapChain, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001884 return result;
1885}
1886
Chia-I Wuf8693382015-04-16 22:02:10 +08001887VK_LAYER_EXPORT VkResult VKAPI vkQueuePresentWSI(VkQueue queue, const VkPresentInfoWSI* pPresentInfo)
1888{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001889 VkResult result = device_dispatch_table(queue)->QueuePresentWSI(queue, pPresentInfo);
Chia-I Wuf8693382015-04-16 22:02:10 +08001890 return result;
1891}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001892
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001893static inline void* layer_intercept_proc(const char *name)
1894{
1895 if (!name || name[0] != 'v' || name[1] != 'k')
1896 return NULL;
1897
1898 name += 2;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001899 if (!strcmp(name, "DestroyDevice"))
1900 return (void*) vkDestroyDevice;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001901 if (!strcmp(name, "GetDeviceQueue"))
1902 return (void*) vkGetDeviceQueue;
1903 if (!strcmp(name, "QueueSubmit"))
1904 return (void*) vkQueueSubmit;
1905 if (!strcmp(name, "QueueWaitIdle"))
1906 return (void*) vkQueueWaitIdle;
1907 if (!strcmp(name, "DeviceWaitIdle"))
1908 return (void*) vkDeviceWaitIdle;
1909 if (!strcmp(name, "AllocMemory"))
1910 return (void*) vkAllocMemory;
1911 if (!strcmp(name, "FreeMemory"))
1912 return (void*) vkFreeMemory;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001913 if (!strcmp(name, "MapMemory"))
1914 return (void*) vkMapMemory;
1915 if (!strcmp(name, "UnmapMemory"))
1916 return (void*) vkUnmapMemory;
1917 if (!strcmp(name, "FlushMappedMemoryRanges"))
1918 return (void*) vkFlushMappedMemoryRanges;
1919 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
1920 return (void*) vkInvalidateMappedMemoryRanges;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001921 if (!strcmp(name, "DestroyObject"))
1922 return (void*) vkDestroyObject;
1923 if (!strcmp(name, "GetObjectInfo"))
1924 return (void*) vkGetObjectInfo;
1925 if (!strcmp(name, "CreateFence"))
1926 return (void*) vkCreateFence;
1927 if (!strcmp(name, "ResetFences"))
1928 return (void*) vkResetFences;
1929 if (!strcmp(name, "GetFenceStatus"))
1930 return (void*) vkGetFenceStatus;
1931 if (!strcmp(name, "WaitForFences"))
1932 return (void*) vkWaitForFences;
1933 if (!strcmp(name, "CreateSemaphore"))
1934 return (void*) vkCreateSemaphore;
1935 if (!strcmp(name, "QueueSignalSemaphore"))
1936 return (void*) vkQueueSignalSemaphore;
1937 if (!strcmp(name, "QueueWaitSemaphore"))
1938 return (void*) vkQueueWaitSemaphore;
1939 if (!strcmp(name, "CreateEvent"))
1940 return (void*) vkCreateEvent;
1941 if (!strcmp(name, "GetEventStatus"))
1942 return (void*) vkGetEventStatus;
1943 if (!strcmp(name, "SetEvent"))
1944 return (void*) vkSetEvent;
1945 if (!strcmp(name, "ResetEvent"))
1946 return (void*) vkResetEvent;
1947 if (!strcmp(name, "CreateQueryPool"))
1948 return (void*) vkCreateQueryPool;
1949 if (!strcmp(name, "GetQueryPoolResults"))
1950 return (void*) vkGetQueryPoolResults;
1951 if (!strcmp(name, "GetFormatInfo"))
1952 return (void*) vkGetFormatInfo;
1953 if (!strcmp(name, "CreateBuffer"))
1954 return (void*) vkCreateBuffer;
1955 if (!strcmp(name, "CreateBufferView"))
1956 return (void*) vkCreateBufferView;
1957 if (!strcmp(name, "CreateImage"))
1958 return (void*) vkCreateImage;
1959 if (!strcmp(name, "GetImageSubresourceInfo"))
1960 return (void*) vkGetImageSubresourceInfo;
1961 if (!strcmp(name, "CreateImageView"))
1962 return (void*) vkCreateImageView;
1963 if (!strcmp(name, "CreateColorAttachmentView"))
1964 return (void*) vkCreateColorAttachmentView;
1965 if (!strcmp(name, "CreateDepthStencilView"))
1966 return (void*) vkCreateDepthStencilView;
1967 if (!strcmp(name, "CreateShader"))
1968 return (void*) vkCreateShader;
1969 if (!strcmp(name, "CreateGraphicsPipeline"))
1970 return (void*) vkCreateGraphicsPipeline;
1971 if (!strcmp(name, "CreateGraphicsPipelineDerivative"))
1972 return (void*) vkCreateGraphicsPipelineDerivative;
1973 if (!strcmp(name, "CreateComputePipeline"))
1974 return (void*) vkCreateComputePipeline;
1975 if (!strcmp(name, "StorePipeline"))
1976 return (void*) vkStorePipeline;
1977 if (!strcmp(name, "LoadPipeline"))
1978 return (void*) vkLoadPipeline;
1979 if (!strcmp(name, "LoadPipelineDerivative"))
1980 return (void*) vkLoadPipelineDerivative;
1981 if (!strcmp(name, "CreatePipelineLayout"))
1982 return (void*) vkCreatePipelineLayout;
1983 if (!strcmp(name, "CreateSampler"))
1984 return (void*) vkCreateSampler;
1985 if (!strcmp(name, "CreateDescriptorSetLayout"))
1986 return (void*) vkCreateDescriptorSetLayout;
1987 if (!strcmp(name, "CreateDescriptorPool"))
1988 return (void*) vkCreateDescriptorPool;
1989 if (!strcmp(name, "ResetDescriptorPool"))
1990 return (void*) vkResetDescriptorPool;
1991 if (!strcmp(name, "AllocDescriptorSets"))
1992 return (void*) vkAllocDescriptorSets;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001993 if (!strcmp(name, "CreateDynamicViewportState"))
1994 return (void*) vkCreateDynamicViewportState;
1995 if (!strcmp(name, "CreateDynamicRasterState"))
1996 return (void*) vkCreateDynamicRasterState;
1997 if (!strcmp(name, "CreateDynamicColorBlendState"))
1998 return (void*) vkCreateDynamicColorBlendState;
1999 if (!strcmp(name, "CreateDynamicDepthStencilState"))
2000 return (void*) vkCreateDynamicDepthStencilState;
2001 if (!strcmp(name, "CreateCommandBuffer"))
2002 return (void*) vkCreateCommandBuffer;
2003 if (!strcmp(name, "BeginCommandBuffer"))
2004 return (void*) vkBeginCommandBuffer;
2005 if (!strcmp(name, "EndCommandBuffer"))
2006 return (void*) vkEndCommandBuffer;
2007 if (!strcmp(name, "ResetCommandBuffer"))
2008 return (void*) vkResetCommandBuffer;
2009 if (!strcmp(name, "CmdBindPipeline"))
2010 return (void*) vkCmdBindPipeline;
2011 if (!strcmp(name, "CmdBindDynamicStateObject"))
2012 return (void*) vkCmdBindDynamicStateObject;
2013 if (!strcmp(name, "CmdBindDescriptorSets"))
2014 return (void*) vkCmdBindDescriptorSets;
2015 if (!strcmp(name, "CmdBindVertexBuffers"))
2016 return (void*) vkCmdBindVertexBuffers;
2017 if (!strcmp(name, "CmdBindIndexBuffer"))
2018 return (void*) vkCmdBindIndexBuffer;
2019 if (!strcmp(name, "CmdDraw"))
2020 return (void*) vkCmdDraw;
2021 if (!strcmp(name, "CmdDrawIndexed"))
2022 return (void*) vkCmdDrawIndexed;
2023 if (!strcmp(name, "CmdDrawIndirect"))
2024 return (void*) vkCmdDrawIndirect;
2025 if (!strcmp(name, "CmdDrawIndexedIndirect"))
2026 return (void*) vkCmdDrawIndexedIndirect;
2027 if (!strcmp(name, "CmdDispatch"))
2028 return (void*) vkCmdDispatch;
2029 if (!strcmp(name, "CmdDispatchIndirect"))
2030 return (void*) vkCmdDispatchIndirect;
2031 if (!strcmp(name, "CmdCopyBuffer"))
2032 return (void*) vkCmdCopyBuffer;
2033 if (!strcmp(name, "CmdCopyImage"))
2034 return (void*) vkCmdCopyImage;
2035 if (!strcmp(name, "CmdBlitImage"))
2036 return (void*) vkCmdBlitImage;
2037 if (!strcmp(name, "CmdCopyBufferToImage"))
2038 return (void*) vkCmdCopyBufferToImage;
2039 if (!strcmp(name, "CmdCopyImageToBuffer"))
2040 return (void*) vkCmdCopyImageToBuffer;
2041 if (!strcmp(name, "CmdUpdateBuffer"))
2042 return (void*) vkCmdUpdateBuffer;
2043 if (!strcmp(name, "CmdFillBuffer"))
2044 return (void*) vkCmdFillBuffer;
2045 if (!strcmp(name, "CmdClearColorImage"))
2046 return (void*) vkCmdClearColorImage;
2047 if (!strcmp(name, "CmdClearDepthStencil"))
2048 return (void*) vkCmdClearDepthStencil;
2049 if (!strcmp(name, "CmdResolveImage"))
2050 return (void*) vkCmdResolveImage;
2051 if (!strcmp(name, "CmdSetEvent"))
2052 return (void*) vkCmdSetEvent;
2053 if (!strcmp(name, "CmdResetEvent"))
2054 return (void*) vkCmdResetEvent;
2055 if (!strcmp(name, "CmdWaitEvents"))
2056 return (void*) vkCmdWaitEvents;
2057 if (!strcmp(name, "CmdPipelineBarrier"))
2058 return (void*) vkCmdPipelineBarrier;
2059 if (!strcmp(name, "CmdBeginQuery"))
2060 return (void*) vkCmdBeginQuery;
2061 if (!strcmp(name, "CmdEndQuery"))
2062 return (void*) vkCmdEndQuery;
2063 if (!strcmp(name, "CmdResetQueryPool"))
2064 return (void*) vkCmdResetQueryPool;
2065 if (!strcmp(name, "CmdWriteTimestamp"))
2066 return (void*) vkCmdWriteTimestamp;
2067 if (!strcmp(name, "CmdCopyQueryPoolResults"))
2068 return (void*) vkCmdCopyQueryPoolResults;
2069 if (!strcmp(name, "CmdInitAtomicCounters"))
2070 return (void*) vkCmdInitAtomicCounters;
2071 if (!strcmp(name, "CmdLoadAtomicCounters"))
2072 return (void*) vkCmdLoadAtomicCounters;
2073 if (!strcmp(name, "CmdSaveAtomicCounters"))
2074 return (void*) vkCmdSaveAtomicCounters;
2075 if (!strcmp(name, "CreateFramebuffer"))
2076 return (void*) vkCreateFramebuffer;
2077 if (!strcmp(name, "CreateRenderPass"))
2078 return (void*) vkCreateRenderPass;
2079 if (!strcmp(name, "CmdBeginRenderPass"))
2080 return (void*) vkCmdBeginRenderPass;
2081 if (!strcmp(name, "CmdEndRenderPass"))
2082 return (void*) vkCmdEndRenderPass;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002083
2084 return NULL;
2085}
2086
2087static inline void* layer_intercept_instance_proc(const char *name)
2088{
2089 if (!name || name[0] != 'v' || name[1] != 'k')
2090 return NULL;
2091
2092 name += 2;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002093 if (!strcmp(name, "CreateInstance"))
2094 return (void*) vkCreateInstance;
2095 if (!strcmp(name, "DestroyInstance"))
2096 return (void*) vkDestroyInstance;
2097 if (!strcmp(name, "GetPhysicalDeviceInfo"))
2098 return (void*) vkGetPhysicalDeviceInfo;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002099 if (!strcmp(name, "CreateDevice"))
2100 return (void*) vkCreateDevice;
2101 if (!strcmp(name, "GetGlobalExtensionInfo"))
2102 return (void*) vkGetGlobalExtensionInfo;
2103 if (!strcmp(name, "GetPhysicalDeviceExtensionInfo"))
2104 return (void*) vkGetPhysicalDeviceExtensionInfo;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002105
2106 return NULL;
2107}
2108
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06002109VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002110{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002111 void* addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002112 if (device == NULL) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002113 return NULL;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002114 }
2115
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -06002116 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn8fd08252015-05-28 16:25:02 -06002117
2118 /* loader uses this to force layer initialization; device object is wrapped */
2119 if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
2120 initDeviceTable((const VkBaseLayerObject *) device);
2121 return (void*) vkGetDeviceProcAddr;
2122 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002123
2124 addr = layer_intercept_proc(funcName);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002125 if (addr) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002126 return addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002127 }
Jon Ashburneab34492015-06-01 09:37:38 -06002128
Jon Ashburn747f2b62015-06-18 15:02:58 -06002129 VkLayerDispatchTable *pDisp = device_dispatch_table(device);
2130 if (deviceExtMap.size() == 0 || deviceExtMap[pDisp].wsi_lunarg_enabled)
Jon Ashburneab34492015-06-01 09:37:38 -06002131 {
Jon Ashburn747f2b62015-06-18 15:02:58 -06002132 if (!strcmp(funcName, "vkCreateSwapChainWSI"))
2133 return (void*) vkCreateSwapChainWSI;
2134 if (!strcmp(funcName, "vkDestroySwapChainWSI"))
2135 return (void*) vkDestroySwapChainWSI;
2136 if (!strcmp(funcName, "vkGetSwapChainInfoWSI"))
2137 return (void*) vkGetSwapChainInfoWSI;
2138 if (!strcmp(funcName, "vkQueuePresentWSI"))
2139 return (void*) vkQueuePresentWSI;
2140 }
2141 if (deviceExtMap.size() == 0 || deviceExtMap[pDisp].debug_marker_enabled)
2142 {
2143 if (!strcmp(funcName, "vkCmdDbgMarkerBegin"))
Jon Ashburneab34492015-06-01 09:37:38 -06002144 return (void*) vkCmdDbgMarkerBegin;
Jon Ashburn747f2b62015-06-18 15:02:58 -06002145 if (!strcmp(funcName, "vkCmdDbgMarkerEnd"))
Jon Ashburneab34492015-06-01 09:37:38 -06002146 return (void*) vkCmdDbgMarkerEnd;
Jon Ashburn747f2b62015-06-18 15:02:58 -06002147 if (!strcmp(funcName, "vkDbgSetObjectTag"))
Jon Ashburneab34492015-06-01 09:37:38 -06002148 return (void*) vkDbgSetObjectTag;
Jon Ashburn747f2b62015-06-18 15:02:58 -06002149 if (!strcmp(funcName, "vkDbgSetObjectName"))
Jon Ashburneab34492015-06-01 09:37:38 -06002150 return (void*) vkDbgSetObjectName;
2151 }
2152 {
Jon Ashburn747f2b62015-06-18 15:02:58 -06002153 if (pDisp->GetDeviceProcAddr == NULL)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002154 return NULL;
Jon Ashburn747f2b62015-06-18 15:02:58 -06002155 return pDisp->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002156 }
2157}
2158
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002159VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002160{
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06002161 void *fptr;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002162 void* addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002163 if (instance == NULL) {
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002164 return NULL;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002165 }
2166
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -06002167 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn8fd08252015-05-28 16:25:02 -06002168
2169 /* loader uses this to force layer initialization; instance object is wrapped */
2170 if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
2171 initInstanceTable((const VkBaseLayerObject *) instance);
2172 return (void*) vkGetInstanceProcAddr;
2173 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002174
2175 addr = layer_intercept_instance_proc(funcName);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002176 if (addr) {
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002177 return addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002178 }
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06002179
2180 fptr = msg_callback_get_proc_addr(funcName);
2181 if (fptr)
2182 return fptr;
2183
Jon Ashburn9eed2892015-06-01 10:02:09 -06002184 VkLayerInstanceDispatchTable* pTable = instance_dispatch_table(instance);
2185 if (pTable->GetInstanceProcAddr == NULL)
2186 return NULL;
2187 return pTable->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002188}