blob: 98fdb64cff5ef62551d91fefe077bdbb7e3948eb [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>
31#include <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
Mark Lobodzinskib1567a02015-04-21 15:33:04 -060054map<VkCmdBuffer, MT_CB_INFO*> cbMap;
55map<VkDeviceMemory, MT_MEM_OBJ_INFO*> memObjMap;
56map<VkObject, MT_OBJ_INFO*> objectMap;
57map<uint64_t, MT_FENCE_INFO*> fenceMap; // Map fenceId to fence info
58map<VkQueue, MT_QUEUE_INFO*> queueMap;
59map<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;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -060080 for (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{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500107 MT_CB_INFO* pCBInfo = NULL;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500108 if (cbMap.find(cb) != cbMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500109 pCBInfo = cbMap[cb];
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600110 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500111 return pCBInfo;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700112}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600113
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500114// Return object info for 'object' or return NULL if no info exists
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600115static MT_OBJ_INFO* getObjectInfo(
116 const VkObject object)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500117{
118 MT_OBJ_INFO* pObjInfo = NULL;
119
120 if (objectMap.find(object) != objectMap.end()) {
121 pObjInfo = objectMap[object];
122 }
123 return pObjInfo;
124}
125
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600126static MT_OBJ_INFO* addObjectInfo(
127 VkObject object,
128 VkStructureType sType,
129 const void *pCreateInfo,
130 const int struct_size,
131 const char *name_prefix)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500132{
133 MT_OBJ_INFO* pInfo = new MT_OBJ_INFO;
134 memset(pInfo, 0, sizeof(MT_OBJ_INFO));
135 memcpy(&pInfo->create_info, pCreateInfo, struct_size);
136 sprintf(pInfo->object_name, "%s_%p", name_prefix, object);
137
138 pInfo->object = object;
139 pInfo->ref_count = 1;
140 pInfo->sType = sType;
141 objectMap[object] = pInfo;
142
143 return pInfo;
144}
145
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500146// Add a fence, creating one if necessary to our list of fences/fenceIds
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600147static uint64_t addFenceInfo(
148 VkFence fence,
149 VkQueue queue)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500150{
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500151 // Create fence object
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500152 MT_FENCE_INFO* pFenceInfo = new MT_FENCE_INFO;
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++;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500155 memset(pFenceInfo, 0, sizeof(MT_FENCE_INFO));
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500156 // If no fence, create an internal fence to track the submissions
157 if (fence == NULL) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600158 VkFenceCreateInfo fci;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600159 fci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500160 fci.pNext = NULL;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600161 fci.flags = static_cast<VkFenceCreateFlags>(0);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500162 nextTable.CreateFence(globalDevice, &fci, &pFenceInfo->fence);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600163 addObjectInfo(pFenceInfo->fence, fci.sType, &fci, sizeof(VkFenceCreateInfo), "internalFence");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600164 pFenceInfo->localFence = VK_TRUE;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500165 } else {
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -0500166 // Validate that fence is in UNSIGNALED state
167 MT_OBJ_INFO* pObjectInfo = getObjectInfo(fence);
168 if (pObjectInfo != NULL) {
Tobin Ehlisb870cbb2015-04-15 07:46:12 -0600169 if (pObjectInfo->create_info.fence_create_info.flags & VK_FENCE_CREATE_SIGNALED_BIT) {
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -0500170 char str[1024];
171 sprintf(str, "Fence %p submitted in SIGNALED state. Fences must be reset before being submitted", fence);
Tobin Ehlisb870cbb2015-04-15 07:46:12 -0600172 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, fence, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", str);
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -0500173 }
174 }
Tobin Ehlisb870cbb2015-04-15 07:46:12 -0600175 pFenceInfo->localFence = VK_FALSE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500176 pFenceInfo->fence = fence;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700177 }
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500178 pFenceInfo->queue = queue;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500179 fenceMap[fenceId] = pFenceInfo;
Mark Lobodzinski50932972015-04-02 20:49:09 -0500180 // Update most recently submitted fenceId for Queue
181 pQueueInfo->lastSubmittedId = fenceId;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500182 return fenceId;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500183}
184
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500185// Remove a fenceInfo from our list of fences/fenceIds
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600186static void deleteFenceInfo(
187 uint64_t fenceId)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500188{
189 if (fenceId != 0) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500190 if (fenceMap.find(fenceId) != fenceMap.end()) {
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600191 map<uint64_t, MT_FENCE_INFO*>::iterator item;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500192 MT_FENCE_INFO* pDelInfo = fenceMap[fenceId];
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500193 if (pDelInfo != NULL) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600194 if (pDelInfo->localFence == VK_TRUE) {
Mike Stroyanb050c682015-04-17 12:36:38 -0600195 nextTable.DestroyObject(globalDevice, VK_OBJECT_TYPE_FENCE, pDelInfo->fence);
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500196 }
197 delete pDelInfo;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500198 }
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600199 item = fenceMap.find(fenceId);
200 fenceMap.erase(item);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500201 }
202 }
203}
204
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500205// Search through list for this fence, deleting all items before it (with lower IDs) and updating lastRetiredId
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600206static void updateFenceTracking(
207 VkFence fence)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500208{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500209 MT_FENCE_INFO *pCurFenceInfo = NULL;
210 uint64_t fenceId = 0;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600211 VkQueue queue = NULL;
212 bool found = false;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500213
David Pinedod8f83d82015-04-27 16:36:17 -0600214 if (fenceMap.size() <= 0)
215 return;
Mike Stroyan8fbeea92015-04-15 15:37:47 -0600216 for (map<uint64_t, MT_FENCE_INFO*>::iterator ii=fenceMap.begin(); !found && ii!=fenceMap.end(); ++ii) {
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500217 if ((*ii).second != NULL) {
218 if (fence == ((*ii).second)->fence) {
219 queue = ((*ii).second)->queue;
220 MT_QUEUE_INFO *pQueueInfo = queueMap[queue];
221 pQueueInfo->lastRetiredId = (*ii).first;
Mike Stroyan8fbeea92015-04-15 15:37:47 -0600222 found = true;
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500223 } else {
224 deleteFenceInfo((*ii).first);
225 }
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500226 // Update fence state in fenceCreateInfo structure
227 MT_OBJ_INFO* pObjectInfo = getObjectInfo(fence);
228 if (pObjectInfo != NULL) {
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -0500229 pObjectInfo->create_info.fence_create_info.flags =
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600230 static_cast<VkFenceCreateFlags>(
231 pObjectInfo->create_info.fence_create_info.flags | VK_FENCE_CREATE_SIGNALED_BIT);
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500232 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500233 }
234 }
235}
236
237// Utility function that determines if a fenceId has been retired yet
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600238static bool32_t fenceRetired(
239 uint64_t fenceId)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500240{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600241 bool32_t result = VK_FALSE;
Courtney Goeltzenleuchter0c55f3a2015-04-15 14:10:51 -0600242 if (fenceMap.find(fenceId) != fenceMap.end()) {
243 MT_FENCE_INFO* pFenceInfo = fenceMap[fenceId];
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500244 MT_QUEUE_INFO* pQueueInfo = queueMap[pFenceInfo->queue];
Mark Lobodzinski3bc3f6e2015-04-02 08:52:53 -0500245 if (fenceId <= pQueueInfo->lastRetiredId)
246 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600247 result = VK_TRUE;
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500248 }
Mark Lobodzinski50932972015-04-02 20:49:09 -0500249 } else { // If not in list, fence has been retired and deleted
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600250 result = VK_TRUE;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500251 }
252 return result;
253}
254
255// Return the fence associated with a fenceId
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600256static VkFence getFenceFromId(
257 uint64_t fenceId)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500258{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600259 VkFence fence = NULL;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500260 if (fenceId != 0) {
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500261 // Search for an item with this fenceId
262 if (fenceMap.find(fenceId) != fenceMap.end()) {
263 MT_FENCE_INFO* pFenceInfo = fenceMap[fenceId];
264 if (pFenceInfo != NULL) {
265 MT_QUEUE_INFO* pQueueInfo = queueMap[pFenceInfo->queue];
266 if (fenceId > pQueueInfo->lastRetiredId) {
267 fence = pFenceInfo->fence;
268 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500269 }
270 }
271 }
272 return fence;
273}
274
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500275// Helper routine that updates the fence list for a specific queue to all-retired
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600276static void retireQueueFences(
277 VkQueue queue)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500278{
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600279 MT_QUEUE_INFO *pQueueInfo = queueMap[queue];
280 pQueueInfo->lastRetiredId = pQueueInfo->lastSubmittedId;
281 // Set Queue's lastRetired to lastSubmitted, free items in queue's fence list
282 map<uint64_t, MT_FENCE_INFO*>::iterator it = fenceMap.begin();
283 map<uint64_t, MT_FENCE_INFO*>::iterator temp;
David Pinedod8f83d82015-04-27 16:36:17 -0600284 while (fenceMap.size() > 0 && it != fenceMap.end()) {
Tobin Ehlis5d37f702015-04-15 14:25:02 -0600285 if ((((*it).second) != NULL) && ((*it).second)->queue == queue) {
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600286 temp = it;
287 ++temp;
288 deleteFenceInfo((*it).first);
289 it = temp;
290 } else {
291 ++it;
292 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500293 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700294}
295
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500296// Helper routine that updates fence list for all queues to all-retired
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600297static void retireDeviceFences(
298 VkDevice device)
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500299{
300 // Process each queue for device
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600301 // TODO: Add multiple device support
David Pinedod8f83d82015-04-27 16:36:17 -0600302 if (queueMap.size() <= 0)
303 return;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600304 for (map<VkQueue, MT_QUEUE_INFO*>::iterator ii=queueMap.begin(); ii!=queueMap.end(); ++ii) {
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500305 retireQueueFences((*ii).first);
306 }
307}
308
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500309// Return ptr to info in map container containing mem, or NULL if not found
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700310// Calls to this function should be wrapped in mutex
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600311static MT_MEM_OBJ_INFO* getMemObjInfo(
312 const VkDeviceMemory mem)
Tobin Ehlisc145be82015-01-08 15:22:32 -0700313{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500314 MT_MEM_OBJ_INFO* pMemObjInfo = NULL;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500315
316 if (memObjMap.find(mem) != memObjMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500317 pMemObjInfo = memObjMap[mem];
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600318 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500319 return pMemObjInfo;
Tobin Ehlisc145be82015-01-08 15:22:32 -0700320}
321
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600322static void addMemObjInfo(
323 const VkDeviceMemory mem,
324 const VkMemoryAllocInfo *pAllocInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700325{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500326 MT_MEM_OBJ_INFO* pInfo = new MT_MEM_OBJ_INFO;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600327 pInfo->refCount = 0;
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600328 memset(&pInfo->allocInfo, 0, sizeof(VkMemoryAllocInfo));
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500329
Chia-I Wuf8693382015-04-16 22:02:10 +0800330 if (pAllocInfo) { // MEM alloc created by vkCreateSwapChainWSI() doesn't have alloc info struct
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600331 memcpy(&pInfo->allocInfo, pAllocInfo, sizeof(VkMemoryAllocInfo));
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500332 // TODO: Update for real hardware, actually process allocation info structures
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500333 pInfo->allocInfo.pNext = NULL;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700334 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500335 pInfo->mem = mem;
336 memObjMap[mem] = pInfo;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700337}
338
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500339// Find CB Info and add mem binding to list container
340// Find Mem Obj Info and add CB binding to list container
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600341static bool32_t updateCBBinding(
342 const VkCmdBuffer cb,
343 const VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700344{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600345 bool32_t result = VK_TRUE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700346 // First update CB binding in MemObj mini CB list
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500347 MT_MEM_OBJ_INFO* pMemInfo = getMemObjInfo(mem);
348 if (!pMemInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700349 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600350 sprintf(str, "Trying to bind mem obj %p to CB %p but no info for that mem obj.\n "
351 "Was it correctly allocated? Did it already get freed?", mem, cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600352 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
353 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600354 } else {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500355 // Search for cmd buffer object in memory object's binding list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600356 bool32_t found = VK_FALSE;
David Pinedod8f83d82015-04-27 16:36:17 -0600357 if (pMemInfo->pCmdBufferBindings.size() > 0) {
358 for (list<VkCmdBuffer>::iterator it = pMemInfo->pCmdBufferBindings.begin(); it != pMemInfo->pCmdBufferBindings.end(); ++it) {
359 if ((*it) == cb) {
360 found = VK_TRUE;
361 break;
362 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500363 }
364 }
365 // If not present, add to list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600366 if (found == VK_FALSE) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500367 pMemInfo->pCmdBufferBindings.push_front(cb);
368 pMemInfo->refCount++;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500369 }
370
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500371 // Now update CBInfo's Mem binding list
372 MT_CB_INFO* pCBInfo = getCBInfo(cb);
373 if (!pCBInfo) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500374 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500375 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 -0600376 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
377 result = VK_FALSE;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500378 } else {
379 // Search for memory object in cmd buffer's binding list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600380 bool32_t found = VK_FALSE;
David Pinedod8f83d82015-04-27 16:36:17 -0600381 if (pCBInfo->pMemObjList.size() > 0) {
382 for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
383 if ((*it) == mem) {
384 found = VK_TRUE;
385 break;
386 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500387 }
388 }
389 // If not present, add to list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600390 if (found == VK_FALSE) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500391 pCBInfo->pMemObjList.push_front(mem);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600392 }
393 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700394 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600395 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700396}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600397
Tobin Ehlis6663f492014-11-10 12:29:12 -0700398// Clear the CB Binding for mem
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700399// Calls to this function should be wrapped in mutex
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600400static void clearCBBinding(
401 const VkCmdBuffer cb,
402 const VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700403{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500404 MT_MEM_OBJ_INFO* pInfo = getMemObjInfo(mem);
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500405 // TODO : Having this check is not ideal, really if memInfo was deleted,
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700406 // its CB bindings should be cleared and then freeCBBindings wouldn't call
407 // us here with stale mem objs
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500408 if (pInfo) {
409 pInfo->pCmdBufferBindings.remove(cb);
410 pInfo->refCount--;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700411 }
412}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600413
Tobin Ehlis6663f492014-11-10 12:29:12 -0700414// Free bindings related to CB
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600415static bool32_t freeCBBindings(
416 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700417{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600418 bool32_t result = VK_TRUE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500419 MT_CB_INFO* pCBInfo = getCBInfo(cb);
420 if (!pCBInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700421 char str[1024];
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500422 sprintf(str, "Unable to find global CB info %p for deletion", cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600423 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
424 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600425 } else {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500426 if (!fenceRetired(pCBInfo->fenceId)) {
427 deleteFenceInfo(pCBInfo->fenceId);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600428 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500429
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -0600430 if (pCBInfo->pMemObjList.size() > 0) {
431 list<VkDeviceMemory> mem_obj_list = pCBInfo->pMemObjList;
432 for (list<VkDeviceMemory>::iterator it=mem_obj_list.begin(); it!=mem_obj_list.end(); ++it) {
David Pinedod8f83d82015-04-27 16:36:17 -0600433 clearCBBinding(cb, (*it));
434 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600435 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500436 pCBInfo->pMemObjList.clear();
Tobin Ehlis6663f492014-11-10 12:29:12 -0700437 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600438 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700439}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600440
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500441// Delete CBInfo from list along with all of it's mini MemObjInfo
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500442// and also clear mem references to CB
Tobin Ehlis6663f492014-11-10 12:29:12 -0700443// TODO : When should this be called? There's no Destroy of CBs that I see
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600444static bool32_t deleteCBInfo(
445 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700446{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600447 bool32_t result = VK_TRUE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600448 result = freeCBBindings(cb);
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500449 // Delete the CBInfo info
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600450 if (result == VK_TRUE) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500451 if (cbMap.find(cb) != cbMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500452 MT_CB_INFO* pDelInfo = cbMap[cb];
453 delete pDelInfo;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500454 cbMap.erase(cb);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600455 }
Ian Elliott2d4ab1e2015-01-13 17:52:38 -0700456 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600457 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700458}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600459
Tobin Ehlis6663f492014-11-10 12:29:12 -0700460// Delete the entire CB list
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600461static bool32_t deleteCBInfoList(
462 void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700463{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600464 bool32_t result = VK_TRUE;
David Pinedod8f83d82015-04-27 16:36:17 -0600465 if (cbMap.size() <= 0)
466 return result;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600467 for (map<VkCmdBuffer, MT_CB_INFO*>::iterator ii=cbMap.begin(); ii!=cbMap.end(); ++ii) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500468 freeCBBindings((*ii).first);
469 delete (*ii).second;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700470 }
471 return result;
472}
473
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500474// For given MemObjInfo, report Obj & CB bindings
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600475static void reportMemReferencesAndCleanUp(
476 MT_MEM_OBJ_INFO* pMemObjInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700477{
Tony Barbour18f71552015-04-22 11:36:22 -0600478 size_t cmdBufRefCount = pMemObjInfo->pCmdBufferBindings.size();
479 size_t objRefCount = pMemObjInfo->pObjBindings.size();
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500480
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500481 if ((pMemObjInfo->pCmdBufferBindings.size() + pMemObjInfo->pObjBindings.size()) != 0) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700482 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600483 sprintf(str, "Attempting to free memory object %p which still contains %lu references",
484 pMemObjInfo->mem, (cmdBufRefCount + objRefCount));
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500485 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, pMemObjInfo->mem, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700486 }
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500487
David Pinedod8f83d82015-04-27 16:36:17 -0600488 if (cmdBufRefCount > 0 && pMemObjInfo->pCmdBufferBindings.size() > 0) {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500489 for (list<VkCmdBuffer>::const_iterator it = pMemObjInfo->pCmdBufferBindings.begin(); it != pMemObjInfo->pCmdBufferBindings.end(); ++it) {
490 char str[1024];
491 sprintf(str, "Command Buffer %p still has a reference to mem obj %p", (*it), pMemObjInfo->mem);
492 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, (*it), 0, MEMTRACK_NONE, "MEM", str);
493 }
494 // Clear the list of hanging references
495 pMemObjInfo->pCmdBufferBindings.clear();
496 }
497
David Pinedod8f83d82015-04-27 16:36:17 -0600498 if (objRefCount > 0 && pMemObjInfo->pObjBindings.size() > 0) {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500499 for (list<VkObject>::const_iterator it = pMemObjInfo->pObjBindings.begin(); it != pMemObjInfo->pObjBindings.end(); ++it) {
500 char str[1024];
501 sprintf(str, "VK Object %p still has a reference to mem obj %p", (*it), pMemObjInfo->mem);
502 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, (*it), 0, MEMTRACK_NONE, "MEM", str);
503 }
504 // Clear the list of hanging references
505 pMemObjInfo->pObjBindings.clear();
506 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500507
Tobin Ehlis6663f492014-11-10 12:29:12 -0700508}
509
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600510static void deleteMemObjInfo(
511 VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700512{
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500513 if (memObjMap.find(mem) != memObjMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500514 MT_MEM_OBJ_INFO* pDelInfo = memObjMap[mem];
515 delete pDelInfo;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500516 memObjMap.erase(mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700517 }
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500518 else {
519 char str[1024];
520 sprintf(str, "Request to delete memory object %p not present in memory Object Map", mem);
521 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
522 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700523}
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500524
Tobin Ehlis6663f492014-11-10 12:29:12 -0700525// Check if fence for given CB is completed
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600526static bool32_t checkCBCompleted(
527 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700528{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600529 bool32_t result = VK_TRUE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500530 MT_CB_INFO* pCBInfo = getCBInfo(cb);
531 if (!pCBInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700532 char str[1024];
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500533 sprintf(str, "Unable to find global CB info %p to check for completion", cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600534 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
535 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600536 } else {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500537 if (!fenceRetired(pCBInfo->fenceId)) {
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600538 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600539 sprintf(str, "FenceId %" PRIx64", fence %p for CB %p has not been checked for completion",
540 pCBInfo->fenceId, getFenceFromId(pCBInfo->fenceId), cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600541 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
542 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600543 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700544 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600545 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700546}
547
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600548static bool32_t freeMemObjInfo(
549 VkDeviceMemory mem,
550 bool internal)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700551{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600552 bool32_t result = VK_TRUE;
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500553 // Parse global list to find info w/ mem
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500554 MT_MEM_OBJ_INFO* pInfo = getMemObjInfo(mem);
555 if (!pInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700556 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600557 sprintf(str, "Couldn't find mem info object for %p\n Was %p never allocated or previously freed?",
558 (void*)mem, (void*)mem);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600559 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
560 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600561 } else {
Courtney Goeltzenleuchter1c943a72015-03-26 16:15:39 -0600562 if (pInfo->allocInfo.allocationSize == 0 && !internal) {
Mark Lobodzinski2f3b19b2015-02-18 18:06:24 -0600563 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600564 sprintf(str, "Attempting to free memory associated with a Persistent Image, %p, "
565 "this should not be explicitly freed\n", (void*)mem);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600566 layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
567 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600568 } else {
569 // Clear any CB bindings for completed CBs
570 // TODO : Is there a better place to do this?
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500571
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600572 list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin();
573 list<VkCmdBuffer>::iterator temp;
David Pinedod8f83d82015-04-27 16:36:17 -0600574 while (pInfo->pCmdBufferBindings.size() > 0 && it != pInfo->pCmdBufferBindings.end()) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600575 if (VK_TRUE == checkCBCompleted(*it)) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500576 temp = it;
577 ++temp;
578 freeCBBindings(*it);
579 it = temp;
580 } else {
581 ++it;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600582 }
583 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500584
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600585 // Now verify that no references to this mem obj remain
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500586 if (0 != pInfo->refCount) {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500587 reportMemReferencesAndCleanUp(pInfo);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600588 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600589 }
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600590 // Delete mem obj info
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500591 deleteMemObjInfo(mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700592 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700593 }
594 return result;
595}
596
Tobin Ehlis6663f492014-11-10 12:29:12 -0700597// Remove object binding performs 3 tasks:
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500598// 1. Remove ObjectInfo from MemObjInfo list container of obj bindings & free it
599// 2. Decrement refCount for MemObjInfo
600// 3. Clear MemObjInfo ptr from ObjectInfo
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600601static bool32_t clearObjectBinding(
602 VkObject object)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700603{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600604 bool32_t result = VK_FALSE;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500605 MT_OBJ_INFO* pObjInfo = getObjectInfo(object);
606 if (!pObjInfo) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700607 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600608 sprintf(str, "Attempting to clear mem binding for object %p: devices, queues, command buffers, "
609 "shaders and memory objects do not have external memory requirements and it is "
610 "unneccessary to call bind/unbindObjectMemory on them.", object);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600611 layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_OBJECT, "MEM", str);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600612 } else {
David Pinedod8f83d82015-04-27 16:36:17 -0600613 if (!pObjInfo->pMemObjInfo || pObjInfo->pMemObjInfo->pObjBindings.size() <= 0) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600614 char str[1024];
615 sprintf(str, "Attempting to clear mem binding on obj %p but it has no binding.", (void*)object);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600616 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 -0600617 } else {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500618 // 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
619 // and set the objects memory binding pointer to NULL.
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600620 for (list<VkObject>::iterator it = pObjInfo->pMemObjInfo->pObjBindings.begin(); it != pObjInfo->pMemObjInfo->pObjBindings.end(); ++it) {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500621 if ((*it) == object) {
622 pObjInfo->pMemObjInfo->refCount--;
623 pObjInfo->pMemObjInfo->pObjBindings.erase(it);
624 pObjInfo->pMemObjInfo = NULL;
625 result = VK_TRUE;
626 break;
627 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600628 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600629 if (result == VK_FALSE) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600630 char str[1024];
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500631 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 -0500632 object, pObjInfo->pMemObjInfo->mem);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600633 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600634 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700635 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700636 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600637 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700638}
639
640// For NULL mem case, clear any previous binding Else...
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500641// Make sure given object is in global object map
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700642// IF a previous binding existed, clear it
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500643// Add reference from objectInfo to memoryInfo
644// Add reference off of objInfo
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600645// Return VK_TRUE if addition is successful, VK_FALSE otherwise
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600646static bool32_t updateObjectBinding(
647 VkObject object,
648 VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700649{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600650 bool32_t result = VK_FALSE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700651 // Handle NULL case separately, just clear previous binding & decrement reference
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600652 if (mem == VK_NULL_HANDLE) {
Tobin Ehlis6663f492014-11-10 12:29:12 -0700653 clearObjectBinding(object);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600654 result = VK_TRUE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600655 } else {
656 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500657 MT_OBJ_INFO* pObjInfo = getObjectInfo(object);
658 if (!pObjInfo) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600659 sprintf(str, "Attempting to update Binding of Obj(%p) that's not in global list()", (void*)object);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600660 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
661 return VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600662 }
663 // non-null case so should have real mem obj
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500664 MT_MEM_OBJ_INFO* pInfo = getMemObjInfo(mem);
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -0600665 if (!pInfo) {
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500666 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 -0600667 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500668 return VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600669 } else {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500670 // Search for object in memory object's binding list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600671 bool32_t found = VK_FALSE;
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -0600672 if (pInfo->pObjBindings.size() > 0) {
673 for (list<VkObject>::iterator it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) {
674 if ((*it) == object) {
675 found = VK_TRUE;
676 break;
677 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600678 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600679 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500680 // If not present, add to list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600681 if (found == VK_FALSE) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500682 pInfo->pObjBindings.push_front(object);
683 pInfo->refCount++;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500684 }
685
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500686 if (pObjInfo->pMemObjInfo) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500687 clearObjectBinding(object); // Need to clear the previous object binding before setting new binding
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500688 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 -0600689 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500690 }
691 // For image objects, make sure default memory state is correctly set
692 // TODO : What's the best/correct way to handle this?
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600693 if (VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO == pObjInfo->sType) {
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600694 if (pObjInfo->create_info.image_create_info.usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
695 VK_IMAGE_USAGE_DEPTH_STENCIL_BIT)) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500696 // TODO:: More memory state transition stuff.
697 }
698 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500699 pObjInfo->pMemObjInfo = pInfo;
Tobin Ehlis8be20fd2015-01-07 17:49:29 -0700700 }
701 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600702 return VK_TRUE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700703}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600704
Tobin Ehlis6663f492014-11-10 12:29:12 -0700705// Print details of global Obj tracking list
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600706static void printObjList(
707 void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700708{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500709 MT_OBJ_INFO* pInfo = NULL;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500710 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500711 sprintf(str, "Details of Object list of size %lu elements", objectMap.size());
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600712 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
David Pinedod8f83d82015-04-27 16:36:17 -0600713 if (objectMap.size() <= 0)
714 return;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600715 for (map<VkObject, MT_OBJ_INFO*>::iterator ii=objectMap.begin(); ii!=objectMap.end(); ++ii) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500716 pInfo = (*ii).second;
717 sprintf(str, " ObjInfo %p has object %p, pMemObjInfo %p", pInfo, pInfo->object, pInfo->pMemObjInfo);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600718 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, pInfo->object, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700719 }
720}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600721
Tobin Ehlis6663f492014-11-10 12:29:12 -0700722// For given Object, get 'mem' obj that it's bound to or NULL if no binding
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600723static VkDeviceMemory getMemBindingFromObject(
724 const VkObject object)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700725{
Tony Barbourd1c35722015-04-16 15:59:00 -0600726 VkDeviceMemory mem = NULL;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500727 MT_OBJ_INFO* pObjInfo = getObjectInfo(object);
728 if (pObjInfo) {
729 if (pObjInfo->pMemObjInfo) {
730 mem = pObjInfo->pMemObjInfo->mem;
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -0600731 } else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700732 char str[1024];
733 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 -0600734 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MISSING_MEM_BINDINGS, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700735 printObjList();
736 }
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -0600737 } else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700738 char str[1024];
739 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 -0600740 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_OBJECT, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700741 printObjList();
742 }
743 return mem;
744}
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500745
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500746// Print details of MemObjInfo list
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600747static void printMemList(
748 void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700749{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500750 MT_MEM_OBJ_INFO* pInfo = NULL;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700751 // Just printing each msg individually for now, may want to package these into single large print
752 char str[1024];
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500753 sprintf(str, "MEM INFO : Details of Memory Object list of size %lu elements", memObjMap.size());
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600754 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500755
David Pinedod8f83d82015-04-27 16:36:17 -0600756 if (memObjMap.size() <= 0)
757 return;
758
Tony Barbourd1c35722015-04-16 15:59:00 -0600759 for (map<VkDeviceMemory, MT_MEM_OBJ_INFO*>::iterator ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500760 pInfo = (*ii).second;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500761
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500762 sprintf(str, " ===MemObjInfo at %p===", (void*)pInfo);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600763 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500764 sprintf(str, " Mem object: %p", (void*)pInfo->mem);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600765 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500766 sprintf(str, " Ref Count: %u", pInfo->refCount);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600767 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500768 if (0 != pInfo->allocInfo.allocationSize) {
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -0600769 string pAllocInfoMsg = vk_print_vkmemoryallocinfo(&pInfo->allocInfo, "{MEM}INFO : ");
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500770 sprintf(str, " Mem Alloc info:\n%s", pAllocInfoMsg.c_str());
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600771 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500772 } else {
Chia-I Wuf8693382015-04-16 22:02:10 +0800773 sprintf(str, " Mem Alloc info is NULL (alloc done by vkCreateSwapChainWSI())");
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600774 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500775 }
776
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600777 sprintf(str, " VK OBJECT Binding list of size %lu elements:", pInfo->pObjBindings.size());
778 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
David Pinedod8f83d82015-04-27 16:36:17 -0600779 if (pInfo->pObjBindings.size() > 0) {
780 for (list<VkObject>::iterator it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) {
781 sprintf(str, " VK OBJECT %p", (*it));
782 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
783 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500784 }
785
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600786 sprintf(str, " VK Command Buffer (CB) binding list of size %lu elements", pInfo->pCmdBufferBindings.size());
787 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
David Pinedod8f83d82015-04-27 16:36:17 -0600788 if (pInfo->pCmdBufferBindings.size() > 0)
789 {
790 for (list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin(); it != pInfo->pCmdBufferBindings.end(); ++it) {
791 sprintf(str, " VK CB %p", (*it));
792 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
793 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700794 }
795 }
796}
797
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600798static void printCBList(
799 void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700800{
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700801 char str[1024] = {0};
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500802 MT_CB_INFO* pCBInfo = NULL;
803 sprintf(str, "Details of CB list of size %lu elements", cbMap.size());
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600804 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500805
David Pinedod8f83d82015-04-27 16:36:17 -0600806 if (cbMap.size() <= 0)
807 return;
808
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600809 for (map<VkCmdBuffer, MT_CB_INFO*>::iterator ii=cbMap.begin(); ii!=cbMap.end(); ++ii) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500810 pCBInfo = (*ii).second;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500811
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500812 sprintf(str, " CB Info (%p) has CB %p, fenceId %" PRIx64", and fence %p",
813 (void*)pCBInfo, (void*)pCBInfo->cmdBuffer, pCBInfo->fenceId,
814 (void*)getFenceFromId(pCBInfo->fenceId));
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600815 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500816
David Pinedod8f83d82015-04-27 16:36:17 -0600817 if (pCBInfo->pMemObjList.size() <= 0)
818 continue;
Tony Barbourd1c35722015-04-16 15:59:00 -0600819 for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500820 sprintf(str, " Mem obj %p", (*it));
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600821 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700822 }
823 }
824}
825
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600826static void initMemTracker(
827 void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700828{
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700829 const char *strOpt;
830 // initialize MemTracker options
Ian Elliotte7826712015-03-06 13:50:05 -0700831 getLayerOptionEnum("MemTrackerReportLevel", (uint32_t *) &g_reportingLevel);
832 g_actionIsDefault = getLayerOptionEnum("MemTrackerDebugAction", (uint32_t *) &g_debugAction);
Tobin Ehlisee702232015-01-08 14:26:53 -0700833
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600834 if (g_debugAction & VK_DBG_LAYER_ACTION_LOG_MSG)
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700835 {
836 strOpt = getLayerOption("MemTrackerLogFilename");
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600837 if (strOpt) {
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700838 g_logFile = fopen(strOpt, "w");
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700839 }
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600840 if (g_logFile == NULL) {
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700841 g_logFile = stdout;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600842 }
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700843 }
844
845 // initialize Layer dispatch table
846 // TODO handle multiple GPUs
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600847 PFN_vkGetProcAddr fpNextGPA;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700848 fpNextGPA = pCurObj->pGPA;
849 assert(fpNextGPA);
850
Tony Barbourd1c35722015-04-16 15:59:00 -0600851 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkPhysicalDevice) pCurObj->nextObject);
Chia-I Wuaa4121f2015-01-04 23:11:43 +0800852
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600853 if (!globalLockInitialized)
854 {
855 // TODO/TBD: Need to delete this mutex sometime. How??? One
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600856 // suggestion is to call this during vkCreateInstance(), and then we
857 // can clean it up during vkDestroyInstance(). However, that requires
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600858 // that the layer have per-instance locks. We need to come back and
859 // address this soon.
860 loader_platform_thread_create_mutex(&globalLock);
861 globalLockInitialized = 1;
862 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700863}
864
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600865VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(
866 VkPhysicalDevice gpu,
867 const VkDeviceCreateInfo *pCreateInfo,
868 VkDevice *pDevice)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700869{
Jon Ashburn4d9f4652015-04-08 21:33:34 -0600870 pCurObj = (VkBaseLayerObject *) gpu;
Ian Elliott2d4ab1e2015-01-13 17:52:38 -0700871 loader_platform_thread_once(&g_initOnce, initMemTracker);
Jon Ashburn4d9f4652015-04-08 21:33:34 -0600872 VkResult result = nextTable.CreateDevice(gpu, pCreateInfo, pDevice);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700873 // Save off device in case we need it to create Fences
874 globalDevice = *pDevice;
875 return result;
876}
877
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600878VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice(
879 VkDevice device)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700880{
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700881 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600882 sprintf(str, "Printing List details prior to vkDestroyDevice()");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600883 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600884 layerCbMsg(VK_DBG_MSG_UNKNOWN, VK_VALIDATION_LEVEL_0, device, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700885 printMemList();
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500886 printCBList();
Tobin Ehlis6663f492014-11-10 12:29:12 -0700887 printObjList();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600888 if (VK_FALSE == deleteCBInfoList()) {
889 sprintf(str, "Issue deleting global CB list in vkDestroyDevice()");
890 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, device, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700891 }
Tobin Ehlisb54ef782014-11-25 18:01:12 -0700892 // Report any memory leaks
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500893 MT_MEM_OBJ_INFO* pInfo = NULL;
David Pinedod8f83d82015-04-27 16:36:17 -0600894 if (memObjMap.size() > 0) {
895 for (map<VkDeviceMemory, MT_MEM_OBJ_INFO*>::iterator ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
896 pInfo = (*ii).second;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500897
David Pinedod8f83d82015-04-27 16:36:17 -0600898 if (pInfo->allocInfo.allocationSize != 0) {
899 sprintf(str, "Mem Object %p has not been freed. You should clean up this memory by calling "
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600900 "vkFreeMemory(%p) prior to vkDestroyDevice().", pInfo->mem, pInfo->mem);
David Pinedod8f83d82015-04-27 16:36:17 -0600901 layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, pInfo->mem, 0, MEMTRACK_MEMORY_LEAK, "MEM", str);
902 }
Mark Lobodzinski2f3b19b2015-02-18 18:06:24 -0600903 }
Tobin Ehlisb54ef782014-11-25 18:01:12 -0700904 }
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500905
906 // Queues persist until device is destroyed
907 deleteQueueInfoList();
908
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600909 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600910 VkResult result = nextTable.DestroyDevice(device);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700911 return result;
912}
913
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600914struct extProps {
915 uint32_t version;
916 const char * const name;
917};
Jon Ashburn120cfbe2015-04-14 14:12:59 -0600918#define MEM_TRACKER_LAYER_EXT_ARRAY_SIZE 2
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600919static const struct extProps mtExts[MEM_TRACKER_LAYER_EXT_ARRAY_SIZE] = {
920 // TODO what is the version?
Jon Ashburn120cfbe2015-04-14 14:12:59 -0600921 0x10, "MemTracker",
922 0x10, "Validation"
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600923};
924
925VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600926 VkExtensionInfoType infoType,
927 uint32_t extensionIndex,
928 size_t *pDataSize,
929 void *pData)
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600930{
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500931 // This entrypoint is NOT going to init its own dispatch table since loader calls here early
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600932 VkExtensionProperties *ext_props;
933 uint32_t *count;
934
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600935 if (pDataSize == NULL) {
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600936 return VK_ERROR_INVALID_POINTER;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600937 }
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600938
939 switch (infoType) {
940 case VK_EXTENSION_INFO_TYPE_COUNT:
941 *pDataSize = sizeof(uint32_t);
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600942 if (pData == NULL) {
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600943 return VK_SUCCESS;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600944 }
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600945 count = (uint32_t *) pData;
946 *count = MEM_TRACKER_LAYER_EXT_ARRAY_SIZE;
947 break;
948 case VK_EXTENSION_INFO_TYPE_PROPERTIES:
949 *pDataSize = sizeof(VkExtensionProperties);
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600950 if (pData == NULL) {
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600951 return VK_SUCCESS;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600952 }
953 if (extensionIndex >= MEM_TRACKER_LAYER_EXT_ARRAY_SIZE) {
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600954 return VK_ERROR_INVALID_VALUE;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600955 }
Jon Ashburn9fd4cc42015-04-10 14:33:07 -0600956 ext_props = (VkExtensionProperties *) pData;
957 ext_props->version = mtExts[extensionIndex].version;
958 strncpy(ext_props->extName, mtExts[extensionIndex].name,
959 VK_MAX_EXTENSION_NAME);
960 ext_props->extName[VK_MAX_EXTENSION_NAME - 1] = '\0';
961 break;
962 default:
963 return VK_ERROR_INVALID_VALUE;
964 };
965
966 return VK_SUCCESS;
967}
968
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600969VK_LAYER_EXPORT VkResult VKAPI vkEnumerateLayers(
970 VkPhysicalDevice gpu,
971 size_t maxStringSize,
972 size_t *pLayerCount,
973 char* const *pOutLayers,
974 void *pReserved)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700975{
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600976 if (gpu != NULL)
Jon Ashburnf7a08742014-11-25 11:08:42 -0700977 {
Jon Ashburn4d9f4652015-04-08 21:33:34 -0600978 pCurObj = (VkBaseLayerObject *) gpu;
Ian Elliott2d4ab1e2015-01-13 17:52:38 -0700979 loader_platform_thread_once(&g_initOnce, initMemTracker);
Courtney Goeltzenleuchterd9dc0c72015-04-20 11:04:54 -0600980 VkResult result = nextTable.EnumerateLayers(gpu,
981 maxStringSize, pLayerCount, pOutLayers, pReserved);
Jon Ashburnf7a08742014-11-25 11:08:42 -0700982 return result;
983 } else
984 {
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600985 if (pLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600986 return VK_ERROR_INVALID_POINTER;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600987 }
Jon Ashburnf7a08742014-11-25 11:08:42 -0700988 // This layer compatible with all GPUs
Courtney Goeltzenleuchterd9dc0c72015-04-20 11:04:54 -0600989 *pLayerCount = 1;
Chia-I Wu1da4b9f2014-12-16 10:47:33 +0800990 strncpy((char *) pOutLayers[0], "MemTracker", maxStringSize);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600991 return VK_SUCCESS;
Jon Ashburnf7a08742014-11-25 11:08:42 -0700992 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700993}
994
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600995VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue(
996 VkDevice device,
997 uint32_t queueNodeIndex,
998 uint32_t queueIndex,
999 VkQueue *pQueue)
Mark Lobodzinski748eddf2015-03-31 16:05:35 -05001000{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001001 VkResult result = nextTable.GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001002 if (result == VK_SUCCESS) {
Mark Lobodzinskied450b02015-04-07 13:38:21 -05001003 loader_platform_thread_lock_mutex(&globalLock);
1004 addQueueInfo(*pQueue);
1005 loader_platform_thread_unlock_mutex(&globalLock);
1006 }
Mark Lobodzinski748eddf2015-03-31 16:05:35 -05001007 return result;
1008}
1009
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001010VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(
1011 VkQueue queue,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001012 uint32_t cmdBufferCount,
1013 const VkCmdBuffer *pCmdBuffers,
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001014 VkFence fence)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001015{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001016 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001017 // TODO : Need to track fence and clear mem references when fence clears
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001018 MT_CB_INFO* pCBInfo = NULL;
Mark Lobodzinski223ca202015-04-02 08:52:53 -05001019 uint64_t fenceId = addFenceInfo(fence, queue);
Mark Lobodzinskied450b02015-04-07 13:38:21 -05001020
Tobin Ehlis6663f492014-11-10 12:29:12 -07001021 printMemList();
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001022 printCBList();
Tobin Ehlis6663f492014-11-10 12:29:12 -07001023 for (uint32_t i = 0; i < cmdBufferCount; i++) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001024 pCBInfo = getCBInfo(pCmdBuffers[i]);
1025 pCBInfo->fenceId = fenceId;
Tobin Ehlis6663f492014-11-10 12:29:12 -07001026 }
Mark Lobodzinskied450b02015-04-07 13:38:21 -05001027
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001028 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001029 VkResult result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, getFenceFromId(fenceId));
Courtney Goeltzenleuchterd3fb9552015-04-02 13:39:07 -06001030 return result;
1031}
1032
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001033VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory(
1034 VkDevice device,
1035 const VkMemoryAllocInfo *pAllocInfo,
1036 VkDeviceMemory *pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001037{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001038 VkResult result = nextTable.AllocMemory(device, pAllocInfo, pMem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001039 // TODO : Track allocations and overall size here
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001040 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski223ca202015-04-02 08:52:53 -05001041 addMemObjInfo(*pMem, pAllocInfo);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001042 printMemList();
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001043 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001044 return result;
1045}
1046
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001047VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory(
1048 VkDevice device,
1049 VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001050{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001051 /* From spec : A memory object is freed by calling vkFreeMemory() when it is no longer needed. Before
Tobin Ehlisc0418f92014-11-25 14:47:20 -07001052 * freeing a memory object, an application must ensure the memory object is unbound from
1053 * all API objects referencing it and that it is not referenced by any queued command buffers
1054 */
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001055 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001056 bool32_t noerror = freeMemObjInfo(mem, false);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001057 printMemList();
1058 printObjList();
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001059 printCBList();
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001060 // Output an warning message for proper error/warning handling
1061 if (noerror == VK_FALSE) {
1062 char str[1024];
1063 sprintf(str, "Freeing memory object while it still has references: mem obj %p", (void*)mem);
1064 layerCbMsg(VK_DBG_MSG_WARNING, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREED_MEM_REF, "MEM", str);
1065 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001066 loader_platform_thread_unlock_mutex(&globalLock);
Mike Stroyanb050c682015-04-17 12:36:38 -06001067 VkResult result = nextTable.FreeMemory(device, mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001068 return result;
1069}
1070
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001071VK_LAYER_EXPORT VkResult VKAPI vkSetMemoryPriority(
1072 VkDevice device,
1073 VkDeviceMemory mem,
1074 VkMemoryPriority priority)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001075{
1076 // TODO : Update tracking for this alloc
1077 // Make sure memory is not pinned, which can't have priority set
Mike Stroyanb050c682015-04-17 12:36:38 -06001078 VkResult result = nextTable.SetMemoryPriority(device, mem, priority);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001079 return result;
1080}
1081
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001082VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(
1083 VkDevice device,
1084 VkDeviceMemory mem,
1085 VkDeviceSize offset,
1086 VkDeviceSize size,
1087 VkFlags flags,
1088 void **ppData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001089{
1090 // TODO : Track when memory is mapped
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001091 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001092 MT_MEM_OBJ_INFO *pMemObj = getMemObjInfo(mem);
Tony Barbourd1c35722015-04-16 15:59:00 -06001093 if ((pMemObj->allocInfo.memProps & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0) {
Mark Lobodzinski95152dc2015-02-25 12:16:04 -06001094 char str[1024];
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001095 sprintf(str, "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set: mem obj %p", (void*)mem);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001096 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_STATE, "MEM", str);
Mark Lobodzinski95152dc2015-02-25 12:16:04 -06001097 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001098 loader_platform_thread_unlock_mutex(&globalLock);
Mike Stroyanb050c682015-04-17 12:36:38 -06001099 VkResult result = nextTable.MapMemory(device, mem, offset, size, flags, ppData);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001100 return result;
1101}
1102
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001103VK_LAYER_EXPORT VkResult VKAPI vkUnmapMemory(
1104 VkDevice device,
1105 VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001106{
1107 // TODO : Track as memory gets unmapped, do we want to check what changed following map?
1108 // Make sure that memory was ever mapped to begin with
Mike Stroyanb050c682015-04-17 12:36:38 -06001109 VkResult result = nextTable.UnmapMemory(device, mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001110 return result;
1111}
1112
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001113VK_LAYER_EXPORT VkResult VKAPI vkPinSystemMemory(
1114 VkDevice device,
1115 const void *pSysMem,
1116 size_t memSize,
1117 VkDeviceMemory *pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001118{
1119 // TODO : Track this
1120 // Verify that memory is actually pinnable
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001121 VkResult result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001122 return result;
1123}
1124
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001125VK_LAYER_EXPORT VkResult VKAPI vkOpenSharedMemory(
1126 VkDevice device,
1127 const VkMemoryOpenInfo *pOpenInfo,
1128 VkDeviceMemory *pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001129{
1130 // TODO : Track this
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001131 VkResult result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001132 return result;
1133}
1134
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001135VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerMemory(
1136 VkDevice device,
1137 const VkPeerMemoryOpenInfo *pOpenInfo,
1138 VkDeviceMemory *pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001139{
1140 // TODO : Track this
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001141 VkResult result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001142 return result;
1143}
1144
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001145VK_LAYER_EXPORT VkResult VKAPI vkOpenPeerImage(
1146 VkDevice device,
1147 const VkPeerImageOpenInfo *pOpenInfo,
1148 VkImage *pImage,
1149 VkDeviceMemory *pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001150{
1151 // TODO : Track this
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001152 VkResult result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001153 return result;
1154}
1155
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001156VK_LAYER_EXPORT VkResult VKAPI vkDestroyObject(
1157 VkDevice device,
1158 VkObjectType objType,
1159 VkObject object)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001160{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001161 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001162
Tobin Ehlisa98df732014-11-27 07:52:04 -07001163 // First check if this is a CmdBuffer
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001164 if (NULL != getCBInfo((VkCmdBuffer)object)) {
1165 deleteCBInfo((VkCmdBuffer)object);
Tobin Ehlisa98df732014-11-27 07:52:04 -07001166 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001167
1168 if (objectMap.find(object) != objectMap.end()) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001169 MT_OBJ_INFO* pDelInfo = objectMap[object];
1170 if (pDelInfo->pMemObjInfo) {
Tobin Ehlisa98df732014-11-27 07:52:04 -07001171 // Wsi allocated Memory is tied to image object so clear the binding and free that memory automatically
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001172 if (0 == pDelInfo->pMemObjInfo->allocInfo.allocationSize) { // Wsi allocated memory has NULL allocInfo w/ 0 size
Tony Barbourd1c35722015-04-16 15:59:00 -06001173 VkDeviceMemory memToFree = pDelInfo->pMemObjInfo->mem;
Tobin Ehlisa98df732014-11-27 07:52:04 -07001174 clearObjectBinding(object);
Courtney Goeltzenleuchter1c943a72015-03-26 16:15:39 -06001175 freeMemObjInfo(memToFree, true);
1176 }
1177 else {
Tobin Ehlisa98df732014-11-27 07:52:04 -07001178 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001179 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 -05001180 "by calling vkBindObjectMemory(queue, %p, 0, VK_NULL_HANDLE, 0)",
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001181 object, (void*)pDelInfo->pMemObjInfo->mem, object);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001182 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_DESTROY_OBJECT_ERROR, "MEM", str);
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001183 // From the spec : If an object has previous memory binding, it is required to unbind memory
1184 // from an API object before it is destroyed.
Tobin Ehlisa98df732014-11-27 07:52:04 -07001185 clearObjectBinding(object);
1186 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001187 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001188 delete pDelInfo;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001189 objectMap.erase(object);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001190 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001191
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001192 loader_platform_thread_unlock_mutex(&globalLock);
Mike Stroyanb050c682015-04-17 12:36:38 -06001193 VkResult result = nextTable.DestroyObject(device, objType, object);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001194 return result;
1195}
1196
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001197VK_LAYER_EXPORT VkResult VKAPI vkGetObjectInfo(
1198 VkDevice device,
1199 VkObjectType objType,
1200 VkObject object,
1201 VkObjectInfoType infoType,
1202 size_t *pDataSize,
1203 void *pData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001204{
1205 // TODO : What to track here?
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001206 // Could potentially save returned mem requirements and validate values passed into BindObjectMemory for this object
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001207 // From spec : The only objects that are guaranteed to have no external memory requirements are devices, queues,
1208 // command buffers, shaders and memory objects.
Mike Stroyanb050c682015-04-17 12:36:38 -06001209 VkResult result = nextTable.GetObjectInfo(device, objType, object, infoType, pDataSize, pData);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001210 return result;
1211}
1212
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001213VK_LAYER_EXPORT VkResult VKAPI vkBindObjectMemory(
1214 VkDevice device,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001215 VkObjectType objType,
1216 VkObject object,
1217 uint32_t allocationIdx,
1218 VkDeviceMemory mem,
1219 VkDeviceSize offset)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001220{
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001221 VkResult result = nextTable.BindObjectMemory(device, objType, object, allocationIdx, mem, offset);
Mike Stroyanb050c682015-04-17 12:36:38 -06001222 loader_platform_thread_lock_mutex(&globalLock);
1223 // Track objects tied to memory
1224 if (VK_FALSE == updateObjectBinding(object, mem)) {
1225 char str[1024];
1226 sprintf(str, "Unable to set object %p binding to mem obj %p", (void*)object, (void*)mem);
1227 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1228 }
1229 printObjList();
1230 printMemList();
1231 loader_platform_thread_unlock_mutex(&globalLock);
1232 return result;
1233}
1234
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001235VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001236 VkQueue queue,
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001237 VkBuffer buffer,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001238 uint32_t allocationIdx,
1239 VkDeviceSize rangeOffset,
1240 VkDeviceSize rangeSize,
1241 VkDeviceMemory mem,
1242 VkDeviceSize memOffset)
Mike Stroyanb050c682015-04-17 12:36:38 -06001243{
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001244 VkResult result = nextTable.QueueBindSparseBufferMemory(queue, buffer, allocationIdx, rangeOffset, rangeSize, mem, memOffset);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001245 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001246 // Track objects tied to memory
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001247 if (VK_FALSE == updateObjectBinding(buffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001248 char str[1024];
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001249 sprintf(str, "Unable to set object %p binding to mem obj %p", (void*)buffer, (void*)mem);
1250 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, buffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001251 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001252 printObjList();
1253 printMemList();
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001254 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001255 return result;
1256}
1257
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001258VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(
1259 VkDevice device,
1260 const VkFenceCreateInfo *pCreateInfo,
1261 VkFence *pFence)
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001262{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001263 VkResult result = nextTable.CreateFence(device, pCreateInfo, pFence);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001264 if (VK_SUCCESS == result) {
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001265 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001266 addObjectInfo(*pFence, pCreateInfo->sType, pCreateInfo, sizeof(VkFenceCreateInfo), "fence");
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001267 loader_platform_thread_unlock_mutex(&globalLock);
1268 }
1269 return result;
1270}
1271
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001272VK_LAYER_EXPORT VkResult VKAPI vkResetFences(
1273 VkDevice device,
1274 uint32_t fenceCount,
1275 VkFence *pFences)
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001276{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001277 VkResult result = nextTable.ResetFences(device, fenceCount, pFences);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001278 if (VK_SUCCESS == result) {
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001279 loader_platform_thread_lock_mutex(&globalLock);
1280 // Reset fence state in fenceCreateInfo structure
1281 for (uint32_t i = 0; i < fenceCount; i++) {
1282 MT_OBJ_INFO* pObjectInfo = getObjectInfo(pFences[i]);
1283 if (pObjectInfo != NULL) {
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -05001284 // Validate fences in SIGNALED state
Tobin Ehlisb870cbb2015-04-15 07:46:12 -06001285 if (!(pObjectInfo->create_info.fence_create_info.flags & VK_FENCE_CREATE_SIGNALED_BIT)) {
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -05001286 char str[1024];
Mark Lobodzinskib2689212015-04-14 14:09:32 -05001287 sprintf(str, "Fence %p submitted to VkResetFences in UNSIGNALED STATE", pFences[i]);
Tobin Ehlisb870cbb2015-04-15 07:46:12 -06001288 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, pFences[i], 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", str);
1289 result = VK_ERROR_INVALID_VALUE;
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -05001290 }
1291 else {
1292 pObjectInfo->create_info.fence_create_info.flags =
Tobin Ehlisb870cbb2015-04-15 07:46:12 -06001293 static_cast<VkFenceCreateFlags>(pObjectInfo->create_info.fence_create_info.flags & ~VK_FENCE_CREATE_SIGNALED_BIT);
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -05001294 }
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001295 }
1296 }
1297 loader_platform_thread_unlock_mutex(&globalLock);
1298 }
1299 return result;
1300}
1301
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001302VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(
1303 VkDevice device,
1304 VkFence fence)
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001305{
Mike Stroyanb050c682015-04-17 12:36:38 -06001306 VkResult result = nextTable.GetFenceStatus(device, fence);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001307 if (VK_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001308 loader_platform_thread_lock_mutex(&globalLock);
1309 updateFenceTracking(fence);
1310 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001311 }
1312 return result;
1313}
1314
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001315VK_LAYER_EXPORT VkResult VKAPI vkWaitForFences(
1316 VkDevice device,
1317 uint32_t fenceCount,
1318 const VkFence *pFences,
1319 bool32_t waitAll,
1320 uint64_t timeout)
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001321{
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001322 // Verify fence status of submitted fences
1323 for(uint32_t i = 0; i < fenceCount; i++) {
1324 MT_OBJ_INFO* pObjectInfo = getObjectInfo(pFences[i]);
1325 if (pObjectInfo != NULL) {
Tobin Ehlisb870cbb2015-04-15 07:46:12 -06001326 if (pObjectInfo->create_info.fence_create_info.flags & VK_FENCE_CREATE_SIGNALED_BIT) {
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001327 char str[1024];
Mark Lobodzinskib2689212015-04-14 14:09:32 -05001328 sprintf(str, "VkWaitForFences specified fence %p already in SIGNALED state.", pFences[i]);
Tobin Ehlisb870cbb2015-04-15 07:46:12 -06001329 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 -05001330 }
1331 }
1332 }
1333
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001334 VkResult result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001335 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski50932972015-04-02 20:49:09 -05001336
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001337 if (VK_SUCCESS == result) {
Mark Lobodzinski50932972015-04-02 20:49:09 -05001338 if (waitAll || fenceCount == 1) { // Clear all the fences
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001339 for(uint32_t i = 0; i < fenceCount; i++) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001340 updateFenceTracking(pFences[i]);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001341 }
1342 }
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001343 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001344 loader_platform_thread_unlock_mutex(&globalLock);
1345 return result;
1346}
1347
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001348VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(
1349 VkQueue queue)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001350{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001351 VkResult result = nextTable.QueueWaitIdle(queue);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001352 if (VK_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001353 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski223ca202015-04-02 08:52:53 -05001354 retireQueueFences(queue);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001355 loader_platform_thread_unlock_mutex(&globalLock);
1356 }
1357 return result;
1358}
1359
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001360VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle(
1361 VkDevice device)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001362{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001363 VkResult result = nextTable.DeviceWaitIdle(device);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001364 if (VK_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001365 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski50932972015-04-02 20:49:09 -05001366 retireDeviceFences(device);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001367 loader_platform_thread_unlock_mutex(&globalLock);
1368 }
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001369 return result;
1370}
1371
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001372VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(
1373 VkDevice device,
1374 const VkEventCreateInfo *pCreateInfo,
1375 VkEvent *pEvent)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001376{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001377 VkResult result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001378 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001379 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001380 addObjectInfo(*pEvent, pCreateInfo->sType, pCreateInfo, sizeof(VkEventCreateInfo), "event");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001381 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001382 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001383 return result;
1384}
1385
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001386VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(
1387 VkDevice device,
1388 const VkQueryPoolCreateInfo *pCreateInfo,
1389 VkQueryPool *pQueryPool)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001390{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001391 VkResult result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001392 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001393 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001394 addObjectInfo(*pQueryPool, pCreateInfo->sType, pCreateInfo, sizeof(VkQueryPoolCreateInfo), "query_pool");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001395 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001396 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001397 return result;
1398}
1399
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001400VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(
1401 VkDevice device,
1402 const VkBufferCreateInfo *pCreateInfo,
1403 VkBuffer *pBuffer)
Tobin Ehlis7265e832015-01-19 08:42:29 -07001404{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001405 VkResult result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001406 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001407 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -06001408 addObjectInfo(*pBuffer, pCreateInfo->sType, pCreateInfo, sizeof(VkBufferCreateInfo), "buffer");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001409 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001410 }
Tobin Ehlis7265e832015-01-19 08:42:29 -07001411 return result;
1412}
1413
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001414VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(
1415 VkDevice device,
1416 const VkBufferViewCreateInfo *pCreateInfo,
1417 VkBufferView *pView)
Tobin Ehlis7265e832015-01-19 08:42:29 -07001418{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001419 VkResult result = nextTable.CreateBufferView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001420 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001421 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchter95487bc2015-04-14 18:48:46 -06001422 addObjectInfo(*pView, pCreateInfo->sType, pCreateInfo, sizeof(VkBufferViewCreateInfo), "buffer_view");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001423 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001424 }
Tobin Ehlis7265e832015-01-19 08:42:29 -07001425 return result;
1426}
1427
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001428VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(
1429 VkDevice device,
1430 const VkImageCreateInfo *pCreateInfo,
1431 VkImage *pImage)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001432{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001433 VkResult result = nextTable.CreateImage(device, pCreateInfo, pImage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001434 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001435 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001436 addObjectInfo(*pImage, pCreateInfo->sType, pCreateInfo, sizeof(VkImageCreateInfo), "image");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001437 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001438 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001439 return result;
1440}
1441
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001442VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(
1443 VkDevice device,
1444 const VkImageViewCreateInfo *pCreateInfo,
1445 VkImageView *pView)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001446{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001447 VkResult result = nextTable.CreateImageView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001448 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001449 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001450 addObjectInfo(*pView, pCreateInfo->sType, pCreateInfo, sizeof(VkImageViewCreateInfo), "image_view");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001451 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001452 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001453 return result;
1454}
1455
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001456VK_LAYER_EXPORT VkResult VKAPI vkCreateColorAttachmentView(
1457 VkDevice device,
1458 const VkColorAttachmentViewCreateInfo *pCreateInfo,
1459 VkColorAttachmentView *pView)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001460{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001461 VkResult result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001462 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001463 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001464 addObjectInfo(*pView, pCreateInfo->sType, pCreateInfo, sizeof(VkColorAttachmentViewCreateInfo), "color_attachment_view");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001465 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001466 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001467 return result;
1468}
1469
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001470VK_LAYER_EXPORT VkResult VKAPI vkCreateDepthStencilView(
1471 VkDevice device,
1472 const VkDepthStencilViewCreateInfo *pCreateInfo,
1473 VkDepthStencilView *pView)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001474{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001475 VkResult result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001476 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001477 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001478 addObjectInfo(*pView, pCreateInfo->sType, pCreateInfo, sizeof(VkDepthStencilViewCreateInfo), "ds_view");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001479 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001480 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001481 return result;
1482}
1483
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001484VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(
1485 VkDevice device,
1486 const VkShaderCreateInfo *pCreateInfo,
1487 VkShader *pShader)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001488{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001489 VkResult result = nextTable.CreateShader(device, pCreateInfo, pShader);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001490 return result;
1491}
1492
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001493VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline(
1494 VkDevice device,
1495 const VkGraphicsPipelineCreateInfo *pCreateInfo,
1496 VkPipeline *pPipeline)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001497{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001498 VkResult result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001499 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001500 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001501 addObjectInfo(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(VkGraphicsPipelineCreateInfo), "graphics_pipeline");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001502 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001503 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001504 return result;
1505}
1506
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001507VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelineDerivative(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001508 VkDevice device,
1509 const VkGraphicsPipelineCreateInfo *pCreateInfo,
1510 VkPipeline basePipeline,
1511 VkPipeline *pPipeline)
Courtney Goeltzenleuchter0d40f152015-03-25 15:37:49 -06001512{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001513 VkResult result = nextTable.CreateGraphicsPipelineDerivative(device, pCreateInfo, basePipeline, pPipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001514 if (result == VK_SUCCESS) {
Courtney Goeltzenleuchter0d40f152015-03-25 15:37:49 -06001515 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001516 addObjectInfo(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(VkGraphicsPipelineCreateInfo), "graphics_pipeline");
Courtney Goeltzenleuchter0d40f152015-03-25 15:37:49 -06001517 loader_platform_thread_unlock_mutex(&globalLock);
1518 }
1519 return result;
1520}
1521
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001522VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipeline(
1523 VkDevice device,
1524 const VkComputePipelineCreateInfo *pCreateInfo,
1525 VkPipeline *pPipeline)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001526{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001527 VkResult result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001528 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001529 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001530 addObjectInfo(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(VkComputePipelineCreateInfo), "compute_pipeline");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001531 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001532 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001533 return result;
1534}
1535
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001536VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(
1537 VkDevice device,
1538 const VkSamplerCreateInfo *pCreateInfo,
1539 VkSampler *pSampler)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001540{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001541 VkResult result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001542 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001543 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001544 addObjectInfo(*pSampler, pCreateInfo->sType, pCreateInfo, sizeof(VkSamplerCreateInfo), "sampler");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001545 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001546 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001547 return result;
1548}
1549
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001550VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(
1551 VkDevice device,
1552 const VkDynamicVpStateCreateInfo *pCreateInfo,
1553 VkDynamicVpState *pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001554{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001555 VkResult result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001556 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001557 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001558 addObjectInfo(*pState, pCreateInfo->sType, pCreateInfo, sizeof(VkDynamicVpStateCreateInfo), "viewport_state");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001559 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001560 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001561 return result;
1562}
1563
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001564VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterState(
1565 VkDevice device,
1566 const VkDynamicRsStateCreateInfo *pCreateInfo,
1567 VkDynamicRsState *pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001568{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001569 VkResult result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001570 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001571 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001572 addObjectInfo(*pState, pCreateInfo->sType, pCreateInfo, sizeof(VkDynamicRsStateCreateInfo), "raster_state");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001573 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001574 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001575 return result;
1576}
1577
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001578VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState(
1579 VkDevice device,
1580 const VkDynamicCbStateCreateInfo *pCreateInfo,
1581 VkDynamicCbState *pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001582{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001583 VkResult result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001584 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001585 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001586 addObjectInfo(*pState, pCreateInfo->sType, pCreateInfo, sizeof(VkDynamicCbStateCreateInfo), "cb_state");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001587 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001588 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001589 return result;
1590}
1591
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001592VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState(
1593 VkDevice device,
1594 const VkDynamicDsStateCreateInfo *pCreateInfo,
1595 VkDynamicDsState *pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001596{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001597 VkResult result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001598 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001599 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001600 addObjectInfo(*pState, pCreateInfo->sType, pCreateInfo, sizeof(VkDynamicDsStateCreateInfo), "ds_state");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001601 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001602 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001603 return result;
1604}
1605
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001606VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(
1607 VkDevice device,
1608 const VkCmdBufferCreateInfo *pCreateInfo,
1609 VkCmdBuffer *pCmdBuffer)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001610{
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001611 VkResult result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Mark Lobodzinski223ca202015-04-02 08:52:53 -05001612 // At time of cmd buffer creation, create global cmd buffer info for the returned cmd buffer
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001613 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001614 if (*pCmdBuffer)
Mark Lobodzinski223ca202015-04-02 08:52:53 -05001615 addCBInfo(*pCmdBuffer);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001616 printCBList();
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001617 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001618 return result;
1619}
1620
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001621VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(
1622 VkCmdBuffer cmdBuffer,
1623 const VkCmdBufferBeginInfo *pBeginInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001624{
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001625 // This implicitly resets the Cmd Buffer so make sure any fence is done and then clear memory references
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001626 MT_CB_INFO* pCBInfo = getCBInfo(cmdBuffer);
1627 if (pCBInfo && (!fenceRetired(pCBInfo->fenceId))) {
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001628 bool32_t cbDone = checkCBCompleted(cmdBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001629 if (VK_FALSE == cbDone) {
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001630 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001631 sprintf(str, "Calling vkBeginCommandBuffer() on active CB %p before it has completed. "
1632 "You must check CB flag before this call.", cmdBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001633 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 -07001634 }
1635 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001636 VkResult result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001637 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001638 freeCBBindings(cmdBuffer);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001639 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001640 return result;
1641}
1642
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001643VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(
1644 VkCmdBuffer cmdBuffer)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001645{
1646 // TODO : Anything to do here?
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001647 VkResult result = nextTable.EndCommandBuffer(cmdBuffer);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001648 return result;
1649}
1650
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001651VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(
1652 VkCmdBuffer cmdBuffer)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001653{
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001654 // Verify that CB is complete (not in-flight)
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001655 MT_CB_INFO* pCBInfo = getCBInfo(cmdBuffer);
1656 if (pCBInfo && (!fenceRetired(pCBInfo->fenceId))) {
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001657 bool32_t cbDone = checkCBCompleted(cmdBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001658 if (VK_FALSE == cbDone) {
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001659 char str[1024];
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001660 sprintf(str, "Resetting CB %p before it has completed. You must check CB flag before "
1661 "calling vkResetCommandBuffer().", cmdBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001662 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 -07001663 }
1664 }
1665 // Clear memory references as this point.
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001666 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001667 freeCBBindings(cmdBuffer);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001668 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001669 VkResult result = nextTable.ResetCommandBuffer(cmdBuffer);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001670 return result;
1671}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001672// TODO : For any vkCmdBind* calls that include an object which has mem bound to it,
Tobin Ehlis6663f492014-11-10 12:29:12 -07001673// need to account for that mem now having binding to given cmdBuffer
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001674VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(
1675 VkCmdBuffer cmdBuffer,
1676 VkPipelineBindPoint pipelineBindPoint,
1677 VkPipeline pipeline)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001678{
Tobin Ehlisc145be82015-01-08 15:22:32 -07001679#if 0
1680 // TODO : If memory bound to pipeline, then need to tie that mem to cmdBuffer
1681 if (getPipeline(pipeline)) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001682 MT_CB_INFO *pCBInfo = getCBInfo(cmdBuffer);
1683 if (pCBInfo) {
1684 pCBInfo->pipelines[pipelineBindPoint] = pipeline;
Tobin Ehlisc145be82015-01-08 15:22:32 -07001685 } else {
1686 char str[1024];
1687 sprintf(str, "Attempt to bind Pipeline %p to non-existant command buffer %p!", (void*)pipeline, cmdBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001688 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 -07001689 }
1690 }
1691 else {
1692 char str[1024];
1693 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001694 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 -07001695 }
1696#endif
Tobin Ehlis6663f492014-11-10 12:29:12 -07001697 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1698}
1699
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001700VK_LAYER_EXPORT void VKAPI vkCmdBindDynamicStateObject(
1701 VkCmdBuffer cmdBuffer,
1702 VkStateBindPoint stateBindPoint,
1703 VkDynamicStateObject state)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001704{
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001705 MT_OBJ_INFO *pObjInfo;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001706 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001707 MT_CB_INFO *pCmdBuf = getCBInfo(cmdBuffer);
Tobin Ehlisc145be82015-01-08 15:22:32 -07001708 if (!pCmdBuf) {
1709 char str[1024];
1710 sprintf(str, "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001711 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, "DD", str);
Tobin Ehlisc145be82015-01-08 15:22:32 -07001712 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001713 pObjInfo = getObjectInfo(state);
1714 if (!pObjInfo) {
Tobin Ehlisc145be82015-01-08 15:22:32 -07001715 char str[1024];
1716 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001717 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, state, 0, MEMTRACK_INVALID_OBJECT, "DD", str);
Tobin Ehlisc145be82015-01-08 15:22:32 -07001718 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001719 pCmdBuf->pDynamicState[stateBindPoint] = pObjInfo;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001720 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001721 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001722}
1723
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001724VK_LAYER_EXPORT void VKAPI vkCmdBindDescriptorSets(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001725 VkCmdBuffer cmdBuffer,
1726 VkPipelineBindPoint pipelineBindPoint,
1727 uint32_t firstSet,
1728 uint32_t setCount,
1729 const VkDescriptorSet *pDescriptorSets,
1730 uint32_t dynamicOffsetCount,
1731 const uint32_t *pDynamicOffsets)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001732{
Tobin Ehlisc145be82015-01-08 15:22:32 -07001733 // 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 -06001734 nextTable.CmdBindDescriptorSets(cmdBuffer, pipelineBindPoint, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001735}
1736
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06001737VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001738 VkCmdBuffer cmdBuffer,
1739 uint32_t startBinding,
1740 uint32_t bindingCount,
1741 const VkBuffer *pBuffers,
1742 const VkDeviceSize *pOffsets)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001743{
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06001744 nextTable.CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Chia-I Wu19156822015-01-05 13:42:56 +08001745}
1746
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001747VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(
1748 VkCmdBuffer cmdBuffer,
1749 VkBuffer buffer,
1750 VkDeviceSize offset,
1751 VkIndexType indexType)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001752{
Tobin Ehlis7265e832015-01-19 08:42:29 -07001753 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001754}
1755
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001756VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(
1757 VkCmdBuffer cmdBuffer,
1758 VkBuffer buffer,
1759 VkDeviceSize offset,
1760 uint32_t count,
1761 uint32_t stride)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001762{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001763 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001764 VkDeviceMemory mem = getMemBindingFromObject(buffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001765 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001766 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001767 sprintf(str, "In vkCmdDrawIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
1768 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001769 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001770 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001771 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001772}
1773
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001774VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(
1775 VkCmdBuffer cmdBuffer,
1776 VkBuffer buffer,
1777 VkDeviceSize offset,
1778 uint32_t count,
1779 uint32_t stride)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001780{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001781 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001782 VkDeviceMemory mem = getMemBindingFromObject(buffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001783 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001784 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001785 sprintf(str, "In vkCmdDrawIndexedIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
1786 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001787 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001788 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001789 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001790}
1791
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001792VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(
1793 VkCmdBuffer cmdBuffer,
1794 VkBuffer buffer,
1795 VkDeviceSize offset)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001796{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001797 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001798 VkDeviceMemory mem = getMemBindingFromObject(buffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001799 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001800 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001801 sprintf(str, "In vkCmdDispatchIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
1802 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001803 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001804 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001805 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001806}
1807
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001808VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(
1809 VkCmdBuffer cmdBuffer,
1810 VkBuffer srcBuffer,
1811 VkBuffer destBuffer,
1812 uint32_t regionCount,
1813 const VkBufferCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001814{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001815 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001816 VkDeviceMemory 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 vkCmdCopyBuffer() 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 Lobodzinskic52b7752015-02-18 16:38:17 -06001822 mem = getMemBindingFromObject(destBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001823 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001824 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001825 sprintf(str, "In vkCmdCopyBuffer() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
1826 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001827 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001828 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001829 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001830}
1831
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001832VK_LAYER_EXPORT void VKAPI vkCmdCopyImage(
1833 VkCmdBuffer cmdBuffer,
1834 VkImage srcImage,
1835 VkImageLayout srcImageLayout,
1836 VkImage destImage,
1837 VkImageLayout destImageLayout,
1838 uint32_t regionCount,
1839 const VkImageCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001840{
1841 // TODO : Each image will have mem mapping so track them
Courtney Goeltzenleuchterb3efe9b2015-03-25 11:25:10 -06001842 nextTable.CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001843}
1844
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001845VK_LAYER_EXPORT void VKAPI vkCmdBlitImage(
1846 VkCmdBuffer cmdBuffer,
1847 VkImage srcImage,
1848 VkImageLayout srcImageLayout,
1849 VkImage destImage,
1850 VkImageLayout destImageLayout,
1851 uint32_t regionCount,
1852 const VkImageBlit *pRegions)
Courtney Goeltzenleuchter89299fa2015-03-08 17:02:18 -06001853{
1854 // TODO : Each image will have mem mapping so track them
Courtney Goeltzenleuchterb3efe9b2015-03-25 11:25:10 -06001855 nextTable.CmdBlitImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Courtney Goeltzenleuchter89299fa2015-03-08 17:02:18 -06001856}
1857
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001858VK_LAYER_EXPORT void VKAPI vkCmdCopyBufferToImage(
1859 VkCmdBuffer cmdBuffer,
1860 VkBuffer srcBuffer,
1861 VkImage destImage,
1862 VkImageLayout destImageLayout,
1863 uint32_t regionCount,
1864 const VkBufferImageCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001865{
1866 // TODO : Track this
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001867 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001868 VkDeviceMemory mem = getMemBindingFromObject(destImage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001869 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001870 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001871 sprintf(str, "In vkCmdCopyMemoryToImage() call unable to update binding of destImage buffer %p to cmdBuffer %p", destImage, cmdBuffer);
1872 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001873 }
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001874
1875 mem = getMemBindingFromObject(srcBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001876 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001877 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001878 sprintf(str, "In vkCmdCopyMemoryToImage() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer);
1879 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001880 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001881 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterb3efe9b2015-03-25 11:25:10 -06001882 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001883}
1884
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001885VK_LAYER_EXPORT void VKAPI vkCmdCopyImageToBuffer(
1886 VkCmdBuffer cmdBuffer,
1887 VkImage srcImage,
1888 VkImageLayout srcImageLayout,
1889 VkBuffer destBuffer,
1890 uint32_t regionCount,
1891 const VkBufferImageCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001892{
1893 // TODO : Track this
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001894 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001895 VkDeviceMemory mem = getMemBindingFromObject(srcImage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001896 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001897 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001898 sprintf(str, "In vkCmdCopyImageToMemory() call unable to update binding of srcImage buffer %p to cmdBuffer %p", srcImage, cmdBuffer);
1899 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001900 }
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001901 mem = getMemBindingFromObject(destBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001902 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001903 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001904 sprintf(str, "In vkCmdCopyImageToMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
1905 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001906 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001907 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterb3efe9b2015-03-25 11:25:10 -06001908 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001909}
1910
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001911VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(
1912 VkCmdBuffer cmdBuffer,
1913 VkBuffer destBuffer,
1914 VkDeviceSize destOffset,
1915 VkDeviceSize dataSize,
1916 const uint32_t *pData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001917{
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(destBuffer);
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 vkCmdUpdateMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, 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);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001926 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001927}
1928
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001929VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(
1930 VkCmdBuffer cmdBuffer,
1931 VkBuffer destBuffer,
1932 VkDeviceSize destOffset,
1933 VkDeviceSize fillSize,
1934 uint32_t data)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001935{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001936 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001937 VkDeviceMemory mem = getMemBindingFromObject(destBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001938 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001939 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001940 sprintf(str, "In vkCmdFillMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
1941 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001942 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001943 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis7265e832015-01-19 08:42:29 -07001944 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001945}
1946
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001947VK_LAYER_EXPORT void VKAPI vkCmdClearColorImage(
1948 VkCmdBuffer cmdBuffer,
1949 VkImage image,
1950 VkImageLayout imageLayout,
Courtney Goeltzenleuchterd7a5cff2015-04-23 17:49:22 -06001951 const VkClearColor *pColor,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001952 uint32_t rangeCount,
1953 const VkImageSubresourceRange *pRanges)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001954{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001955 // TODO : Verify memory is in VK_IMAGE_STATE_CLEAR state
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001956 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001957 VkDeviceMemory mem = getMemBindingFromObject(image);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001958 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001959 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001960 sprintf(str, "In vkCmdClearColorImage() call unable to update binding of image buffer %p to cmdBuffer %p", image, cmdBuffer);
1961 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001962 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001963 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchterd7a5cff2015-04-23 17:49:22 -06001964 nextTable.CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001965}
1966
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001967VK_LAYER_EXPORT void VKAPI vkCmdClearDepthStencil(
1968 VkCmdBuffer cmdBuffer,
1969 VkImage image,
1970 VkImageLayout imageLayout,
1971 float depth,
1972 uint32_t stencil,
1973 uint32_t rangeCount,
1974 const VkImageSubresourceRange *pRanges)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001975{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001976 // TODO : Verify memory is in VK_IMAGE_STATE_CLEAR state
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(image);
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 vkCmdClearDepthStencil() call unable to update binding of image buffer %p to cmdBuffer %p", image, 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);
Courtney Goeltzenleuchterb3efe9b2015-03-25 11:25:10 -06001985 nextTable.CmdClearDepthStencil(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001986}
1987
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001988VK_LAYER_EXPORT void VKAPI vkCmdResolveImage(
1989 VkCmdBuffer cmdBuffer,
1990 VkImage srcImage,
1991 VkImageLayout srcImageLayout,
1992 VkImage destImage,
1993 VkImageLayout destImageLayout,
1994 uint32_t regionCount,
1995 const VkImageResolve *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001996{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001997 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06001998 VkDeviceMemory mem = getMemBindingFromObject(srcImage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001999 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002000 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002001 sprintf(str, "In vkCmdResolveImage() call unable to update binding of srcImage buffer %p to cmdBuffer %p", srcImage, cmdBuffer);
2002 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002003 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002004 mem = getMemBindingFromObject(destImage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002005 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002006 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002007 sprintf(str, "In vkCmdResolveImage() call unable to update binding of destImage buffer %p to cmdBuffer %p", destImage, cmdBuffer);
2008 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002009 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002010 loader_platform_thread_unlock_mutex(&globalLock);
Tony Barbour6865d4a2015-04-13 15:02:52 -06002011 nextTable.CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002012}
2013
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002014VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(
2015 VkCmdBuffer cmdBuffer,
2016 VkQueryPool queryPool,
2017 uint32_t slot,
2018 VkFlags flags)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002019{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002020 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06002021 VkDeviceMemory mem = getMemBindingFromObject(queryPool);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002022 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002023 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002024 sprintf(str, "In vkCmdBeginQuery() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer);
2025 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002026 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002027 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002028 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
2029}
2030
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002031VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(
2032 VkCmdBuffer cmdBuffer,
2033 VkQueryPool queryPool,
2034 uint32_t slot)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002035{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002036 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06002037 VkDeviceMemory mem = getMemBindingFromObject(queryPool);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002038 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002039 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002040 sprintf(str, "In vkCmdEndQuery() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer);
2041 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002042 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002043 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002044 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
2045}
2046
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002047VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(
2048 VkCmdBuffer cmdBuffer,
2049 VkQueryPool queryPool,
2050 uint32_t startQuery,
2051 uint32_t queryCount)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002052{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002053 loader_platform_thread_lock_mutex(&globalLock);
Tony Barbourd1c35722015-04-16 15:59:00 -06002054 VkDeviceMemory mem = getMemBindingFromObject(queryPool);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002055 if (VK_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002056 char str[1024];
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002057 sprintf(str, "In vkCmdResetQueryPool() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer);
2058 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002059 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002060 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002061 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
2062}
2063
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002064VK_LAYER_EXPORT VkResult VKAPI vkDbgRegisterMsgCallback(
2065 VkInstance instance,
2066 VK_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback,
2067 void *pUserData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002068{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002069 // This layer intercepts callbacks
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002070 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 -07002071 if (!pNewDbgFuncNode)
Tony Barbourd1c35722015-04-16 15:59:00 -06002072 return VK_ERROR_OUT_OF_HOST_MEMORY;
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002073 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
2074 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07002075 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
2076 g_pDbgFunctionHead = pNewDbgFuncNode;
Jon Ashburna8aa8372015-03-03 15:07:15 -07002077 // force callbacks if DebugAction hasn't been set already other than initial value
Courtney Goeltzenleuchter90d93202015-03-04 15:47:34 -07002078 if (g_actionIsDefault) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002079 g_debugAction = VK_DBG_LAYER_ACTION_CALLBACK;
Courtney Goeltzenleuchter90d93202015-03-04 15:47:34 -07002080 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002081 VkResult result = nextTable.DbgRegisterMsgCallback(instance, pfnMsgCallback, pUserData);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002082 return result;
2083}
2084
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002085VK_LAYER_EXPORT VkResult VKAPI vkDbgUnregisterMsgCallback(
2086 VkInstance instance,
2087 VK_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002088{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002089 VK_LAYER_DBG_FUNCTION_NODE *pInfo = g_pDbgFunctionHead;
2090 VK_LAYER_DBG_FUNCTION_NODE *pPrev = pInfo;
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05002091 while (pInfo) {
2092 if (pInfo->pfnMsgCallback == pfnMsgCallback) {
2093 pPrev->pNext = pInfo->pNext;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002094 if (g_pDbgFunctionHead == pInfo) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05002095 g_pDbgFunctionHead = pInfo->pNext;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002096 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05002097 free(pInfo);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002098 break;
2099 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05002100 pPrev = pInfo;
2101 pInfo = pInfo->pNext;
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002102 }
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002103 if (g_pDbgFunctionHead == NULL) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05002104 if (g_actionIsDefault) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002105 g_debugAction = VK_DBG_LAYER_ACTION_LOG_MSG;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05002106 } else {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002107 g_debugAction = (VK_LAYER_DBG_ACTION)(g_debugAction & ~((uint32_t)VK_DBG_LAYER_ACTION_CALLBACK));
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05002108 }
Jon Ashburna8aa8372015-03-03 15:07:15 -07002109 }
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002110 VkResult result = nextTable.DbgUnregisterMsgCallback(instance, pfnMsgCallback);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002111 return result;
2112}
2113
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002114VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI(
2115 VkDevice device,
2116 const VkSwapChainCreateInfoWSI *pCreateInfo,
2117 VkSwapChainWSI *pSwapChain)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002118{
Chia-I Wuf8693382015-04-16 22:02:10 +08002119 VkResult result = nextTable.CreateSwapChainWSI(device, pCreateInfo, pSwapChain);
2120
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002121 if (VK_SUCCESS == result) {
Chia-I Wuf8693382015-04-16 22:02:10 +08002122 loader_platform_thread_lock_mutex(&globalLock);
2123 addSwapChainInfo(*pSwapChain);
2124 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002125 }
Chia-I Wuf8693382015-04-16 22:02:10 +08002126
Tobin Ehlis6663f492014-11-10 12:29:12 -07002127 return result;
2128}
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002129
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002130VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapChainWSI(
2131 VkSwapChainWSI swapChain)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002132{
2133 loader_platform_thread_lock_mutex(&globalLock);
Chia-I Wuf8693382015-04-16 22:02:10 +08002134
2135 if (swapChainMap.find(swapChain) != swapChainMap.end()) {
2136 MT_SWAP_CHAIN_INFO* pInfo = swapChainMap[swapChain];
2137
David Pinedod8f83d82015-04-27 16:36:17 -06002138 if (pInfo->images.size() > 0) {
2139 for (std::vector<VkSwapChainImageInfoWSI>::const_iterator it = pInfo->images.begin();
2140 it != pInfo->images.end(); it++) {
2141 clearObjectBinding(it->image);
2142 freeMemObjInfo(it->memory, true);
Chia-I Wuf8693382015-04-16 22:02:10 +08002143
David Pinedod8f83d82015-04-27 16:36:17 -06002144 MT_OBJ_INFO* pDelInfo = objectMap[it->image];
2145 delete pDelInfo;
2146 objectMap.erase(it->image);
2147 }
Chia-I Wuf8693382015-04-16 22:02:10 +08002148 }
2149
2150 delete pInfo;
2151 swapChainMap.erase(swapChain);
2152 }
2153
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002154 loader_platform_thread_unlock_mutex(&globalLock);
Chia-I Wuf8693382015-04-16 22:02:10 +08002155
2156 return nextTable.DestroySwapChainWSI(swapChain);
2157}
2158
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002159VK_LAYER_EXPORT VkResult VKAPI vkGetSwapChainInfoWSI(
2160 VkSwapChainWSI swapChain,
2161 VkSwapChainInfoTypeWSI infoType,
2162 size_t *pDataSize,
2163 void *pData)
Chia-I Wuf8693382015-04-16 22:02:10 +08002164{
2165 VkResult result = nextTable.GetSwapChainInfoWSI(swapChain, infoType, pDataSize, pData);
2166
2167 if (infoType == VK_SWAP_CHAIN_INFO_TYPE_PERSISTENT_IMAGES_WSI && result == VK_SUCCESS) {
2168 const size_t count = *pDataSize / sizeof(VkSwapChainImageInfoWSI);
2169 MT_SWAP_CHAIN_INFO *pInfo = swapChainMap[swapChain];
2170
2171 if (pInfo->images.empty()) {
2172 pInfo->images.resize(count);
2173 memcpy(&pInfo->images[0], pData, sizeof(pInfo->images[0]) * count);
2174
David Pinedod8f83d82015-04-27 16:36:17 -06002175 if (pInfo->images.size() > 0) {
2176 for (std::vector<VkSwapChainImageInfoWSI>::const_iterator it = pInfo->images.begin();
2177 it != pInfo->images.end(); it++) {
2178 // Add image object, then insert the new Mem Object and then bind it to created image
2179 addObjectInfo(it->image, VK_STRUCTURE_TYPE_MAX_ENUM, &pInfo->createInfo, sizeof(pInfo->createInfo), "persistent_image");
2180 addMemObjInfo(it->memory, NULL);
2181 if (VK_FALSE == updateObjectBinding(it->image, it->memory)) {
2182 char str[1024];
2183 sprintf(str, "In vkGetSwapChainInfoWSI(), unable to set image %p binding to mem obj %p", (void*)it->image, (void*)it->memory);
2184 layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, it->image, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
2185 }
Chia-I Wuf8693382015-04-16 22:02:10 +08002186 }
2187 }
2188 } else {
2189 const bool mismatch = (pInfo->images.size() != count ||
2190 memcmp(&pInfo->images[0], pData, sizeof(pInfo->images[0]) * count));
2191
2192 if (mismatch) {
2193 char str[1024];
2194 sprintf(str, "vkGetSwapChainInfoWSI(%p, VK_SWAP_CHAIN_INFO_TYPE_PERSISTENT_IMAGES_WSI) returned mismatching data", swapChain);
Mike Stroyanb050c682015-04-17 12:36:38 -06002195 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 +08002196 }
2197 }
2198 }
2199
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002200 return result;
2201}
Tobin Ehlis6663f492014-11-10 12:29:12 -07002202
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002203VK_LAYER_EXPORT void* VKAPI vkGetProcAddr(
2204 VkPhysicalDevice gpu,
2205 const char *funcName)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002206{
Jon Ashburnbacb0f52015-04-06 10:58:22 -06002207 VkBaseLayerObject* gpuw = (VkBaseLayerObject *) gpu;
Chia-I Wu4d11dcc2015-01-05 13:18:57 +08002208
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002209 if (gpu == NULL) {
Tobin Ehlis6663f492014-11-10 12:29:12 -07002210 return NULL;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002211 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002212 pCurObj = gpuw;
Ian Elliott2d4ab1e2015-01-13 17:52:38 -07002213 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002214
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002215 if (!strcmp(funcName, "vkGetProcAddr"))
2216 return (void *) vkGetProcAddr;
2217 if (!strcmp(funcName, "vkCreateDevice"))
2218 return (void*) vkCreateDevice;
2219 if (!strcmp(funcName, "vkDestroyDevice"))
2220 return (void*) vkDestroyDevice;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002221 if (!strcmp(funcName, "vkEnumerateLayers"))
2222 return (void*) vkEnumerateLayers;
2223 if (!strcmp(funcName, "vkQueueSubmit"))
2224 return (void*) vkQueueSubmit;
2225 if (!strcmp(funcName, "vkAllocMemory"))
2226 return (void*) vkAllocMemory;
2227 if (!strcmp(funcName, "vkFreeMemory"))
2228 return (void*) vkFreeMemory;
2229 if (!strcmp(funcName, "vkSetMemoryPriority"))
2230 return (void*) vkSetMemoryPriority;
2231 if (!strcmp(funcName, "vkMapMemory"))
2232 return (void*) vkMapMemory;
2233 if (!strcmp(funcName, "vkUnmapMemory"))
2234 return (void*) vkUnmapMemory;
2235 if (!strcmp(funcName, "vkPinSystemMemory"))
2236 return (void*) vkPinSystemMemory;
2237 if (!strcmp(funcName, "vkOpenSharedMemory"))
2238 return (void*) vkOpenSharedMemory;
2239 if (!strcmp(funcName, "vkOpenPeerMemory"))
2240 return (void*) vkOpenPeerMemory;
2241 if (!strcmp(funcName, "vkOpenPeerImage"))
2242 return (void*) vkOpenPeerImage;
2243 if (!strcmp(funcName, "vkDestroyObject"))
2244 return (void*) vkDestroyObject;
2245 if (!strcmp(funcName, "vkGetObjectInfo"))
2246 return (void*) vkGetObjectInfo;
Mark Lobodzinski942b1722015-05-11 17:21:15 -05002247 if (!strcmp(funcName, "vkBindObjectMemory"))
2248 return (void*) vkBindObjectMemory;
2249 if (!strcmp(funcName, "vkQueueBindSparseBufferMemory"))
2250 return (void*) vkQueueBindSparseBufferMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002251 if (!strcmp(funcName, "vkCreateFence"))
2252 return (void*) vkCreateFence;
2253 if (!strcmp(funcName, "vkGetFenceStatus"))
2254 return (void*) vkGetFenceStatus;
2255 if (!strcmp(funcName, "vkResetFences"))
2256 return (void*) vkResetFences;
2257 if (!strcmp(funcName, "vkWaitForFences"))
2258 return (void*) vkWaitForFences;
2259 if (!strcmp(funcName, "vkQueueWaitIdle"))
2260 return (void*) vkQueueWaitIdle;
2261 if (!strcmp(funcName, "vkDeviceWaitIdle"))
2262 return (void*) vkDeviceWaitIdle;
2263 if (!strcmp(funcName, "vkCreateEvent"))
2264 return (void*) vkCreateEvent;
2265 if (!strcmp(funcName, "vkCreateQueryPool"))
2266 return (void*) vkCreateQueryPool;
2267 if (!strcmp(funcName, "vkCreateBuffer"))
2268 return (void*) vkCreateBuffer;
2269 if (!strcmp(funcName, "vkCreateBufferView"))
2270 return (void*) vkCreateBufferView;
2271 if (!strcmp(funcName, "vkCreateImage"))
2272 return (void*) vkCreateImage;
2273 if (!strcmp(funcName, "vkCreateImageView"))
2274 return (void*) vkCreateImageView;
2275 if (!strcmp(funcName, "vkCreateColorAttachmentView"))
2276 return (void*) vkCreateColorAttachmentView;
2277 if (!strcmp(funcName, "vkCreateDepthStencilView"))
2278 return (void*) vkCreateDepthStencilView;
2279 if (!strcmp(funcName, "vkCreateShader"))
2280 return (void*) vkCreateShader;
2281 if (!strcmp(funcName, "vkCreateGraphicsPipeline"))
2282 return (void*) vkCreateGraphicsPipeline;
2283 if (!strcmp(funcName, "vkCreateGraphicsPipelineDerivative"))
2284 return (void*) vkCreateGraphicsPipelineDerivative;
2285 if (!strcmp(funcName, "vkCreateComputePipeline"))
2286 return (void*) vkCreateComputePipeline;
2287 if (!strcmp(funcName, "vkCreateSampler"))
2288 return (void*) vkCreateSampler;
2289 if (!strcmp(funcName, "vkCreateDynamicViewportState"))
2290 return (void*) vkCreateDynamicViewportState;
2291 if (!strcmp(funcName, "vkCreateDynamicRasterState"))
2292 return (void*) vkCreateDynamicRasterState;
2293 if (!strcmp(funcName, "vkCreateDynamicColorBlendState"))
2294 return (void*) vkCreateDynamicColorBlendState;
2295 if (!strcmp(funcName, "vkCreateDynamicDepthStencilState"))
2296 return (void*) vkCreateDynamicDepthStencilState;
2297 if (!strcmp(funcName, "vkCreateCommandBuffer"))
2298 return (void*) vkCreateCommandBuffer;
2299 if (!strcmp(funcName, "vkBeginCommandBuffer"))
2300 return (void*) vkBeginCommandBuffer;
2301 if (!strcmp(funcName, "vkEndCommandBuffer"))
2302 return (void*) vkEndCommandBuffer;
2303 if (!strcmp(funcName, "vkResetCommandBuffer"))
2304 return (void*) vkResetCommandBuffer;
2305 if (!strcmp(funcName, "vkCmdBindPipeline"))
2306 return (void*) vkCmdBindPipeline;
2307 if (!strcmp(funcName, "vkCmdBindDynamicStateObject"))
2308 return (void*) vkCmdBindDynamicStateObject;
2309 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
2310 return (void*) vkCmdBindDescriptorSets;
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06002311 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
2312 return (void*) vkCmdBindVertexBuffers;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002313 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
2314 return (void*) vkCmdBindIndexBuffer;
2315 if (!strcmp(funcName, "vkCmdDrawIndirect"))
2316 return (void*) vkCmdDrawIndirect;
2317 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
2318 return (void*) vkCmdDrawIndexedIndirect;
2319 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
2320 return (void*) vkCmdDispatchIndirect;
2321 if (!strcmp(funcName, "vkCmdCopyBuffer"))
2322 return (void*) vkCmdCopyBuffer;
2323 if (!strcmp(funcName, "vkCmdCopyImage"))
2324 return (void*) vkCmdCopyImage;
2325 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
2326 return (void*) vkCmdCopyBufferToImage;
2327 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
2328 return (void*) vkCmdCopyImageToBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002329 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
2330 return (void*) vkCmdUpdateBuffer;
2331 if (!strcmp(funcName, "vkCmdFillBuffer"))
2332 return (void*) vkCmdFillBuffer;
2333 if (!strcmp(funcName, "vkCmdClearColorImage"))
2334 return (void*) vkCmdClearColorImage;
2335 if (!strcmp(funcName, "vkCmdClearDepthStencil"))
2336 return (void*) vkCmdClearDepthStencil;
2337 if (!strcmp(funcName, "vkCmdResolveImage"))
2338 return (void*) vkCmdResolveImage;
2339 if (!strcmp(funcName, "vkCmdBeginQuery"))
2340 return (void*) vkCmdBeginQuery;
2341 if (!strcmp(funcName, "vkCmdEndQuery"))
2342 return (void*) vkCmdEndQuery;
2343 if (!strcmp(funcName, "vkCmdResetQueryPool"))
2344 return (void*) vkCmdResetQueryPool;
2345 if (!strcmp(funcName, "vkDbgRegisterMsgCallback"))
2346 return (void*) vkDbgRegisterMsgCallback;
2347 if (!strcmp(funcName, "vkDbgUnregisterMsgCallback"))
2348 return (void*) vkDbgUnregisterMsgCallback;
2349 if (!strcmp(funcName, "vkGetDeviceQueue"))
2350 return (void*) vkGetDeviceQueue;
Chia-I Wuf8693382015-04-16 22:02:10 +08002351 if (!strcmp(funcName, "vkCreateSwapChainWSI"))
2352 return (void*) vkCreateSwapChainWSI;
2353 if (!strcmp(funcName, "vkDestroySwapChainWSI"))
2354 return (void*) vkDestroySwapChainWSI;
2355 if (!strcmp(funcName, "vkGetSwapChainInfoWSI"))
2356 return (void*) vkGetSwapChainInfoWSI;
Tobin Ehlis6663f492014-11-10 12:29:12 -07002357 else {
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002358 if (gpuw->pGPA == NULL) {
Tobin Ehlis6663f492014-11-10 12:29:12 -07002359 return NULL;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002360 }
Tony Barbourd1c35722015-04-16 15:59:00 -06002361 return gpuw->pGPA((VkPhysicalDevice)gpuw->nextObject, funcName);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002362 }
2363}