blob: a0e1fde194df3ae52f70709c45ca692f9f12bd7b [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
Tony Barbourd1c35722015-04-16 15:59:00 -0600478VK_LAYER_EXPORT VkResult VKAPI vkGetMultiDeviceCompatibility(VkPhysicalDevice gpu0, VkPhysicalDevice gpu1, VkPhysicalDeviceCompatibilityInfo* pInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600479{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600480
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500481 VkResult result = instance_dispatch_table(gpu0)->GetMultiDeviceCompatibility(gpu0, gpu1, pInfo);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600482 return result;
483}
484
Tony Barbourd1c35722015-04-16 15:59:00 -0600485VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedMemory(VkDevice device, const VkMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600486{
487 char str[1024];
488 if (!pOpenInfo) {
489 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedMemory is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600490 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600491 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600492 else if (!vk_validate_vkmemoryopeninfo(pOpenInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600493 sprintf(str, "Parameter pOpenInfo to function OpenSharedMemory contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600494 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600495 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500496 VkResult result = device_dispatch_table(device)->OpenSharedMemory(device, pOpenInfo, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600497 return result;
498}
499
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600500VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedSemaphore(VkDevice device, const VkSemaphoreOpenInfo* pOpenInfo, VkSemaphore* pSemaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600501{
502 char str[1024];
503 if (!pOpenInfo) {
504 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenSharedSemaphore is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600505 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600506 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600507 else if (!vk_validate_vksemaphoreopeninfo(pOpenInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600508 sprintf(str, "Parameter pOpenInfo to function OpenSharedSemaphore contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600509 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600510 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500511 VkResult result = device_dispatch_table(device)->OpenSharedSemaphore(device, pOpenInfo, pSemaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600512 return result;
513}
514
Tony Barbourd1c35722015-04-16 15:59:00 -0600515VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerMemory(VkDevice device, const VkPeerMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600516{
517 char str[1024];
518 if (!pOpenInfo) {
519 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerMemory is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600520 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600521 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600522 else if (!vk_validate_vkpeermemoryopeninfo(pOpenInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600523 sprintf(str, "Parameter pOpenInfo to function OpenPeerMemory contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600524 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600525 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500526 VkResult result = device_dispatch_table(device)->OpenPeerMemory(device, pOpenInfo, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600527 return result;
528}
529
Tony Barbourd1c35722015-04-16 15:59:00 -0600530VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerImage(VkDevice device, const VkPeerImageOpenInfo* pOpenInfo, VkImage* pImage, VkDeviceMemory* pMem)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600531{
532 char str[1024];
533 if (!pOpenInfo) {
534 sprintf(str, "Struct ptr parameter pOpenInfo to function OpenPeerImage is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600535 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600536 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600537 else if (!vk_validate_vkpeerimageopeninfo(pOpenInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600538 sprintf(str, "Parameter pOpenInfo to function OpenPeerImage contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600539 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600540 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500541 VkResult result = device_dispatch_table(device)->OpenPeerImage(device, pOpenInfo, pImage, pMem);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600542 return result;
543}
544
Mike Stroyanb050c682015-04-17 12:36:38 -0600545VK_LAYER_EXPORT VkResult VKAPI vkDestroyObject(VkDevice device, VkObjectType objType, VkObject object)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600546{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500547 VkResult result = device_dispatch_table(device)->DestroyObject(device, objType, object);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600548 return result;
549}
550
Mike Stroyanb050c682015-04-17 12:36:38 -0600551VK_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 -0600552{
553 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600554 if (!validate_VkObjectInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600555 sprintf(str, "Parameter infoType to function GetObjectInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600556 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600557 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500558 VkResult result = device_dispatch_table(device)->GetObjectInfo(device, objType, object, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600559 return result;
560}
561
Mark Lobodzinski23065352015-05-29 09:32:35 -0500562VK_LAYER_EXPORT VkResult VKAPI vkBindObjectMemory(VkDevice device, VkObjectType objType, VkObject object, VkDeviceMemory mem, VkDeviceSize offset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600563{
564
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500565 VkResult result = device_dispatch_table(device)->BindObjectMemory(device, objType, object, mem, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600566 return result;
567}
568
Mark Lobodzinski23065352015-05-29 09:32:35 -0500569VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(VkQueue queue, VkBuffer buffer, VkDeviceSize rangeOffset, VkDeviceSize rangeSize, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600570{
571
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500572 VkResult result = device_dispatch_table(queue)->QueueBindSparseBufferMemory(queue, buffer, rangeOffset, rangeSize, mem, memOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600573 return result;
574}
575
Mark Lobodzinski23065352015-05-29 09:32:35 -0500576VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageMemory(VkQueue queue, VkImage image, const VkImageMemoryBindInfo* pBindInfo, VkDeviceMemory mem, VkDeviceSize memOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600577{
578 char str[1024];
Jeremy Hayesaf0d72c2015-04-15 15:20:03 -0600579 if (!pBindInfo) {
Mark Lobodzinski942b1722015-05-11 17:21:15 -0500580 sprintf(str, "Struct ptr parameter pBindInfo to function QueueBindSparseImageMemory is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600581 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600582 }
Jeremy Hayesaf0d72c2015-04-15 15:20:03 -0600583 else if (!vk_validate_vkimagememorybindinfo(pBindInfo)) {
584 sprintf(str, "Parameter pBindInfo to function BindImageMemoryRange contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600585 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600586 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500587 VkResult result = device_dispatch_table(queue)->QueueBindSparseImageMemory(queue, image, pBindInfo, mem, memOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600588 return result;
589}
590
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600591VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(VkDevice device, const VkFenceCreateInfo* pCreateInfo, VkFence* pFence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600592{
593 char str[1024];
594 if (!pCreateInfo) {
595 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFence is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600596 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600597 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600598 else if (!vk_validate_vkfencecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600599 sprintf(str, "Parameter pCreateInfo to function CreateFence contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600600 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600601 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500602 VkResult result = device_dispatch_table(device)->CreateFence(device, pCreateInfo, pFence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600603 return result;
604}
605
Mike Stroyanb050c682015-04-17 12:36:38 -0600606VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(VkDevice device, VkFence fence)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600607{
608
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500609 VkResult result = device_dispatch_table(device)->GetFenceStatus(device, fence);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600610 return result;
611}
612
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600613VK_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 -0600614{
615
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500616 VkResult result = device_dispatch_table(device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600617 return result;
618}
619
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600620VK_LAYER_EXPORT VkResult VKAPI vkResetFences(VkDevice device, uint32_t fenceCount, VkFence* pFences)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500621{
622
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500623 VkResult result = device_dispatch_table(device)->ResetFences(device, fenceCount, pFences);
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500624 return result;
625}
626
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600627VK_LAYER_EXPORT VkResult VKAPI vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, VkSemaphore* pSemaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600628{
629 char str[1024];
630 if (!pCreateInfo) {
631 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSemaphore is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600632 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600633 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600634 else if (!vk_validate_vksemaphorecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600635 sprintf(str, "Parameter pCreateInfo to function CreateSemaphore contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600636 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600637 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500638 VkResult result = device_dispatch_table(device)->CreateSemaphore(device, pCreateInfo, pSemaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600639 return result;
640}
641
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600642VK_LAYER_EXPORT VkResult VKAPI vkQueueSignalSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600643{
644
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500645 VkResult result = device_dispatch_table(queue)->QueueSignalSemaphore(queue, semaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600646 return result;
647}
648
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600649VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitSemaphore(VkQueue queue, VkSemaphore semaphore)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600650{
651
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500652 VkResult result = device_dispatch_table(queue)->QueueWaitSemaphore(queue, semaphore);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600653 return result;
654}
655
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600656VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(VkDevice device, const VkEventCreateInfo* pCreateInfo, VkEvent* pEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600657{
658 char str[1024];
659 if (!pCreateInfo) {
660 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateEvent is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600661 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600662 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600663 else if (!vk_validate_vkeventcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600664 sprintf(str, "Parameter pCreateInfo to function CreateEvent contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600665 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600666 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500667 VkResult result = device_dispatch_table(device)->CreateEvent(device, pCreateInfo, pEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600668 return result;
669}
670
Mike Stroyanb050c682015-04-17 12:36:38 -0600671VK_LAYER_EXPORT VkResult VKAPI vkGetEventStatus(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600672{
673
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500674 VkResult result = device_dispatch_table(device)->GetEventStatus(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600675 return result;
676}
677
Mike Stroyanb050c682015-04-17 12:36:38 -0600678VK_LAYER_EXPORT VkResult VKAPI vkSetEvent(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600679{
680
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500681 VkResult result = device_dispatch_table(device)->SetEvent(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600682 return result;
683}
684
Mike Stroyanb050c682015-04-17 12:36:38 -0600685VK_LAYER_EXPORT VkResult VKAPI vkResetEvent(VkDevice device, VkEvent event)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600686{
687
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500688 VkResult result = device_dispatch_table(device)->ResetEvent(device, event);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600689 return result;
690}
691
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600692VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, VkQueryPool* pQueryPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600693{
694 char str[1024];
695 if (!pCreateInfo) {
696 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateQueryPool is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600697 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600698 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600699 else if (!vk_validate_vkquerypoolcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600700 sprintf(str, "Parameter pCreateInfo to function CreateQueryPool contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600701 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600702 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500703 VkResult result = device_dispatch_table(device)->CreateQueryPool(device, pCreateInfo, pQueryPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600704 return result;
705}
706
Mike Stroyanb050c682015-04-17 12:36:38 -0600707VK_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 -0600708{
709
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500710 VkResult result = device_dispatch_table(device)->GetQueryPoolResults(device, queryPool, startQuery, queryCount, pDataSize, pData, flags);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600711 return result;
712}
713
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600714VK_LAYER_EXPORT VkResult VKAPI vkGetFormatInfo(VkDevice device, VkFormat format, VkFormatInfoType infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600715{
716 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600717 if (!validate_VkFormat(format)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600718 sprintf(str, "Parameter format to function GetFormatInfo has invalid value of %i.", (int)format);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600719 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600720 }
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600721 if (!validate_VkFormatInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600722 sprintf(str, "Parameter infoType to function GetFormatInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600723 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600724 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500725 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, format, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600726 return result;
727}
728
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600729VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600730{
731 char str[1024];
732 if (!pCreateInfo) {
733 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBuffer is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600734 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600735 }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600736 else if (!vk_validate_vkbuffercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600737 sprintf(str, "Parameter pCreateInfo to function CreateBuffer contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600738 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600739 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500740 VkResult result = device_dispatch_table(device)->CreateBuffer(device, pCreateInfo, pBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600741 return result;
742}
743
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600744VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, VkBufferView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600745{
746 char str[1024];
747 if (!pCreateInfo) {
748 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateBufferView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600749 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600750 }
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600751 else if (!vk_validate_vkbufferviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600752 sprintf(str, "Parameter pCreateInfo to function CreateBufferView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600753 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600754 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500755 VkResult result = device_dispatch_table(device)->CreateBufferView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600756 return result;
757}
758
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600759void PreCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600760{
761 if(pCreateInfo == nullptr)
762 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600763 char const str[] = "vkCreateImage parameter, VkImageCreateInfo* pCreateInfo, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600764 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600765 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600766 return;
767 }
768
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600769 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600770 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600771 char const str[] = "vkCreateImage parameter, VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO "\
772 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600773 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600774 return;
775 }
776
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600777 if (!validate_VkImageType(pCreateInfo->imageType))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600778 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600779 char const str[] = "vkCreateImage parameter, VkImageType pCreateInfo->imageType, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600780 "unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600781 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600782 return;
783 }
784
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600785 if (!validate_VkFormat(pCreateInfo->format))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600786 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600787 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600788 "unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600789 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600790 return;
791 }
792
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600793 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600794 size_t size = sizeof(properties);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500795 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->format,
Tony Barbourd1c35722015-04-16 15:59:00 -0600796 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600797 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600798 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600799 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, cannot be "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600800 "validated (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600801 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600802 return;
803 }
804
805 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
806 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600807 char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600808 "unsupported format (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600809 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600810 return;
811 }
812
813 // TODO: Can we check device-specific limits?
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600814 if (!vk_validate_vkextent3d(&pCreateInfo->extent))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600815 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600816 char const str[] = "vkCreateImage parameter, VkExtent3D pCreateInfo->extent, is invalid "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600817 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600818 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600819 return;
820 }
821
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600822 if (!validate_VkImageTiling(pCreateInfo->tiling))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600823 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600824 char const str[] = "vkCreateImage parameter, VkImageTiling pCreateInfo->tiling, is "\
Jeremy Hayesb1792dd2015-04-07 09:49:05 -0600825 "unrecoginized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600826 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600827 return;
828 }
829}
830
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600831void PostCreateImage(VkResult result, VkImage* pImage)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600832{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600833 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600834 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600835 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600836 char const str[] = "vkCreateImage failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600837 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600838 return;
839 }
840
841 if(pImage == nullptr)
842 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600843 char const str[] = "vkCreateImage parameter, VkImage* pImage, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600844 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600845 return;
846 }
847}
848
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600849VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600850{
851 PreCreateImage(device, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500852 VkResult result = device_dispatch_table(device)->CreateImage(device, pCreateInfo, pImage);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600853 PostCreateImage(result, pImage);
854 return result;
855}
856
Mike Stroyanb050c682015-04-17 12:36:38 -0600857VK_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 -0600858{
859 char str[1024];
860 if (!pSubresource) {
861 sprintf(str, "Struct ptr parameter pSubresource to function GetImageSubresourceInfo is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600862 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -0600863 } else if (!vk_validate_vkimagesubresource(pSubresource)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600864 sprintf(str, "Parameter pSubresource to function GetImageSubresourceInfo contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600865 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600866 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600867 if (!validate_VkSubresourceInfoType(infoType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600868 sprintf(str, "Parameter infoType to function GetImageSubresourceInfo has invalid value of %i.", (int)infoType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600869 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600870 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500871 VkResult result = device_dispatch_table(device)->GetImageSubresourceInfo(device, image, pSubresource, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600872 return result;
873}
874
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600875VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, VkImageView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600876{
877 char str[1024];
878 if (!pCreateInfo) {
879 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateImageView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600880 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600881 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600882 else if (!vk_validate_vkimageviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600883 sprintf(str, "Parameter pCreateInfo to function CreateImageView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600884 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600885 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500886 VkResult result = device_dispatch_table(device)->CreateImageView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600887 return result;
888}
889
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600890VK_LAYER_EXPORT VkResult VKAPI vkCreateColorAttachmentView(VkDevice device, const VkColorAttachmentViewCreateInfo* pCreateInfo, VkColorAttachmentView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600891{
892 char str[1024];
893 if (!pCreateInfo) {
894 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateColorAttachmentView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600895 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600896 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600897 else if (!vk_validate_vkcolorattachmentviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600898 sprintf(str, "Parameter pCreateInfo to function CreateColorAttachmentView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600899 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600900 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500901 VkResult result = device_dispatch_table(device)->CreateColorAttachmentView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600902 return result;
903}
904
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600905VK_LAYER_EXPORT VkResult VKAPI vkCreateDepthStencilView(VkDevice device, const VkDepthStencilViewCreateInfo* pCreateInfo, VkDepthStencilView* pView)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600906{
907 char str[1024];
908 if (!pCreateInfo) {
909 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDepthStencilView is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600910 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600911 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600912 else if (!vk_validate_vkdepthstencilviewcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600913 sprintf(str, "Parameter pCreateInfo to function CreateDepthStencilView contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600914 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600915 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500916 VkResult result = device_dispatch_table(device)->CreateDepthStencilView(device, pCreateInfo, pView);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600917 return result;
918}
919
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600920VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(VkDevice device, const VkShaderCreateInfo* pCreateInfo, VkShader* pShader)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600921{
922 char str[1024];
923 if (!pCreateInfo) {
924 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateShader is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600925 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600926 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600927 else if (!vk_validate_vkshadercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600928 sprintf(str, "Parameter pCreateInfo to function CreateShader contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600929 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600930 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500931 VkResult result = device_dispatch_table(device)->CreateShader(device, pCreateInfo, pShader);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600932 return result;
933}
934
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600935VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600936{
937 char str[1024];
938 if (!pCreateInfo) {
939 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipeline is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600940 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600941 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600942 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600943 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipeline contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600944 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600945 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500946 VkResult result = device_dispatch_table(device)->CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600947 return result;
948}
949
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600950VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelineDerivative(VkDevice device, const VkGraphicsPipelineCreateInfo* pCreateInfo, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600951{
952 char str[1024];
953 if (!pCreateInfo) {
954 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateGraphicsPipelineDerivative is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600955 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600956 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600957 else if (!vk_validate_vkgraphicspipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600958 sprintf(str, "Parameter pCreateInfo to function CreateGraphicsPipelineDerivative contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600959 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600960 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500961 VkResult result = device_dispatch_table(device)->CreateGraphicsPipelineDerivative(device, pCreateInfo, basePipeline, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600962 return result;
963}
964
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600965VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipeline(VkDevice device, const VkComputePipelineCreateInfo* pCreateInfo, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600966{
967 char str[1024];
968 if (!pCreateInfo) {
969 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateComputePipeline is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600970 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600971 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -0600972 else if (!vk_validate_vkcomputepipelinecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600973 sprintf(str, "Parameter pCreateInfo to function CreateComputePipeline contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600974 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600975 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500976 VkResult result = device_dispatch_table(device)->CreateComputePipeline(device, pCreateInfo, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600977 return result;
978}
979
Mike Stroyanb050c682015-04-17 12:36:38 -0600980VK_LAYER_EXPORT VkResult VKAPI vkStorePipeline(VkDevice device, VkPipeline pipeline, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600981{
982
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500983 VkResult result = device_dispatch_table(device)->StorePipeline(device, pipeline, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600984 return result;
985}
986
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600987VK_LAYER_EXPORT VkResult VKAPI vkLoadPipeline(VkDevice device, size_t dataSize, const void* pData, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600988{
989
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500990 VkResult result = device_dispatch_table(device)->LoadPipeline(device, dataSize, pData, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600991 return result;
992}
993
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600994VK_LAYER_EXPORT VkResult VKAPI vkLoadPipelineDerivative(VkDevice device, size_t dataSize, const void* pData, VkPipeline basePipeline, VkPipeline* pPipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600995{
996
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -0500997 VkResult result = device_dispatch_table(device)->LoadPipelineDerivative(device, dataSize, pData, basePipeline, pPipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -0600998 return result;
999}
1000
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001001VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, VkSampler* pSampler)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001002{
1003 char str[1024];
1004 if (!pCreateInfo) {
1005 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateSampler is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001006 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001007 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001008 else if (!vk_validate_vksamplercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001009 sprintf(str, "Parameter pCreateInfo to function CreateSampler contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001010 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001011 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001012 VkResult result = device_dispatch_table(device)->CreateSampler(device, pCreateInfo, pSampler);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001013 return result;
1014}
1015
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001016VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayout* pSetLayout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001017{
1018 char str[1024];
1019 if (!pCreateInfo) {
1020 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorSetLayout is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001021 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001022 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001023 else if (!vk_validate_vkdescriptorsetlayoutcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001024 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorSetLayout contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001025 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001026 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001027 VkResult result = device_dispatch_table(device)->CreateDescriptorSetLayout(device, pCreateInfo, pSetLayout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001028 return result;
1029}
1030
Mark Lobodzinski0fadf5f2015-04-17 14:11:39 -05001031VK_LAYER_EXPORT VkResult VKAPI vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, VkPipelineLayout* pPipelineLayout)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001032{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001033 VkResult result = device_dispatch_table(device)->CreatePipelineLayout(device, pCreateInfo, pPipelineLayout);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001034 return result;
1035}
1036
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001037VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorPool(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001038{
1039 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001040 if (!validate_VkDescriptorPoolUsage(poolUsage)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001041 sprintf(str, "Parameter poolUsage to function CreateDescriptorPool has invalid value of %i.", (int)poolUsage);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001042 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001043 }
1044 if (!pCreateInfo) {
1045 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDescriptorPool is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001046 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001047 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001048 else if (!vk_validate_vkdescriptorpoolcreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001049 sprintf(str, "Parameter pCreateInfo to function CreateDescriptorPool contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001050 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001051 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001052 VkResult result = device_dispatch_table(device)->CreateDescriptorPool(device, poolUsage, maxSets, pCreateInfo, pDescriptorPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001053 return result;
1054}
1055
Mike Stroyanb050c682015-04-17 12:36:38 -06001056VK_LAYER_EXPORT VkResult VKAPI vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001057{
1058
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001059 VkResult result = device_dispatch_table(device)->ResetDescriptorPool(device, descriptorPool);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001060 return result;
1061}
1062
Mike Stroyanb050c682015-04-17 12:36:38 -06001063VK_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 -06001064{
1065 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001066 if (!validate_VkDescriptorSetUsage(setUsage)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001067 sprintf(str, "Parameter setUsage to function AllocDescriptorSets has invalid value of %i.", (int)setUsage);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001068 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001069 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001070 VkResult result = device_dispatch_table(device)->AllocDescriptorSets(device, descriptorPool, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001071 return result;
1072}
1073
Chia-I Wu9d00ed72015-05-25 16:27:55 +08001074VK_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 -06001075{
1076
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001077 return device_dispatch_table(device)->UpdateDescriptorSets(device, writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001078}
1079
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001080VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(VkDevice device, const VkDynamicVpStateCreateInfo* pCreateInfo, VkDynamicVpState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001081{
1082 char str[1024];
1083 if (!pCreateInfo) {
1084 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicViewportState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001085 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001086 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001087 else if (!vk_validate_vkdynamicvpstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001088 sprintf(str, "Parameter pCreateInfo to function CreateDynamicViewportState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001089 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001090 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001091 VkResult result = device_dispatch_table(device)->CreateDynamicViewportState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001092 return result;
1093}
1094
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001095VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterState(VkDevice device, const VkDynamicRsStateCreateInfo* pCreateInfo, VkDynamicRsState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001096{
1097 char str[1024];
1098 if (!pCreateInfo) {
1099 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicRasterState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001100 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001101 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001102 else if (!vk_validate_vkdynamicrsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001103 sprintf(str, "Parameter pCreateInfo to function CreateDynamicRasterState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001104 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001105 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001106 VkResult result = device_dispatch_table(device)->CreateDynamicRasterState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001107 return result;
1108}
1109
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001110VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState(VkDevice device, const VkDynamicCbStateCreateInfo* pCreateInfo, VkDynamicCbState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001111{
1112 char str[1024];
1113 if (!pCreateInfo) {
1114 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicColorBlendState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001115 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001116 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001117 else if (!vk_validate_vkdynamiccbstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001118 sprintf(str, "Parameter pCreateInfo to function CreateDynamicColorBlendState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001119 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001120 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001121 VkResult result = device_dispatch_table(device)->CreateDynamicColorBlendState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001122 return result;
1123}
1124
Courtney Goeltzenleuchter502744a2015-04-10 16:24:50 -06001125VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState(VkDevice device, const VkDynamicDsStateCreateInfo* pCreateInfo, VkDynamicDsState* pState)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001126{
1127 char str[1024];
1128 if (!pCreateInfo) {
1129 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateDynamicDepthStencilState is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001130 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001131 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001132 else if (!vk_validate_vkdynamicdsstatecreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001133 sprintf(str, "Parameter pCreateInfo to function CreateDynamicDepthStencilState contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001134 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001135 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001136 VkResult result = device_dispatch_table(device)->CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001137 return result;
1138}
1139
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001140void PreCreateCommandBuffer(VkDevice device, const VkCmdBufferCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001141{
1142 if(device == nullptr)
1143 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001144 char const str[] = "vkCreateCommandBuffer parameter, VkDevice device, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001145 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001146 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001147 return;
1148 }
1149
1150 if(pCreateInfo == nullptr)
1151 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001152 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBufferCreateInfo* pCreateInfo, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001153 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001154 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001155 return;
1156 }
1157
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001158 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001159 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001160 char const str[] = "vkCreateCommandBuffer parameter, VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO "\
1161 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001162 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001163 return;
1164 }
1165}
1166
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001167void PostCreateCommandBuffer(VkResult result, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001168{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001169 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001170 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001171 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001172 char const str[] = "vkCreateCommandBuffer failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001173 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001174 return;
1175 }
1176
1177 if(pCmdBuffer == nullptr)
1178 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001179 char const str[] = "vkCreateCommandBuffer parameter, VkCmdBuffer* pCmdBuffer, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001180 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001181 return;
1182 }
1183}
1184
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001185VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(VkDevice device,
1186 const VkCmdBufferCreateInfo* pCreateInfo, VkCmdBuffer* pCmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001187{
1188 PreCreateCommandBuffer(device, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001189 VkResult result = device_dispatch_table(device)->CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001190 PostCreateCommandBuffer(result, pCmdBuffer);
1191 return result;
1192}
1193
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001194VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001195{
1196 char str[1024];
1197 if (!pBeginInfo) {
1198 sprintf(str, "Struct ptr parameter pBeginInfo to function BeginCommandBuffer is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001199 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001200 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001201 else if (!vk_validate_vkcmdbufferbegininfo(pBeginInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001202 sprintf(str, "Parameter pBeginInfo to function BeginCommandBuffer contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001203 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001204 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001205 VkResult result = device_dispatch_table(cmdBuffer)->BeginCommandBuffer(cmdBuffer, pBeginInfo);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001206 return result;
1207}
1208
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001209VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001210{
1211
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001212 VkResult result = device_dispatch_table(cmdBuffer)->EndCommandBuffer(cmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001213 return result;
1214}
1215
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001216VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001217{
1218
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001219 VkResult result = device_dispatch_table(cmdBuffer)->ResetCommandBuffer(cmdBuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001220 return result;
1221}
1222
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001223VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001224{
1225 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001226 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001227 sprintf(str, "Parameter pipelineBindPoint to function CmdBindPipeline has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001228 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001229 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001230 device_dispatch_table(cmdBuffer)->CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001231}
1232
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001233VK_LAYER_EXPORT void VKAPI vkCmdBindDynamicStateObject(VkCmdBuffer cmdBuffer, VkStateBindPoint stateBindPoint, VkDynamicStateObject state)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001234{
1235 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001236 if (!validate_VkStateBindPoint(stateBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001237 sprintf(str, "Parameter stateBindPoint to function CmdBindDynamicStateObject has invalid value of %i.", (int)stateBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001238 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001239 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001240 device_dispatch_table(cmdBuffer)->CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001241}
1242
Mark Lobodzinskif2093b62015-06-15 13:21:21 -06001243VK_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 -06001244{
1245 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001246 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001247 sprintf(str, "Parameter pipelineBindPoint to function CmdBindDescriptorSets has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001248 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001249 }
Mark Lobodzinskif2093b62015-06-15 13:21:21 -06001250 device_dispatch_table(cmdBuffer)->CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, layout, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001251}
1252
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06001253VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
1254 VkCmdBuffer cmdBuffer,
1255 uint32_t startBinding,
1256 uint32_t bindingCount,
1257 const VkBuffer* pBuffers,
Tony Barbourd1c35722015-04-16 15:59:00 -06001258 const VkDeviceSize* pOffsets)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001259{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001260 device_dispatch_table(cmdBuffer)->CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001261}
1262
Tony Barbourd1c35722015-04-16 15:59:00 -06001263VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001264{
1265 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001266 if (!validate_VkIndexType(indexType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001267 sprintf(str, "Parameter indexType to function CmdBindIndexBuffer has invalid value of %i.", (int)indexType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001268 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001269 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001270 device_dispatch_table(cmdBuffer)->CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001271}
1272
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001273VK_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 -06001274{
1275
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001276 device_dispatch_table(cmdBuffer)->CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001277}
1278
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001279VK_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 -06001280{
1281
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001282 device_dispatch_table(cmdBuffer)->CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001283}
1284
Tony Barbourd1c35722015-04-16 15:59:00 -06001285VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001286{
1287
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001288 device_dispatch_table(cmdBuffer)->CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001289}
1290
Tony Barbourd1c35722015-04-16 15:59:00 -06001291VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001292{
1293
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001294 device_dispatch_table(cmdBuffer)->CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001295}
1296
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001297VK_LAYER_EXPORT void VKAPI vkCmdDispatch(VkCmdBuffer cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001298{
1299
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001300 device_dispatch_table(cmdBuffer)->CmdDispatch(cmdBuffer, x, y, z);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001301}
1302
Tony Barbourd1c35722015-04-16 15:59:00 -06001303VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001304{
1305
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001306 device_dispatch_table(cmdBuffer)->CmdDispatchIndirect(cmdBuffer, buffer, offset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001307}
1308
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001309VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkBuffer destBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001310{
1311 char str[1024];
1312 uint32_t i;
1313 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001314 if (!vk_validate_vkbuffercopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001315 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBuffer contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001316 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001317 }
1318 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001319 device_dispatch_table(cmdBuffer)->CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001320}
1321
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001322VK_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 -06001323{
1324 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001325 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001326 sprintf(str, "Parameter srcImageLayout to function CmdCopyImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001327 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001328 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001329 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001330 sprintf(str, "Parameter destImageLayout to function CmdCopyImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001331 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001332 }
1333 uint32_t i;
1334 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001335 if (!vk_validate_vkimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001336 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001337 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001338 }
1339 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001340 device_dispatch_table(cmdBuffer)->CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001341}
1342
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05001343VK_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 -06001344{
1345 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001346 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001347 sprintf(str, "Parameter srcImageLayout to function CmdBlitImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001348 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001349 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001350 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001351 sprintf(str, "Parameter destImageLayout to function CmdBlitImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001352 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001353 }
1354 uint32_t i;
1355 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001356 if (!vk_validate_vkimageblit(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001357 sprintf(str, "Parameter pRegions[%i] to function CmdBlitImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001358 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001359 }
1360 }
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05001361 //TODO: Add additional check for limitation from header rev 96.
1362 // VK_TEX_FILTER_NEAREST if the format that srcImage was created with is an integer-based format.
1363
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001364 device_dispatch_table(cmdBuffer)->CmdBlitImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001365}
1366
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001367VK_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 -06001368{
1369 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001370 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001371 sprintf(str, "Parameter destImageLayout to function CmdCopyBufferToImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001372 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001373 }
1374 uint32_t i;
1375 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001376 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001377 sprintf(str, "Parameter pRegions[%i] to function CmdCopyBufferToImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001378 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001379 }
1380 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001381 device_dispatch_table(cmdBuffer)->CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001382}
1383
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001384VK_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 -06001385{
1386 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001387 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001388 sprintf(str, "Parameter srcImageLayout to function CmdCopyImageToBuffer has invalid value of %i.", (int)srcImageLayout);
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;
1392 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001393 if (!vk_validate_vkbufferimagecopy(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001394 sprintf(str, "Parameter pRegions[%i] to function CmdCopyImageToBuffer 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)->CmdCopyImageToBuffer(cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001399}
1400
Tony Barbourd1c35722015-04-16 15:59:00 -06001401VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001402{
1403
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001404 device_dispatch_table(cmdBuffer)->CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001405}
1406
Tony Barbourd1c35722015-04-16 15:59:00 -06001407VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001408{
1409
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001410 device_dispatch_table(cmdBuffer)->CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001411}
1412
Courtney Goeltzenleuchterd7a5cff2015-04-23 17:49:22 -06001413VK_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 -06001414{
1415 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001416 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001417 sprintf(str, "Parameter imageLayout to function CmdClearColorImage has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001418 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001419 }
1420 uint32_t i;
1421 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001422 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001423 sprintf(str, "Parameter pRanges[%i] to function CmdClearColorImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001424 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001425 }
1426 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001427 device_dispatch_table(cmdBuffer)->CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001428}
1429
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001430VK_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 -06001431{
1432 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001433 if (!validate_VkImageLayout(imageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001434 sprintf(str, "Parameter imageLayout to function CmdClearDepthStencil has invalid value of %i.", (int)imageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001435 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001436 }
1437 uint32_t i;
1438 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001439 if (!vk_validate_vkimagesubresourcerange(&pRanges[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001440 sprintf(str, "Parameter pRanges[%i] to function CmdClearDepthStencil contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001441 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001442 }
1443 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001444 device_dispatch_table(cmdBuffer)->CmdClearDepthStencil(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001445}
1446
Tony Barbour6865d4a2015-04-13 15:02:52 -06001447VK_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 -06001448{
1449 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001450 if (!validate_VkImageLayout(srcImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001451 sprintf(str, "Parameter srcImageLayout to function CmdResolveImage has invalid value of %i.", (int)srcImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001452 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001453 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001454 if (!validate_VkImageLayout(destImageLayout)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001455 sprintf(str, "Parameter destImageLayout to function CmdResolveImage has invalid value of %i.", (int)destImageLayout);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001456 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001457 }
1458 uint32_t i;
Tony Barbour6865d4a2015-04-13 15:02:52 -06001459 for (i = 0; i < regionCount; i++) {
1460 if (!vk_validate_vkimageresolve(&pRegions[i])) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001461 sprintf(str, "Parameter pRects[%i] to function CmdResolveImage contains an invalid value.", i);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001462 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001463 }
1464 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001465 device_dispatch_table(cmdBuffer)->CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001466}
1467
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001468VK_LAYER_EXPORT void VKAPI vkCmdSetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001469{
1470 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001471 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001472 sprintf(str, "Parameter pipeEvent to function CmdSetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001473 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001474 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001475 device_dispatch_table(cmdBuffer)->CmdSetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001476}
1477
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001478VK_LAYER_EXPORT void VKAPI vkCmdResetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipeEvent pipeEvent)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001479{
1480 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001481 if (!validate_VkPipeEvent(pipeEvent)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001482 sprintf(str, "Parameter pipeEvent to function CmdResetEvent has invalid value of %i.", (int)pipeEvent);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001483 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001484 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001485 device_dispatch_table(cmdBuffer)->CmdResetEvent(cmdBuffer, event, pipeEvent);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001486}
1487
Tony Barbourd1c35722015-04-16 15:59:00 -06001488VK_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 -06001489{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001490 device_dispatch_table(cmdBuffer)->CmdWaitEvents(cmdBuffer, waitEvent, eventCount, pEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001491}
1492
Tony Barbourd1c35722015-04-16 15:59:00 -06001493VK_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 -06001494{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001495 device_dispatch_table(cmdBuffer)->CmdPipelineBarrier(cmdBuffer, waitEvent, pipeEventCount, pPipeEvents, memBarrierCount, ppMemBarriers);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001496}
1497
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001498VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001499{
1500
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001501 device_dispatch_table(cmdBuffer)->CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001502}
1503
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001504VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001505{
1506
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001507 device_dispatch_table(cmdBuffer)->CmdEndQuery(cmdBuffer, queryPool, slot);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001508}
1509
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001510VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001511{
1512
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001513 device_dispatch_table(cmdBuffer)->CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001514}
1515
Tony Barbourd1c35722015-04-16 15:59:00 -06001516VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkTimestampType timestampType, VkBuffer destBuffer, VkDeviceSize destOffset)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001517{
1518 char str[1024];
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001519 if (!validate_VkTimestampType(timestampType)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001520 sprintf(str, "Parameter timestampType to function CmdWriteTimestamp has invalid value of %i.", (int)timestampType);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001521 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001522 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001523 device_dispatch_table(cmdBuffer)->CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001524}
1525
Jeremy Hayesad367152015-04-17 10:36:53 -06001526VK_LAYER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(
1527 VkCmdBuffer cmdBuffer,
1528 VkQueryPool queryPool,
1529 uint32_t startQuery,
1530 uint32_t queryCount,
1531 VkBuffer destBuffer,
1532 VkDeviceSize destOffset,
1533 VkDeviceSize destStride,
1534 VkQueryResultFlags flags)
1535{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001536 device_dispatch_table(cmdBuffer)->CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, destStride, flags);
Jeremy Hayesad367152015-04-17 10:36:53 -06001537}
1538
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001539VK_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 -06001540{
1541 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001542 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001543 sprintf(str, "Parameter pipelineBindPoint to function CmdInitAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001544 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001545 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001546 device_dispatch_table(cmdBuffer)->CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001547}
1548
Tony Barbourd1c35722015-04-16 15:59:00 -06001549VK_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 -06001550{
1551 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001552 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001553 sprintf(str, "Parameter pipelineBindPoint to function CmdLoadAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001554 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001555 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001556 device_dispatch_table(cmdBuffer)->CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001557}
1558
Tony Barbourd1c35722015-04-16 15:59:00 -06001559VK_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 -06001560{
1561 char str[1024];
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001562 if (!validate_VkPipelineBindPoint(pipelineBindPoint)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001563 sprintf(str, "Parameter pipelineBindPoint to function CmdSaveAtomicCounters has invalid value of %i.", (int)pipelineBindPoint);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001564 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001565 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001566 device_dispatch_table(cmdBuffer)->CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001567}
1568
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001569VK_LAYER_EXPORT VkResult VKAPI vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, VkFramebuffer* pFramebuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001570{
1571 char str[1024];
1572 if (!pCreateInfo) {
1573 sprintf(str, "Struct ptr parameter pCreateInfo to function CreateFramebuffer is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001574 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001575 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001576 else if (!vk_validate_vkframebuffercreateinfo(pCreateInfo)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001577 sprintf(str, "Parameter pCreateInfo to function CreateFramebuffer contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001578 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001579 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001580 VkResult result = device_dispatch_table(device)->CreateFramebuffer(device, pCreateInfo, pFramebuffer);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001581 return result;
1582}
1583
1584
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001585void PreCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001586{
1587 if(pCreateInfo == nullptr)
1588 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001589 char const str[] = "vkCreateRenderPass parameter, VkRenderPassCreateInfo* pCreateInfo, is "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001590 "nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001591 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001592 return;
1593 }
1594
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001595 if(pCreateInfo->sType != VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001596 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001597 char const str[] = "vkCreateRenderPass parameter, VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO "\
1598 "pCreateInfo->sType, is not VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001599 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001600 return;
1601 }
1602
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001603 if(!vk_validate_vkrect(&pCreateInfo->renderArea))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001604 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001605 char const str[] = "vkCreateRenderPass parameter, VkRect pCreateInfo->renderArea, is invalid "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001606 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001607 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001608 return;
1609 }
1610
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001611 if(!vk_validate_vkextent2d(&pCreateInfo->extent))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001612 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001613 char const str[] = "vkCreateRenderPass parameter, VkExtent2D pCreateInfo->extent, is invalid "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001614 "(precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001615 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001616 return;
1617 }
1618
1619 if(pCreateInfo->pColorFormats == nullptr)
1620 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001621 char const str[] = "vkCreateRenderPass parameter, VkFormat* pCreateInfo->pColorFormats, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001622 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001623 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001624 return;
1625 }
1626
1627 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1628 {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001629 if(!validate_VkFormat(pCreateInfo->pColorFormats[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001630 {
1631 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001632 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001633 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001634 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001635 continue;
1636 }
1637
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001638 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001639 size_t size = sizeof(properties);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001640 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->pColorFormats[i],
Tony Barbourd1c35722015-04-16 15:59:00 -06001641 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001642 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001643 {
1644 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001645 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001646 "], cannot be validated (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001647 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001648 continue;
1649 }
1650
1651 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1652 {
1653 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001654 ss << "vkCreateRenderPass parameter, VkFormat pCreateInfo->pColorFormats[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001655 "], contains unsupported format (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001656 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001657 continue;
1658 }
1659
1660 }
1661
1662 if(pCreateInfo->pColorLayouts == nullptr)
1663 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001664 char const str[] = "vkCreateRenderPass parameter, VkImageLayout* pCreateInfo->pColorLayouts, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001665 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001666 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001667 return;
1668 }
1669
1670 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1671 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001672 if(!validate_VkImageLayout(pCreateInfo->pColorLayouts[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001673 {
1674 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001675 ss << "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->pColorLayouts[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001676 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001677 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001678 continue;
1679 }
1680 }
1681
1682 if(pCreateInfo->pColorLoadOps == nullptr)
1683 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001684 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp* pCreateInfo->pColorLoadOps, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001685 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001686 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001687 return;
1688 }
1689
1690 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1691 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001692 if(!validate_VkAttachmentLoadOp(pCreateInfo->pColorLoadOps[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001693 {
1694 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001695 ss << "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->pColorLoadOps[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001696 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001697 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001698 continue;
1699 }
1700 }
1701
1702 if(pCreateInfo->pColorStoreOps == nullptr)
1703 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001704 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp* pCreateInfo->pColorStoreOps, "\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001705 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001706 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001707 return;
1708 }
1709
1710 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1711 {
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001712 if(!validate_VkAttachmentStoreOp(pCreateInfo->pColorStoreOps[i]))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001713 {
1714 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001715 ss << "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->pColorStoreOps[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001716 "], is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001717 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001718 continue;
1719 }
1720 }
1721
1722 if(pCreateInfo->pColorLoadClearValues == nullptr)
1723 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001724 char const str[] = "vkCreateRenderPass parameter, VkClearColor* pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001725 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001726 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001727 return;
1728 }
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001729
1730 if(pCreateInfo->pColorStoreOps == nullptr)
1731 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001732 char const str[] = "vkCreateRenderPass parameter, VK_ATTACHMENT_STORE_OP* pCreateInfo->pColorStoreOps, "\
Jeremy Hayes090f0ce2015-04-07 13:38:03 -06001733 "is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001734 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001735 return;
1736 }
1737
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001738 if(pCreateInfo->pColorLoadClearValues == nullptr)
1739 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001740 char const str[] = "vkCreateRenderPass parameter, VK_CLEAR_COLOR* pCreateInfo->"\
Jeremy Hayes090f0ce2015-04-07 13:38:03 -06001741 "pColorLoadClearValues, is nullptr (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001742 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesb1792dd2015-04-07 09:49:05 -06001743 return;
1744 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001745
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001746 for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
1747 {
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001748 if(!vk_validate_vkclearcolor(&(pCreateInfo->pColorLoadClearValues[i])))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001749 {
1750 std::stringstream ss;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001751 ss << "vkCreateRenderPass parameter, VkClearColor pCreateInfo->pColorLoadClearValues[" << i <<
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001752 "], is invalid (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001753 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", ss.str().c_str());
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001754 continue;
1755 }
1756 }
1757
Courtney Goeltzenleuchtera6d58802015-04-10 17:06:20 -06001758 if(!validate_VkFormat(pCreateInfo->depthStencilFormat))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001759 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001760 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001761 "depthStencilFormat, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001762 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001763 return;
1764 }
1765
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001766 VkFormatProperties properties;
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001767 size_t size = sizeof(properties);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001768 VkResult result = device_dispatch_table(device)->GetFormatInfo(device, pCreateInfo->depthStencilFormat,
Tony Barbourd1c35722015-04-16 15:59:00 -06001769 VK_FORMAT_INFO_TYPE_PROPERTIES, &size, &properties);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001770 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001771 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001772 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001773 "depthStencilFormat, cannot be validated (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001774 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001775 return;
1776 }
1777
1778 if((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0))
1779 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001780 char const str[] = "vkCreateRenderPass parameter, VkFormat pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001781 "depthStencilFormat, contains unsupported format (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001782 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001783 return;
1784 }
1785
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001786 if(!validate_VkImageLayout(pCreateInfo->depthStencilLayout))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001787 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001788 char const str[] = "vkCreateRenderPass parameter, VkImageLayout pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001789 "depthStencilLayout, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001790 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001791 return;
1792 }
1793
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001794 if(!validate_VkAttachmentLoadOp(pCreateInfo->depthLoadOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001795 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001796 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001797 "depthLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001798 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001799 return;
1800 }
1801
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001802 if(!validate_VkAttachmentStoreOp(pCreateInfo->depthStoreOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001803 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001804 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001805 "depthStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001806 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001807 return;
1808 }
1809
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001810 if(!validate_VkAttachmentLoadOp(pCreateInfo->stencilLoadOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001811 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001812 char const str[] = "vkCreateRenderPass parameter, VkAttachmentLoadOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001813 "stencilLoadOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001814 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001815 return;
1816 }
1817
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001818 if(!validate_VkAttachmentStoreOp(pCreateInfo->stencilStoreOp))
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001819 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001820 char const str[] = "vkCreateRenderPass parameter, VkAttachmentStoreOp pCreateInfo->"\
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001821 "stencilStoreOp, is unrecognized (precondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001822 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001823 return;
1824 }
1825}
1826
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001827void PostCreateRenderPass(VkResult result, VkRenderPass* pRenderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001828{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001829 if(result != VK_SUCCESS)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001830 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001831 // TODO: Spit out VkResult value.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001832 char const str[] = "vkCreateRenderPass failed (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001833 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001834 return;
1835 }
1836
1837 if(pRenderPass == nullptr)
1838 {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001839 char const str[] = "vkCreateRenderPass parameter, VkRenderPass* pRenderPass, is nullptr (postcondition).";
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001840 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001841 return;
1842 }
1843}
1844
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001845VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, VkRenderPass* pRenderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001846{
1847 PreCreateRenderPass(device, pCreateInfo);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001848 VkResult result = device_dispatch_table(device)->CreateRenderPass(device, pCreateInfo, pRenderPass);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001849 PostCreateRenderPass(result, pRenderPass);
1850 return result;
1851}
1852
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001853VK_LAYER_EXPORT void VKAPI vkCmdBeginRenderPass(VkCmdBuffer cmdBuffer, const VkRenderPassBegin* pRenderPassBegin)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001854{
1855 char str[1024];
1856 if (!pRenderPassBegin) {
1857 sprintf(str, "Struct ptr parameter pRenderPassBegin to function CmdBeginRenderPass is NULL.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001858 layerCbMsg(VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001859 }
Courtney Goeltzenleuchterf2ccd5a2015-04-15 00:14:36 -06001860 else if (!vk_validate_vkrenderpassbegin(pRenderPassBegin)) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001861 sprintf(str, "Parameter pRenderPassBegin to function CmdBeginRenderPass contains an invalid value.");
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001862 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001863 }
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001864 device_dispatch_table(cmdBuffer)->CmdBeginRenderPass(cmdBuffer, pRenderPassBegin);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001865}
1866
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001867VK_LAYER_EXPORT void VKAPI vkCmdEndRenderPass(VkCmdBuffer cmdBuffer, VkRenderPass renderPass)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001868{
1869
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001870 device_dispatch_table(cmdBuffer)->CmdEndRenderPass(cmdBuffer, renderPass);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001871}
1872
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001873VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback(
1874 VkInstance instance,
1875 VkFlags msgFlags,
1876 const PFN_vkDbgMsgCallback pfnMsgCallback,
1877 void* pUserData,
1878 VkDbgMsgCallback* pMsgCallback)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001879{
Jon Ashburn9eed2892015-06-01 10:02:09 -06001880 VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(instance);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001881 return layer_create_msg_callback(instance, pTable, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001882}
1883
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06001884VK_LAYER_EXPORT VkResult VKAPI vkDbgDestroyMsgCallback(
1885 VkInstance instance,
1886 VkDbgMsgCallback msgCallback)
1887{
Courtney Goeltzenleuchter0daf2282015-06-13 21:22:12 -06001888 VkLayerInstanceDispatchTable *pTable = instance_dispatch_table(instance);
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06001889 return layer_destroy_msg_callback(instance, pTable, msgCallback);
1890}
1891
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001892VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerBegin(VkCmdBuffer cmdBuffer, const char* pMarker)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001893{
Jon Ashburneab34492015-06-01 09:37:38 -06001894 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) cmdBuffer;
1895 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001896 char const str[] = "Attempt to use CmdDbgMarkerBegin but extension disabled!";
1897 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburneab34492015-06-01 09:37:38 -06001898 return;
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001899 }
Jon Ashburneab34492015-06-01 09:37:38 -06001900 debug_marker_dispatch_table(cmdBuffer)->CmdDbgMarkerBegin(cmdBuffer, pMarker);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001901}
1902
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001903VK_LAYER_EXPORT void VKAPI vkCmdDbgMarkerEnd(VkCmdBuffer cmdBuffer)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001904{
Jon Ashburneab34492015-06-01 09:37:38 -06001905 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) cmdBuffer;
1906 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001907 char const str[] = "Attempt to use CmdDbgMarkerEnd but extension disabled!";
1908 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburneab34492015-06-01 09:37:38 -06001909 return;
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001910 }
Jon Ashburneab34492015-06-01 09:37:38 -06001911 debug_marker_dispatch_table(cmdBuffer)->CmdDbgMarkerEnd(cmdBuffer);
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001912}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001913
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001914VkResult VKAPI vkDbgSetObjectTag(VkDevice device, VkObjectType objType, VkObject object, size_t tagSize, const void* pTag)
1915{
Jon Ashburneab34492015-06-01 09:37:38 -06001916 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
1917 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001918 char const str[] = "Attempt to use DbgSetObjectTag but extension disabled!";
1919 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburneab34492015-06-01 09:37:38 -06001920 return VK_ERROR_UNAVAILABLE;
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001921 }
Jon Ashburneab34492015-06-01 09:37:38 -06001922 debug_marker_dispatch_table(device)->DbgSetObjectTag(device, objType, object, tagSize, pTag);
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001923}
1924
1925VkResult VKAPI vkDbgSetObjectName(VkDevice device, VkObjectType objType, VkObject object, size_t nameSize, const char* pName)
1926{
Jon Ashburneab34492015-06-01 09:37:38 -06001927 VkLayerDispatchTable *pDisp = *(VkLayerDispatchTable **) device;
1928 if (!deviceExtMap[pDisp].debug_marker_enabled) {
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001929 char const str[] = "Attempt to use DbgSetObjectName but extension disabled!";
1930 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, NULL, 0, 1, "PARAMCHECK", str);
Jon Ashburneab34492015-06-01 09:37:38 -06001931 return VK_ERROR_UNAVAILABLE;
Jon Ashburne68a9ff2015-05-25 14:11:37 -06001932 }
Jon Ashburneab34492015-06-01 09:37:38 -06001933 debug_marker_dispatch_table(device)->DbgSetObjectName(device, objType, object, nameSize, pName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001934}
1935
Chia-I Wuf8693382015-04-16 22:02:10 +08001936VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI(VkDevice device, const VkSwapChainCreateInfoWSI* pCreateInfo, VkSwapChainWSI* pSwapChain)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001937{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001938 VkResult result = device_dispatch_table(device)->CreateSwapChainWSI(device, pCreateInfo, pSwapChain);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001939 return result;
1940}
1941
Chia-I Wuf8693382015-04-16 22:02:10 +08001942VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapChainWSI(VkSwapChainWSI swapChain)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001943{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001944 VkResult result = device_dispatch_table(swapChain)->DestroySwapChainWSI(swapChain);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001945 return result;
1946}
1947
Chia-I Wuf8693382015-04-16 22:02:10 +08001948VK_LAYER_EXPORT VkResult VKAPI vkGetSwapChainInfoWSI(VkSwapChainWSI swapChain, VkSwapChainInfoTypeWSI infoType, size_t* pDataSize, void* pData)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001949{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001950 VkResult result = device_dispatch_table(swapChain)->GetSwapChainInfoWSI(swapChain, infoType, pDataSize, pData);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001951 return result;
1952}
1953
Chia-I Wuf8693382015-04-16 22:02:10 +08001954VK_LAYER_EXPORT VkResult VKAPI vkQueuePresentWSI(VkQueue queue, const VkPresentInfoWSI* pPresentInfo)
1955{
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05001956 VkResult result = device_dispatch_table(queue)->QueuePresentWSI(queue, pPresentInfo);
Chia-I Wuf8693382015-04-16 22:02:10 +08001957 return result;
1958}
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06001959
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001960static inline void* layer_intercept_proc(const char *name)
1961{
1962 if (!name || name[0] != 'v' || name[1] != 'k')
1963 return NULL;
1964
1965 name += 2;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001966 if (!strcmp(name, "DestroyDevice"))
1967 return (void*) vkDestroyDevice;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001968 if (!strcmp(name, "GetDeviceQueue"))
1969 return (void*) vkGetDeviceQueue;
1970 if (!strcmp(name, "QueueSubmit"))
1971 return (void*) vkQueueSubmit;
1972 if (!strcmp(name, "QueueWaitIdle"))
1973 return (void*) vkQueueWaitIdle;
1974 if (!strcmp(name, "DeviceWaitIdle"))
1975 return (void*) vkDeviceWaitIdle;
1976 if (!strcmp(name, "AllocMemory"))
1977 return (void*) vkAllocMemory;
1978 if (!strcmp(name, "FreeMemory"))
1979 return (void*) vkFreeMemory;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001980 if (!strcmp(name, "MapMemory"))
1981 return (void*) vkMapMemory;
1982 if (!strcmp(name, "UnmapMemory"))
1983 return (void*) vkUnmapMemory;
1984 if (!strcmp(name, "FlushMappedMemoryRanges"))
1985 return (void*) vkFlushMappedMemoryRanges;
1986 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
1987 return (void*) vkInvalidateMappedMemoryRanges;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06001988 if (!strcmp(name, "OpenSharedMemory"))
1989 return (void*) vkOpenSharedMemory;
1990 if (!strcmp(name, "OpenSharedSemaphore"))
1991 return (void*) vkOpenSharedSemaphore;
1992 if (!strcmp(name, "OpenPeerMemory"))
1993 return (void*) vkOpenPeerMemory;
1994 if (!strcmp(name, "OpenPeerImage"))
1995 return (void*) vkOpenPeerImage;
1996 if (!strcmp(name, "DestroyObject"))
1997 return (void*) vkDestroyObject;
1998 if (!strcmp(name, "GetObjectInfo"))
1999 return (void*) vkGetObjectInfo;
2000 if (!strcmp(name, "CreateFence"))
2001 return (void*) vkCreateFence;
2002 if (!strcmp(name, "ResetFences"))
2003 return (void*) vkResetFences;
2004 if (!strcmp(name, "GetFenceStatus"))
2005 return (void*) vkGetFenceStatus;
2006 if (!strcmp(name, "WaitForFences"))
2007 return (void*) vkWaitForFences;
2008 if (!strcmp(name, "CreateSemaphore"))
2009 return (void*) vkCreateSemaphore;
2010 if (!strcmp(name, "QueueSignalSemaphore"))
2011 return (void*) vkQueueSignalSemaphore;
2012 if (!strcmp(name, "QueueWaitSemaphore"))
2013 return (void*) vkQueueWaitSemaphore;
2014 if (!strcmp(name, "CreateEvent"))
2015 return (void*) vkCreateEvent;
2016 if (!strcmp(name, "GetEventStatus"))
2017 return (void*) vkGetEventStatus;
2018 if (!strcmp(name, "SetEvent"))
2019 return (void*) vkSetEvent;
2020 if (!strcmp(name, "ResetEvent"))
2021 return (void*) vkResetEvent;
2022 if (!strcmp(name, "CreateQueryPool"))
2023 return (void*) vkCreateQueryPool;
2024 if (!strcmp(name, "GetQueryPoolResults"))
2025 return (void*) vkGetQueryPoolResults;
2026 if (!strcmp(name, "GetFormatInfo"))
2027 return (void*) vkGetFormatInfo;
2028 if (!strcmp(name, "CreateBuffer"))
2029 return (void*) vkCreateBuffer;
2030 if (!strcmp(name, "CreateBufferView"))
2031 return (void*) vkCreateBufferView;
2032 if (!strcmp(name, "CreateImage"))
2033 return (void*) vkCreateImage;
2034 if (!strcmp(name, "GetImageSubresourceInfo"))
2035 return (void*) vkGetImageSubresourceInfo;
2036 if (!strcmp(name, "CreateImageView"))
2037 return (void*) vkCreateImageView;
2038 if (!strcmp(name, "CreateColorAttachmentView"))
2039 return (void*) vkCreateColorAttachmentView;
2040 if (!strcmp(name, "CreateDepthStencilView"))
2041 return (void*) vkCreateDepthStencilView;
2042 if (!strcmp(name, "CreateShader"))
2043 return (void*) vkCreateShader;
2044 if (!strcmp(name, "CreateGraphicsPipeline"))
2045 return (void*) vkCreateGraphicsPipeline;
2046 if (!strcmp(name, "CreateGraphicsPipelineDerivative"))
2047 return (void*) vkCreateGraphicsPipelineDerivative;
2048 if (!strcmp(name, "CreateComputePipeline"))
2049 return (void*) vkCreateComputePipeline;
2050 if (!strcmp(name, "StorePipeline"))
2051 return (void*) vkStorePipeline;
2052 if (!strcmp(name, "LoadPipeline"))
2053 return (void*) vkLoadPipeline;
2054 if (!strcmp(name, "LoadPipelineDerivative"))
2055 return (void*) vkLoadPipelineDerivative;
2056 if (!strcmp(name, "CreatePipelineLayout"))
2057 return (void*) vkCreatePipelineLayout;
2058 if (!strcmp(name, "CreateSampler"))
2059 return (void*) vkCreateSampler;
2060 if (!strcmp(name, "CreateDescriptorSetLayout"))
2061 return (void*) vkCreateDescriptorSetLayout;
2062 if (!strcmp(name, "CreateDescriptorPool"))
2063 return (void*) vkCreateDescriptorPool;
2064 if (!strcmp(name, "ResetDescriptorPool"))
2065 return (void*) vkResetDescriptorPool;
2066 if (!strcmp(name, "AllocDescriptorSets"))
2067 return (void*) vkAllocDescriptorSets;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002068 if (!strcmp(name, "CreateDynamicViewportState"))
2069 return (void*) vkCreateDynamicViewportState;
2070 if (!strcmp(name, "CreateDynamicRasterState"))
2071 return (void*) vkCreateDynamicRasterState;
2072 if (!strcmp(name, "CreateDynamicColorBlendState"))
2073 return (void*) vkCreateDynamicColorBlendState;
2074 if (!strcmp(name, "CreateDynamicDepthStencilState"))
2075 return (void*) vkCreateDynamicDepthStencilState;
2076 if (!strcmp(name, "CreateCommandBuffer"))
2077 return (void*) vkCreateCommandBuffer;
2078 if (!strcmp(name, "BeginCommandBuffer"))
2079 return (void*) vkBeginCommandBuffer;
2080 if (!strcmp(name, "EndCommandBuffer"))
2081 return (void*) vkEndCommandBuffer;
2082 if (!strcmp(name, "ResetCommandBuffer"))
2083 return (void*) vkResetCommandBuffer;
2084 if (!strcmp(name, "CmdBindPipeline"))
2085 return (void*) vkCmdBindPipeline;
2086 if (!strcmp(name, "CmdBindDynamicStateObject"))
2087 return (void*) vkCmdBindDynamicStateObject;
2088 if (!strcmp(name, "CmdBindDescriptorSets"))
2089 return (void*) vkCmdBindDescriptorSets;
2090 if (!strcmp(name, "CmdBindVertexBuffers"))
2091 return (void*) vkCmdBindVertexBuffers;
2092 if (!strcmp(name, "CmdBindIndexBuffer"))
2093 return (void*) vkCmdBindIndexBuffer;
2094 if (!strcmp(name, "CmdDraw"))
2095 return (void*) vkCmdDraw;
2096 if (!strcmp(name, "CmdDrawIndexed"))
2097 return (void*) vkCmdDrawIndexed;
2098 if (!strcmp(name, "CmdDrawIndirect"))
2099 return (void*) vkCmdDrawIndirect;
2100 if (!strcmp(name, "CmdDrawIndexedIndirect"))
2101 return (void*) vkCmdDrawIndexedIndirect;
2102 if (!strcmp(name, "CmdDispatch"))
2103 return (void*) vkCmdDispatch;
2104 if (!strcmp(name, "CmdDispatchIndirect"))
2105 return (void*) vkCmdDispatchIndirect;
2106 if (!strcmp(name, "CmdCopyBuffer"))
2107 return (void*) vkCmdCopyBuffer;
2108 if (!strcmp(name, "CmdCopyImage"))
2109 return (void*) vkCmdCopyImage;
2110 if (!strcmp(name, "CmdBlitImage"))
2111 return (void*) vkCmdBlitImage;
2112 if (!strcmp(name, "CmdCopyBufferToImage"))
2113 return (void*) vkCmdCopyBufferToImage;
2114 if (!strcmp(name, "CmdCopyImageToBuffer"))
2115 return (void*) vkCmdCopyImageToBuffer;
2116 if (!strcmp(name, "CmdUpdateBuffer"))
2117 return (void*) vkCmdUpdateBuffer;
2118 if (!strcmp(name, "CmdFillBuffer"))
2119 return (void*) vkCmdFillBuffer;
2120 if (!strcmp(name, "CmdClearColorImage"))
2121 return (void*) vkCmdClearColorImage;
2122 if (!strcmp(name, "CmdClearDepthStencil"))
2123 return (void*) vkCmdClearDepthStencil;
2124 if (!strcmp(name, "CmdResolveImage"))
2125 return (void*) vkCmdResolveImage;
2126 if (!strcmp(name, "CmdSetEvent"))
2127 return (void*) vkCmdSetEvent;
2128 if (!strcmp(name, "CmdResetEvent"))
2129 return (void*) vkCmdResetEvent;
2130 if (!strcmp(name, "CmdWaitEvents"))
2131 return (void*) vkCmdWaitEvents;
2132 if (!strcmp(name, "CmdPipelineBarrier"))
2133 return (void*) vkCmdPipelineBarrier;
2134 if (!strcmp(name, "CmdBeginQuery"))
2135 return (void*) vkCmdBeginQuery;
2136 if (!strcmp(name, "CmdEndQuery"))
2137 return (void*) vkCmdEndQuery;
2138 if (!strcmp(name, "CmdResetQueryPool"))
2139 return (void*) vkCmdResetQueryPool;
2140 if (!strcmp(name, "CmdWriteTimestamp"))
2141 return (void*) vkCmdWriteTimestamp;
2142 if (!strcmp(name, "CmdCopyQueryPoolResults"))
2143 return (void*) vkCmdCopyQueryPoolResults;
2144 if (!strcmp(name, "CmdInitAtomicCounters"))
2145 return (void*) vkCmdInitAtomicCounters;
2146 if (!strcmp(name, "CmdLoadAtomicCounters"))
2147 return (void*) vkCmdLoadAtomicCounters;
2148 if (!strcmp(name, "CmdSaveAtomicCounters"))
2149 return (void*) vkCmdSaveAtomicCounters;
2150 if (!strcmp(name, "CreateFramebuffer"))
2151 return (void*) vkCreateFramebuffer;
2152 if (!strcmp(name, "CreateRenderPass"))
2153 return (void*) vkCreateRenderPass;
2154 if (!strcmp(name, "CmdBeginRenderPass"))
2155 return (void*) vkCmdBeginRenderPass;
2156 if (!strcmp(name, "CmdEndRenderPass"))
2157 return (void*) vkCmdEndRenderPass;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002158
2159 return NULL;
2160}
2161
2162static inline void* layer_intercept_instance_proc(const char *name)
2163{
2164 if (!name || name[0] != 'v' || name[1] != 'k')
2165 return NULL;
2166
2167 name += 2;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002168 if (!strcmp(name, "CreateInstance"))
2169 return (void*) vkCreateInstance;
2170 if (!strcmp(name, "DestroyInstance"))
2171 return (void*) vkDestroyInstance;
2172 if (!strcmp(name, "GetPhysicalDeviceInfo"))
2173 return (void*) vkGetPhysicalDeviceInfo;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002174 if (!strcmp(name, "CreateDevice"))
2175 return (void*) vkCreateDevice;
2176 if (!strcmp(name, "GetGlobalExtensionInfo"))
2177 return (void*) vkGetGlobalExtensionInfo;
2178 if (!strcmp(name, "GetPhysicalDeviceExtensionInfo"))
2179 return (void*) vkGetPhysicalDeviceExtensionInfo;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002180 if (!strcmp(name, "GetMultiDeviceCompatibility"))
2181 return (void*) vkGetMultiDeviceCompatibility;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002182
2183 return NULL;
2184}
2185
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06002186VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002187{
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002188 void* addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002189 if (device == NULL) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002190 return NULL;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002191 }
2192
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -06002193 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn8fd08252015-05-28 16:25:02 -06002194
2195 /* loader uses this to force layer initialization; device object is wrapped */
2196 if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
2197 initDeviceTable((const VkBaseLayerObject *) device);
2198 return (void*) vkGetDeviceProcAddr;
2199 }
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002200
2201 addr = layer_intercept_proc(funcName);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002202 if (addr) {
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002203 return addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002204 }
Jon Ashburneab34492015-06-01 09:37:38 -06002205
Jon Ashburn747f2b62015-06-18 15:02:58 -06002206 VkLayerDispatchTable *pDisp = device_dispatch_table(device);
2207 if (deviceExtMap.size() == 0 || deviceExtMap[pDisp].wsi_lunarg_enabled)
Jon Ashburneab34492015-06-01 09:37:38 -06002208 {
Jon Ashburn747f2b62015-06-18 15:02:58 -06002209 if (!strcmp(funcName, "vkCreateSwapChainWSI"))
2210 return (void*) vkCreateSwapChainWSI;
2211 if (!strcmp(funcName, "vkDestroySwapChainWSI"))
2212 return (void*) vkDestroySwapChainWSI;
2213 if (!strcmp(funcName, "vkGetSwapChainInfoWSI"))
2214 return (void*) vkGetSwapChainInfoWSI;
2215 if (!strcmp(funcName, "vkQueuePresentWSI"))
2216 return (void*) vkQueuePresentWSI;
2217 }
2218 if (deviceExtMap.size() == 0 || deviceExtMap[pDisp].debug_marker_enabled)
2219 {
2220 if (!strcmp(funcName, "vkCmdDbgMarkerBegin"))
Jon Ashburneab34492015-06-01 09:37:38 -06002221 return (void*) vkCmdDbgMarkerBegin;
Jon Ashburn747f2b62015-06-18 15:02:58 -06002222 if (!strcmp(funcName, "vkCmdDbgMarkerEnd"))
Jon Ashburneab34492015-06-01 09:37:38 -06002223 return (void*) vkCmdDbgMarkerEnd;
Jon Ashburn747f2b62015-06-18 15:02:58 -06002224 if (!strcmp(funcName, "vkDbgSetObjectTag"))
Jon Ashburneab34492015-06-01 09:37:38 -06002225 return (void*) vkDbgSetObjectTag;
Jon Ashburn747f2b62015-06-18 15:02:58 -06002226 if (!strcmp(funcName, "vkDbgSetObjectName"))
Jon Ashburneab34492015-06-01 09:37:38 -06002227 return (void*) vkDbgSetObjectName;
2228 }
2229 {
Jon Ashburn747f2b62015-06-18 15:02:58 -06002230 if (pDisp->GetDeviceProcAddr == NULL)
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002231 return NULL;
Jon Ashburn747f2b62015-06-18 15:02:58 -06002232 return pDisp->GetDeviceProcAddr(device, funcName);
Jeremy Hayesa8b1a8d2015-04-06 13:46:11 -06002233 }
2234}
2235
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002236VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr(VkInstance instance, const char* funcName)
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002237{
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06002238 void *fptr;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002239 void* addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002240 if (instance == NULL) {
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002241 return NULL;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002242 }
2243
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -06002244 loader_platform_thread_once(&initOnce, initParamChecker);
Jon Ashburn8fd08252015-05-28 16:25:02 -06002245
2246 /* loader uses this to force layer initialization; instance object is wrapped */
2247 if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
2248 initInstanceTable((const VkBaseLayerObject *) instance);
2249 return (void*) vkGetInstanceProcAddr;
2250 }
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002251
2252 addr = layer_intercept_instance_proc(funcName);
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002253 if (addr) {
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002254 return addr;
Mark Lobodzinski2eed1eb2015-05-26 10:58:40 -05002255 }
Courtney Goeltzenleuchter500b89b2015-06-01 14:45:27 -06002256
2257 fptr = msg_callback_get_proc_addr(funcName);
2258 if (fptr)
2259 return fptr;
2260
Jon Ashburn9eed2892015-06-01 10:02:09 -06002261 VkLayerInstanceDispatchTable* pTable = instance_dispatch_table(instance);
2262 if (pTable->GetInstanceProcAddr == NULL)
2263 return NULL;
2264 return pTable->GetInstanceProcAddr(instance, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06002265}