blob: 62b00fb6fe1d009e05718943d7adb373166b7921 [file] [log] [blame]
Tobin Ehlis6663f492014-11-10 12:29:12 -07001/*
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05002 * Vulkan
Tobin Ehlis6663f492014-11-10 12:29:12 -07003 *
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05004 * Copyright (C) 2015 LunarG, Inc.
Tobin Ehlis6663f492014-11-10 12:29:12 -07005 *
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
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050017* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Tobin Ehlis6663f492014-11-10 12:29:12 -070018 * 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
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -050025#include <inttypes.h>
Tobin Ehlis6663f492014-11-10 12:29:12 -070026#include <stdio.h>
27#include <stdlib.h>
28#include <string.h>
29#include <assert.h>
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050030#include <list>
Mike Stroyan950496e2015-05-19 15:16:08 -060031#include <unordered_map>
Chia-I Wuf8693382015-04-16 22:02:10 +080032#include <vector>
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050033using namespace std;
34
Ian Elliott2d4ab1e2015-01-13 17:52:38 -070035#include "loader_platform.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060036#include "vk_dispatch_table_helper.h"
37#include "vk_struct_string_helper_cpp.h"
Tobin Ehliscd9223b2014-11-19 16:19:28 -070038#include "mem_tracker.h"
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070039#include "layers_config.h"
Ian Elliott655cad72015-02-12 17:08:34 -070040// The following is #included again to catch certain OS-specific functions
41// being used:
42#include "loader_platform.h"
Jon Ashburn2e672892015-02-16 08:46:53 -070043#include "layers_msg.h"
Tobin Ehlis6663f492014-11-10 12:29:12 -070044
Jon Ashburnbacb0f52015-04-06 10:58:22 -060045static VkLayerDispatchTable nextTable;
46static VkBaseLayerObject *pCurObj;
Ian Elliott2d4ab1e2015-01-13 17:52:38 -070047static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -060048// TODO : This can be much smarter, using separate locks for separate global data
49static int globalLockInitialized = 0;
50static loader_platform_thread_mutex globalLock;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070051
Tobin Ehlisc145be82015-01-08 15:22:32 -070052#define MAX_BINDING 0xFFFFFFFF
Tobin Ehlisc145be82015-01-08 15:22:32 -070053
Mike Stroyan950496e2015-05-19 15:16:08 -060054unordered_map<VkCmdBuffer, MT_CB_INFO*> cbMap;
55unordered_map<VkDeviceMemory, MT_MEM_OBJ_INFO*> memObjMap;
56unordered_map<VkObject, MT_OBJ_INFO*> objectMap;
57unordered_map<VkFence, MT_FENCE_INFO*> fenceMap; // Map fence to fence info
58unordered_map<VkQueue, MT_QUEUE_INFO*> queueMap;
59unordered_map<VkSwapChainWSI, MT_SWAP_CHAIN_INFO*> swapChainMap;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050060
Mark Lobodzinski50932972015-04-02 20:49:09 -050061// TODO : Add per-device fence completion
Mark Lobodzinskib1567a02015-04-21 15:33:04 -060062static uint64_t g_currentFenceId = 1;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -060063static VkDevice globalDevice = NULL;
Mark Lobodzinskic52b7752015-02-18 16:38:17 -060064
Mark Lobodzinski223ca202015-04-02 08:52:53 -050065// Add new queue for this device to map container
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -060066static void addQueueInfo(const VkQueue queue)
Mark Lobodzinski223ca202015-04-02 08:52:53 -050067{
Mark Lobodzinski50932972015-04-02 20:49:09 -050068 MT_QUEUE_INFO* pInfo = new MT_QUEUE_INFO;
69 pInfo->lastRetiredId = 0;
70 pInfo->lastSubmittedId = 0;
71 queueMap[queue] = pInfo;
Mark Lobodzinski223ca202015-04-02 08:52:53 -050072}
73
Mark Lobodzinskib1567a02015-04-21 15:33:04 -060074static void deleteQueueInfoList(
75 void)
Mark Lobodzinski223ca202015-04-02 08:52:53 -050076{
77 // Process queue list, cleaning up each entry before deleting
David Pinedod8f83d82015-04-27 16:36:17 -060078 if (queueMap.size() <= 0)
79 return;
Mike Stroyan950496e2015-05-19 15:16:08 -060080 for (unordered_map<VkQueue, MT_QUEUE_INFO*>::iterator ii=queueMap.begin(); ii!=queueMap.end(); ++ii) {
Mark Lobodzinski223ca202015-04-02 08:52:53 -050081 (*ii).second->pQueueCmdBuffers.clear();
82 }
83 queueMap.clear();
84}
85
Mark Lobodzinskib1567a02015-04-21 15:33:04 -060086static void addSwapChainInfo(
87 const VkSwapChainWSI swapChain)
Chia-I Wuf8693382015-04-16 22:02:10 +080088{
89 MT_SWAP_CHAIN_INFO* pInfo = new MT_SWAP_CHAIN_INFO;
90 swapChainMap[swapChain] = pInfo;
91}
92
Mark Lobodzinski223ca202015-04-02 08:52:53 -050093// Add new CBInfo for this cb to map container
Mark Lobodzinskib1567a02015-04-21 15:33:04 -060094static void addCBInfo(
95 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -070096{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050097 MT_CB_INFO* pInfo = new MT_CB_INFO;
Tony Barbourd1c35722015-04-16 15:59:00 -060098 memset(pInfo, 0, (sizeof(MT_CB_INFO) - sizeof(list<VkDeviceMemory>)));
Mark Lobodzinski6434eff2015-03-31 16:05:35 -050099 pInfo->cmdBuffer = cb;
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600100 cbMap[cb] = pInfo;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700101}
102
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500103// Return ptr to Info in CB map, or NULL if not found
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600104static MT_CB_INFO* getCBInfo(
105 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700106{
Mike Stroyan950496e2015-05-19 15:16:08 -0600107 unordered_map<VkCmdBuffer, MT_CB_INFO*>::iterator item = cbMap.find(cb);
108 if (item != cbMap.end()) {
109 return (*item).second;
110 } else {
111 return NULL;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600112 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700113}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600114
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500115// Return object info for 'object' or return NULL if no info exists
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600116static MT_OBJ_INFO* getObjectInfo(
117 const VkObject object)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500118{
Mike Stroyan950496e2015-05-19 15:16:08 -0600119 unordered_map<VkObject, MT_OBJ_INFO*>::iterator item = objectMap.find(object);
120 if (item != objectMap.end()) {
121 return (*item).second;
122 } else {
123 return NULL;
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500124 }
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500125}
126
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600127static MT_OBJ_INFO* addObjectInfo(
128 VkObject object,
129 VkStructureType sType,
130 const void *pCreateInfo,
131 const int struct_size,
132 const char *name_prefix)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500133{
134 MT_OBJ_INFO* pInfo = new MT_OBJ_INFO;
135 memset(pInfo, 0, sizeof(MT_OBJ_INFO));
136 memcpy(&pInfo->create_info, pCreateInfo, struct_size);
137 sprintf(pInfo->object_name, "%s_%p", name_prefix, object);
138
139 pInfo->object = object;
140 pInfo->ref_count = 1;
141 pInfo->sType = sType;
142 objectMap[object] = pInfo;
143
144 return pInfo;
145}
146
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500147// Add a fence, creating one if necessary to our list of fences/fenceIds
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600148static uint64_t addFenceInfo(
149 VkFence fence,
150 VkQueue queue)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500151{
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500152 // Create fence object
Mark Lobodzinski50932972015-04-02 20:49:09 -0500153 MT_QUEUE_INFO* pQueueInfo = queueMap[queue];
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500154 uint64_t fenceId = g_currentFenceId++;
Mike Stroyan950496e2015-05-19 15:16:08 -0600155 if (fence != NULL) {
156 MT_FENCE_INFO* pFenceInfo = new MT_FENCE_INFO;
157 pFenceInfo->fenceId = fenceId;
158 pFenceInfo->queue = queue;
159 fenceMap[fence] = pFenceInfo;
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -0500160 // Validate that fence is in UNSIGNALED state
161 MT_OBJ_INFO* pObjectInfo = getObjectInfo(fence);
162 if (pObjectInfo != NULL) {
Tobin Ehlisb870cbb2015-04-15 07:46:12 -0600163 if (pObjectInfo->create_info.fence_create_info.flags & VK_FENCE_CREATE_SIGNALED_BIT) {
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -0500164 char str[1024];
165 sprintf(str, "Fence %p submitted in SIGNALED state. Fences must be reset before being submitted", fence);
Tobin Ehlisb870cbb2015-04-15 07:46:12 -0600166 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, fence, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", str);
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -0500167 }
168 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700169 }
Mike Stroyan950496e2015-05-19 15:16:08 -0600170 // Update most recently submitted fence and fenceId for Queue
Mark Lobodzinski50932972015-04-02 20:49:09 -0500171 pQueueInfo->lastSubmittedId = fenceId;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500172 return fenceId;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500173}
174
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500175// Remove a fenceInfo from our list of fences/fenceIds
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600176static void deleteFenceInfo(
Mike Stroyan950496e2015-05-19 15:16:08 -0600177 VkFence fence)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500178{
Mike Stroyan950496e2015-05-19 15:16:08 -0600179 unordered_map<VkFence, MT_FENCE_INFO*>::iterator item;
180 item = fenceMap.find(fence);
181 if (item != fenceMap.end()) {
182 MT_FENCE_INFO* pDelInfo = (*item).second;
183 if (pDelInfo != NULL) {
184 delete pDelInfo;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500185 }
Mike Stroyan950496e2015-05-19 15:16:08 -0600186 fenceMap.erase(item);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500187 }
188}
189
Mike Stroyan950496e2015-05-19 15:16:08 -0600190// Record information when a fence is known to be signalled
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600191static void updateFenceTracking(
192 VkFence fence)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500193{
Mike Stroyan950496e2015-05-19 15:16:08 -0600194 unordered_map<VkFence, MT_FENCE_INFO*>::iterator fence_item = fenceMap.find(fence);
195 if (fence_item != fenceMap.end()) {
196 MT_FENCE_INFO *pCurFenceInfo = (*fence_item).second;
197 VkQueue queue = pCurFenceInfo->queue;
198 unordered_map<VkQueue, MT_QUEUE_INFO*>::iterator queue_item = queueMap.find(queue);
199 if (queue_item != queueMap.end()) {
200 MT_QUEUE_INFO *pQueueInfo = (*queue_item).second;
201 if (pQueueInfo->lastRetiredId < pCurFenceInfo->fenceId) {
202 pQueueInfo->lastRetiredId = pCurFenceInfo->fenceId;
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500203 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500204 }
205 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500206
Mike Stroyan950496e2015-05-19 15:16:08 -0600207 // Update fence state in fenceCreateInfo structure
208 MT_OBJ_INFO* pObjectInfo = getObjectInfo(fence);
209 if (pObjectInfo != NULL) {
210 pObjectInfo->create_info.fence_create_info.flags =
211 static_cast<VkFenceCreateFlags>(
212 pObjectInfo->create_info.fence_create_info.flags | VK_FENCE_CREATE_SIGNALED_BIT);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500213 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500214}
215
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500216// Helper routine that updates the fence list for a specific queue to all-retired
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600217static void retireQueueFences(
218 VkQueue queue)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500219{
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600220 MT_QUEUE_INFO *pQueueInfo = queueMap[queue];
Mike Stroyan950496e2015-05-19 15:16:08 -0600221 // Set Queue's lastRetired to lastSubmitted
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600222 pQueueInfo->lastRetiredId = pQueueInfo->lastSubmittedId;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700223}
224
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500225// Helper routine that updates fence list for all queues to all-retired
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600226static void retireDeviceFences(
227 VkDevice device)
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500228{
229 // Process each queue for device
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600230 // TODO: Add multiple device support
David Pinedod8f83d82015-04-27 16:36:17 -0600231 if (queueMap.size() <= 0)
232 return;
Mike Stroyan950496e2015-05-19 15:16:08 -0600233 for (unordered_map<VkQueue, MT_QUEUE_INFO*>::iterator ii=queueMap.begin(); ii!=queueMap.end(); ++ii) {
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500234 retireQueueFences((*ii).first);
235 }
236}
237
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500238// Return ptr to info in map container containing mem, or NULL if not found
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700239// Calls to this function should be wrapped in mutex
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600240static MT_MEM_OBJ_INFO* getMemObjInfo(
241 const VkDeviceMemory mem)
Tobin Ehlisc145be82015-01-08 15:22:32 -0700242{
Mike Stroyan950496e2015-05-19 15:16:08 -0600243 unordered_map<VkDeviceMemory, MT_MEM_OBJ_INFO*>::iterator item = memObjMap.find(mem);
244 if (item != memObjMap.end()) {
245 return (*item).second;
246 } else {
247 return NULL;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600248 }
Tobin Ehlisc145be82015-01-08 15:22:32 -0700249}
250
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600251static void addMemObjInfo(
252 const VkDeviceMemory mem,
253 const VkMemoryAllocInfo *pAllocInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700254{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500255 MT_MEM_OBJ_INFO* pInfo = new MT_MEM_OBJ_INFO;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600256 pInfo->refCount = 0;
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600257 memset(&pInfo->allocInfo, 0, sizeof(VkMemoryAllocInfo));
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500258
Chia-I Wuf8693382015-04-16 22:02:10 +0800259 if (pAllocInfo) { // MEM alloc created by vkCreateSwapChainWSI() doesn't have alloc info struct
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600260 memcpy(&pInfo->allocInfo, pAllocInfo, sizeof(VkMemoryAllocInfo));
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500261 // TODO: Update for real hardware, actually process allocation info structures
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500262 pInfo->allocInfo.pNext = NULL;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700263 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500264 pInfo->mem = mem;
265 memObjMap[mem] = pInfo;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700266}
267
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500268// Find CB Info and add mem binding to list container
269// Find Mem Obj Info and add CB binding to list container
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600270static bool32_t updateCBBinding(
271 const VkCmdBuffer cb,
272 const VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700273{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600274 bool32_t result = VK_TRUE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700275 // First update CB binding in MemObj mini CB list
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500276 MT_MEM_OBJ_INFO* pMemInfo = getMemObjInfo(mem);
277 if (!pMemInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700278 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600279 sprintf(str, "Trying to bind mem obj %p to CB %p but no info for that mem obj.\n "
280 "Was it correctly allocated? Did it already get freed?", mem, cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600281 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
282 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600283 } else {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500284 // Search for cmd buffer object in memory object's binding list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600285 bool32_t found = VK_FALSE;
David Pinedod8f83d82015-04-27 16:36:17 -0600286 if (pMemInfo->pCmdBufferBindings.size() > 0) {
287 for (list<VkCmdBuffer>::iterator it = pMemInfo->pCmdBufferBindings.begin(); it != pMemInfo->pCmdBufferBindings.end(); ++it) {
288 if ((*it) == cb) {
289 found = VK_TRUE;
290 break;
291 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500292 }
293 }
294 // If not present, add to list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600295 if (found == VK_FALSE) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500296 pMemInfo->pCmdBufferBindings.push_front(cb);
297 pMemInfo->refCount++;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500298 }
299
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500300 // Now update CBInfo's Mem binding list
301 MT_CB_INFO* pCBInfo = getCBInfo(cb);
302 if (!pCBInfo) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500303 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500304 sprintf(str, "Trying to bind mem obj %p to CB %p but no info for that CB. Was it CB incorrectly destroyed?", mem, cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600305 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
306 result = VK_FALSE;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500307 } else {
308 // Search for memory object in cmd buffer's binding list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600309 bool32_t found = VK_FALSE;
David Pinedod8f83d82015-04-27 16:36:17 -0600310 if (pCBInfo->pMemObjList.size() > 0) {
311 for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
312 if ((*it) == mem) {
313 found = VK_TRUE;
314 break;
315 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500316 }
317 }
318 // If not present, add to list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600319 if (found == VK_FALSE) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500320 pCBInfo->pMemObjList.push_front(mem);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600321 }
322 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700323 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600324 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700325}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600326
Tobin Ehlis6663f492014-11-10 12:29:12 -0700327// Clear the CB Binding for mem
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700328// Calls to this function should be wrapped in mutex
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600329static void clearCBBinding(
330 const VkCmdBuffer cb,
331 const VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700332{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500333 MT_MEM_OBJ_INFO* pInfo = getMemObjInfo(mem);
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500334 // TODO : Having this check is not ideal, really if memInfo was deleted,
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700335 // its CB bindings should be cleared and then freeCBBindings wouldn't call
336 // us here with stale mem objs
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500337 if (pInfo) {
338 pInfo->pCmdBufferBindings.remove(cb);
339 pInfo->refCount--;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700340 }
341}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600342
Tobin Ehlis6663f492014-11-10 12:29:12 -0700343// Free bindings related to CB
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600344static bool32_t freeCBBindings(
345 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700346{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600347 bool32_t result = VK_TRUE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500348 MT_CB_INFO* pCBInfo = getCBInfo(cb);
349 if (!pCBInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700350 char str[1024];
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500351 sprintf(str, "Unable to find global CB info %p for deletion", cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600352 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
353 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600354 } else {
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -0600355 if (pCBInfo->pMemObjList.size() > 0) {
356 list<VkDeviceMemory> mem_obj_list = pCBInfo->pMemObjList;
357 for (list<VkDeviceMemory>::iterator it=mem_obj_list.begin(); it!=mem_obj_list.end(); ++it) {
David Pinedod8f83d82015-04-27 16:36:17 -0600358 clearCBBinding(cb, (*it));
359 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600360 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500361 pCBInfo->pMemObjList.clear();
Tobin Ehlis6663f492014-11-10 12:29:12 -0700362 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600363 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700364}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600365
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500366// Delete CBInfo from list along with all of it's mini MemObjInfo
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500367// and also clear mem references to CB
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600368static bool32_t deleteCBInfo(
369 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700370{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600371 bool32_t result = VK_TRUE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600372 result = freeCBBindings(cb);
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500373 // Delete the CBInfo info
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600374 if (result == VK_TRUE) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500375 if (cbMap.find(cb) != cbMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500376 MT_CB_INFO* pDelInfo = cbMap[cb];
377 delete pDelInfo;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500378 cbMap.erase(cb);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600379 }
Ian Elliott2d4ab1e2015-01-13 17:52:38 -0700380 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600381 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700382}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600383
Tobin Ehlis6663f492014-11-10 12:29:12 -0700384// Delete the entire CB list
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600385static bool32_t deleteCBInfoList(
386 void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700387{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600388 bool32_t result = VK_TRUE;
David Pinedod8f83d82015-04-27 16:36:17 -0600389 if (cbMap.size() <= 0)
390 return result;
Mike Stroyan950496e2015-05-19 15:16:08 -0600391 for (unordered_map<VkCmdBuffer, MT_CB_INFO*>::iterator ii=cbMap.begin(); ii!=cbMap.end(); ++ii) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500392 freeCBBindings((*ii).first);
393 delete (*ii).second;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700394 }
395 return result;
396}
397
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500398// For given MemObjInfo, report Obj & CB bindings
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600399static void reportMemReferencesAndCleanUp(
400 MT_MEM_OBJ_INFO* pMemObjInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700401{
Tony Barbour18f71552015-04-22 11:36:22 -0600402 size_t cmdBufRefCount = pMemObjInfo->pCmdBufferBindings.size();
403 size_t objRefCount = pMemObjInfo->pObjBindings.size();
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500404
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500405 if ((pMemObjInfo->pCmdBufferBindings.size() + pMemObjInfo->pObjBindings.size()) != 0) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700406 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600407 sprintf(str, "Attempting to free memory object %p which still contains %lu references",
408 pMemObjInfo->mem, (cmdBufRefCount + objRefCount));
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500409 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, pMemObjInfo->mem, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700410 }
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500411
David Pinedod8f83d82015-04-27 16:36:17 -0600412 if (cmdBufRefCount > 0 && pMemObjInfo->pCmdBufferBindings.size() > 0) {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500413 for (list<VkCmdBuffer>::const_iterator it = pMemObjInfo->pCmdBufferBindings.begin(); it != pMemObjInfo->pCmdBufferBindings.end(); ++it) {
414 char str[1024];
415 sprintf(str, "Command Buffer %p still has a reference to mem obj %p", (*it), pMemObjInfo->mem);
416 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, (*it), 0, MEMTRACK_NONE, "MEM", str);
417 }
418 // Clear the list of hanging references
419 pMemObjInfo->pCmdBufferBindings.clear();
420 }
421
David Pinedod8f83d82015-04-27 16:36:17 -0600422 if (objRefCount > 0 && pMemObjInfo->pObjBindings.size() > 0) {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500423 for (list<VkObject>::const_iterator it = pMemObjInfo->pObjBindings.begin(); it != pMemObjInfo->pObjBindings.end(); ++it) {
424 char str[1024];
425 sprintf(str, "VK Object %p still has a reference to mem obj %p", (*it), pMemObjInfo->mem);
426 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, (*it), 0, MEMTRACK_NONE, "MEM", str);
427 }
428 // Clear the list of hanging references
429 pMemObjInfo->pObjBindings.clear();
430 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500431
Tobin Ehlis6663f492014-11-10 12:29:12 -0700432}
433
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600434static void deleteMemObjInfo(
435 VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700436{
Mike Stroyan950496e2015-05-19 15:16:08 -0600437 unordered_map<VkDeviceMemory, MT_MEM_OBJ_INFO*>::iterator item = memObjMap.find(mem);
438 if (item != memObjMap.end()) {
439 MT_MEM_OBJ_INFO* pDelInfo = (*item).second;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500440 delete pDelInfo;
Mike Stroyan950496e2015-05-19 15:16:08 -0600441 memObjMap.erase(item);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700442 }
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500443 else {
444 char str[1024];
445 sprintf(str, "Request to delete memory object %p not present in memory Object Map", mem);
446 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
447 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700448}
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500449
Tobin Ehlis6663f492014-11-10 12:29:12 -0700450// Check if fence for given CB is completed
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600451static bool32_t checkCBCompleted(
452 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700453{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600454 bool32_t result = VK_TRUE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500455 MT_CB_INFO* pCBInfo = getCBInfo(cb);
456 if (!pCBInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700457 char str[1024];
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500458 sprintf(str, "Unable to find global CB info %p to check for completion", cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600459 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
460 result = VK_FALSE;
Mike Stroyan950496e2015-05-19 15:16:08 -0600461 } else if (pCBInfo->lastSubmittedQueue != NULL) {
462 VkQueue queue = pCBInfo->lastSubmittedQueue;
463 MT_QUEUE_INFO *pQueueInfo = queueMap[queue];
464 if (pCBInfo->fenceId > pQueueInfo->lastRetiredId) {
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600465 char str[1024];
Mike Stroyan950496e2015-05-19 15:16:08 -0600466 sprintf(str, "fence %p for CB %p has not been checked for completion",
467 (void*)pCBInfo->lastSubmittedFence, cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600468 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
469 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600470 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700471 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600472 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700473}
474
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600475static bool32_t freeMemObjInfo(
476 VkDeviceMemory mem,
477 bool internal)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700478{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600479 bool32_t result = VK_TRUE;
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500480 // Parse global list to find info w/ mem
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500481 MT_MEM_OBJ_INFO* pInfo = getMemObjInfo(mem);
482 if (!pInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700483 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600484 sprintf(str, "Couldn't find mem info object for %p\n Was %p never allocated or previously freed?",
485 (void*)mem, (void*)mem);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600486 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
487 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600488 } else {
Courtney Goeltzenleuchter1c943a72015-03-26 16:15:39 -0600489 if (pInfo->allocInfo.allocationSize == 0 && !internal) {
Mark Lobodzinski2f3b19b2015-02-18 18:06:24 -0600490 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600491 sprintf(str, "Attempting to free memory associated with a Persistent Image, %p, "
492 "this should not be explicitly freed\n", (void*)mem);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600493 layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
494 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600495 } else {
496 // Clear any CB bindings for completed CBs
497 // TODO : Is there a better place to do this?
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500498
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600499 list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin();
500 list<VkCmdBuffer>::iterator temp;
David Pinedod8f83d82015-04-27 16:36:17 -0600501 while (pInfo->pCmdBufferBindings.size() > 0 && it != pInfo->pCmdBufferBindings.end()) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600502 if (VK_TRUE == checkCBCompleted(*it)) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500503 temp = it;
504 ++temp;
505 freeCBBindings(*it);
506 it = temp;
507 } else {
508 ++it;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600509 }
510 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500511
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600512 // Now verify that no references to this mem obj remain
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500513 if (0 != pInfo->refCount) {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500514 reportMemReferencesAndCleanUp(pInfo);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600515 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600516 }
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600517 // Delete mem obj info
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500518 deleteMemObjInfo(mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700519 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700520 }
521 return result;
522}
523
Tobin Ehlis6663f492014-11-10 12:29:12 -0700524// Remove object binding performs 3 tasks:
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500525// 1. Remove ObjectInfo from MemObjInfo list container of obj bindings & free it
526// 2. Decrement refCount for MemObjInfo
527// 3. Clear MemObjInfo ptr from ObjectInfo
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600528static bool32_t clearObjectBinding(
529 VkObject object)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700530{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600531 bool32_t result = VK_FALSE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500532 MT_OBJ_INFO* pObjInfo = getObjectInfo(object);
533 if (!pObjInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700534 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600535 sprintf(str, "Attempting to clear mem binding for object %p: devices, queues, command buffers, "
536 "shaders and memory objects do not have external memory requirements and it is "
537 "unneccessary to call bind/unbindObjectMemory on them.", object);
Mark Lobodzinski23065352015-05-29 09:32:35 -0500538 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_OBJECT, "MEM", str);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600539 } else {
David Pinedod8f83d82015-04-27 16:36:17 -0600540 if (!pObjInfo->pMemObjInfo || pObjInfo->pMemObjInfo->pObjBindings.size() <= 0) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600541 char str[1024];
542 sprintf(str, "Attempting to clear mem binding on obj %p but it has no binding.", (void*)object);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600543 layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEM_OBJ_CLEAR_EMPTY_BINDINGS, "MEM", str);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600544 } else {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500545 // This obj is bound to a memory object. Remove the reference to this object in that memory object's list, decrement the memObj's refcount
546 // and set the objects memory binding pointer to NULL.
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600547 for (list<VkObject>::iterator it = pObjInfo->pMemObjInfo->pObjBindings.begin(); it != pObjInfo->pMemObjInfo->pObjBindings.end(); ++it) {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500548 if ((*it) == object) {
549 pObjInfo->pMemObjInfo->refCount--;
550 pObjInfo->pMemObjInfo->pObjBindings.erase(it);
551 pObjInfo->pMemObjInfo = NULL;
552 result = VK_TRUE;
553 break;
554 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600555 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600556 if (result == VK_FALSE) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600557 char str[1024];
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500558 sprintf(str, "While trying to clear mem binding for object %p, unable to find that object referenced by mem obj %p",
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500559 object, pObjInfo->pMemObjInfo->mem);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600560 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600561 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700562 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700563 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600564 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700565}
566
567// For NULL mem case, clear any previous binding Else...
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500568// Make sure given object is in global object map
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700569// IF a previous binding existed, clear it
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500570// Add reference from objectInfo to memoryInfo
571// Add reference off of objInfo
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600572// Return VK_TRUE if addition is successful, VK_FALSE otherwise
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600573static bool32_t updateObjectBinding(
574 VkObject object,
575 VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700576{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600577 bool32_t result = VK_FALSE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700578 // Handle NULL case separately, just clear previous binding & decrement reference
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600579 if (mem == VK_NULL_HANDLE) {
Tobin Ehlis6663f492014-11-10 12:29:12 -0700580 clearObjectBinding(object);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600581 result = VK_TRUE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600582 } else {
583 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500584 MT_OBJ_INFO* pObjInfo = getObjectInfo(object);
585 if (!pObjInfo) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600586 sprintf(str, "Attempting to update Binding of Obj(%p) that's not in global list()", (void*)object);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600587 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
588 return VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600589 }
590 // non-null case so should have real mem obj
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500591 MT_MEM_OBJ_INFO* pInfo = getMemObjInfo(mem);
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -0600592 if (!pInfo) {
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500593 sprintf(str, "While trying to bind mem for obj %p, couldn't find info for mem obj %p", (void*)object, (void*)mem);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600594 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500595 return VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600596 } else {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500597 // Search for object in memory object's binding list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600598 bool32_t found = VK_FALSE;
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -0600599 if (pInfo->pObjBindings.size() > 0) {
600 for (list<VkObject>::iterator it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) {
601 if ((*it) == object) {
602 found = VK_TRUE;
603 break;
604 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600605 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600606 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500607 // If not present, add to list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600608 if (found == VK_FALSE) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500609 pInfo->pObjBindings.push_front(object);
610 pInfo->refCount++;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500611 }
612
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500613 if (pObjInfo->pMemObjInfo) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500614 clearObjectBinding(object); // Need to clear the previous object binding before setting new binding
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500615 sprintf(str, "Updating memory binding for object %p from mem obj %p to %p", object, pObjInfo->pMemObjInfo->mem, mem);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600616 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500617 }
618 // For image objects, make sure default memory state is correctly set
619 // TODO : What's the best/correct way to handle this?
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600620 if (VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO == pObjInfo->sType) {
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600621 if (pObjInfo->create_info.image_create_info.usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
622 VK_IMAGE_USAGE_DEPTH_STENCIL_BIT)) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500623 // TODO:: More memory state transition stuff.
624 }
625 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500626 pObjInfo->pMemObjInfo = pInfo;
Tobin Ehlis8be20fd2015-01-07 17:49:29 -0700627 }
628 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600629 return VK_TRUE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700630}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600631
Tobin Ehlis6663f492014-11-10 12:29:12 -0700632// Print details of global Obj tracking list
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600633static void printObjList(
634 void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700635{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500636 MT_OBJ_INFO* pInfo = NULL;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500637 char str[1024];
Mike Stroyan1f9985c2015-05-18 16:29:39 -0600638 if (g_reportingLevel > VK_DBG_LAYER_LEVEL_INFO) {
639 return;
640 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500641 sprintf(str, "Details of Object list of size %lu elements", objectMap.size());
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600642 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
David Pinedod8f83d82015-04-27 16:36:17 -0600643 if (objectMap.size() <= 0)
644 return;
Mike Stroyan950496e2015-05-19 15:16:08 -0600645 for (unordered_map<VkObject, MT_OBJ_INFO*>::iterator ii=objectMap.begin(); ii!=objectMap.end(); ++ii) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500646 pInfo = (*ii).second;
647 sprintf(str, " ObjInfo %p has object %p, pMemObjInfo %p", pInfo, pInfo->object, pInfo->pMemObjInfo);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600648 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, pInfo->object, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700649 }
650}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600651
Tobin Ehlis6663f492014-11-10 12:29:12 -0700652// For given Object, get 'mem' obj that it's bound to or NULL if no binding
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600653static VkDeviceMemory getMemBindingFromObject(
654 const VkObject object)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700655{
Tony Barbourd1c35722015-04-16 15:59:00 -0600656 VkDeviceMemory mem = NULL;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500657 MT_OBJ_INFO* pObjInfo = getObjectInfo(object);
658 if (pObjInfo) {
659 if (pObjInfo->pMemObjInfo) {
660 mem = pObjInfo->pMemObjInfo->mem;
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -0600661 } else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700662 char str[1024];
663 sprintf(str, "Trying to get mem binding for object %p but object has no mem binding", (void*)object);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600664 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MISSING_MEM_BINDINGS, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700665 printObjList();
666 }
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -0600667 } else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700668 char str[1024];
669 sprintf(str, "Trying to get mem binding for object %p but no such object in global list", (void*)object);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600670 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_OBJECT, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700671 printObjList();
672 }
673 return mem;
674}
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500675
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500676// Print details of MemObjInfo list
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600677static void printMemList(
678 void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700679{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500680 MT_MEM_OBJ_INFO* pInfo = NULL;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700681 // Just printing each msg individually for now, may want to package these into single large print
682 char str[1024];
Mike Stroyan1f9985c2015-05-18 16:29:39 -0600683 if (g_reportingLevel > VK_DBG_LAYER_LEVEL_INFO) {
684 return;
685 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500686 sprintf(str, "MEM INFO : Details of Memory Object list of size %lu elements", memObjMap.size());
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600687 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500688
David Pinedod8f83d82015-04-27 16:36:17 -0600689 if (memObjMap.size() <= 0)
690 return;
691
Mike Stroyan950496e2015-05-19 15:16:08 -0600692 for (unordered_map<VkDeviceMemory, MT_MEM_OBJ_INFO*>::iterator ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500693 pInfo = (*ii).second;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500694
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500695 sprintf(str, " ===MemObjInfo at %p===", (void*)pInfo);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600696 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500697 sprintf(str, " Mem object: %p", (void*)pInfo->mem);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600698 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500699 sprintf(str, " Ref Count: %u", pInfo->refCount);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600700 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500701 if (0 != pInfo->allocInfo.allocationSize) {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600702 string pAllocInfoMsg = vk_print_vkmemoryallocinfo(&pInfo->allocInfo, "{MEM}INFO : ");
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500703 sprintf(str, " Mem Alloc info:\n%s", pAllocInfoMsg.c_str());
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600704 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500705 } else {
Chia-I Wuf8693382015-04-16 22:02:10 +0800706 sprintf(str, " Mem Alloc info is NULL (alloc done by vkCreateSwapChainWSI())");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600707 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500708 }
709
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600710 sprintf(str, " VK OBJECT Binding list of size %lu elements:", pInfo->pObjBindings.size());
711 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
David Pinedod8f83d82015-04-27 16:36:17 -0600712 if (pInfo->pObjBindings.size() > 0) {
713 for (list<VkObject>::iterator it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) {
714 sprintf(str, " VK OBJECT %p", (*it));
715 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
716 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500717 }
718
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600719 sprintf(str, " VK Command Buffer (CB) binding list of size %lu elements", pInfo->pCmdBufferBindings.size());
720 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
David Pinedod8f83d82015-04-27 16:36:17 -0600721 if (pInfo->pCmdBufferBindings.size() > 0)
722 {
723 for (list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin(); it != pInfo->pCmdBufferBindings.end(); ++it) {
724 sprintf(str, " VK CB %p", (*it));
725 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
726 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700727 }
728 }
729}
730
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600731static void printCBList(
732 void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700733{
Mike Stroyan950496e2015-05-19 15:16:08 -0600734 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500735 MT_CB_INFO* pCBInfo = NULL;
Mike Stroyan1f9985c2015-05-18 16:29:39 -0600736 if (g_reportingLevel > VK_DBG_LAYER_LEVEL_INFO) {
737 return;
738 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500739 sprintf(str, "Details of CB list of size %lu elements", cbMap.size());
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600740 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500741
David Pinedod8f83d82015-04-27 16:36:17 -0600742 if (cbMap.size() <= 0)
743 return;
744
Mike Stroyan950496e2015-05-19 15:16:08 -0600745 for (unordered_map<VkCmdBuffer, MT_CB_INFO*>::iterator ii=cbMap.begin(); ii!=cbMap.end(); ++ii) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500746 pCBInfo = (*ii).second;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500747
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500748 sprintf(str, " CB Info (%p) has CB %p, fenceId %" PRIx64", and fence %p",
749 (void*)pCBInfo, (void*)pCBInfo->cmdBuffer, pCBInfo->fenceId,
Mike Stroyan950496e2015-05-19 15:16:08 -0600750 (void*)pCBInfo->lastSubmittedFence);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600751 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500752
David Pinedod8f83d82015-04-27 16:36:17 -0600753 if (pCBInfo->pMemObjList.size() <= 0)
754 continue;
Tony Barbourd1c35722015-04-16 15:59:00 -0600755 for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500756 sprintf(str, " Mem obj %p", (*it));
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600757 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700758 }
759 }
760}
761
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600762static void initMemTracker(
763 void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700764{
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700765 const char *strOpt;
766 // initialize MemTracker options
Ian Elliotte7826712015-03-06 13:50:05 -0700767 getLayerOptionEnum("MemTrackerReportLevel", (uint32_t *) &g_reportingLevel);
768 g_actionIsDefault = getLayerOptionEnum("MemTrackerDebugAction", (uint32_t *) &g_debugAction);
Tobin Ehlisee702232015-01-08 14:26:53 -0700769
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600770 if (g_debugAction & VK_DBG_LAYER_ACTION_LOG_MSG)
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700771 {
772 strOpt = getLayerOption("MemTrackerLogFilename");
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600773 if (strOpt) {
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700774 g_logFile = fopen(strOpt, "w");
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700775 }
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600776 if (g_logFile == NULL) {
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700777 g_logFile = stdout;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600778 }
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700779 }
780
781 // initialize Layer dispatch table
782 // TODO handle multiple GPUs
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600783 PFN_vkGetProcAddr fpNextGPA;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700784 fpNextGPA = pCurObj->pGPA;
785 assert(fpNextGPA);
786
Tony Barbourd1c35722015-04-16 15:59:00 -0600787 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkPhysicalDevice) pCurObj->nextObject);
Chia-I Wuaa4121f2015-01-04 23:11:43 +0800788
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600789 if (!globalLockInitialized)
790 {
791 // TODO/TBD: Need to delete this mutex sometime. How??? One
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600792 // suggestion is to call this during vkCreateInstance(), and then we
793 // can clean it up during vkDestroyInstance(). However, that requires
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600794 // that the layer have per-instance locks. We need to come back and
795 // address this soon.
796 loader_platform_thread_create_mutex(&globalLock);
797 globalLockInitialized = 1;
798 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700799}
800
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600801VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(
802 VkPhysicalDevice gpu,
803 const VkDeviceCreateInfo *pCreateInfo,
804 VkDevice *pDevice)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700805{
Jon Ashburn4d9f4652015-04-08 21:33:34 -0600806 pCurObj = (VkBaseLayerObject *) gpu;
Ian Elliott2d4ab1e2015-01-13 17:52:38 -0700807 loader_platform_thread_once(&g_initOnce, initMemTracker);
Jon Ashburn4d9f4652015-04-08 21:33:34 -0600808 VkResult result = nextTable.CreateDevice(gpu, pCreateInfo, pDevice);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700809 // Save off device in case we need it to create Fences
810 globalDevice = *pDevice;
811 return result;
812}
813
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600814VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice(
815 VkDevice device)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700816{
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700817 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600818 sprintf(str, "Printing List details prior to vkDestroyDevice()");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600819 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600820 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, device, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700821 printMemList();
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500822 printCBList();
Tobin Ehlis6663f492014-11-10 12:29:12 -0700823 printObjList();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600824 if (VK_FALSE == deleteCBInfoList()) {
825 sprintf(str, "Issue deleting global CB list in vkDestroyDevice()");
826 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, device, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700827 }
Tobin Ehlisb54ef782014-11-25 18:01:12 -0700828 // Report any memory leaks
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500829 MT_MEM_OBJ_INFO* pInfo = NULL;
David Pinedod8f83d82015-04-27 16:36:17 -0600830 if (memObjMap.size() > 0) {
Mike Stroyan950496e2015-05-19 15:16:08 -0600831 for (unordered_map<VkDeviceMemory, MT_MEM_OBJ_INFO*>::iterator ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
David Pinedod8f83d82015-04-27 16:36:17 -0600832 pInfo = (*ii).second;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500833
David Pinedod8f83d82015-04-27 16:36:17 -0600834 if (pInfo->allocInfo.allocationSize != 0) {
835 sprintf(str, "Mem Object %p has not been freed. You should clean up this memory by calling "
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600836 "vkFreeMemory(%p) prior to vkDestroyDevice().", pInfo->mem, pInfo->mem);
David Pinedod8f83d82015-04-27 16:36:17 -0600837 layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, pInfo->mem, 0, MEMTRACK_MEMORY_LEAK, "MEM", str);
838 }
Mark Lobodzinski2f3b19b2015-02-18 18:06:24 -0600839 }
Tobin Ehlisb54ef782014-11-25 18:01:12 -0700840 }
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500841
842 // Queues persist until device is destroyed
843 deleteQueueInfoList();
844
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600845 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600846 VkResult result = nextTable.DestroyDevice(device);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700847 return result;
848}
849
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600850struct extProps {
851 uint32_t version;
852 const char * const name;
853};
Jon Ashburn120cfbe2015-04-14 14:12:59 -0600854#define MEM_TRACKER_LAYER_EXT_ARRAY_SIZE 2
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600855static const struct extProps mtExts[MEM_TRACKER_LAYER_EXT_ARRAY_SIZE] = {
856 // TODO what is the version?
Jon Ashburn120cfbe2015-04-14 14:12:59 -0600857 0x10, "MemTracker",
858 0x10, "Validation"
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600859};
860
861VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600862 VkExtensionInfoType infoType,
863 uint32_t extensionIndex,
864 size_t *pDataSize,
865 void *pData)
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600866{
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500867 // This entrypoint is NOT going to init its own dispatch table since loader calls here early
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600868 VkExtensionProperties *ext_props;
869 uint32_t *count;
870
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600871 if (pDataSize == NULL) {
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600872 return VK_ERROR_INVALID_POINTER;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600873 }
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600874
875 switch (infoType) {
876 case VK_EXTENSION_INFO_TYPE_COUNT:
877 *pDataSize = sizeof(uint32_t);
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600878 if (pData == NULL) {
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600879 return VK_SUCCESS;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600880 }
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600881 count = (uint32_t *) pData;
882 *count = MEM_TRACKER_LAYER_EXT_ARRAY_SIZE;
883 break;
884 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
885 *pDataSize = sizeof(VkExtensionProperties);
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600886 if (pData == NULL) {
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600887 return VK_SUCCESS;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600888 }
889 if (extensionIndex >= MEM_TRACKER_LAYER_EXT_ARRAY_SIZE) {
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600890 return VK_ERROR_INVALID_VALUE;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600891 }
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600892 ext_props = (VkExtensionProperties *) pData;
893 ext_props->version = mtExts[extensionIndex].version;
894 strncpy(ext_props->extName, mtExts[extensionIndex].name,
895 VK_MAX_EXTENSION_NAME);
896 ext_props->extName[VK_MAX_EXTENSION_NAME - 1] = '\0';
897 break;
898 default:
899 return VK_ERROR_INVALID_VALUE;
900 };
901
902 return VK_SUCCESS;
903}
904
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600905VK_LAYER_EXPORT VkResult VKAPI vkEnumerateLayers(
906 VkPhysicalDevice gpu,
907 size_t maxStringSize,
908 size_t *pLayerCount,
909 char* const *pOutLayers,
910 void *pReserved)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700911{
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600912 if (gpu != NULL)
Jon Ashburnf7a08742014-11-25 11:08:42 -0700913 {
Jon Ashburn4d9f4652015-04-08 21:33:34 -0600914 pCurObj = (VkBaseLayerObject *) gpu;
Ian Elliott2d4ab1e2015-01-13 17:52:38 -0700915 loader_platform_thread_once(&g_initOnce, initMemTracker);
Courtney Goeltzenleuchterd9dc0c72015-04-20 11:04:54 -0600916 VkResult result = nextTable.EnumerateLayers(gpu,
917 maxStringSize, pLayerCount, pOutLayers, pReserved);
Jon Ashburnf7a08742014-11-25 11:08:42 -0700918 return result;
919 } else
920 {
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600921 if (pLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600922 return VK_ERROR_INVALID_POINTER;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600923 }
Jon Ashburnf7a08742014-11-25 11:08:42 -0700924 // This layer compatible with all GPUs
Courtney Goeltzenleuchterd9dc0c72015-04-20 11:04:54 -0600925 *pLayerCount = 1;
Chia-I Wu1da4b9f2014-12-16 10:47:33 +0800926 strncpy((char *) pOutLayers[0], "MemTracker", maxStringSize);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600927 return VK_SUCCESS;
Jon Ashburnf7a08742014-11-25 11:08:42 -0700928 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700929}
930
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600931VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue(
932 VkDevice device,
933 uint32_t queueNodeIndex,
934 uint32_t queueIndex,
935 VkQueue *pQueue)
Mark Lobodzinski748eddf2015-03-31 16:05:35 -0500936{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600937 VkResult result = nextTable.GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600938 if (result == VK_SUCCESS) {
Mark Lobodzinskied450b02015-04-07 13:38:21 -0500939 loader_platform_thread_lock_mutex(&globalLock);
940 addQueueInfo(*pQueue);
941 loader_platform_thread_unlock_mutex(&globalLock);
942 }
Mark Lobodzinski748eddf2015-03-31 16:05:35 -0500943 return result;
944}
945
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600946VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(
947 VkQueue queue,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600948 uint32_t cmdBufferCount,
949 const VkCmdBuffer *pCmdBuffers,
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600950 VkFence fence)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700951{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600952 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700953 // TODO : Need to track fence and clear mem references when fence clears
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500954 MT_CB_INFO* pCBInfo = NULL;
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500955 uint64_t fenceId = addFenceInfo(fence, queue);
Mark Lobodzinskied450b02015-04-07 13:38:21 -0500956
Tobin Ehlis6663f492014-11-10 12:29:12 -0700957 printMemList();
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500958 printCBList();
Tobin Ehlis6663f492014-11-10 12:29:12 -0700959 for (uint32_t i = 0; i < cmdBufferCount; i++) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500960 pCBInfo = getCBInfo(pCmdBuffers[i]);
961 pCBInfo->fenceId = fenceId;
Mike Stroyan950496e2015-05-19 15:16:08 -0600962 pCBInfo->lastSubmittedFence = fence;
963 pCBInfo->lastSubmittedQueue = queue;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700964 }
Mark Lobodzinskied450b02015-04-07 13:38:21 -0500965
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600966 loader_platform_thread_unlock_mutex(&globalLock);
Mike Stroyanf7a43bd2015-05-18 16:31:44 -0600967 VkResult result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, fence);
Courtney Goeltzenleuchterd3fb9552015-04-02 13:39:07 -0600968 return result;
969}
970
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600971VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory(
972 VkDevice device,
973 const VkMemoryAllocInfo *pAllocInfo,
974 VkDeviceMemory *pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700975{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600976 VkResult result = nextTable.AllocMemory(device, pAllocInfo, pMem);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700977 // TODO : Track allocations and overall size here
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600978 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500979 addMemObjInfo(*pMem, pAllocInfo);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700980 printMemList();
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600981 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700982 return result;
983}
984
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600985VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory(
986 VkDevice device,
987 VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700988{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600989 /* From spec : A memory object is freed by calling vkFreeMemory() when it is no longer needed. Before
Tobin Ehlisc0418f92014-11-25 14:47:20 -0700990 * freeing a memory object, an application must ensure the memory object is unbound from
991 * all API objects referencing it and that it is not referenced by any queued command buffers
992 */
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600993 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500994 bool32_t noerror = freeMemObjInfo(mem, false);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700995 printMemList();
996 printObjList();
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500997 printCBList();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500998 // Output an warning message for proper error/warning handling
999 if (noerror == VK_FALSE) {
1000 char str[1024];
1001 sprintf(str, "Freeing memory object while it still has references: mem obj %p", (void*)mem);
1002 layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREED_MEM_REF, "MEM", str);
1003 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001004 loader_platform_thread_unlock_mutex(&globalLock);
Mike Stroyanb050c682015-04-17 12:36:38 -06001005 VkResult result = nextTable.FreeMemory(device, mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001006 return result;
1007}
1008
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001009VK_LAYER_EXPORT VkResult VKAPI vkSetMemoryPriority(
1010 VkDevice device,
1011 VkDeviceMemory mem,
1012 VkMemoryPriority priority)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001013{
1014 // TODO : Update tracking for this alloc
1015 // Make sure memory is not pinned, which can't have priority set
Mike Stroyanb050c682015-04-17 12:36:38 -06001016 VkResult result = nextTable.SetMemoryPriority(device, mem, priority);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001017 return result;
1018}
1019
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001020VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(
1021 VkDevice device,
1022 VkDeviceMemory mem,
1023 VkDeviceSize offset,
1024 VkDeviceSize size,
1025 VkFlags flags,
1026 void **ppData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001027{
1028 // TODO : Track when memory is mapped
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001029 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001030 MT_MEM_OBJ_INFO *pMemObj = getMemObjInfo(mem);
Tony Barbourd1c35722015-04-16 15:59:00 -06001031 if ((pMemObj->allocInfo.memProps & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0) {
Mark Lobodzinski95152dc2015-02-25 12:16:04 -06001032 char str[1024];
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001033 sprintf(str, "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set: mem obj %p", (void*)mem);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001034 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_STATE, "MEM", str);
Mark Lobodzinski95152dc2015-02-25 12:16:04 -06001035 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001036 loader_platform_thread_unlock_mutex(&globalLock);
Mike Stroyanb050c682015-04-17 12:36:38 -06001037 VkResult result = nextTable.MapMemory(device, mem, offset, size, flags, ppData);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001038 return result;
1039}
1040
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001041VK_LAYER_EXPORT VkResult VKAPI vkUnmapMemory(
1042 VkDevice device,
1043 VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001044{
1045 // TODO : Track as memory gets unmapped, do we want to check what changed following map?
1046 // Make sure that memory was ever mapped to begin with
Mike Stroyanb050c682015-04-17 12:36:38 -06001047 VkResult result = nextTable.UnmapMemory(device, mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001048 return result;
1049}
1050
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001051VK_LAYER_EXPORT VkResult VKAPI vkPinSystemMemory(
1052 VkDevice device,
1053 const void *pSysMem,
1054 size_t memSize,
1055 VkDeviceMemory *pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001056{
1057 // TODO : Track this
1058 // Verify that memory is actually pinnable
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001059 VkResult result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001060 return result;
1061}
1062
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001063VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedMemory(
1064 VkDevice device,
1065 const VkMemoryOpenInfo *pOpenInfo,
1066 VkDeviceMemory *pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001067{
1068 // TODO : Track this
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001069 VkResult result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001070 return result;
1071}
1072
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001073VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerMemory(
1074 VkDevice device,
1075 const VkPeerMemoryOpenInfo *pOpenInfo,
1076 VkDeviceMemory *pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001077{
1078 // TODO : Track this
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001079 VkResult result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001080 return result;
1081}
1082
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001083VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerImage(
1084 VkDevice device,
1085 const VkPeerImageOpenInfo *pOpenInfo,
1086 VkImage *pImage,
1087 VkDeviceMemory *pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001088{
1089 // TODO : Track this
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001090 VkResult result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001091 return result;
1092}
1093
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001094VK_LAYER_EXPORT VkResult VKAPI vkDestroyObject(
1095 VkDevice device,
1096 VkObjectType objType,
1097 VkObject object)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001098{
Mike Stroyan950496e2015-05-19 15:16:08 -06001099 unordered_map<VkObject, MT_OBJ_INFO*>::iterator item;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001100 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001101
Mike Stroyan950496e2015-05-19 15:16:08 -06001102 // First check if this is a CmdBuffer or fence
1103 switch (objType) {
1104 case VK_OBJECT_TYPE_COMMAND_BUFFER:
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001105 deleteCBInfo((VkCmdBuffer)object);
Mike Stroyan950496e2015-05-19 15:16:08 -06001106 break;
1107 case VK_OBJECT_TYPE_FENCE:
1108 deleteFenceInfo((VkFence)object);
1109 break;
1110 default:
1111 break;
Tobin Ehlisa98df732014-11-27 07:52:04 -07001112 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001113
Mike Stroyan950496e2015-05-19 15:16:08 -06001114 if ((item = objectMap.find(object)) != objectMap.end()) {
1115 MT_OBJ_INFO* pDelInfo = (*item).second;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001116 if (pDelInfo->pMemObjInfo) {
Tobin Ehlisa98df732014-11-27 07:52:04 -07001117 // Wsi allocated Memory is tied to image object so clear the binding and free that memory automatically
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001118 if (0 == pDelInfo->pMemObjInfo->allocInfo.allocationSize) { // Wsi allocated memory has NULL allocInfo w/ 0 size
Tony Barbourd1c35722015-04-16 15:59:00 -06001119 VkDeviceMemory memToFree = pDelInfo->pMemObjInfo->mem;
Tobin Ehlisa98df732014-11-27 07:52:04 -07001120 clearObjectBinding(object);
Courtney Goeltzenleuchter1c943a72015-03-26 16:15:39 -06001121 freeMemObjInfo(memToFree, true);
1122 }
1123 else {
Mike Stroyan950496e2015-05-19 15:16:08 -06001124 #if 0
Tobin Ehlisa98df732014-11-27 07:52:04 -07001125 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001126 sprintf(str, "Destroying obj %p that is still bound to memory object %p\nYou should first clear binding "
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001127 "by calling vkBindObjectMemory(queue, %p, 0, VK_NULL_HANDLE, 0)",
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001128 object, (void*)pDelInfo->pMemObjInfo->mem, object);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001129 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_DESTROY_OBJECT_ERROR, "MEM", str);
Mike Stroyan950496e2015-05-19 15:16:08 -06001130 #endif
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001131 // From the spec : If an object has previous memory binding, it is required to unbind memory
1132 // from an API object before it is destroyed.
Tobin Ehlisa98df732014-11-27 07:52:04 -07001133 clearObjectBinding(object);
1134 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001135 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001136 delete pDelInfo;
Mike Stroyan950496e2015-05-19 15:16:08 -06001137 objectMap.erase(item);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001138 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001139
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001140 loader_platform_thread_unlock_mutex(&globalLock);
Mike Stroyanb050c682015-04-17 12:36:38 -06001141 VkResult result = nextTable.DestroyObject(device, objType, object);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001142 return result;
1143}
1144
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001145VK_LAYER_EXPORT VkResult VKAPI vkGetObjectInfo(
1146 VkDevice device,
1147 VkObjectType objType,
1148 VkObject object,
1149 VkObjectInfoType infoType,
1150 size_t *pDataSize,
1151 void *pData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001152{
1153 // TODO : What to track here?
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001154 // Could potentially save returned mem requirements and validate values passed into BindObjectMemory for this object
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001155 // From spec : The only objects that are guaranteed to have no external memory requirements are devices, queues,
1156 // command buffers, shaders and memory objects.
Mike Stroyanb050c682015-04-17 12:36:38 -06001157 VkResult result = nextTable.GetObjectInfo(device, objType, object, infoType, pDataSize, pData);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001158 return result;
1159}
1160
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001161VK_LAYER_EXPORT VkResult VKAPI vkBindObjectMemory(
1162 VkDevice device,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001163 VkObjectType objType,
1164 VkObject object,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001165 VkDeviceMemory mem,
1166 VkDeviceSize offset)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001167{
Mark Lobodzinski23065352015-05-29 09:32:35 -05001168 VkResult result = nextTable.BindObjectMemory(device, objType, object, mem, offset);
Mike Stroyanb050c682015-04-17 12:36:38 -06001169 loader_platform_thread_lock_mutex(&globalLock);
1170 // Track objects tied to memory
1171 if (VK_FALSE == updateObjectBinding(object, mem)) {
1172 char str[1024];
1173 sprintf(str, "Unable to set object %p binding to mem obj %p", (void*)object, (void*)mem);
1174 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1175 }
1176 printObjList();
1177 printMemList();
1178 loader_platform_thread_unlock_mutex(&globalLock);
1179 return result;
1180}
1181
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001182VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001183 VkQueue queue,
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001184 VkBuffer buffer,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001185 VkDeviceSize rangeOffset,
1186 VkDeviceSize rangeSize,
1187 VkDeviceMemory mem,
1188 VkDeviceSize memOffset)
Mike Stroyanb050c682015-04-17 12:36:38 -06001189{
Mark Lobodzinski23065352015-05-29 09:32:35 -05001190 VkResult result = nextTable.QueueBindSparseBufferMemory(queue, buffer, rangeOffset, rangeSize, mem, memOffset);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001191 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001192 // Track objects tied to memory
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001193 if (VK_FALSE == updateObjectBinding(buffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001194 char str[1024];
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001195 sprintf(str, "Unable to set object %p binding to mem obj %p", (void*)buffer, (void*)mem);
1196 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, buffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001197 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001198 printObjList();
1199 printMemList();
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001200 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001201 return result;
1202}
1203
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001204VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(
1205 VkDevice device,
1206 const VkFenceCreateInfo *pCreateInfo,
1207 VkFence *pFence)
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001208{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001209 VkResult result = nextTable.CreateFence(device, pCreateInfo, pFence);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001210 if (VK_SUCCESS == result) {
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001211 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001212 addObjectInfo(*pFence, pCreateInfo->sType, pCreateInfo, sizeof(VkFenceCreateInfo), "fence");
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001213 loader_platform_thread_unlock_mutex(&globalLock);
1214 }
1215 return result;
1216}
1217
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001218VK_LAYER_EXPORT VkResult VKAPI vkResetFences(
1219 VkDevice device,
1220 uint32_t fenceCount,
1221 VkFence *pFences)
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001222{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001223 VkResult result = nextTable.ResetFences(device, fenceCount, pFences);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001224 if (VK_SUCCESS == result) {
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001225 loader_platform_thread_lock_mutex(&globalLock);
1226 // Reset fence state in fenceCreateInfo structure
1227 for (uint32_t i = 0; i < fenceCount; i++) {
1228 MT_OBJ_INFO* pObjectInfo = getObjectInfo(pFences[i]);
1229 if (pObjectInfo != NULL) {
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -05001230 // Validate fences in SIGNALED state
Tobin Ehlisb870cbb2015-04-15 07:46:12 -06001231 if (!(pObjectInfo->create_info.fence_create_info.flags & VK_FENCE_CREATE_SIGNALED_BIT)) {
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -05001232 char str[1024];
Mark Lobodzinskib2689212015-04-14 14:09:32 -05001233 sprintf(str, "Fence %p submitted to VkResetFences in UNSIGNALED STATE", pFences[i]);
Tobin Ehlisb870cbb2015-04-15 07:46:12 -06001234 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, pFences[i], 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", str);
1235 result = VK_ERROR_INVALID_VALUE;
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -05001236 }
1237 else {
1238 pObjectInfo->create_info.fence_create_info.flags =
Tobin Ehlisb870cbb2015-04-15 07:46:12 -06001239 static_cast<VkFenceCreateFlags>(pObjectInfo->create_info.fence_create_info.flags & ~VK_FENCE_CREATE_SIGNALED_BIT);
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -05001240 }
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001241 }
1242 }
1243 loader_platform_thread_unlock_mutex(&globalLock);
1244 }
1245 return result;
1246}
1247
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001248VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(
1249 VkDevice device,
1250 VkFence fence)
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001251{
Mike Stroyanb050c682015-04-17 12:36:38 -06001252 VkResult result = nextTable.GetFenceStatus(device, fence);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001253 if (VK_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001254 loader_platform_thread_lock_mutex(&globalLock);
1255 updateFenceTracking(fence);
1256 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001257 }
1258 return result;
1259}
1260
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001261VK_LAYER_EXPORT VkResult VKAPI vkWaitForFences(
1262 VkDevice device,
1263 uint32_t fenceCount,
1264 const VkFence *pFences,
1265 bool32_t waitAll,
1266 uint64_t timeout)
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001267{
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001268 // Verify fence status of submitted fences
1269 for(uint32_t i = 0; i < fenceCount; i++) {
1270 MT_OBJ_INFO* pObjectInfo = getObjectInfo(pFences[i]);
1271 if (pObjectInfo != NULL) {
Tobin Ehlisb870cbb2015-04-15 07:46:12 -06001272 if (pObjectInfo->create_info.fence_create_info.flags & VK_FENCE_CREATE_SIGNALED_BIT) {
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001273 char str[1024];
Mark Lobodzinskib2689212015-04-14 14:09:32 -05001274 sprintf(str, "VkWaitForFences specified fence %p already in SIGNALED state.", pFences[i]);
Tobin Ehlisb870cbb2015-04-15 07:46:12 -06001275 layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, pFences[i], 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", str);
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001276 }
1277 }
1278 }
1279
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001280 VkResult result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001281 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski50932972015-04-02 20:49:09 -05001282
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001283 if (VK_SUCCESS == result) {
Mark Lobodzinski50932972015-04-02 20:49:09 -05001284 if (waitAll || fenceCount == 1) { // Clear all the fences
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001285 for(uint32_t i = 0; i < fenceCount; i++) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001286 updateFenceTracking(pFences[i]);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001287 }
1288 }
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001289 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001290 loader_platform_thread_unlock_mutex(&globalLock);
1291 return result;
1292}
1293
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001294VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(
1295 VkQueue queue)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001296{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001297 VkResult result = nextTable.QueueWaitIdle(queue);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001298 if (VK_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001299 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski223ca202015-04-02 08:52:53 -05001300 retireQueueFences(queue);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001301 loader_platform_thread_unlock_mutex(&globalLock);
1302 }
1303 return result;
1304}
1305
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001306VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle(
1307 VkDevice device)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001308{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001309 VkResult result = nextTable.DeviceWaitIdle(device);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001310 if (VK_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001311 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski50932972015-04-02 20:49:09 -05001312 retireDeviceFences(device);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001313 loader_platform_thread_unlock_mutex(&globalLock);
1314 }
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001315 return result;
1316}
1317
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001318VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(
1319 VkDevice device,
1320 const VkEventCreateInfo *pCreateInfo,
1321 VkEvent *pEvent)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001322{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001323 VkResult result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001324 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001325 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001326 addObjectInfo(*pEvent, pCreateInfo->sType, pCreateInfo, sizeof(VkEventCreateInfo), "event");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001327 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001328 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001329 return result;
1330}
1331
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001332VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(
1333 VkDevice device,
1334 const VkQueryPoolCreateInfo *pCreateInfo,
1335 VkQueryPool *pQueryPool)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001336{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001337 VkResult result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001338 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001339 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001340 addObjectInfo(*pQueryPool, pCreateInfo->sType, pCreateInfo, sizeof(VkQueryPoolCreateInfo), "query_pool");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001341 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001342 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001343 return result;
1344}
1345
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001346VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(
1347 VkDevice device,
1348 const VkBufferCreateInfo *pCreateInfo,
1349 VkBuffer *pBuffer)
Tobin Ehlis7265e832015-01-19 08:42:29 -07001350{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001351 VkResult result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001352 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001353 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -06001354 addObjectInfo(*pBuffer, pCreateInfo->sType, pCreateInfo, sizeof(VkBufferCreateInfo), "buffer");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001355 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001356 }
Tobin Ehlis7265e832015-01-19 08:42:29 -07001357 return result;
1358}
1359
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001360VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(
1361 VkDevice device,
1362 const VkBufferViewCreateInfo *pCreateInfo,
1363 VkBufferView *pView)
Tobin Ehlis7265e832015-01-19 08:42:29 -07001364{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001365 VkResult result = nextTable.CreateBufferView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001366 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001367 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -06001368 addObjectInfo(*pView, pCreateInfo->sType, pCreateInfo, sizeof(VkBufferViewCreateInfo), "buffer_view");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001369 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001370 }
Tobin Ehlis7265e832015-01-19 08:42:29 -07001371 return result;
1372}
1373
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001374VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(
1375 VkDevice device,
1376 const VkImageCreateInfo *pCreateInfo,
1377 VkImage *pImage)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001378{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001379 VkResult result = nextTable.CreateImage(device, pCreateInfo, pImage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001380 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001381 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001382 addObjectInfo(*pImage, pCreateInfo->sType, pCreateInfo, sizeof(VkImageCreateInfo), "image");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001383 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001384 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001385 return result;
1386}
1387
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001388VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(
1389 VkDevice device,
1390 const VkImageViewCreateInfo *pCreateInfo,
1391 VkImageView *pView)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001392{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001393 VkResult result = nextTable.CreateImageView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001394 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001395 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001396 addObjectInfo(*pView, pCreateInfo->sType, pCreateInfo, sizeof(VkImageViewCreateInfo), "image_view");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001397 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001398 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001399 return result;
1400}
1401
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001402VK_LAYER_EXPORT VkResult VKAPI vkCreateColorAttachmentView(
1403 VkDevice device,
1404 const VkColorAttachmentViewCreateInfo *pCreateInfo,
1405 VkColorAttachmentView *pView)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001406{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001407 VkResult result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001408 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001409 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001410 addObjectInfo(*pView, pCreateInfo->sType, pCreateInfo, sizeof(VkColorAttachmentViewCreateInfo), "color_attachment_view");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001411 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001412 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001413 return result;
1414}
1415
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001416VK_LAYER_EXPORT VkResult VKAPI vkCreateDepthStencilView(
1417 VkDevice device,
1418 const VkDepthStencilViewCreateInfo *pCreateInfo,
1419 VkDepthStencilView *pView)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001420{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001421 VkResult result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001422 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001423 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001424 addObjectInfo(*pView, pCreateInfo->sType, pCreateInfo, sizeof(VkDepthStencilViewCreateInfo), "ds_view");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001425 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001426 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001427 return result;
1428}
1429
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001430VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(
1431 VkDevice device,
1432 const VkShaderCreateInfo *pCreateInfo,
1433 VkShader *pShader)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001434{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001435 VkResult result = nextTable.CreateShader(device, pCreateInfo, pShader);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001436 return result;
1437}
1438
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001439VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(
1440 VkDevice device,
1441 const VkGraphicsPipelineCreateInfo *pCreateInfo,
1442 VkPipeline *pPipeline)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001443{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001444 VkResult result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001445 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001446 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001447 addObjectInfo(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(VkGraphicsPipelineCreateInfo), "graphics_pipeline");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001448 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001449 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001450 return result;
1451}
1452
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001453VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelineDerivative(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001454 VkDevice device,
1455 const VkGraphicsPipelineCreateInfo *pCreateInfo,
1456 VkPipeline basePipeline,
1457 VkPipeline *pPipeline)
Courtney Goeltzenleuchter0d40f152015-03-25 15:37:49 -06001458{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001459 VkResult result = nextTable.CreateGraphicsPipelineDerivative(device, pCreateInfo, basePipeline, pPipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001460 if (result == VK_SUCCESS) {
Courtney Goeltzenleuchter0d40f152015-03-25 15:37:49 -06001461 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001462 addObjectInfo(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(VkGraphicsPipelineCreateInfo), "graphics_pipeline");
Courtney Goeltzenleuchter0d40f152015-03-25 15:37:49 -06001463 loader_platform_thread_unlock_mutex(&globalLock);
1464 }
1465 return result;
1466}
1467
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001468VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipeline(
1469 VkDevice device,
1470 const VkComputePipelineCreateInfo *pCreateInfo,
1471 VkPipeline *pPipeline)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001472{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001473 VkResult result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001474 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001475 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001476 addObjectInfo(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(VkComputePipelineCreateInfo), "compute_pipeline");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001477 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001478 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001479 return result;
1480}
1481
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001482VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(
1483 VkDevice device,
1484 const VkSamplerCreateInfo *pCreateInfo,
1485 VkSampler *pSampler)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001486{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001487 VkResult result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001488 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001489 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001490 addObjectInfo(*pSampler, pCreateInfo->sType, pCreateInfo, sizeof(VkSamplerCreateInfo), "sampler");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001491 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001492 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001493 return result;
1494}
1495
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001496VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(
1497 VkDevice device,
1498 const VkDynamicVpStateCreateInfo *pCreateInfo,
1499 VkDynamicVpState *pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001500{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001501 VkResult result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001502 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001503 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001504 addObjectInfo(*pState, pCreateInfo->sType, pCreateInfo, sizeof(VkDynamicVpStateCreateInfo), "viewport_state");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001505 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001506 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001507 return result;
1508}
1509
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001510VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterState(
1511 VkDevice device,
1512 const VkDynamicRsStateCreateInfo *pCreateInfo,
1513 VkDynamicRsState *pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001514{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001515 VkResult result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001516 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001517 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001518 addObjectInfo(*pState, pCreateInfo->sType, pCreateInfo, sizeof(VkDynamicRsStateCreateInfo), "raster_state");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001519 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001520 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001521 return result;
1522}
1523
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001524VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState(
1525 VkDevice device,
1526 const VkDynamicCbStateCreateInfo *pCreateInfo,
1527 VkDynamicCbState *pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001528{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001529 VkResult result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001530 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001531 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001532 addObjectInfo(*pState, pCreateInfo->sType, pCreateInfo, sizeof(VkDynamicCbStateCreateInfo), "cb_state");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001533 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001534 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001535 return result;
1536}
1537
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001538VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState(
1539 VkDevice device,
1540 const VkDynamicDsStateCreateInfo *pCreateInfo,
1541 VkDynamicDsState *pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001542{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001543 VkResult result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001544 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001545 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001546 addObjectInfo(*pState, pCreateInfo->sType, pCreateInfo, sizeof(VkDynamicDsStateCreateInfo), "ds_state");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001547 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001548 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001549 return result;
1550}
1551
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001552VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(
1553 VkDevice device,
1554 const VkCmdBufferCreateInfo *pCreateInfo,
1555 VkCmdBuffer *pCmdBuffer)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001556{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001557 VkResult result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Mark Lobodzinski223ca202015-04-02 08:52:53 -05001558 // At time of cmd buffer creation, create global cmd buffer info for the returned cmd buffer
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001559 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001560 if (*pCmdBuffer)
Mark Lobodzinski223ca202015-04-02 08:52:53 -05001561 addCBInfo(*pCmdBuffer);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001562 printCBList();
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001563 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001564 return result;
1565}
1566
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001567VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(
1568 VkCmdBuffer cmdBuffer,
1569 const VkCmdBufferBeginInfo *pBeginInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001570{
Mike Stroyan950496e2015-05-19 15:16:08 -06001571 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001572 // This implicitly resets the Cmd Buffer so make sure any fence is done and then clear memory references
Mike Stroyan950496e2015-05-19 15:16:08 -06001573 if (!checkCBCompleted(cmdBuffer)) {
1574 char str[1024];
1575 sprintf(str, "Calling vkBeginCommandBuffer() on active CB %p before it has completed. "
1576 "You must check CB flag before this call.", cmdBuffer);
1577 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_RESET_CB_WHILE_IN_FLIGHT, "MEM", str);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001578 }
Mike Stroyan950496e2015-05-19 15:16:08 -06001579 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001580 VkResult result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001581 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001582 freeCBBindings(cmdBuffer);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001583 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001584 return result;
1585}
1586
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001587VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(
1588 VkCmdBuffer cmdBuffer)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001589{
1590 // TODO : Anything to do here?
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001591 VkResult result = nextTable.EndCommandBuffer(cmdBuffer);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001592 return result;
1593}
1594
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001595VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(
1596 VkCmdBuffer cmdBuffer)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001597{
Mike Stroyan950496e2015-05-19 15:16:08 -06001598 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001599 // Verify that CB is complete (not in-flight)
Mike Stroyan950496e2015-05-19 15:16:08 -06001600 if (!checkCBCompleted(cmdBuffer)) {
1601 char str[1024];
1602 sprintf(str, "Resetting CB %p before it has completed. You must check CB flag before "
1603 "calling vkResetCommandBuffer().", cmdBuffer);
1604 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_RESET_CB_WHILE_IN_FLIGHT, "MEM", str);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001605 }
1606 // Clear memory references as this point.
Tobin Ehlis6663f492014-11-10 12:29:12 -07001607 freeCBBindings(cmdBuffer);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001608 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001609 VkResult result = nextTable.ResetCommandBuffer(cmdBuffer);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001610 return result;
1611}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001612// TODO : For any vkCmdBind* calls that include an object which has mem bound to it,
Tobin Ehlis6663f492014-11-10 12:29:12 -07001613// need to account for that mem now having binding to given cmdBuffer
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001614VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(
1615 VkCmdBuffer cmdBuffer,
1616 VkPipelineBindPoint pipelineBindPoint,
1617 VkPipeline pipeline)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001618{
Tobin Ehlisc145be82015-01-08 15:22:32 -07001619#if 0
1620 // TODO : If memory bound to pipeline, then need to tie that mem to cmdBuffer
1621 if (getPipeline(pipeline)) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001622 MT_CB_INFO *pCBInfo = getCBInfo(cmdBuffer);
1623 if (pCBInfo) {
1624 pCBInfo->pipelines[pipelineBindPoint] = pipeline;
Tobin Ehlisc145be82015-01-08 15:22:32 -07001625 } else {
1626 char str[1024];
1627 sprintf(str, "Attempt to bind Pipeline %p to non-existant command buffer %p!", (void*)pipeline, cmdBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001628 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, (char *) "DS", (char *) str);
Tobin Ehlisc145be82015-01-08 15:22:32 -07001629 }
1630 }
1631 else {
1632 char str[1024];
1633 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001634 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, pipeline, 0, MEMTRACK_INVALID_OBJECT, (char *) "DS", (char *) str);
Tobin Ehlisc145be82015-01-08 15:22:32 -07001635 }
1636#endif
Tobin Ehlis6663f492014-11-10 12:29:12 -07001637 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1638}
1639
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001640VK_LAYER_EXPORT void VKAPI vkCmdBindDynamicStateObject(
1641 VkCmdBuffer cmdBuffer,
1642 VkStateBindPoint stateBindPoint,
1643 VkDynamicStateObject state)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001644{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001645 MT_OBJ_INFO *pObjInfo;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001646 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001647 MT_CB_INFO *pCmdBuf = getCBInfo(cmdBuffer);
Tobin Ehlisc145be82015-01-08 15:22:32 -07001648 if (!pCmdBuf) {
1649 char str[1024];
1650 sprintf(str, "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001651 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, "DD", str);
Tobin Ehlisc145be82015-01-08 15:22:32 -07001652 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001653 pObjInfo = getObjectInfo(state);
1654 if (!pObjInfo) {
Tobin Ehlisc145be82015-01-08 15:22:32 -07001655 char str[1024];
1656 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001657 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, state, 0, MEMTRACK_INVALID_OBJECT, "DD", str);
Tobin Ehlisc145be82015-01-08 15:22:32 -07001658 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001659 pCmdBuf->pDynamicState[stateBindPoint] = pObjInfo;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001660 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001661 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001662}
1663
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001664VK_LAYER_EXPORT void VKAPI vkCmdBindDescriptorSets(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001665 VkCmdBuffer cmdBuffer,
1666 VkPipelineBindPoint pipelineBindPoint,
1667 uint32_t firstSet,
1668 uint32_t setCount,
1669 const VkDescriptorSet *pDescriptorSets,
1670 uint32_t dynamicOffsetCount,
1671 const uint32_t *pDynamicOffsets)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001672{
Tobin Ehlisc145be82015-01-08 15:22:32 -07001673 // TODO : Somewhere need to verify that all textures referenced by shaders in DS are in some type of *SHADER_READ* state
Cody Northropd4c1a502015-04-16 13:41:56 -06001674 nextTable.CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001675}
1676
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06001677VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001678 VkCmdBuffer cmdBuffer,
1679 uint32_t startBinding,
1680 uint32_t bindingCount,
1681 const VkBuffer *pBuffers,
1682 const VkDeviceSize *pOffsets)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001683{
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06001684 nextTable.CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Chia-I Wu19156822015-01-05 13:42:56 +08001685}
1686
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001687VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(
1688 VkCmdBuffer cmdBuffer,
1689 VkBuffer buffer,
1690 VkDeviceSize offset,
1691 VkIndexType indexType)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001692{
Tobin Ehlis7265e832015-01-19 08:42:29 -07001693 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001694}
1695
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001696VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(
1697 VkCmdBuffer cmdBuffer,
1698 VkBuffer buffer,
1699 VkDeviceSize offset,
1700 uint32_t count,
1701 uint32_t stride)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001702{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001703 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001704 VkDeviceMemory mem = getMemBindingFromObject(buffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001705 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001706 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001707 sprintf(str, "In vkCmdDrawIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
1708 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001709 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001710 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001711 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001712}
1713
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001714VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(
1715 VkCmdBuffer cmdBuffer,
1716 VkBuffer buffer,
1717 VkDeviceSize offset,
1718 uint32_t count,
1719 uint32_t stride)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001720{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001721 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001722 VkDeviceMemory mem = getMemBindingFromObject(buffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001723 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001724 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001725 sprintf(str, "In vkCmdDrawIndexedIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
1726 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001727 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001728 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001729 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001730}
1731
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001732VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(
1733 VkCmdBuffer cmdBuffer,
1734 VkBuffer buffer,
1735 VkDeviceSize offset)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001736{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001737 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001738 VkDeviceMemory mem = getMemBindingFromObject(buffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001739 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001740 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001741 sprintf(str, "In vkCmdDispatchIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
1742 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001743 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001744 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001745 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001746}
1747
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001748VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(
1749 VkCmdBuffer cmdBuffer,
1750 VkBuffer srcBuffer,
1751 VkBuffer destBuffer,
1752 uint32_t regionCount,
1753 const VkBufferCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001754{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001755 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001756 VkDeviceMemory mem = getMemBindingFromObject(srcBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001757 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001758 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001759 sprintf(str, "In vkCmdCopyBuffer() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer);
1760 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001761 }
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001762 mem = getMemBindingFromObject(destBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001763 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001764 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001765 sprintf(str, "In vkCmdCopyBuffer() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
1766 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001767 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001768 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001769 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001770}
1771
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001772VK_LAYER_EXPORT void VKAPI vkCmdCopyImage(
1773 VkCmdBuffer cmdBuffer,
1774 VkImage srcImage,
1775 VkImageLayout srcImageLayout,
1776 VkImage destImage,
1777 VkImageLayout destImageLayout,
1778 uint32_t regionCount,
1779 const VkImageCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001780{
1781 // TODO : Each image will have mem mapping so track them
Courtney Goeltzenleuchterb3efe9b2015-03-25 11:25:10 -06001782 nextTable.CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001783}
1784
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001785VK_LAYER_EXPORT void VKAPI vkCmdBlitImage(
1786 VkCmdBuffer cmdBuffer,
1787 VkImage srcImage,
1788 VkImageLayout srcImageLayout,
1789 VkImage destImage,
1790 VkImageLayout destImageLayout,
1791 uint32_t regionCount,
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05001792 const VkImageBlit *pRegions,
1793 VkTexFilter filter)
Courtney Goeltzenleuchter89299fa2015-03-08 17:02:18 -06001794{
1795 // TODO : Each image will have mem mapping so track them
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05001796 nextTable.CmdBlitImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter);
Courtney Goeltzenleuchter89299fa2015-03-08 17:02:18 -06001797}
1798
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001799VK_LAYER_EXPORT void VKAPI vkCmdCopyBufferToImage(
1800 VkCmdBuffer cmdBuffer,
1801 VkBuffer srcBuffer,
1802 VkImage destImage,
1803 VkImageLayout destImageLayout,
1804 uint32_t regionCount,
1805 const VkBufferImageCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001806{
1807 // TODO : Track this
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001808 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001809 VkDeviceMemory mem = getMemBindingFromObject(destImage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001810 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001811 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001812 sprintf(str, "In vkCmdCopyMemoryToImage() call unable to update binding of destImage buffer %p to cmdBuffer %p", destImage, cmdBuffer);
1813 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001814 }
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001815
1816 mem = getMemBindingFromObject(srcBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001817 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001818 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001819 sprintf(str, "In vkCmdCopyMemoryToImage() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer);
1820 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001821 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001822 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterb3efe9b2015-03-25 11:25:10 -06001823 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001824}
1825
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001826VK_LAYER_EXPORT void VKAPI vkCmdCopyImageToBuffer(
1827 VkCmdBuffer cmdBuffer,
1828 VkImage srcImage,
1829 VkImageLayout srcImageLayout,
1830 VkBuffer destBuffer,
1831 uint32_t regionCount,
1832 const VkBufferImageCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001833{
1834 // TODO : Track this
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001835 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001836 VkDeviceMemory mem = getMemBindingFromObject(srcImage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001837 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001838 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001839 sprintf(str, "In vkCmdCopyImageToMemory() call unable to update binding of srcImage buffer %p to cmdBuffer %p", srcImage, cmdBuffer);
1840 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001841 }
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001842 mem = getMemBindingFromObject(destBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001843 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001844 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001845 sprintf(str, "In vkCmdCopyImageToMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
1846 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001847 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001848 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterb3efe9b2015-03-25 11:25:10 -06001849 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001850}
1851
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001852VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(
1853 VkCmdBuffer cmdBuffer,
1854 VkBuffer destBuffer,
1855 VkDeviceSize destOffset,
1856 VkDeviceSize dataSize,
1857 const uint32_t *pData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001858{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001859 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001860 VkDeviceMemory mem = getMemBindingFromObject(destBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001861 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001862 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001863 sprintf(str, "In vkCmdUpdateMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
1864 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001865 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001866 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001867 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001868}
1869
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001870VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(
1871 VkCmdBuffer cmdBuffer,
1872 VkBuffer destBuffer,
1873 VkDeviceSize destOffset,
1874 VkDeviceSize fillSize,
1875 uint32_t data)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001876{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001877 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001878 VkDeviceMemory mem = getMemBindingFromObject(destBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001879 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001880 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001881 sprintf(str, "In vkCmdFillMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
1882 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001883 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001884 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001885 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001886}
1887
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001888VK_LAYER_EXPORT void VKAPI vkCmdClearColorImage(
1889 VkCmdBuffer cmdBuffer,
1890 VkImage image,
1891 VkImageLayout imageLayout,
Courtney Goeltzenleuchterd7a5cff2015-04-23 17:49:22 -06001892 const VkClearColor *pColor,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001893 uint32_t rangeCount,
1894 const VkImageSubresourceRange *pRanges)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001895{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001896 // TODO : Verify memory is in VK_IMAGE_STATE_CLEAR state
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001897 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001898 VkDeviceMemory mem = getMemBindingFromObject(image);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001899 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001900 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001901 sprintf(str, "In vkCmdClearColorImage() call unable to update binding of image buffer %p to cmdBuffer %p", image, cmdBuffer);
1902 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001903 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001904 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterd7a5cff2015-04-23 17:49:22 -06001905 nextTable.CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001906}
1907
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001908VK_LAYER_EXPORT void VKAPI vkCmdClearDepthStencil(
1909 VkCmdBuffer cmdBuffer,
1910 VkImage image,
1911 VkImageLayout imageLayout,
1912 float depth,
1913 uint32_t stencil,
1914 uint32_t rangeCount,
1915 const VkImageSubresourceRange *pRanges)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001916{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001917 // TODO : Verify memory is in VK_IMAGE_STATE_CLEAR state
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001918 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001919 VkDeviceMemory mem = getMemBindingFromObject(image);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001920 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001921 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001922 sprintf(str, "In vkCmdClearDepthStencil() call unable to update binding of image buffer %p to cmdBuffer %p", image, cmdBuffer);
1923 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001924 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001925 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterb3efe9b2015-03-25 11:25:10 -06001926 nextTable.CmdClearDepthStencil(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001927}
1928
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001929VK_LAYER_EXPORT void VKAPI vkCmdResolveImage(
1930 VkCmdBuffer cmdBuffer,
1931 VkImage srcImage,
1932 VkImageLayout srcImageLayout,
1933 VkImage destImage,
1934 VkImageLayout destImageLayout,
1935 uint32_t regionCount,
1936 const VkImageResolve *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001937{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001938 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001939 VkDeviceMemory mem = getMemBindingFromObject(srcImage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001940 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001941 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001942 sprintf(str, "In vkCmdResolveImage() call unable to update binding of srcImage buffer %p to cmdBuffer %p", srcImage, cmdBuffer);
1943 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001944 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001945 mem = getMemBindingFromObject(destImage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001946 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001947 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001948 sprintf(str, "In vkCmdResolveImage() call unable to update binding of destImage buffer %p to cmdBuffer %p", destImage, cmdBuffer);
1949 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001950 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001951 loader_platform_thread_unlock_mutex(&globalLock);
Tony Barbour6865d4a2015-04-13 15:02:52 -06001952 nextTable.CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001953}
1954
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001955VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(
1956 VkCmdBuffer cmdBuffer,
1957 VkQueryPool queryPool,
1958 uint32_t slot,
1959 VkFlags flags)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001960{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001961 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001962 VkDeviceMemory mem = getMemBindingFromObject(queryPool);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001963 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001964 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001965 sprintf(str, "In vkCmdBeginQuery() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer);
1966 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001967 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001968 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001969 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
1970}
1971
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001972VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(
1973 VkCmdBuffer cmdBuffer,
1974 VkQueryPool queryPool,
1975 uint32_t slot)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001976{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001977 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001978 VkDeviceMemory mem = getMemBindingFromObject(queryPool);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001979 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001980 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001981 sprintf(str, "In vkCmdEndQuery() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer);
1982 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001983 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001984 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001985 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
1986}
1987
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001988VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(
1989 VkCmdBuffer cmdBuffer,
1990 VkQueryPool queryPool,
1991 uint32_t startQuery,
1992 uint32_t queryCount)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001993{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001994 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001995 VkDeviceMemory mem = getMemBindingFromObject(queryPool);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001996 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001997 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001998 sprintf(str, "In vkCmdResetQueryPool() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer);
1999 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002000 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002001 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002002 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
2003}
2004
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002005VK_LAYER_EXPORT VkResult VKAPI vkDbgRegisterMsgCallback(
2006 VkInstance instance,
2007 VK_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback,
2008 void *pUserData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002009{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002010 // This layer intercepts callbacks
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002011 VK_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (VK_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(VK_LAYER_DBG_FUNCTION_NODE));
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002012 if (!pNewDbgFuncNode)
Tony Barbourd1c35722015-04-16 15:59:00 -06002013 return VK_ERROR_OUT_OF_HOST_MEMORY;
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002014 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
2015 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07002016 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
2017 g_pDbgFunctionHead = pNewDbgFuncNode;
Jon Ashburna8aa8372015-03-03 15:07:15 -07002018 // force callbacks if DebugAction hasn't been set already other than initial value
Courtney Goeltzenleuchter90d93202015-03-04 15:47:34 -07002019 if (g_actionIsDefault) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002020 g_debugAction = VK_DBG_LAYER_ACTION_CALLBACK;
Courtney Goeltzenleuchter90d93202015-03-04 15:47:34 -07002021 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002022 VkResult result = nextTable.DbgRegisterMsgCallback(instance, pfnMsgCallback, pUserData);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002023 return result;
2024}
2025
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002026VK_LAYER_EXPORT VkResult VKAPI vkDbgUnregisterMsgCallback(
2027 VkInstance instance,
2028 VK_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002029{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002030 VK_LAYER_DBG_FUNCTION_NODE *pInfo = g_pDbgFunctionHead;
2031 VK_LAYER_DBG_FUNCTION_NODE *pPrev = pInfo;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05002032 while (pInfo) {
2033 if (pInfo->pfnMsgCallback == pfnMsgCallback) {
2034 pPrev->pNext = pInfo->pNext;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002035 if (g_pDbgFunctionHead == pInfo) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05002036 g_pDbgFunctionHead = pInfo->pNext;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002037 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05002038 free(pInfo);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002039 break;
2040 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05002041 pPrev = pInfo;
2042 pInfo = pInfo->pNext;
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002043 }
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002044 if (g_pDbgFunctionHead == NULL) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05002045 if (g_actionIsDefault) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002046 g_debugAction = VK_DBG_LAYER_ACTION_LOG_MSG;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05002047 } else {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002048 g_debugAction = (VK_LAYER_DBG_ACTION)(g_debugAction & ~((uint32_t)VK_DBG_LAYER_ACTION_CALLBACK));
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05002049 }
Jon Ashburna8aa8372015-03-03 15:07:15 -07002050 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002051 VkResult result = nextTable.DbgUnregisterMsgCallback(instance, pfnMsgCallback);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002052 return result;
2053}
2054
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002055VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI(
2056 VkDevice device,
2057 const VkSwapChainCreateInfoWSI *pCreateInfo,
2058 VkSwapChainWSI *pSwapChain)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002059{
Chia-I Wuf8693382015-04-16 22:02:10 +08002060 VkResult result = nextTable.CreateSwapChainWSI(device, pCreateInfo, pSwapChain);
2061
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002062 if (VK_SUCCESS == result) {
Chia-I Wuf8693382015-04-16 22:02:10 +08002063 loader_platform_thread_lock_mutex(&globalLock);
2064 addSwapChainInfo(*pSwapChain);
2065 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002066 }
Chia-I Wuf8693382015-04-16 22:02:10 +08002067
Tobin Ehlis6663f492014-11-10 12:29:12 -07002068 return result;
2069}
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002070
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002071VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapChainWSI(
2072 VkSwapChainWSI swapChain)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002073{
2074 loader_platform_thread_lock_mutex(&globalLock);
Chia-I Wuf8693382015-04-16 22:02:10 +08002075
2076 if (swapChainMap.find(swapChain) != swapChainMap.end()) {
2077 MT_SWAP_CHAIN_INFO* pInfo = swapChainMap[swapChain];
2078
David Pinedod8f83d82015-04-27 16:36:17 -06002079 if (pInfo->images.size() > 0) {
2080 for (std::vector<VkSwapChainImageInfoWSI>::const_iterator it = pInfo->images.begin();
2081 it != pInfo->images.end(); it++) {
2082 clearObjectBinding(it->image);
2083 freeMemObjInfo(it->memory, true);
Chia-I Wuf8693382015-04-16 22:02:10 +08002084
David Pinedod8f83d82015-04-27 16:36:17 -06002085 MT_OBJ_INFO* pDelInfo = objectMap[it->image];
2086 delete pDelInfo;
2087 objectMap.erase(it->image);
2088 }
Chia-I Wuf8693382015-04-16 22:02:10 +08002089 }
2090
2091 delete pInfo;
2092 swapChainMap.erase(swapChain);
2093 }
2094
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002095 loader_platform_thread_unlock_mutex(&globalLock);
Chia-I Wuf8693382015-04-16 22:02:10 +08002096
2097 return nextTable.DestroySwapChainWSI(swapChain);
2098}
2099
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002100VK_LAYER_EXPORT VkResult VKAPI vkGetSwapChainInfoWSI(
2101 VkSwapChainWSI swapChain,
2102 VkSwapChainInfoTypeWSI infoType,
2103 size_t *pDataSize,
2104 void *pData)
Chia-I Wuf8693382015-04-16 22:02:10 +08002105{
2106 VkResult result = nextTable.GetSwapChainInfoWSI(swapChain, infoType, pDataSize, pData);
2107
2108 if (infoType == VK_SWAP_CHAIN_INFO_TYPE_PERSISTENT_IMAGES_WSI && result == VK_SUCCESS) {
2109 const size_t count = *pDataSize / sizeof(VkSwapChainImageInfoWSI);
2110 MT_SWAP_CHAIN_INFO *pInfo = swapChainMap[swapChain];
2111
2112 if (pInfo->images.empty()) {
2113 pInfo->images.resize(count);
2114 memcpy(&pInfo->images[0], pData, sizeof(pInfo->images[0]) * count);
2115
David Pinedod8f83d82015-04-27 16:36:17 -06002116 if (pInfo->images.size() > 0) {
2117 for (std::vector<VkSwapChainImageInfoWSI>::const_iterator it = pInfo->images.begin();
2118 it != pInfo->images.end(); it++) {
2119 // Add image object, then insert the new Mem Object and then bind it to created image
2120 addObjectInfo(it->image, VK_STRUCTURE_TYPE_MAX_ENUM, &pInfo->createInfo, sizeof(pInfo->createInfo), "persistent_image");
2121 addMemObjInfo(it->memory, NULL);
2122 if (VK_FALSE == updateObjectBinding(it->image, it->memory)) {
2123 char str[1024];
2124 sprintf(str, "In vkGetSwapChainInfoWSI(), unable to set image %p binding to mem obj %p", (void*)it->image, (void*)it->memory);
2125 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, it->image, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
2126 }
Chia-I Wuf8693382015-04-16 22:02:10 +08002127 }
2128 }
2129 } else {
2130 const bool mismatch = (pInfo->images.size() != count ||
2131 memcmp(&pInfo->images[0], pData, sizeof(pInfo->images[0]) * count));
2132
2133 if (mismatch) {
2134 char str[1024];
2135 sprintf(str, "vkGetSwapChainInfoWSI(%p, VK_SWAP_CHAIN_INFO_TYPE_PERSISTENT_IMAGES_WSI) returned mismatching data", swapChain);
Mike Stroyanb050c682015-04-17 12:36:38 -06002136 layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, (VkObject) swapChain, 0, MEMTRACK_NONE, "SWAP_CHAIN", str);
Chia-I Wuf8693382015-04-16 22:02:10 +08002137 }
2138 }
2139 }
2140
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002141 return result;
2142}
Tobin Ehlis6663f492014-11-10 12:29:12 -07002143
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002144VK_LAYER_EXPORT void* VKAPI vkGetProcAddr(
2145 VkPhysicalDevice gpu,
2146 const char *funcName)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002147{
Jon Ashburnbacb0f52015-04-06 10:58:22 -06002148 VkBaseLayerObject* gpuw = (VkBaseLayerObject *) gpu;
Chia-I Wu4d11dcc2015-01-05 13:18:57 +08002149
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002150 if (gpu == NULL) {
Tobin Ehlis6663f492014-11-10 12:29:12 -07002151 return NULL;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002152 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002153 pCurObj = gpuw;
Ian Elliott2d4ab1e2015-01-13 17:52:38 -07002154 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002155
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002156 if (!strcmp(funcName, "vkGetProcAddr"))
2157 return (void *) vkGetProcAddr;
2158 if (!strcmp(funcName, "vkCreateDevice"))
2159 return (void*) vkCreateDevice;
2160 if (!strcmp(funcName, "vkDestroyDevice"))
2161 return (void*) vkDestroyDevice;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002162 if (!strcmp(funcName, "vkEnumerateLayers"))
2163 return (void*) vkEnumerateLayers;
2164 if (!strcmp(funcName, "vkQueueSubmit"))
2165 return (void*) vkQueueSubmit;
2166 if (!strcmp(funcName, "vkAllocMemory"))
2167 return (void*) vkAllocMemory;
2168 if (!strcmp(funcName, "vkFreeMemory"))
2169 return (void*) vkFreeMemory;
2170 if (!strcmp(funcName, "vkSetMemoryPriority"))
2171 return (void*) vkSetMemoryPriority;
2172 if (!strcmp(funcName, "vkMapMemory"))
2173 return (void*) vkMapMemory;
2174 if (!strcmp(funcName, "vkUnmapMemory"))
2175 return (void*) vkUnmapMemory;
2176 if (!strcmp(funcName, "vkPinSystemMemory"))
2177 return (void*) vkPinSystemMemory;
2178 if (!strcmp(funcName, "vkOpenSharedMemory"))
2179 return (void*) vkOpenSharedMemory;
2180 if (!strcmp(funcName, "vkOpenPeerMemory"))
2181 return (void*) vkOpenPeerMemory;
2182 if (!strcmp(funcName, "vkOpenPeerImage"))
2183 return (void*) vkOpenPeerImage;
2184 if (!strcmp(funcName, "vkDestroyObject"))
2185 return (void*) vkDestroyObject;
2186 if (!strcmp(funcName, "vkGetObjectInfo"))
2187 return (void*) vkGetObjectInfo;
Mark Lobodzinski942b1722015-05-11 17:21:15 -05002188 if (!strcmp(funcName, "vkBindObjectMemory"))
2189 return (void*) vkBindObjectMemory;
2190 if (!strcmp(funcName, "vkQueueBindSparseBufferMemory"))
2191 return (void*) vkQueueBindSparseBufferMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002192 if (!strcmp(funcName, "vkCreateFence"))
2193 return (void*) vkCreateFence;
2194 if (!strcmp(funcName, "vkGetFenceStatus"))
2195 return (void*) vkGetFenceStatus;
2196 if (!strcmp(funcName, "vkResetFences"))
2197 return (void*) vkResetFences;
2198 if (!strcmp(funcName, "vkWaitForFences"))
2199 return (void*) vkWaitForFences;
2200 if (!strcmp(funcName, "vkQueueWaitIdle"))
2201 return (void*) vkQueueWaitIdle;
2202 if (!strcmp(funcName, "vkDeviceWaitIdle"))
2203 return (void*) vkDeviceWaitIdle;
2204 if (!strcmp(funcName, "vkCreateEvent"))
2205 return (void*) vkCreateEvent;
2206 if (!strcmp(funcName, "vkCreateQueryPool"))
2207 return (void*) vkCreateQueryPool;
2208 if (!strcmp(funcName, "vkCreateBuffer"))
2209 return (void*) vkCreateBuffer;
2210 if (!strcmp(funcName, "vkCreateBufferView"))
2211 return (void*) vkCreateBufferView;
2212 if (!strcmp(funcName, "vkCreateImage"))
2213 return (void*) vkCreateImage;
2214 if (!strcmp(funcName, "vkCreateImageView"))
2215 return (void*) vkCreateImageView;
2216 if (!strcmp(funcName, "vkCreateColorAttachmentView"))
2217 return (void*) vkCreateColorAttachmentView;
2218 if (!strcmp(funcName, "vkCreateDepthStencilView"))
2219 return (void*) vkCreateDepthStencilView;
2220 if (!strcmp(funcName, "vkCreateShader"))
2221 return (void*) vkCreateShader;
2222 if (!strcmp(funcName, "vkCreateGraphicsPipeline"))
2223 return (void*) vkCreateGraphicsPipeline;
2224 if (!strcmp(funcName, "vkCreateGraphicsPipelineDerivative"))
2225 return (void*) vkCreateGraphicsPipelineDerivative;
2226 if (!strcmp(funcName, "vkCreateComputePipeline"))
2227 return (void*) vkCreateComputePipeline;
2228 if (!strcmp(funcName, "vkCreateSampler"))
2229 return (void*) vkCreateSampler;
2230 if (!strcmp(funcName, "vkCreateDynamicViewportState"))
2231 return (void*) vkCreateDynamicViewportState;
2232 if (!strcmp(funcName, "vkCreateDynamicRasterState"))
2233 return (void*) vkCreateDynamicRasterState;
2234 if (!strcmp(funcName, "vkCreateDynamicColorBlendState"))
2235 return (void*) vkCreateDynamicColorBlendState;
2236 if (!strcmp(funcName, "vkCreateDynamicDepthStencilState"))
2237 return (void*) vkCreateDynamicDepthStencilState;
2238 if (!strcmp(funcName, "vkCreateCommandBuffer"))
2239 return (void*) vkCreateCommandBuffer;
2240 if (!strcmp(funcName, "vkBeginCommandBuffer"))
2241 return (void*) vkBeginCommandBuffer;
2242 if (!strcmp(funcName, "vkEndCommandBuffer"))
2243 return (void*) vkEndCommandBuffer;
2244 if (!strcmp(funcName, "vkResetCommandBuffer"))
2245 return (void*) vkResetCommandBuffer;
2246 if (!strcmp(funcName, "vkCmdBindPipeline"))
2247 return (void*) vkCmdBindPipeline;
2248 if (!strcmp(funcName, "vkCmdBindDynamicStateObject"))
2249 return (void*) vkCmdBindDynamicStateObject;
2250 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
2251 return (void*) vkCmdBindDescriptorSets;
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06002252 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
2253 return (void*) vkCmdBindVertexBuffers;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002254 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
2255 return (void*) vkCmdBindIndexBuffer;
2256 if (!strcmp(funcName, "vkCmdDrawIndirect"))
2257 return (void*) vkCmdDrawIndirect;
2258 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
2259 return (void*) vkCmdDrawIndexedIndirect;
2260 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
2261 return (void*) vkCmdDispatchIndirect;
2262 if (!strcmp(funcName, "vkCmdCopyBuffer"))
2263 return (void*) vkCmdCopyBuffer;
2264 if (!strcmp(funcName, "vkCmdCopyImage"))
2265 return (void*) vkCmdCopyImage;
2266 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
2267 return (void*) vkCmdCopyBufferToImage;
2268 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
2269 return (void*) vkCmdCopyImageToBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002270 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
2271 return (void*) vkCmdUpdateBuffer;
2272 if (!strcmp(funcName, "vkCmdFillBuffer"))
2273 return (void*) vkCmdFillBuffer;
2274 if (!strcmp(funcName, "vkCmdClearColorImage"))
2275 return (void*) vkCmdClearColorImage;
2276 if (!strcmp(funcName, "vkCmdClearDepthStencil"))
2277 return (void*) vkCmdClearDepthStencil;
2278 if (!strcmp(funcName, "vkCmdResolveImage"))
2279 return (void*) vkCmdResolveImage;
2280 if (!strcmp(funcName, "vkCmdBeginQuery"))
2281 return (void*) vkCmdBeginQuery;
2282 if (!strcmp(funcName, "vkCmdEndQuery"))
2283 return (void*) vkCmdEndQuery;
2284 if (!strcmp(funcName, "vkCmdResetQueryPool"))
2285 return (void*) vkCmdResetQueryPool;
2286 if (!strcmp(funcName, "vkDbgRegisterMsgCallback"))
2287 return (void*) vkDbgRegisterMsgCallback;
2288 if (!strcmp(funcName, "vkDbgUnregisterMsgCallback"))
2289 return (void*) vkDbgUnregisterMsgCallback;
2290 if (!strcmp(funcName, "vkGetDeviceQueue"))
2291 return (void*) vkGetDeviceQueue;
Chia-I Wuf8693382015-04-16 22:02:10 +08002292 if (!strcmp(funcName, "vkCreateSwapChainWSI"))
2293 return (void*) vkCreateSwapChainWSI;
2294 if (!strcmp(funcName, "vkDestroySwapChainWSI"))
2295 return (void*) vkDestroySwapChainWSI;
2296 if (!strcmp(funcName, "vkGetSwapChainInfoWSI"))
2297 return (void*) vkGetSwapChainInfoWSI;
Tobin Ehlis6663f492014-11-10 12:29:12 -07002298 else {
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002299 if (gpuw->pGPA == NULL) {
Tobin Ehlis6663f492014-11-10 12:29:12 -07002300 return NULL;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002301 }
Tony Barbourd1c35722015-04-16 15:59:00 -06002302 return gpuw->pGPA((VkPhysicalDevice)gpuw->nextObject, funcName);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002303 }
2304}