blob: 36574f60cd8d73f5aae65ba1a6b5786302b210ec [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>
Mark Lobodzinski76c991d2015-05-20 16:16:37 -050031#include <map>
Chia-I Wuf8693382015-04-16 22:02:10 +080032#include <vector>
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050033using namespace std;
34
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060035#include "vk_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"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060039#include "vk_layer_config.h"
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -060040#include "vk_layer_extension_utils.h"
Ian Elliott655cad72015-02-12 17:08:34 -070041// The following is #included again to catch certain OS-specific functions
42// being used:
Tobin Ehlisb835d1b2015-07-03 10:34:49 -060043#include "vk_loader_platform.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060044#include "vk_layer_table.h"
45#include "vk_layer_data.h"
46#include "vk_layer_logging.h"
Courtney Goeltzenleuchterd54749c2015-07-05 11:17:01 -060047static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce);
Mark Lobodzinski76c991d2015-05-20 16:16:37 -050048
Mark Lobodzinski348803a2015-09-11 15:56:51 -060049// WSI Image Objects bypass usual Image Object creation methods. A special Memory
50// Object value will be used to identify them internally.
51static const VkDeviceMemory MEMTRACKER_SWAP_CHAIN_IMAGE_KEY = static_cast<VkDeviceMemory>(-1);
52
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -060053typedef struct _layer_data {
54 debug_report_data *report_data;
55 // TODO: put instance data here
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -060056 VkDbgMsgCallback logging_callback;
Ian Elliott1064fe32015-07-06 14:31:32 -060057 bool wsi_enabled;
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -060058} layer_data;
Mark Lobodzinski76c991d2015-05-20 16:16:37 -050059
Tobin Ehlis257d9742015-07-08 17:08:02 -060060static unordered_map<void *, layer_data *> layer_data_map;
61
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -060062static device_table_map mem_tracker_device_table_map;
63static instance_table_map mem_tracker_instance_table_map;
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -060064static VkPhysicalDeviceMemoryProperties memProps;
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060065
Mark Lobodzinski93f494b2015-03-02 20:23:52 -060066// TODO : This can be much smarter, using separate locks for separate global data
67static int globalLockInitialized = 0;
68static loader_platform_thread_mutex globalLock;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070069
Tobin Ehlisc145be82015-01-08 15:22:32 -070070#define MAX_BINDING 0xFFFFFFFF
Tobin Ehlisc145be82015-01-08 15:22:32 -070071
Tobin Ehlis257d9742015-07-08 17:08:02 -060072// Maps for tracking key structs related to MemTracker state
Mike Stroyandd7aed72015-05-19 17:03:40 -060073unordered_map<VkCmdBuffer, MT_CB_INFO> cbMap;
Tobin Ehlis257d9742015-07-08 17:08:02 -060074unordered_map<uint64_t, MT_MEM_OBJ_INFO> memObjMap;
75unordered_map<uint64_t, MT_FENCE_INFO> fenceMap; // Map fence to fence info
Mike Stroyandd7aed72015-05-19 17:03:40 -060076unordered_map<VkQueue, MT_QUEUE_INFO> queueMap;
Ian Elliott7e40db92015-08-21 15:09:33 -060077unordered_map<uint64_t, MT_SWAP_CHAIN_INFO*> swapchainMap;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050078
Tobin Ehlis257d9742015-07-08 17:08:02 -060079// Images and Buffers are 2 objects that can have memory bound to them so they get special treatment
80unordered_map<uint64_t, MT_OBJ_BINDING_INFO> imageMap;
81unordered_map<uint64_t, MT_OBJ_BINDING_INFO> bufferMap;
82
83// Maps for non-dispatchable objects that store createInfo based on handle
Courtney Goeltzenleuchter5861a1b2015-09-01 17:30:39 -060084unordered_map<uint64_t, VkImageViewCreateInfo> attachmentViewMap;
Tobin Ehlis257d9742015-07-08 17:08:02 -060085unordered_map<uint64_t, VkImageViewCreateInfo> imageViewMap;
86// TODO : If we ever really care about Compute pipelines, split them into own map
87unordered_map<uint64_t, VkGraphicsPipelineCreateInfo> pipelineMap;
88unordered_map<uint64_t, VkSamplerCreateInfo> samplerMap;
89unordered_map<uint64_t, VkSemaphoreCreateInfo> semaphoreMap;
90unordered_map<uint64_t, VkEventCreateInfo> eventMap;
91unordered_map<uint64_t, VkQueryPoolCreateInfo> queryPoolMap;
92unordered_map<uint64_t, VkBufferViewCreateInfo> bufferViewMap;
93unordered_map<uint64_t, VkShaderModuleCreateInfo> shaderModuleMap;
94unordered_map<uint64_t, VkShaderCreateInfo> shaderMap;
95unordered_map<uint64_t, VkPipelineLayoutCreateInfo> pipelineLayoutMap;
96unordered_map<uint64_t, VkDescriptorSetLayoutCreateInfo> descriptorSetLayoutMap;
97unordered_map<uint64_t, VkDescriptorPoolCreateInfo> descriptorPoolMap;
98unordered_map<uint64_t, VkRenderPassCreateInfo> renderPassMap;
99unordered_map<uint64_t, VkFramebufferCreateInfo> framebufferMap;
100//unordered_map<uint64_t, VkDescriptorSetCreateInfo> descriptorSetMap;
Tobin Ehlis257d9742015-07-08 17:08:02 -0600101
102// For a given handle and object type, return a ptr to its CreateInfo struct, or NULL if not found
103static void* get_object_create_info(uint64_t handle, VkDbgObjectType type)
104{
105 void* retValue = NULL;
106 switch (type)
107 {
108 case VK_OBJECT_TYPE_ATTACHMENT_VIEW:
109 {
110 auto it = attachmentViewMap.find(handle);
111 if (it != attachmentViewMap.end())
112 return (void*)&(*it).second;
113 break;
114 }
115 case VK_OBJECT_TYPE_IMAGE_VIEW:
116 {
117 auto it = imageViewMap.find(handle);
118 if (it != imageViewMap.end())
119 return (void*)&(*it).second;
120 break;
121 }
122 case VK_OBJECT_TYPE_IMAGE:
123 {
124 auto it = imageMap.find(handle);
125 if (it != imageMap.end())
126 return (void*)&(*it).second;
127 break;
128 }
129 case VK_OBJECT_TYPE_PIPELINE:
130 {
131 auto it = pipelineMap.find(handle);
132 if (it != pipelineMap.end())
133 return (void*)&(*it).second;
134 break;
135 }
136 case VK_OBJECT_TYPE_SAMPLER:
137 {
138 auto it = samplerMap.find(handle);
139 if (it != samplerMap.end())
140 return (void*)&(*it).second;
141 break;
142 }
143 case VK_OBJECT_TYPE_BUFFER:
144 {
145 auto it = bufferMap.find(handle);
146 if (it != bufferMap.end())
147 return (void*)&(*it).second;
148 break;
149 }
150 case VK_OBJECT_TYPE_SEMAPHORE:
151 {
152 auto it = semaphoreMap.find(handle);
153 if (it != semaphoreMap.end())
154 return (void*)&(*it).second;
155 break;
156 }
157 case VK_OBJECT_TYPE_EVENT:
158 {
159 auto it = eventMap.find(handle);
160 if (it != eventMap.end())
161 return (void*)&(*it).second;
162 break;
163 }
164 case VK_OBJECT_TYPE_QUERY_POOL:
165 {
166 auto it = queryPoolMap.find(handle);
167 if (it != queryPoolMap.end())
168 return (void*)&(*it).second;
169 break;
170 }
171 case VK_OBJECT_TYPE_BUFFER_VIEW:
172 {
173 auto it = bufferViewMap.find(handle);
174 if (it != bufferViewMap.end())
175 return (void*)&(*it).second;
176 break;
177 }
178 case VK_OBJECT_TYPE_SHADER_MODULE:
179 {
180 auto it = shaderModuleMap.find(handle);
181 if (it != shaderModuleMap.end())
182 return (void*)&(*it).second;
183 break;
184 }
185 case VK_OBJECT_TYPE_SHADER:
186 {
187 auto it = shaderMap.find(handle);
188 if (it != shaderMap.end())
189 return (void*)&(*it).second;
190 break;
191 }
192 case VK_OBJECT_TYPE_PIPELINE_LAYOUT:
193 {
194 auto it = pipelineLayoutMap.find(handle);
195 if (it != pipelineLayoutMap.end())
196 return (void*)&(*it).second;
197 break;
198 }
199 case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT:
200 {
201 auto it = descriptorSetLayoutMap.find(handle);
202 if (it != descriptorSetLayoutMap.end())
203 return (void*)&(*it).second;
204 break;
205 }
206 case VK_OBJECT_TYPE_DESCRIPTOR_POOL:
207 {
208 auto it = descriptorPoolMap.find(handle);
209 if (it != descriptorPoolMap.end())
210 return (void*)&(*it).second;
211 break;
212 }
213// case VK_OBJECT_TYPE_DESCRIPTOR_SET:
214// {
215// auto it = descriptorSetMap.find(handle);
216// if (it != descriptorSetMap.end())
217// return (void*)&(*it).second;
218// break;
219// }
Tobin Ehlis257d9742015-07-08 17:08:02 -0600220 case VK_OBJECT_TYPE_RENDER_PASS:
221 {
222 auto it = renderPassMap.find(handle);
223 if (it != renderPassMap.end())
224 return (void*)&(*it).second;
225 break;
226 }
227 case VK_OBJECT_TYPE_FRAMEBUFFER:
228 {
229 auto it = framebufferMap.find(handle);
230 if (it != framebufferMap.end())
231 return (void*)&(*it).second;
232 break;
233 }
234 default:
235 {
236 // NULL will be returned below by default
237 break;
238 }
239 }
240 return retValue;
241}
242
243static MT_OBJ_BINDING_INFO* get_object_binding_info(uint64_t handle, VkDbgObjectType type)
244{
245 MT_OBJ_BINDING_INFO* retValue = NULL;
246 switch (type)
247 {
248 case VK_OBJECT_TYPE_IMAGE:
249 {
250 auto it = imageMap.find(handle);
251 if (it != imageMap.end())
252 return &(*it).second;
253 break;
254 }
255 case VK_OBJECT_TYPE_BUFFER:
256 {
257 auto it = bufferMap.find(handle);
258 if (it != bufferMap.end())
259 return &(*it).second;
260 break;
261 }
262 }
263 return retValue;
264}
Mark Lobodzinski50932972015-04-02 20:49:09 -0500265// TODO : Add per-device fence completion
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600266static uint64_t g_currentFenceId = 1;
Mark Lobodzinskic52b7752015-02-18 16:38:17 -0600267
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -0600268template layer_data *get_my_data_ptr<layer_data>(
269 void *data_key,
270 std::unordered_map<void *, layer_data *> &data_map);
271
Tobin Ehlis257d9742015-07-08 17:08:02 -0600272debug_report_data *mdd(void* object)
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -0600273{
Courtney Goeltzenleuchter62110862015-06-13 21:39:35 -0600274 dispatch_key key = get_dispatch_key(object);
275 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Courtney Goeltzenleuchter89d68442015-06-13 21:40:22 -0600276#if DISPATCH_MAP_DEBUG
277 fprintf(stderr, "MDD: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, my_data);
278#endif
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -0600279 return my_data->report_data;
280}
281
282debug_report_data *mid(VkInstance object)
283{
Courtney Goeltzenleuchter62110862015-06-13 21:39:35 -0600284 dispatch_key key = get_dispatch_key(object);
Tobin Ehlisbfbac252015-09-01 11:46:36 -0600285 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Courtney Goeltzenleuchter89d68442015-06-13 21:40:22 -0600286#if DISPATCH_MAP_DEBUG
287 fprintf(stderr, "MID: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, my_data);
288#endif
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -0600289 return my_data->report_data;
290}
291
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500292// Add new queue for this device to map container
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500293static void add_queue_info(const VkQueue queue)
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500294{
Mike Stroyandd7aed72015-05-19 17:03:40 -0600295 MT_QUEUE_INFO* pInfo = &queueMap[queue];
Mark Lobodzinski50932972015-04-02 20:49:09 -0500296 pInfo->lastRetiredId = 0;
297 pInfo->lastSubmittedId = 0;
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500298}
299
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500300static void delete_queue_info_list(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600301 void)
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500302{
303 // Process queue list, cleaning up each entry before deleting
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500304 queueMap.clear();
305}
306
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500307static void add_swap_chain_info(
Ian Elliott7e40db92015-08-21 15:09:33 -0600308 const VkSwapchainKHR swapchain, const VkSwapchainCreateInfoKHR* pCI)
Chia-I Wuf8693382015-04-16 22:02:10 +0800309{
310 MT_SWAP_CHAIN_INFO* pInfo = new MT_SWAP_CHAIN_INFO;
Ian Elliott7e40db92015-08-21 15:09:33 -0600311 memcpy(&pInfo->createInfo, pCI, sizeof(VkSwapchainCreateInfoKHR));
312 swapchainMap[swapchain.handle] = pInfo;
Chia-I Wuf8693382015-04-16 22:02:10 +0800313}
314
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500315// Add new CBInfo for this cb to map container
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500316static void add_cmd_buf_info(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600317 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700318{
Mike Stroyandd7aed72015-05-19 17:03:40 -0600319 cbMap[cb].cmdBuffer = cb;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700320}
321
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500322// Return ptr to Info in CB map, or NULL if not found
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500323static MT_CB_INFO* get_cmd_buf_info(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600324 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700325{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600326 auto item = cbMap.find(cb);
Mike Stroyan950496e2015-05-19 15:16:08 -0600327 if (item != cbMap.end()) {
Mike Stroyandd7aed72015-05-19 17:03:40 -0600328 return &(*item).second;
Mike Stroyan950496e2015-05-19 15:16:08 -0600329 } else {
330 return NULL;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600331 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700332}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600333
Tobin Ehlis257d9742015-07-08 17:08:02 -0600334static void add_object_binding_info(const uint64_t handle, const VkDbgObjectType type, const VkDeviceMemory mem)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500335{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600336 switch (type)
337 {
338 // Buffers and images are unique as their CreateInfo is in container struct
339 case VK_OBJECT_TYPE_BUFFER:
340 {
341 auto pCI = &bufferMap[handle];
342 pCI->mem = mem;
343 break;
344 }
345 case VK_OBJECT_TYPE_IMAGE:
346 {
347 auto pCI = &imageMap[handle];
348 pCI->mem = mem;
349 break;
350 }
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500351 }
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500352}
353
Tobin Ehlis257d9742015-07-08 17:08:02 -0600354static void add_object_create_info(const uint64_t handle, const VkDbgObjectType type, const void* pCreateInfo)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500355{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600356 // TODO : For any CreateInfo struct that has ptrs, need to deep copy them and appropriately clean up on Destroy
357 switch (type)
358 {
359 // Buffers and images are unique as their CreateInfo is in container struct
360 case VK_OBJECT_TYPE_BUFFER:
361 {
362 auto pCI = &bufferMap[handle];
363 memset(pCI, 0, sizeof(MT_OBJ_BINDING_INFO));
364 memcpy(&pCI->create_info.buffer, pCreateInfo, sizeof(VkBufferCreateInfo));
365 break;
366 }
367 case VK_OBJECT_TYPE_IMAGE:
368 {
369 auto pCI = &imageMap[handle];
370 memset(pCI, 0, sizeof(MT_OBJ_BINDING_INFO));
371 memcpy(&pCI->create_info.image, pCreateInfo, sizeof(VkImageCreateInfo));
372 break;
373 }
Mark Lobodzinskia50a5cb2015-09-01 11:19:08 -0600374 // Swap Chain is very unique, use imageMap, but copy in
Mark Lobodzinski348803a2015-09-11 15:56:51 -0600375 // SwapChainCreatInfo's usage flags and set the mem value to a unique key. These is used by
376 // vkCreateImageView and internal MemTracker routines to distinguish swap chain images
Ian Elliott7e40db92015-08-21 15:09:33 -0600377 case VK_OBJECT_TYPE_SWAPCHAIN_KHR:
Tobin Ehlis257d9742015-07-08 17:08:02 -0600378 {
379 auto pCI = &imageMap[handle];
380 memset(pCI, 0, sizeof(MT_OBJ_BINDING_INFO));
Mark Lobodzinski348803a2015-09-11 15:56:51 -0600381 pCI->mem = MEMTRACKER_SWAP_CHAIN_IMAGE_KEY;
Mark Lobodzinskia50a5cb2015-09-01 11:19:08 -0600382 pCI->create_info.image.usage =
Ian Elliott7e40db92015-08-21 15:09:33 -0600383 const_cast<VkSwapchainCreateInfoKHR*>(static_cast<const VkSwapchainCreateInfoKHR *>(pCreateInfo))->imageUsageFlags;
Tobin Ehlis257d9742015-07-08 17:08:02 -0600384 break;
385 }
386 // All other non-disp objects store their Create info struct as map value
387 case VK_OBJECT_TYPE_ATTACHMENT_VIEW:
388 {
389 auto pCI = &attachmentViewMap[handle];
Courtney Goeltzenleuchter5861a1b2015-09-01 17:30:39 -0600390 memcpy(pCI, pCreateInfo, sizeof(VkImageViewCreateInfo));
Tobin Ehlis257d9742015-07-08 17:08:02 -0600391 break;
392 }
393 case VK_OBJECT_TYPE_IMAGE_VIEW:
394 {
395 auto pCI = &imageViewMap[handle];
396 memcpy(pCI, pCreateInfo, sizeof(VkImageViewCreateInfo));
397 break;
398 }
399 case VK_OBJECT_TYPE_PIPELINE:
400 {
401 auto pCI = &pipelineMap[handle];
402 memcpy(pCI, pCreateInfo, sizeof(VkGraphicsPipelineCreateInfo));
403 break;
404 }
405 case VK_OBJECT_TYPE_SAMPLER:
406 {
407 auto pCI = &samplerMap[handle];
408 memcpy(pCI, pCreateInfo, sizeof(VkSamplerCreateInfo));
409 break;
410 }
411 case VK_OBJECT_TYPE_SEMAPHORE:
412 {
413 auto pCI = &semaphoreMap[handle];
414 memcpy(pCI, pCreateInfo, sizeof(VkSemaphoreCreateInfo));
415 break;
416 }
417 case VK_OBJECT_TYPE_EVENT:
418 {
419 auto pCI = &eventMap[handle];
420 memcpy(pCI, pCreateInfo, sizeof(VkEventCreateInfo));
421 break;
422 }
423 case VK_OBJECT_TYPE_QUERY_POOL:
424 {
425 auto pCI = &queryPoolMap[handle];
426 memcpy(pCI, pCreateInfo, sizeof(VkQueryPoolCreateInfo));
427 break;
428 }
429 case VK_OBJECT_TYPE_BUFFER_VIEW:
430 {
431 auto pCI = &bufferViewMap[handle];
432 memcpy(pCI, pCreateInfo, sizeof(VkBufferViewCreateInfo));
433 break;
434 }
435 case VK_OBJECT_TYPE_SHADER_MODULE:
436 {
437 auto pCI = &shaderModuleMap[handle];
438 memcpy(pCI, pCreateInfo, sizeof(VkShaderModuleCreateInfo));
439 break;
440 }
441 case VK_OBJECT_TYPE_SHADER:
442 {
443 auto pCI = &shaderMap[handle];
444 memcpy(pCI, pCreateInfo, sizeof(VkShaderCreateInfo));
445 break;
446 }
447 case VK_OBJECT_TYPE_PIPELINE_LAYOUT:
448 {
449 auto pCI = &pipelineLayoutMap[handle];
450 memcpy(pCI, pCreateInfo, sizeof(VkPipelineLayoutCreateInfo));
451 break;
452 }
453 case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT:
454 {
455 auto pCI = &descriptorSetLayoutMap[handle];
456 memcpy(pCI, pCreateInfo, sizeof(VkDescriptorSetLayoutCreateInfo));
457 break;
458 }
459 case VK_OBJECT_TYPE_DESCRIPTOR_POOL:
460 {
461 auto pCI = &descriptorPoolMap[handle];
462 memcpy(pCI, pCreateInfo, sizeof(VkDescriptorPoolCreateInfo));
463 break;
464 }
465// case VK_OBJECT_TYPE_DESCRIPTOR_SET:
466// {
467// auto pCI = &descriptorSetMap[handle];
468// memcpy(pCI, pCreateInfo, sizeof(VkDescriptorSetCreateInfo));
469// break;
470// }
471 case VK_OBJECT_TYPE_RENDER_PASS:
472 {
473 auto pCI = &renderPassMap[handle];
474 memcpy(pCI, pCreateInfo, sizeof(VkRenderPassCreateInfo));
475 break;
476 }
477 case VK_OBJECT_TYPE_FRAMEBUFFER:
478 {
479 auto pCI = &framebufferMap[handle];
480 memcpy(pCI, pCreateInfo, sizeof(VkFramebufferCreateInfo));
481 break;
482 }
Tobin Ehlis257d9742015-07-08 17:08:02 -0600483 default:
484 {
485 // NULL will be returned below by default
486 break;
487 }
488 }
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500489}
490
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500491// Add a fence, creating one if necessary to our list of fences/fenceIds
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600492static VkBool32 add_fence_info(
493 VkFence fence,
494 VkQueue queue,
495 uint64_t *fenceId)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500496{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600497 VkBool32 skipCall = VK_FALSE;
498 *fenceId = g_currentFenceId++;
499
Mark Lobodzinski76c991d2015-05-20 16:16:37 -0500500 // If no fence, create an internal fence to track the submissions
Tobin Ehlis257d9742015-07-08 17:08:02 -0600501 if (fence.handle != 0) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600502 fenceMap[fence.handle].fenceId = *fenceId;
503 fenceMap[fence.handle].queue = queue;
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -0500504 // Validate that fence is in UNSIGNALED state
Tobin Ehlis257d9742015-07-08 17:08:02 -0600505 VkFenceCreateInfo* pFenceCI = &(fenceMap[fence.handle].createInfo);
506 if (pFenceCI->flags & VK_FENCE_CREATE_SIGNALED_BIT) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600507 skipCall = log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_FENCE, fence.handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
508 "Fence %#" PRIxLEAST64 " submitted in SIGNALED state. Fences must be reset before being submitted", fence.handle);
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -0500509 }
Tobin Ehlis257d9742015-07-08 17:08:02 -0600510 } else {
511 // TODO : Do we need to create an internal fence here for tracking purposes?
Tobin Ehlis6663f492014-11-10 12:29:12 -0700512 }
Mike Stroyan950496e2015-05-19 15:16:08 -0600513 // Update most recently submitted fence and fenceId for Queue
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600514 queueMap[queue].lastSubmittedId = *fenceId;
515 return skipCall;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500516}
517
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500518// Remove a fenceInfo from our list of fences/fenceIds
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500519static void delete_fence_info(
Mike Stroyan950496e2015-05-19 15:16:08 -0600520 VkFence fence)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500521{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600522 fenceMap.erase(fence.handle);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500523}
524
Mike Stroyan950496e2015-05-19 15:16:08 -0600525// Record information when a fence is known to be signalled
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500526static void update_fence_tracking(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600527 VkFence fence)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500528{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600529 auto fence_item = fenceMap.find(fence.handle);
Mike Stroyan950496e2015-05-19 15:16:08 -0600530 if (fence_item != fenceMap.end()) {
Mike Stroyandd7aed72015-05-19 17:03:40 -0600531 MT_FENCE_INFO *pCurFenceInfo = &(*fence_item).second;
Mike Stroyan950496e2015-05-19 15:16:08 -0600532 VkQueue queue = pCurFenceInfo->queue;
Tobin Ehlis257d9742015-07-08 17:08:02 -0600533 auto queue_item = queueMap.find(queue);
Mike Stroyan950496e2015-05-19 15:16:08 -0600534 if (queue_item != queueMap.end()) {
Mike Stroyandd7aed72015-05-19 17:03:40 -0600535 MT_QUEUE_INFO *pQueueInfo = &(*queue_item).second;
Mike Stroyan950496e2015-05-19 15:16:08 -0600536 if (pQueueInfo->lastRetiredId < pCurFenceInfo->fenceId) {
537 pQueueInfo->lastRetiredId = pCurFenceInfo->fenceId;
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500538 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500539 }
540 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500541
Mike Stroyan950496e2015-05-19 15:16:08 -0600542 // Update fence state in fenceCreateInfo structure
Tobin Ehlis257d9742015-07-08 17:08:02 -0600543 auto pFCI = &(fenceMap[fence.handle].createInfo);
544 pFCI->flags = static_cast<VkFenceCreateFlags>(pFCI->flags | VK_FENCE_CREATE_SIGNALED_BIT);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500545}
546
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500547// Helper routine that updates the fence list for a specific queue to all-retired
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500548static void retire_queue_fences(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600549 VkQueue queue)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500550{
Mike Stroyandd7aed72015-05-19 17:03:40 -0600551 MT_QUEUE_INFO *pQueueInfo = &queueMap[queue];
552 // Set queue's lastRetired to lastSubmitted indicating all fences completed
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600553 pQueueInfo->lastRetiredId = pQueueInfo->lastSubmittedId;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700554}
555
Mike Stroyandd7aed72015-05-19 17:03:40 -0600556// Helper routine that updates all queues to all-retired
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500557static void retire_device_fences(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600558 VkDevice device)
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500559{
560 // Process each queue for device
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600561 // TODO: Add multiple device support
Tobin Ehlis257d9742015-07-08 17:08:02 -0600562 for (auto ii=queueMap.begin(); ii!=queueMap.end(); ++ii) {
Mike Stroyandd7aed72015-05-19 17:03:40 -0600563 // Set queue's lastRetired to lastSubmitted indicating all fences completed
564 MT_QUEUE_INFO *pQueueInfo = &(*ii).second;
565 pQueueInfo->lastRetiredId = pQueueInfo->lastSubmittedId;
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500566 }
567}
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600568
Tobin Ehlis41376e12015-07-03 08:45:14 -0600569// Helper function to validate correct usage bits set for buffers or images
570// Verify that (actual & desired) flags != 0 or,
571// if strict is true, verify that (actual & desired) flags == desired
572// In case of error, report it via dbg callbacks
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600573static VkBool32 validate_usage_flags(void* disp_obj, VkFlags actual, VkFlags desired,
Tobin Ehlis257d9742015-07-08 17:08:02 -0600574 VkBool32 strict, uint64_t obj_handle, VkDbgObjectType obj_type,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600575 char const* ty_str, char const* func_name, char const* usage_str)
576{
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600577 VkBool32 correct_usage = VK_FALSE;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600578 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis41376e12015-07-03 08:45:14 -0600579 if (strict)
580 correct_usage = ((actual & desired) == desired);
581 else
582 correct_usage = ((actual & desired) != 0);
583 if (!correct_usage) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600584 skipCall = log_msg(mdd(disp_obj), VK_DBG_REPORT_ERROR_BIT, obj_type, obj_handle, 0, MEMTRACK_INVALID_USAGE_FLAG, "MEM",
585 "Invalid usage flag for %s %#" PRIxLEAST64 " used by %s. In this case, %s should have %s set during creation.",
586 ty_str, obj_handle, func_name, ty_str, usage_str);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600587 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600588 return skipCall;
Tobin Ehlis41376e12015-07-03 08:45:14 -0600589}
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600590
Tobin Ehlis41376e12015-07-03 08:45:14 -0600591// Helper function to validate usage flags for images
592// Pulls image info and then sends actual vs. desired usage off to helper above where
593// an error will be flagged if usage is not correct
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600594static VkBool32 validate_image_usage_flags(void* disp_obj, VkImage image, VkFlags desired, VkBool32 strict,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600595 char const* func_name, char const* usage_string)
596{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600597 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis257d9742015-07-08 17:08:02 -0600598 MT_OBJ_BINDING_INFO* pBindInfo = get_object_binding_info(image.handle, VK_OBJECT_TYPE_IMAGE);
599 if (pBindInfo) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600600 skipCall = validate_usage_flags(disp_obj, pBindInfo->create_info.image.usage, desired, strict,
601 image.handle, VK_OBJECT_TYPE_IMAGE, "image", func_name, usage_string);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600602 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600603 return skipCall;
Tobin Ehlis41376e12015-07-03 08:45:14 -0600604}
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600605
Tobin Ehlis41376e12015-07-03 08:45:14 -0600606// Helper function to validate usage flags for buffers
607// Pulls buffer info and then sends actual vs. desired usage off to helper above where
608// an error will be flagged if usage is not correct
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600609static VkBool32 validate_buffer_usage_flags(void* disp_obj, VkBuffer buffer, VkFlags desired, VkBool32 strict,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600610 char const* func_name, char const* usage_string)
611{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600612 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis257d9742015-07-08 17:08:02 -0600613 MT_OBJ_BINDING_INFO* pBindInfo = get_object_binding_info(buffer.handle, VK_OBJECT_TYPE_BUFFER);
614 if (pBindInfo) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600615 skipCall = validate_usage_flags(disp_obj, pBindInfo->create_info.buffer.usage, desired, strict,
616 buffer.handle, VK_OBJECT_TYPE_BUFFER, "buffer", func_name, usage_string);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600617 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600618 return skipCall;
Tobin Ehlis41376e12015-07-03 08:45:14 -0600619}
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600620
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500621// Return ptr to info in map container containing mem, or NULL if not found
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700622// Calls to this function should be wrapped in mutex
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500623static MT_MEM_OBJ_INFO* get_mem_obj_info(
Tobin Ehlis257d9742015-07-08 17:08:02 -0600624 const uint64_t device_mem_handle)
Tobin Ehlisc145be82015-01-08 15:22:32 -0700625{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600626 auto item = memObjMap.find(device_mem_handle);
Mike Stroyan950496e2015-05-19 15:16:08 -0600627 if (item != memObjMap.end()) {
Mike Stroyandd7aed72015-05-19 17:03:40 -0600628 return &(*item).second;
Mike Stroyan950496e2015-05-19 15:16:08 -0600629 } else {
630 return NULL;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600631 }
Tobin Ehlisc145be82015-01-08 15:22:32 -0700632}
633
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500634static void add_mem_obj_info(
Mark Lobodzinski524df112015-08-10 14:37:52 -0600635 void* object,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600636 const VkDeviceMemory mem,
Tobin Ehlis257d9742015-07-08 17:08:02 -0600637 const VkMemoryAllocInfo* pAllocInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700638{
Courtney Goeltzenleuchter17fd5ce2015-06-13 21:29:26 -0600639 assert(object != NULL);
Courtney Goeltzenleuchter7dcc6a72015-06-11 16:01:11 -0600640
Ian Elliott1064fe32015-07-06 14:31:32 -0600641 memcpy(&memObjMap[mem.handle].allocInfo, pAllocInfo, sizeof(VkMemoryAllocInfo));
642 // TODO: Update for real hardware, actually process allocation info structures
643 memObjMap[mem.handle].allocInfo.pNext = NULL;
Tobin Ehlis257d9742015-07-08 17:08:02 -0600644 memObjMap[mem.handle].object = object;
645 memObjMap[mem.handle].refCount = 0;
646 memObjMap[mem.handle].mem = mem;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700647}
648
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500649// Find CB Info and add mem reference to list container
650// Find Mem Obj Info and add CB reference to list container
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600651static VkBool32 update_cmd_buf_and_mem_references(
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600652 const VkCmdBuffer cb,
653 const VkDeviceMemory mem,
654 const char *apiName)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700655{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600656 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski348803a2015-09-11 15:56:51 -0600657
658 // Skip validation if this image was created through WSI
659 if (mem != MEMTRACKER_SWAP_CHAIN_IMAGE_KEY) {
660
661 // First update CB binding in MemObj mini CB list
662 MT_MEM_OBJ_INFO* pMemInfo = get_mem_obj_info(mem.handle);
663 if (!pMemInfo) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600664 skipCall = log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600665 "In %s, trying to bind mem obj %#" PRIxLEAST64 " to CB %p but no info for that mem obj.\n "
666 "Was it correctly allocated? Did it already get freed?", apiName, mem.handle, cb);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500667 } else {
Mark Lobodzinski348803a2015-09-11 15:56:51 -0600668 // Search for cmd buffer object in memory object's binding list
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600669 VkBool32 found = VK_FALSE;
Mark Lobodzinski348803a2015-09-11 15:56:51 -0600670 if (pMemInfo->pCmdBufferBindings.size() > 0) {
671 for (list<VkCmdBuffer>::iterator it = pMemInfo->pCmdBufferBindings.begin(); it != pMemInfo->pCmdBufferBindings.end(); ++it) {
672 if ((*it) == cb) {
David Pinedod8f83d82015-04-27 16:36:17 -0600673 found = VK_TRUE;
674 break;
675 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500676 }
677 }
678 // If not present, add to list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600679 if (found == VK_FALSE) {
Mark Lobodzinski348803a2015-09-11 15:56:51 -0600680 pMemInfo->pCmdBufferBindings.push_front(cb);
681 pMemInfo->refCount++;
682 }
683 // Now update CBInfo's Mem reference list
684 MT_CB_INFO* pCBInfo = get_cmd_buf_info(cb);
685 // TODO: keep track of all destroyed CBs so we know if this is a stale or simply invalid object
686 if (!pCBInfo) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600687 skipCall = log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600688 "Trying to bind mem obj %#" PRIxLEAST64 " to CB %p but no info for that CB. Was CB incorrectly destroyed?", mem.handle, cb);
Mark Lobodzinski348803a2015-09-11 15:56:51 -0600689 } else {
690 // Search for memory object in cmd buffer's reference list
691 VkBool32 found = VK_FALSE;
692 if (pCBInfo->pMemObjList.size() > 0) {
693 for (auto it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
694 if ((*it) == mem) {
695 found = VK_TRUE;
696 break;
697 }
698 }
699 }
700 // If not present, add to list
701 if (found == VK_FALSE) {
702 pCBInfo->pMemObjList.push_front(mem);
703 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600704 }
705 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700706 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600707 return skipCall;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700708}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600709
Tobin Ehlis6663f492014-11-10 12:29:12 -0700710// Free bindings related to CB
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600711static VkBool32 clear_cmd_buf_and_mem_references(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600712 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700713{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600714 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500715 MT_CB_INFO* pCBInfo = get_cmd_buf_info(cb);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500716 if (!pCBInfo) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600717 skipCall = log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cb, 0, MEMTRACK_INVALID_CB, "MEM",
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600718 "Unable to find global CB info %p for deletion", cb);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600719 } else {
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -0600720 if (pCBInfo->pMemObjList.size() > 0) {
721 list<VkDeviceMemory> mem_obj_list = pCBInfo->pMemObjList;
722 for (list<VkDeviceMemory>::iterator it=mem_obj_list.begin(); it!=mem_obj_list.end(); ++it) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600723 MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info((*it).handle);
724 pInfo->pCmdBufferBindings.remove(cb);
725 pInfo->refCount--;
David Pinedod8f83d82015-04-27 16:36:17 -0600726 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600727 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500728 pCBInfo->pMemObjList.clear();
Tobin Ehlis6663f492014-11-10 12:29:12 -0700729 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600730 return skipCall;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700731}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600732
Tobin Ehlis6663f492014-11-10 12:29:12 -0700733// Delete the entire CB list
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600734static VkBool32 delete_cmd_buf_info_list(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600735 void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700736{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600737 VkBool32 skipCall = VK_FALSE;
Mike Stroyandd7aed72015-05-19 17:03:40 -0600738 for (unordered_map<VkCmdBuffer, MT_CB_INFO>::iterator ii=cbMap.begin(); ii!=cbMap.end(); ++ii) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600739 skipCall |= clear_cmd_buf_and_mem_references((*ii).first);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700740 }
Mike Stroyandd7aed72015-05-19 17:03:40 -0600741 cbMap.clear();
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600742 return skipCall;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700743}
744
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500745// For given MemObjInfo, report Obj & CB bindings
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600746static VkBool32 reportMemReferencesAndCleanUp(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600747 MT_MEM_OBJ_INFO* pMemObjInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700748{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600749 VkBool32 skipCall = VK_FALSE;
Tony Barbour18f71552015-04-22 11:36:22 -0600750 size_t cmdBufRefCount = pMemObjInfo->pCmdBufferBindings.size();
751 size_t objRefCount = pMemObjInfo->pObjBindings.size();
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500752
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500753 if ((pMemObjInfo->pCmdBufferBindings.size() + pMemObjInfo->pObjBindings.size()) != 0) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600754 skipCall = log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, pMemObjInfo->mem.handle, 0, MEMTRACK_FREED_MEM_REF, "MEM",
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600755 "Attempting to free memory object %#" PRIxLEAST64 " which still contains %lu references",
756 pMemObjInfo->mem.handle, (cmdBufRefCount + objRefCount));
Tobin Ehlis6663f492014-11-10 12:29:12 -0700757 }
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500758
David Pinedod8f83d82015-04-27 16:36:17 -0600759 if (cmdBufRefCount > 0 && pMemObjInfo->pCmdBufferBindings.size() > 0) {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500760 for (list<VkCmdBuffer>::const_iterator it = pMemObjInfo->pCmdBufferBindings.begin(); it != pMemObjInfo->pCmdBufferBindings.end(); ++it) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600761 // TODO : cmdBuffer should be source Obj here
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600762 log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)(*it), 0, MEMTRACK_FREED_MEM_REF, "MEM",
Tobin Ehlis257d9742015-07-08 17:08:02 -0600763 "Command Buffer %p still has a reference to mem obj %#" PRIxLEAST64, (*it), pMemObjInfo->mem.handle);
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500764 }
765 // Clear the list of hanging references
766 pMemObjInfo->pCmdBufferBindings.clear();
767 }
768
David Pinedod8f83d82015-04-27 16:36:17 -0600769 if (objRefCount > 0 && pMemObjInfo->pObjBindings.size() > 0) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600770 for (auto it = pMemObjInfo->pObjBindings.begin(); it != pMemObjInfo->pObjBindings.end(); ++it) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600771 log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_INFO_BIT, it->type, it->handle, 0, MEMTRACK_FREED_MEM_REF, "MEM",
Tobin Ehlis257d9742015-07-08 17:08:02 -0600772 "VK Object %#" PRIxLEAST64 " still has a reference to mem obj %#" PRIxLEAST64, it->handle, pMemObjInfo->mem.handle);
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500773 }
774 // Clear the list of hanging references
775 pMemObjInfo->pObjBindings.clear();
776 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600777 return skipCall;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700778}
779
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600780static VkBool32 deleteMemObjInfo(
Tobin Ehlis257d9742015-07-08 17:08:02 -0600781 void* object,
782 const uint64_t device_mem_handle)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700783{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600784 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis257d9742015-07-08 17:08:02 -0600785 auto item = memObjMap.find(device_mem_handle);
Mike Stroyan950496e2015-05-19 15:16:08 -0600786 if (item != memObjMap.end()) {
Mike Stroyan950496e2015-05-19 15:16:08 -0600787 memObjMap.erase(item);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600788 } else {
789 skipCall = log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, device_mem_handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
790 "Request to delete memory object %#" PRIxLEAST64 " not present in memory Object Map", device_mem_handle);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700791 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600792 return skipCall;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700793}
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500794
Tobin Ehlis6663f492014-11-10 12:29:12 -0700795// Check if fence for given CB is completed
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600796static VkBool32 checkCBCompleted(
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600797 const VkCmdBuffer cb,
798 VkBool32 *complete)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700799{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600800 VkBool32 skipCall = VK_FALSE;
801 *complete = VK_TRUE;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500802 MT_CB_INFO* pCBInfo = get_cmd_buf_info(cb);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500803 if (!pCBInfo) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600804 skipCall |= log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cb, 0,
805 MEMTRACK_INVALID_CB, "MEM", "Unable to find global CB info %p to check for completion", cb);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600806 *complete = VK_FALSE;
Mike Stroyan950496e2015-05-19 15:16:08 -0600807 } else if (pCBInfo->lastSubmittedQueue != NULL) {
808 VkQueue queue = pCBInfo->lastSubmittedQueue;
Mike Stroyandd7aed72015-05-19 17:03:40 -0600809 MT_QUEUE_INFO *pQueueInfo = &queueMap[queue];
Mike Stroyan950496e2015-05-19 15:16:08 -0600810 if (pCBInfo->fenceId > pQueueInfo->lastRetiredId) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600811 log_msg(mdd(cb), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cb, 0,
812 MEMTRACK_NONE, "MEM", "fence %#" PRIxLEAST64 " for CB %p has not been checked for completion",
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600813 pCBInfo->lastSubmittedFence.handle, cb);
814 *complete = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600815 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700816 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600817 return skipCall;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700818}
819
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600820static VkBool32 freeMemObjInfo(
Tobin Ehlis257d9742015-07-08 17:08:02 -0600821 void* object,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600822 VkDeviceMemory mem,
823 bool internal)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700824{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600825 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500826 // Parse global list to find info w/ mem
Tobin Ehlis257d9742015-07-08 17:08:02 -0600827 MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem.handle);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500828 if (!pInfo) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600829 skipCall = log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
830 "Couldn't find mem info object for %#" PRIxLEAST64 "\n Was %#" PRIxLEAST64 " never allocated or previously freed?",
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600831 mem.handle, mem.handle);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600832 } else {
Courtney Goeltzenleuchter1c943a72015-03-26 16:15:39 -0600833 if (pInfo->allocInfo.allocationSize == 0 && !internal) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600834 skipCall = log_msg(mdd(pInfo->object), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
835 "Attempting to free memory associated with a Persistent Image, %#" PRIxLEAST64 ", "
836 "this should not be explicitly freed\n", mem.handle);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600837 } else {
838 // Clear any CB bindings for completed CBs
839 // TODO : Is there a better place to do this?
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500840
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600841 VkBool32 cmdBufferComplete = VK_FALSE;
Courtney Goeltzenleuchter10100442015-06-13 21:36:49 -0600842 assert(pInfo->object != VK_NULL_HANDLE);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600843 list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin();
844 list<VkCmdBuffer>::iterator temp;
David Pinedod8f83d82015-04-27 16:36:17 -0600845 while (pInfo->pCmdBufferBindings.size() > 0 && it != pInfo->pCmdBufferBindings.end()) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600846 skipCall |= checkCBCompleted(*it, &cmdBufferComplete);
847 if (VK_TRUE == cmdBufferComplete) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500848 temp = it;
849 ++temp;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600850 skipCall |= clear_cmd_buf_and_mem_references(*it);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500851 it = temp;
852 } else {
853 ++it;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600854 }
855 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500856
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600857 // Now verify that no references to this mem obj remain and remove bindings
Mark Lobodzinski7b772332015-09-10 08:15:23 -0600858 if (0 != pInfo->refCount) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600859 skipCall |= reportMemReferencesAndCleanUp(pInfo);
Mark Lobodzinski7b772332015-09-10 08:15:23 -0600860 }
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600861 // Delete mem obj info
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600862 skipCall |= deleteMemObjInfo(object, mem.handle);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700863 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700864 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600865 return skipCall;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700866}
867
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600868static const char *object_type_to_string(VkDbgObjectType type) {
869 switch (type)
870 {
871 case VK_OBJECT_TYPE_IMAGE:
872 return "image";
873 break;
874 case VK_OBJECT_TYPE_BUFFER:
875 return "image";
876 break;
877 case VK_OBJECT_TYPE_SWAPCHAIN_KHR:
878 return "swapchain";
879 break;
880 default:
881 return "unknown";
882 }
883}
884
Tobin Ehlis6663f492014-11-10 12:29:12 -0700885// Remove object binding performs 3 tasks:
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500886// 1. Remove ObjectInfo from MemObjInfo list container of obj bindings & free it
887// 2. Decrement refCount for MemObjInfo
Tobin Ehlis257d9742015-07-08 17:08:02 -0600888// 3. Clear mem binding for image/buffer by setting its handle to 0
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600889// TODO : This only applied to Buffer, Image, and Swapchain objects now, how should it be updated/customized?
Tobin Ehlis257d9742015-07-08 17:08:02 -0600890static VkBool32 clear_object_binding(void* dispObj, uint64_t handle, VkDbgObjectType type)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700891{
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600892 // TODO : Need to customize images/buffers/swapchains to track mem binding and clear it here appropriately
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600893 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis257d9742015-07-08 17:08:02 -0600894 MT_OBJ_BINDING_INFO* pObjBindInfo = get_object_binding_info(handle, type);
895 if (pObjBindInfo) {
896 MT_MEM_OBJ_INFO* pMemObjInfo = get_mem_obj_info(pObjBindInfo->mem.handle);
897 if (!pMemObjInfo) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600898 skipCall = log_msg(mdd(dispObj), VK_DBG_REPORT_WARN_BIT, type, handle, 0, MEMTRACK_MEM_OBJ_CLEAR_EMPTY_BINDINGS, "MEM",
899 "Attempting to clear mem binding on %s obj %#" PRIxLEAST64 " but it has no binding.",
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600900 object_type_to_string(type), handle);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600901 } else {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600902 // 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
903 // and set the objects memory binding pointer to NULL.
904 VkBool32 clearSucceeded = VK_FALSE;
Tobin Ehlis257d9742015-07-08 17:08:02 -0600905 for (auto it = pMemObjInfo->pObjBindings.begin(); it != pMemObjInfo->pObjBindings.end(); ++it) {
906 if ((it->handle == handle) && (it->type == type)) {
907 pMemObjInfo->refCount--;
908 pMemObjInfo->pObjBindings.erase(it);
909 // TODO : Make sure this is a reasonable way to reset mem binding
910 pObjBindInfo->mem.handle = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600911 clearSucceeded = VK_TRUE;
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500912 break;
913 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600914 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600915 if (VK_FALSE == clearSucceeded ) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600916 skipCall |= log_msg(mdd(dispObj), VK_DBG_REPORT_ERROR_BIT, type, handle, 0, MEMTRACK_INVALID_OBJECT, "MEM",
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600917 "While trying to clear mem binding for %s obj %#" PRIxLEAST64 ", unable to find that object referenced by mem obj %#" PRIxLEAST64,
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600918 object_type_to_string(type), handle, pMemObjInfo->mem.handle);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600919 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700920 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700921 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600922 return skipCall;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700923}
924
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500925// For NULL mem case, output warning
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500926// Make sure given object is in global object map
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500927// IF a previous binding existed, output validation error
928// Otherwise, add reference from objectInfo to memoryInfo
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500929// Add reference off of objInfo
Courtney Goeltzenleuchter540d3492015-06-13 21:37:34 -0600930// device is required for error logging, need a dispatchable
931// object for that.
Tobin Ehlis257d9742015-07-08 17:08:02 -0600932static VkBool32 set_mem_binding(
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600933 void* dispatch_object,
934 VkDeviceMemory mem,
935 uint64_t handle,
936 VkDbgObjectType type,
937 const char *apiName)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700938{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600939 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700940 // Handle NULL case separately, just clear previous binding & decrement reference
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600941 if (mem == VK_NULL_HANDLE) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600942 skipCall = log_msg(mdd(dispatch_object), VK_DBG_REPORT_WARN_BIT, type, handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600943 "In %s, attempting to Bind Obj(%#" PRIxLEAST64 ") to NULL", apiName, handle);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600944 } else {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600945 MT_OBJ_BINDING_INFO* pObjBindInfo = get_object_binding_info(handle, type);
946 if (!pObjBindInfo) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600947 skipCall |= log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, type, handle, 0, MEMTRACK_MISSING_MEM_BINDINGS, "MEM",
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600948 "In %s, attempting to update Binding of %s Obj(%#" PRIxLEAST64 ") that's not in global list()",
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600949 object_type_to_string(type), apiName, handle);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500950 } else {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600951 // non-null case so should have real mem obj
952 MT_MEM_OBJ_INFO* pMemInfo = get_mem_obj_info(mem.handle);
953 if (!pMemInfo) {
954 skipCall |= log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle,
955 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", "In %s, while trying to bind mem for %s obj %#" PRIxLEAST64 ", couldn't find info for mem obj %#" PRIxLEAST64,
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -0600956 object_type_to_string(type), apiName, handle, mem.handle);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600957 } else {
958 // TODO : Need to track mem binding for obj and report conflict here
959 MT_MEM_OBJ_INFO* pPrevBinding = get_mem_obj_info(pObjBindInfo->mem.handle);
960 if (pPrevBinding != NULL) {
961 skipCall |= log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_REBIND_OBJECT, "MEM",
962 "In %s, attempting to bind memory (%#" PRIxLEAST64 ") to object (%#" PRIxLEAST64 ") which has already been bound to mem object %#" PRIxLEAST64,
963 apiName, mem.handle, handle, pPrevBinding->mem.handle);
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500964 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600965 else {
966 MT_OBJ_HANDLE_TYPE oht;
967 oht.handle = handle;
968 oht.type = type;
969 pMemInfo->pObjBindings.push_front(oht);
970 pMemInfo->refCount++;
971 // For image objects, make sure default memory state is correctly set
972 // TODO : What's the best/correct way to handle this?
973 if (VK_OBJECT_TYPE_IMAGE == type) {
974 VkImageCreateInfo ici = pObjBindInfo->create_info.image;
975 if (ici.usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
976 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
977 // TODO:: More memory state transition stuff.
978 }
979 }
980 pObjBindInfo->mem = mem;
981 }
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500982 }
983 }
984 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600985 return skipCall;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500986}
987
988// For NULL mem case, clear any previous binding Else...
Tobin Ehlis257d9742015-07-08 17:08:02 -0600989// Make sure given object is in its object map
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500990// IF a previous binding existed, update binding
991// Add reference from objectInfo to memoryInfo
Tobin Ehlis257d9742015-07-08 17:08:02 -0600992// Add reference off of object's binding info
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500993// Return VK_TRUE if addition is successful, VK_FALSE otherwise
Tobin Ehlis257d9742015-07-08 17:08:02 -0600994static VkBool32 set_sparse_mem_binding(
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -0600995 void* dispObject,
996 VkDeviceMemory mem,
997 uint64_t handle,
998 VkDbgObjectType type,
999 const char *apiName)
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001000{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001001 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001002 // Handle NULL case separately, just clear previous binding & decrement reference
1003 if (mem == VK_NULL_HANDLE) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001004 skipCall = clear_object_binding(dispObject, handle, type);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001005 } else {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001006 MT_OBJ_BINDING_INFO* pObjBindInfo = get_object_binding_info(handle, type);
1007 if (!pObjBindInfo) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06001008 skipCall |= log_msg(mdd(dispObject), VK_DBG_REPORT_ERROR_BIT, type, handle, 0, MEMTRACK_MISSING_MEM_BINDINGS, "MEM",
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001009 "In %s, attempting to update Binding of Obj(%#" PRIxLEAST64 ") that's not in global list()", apiName, handle);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001010 }
1011 // non-null case so should have real mem obj
Tobin Ehlis257d9742015-07-08 17:08:02 -06001012 MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem.handle);
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -06001013 if (!pInfo) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001014 skipCall |= log_msg(mdd(dispObject), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
1015 "In %s, While trying to bind mem for obj %#" PRIxLEAST64 ", couldn't find info for mem obj %#" PRIxLEAST64, apiName, handle, mem.handle);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001016 } else {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001017 // Search for object in memory object's binding list
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -06001018 VkBool32 found = VK_FALSE;
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -06001019 if (pInfo->pObjBindings.size() > 0) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001020 for (auto it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) {
1021 if (((*it).handle == handle) && ((*it).type == type)) {
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -06001022 found = VK_TRUE;
1023 break;
1024 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001025 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001026 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001027 // If not present, add to list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001028 if (found == VK_FALSE) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001029 MT_OBJ_HANDLE_TYPE oht;
1030 oht.handle = handle;
1031 oht.type = type;
1032 pInfo->pObjBindings.push_front(oht);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001033 pInfo->refCount++;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001034 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06001035 // Need to set mem binding for this object
Tobin Ehlis257d9742015-07-08 17:08:02 -06001036 MT_MEM_OBJ_INFO* pPrevBinding = get_mem_obj_info(pObjBindInfo->mem.handle);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001037 pObjBindInfo->mem = mem;
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001038 }
1039 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001040 return skipCall;
Tobin Ehlis6663f492014-11-10 12:29:12 -07001041}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001042
Mark Lobodzinski524df112015-08-10 14:37:52 -06001043template <typename T>
1044void print_object_map_members(
1045 void* dispObj,
1046 T const& objectName,
1047 VkDbgObjectType objectType,
1048 const char *objectStr)
1049{
1050 for (auto const& element : objectName) {
1051 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, objectType, 0, 0, MEMTRACK_NONE, "MEM",
1052 " %s Object list contains %s Object %#" PRIxLEAST64 " ", objectStr, objectStr, element.first);
1053 }
1054}
1055
Tobin Ehlis6663f492014-11-10 12:29:12 -07001056// Print details of global Obj tracking list
Mark Lobodzinski524df112015-08-10 14:37:52 -06001057static void print_object_list(
1058 void* dispObj)
1059{
1060 // Early out if info is not requested
1061 if (!(mdd(dispObj)->active_flags & VK_DBG_REPORT_INFO_BIT)) {
1062 return;
1063 }
1064
1065 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE, 0, 0, MEMTRACK_NONE, "MEM", "Details of Object lists:");
1066 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE, 0, 0, MEMTRACK_NONE, "MEM", "========================");
1067
Mark Lobodzinski524df112015-08-10 14:37:52 -06001068 print_object_map_members(dispObj, imageViewMap, VK_OBJECT_TYPE_IMAGE_VIEW, "ImageView");
1069 print_object_map_members(dispObj, samplerMap, VK_OBJECT_TYPE_SAMPLER, "Sampler");
1070 print_object_map_members(dispObj, semaphoreMap, VK_OBJECT_TYPE_SEMAPHORE, "Semaphore");
1071 print_object_map_members(dispObj, eventMap, VK_OBJECT_TYPE_EVENT, "Event");
1072 print_object_map_members(dispObj, queryPoolMap, VK_OBJECT_TYPE_QUERY_POOL, "QueryPool");
1073 print_object_map_members(dispObj, bufferViewMap, VK_OBJECT_TYPE_BUFFER_VIEW, "BufferView");
1074 print_object_map_members(dispObj, shaderModuleMap, VK_OBJECT_TYPE_SHADER_MODULE, "ShaderModule");
1075 print_object_map_members(dispObj, shaderMap, VK_OBJECT_TYPE_SHADER, "Shader");
1076 print_object_map_members(dispObj, pipelineLayoutMap, VK_OBJECT_TYPE_PIPELINE_LAYOUT, "PipelineLayout");
1077 print_object_map_members(dispObj, descriptorSetLayoutMap, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, "DescriptorSetLayout");
1078 print_object_map_members(dispObj, descriptorPoolMap, VK_OBJECT_TYPE_DESCRIPTOR_POOL, "DescriptorPool");
1079 print_object_map_members(dispObj, renderPassMap, VK_OBJECT_TYPE_RENDER_PASS, "RenderPass");
1080 print_object_map_members(dispObj, framebufferMap, VK_OBJECT_TYPE_FRAMEBUFFER, "Framebuffer");
Mark Lobodzinski524df112015-08-10 14:37:52 -06001081 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE, 0, 0, MEMTRACK_NONE, "MEM", "*** End of Object lists ***");
1082}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001083
Tobin Ehlis6663f492014-11-10 12:29:12 -07001084// For given Object, get 'mem' obj that it's bound to or NULL if no binding
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001085static VkBool32 get_mem_binding_from_object(
1086 void* dispObj, const uint64_t handle, const VkDbgObjectType type, VkDeviceMemory *mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001087{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001088 VkBool32 skipCall = VK_FALSE;
1089 mem->handle = 0;
Tobin Ehlis257d9742015-07-08 17:08:02 -06001090 MT_OBJ_BINDING_INFO* pObjBindInfo = get_object_binding_info(handle, type);
1091 if (pObjBindInfo) {
1092 if (pObjBindInfo->mem) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001093 *mem = pObjBindInfo->mem;
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -06001094 } else {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001095 skipCall = log_msg(mdd(dispObj), VK_DBG_REPORT_ERROR_BIT, type, handle, 0, MEMTRACK_MISSING_MEM_BINDINGS, "MEM",
1096 "Trying to get mem binding for object %#" PRIxLEAST64 " but object has no mem binding", handle);
Mark Lobodzinski524df112015-08-10 14:37:52 -06001097 print_object_list(dispObj);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001098 }
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -06001099 } else {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001100 skipCall = log_msg(mdd(dispObj), VK_DBG_REPORT_ERROR_BIT, type, handle, 0, MEMTRACK_INVALID_OBJECT, "MEM",
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06001101 "Trying to get mem binding for object %#" PRIxLEAST64 " but no such object in %s list",
1102 handle, object_type_to_string(type));
Mark Lobodzinski524df112015-08-10 14:37:52 -06001103 print_object_list(dispObj);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001104 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001105 return skipCall;
Tobin Ehlis6663f492014-11-10 12:29:12 -07001106}
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001107
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001108// Print details of MemObjInfo list
Mark Lobodzinski524df112015-08-10 14:37:52 -06001109static void print_mem_list(
1110 void* dispObj)
1111{
1112 MT_MEM_OBJ_INFO* pInfo = NULL;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001113
Mark Lobodzinski524df112015-08-10 14:37:52 -06001114 // Early out if info is not requested
1115 if (!(mdd(dispObj)->active_flags & VK_DBG_REPORT_INFO_BIT)) {
1116 return;
1117 }
1118
1119 // Just printing each msg individually for now, may want to package these into single large print
1120 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1121 "Details of Memory Object list (of size %lu elements)", memObjMap.size());
1122 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1123 "=============================");
1124
1125 if (memObjMap.size() <= 0)
1126 return;
1127
1128 for (auto ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
1129 pInfo = &(*ii).second;
1130
1131 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1132 " ===MemObjInfo at %p===", (void*)pInfo);
1133 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1134 " Mem object: %#" PRIxLEAST64, (void*)pInfo->mem.handle);
1135 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1136 " Ref Count: %u", pInfo->refCount);
1137 if (0 != pInfo->allocInfo.allocationSize) {
1138 string pAllocInfoMsg = vk_print_vkmemoryallocinfo(&pInfo->allocInfo, "MEM(INFO): ");
1139 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1140 " Mem Alloc info:\n%s", pAllocInfoMsg.c_str());
1141 } else {
1142 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
Ian Elliott7e40db92015-08-21 15:09:33 -06001143 " Mem Alloc info is NULL (alloc done by vkCreateSwapchainKHR())");
Mark Lobodzinski524df112015-08-10 14:37:52 -06001144 }
1145
1146 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1147 " VK OBJECT Binding list of size %lu elements:", pInfo->pObjBindings.size());
1148 if (pInfo->pObjBindings.size() > 0) {
1149 for (list<MT_OBJ_HANDLE_TYPE>::iterator it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) {
1150 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1151 " VK OBJECT %p", (*it));
1152 }
1153 }
1154
1155 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1156 " VK Command Buffer (CB) binding list of size %lu elements", pInfo->pCmdBufferBindings.size());
1157 if (pInfo->pCmdBufferBindings.size() > 0)
1158 {
1159 for (list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin(); it != pInfo->pCmdBufferBindings.end(); ++it) {
1160 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1161 " VK CB %p", (*it));
1162 }
1163 }
1164 }
1165}
1166
1167static void printCBList(
1168 void* dispObj)
1169{
1170 MT_CB_INFO* pCBInfo = NULL;
1171
1172 // Early out if info is not requested
1173 if (!(mdd(dispObj)->active_flags & VK_DBG_REPORT_INFO_BIT)) {
1174 return;
1175 }
1176
1177 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1178 "Details of CB list (of size %lu elements)", cbMap.size());
1179 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1180 "==================");
1181
1182 if (cbMap.size() <= 0)
1183 return;
1184
1185 for (auto ii=cbMap.begin(); ii!=cbMap.end(); ++ii) {
1186 pCBInfo = &(*ii).second;
1187
1188 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1189 " CB Info (%p) has CB %p, fenceId %" PRIx64", and fence %#" PRIxLEAST64,
1190 (void*)pCBInfo, (void*)pCBInfo->cmdBuffer, pCBInfo->fenceId,
1191 pCBInfo->lastSubmittedFence.handle);
1192
1193 if (pCBInfo->pMemObjList.size() <= 0)
1194 continue;
1195 for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
1196 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1197 " Mem obj %p", (*it));
1198 }
1199 }
1200}
Tobin Ehlis6663f492014-11-10 12:29:12 -07001201
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001202static void init_mem_tracker(
1203 layer_data *my_data)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001204{
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001205 uint32_t report_flags = 0;
1206 uint32_t debug_action = 0;
1207 FILE *log_output = NULL;
1208 const char *option_str;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07001209 // initialize MemTracker options
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001210 report_flags = getLayerOptionFlags("MemTrackerReportFlags", 0);
1211 getLayerOptionEnum("MemTrackerDebugAction", (uint32_t *) &debug_action);
Tobin Ehlisee702232015-01-08 14:26:53 -07001212
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001213 if (debug_action & VK_DBG_LAYER_ACTION_LOG_MSG)
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07001214 {
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001215 option_str = getLayerOption("MemTrackerLogFilename");
Tobin Ehlisb1df55e2015-09-15 09:55:54 -06001216 log_output = getLayerLogOutput(option_str, "MemTracker");
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001217 layer_create_msg_callback(my_data->report_data, report_flags, log_callback, (void *) log_output, &my_data->logging_callback);
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07001218 }
1219
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001220 if (!globalLockInitialized)
1221 {
1222 // TODO/TBD: Need to delete this mutex sometime. How??? One
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001223 // suggestion is to call this during vkCreateInstance(), and then we
1224 // can clean it up during vkDestroyInstance(). However, that requires
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001225 // that the layer have per-instance locks. We need to come back and
1226 // address this soon.
1227 loader_platform_thread_create_mutex(&globalLock);
1228 globalLockInitialized = 1;
1229 }
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -06001230
1231 // Zero out memory property data
1232 memset(&memProps, 0, sizeof(VkPhysicalDeviceMemoryProperties));
Tobin Ehlis6663f492014-11-10 12:29:12 -07001233}
1234
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05001235// hook DestroyInstance to remove tableInstanceMap entry
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001236VK_LAYER_EXPORT void VKAPI vkDestroyInstance(VkInstance instance)
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05001237{
Jeremy Hayes35f8afc2015-06-18 10:25:55 -06001238 // Grab the key before the instance is destroyed.
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001239 dispatch_key key = get_dispatch_key(instance);
1240 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, instance);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001241 pTable->DestroyInstance(instance);
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001242
1243 // Clean up logging callback, if any
Courtney Goeltzenleuchter095e6772015-06-16 16:58:52 -06001244 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001245 if (my_data->logging_callback) {
1246 layer_destroy_msg_callback(my_data->report_data, my_data->logging_callback);
1247 }
1248
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001249 layer_debug_report_destroy_instance(mid(instance));
1250 layer_data_map.erase(pTable);
1251
1252 mem_tracker_instance_table_map.erase(key);
1253 assert(mem_tracker_instance_table_map.size() == 0 && "Should not have any instance mappings hanging around");
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05001254}
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001255
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06001256VkResult VKAPI vkCreateInstance(
1257 const VkInstanceCreateInfo* pCreateInfo,
1258 VkInstance* pInstance)
1259{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001260 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, *pInstance);
Courtney Goeltzenleuchterd02a9642015-06-08 14:58:39 -06001261 VkResult result = pTable->CreateInstance(pCreateInfo, pInstance);
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06001262
1263 if (result == VK_SUCCESS) {
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001264 layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1265 my_data->report_data = debug_report_create_instance(
1266 pTable,
1267 *pInstance,
1268 pCreateInfo->extensionCount,
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001269 pCreateInfo->ppEnabledExtensionNames);
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001270
1271 init_mem_tracker(my_data);
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06001272 }
1273 return result;
1274}
1275
Jon Ashburn747f2b62015-06-18 15:02:58 -06001276static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
1277{
Courtney Goeltzenleuchterd54749c2015-07-05 11:17:01 -06001278 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn8acd2332015-09-16 18:08:32 -06001279 VkLayerDispatchTable *pDisp = get_dispatch_table(mem_tracker_device_table_map, device);
1280 PFN_vkGetDeviceProcAddr gpa = pDisp->GetDeviceProcAddr;
1281 pDisp->GetSurfacePropertiesKHR = (PFN_vkGetSurfacePropertiesKHR) gpa(device, "vkGetSurfacePropertiesKHR");
1282 pDisp->GetSurfaceFormatsKHR = (PFN_vkGetSurfaceFormatsKHR) gpa(device, "vkGetSurfaceFormatsKHR");
1283 pDisp->GetSurfacePresentModesKHR = (PFN_vkGetSurfacePresentModesKHR) gpa(device, "vkGetSurfacePresentModesKHR");
1284 pDisp->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR) gpa(device, "vkCreateSwapchainKHR");
1285 pDisp->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR) gpa(device, "vkDestroySwapchainKHR");
1286 pDisp->GetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR) gpa(device, "vkGetSwapchainImagesKHR");
1287 pDisp->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR) gpa(device, "vkAcquireNextImageKHR");
1288 pDisp->QueuePresentKHR = (PFN_vkQueuePresentKHR) gpa(device, "vkQueuePresentKHR");
Ian Elliott1064fe32015-07-06 14:31:32 -06001289 my_device_data->wsi_enabled = false;
Courtney Goeltzenleuchterd54749c2015-07-05 11:17:01 -06001290 for (uint32_t i = 0; i < pCreateInfo->extensionCount; i++) {
Ian Elliott7e40db92015-08-21 15:09:33 -06001291 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_KHR_DEVICE_SWAPCHAIN_EXTENSION_NAME) == 0)
Ian Elliott1064fe32015-07-06 14:31:32 -06001292 my_device_data->wsi_enabled = true;
Jon Ashburn747f2b62015-06-18 15:02:58 -06001293 }
1294}
1295
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001296VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(
1297 VkPhysicalDevice gpu,
1298 const VkDeviceCreateInfo *pCreateInfo,
1299 VkDevice *pDevice)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001300{
Courtney Goeltzenleuchterca173b82015-06-25 18:01:43 -06001301 VkLayerDispatchTable *pDeviceTable = get_dispatch_table(mem_tracker_device_table_map, *pDevice);
1302 VkResult result = pDeviceTable->CreateDevice(gpu, pCreateInfo, pDevice);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001303 if (result == VK_SUCCESS) {
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001304 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001305 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1306 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
Jon Ashburn747f2b62015-06-18 15:02:58 -06001307 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001308 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001309 return result;
1310}
1311
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001312VK_LAYER_EXPORT void VKAPI vkDestroyDevice(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001313 VkDevice device)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001314{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001315 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001316 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06001317 log_msg(mdd(device), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE, (uint64_t)device, 0, MEMTRACK_NONE, "MEM",
Mark Lobodzinski524df112015-08-10 14:37:52 -06001318 "Printing List details prior to vkDestroyDevice()");
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06001319 log_msg(mdd(device), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE, (uint64_t)device, 0, MEMTRACK_NONE, "MEM",
Mark Lobodzinski524df112015-08-10 14:37:52 -06001320 "================================================");
1321 print_mem_list(device);
1322 printCBList(device);
1323 print_object_list(device);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001324 skipCall = delete_cmd_buf_info_list();
Tobin Ehlisb54ef782014-11-25 18:01:12 -07001325 // Report any memory leaks
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001326 MT_MEM_OBJ_INFO* pInfo = NULL;
David Pinedod8f83d82015-04-27 16:36:17 -06001327 if (memObjMap.size() > 0) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001328 for (auto ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
Mike Stroyandd7aed72015-05-19 17:03:40 -06001329 pInfo = &(*ii).second;
David Pinedod8f83d82015-04-27 16:36:17 -06001330 if (pInfo->allocInfo.allocationSize != 0) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001331 skipCall |= log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, pInfo->mem.handle, 0, MEMTRACK_MEMORY_LEAK, "MEM",
1332 "Mem Object %p has not been freed. You should clean up this memory by calling "
1333 "vkFreeMemory(%p) prior to vkDestroyDevice().", pInfo->mem, pInfo->mem);
David Pinedod8f83d82015-04-27 16:36:17 -06001334 }
Mark Lobodzinski2f3b19b2015-02-18 18:06:24 -06001335 }
Tobin Ehlisb54ef782014-11-25 18:01:12 -07001336 }
Mark Lobodzinski223ca202015-04-02 08:52:53 -05001337 // Queues persist until device is destroyed
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001338 delete_queue_info_list();
Courtney Goeltzenleuchter7dcc6a72015-06-11 16:01:11 -06001339 layer_debug_report_destroy_device(device);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001340 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05001341
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001342 dispatch_key key = get_dispatch_key(device);
Courtney Goeltzenleuchter89d68442015-06-13 21:40:22 -06001343#if DISPATCH_MAP_DEBUG
1344 fprintf(stderr, "Device: %p, key: %p\n", device, key);
1345#endif
Jon Ashburn747f2b62015-06-18 15:02:58 -06001346 VkLayerDispatchTable *pDisp = get_dispatch_table(mem_tracker_device_table_map, device);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001347 if (VK_FALSE == skipCall) {
1348 pDisp->DestroyDevice(device);
1349 }
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001350 mem_tracker_device_table_map.erase(key);
Courtney Goeltzenleuchter10100442015-06-13 21:36:49 -06001351 assert(mem_tracker_device_table_map.size() == 0 && "Should not have any instance mappings hanging around");
Tobin Ehlis6663f492014-11-10 12:29:12 -07001352}
1353
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -06001354VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceMemoryProperties(
1355 VkPhysicalDevice physicalDevice,
1356 VkPhysicalDeviceMemoryProperties *pMemoryProperties)
1357{
1358 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(mem_tracker_instance_table_map, physicalDevice);
1359 VkResult result = pInstanceTable->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
1360 if (result == VK_SUCCESS) {
1361 // copy mem props to local var...
1362 memcpy(&memProps, pMemoryProperties, sizeof(VkPhysicalDeviceMemoryProperties));
1363 }
1364 return result;
1365}
1366
Courtney Goeltzenleuchtere7481332015-07-07 10:04:16 -06001367static const VkLayerProperties mtGlobalLayers[] = {
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001368 {
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001369 "MemTracker",
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001370 VK_API_VERSION,
1371 VK_MAKE_VERSION(0, 1, 0),
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06001372 "Validation layer: MemTracker",
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001373 }
Jon Ashburn9fd4cc42015-04-10 14:33:07 -06001374};
1375
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06001376VK_LAYER_EXPORT VkResult VKAPI vkEnumerateInstanceExtensionProperties(
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001377 const char *pLayerName,
1378 uint32_t *pCount,
1379 VkExtensionProperties* pProperties)
Jon Ashburn9fd4cc42015-04-10 14:33:07 -06001380{
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001381 /* Mem tracker does not have any global extensions */
Courtney Goeltzenleuchtere7481332015-07-07 10:04:16 -06001382 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -06001383}
1384
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06001385VK_LAYER_EXPORT VkResult VKAPI vkEnumerateInstanceLayerProperties(
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001386 uint32_t *pCount,
1387 VkLayerProperties* pProperties)
Tony Barbour59a47322015-06-24 16:06:58 -06001388{
Courtney Goeltzenleuchtere7481332015-07-07 10:04:16 -06001389 return util_GetLayerProperties(ARRAY_SIZE(mtGlobalLayers),
1390 mtGlobalLayers,
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001391 pCount, pProperties);
Jon Ashburn9fd4cc42015-04-10 14:33:07 -06001392}
1393
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06001394VK_LAYER_EXPORT VkResult VKAPI vkEnumerateDeviceExtensionProperties(
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001395 VkPhysicalDevice physicalDevice,
1396 const char* pLayerName,
1397 uint32_t* pCount,
1398 VkExtensionProperties* pProperties)
Tony Barbour59a47322015-06-24 16:06:58 -06001399{
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001400 /* Mem tracker does not have any physical device extensions */
Courtney Goeltzenleuchtere7481332015-07-07 10:04:16 -06001401 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001402}
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06001403
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06001404VK_LAYER_EXPORT VkResult VKAPI vkEnumerateDeviceLayerProperties(
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001405 VkPhysicalDevice physicalDevice,
1406 uint32_t* pCount,
1407 VkLayerProperties* pProperties)
1408{
1409 /* Mem tracker's physical device layers are the same as global */
Courtney Goeltzenleuchtere7481332015-07-07 10:04:16 -06001410 return util_GetLayerProperties(ARRAY_SIZE(mtGlobalLayers), mtGlobalLayers,
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001411 pCount, pProperties);
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06001412}
1413
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001414VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue(
1415 VkDevice device,
1416 uint32_t queueNodeIndex,
1417 uint32_t queueIndex,
1418 VkQueue *pQueue)
Mark Lobodzinski748eddf2015-03-31 16:05:35 -05001419{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001420 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001421 if (result == VK_SUCCESS) {
Mark Lobodzinskied450b02015-04-07 13:38:21 -05001422 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001423 add_queue_info(*pQueue);
Mark Lobodzinskied450b02015-04-07 13:38:21 -05001424 loader_platform_thread_unlock_mutex(&globalLock);
1425 }
Mark Lobodzinski748eddf2015-03-31 16:05:35 -05001426 return result;
1427}
1428
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001429VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(
1430 VkQueue queue,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001431 uint32_t cmdBufferCount,
1432 const VkCmdBuffer *pCmdBuffers,
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001433 VkFence fence)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001434{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001435 VkResult result = VK_ERROR_VALIDATION_FAILED;
1436
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001437 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001438 // TODO : Need to track fence and clear mem references when fence clears
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001439 MT_CB_INFO* pCBInfo = NULL;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001440 uint64_t fenceId = 0;
1441 VkBool32 skipCall = add_fence_info(fence, queue, &fenceId);
Mark Lobodzinskied450b02015-04-07 13:38:21 -05001442
Mark Lobodzinski524df112015-08-10 14:37:52 -06001443 print_mem_list(queue);
1444 printCBList(queue);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001445 for (uint32_t i = 0; i < cmdBufferCount; i++) {
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001446 pCBInfo = get_cmd_buf_info(pCmdBuffers[i]);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001447 pCBInfo->fenceId = fenceId;
Mike Stroyan950496e2015-05-19 15:16:08 -06001448 pCBInfo->lastSubmittedFence = fence;
1449 pCBInfo->lastSubmittedQueue = queue;
Tobin Ehlis6663f492014-11-10 12:29:12 -07001450 }
Mark Lobodzinskied450b02015-04-07 13:38:21 -05001451
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001452 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001453 if (VK_FALSE == skipCall) {
1454 result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueSubmit(
1455 queue, cmdBufferCount, pCmdBuffers, fence);
1456 }
Courtney Goeltzenleuchterd3fb9552015-04-02 13:39:07 -06001457 return result;
1458}
1459
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001460VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory(
1461 VkDevice device,
1462 const VkMemoryAllocInfo *pAllocInfo,
1463 VkDeviceMemory *pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001464{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001465 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->AllocMemory(device, pAllocInfo, pMem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001466 // TODO : Track allocations and overall size here
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001467 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchter7dcc6a72015-06-11 16:01:11 -06001468 add_mem_obj_info(device, *pMem, pAllocInfo);
Mark Lobodzinski524df112015-08-10 14:37:52 -06001469 print_mem_list(device);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001470 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001471 return result;
1472}
1473
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001474VK_LAYER_EXPORT void VKAPI vkFreeMemory(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001475 VkDevice device,
1476 VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001477{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001478 /* From spec : A memory object is freed by calling vkFreeMemory() when it is no longer needed. Before
Tobin Ehlisc0418f92014-11-25 14:47:20 -07001479 * freeing a memory object, an application must ensure the memory object is unbound from
1480 * all API objects referencing it and that it is not referenced by any queued command buffers
1481 */
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001482 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001483 freeMemObjInfo(device, mem, false);
Mark Lobodzinski524df112015-08-10 14:37:52 -06001484 print_mem_list(device);
1485 print_object_list(device);
1486 printCBList(device);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001487 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001488 get_dispatch_table(mem_tracker_device_table_map, device)->FreeMemory(device, mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001489}
1490
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001491VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(
1492 VkDevice device,
1493 VkDeviceMemory mem,
1494 VkDeviceSize offset,
1495 VkDeviceSize size,
1496 VkFlags flags,
1497 void **ppData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001498{
1499 // TODO : Track when memory is mapped
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001500 VkBool32 skipCall = VK_FALSE;
1501 VkResult result = VK_ERROR_VALIDATION_FAILED;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001502 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001503 MT_MEM_OBJ_INFO *pMemObj = get_mem_obj_info(mem.handle);
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -06001504 if ((memProps.memoryTypes[pMemObj->allocInfo.memoryTypeIndex].propertyFlags &
1505 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001506 skipCall = log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_STATE, "MEM",
1507 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set: mem obj %#" PRIxLEAST64, mem.handle);
Mark Lobodzinski95152dc2015-02-25 12:16:04 -06001508 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001509 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001510 if (VK_FALSE == skipCall) {
1511 result = get_dispatch_table(mem_tracker_device_table_map, device)->MapMemory(device, mem, offset, size, flags, ppData);
1512 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001513 return result;
1514}
1515
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001516VK_LAYER_EXPORT void VKAPI vkUnmapMemory(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001517 VkDevice device,
1518 VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001519{
1520 // TODO : Track as memory gets unmapped, do we want to check what changed following map?
1521 // Make sure that memory was ever mapped to begin with
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001522 get_dispatch_table(mem_tracker_device_table_map, device)->UnmapMemory(device, mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001523}
1524
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001525VK_LAYER_EXPORT void VKAPI vkDestroyFence(VkDevice device, VkFence fence)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001526{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001527 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001528 delete_fence_info(fence);
1529 auto item = fenceMap.find(fence.handle);
1530 if (item != fenceMap.end()) {
1531 fenceMap.erase(item);
Tobin Ehlisa98df732014-11-27 07:52:04 -07001532 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001533 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001534 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyFence(device, fence);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001535}
1536
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001537VK_LAYER_EXPORT void VKAPI vkDestroyBuffer(VkDevice device, VkBuffer buffer)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001538{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001539 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis257d9742015-07-08 17:08:02 -06001540 loader_platform_thread_lock_mutex(&globalLock);
1541 auto item = bufferMap.find(buffer.handle);
1542 if (item != bufferMap.end()) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001543 skipCall = clear_object_binding(device, buffer.handle, VK_OBJECT_TYPE_BUFFER);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001544 bufferMap.erase(item);
1545 }
1546 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001547 if (VK_FALSE == skipCall) {
1548 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyBuffer(device, buffer);
1549 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001550}
1551
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001552VK_LAYER_EXPORT void VKAPI vkDestroyImage(VkDevice device, VkImage image)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001553{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001554 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis257d9742015-07-08 17:08:02 -06001555 loader_platform_thread_lock_mutex(&globalLock);
1556 auto item = imageMap.find(image.handle);
1557 if (item != imageMap.end()) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001558 skipCall = clear_object_binding(device, image.handle, VK_OBJECT_TYPE_IMAGE);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001559 imageMap.erase(item);
1560 }
1561 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001562 if (VK_FALSE == skipCall) {
1563 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyImage(device, image);
1564 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06001565}
1566
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001567VK_LAYER_EXPORT void VKAPI vkDestroyImageView(VkDevice device, VkImageView imageView)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001568{
1569 loader_platform_thread_lock_mutex(&globalLock);
1570 auto item = imageViewMap.find(imageView.handle);
1571 if (item != imageViewMap.end()) {
1572 imageViewMap.erase(item);
1573 }
1574 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001575 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyImageView(device, imageView);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001576}
1577
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001578VK_LAYER_EXPORT void VKAPI vkDestroyPipeline(VkDevice device, VkPipeline pipeline)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001579{
1580 loader_platform_thread_lock_mutex(&globalLock);
1581 auto item = pipelineMap.find(pipeline.handle);
1582 if (item != pipelineMap.end()) {
1583 pipelineMap.erase(item);
1584 }
1585 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001586 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyPipeline(device, pipeline);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001587}
1588
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001589VK_LAYER_EXPORT void VKAPI vkDestroySampler(VkDevice device, VkSampler sampler)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001590{
1591 loader_platform_thread_lock_mutex(&globalLock);
1592 auto item = samplerMap.find(sampler.handle);
1593 if (item != samplerMap.end()) {
1594 samplerMap.erase(item);
1595 }
1596 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001597 get_dispatch_table(mem_tracker_device_table_map, device)->DestroySampler(device, sampler);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001598}
1599
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001600VK_LAYER_EXPORT void VKAPI vkDestroySemaphore(VkDevice device, VkSemaphore semaphore)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001601{
1602 loader_platform_thread_lock_mutex(&globalLock);
1603 auto item = semaphoreMap.find(semaphore.handle);
1604 if (item != semaphoreMap.end()) {
1605 semaphoreMap.erase(item);
1606 }
1607 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001608 get_dispatch_table(mem_tracker_device_table_map, device)->DestroySemaphore(device, semaphore);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001609}
1610
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001611VK_LAYER_EXPORT void VKAPI vkDestroyEvent(VkDevice device, VkEvent event)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001612{
1613 loader_platform_thread_lock_mutex(&globalLock);
1614 auto item = eventMap.find(event.handle);
1615 if (item != eventMap.end()) {
1616 eventMap.erase(item);
1617 }
1618 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001619 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyEvent(device, event);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001620}
1621
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001622VK_LAYER_EXPORT void VKAPI vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001623{
1624 loader_platform_thread_lock_mutex(&globalLock);
1625 auto item = queryPoolMap.find(queryPool.handle);
1626 if (item != queryPoolMap.end()) {
1627 queryPoolMap.erase(item);
1628 }
1629 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001630 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyQueryPool(device, queryPool);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001631}
1632
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001633VK_LAYER_EXPORT void VKAPI vkDestroyBufferView(VkDevice device, VkBufferView bufferView)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001634{
1635 loader_platform_thread_lock_mutex(&globalLock);
1636 auto item = bufferViewMap.find(bufferView.handle);
1637 if (item != bufferViewMap.end()) {
1638 bufferViewMap.erase(item);
1639 }
1640 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001641 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyBufferView(device, bufferView);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001642}
1643
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001644VK_LAYER_EXPORT void VKAPI vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001645{
1646 loader_platform_thread_lock_mutex(&globalLock);
1647 auto item = shaderModuleMap.find(shaderModule.handle);
1648 if (item != shaderModuleMap.end()) {
1649 shaderModuleMap.erase(item);
1650 }
1651 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001652 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyShaderModule(device, shaderModule);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001653}
1654
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001655VK_LAYER_EXPORT void VKAPI vkDestroyShader(VkDevice device, VkShader shader)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001656{
1657 loader_platform_thread_lock_mutex(&globalLock);
1658 auto item = shaderMap.find(shader.handle);
1659 if (item != shaderMap.end()) {
1660 shaderMap.erase(item);
1661 }
1662 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001663 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyShader(device, shader);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001664}
1665
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001666VK_LAYER_EXPORT void VKAPI vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001667{
1668 loader_platform_thread_lock_mutex(&globalLock);
1669 auto item = pipelineLayoutMap.find(pipelineLayout.handle);
1670 if (item != pipelineLayoutMap.end()) {
1671 pipelineLayoutMap.erase(item);
1672 }
1673 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001674 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001675}
1676
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001677VK_LAYER_EXPORT void VKAPI vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001678{
1679 loader_platform_thread_lock_mutex(&globalLock);
1680 auto item = descriptorSetLayoutMap.find(descriptorSetLayout.handle);
1681 if (item != descriptorSetLayoutMap.end()) {
1682 descriptorSetLayoutMap.erase(item);
1683 }
1684 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001685 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001686}
1687
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001688VK_LAYER_EXPORT void VKAPI vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001689{
1690 loader_platform_thread_lock_mutex(&globalLock);
1691 auto item = descriptorPoolMap.find(descriptorPool.handle);
1692 if (item != descriptorPoolMap.end()) {
1693 descriptorPoolMap.erase(item);
1694 }
1695 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001696 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001697}
1698
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001699//VK_LAYER_EXPORT void VKAPI vkDestroyDescriptorSet(VkDevice device, VkDescriptorSet descriptorSet)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001700//{
1701// loader_platform_thread_lock_mutex(&globalLock);
1702// auto item = descriptorSetMap.find(descriptorSet.handle);
1703// if (item != descriptorSetMap.end()) {
1704// descriptorSetMap.erase(item);
1705// }
1706// loader_platform_thread_unlock_mutex(&globalLock);
1707// VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyDescriptorSet(device, descriptorSet);
1708// return result;
1709//}
1710
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001711VK_LAYER_EXPORT void VKAPI vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001712{
1713 loader_platform_thread_lock_mutex(&globalLock);
1714 auto item = renderPassMap.find(renderPass.handle);
1715 if (item != renderPassMap.end()) {
1716 renderPassMap.erase(item);
1717 }
1718 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001719 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyRenderPass(device, renderPass);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001720}
1721
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001722VK_LAYER_EXPORT void VKAPI vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001723{
1724 loader_platform_thread_lock_mutex(&globalLock);
1725 auto item = framebufferMap.find(framebuffer.handle);
1726 if (item != framebufferMap.end()) {
1727 framebufferMap.erase(item);
1728 }
1729 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski2141f652015-09-07 13:59:43 -06001730 get_dispatch_table(mem_tracker_device_table_map, device)->DestroyFramebuffer(device, framebuffer);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001731}
1732
Tobin Ehlis257d9742015-07-08 17:08:02 -06001733VkResult VKAPI vkBindBufferMemory(
1734 VkDevice device,
1735 VkBuffer buffer,
1736 VkDeviceMemory mem,
1737 VkDeviceSize memOffset)
1738{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001739 VkResult result = VK_ERROR_VALIDATION_FAILED;
Mike Stroyanb050c682015-04-17 12:36:38 -06001740 loader_platform_thread_lock_mutex(&globalLock);
1741 // Track objects tied to memory
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001742 VkBool32 skipCall = set_mem_binding(device, mem, buffer.handle, VK_OBJECT_TYPE_BUFFER, "vkBindBufferMemory");
Tobin Ehlis2717d132015-07-10 18:25:07 -06001743 add_object_binding_info(buffer.handle, VK_OBJECT_TYPE_BUFFER, mem);
Mark Lobodzinski524df112015-08-10 14:37:52 -06001744 print_object_list(device);
1745 print_mem_list(device);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001746 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001747 if (VK_FALSE == skipCall) {
1748 result = get_dispatch_table(mem_tracker_device_table_map, device)->BindBufferMemory(device, buffer, mem, memOffset);
1749 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06001750 return result;
1751}
1752
1753VkResult VKAPI vkBindImageMemory(
1754 VkDevice device,
1755 VkImage image,
1756 VkDeviceMemory mem,
1757 VkDeviceSize memOffset)
1758{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001759 VkResult result = VK_ERROR_VALIDATION_FAILED;
Tobin Ehlis257d9742015-07-08 17:08:02 -06001760 loader_platform_thread_lock_mutex(&globalLock);
1761 // Track objects tied to memory
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001762 VkBool32 skipCall = set_mem_binding(device, mem, image.handle, VK_OBJECT_TYPE_IMAGE, "vkBindImageMemory");
Tobin Ehlis2717d132015-07-10 18:25:07 -06001763 add_object_binding_info(image.handle, VK_OBJECT_TYPE_IMAGE, mem);
Mark Lobodzinski524df112015-08-10 14:37:52 -06001764 print_object_list(device);
1765 print_mem_list(device);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001766 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001767 if (VK_FALSE == skipCall) {
1768 result = get_dispatch_table(mem_tracker_device_table_map, device)->BindImageMemory(device, image, mem, memOffset);
1769 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06001770 return result;
1771}
1772
1773VkResult VKAPI vkGetBufferMemoryRequirements(
1774 VkDevice device,
1775 VkBuffer buffer,
1776 VkMemoryRequirements* pMemoryRequirements)
1777{
1778 // TODO : What to track here?
1779 // Could potentially save returned mem requirements and validate values passed into BindBufferMemory
1780 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
1781 return result;
1782}
1783
1784VkResult VKAPI vkGetImageMemoryRequirements(
1785 VkDevice device,
1786 VkImage image,
1787 VkMemoryRequirements* pMemoryRequirements)
1788{
1789 // TODO : What to track here?
1790 // Could potentially save returned mem requirements and validate values passed into BindImageMemory
1791 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
1792 return result;
1793}
1794
1795VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageOpaqueMemory(
1796 VkQueue queue,
1797 VkImage image,
1798 uint32_t numBindings,
1799 const VkSparseMemoryBindInfo* pBindInfo)
1800{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001801 VkResult result = VK_ERROR_VALIDATION_FAILED;
Tobin Ehlis257d9742015-07-08 17:08:02 -06001802 loader_platform_thread_lock_mutex(&globalLock);
1803 // Track objects tied to memory
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001804 VkBool32 skipCall = set_sparse_mem_binding(queue, pBindInfo->mem, image.handle, VK_OBJECT_TYPE_IMAGE, "vkQueueBindSparseImageOpaqeMemory");
Mark Lobodzinski524df112015-08-10 14:37:52 -06001805 print_object_list(queue);
1806 print_mem_list(queue);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001807 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001808 if (VK_FALSE == skipCall) {
1809 result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueBindSparseImageOpaqueMemory( queue, image, numBindings, pBindInfo);
1810 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06001811 return result;
1812}
1813
1814VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageMemory(
1815 VkQueue queue,
1816 VkImage image,
1817 uint32_t numBindings,
1818 const VkSparseImageMemoryBindInfo* pBindInfo)
1819{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001820 VkResult result = VK_ERROR_VALIDATION_FAILED;
Tobin Ehlis257d9742015-07-08 17:08:02 -06001821 loader_platform_thread_lock_mutex(&globalLock);
1822 // Track objects tied to memory
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001823 VkBool32 skipCall = set_sparse_mem_binding(queue, pBindInfo->mem, image.handle, VK_OBJECT_TYPE_IMAGE, "vkQueueBindSparseImageMemory");
Mark Lobodzinski524df112015-08-10 14:37:52 -06001824 print_object_list(queue);
1825 print_mem_list(queue);
Mike Stroyanb050c682015-04-17 12:36:38 -06001826 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001827 if (VK_FALSE == skipCall) {
1828 VkResult result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueBindSparseImageMemory(
1829 queue, image, numBindings, pBindInfo);
1830 }
Mike Stroyanb050c682015-04-17 12:36:38 -06001831 return result;
1832}
1833
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001834VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(
Mark Lobodzinski16e8bef2015-07-03 15:58:09 -06001835 VkQueue queue,
1836 VkBuffer buffer,
1837 uint32_t numBindings,
1838 const VkSparseMemoryBindInfo* pBindInfo)
Mike Stroyanb050c682015-04-17 12:36:38 -06001839{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001840 VkResult result = VK_ERROR_VALIDATION_FAILED;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001841 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001842 // Track objects tied to memory
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001843 VkBool32 skipCall = set_sparse_mem_binding(queue, pBindInfo->mem, buffer.handle, VK_OBJECT_TYPE_BUFFER, "VkQueueBindSparseBufferMemory");
Mark Lobodzinski524df112015-08-10 14:37:52 -06001844 print_object_list(queue);
1845 print_mem_list(queue);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001846 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001847 if (VK_FALSE == skipCall) {
1848 VkResult result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueBindSparseBufferMemory(
1849 queue, buffer, numBindings, pBindInfo);
1850 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001851 return result;
1852}
1853
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001854VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(
1855 VkDevice device,
1856 const VkFenceCreateInfo *pCreateInfo,
1857 VkFence *pFence)
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001858{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001859 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateFence(device, pCreateInfo, pFence);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001860 if (VK_SUCCESS == result) {
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001861 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001862 MT_FENCE_INFO* pFI = &fenceMap[pFence->handle];
1863 memset(pFI, 0, sizeof(MT_FENCE_INFO));
1864 memcpy(&(pFI->createInfo), pCreateInfo, sizeof(VkFenceCreateInfo));
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001865 loader_platform_thread_unlock_mutex(&globalLock);
1866 }
1867 return result;
1868}
1869
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001870VK_LAYER_EXPORT VkResult VKAPI vkResetFences(
1871 VkDevice device,
1872 uint32_t fenceCount,
Courtney Goeltzenleuchter2bf8f902015-06-18 17:28:20 -06001873 const VkFence *pFences)
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001874{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001875 VkResult result = VK_ERROR_VALIDATION_FAILED;
1876 VkBool32 skipCall = VK_FALSE;
1877
1878 loader_platform_thread_lock_mutex(&globalLock);
1879 // Reset fence state in fenceCreateInfo structure
1880 for (uint32_t i = 0; i < fenceCount; i++) {
1881 auto fence_item = fenceMap.find(pFences[i].handle);
1882 if (fence_item != fenceMap.end()) {
1883 // Validate fences in SIGNALED state
1884 if (!(fence_item->second.createInfo.flags & VK_FENCE_CREATE_SIGNALED_BIT)) {
1885 skipCall = log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_FENCE, pFences[i].handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
1886 "Fence %#" PRIxLEAST64 " submitted to VkResetFences in UNSIGNALED STATE", pFences[i].handle);
1887 }
1888 else {
1889 fence_item->second.createInfo.flags =
1890 static_cast<VkFenceCreateFlags>(fence_item->second.createInfo.flags & ~VK_FENCE_CREATE_SIGNALED_BIT);
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001891 }
1892 }
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001893 }
1894 loader_platform_thread_unlock_mutex(&globalLock);
1895 if (VK_FALSE == skipCall) {
1896 result = get_dispatch_table(mem_tracker_device_table_map, device)->ResetFences(device, fenceCount, pFences);
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001897 }
1898 return result;
1899}
1900
Tobin Ehlisc4f105d2015-09-14 13:25:57 -06001901static inline VkBool32 verifyFenceStatus(VkDevice device, VkFence fence, const char* apiCall)
1902{
1903 VkBool32 skipCall = VK_FALSE;
1904 auto pFenceInfo = fenceMap.find(fence.handle);
1905 if (pFenceInfo != fenceMap.end()) {
1906 if (pFenceInfo->second.createInfo.flags & VK_FENCE_CREATE_SIGNALED_BIT) {
1907 skipCall |= log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, fence.handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
1908 "%s specified fence %#" PRIxLEAST64 " already in SIGNALED state.", apiCall, fence.handle);
1909 }
1910 if (!pFenceInfo->second.queue) { // Checking status of unsubmitted fence
1911 skipCall |= log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, fence.handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
1912 "%s called for fence %#" PRIxLEAST64 " which has not been submitted on a Queue.", apiCall, fence.handle);
1913 }
1914 }
1915 return skipCall;
1916}
1917
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001918VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(
1919 VkDevice device,
1920 VkFence fence)
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001921{
Tobin Ehlisc4f105d2015-09-14 13:25:57 -06001922 VkBool32 skipCall = verifyFenceStatus(device, fence, "vkGetFenceStatus");
1923 if (skipCall)
1924 return VK_ERROR_VALIDATION_FAILED;
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001925 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetFenceStatus(device, fence);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001926 if (VK_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001927 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001928 update_fence_tracking(fence);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001929 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001930 }
1931 return result;
1932}
1933
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001934VK_LAYER_EXPORT VkResult VKAPI vkWaitForFences(
1935 VkDevice device,
1936 uint32_t fenceCount,
1937 const VkFence *pFences,
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -06001938 VkBool32 waitAll,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001939 uint64_t timeout)
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001940{
Tobin Ehlisc4f105d2015-09-14 13:25:57 -06001941 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001942 // Verify fence status of submitted fences
1943 for(uint32_t i = 0; i < fenceCount; i++) {
Tobin Ehlisc4f105d2015-09-14 13:25:57 -06001944 skipCall |= verifyFenceStatus(device, pFences[i], "vkWaitForFences");
Mark Lobodzinski148e1582015-04-07 16:07:57 -05001945 }
Tobin Ehlisc4f105d2015-09-14 13:25:57 -06001946 if (skipCall)
1947 return VK_ERROR_VALIDATION_FAILED;
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001948 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001949 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski50932972015-04-02 20:49:09 -05001950
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001951 if (VK_SUCCESS == result) {
Mark Lobodzinski50932972015-04-02 20:49:09 -05001952 if (waitAll || fenceCount == 1) { // Clear all the fences
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001953 for(uint32_t i = 0; i < fenceCount; i++) {
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001954 update_fence_tracking(pFences[i]);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001955 }
1956 }
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001957 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001958 loader_platform_thread_unlock_mutex(&globalLock);
1959 return result;
1960}
1961
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001962VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(
1963 VkQueue queue)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001964{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001965 VkResult result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueWaitIdle(queue);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001966 if (VK_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001967 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001968 retire_queue_fences(queue);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001969 loader_platform_thread_unlock_mutex(&globalLock);
1970 }
1971 return result;
1972}
1973
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001974VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle(
1975 VkDevice device)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001976{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001977 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DeviceWaitIdle(device);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001978 if (VK_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001979 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001980 retire_device_fences(device);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05001981 loader_platform_thread_unlock_mutex(&globalLock);
1982 }
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07001983 return result;
1984}
1985
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001986VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(
1987 VkDevice device,
1988 const VkEventCreateInfo *pCreateInfo,
1989 VkEvent *pEvent)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001990{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001991 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateEvent(device, pCreateInfo, pEvent);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001992 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001993 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001994 add_object_create_info(pEvent->handle, VK_OBJECT_TYPE_EVENT, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001995 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06001996 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001997 return result;
1998}
1999
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002000VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(
2001 VkDevice device,
2002 const VkQueryPoolCreateInfo *pCreateInfo,
2003 VkQueryPool *pQueryPool)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002004{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002005 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pQueryPool);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002006 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002007 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002008 add_object_create_info(pQueryPool->handle, VK_OBJECT_TYPE_QUERY_POOL, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002009 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06002010 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002011 return result;
2012}
2013
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002014VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(
2015 VkDevice device,
2016 const VkBufferCreateInfo *pCreateInfo,
2017 VkBuffer *pBuffer)
Tobin Ehlis7265e832015-01-19 08:42:29 -07002018{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002019 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateBuffer(device, pCreateInfo, pBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002020 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002021 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002022 add_object_create_info(pBuffer->handle, VK_OBJECT_TYPE_BUFFER, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002023 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06002024 }
Tobin Ehlis7265e832015-01-19 08:42:29 -07002025 return result;
2026}
2027
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002028VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(
2029 VkDevice device,
2030 const VkBufferViewCreateInfo *pCreateInfo,
2031 VkBufferView *pView)
Tobin Ehlis7265e832015-01-19 08:42:29 -07002032{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002033 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateBufferView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002034 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002035 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002036 add_object_create_info(pView->handle, VK_OBJECT_TYPE_BUFFER_VIEW, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002037 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06002038 }
Tobin Ehlis7265e832015-01-19 08:42:29 -07002039 return result;
2040}
2041
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002042VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(
2043 VkDevice device,
2044 const VkImageCreateInfo *pCreateInfo,
2045 VkImage *pImage)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002046{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002047 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateImage(device, pCreateInfo, pImage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002048 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002049 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002050 add_object_create_info(pImage->handle, VK_OBJECT_TYPE_IMAGE, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002051 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002052 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002053 return result;
2054}
2055
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002056VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(
2057 VkDevice device,
2058 const VkImageViewCreateInfo *pCreateInfo,
2059 VkImageView *pView)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002060{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002061 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateImageView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002062 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002063 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002064 add_object_create_info(pView->handle, VK_OBJECT_TYPE_IMAGE_VIEW, pCreateInfo);
Tobin Ehlis41376e12015-07-03 08:45:14 -06002065 // Validate that img has correct usage flags set
Courtney Goeltzenleuchter5861a1b2015-09-01 17:30:39 -06002066 validate_image_usage_flags(
2067 device, pCreateInfo->image,
Courtney Goeltzenleuchter660f0ca2015-09-10 14:14:11 -06002068 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
Courtney Goeltzenleuchter5861a1b2015-09-01 17:30:39 -06002069 false, "vkCreateImageView()", "VK_IMAGE_USAGE_[SAMPLED|STORAGE|COLOR_ATTACHMENT]_BIT");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002070 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002071 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002072 return result;
2073}
2074
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002075VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(
2076 VkDevice device,
2077 const VkShaderCreateInfo *pCreateInfo,
2078 VkShader *pShader)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002079{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002080 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateShader(device, pCreateInfo, pShader);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002081 if (result == VK_SUCCESS) {
2082 loader_platform_thread_lock_mutex(&globalLock);
2083 add_object_create_info(pShader->handle, VK_OBJECT_TYPE_SHADER, pCreateInfo);
2084 loader_platform_thread_unlock_mutex(&globalLock);
2085 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002086 return result;
2087}
2088
Jon Ashburnc669cc62015-07-09 15:02:25 -06002089//TODO do we need to intercept pipelineCache functions to track objects?
2090VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelines(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002091 VkDevice device,
Jon Ashburnc669cc62015-07-09 15:02:25 -06002092 VkPipelineCache pipelineCache,
2093 uint32_t count,
2094 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2095 VkPipeline *pPipelines)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002096{
Jon Ashburnc669cc62015-07-09 15:02:25 -06002097 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateGraphicsPipelines(device, pipelineCache, count, pCreateInfos, pPipelines);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002098 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002099 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06002100 for (int i = 0; i < count; i++) {
2101 add_object_create_info(pPipelines[i].handle, VK_OBJECT_TYPE_PIPELINE, &pCreateInfos[i]);
2102 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002103 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002104 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002105 return result;
2106}
2107
Jon Ashburnc669cc62015-07-09 15:02:25 -06002108VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipelines(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002109 VkDevice device,
Jon Ashburnc669cc62015-07-09 15:02:25 -06002110 VkPipelineCache pipelineCache,
2111 uint32_t count,
2112 const VkComputePipelineCreateInfo *pCreateInfos,
2113 VkPipeline *pPipelines)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002114{
Jon Ashburnc669cc62015-07-09 15:02:25 -06002115 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateComputePipelines(device, pipelineCache, count, pCreateInfos, pPipelines);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002116 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002117 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06002118 for (int i = 0; i < count; i++) {
2119 add_object_create_info(pPipelines[i].handle, VK_OBJECT_TYPE_PIPELINE, &pCreateInfos[i]);
2120 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002121 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002122 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002123 return result;
2124}
2125
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002126VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(
2127 VkDevice device,
2128 const VkSamplerCreateInfo *pCreateInfo,
2129 VkSampler *pSampler)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002130{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002131 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateSampler(device, pCreateInfo, pSampler);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002132 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002133 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002134 add_object_create_info(pSampler->handle, VK_OBJECT_TYPE_SAMPLER, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002135 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002136 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002137 return result;
2138}
2139
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002140VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(
2141 VkDevice device,
2142 const VkCmdBufferCreateInfo *pCreateInfo,
2143 VkCmdBuffer *pCmdBuffer)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002144{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002145 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Mark Lobodzinski223ca202015-04-02 08:52:53 -05002146 // At time of cmd buffer creation, create global cmd buffer info for the returned cmd buffer
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002147 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002148 if (*pCmdBuffer)
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002149 add_cmd_buf_info(*pCmdBuffer);
Mark Lobodzinski524df112015-08-10 14:37:52 -06002150 printCBList(device);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002151 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002152 return result;
2153}
2154
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002155VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(
2156 VkCmdBuffer cmdBuffer,
2157 const VkCmdBufferBeginInfo *pBeginInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002158{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002159 VkResult result = VK_ERROR_VALIDATION_FAILED;
2160 VkBool32 skipCall = VK_FALSE;
2161 VkBool32 cmdBufferComplete = VK_FALSE;
Mike Stroyan950496e2015-05-19 15:16:08 -06002162 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002163 // This implicitly resets the Cmd Buffer so make sure any fence is done and then clear memory references
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002164 skipCall = checkCBCompleted(cmdBuffer, &cmdBufferComplete);
2165
2166 if (VK_FALSE == cmdBufferComplete) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06002167 skipCall |= log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0,
2168 MEMTRACK_RESET_CB_WHILE_IN_FLIGHT, "MEM", "Calling vkBeginCommandBuffer() on active CB %p before it has completed. "
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002169 "You must check CB flag before this call.", cmdBuffer);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002170 }
Mike Stroyan950496e2015-05-19 15:16:08 -06002171 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002172 if (VK_FALSE == skipCall) {
2173 result = get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->BeginCommandBuffer(cmdBuffer, pBeginInfo);
2174 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002175 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002176 clear_cmd_buf_and_mem_references(cmdBuffer);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002177 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002178 return result;
2179}
2180
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002181VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(
2182 VkCmdBuffer cmdBuffer)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002183{
2184 // TODO : Anything to do here?
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002185 VkResult result = get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->EndCommandBuffer(cmdBuffer);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002186 return result;
2187}
2188
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002189VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(
Cody Northrope62183e2015-07-09 18:08:05 -06002190 VkCmdBuffer cmdBuffer,
2191 VkCmdBufferResetFlags flags)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002192{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002193 VkResult result = VK_ERROR_VALIDATION_FAILED;
2194 VkBool32 skipCall = VK_FALSE;
2195 VkBool32 cmdBufferComplete = VK_FALSE;
Mike Stroyan950496e2015-05-19 15:16:08 -06002196 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002197 // Verify that CB is complete (not in-flight)
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002198 skipCall = checkCBCompleted(cmdBuffer, &cmdBufferComplete);
2199 if (VK_FALSE == cmdBufferComplete) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06002200 skipCall |= log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0,
2201 MEMTRACK_RESET_CB_WHILE_IN_FLIGHT, "MEM", "Resetting CB %p before it has completed. You must check CB "
2202 "flag before calling vkResetCommandBuffer().", cmdBuffer);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002203 }
2204 // Clear memory references as this point.
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002205 skipCall |= clear_cmd_buf_and_mem_references(cmdBuffer);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002206 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002207 if (VK_FALSE == skipCall) {
2208 result = get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->ResetCommandBuffer(cmdBuffer, flags);
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -06002209 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002210 return result;
2211}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002212// TODO : For any vkCmdBind* calls that include an object which has mem bound to it,
Tobin Ehlis6663f492014-11-10 12:29:12 -07002213// need to account for that mem now having binding to given cmdBuffer
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002214VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(
2215 VkCmdBuffer cmdBuffer,
2216 VkPipelineBindPoint pipelineBindPoint,
2217 VkPipeline pipeline)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002218{
Tobin Ehlisc145be82015-01-08 15:22:32 -07002219#if 0
2220 // TODO : If memory bound to pipeline, then need to tie that mem to cmdBuffer
2221 if (getPipeline(pipeline)) {
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002222 MT_CB_INFO *pCBInfo = get_cmd_buf_info(cmdBuffer);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05002223 if (pCBInfo) {
2224 pCBInfo->pipelines[pipelineBindPoint] = pipeline;
Tobin Ehlisc145be82015-01-08 15:22:32 -07002225 } else {
Courtney Goeltzenleuchterb9f0bf32015-06-14 09:50:18 -06002226 "Attempt to bind Pipeline %p to non-existant command buffer %p!", (void*)pipeline, cmdBuffer);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06002227 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_INVALID_CB, (char *) "DS", (char *) str);
Tobin Ehlisc145be82015-01-08 15:22:32 -07002228 }
2229 }
2230 else {
Courtney Goeltzenleuchterb9f0bf32015-06-14 09:50:18 -06002231 "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06002232 layerCbMsg(VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_PIPELINE, pipeline, 0, MEMTRACK_INVALID_OBJECT, (char *) "DS", (char *) str);
Tobin Ehlisc145be82015-01-08 15:22:32 -07002233 }
2234#endif
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002235 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002236}
2237
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002238VK_LAYER_EXPORT void VKAPI vkCmdSetViewport(
2239 VkCmdBuffer cmdBuffer,
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06002240 uint32_t viewportCount,
2241 const VkViewport* pViewports)
2242{
2243 VkBool32 skipCall = VK_FALSE;
2244 loader_platform_thread_lock_mutex(&globalLock);
2245 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
2246 if (!pCmdBuf) {
2247 skipCall = log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0,
2248 MEMTRACK_INVALID_CB, "MEM", "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
2249 }
2250 loader_platform_thread_unlock_mutex(&globalLock);
2251 if (VK_FALSE == skipCall) {
2252 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdSetViewport(cmdBuffer, viewportCount, pViewports);
2253 }
2254}
2255
2256VK_LAYER_EXPORT void VKAPI vkCmdSetScissor(
2257 VkCmdBuffer cmdBuffer,
2258 uint32_t scissorCount,
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002259 const VkRect2D* pScissors)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002260{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002261 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002262 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002263 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
Tobin Ehlisc145be82015-01-08 15:22:32 -07002264 if (!pCmdBuf) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06002265 skipCall = log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0,
2266 MEMTRACK_INVALID_CB, "MEM", "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
Tobin Ehlisc145be82015-01-08 15:22:32 -07002267 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002268 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002269 if (VK_FALSE == skipCall) {
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06002270 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdSetScissor(cmdBuffer, scissorCount, pScissors);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002271 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06002272}
2273
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002274VK_LAYER_EXPORT void VKAPI vkCmdSetLineWidth(VkCmdBuffer cmdBuffer, float lineWidth)
Tobin Ehlis257d9742015-07-08 17:08:02 -06002275{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002276 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002277 loader_platform_thread_lock_mutex(&globalLock);
2278 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
2279 if (!pCmdBuf) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06002280 skipCall = log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0,
2281 MEMTRACK_INVALID_CB, "MEM", "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002282 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06002283 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002284 if (VK_FALSE == skipCall) {
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002285 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdSetLineWidth(cmdBuffer, lineWidth);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002286 }
Cody Northrop12365112015-08-17 11:10:49 -06002287}
2288
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002289VK_LAYER_EXPORT void VKAPI vkCmdSetDepthBias(
2290 VkCmdBuffer cmdBuffer,
2291 float depthBias,
2292 float depthBiasClamp,
2293 float slopeScaledDepthBias)
Cody Northrop12365112015-08-17 11:10:49 -06002294{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002295 VkBool32 skipCall = VK_FALSE;
Cody Northrop12365112015-08-17 11:10:49 -06002296 loader_platform_thread_lock_mutex(&globalLock);
2297 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
2298 if (!pCmdBuf) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06002299 skipCall = log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0,
2300 MEMTRACK_INVALID_CB, "MEM", "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
Cody Northrop12365112015-08-17 11:10:49 -06002301 }
Cody Northrop12365112015-08-17 11:10:49 -06002302 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002303 if (VK_FALSE == skipCall) {
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002304 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdSetDepthBias(cmdBuffer, depthBias, depthBiasClamp, slopeScaledDepthBias);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002305 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06002306}
2307
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002308VK_LAYER_EXPORT void VKAPI vkCmdSetBlendConstants(
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06002309 VkCmdBuffer cmdBuffer,
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002310 const float blendConst[4])
Tobin Ehlis257d9742015-07-08 17:08:02 -06002311{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002312 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002313 loader_platform_thread_lock_mutex(&globalLock);
2314 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
2315 if (!pCmdBuf) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06002316 skipCall = log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0,
2317 MEMTRACK_INVALID_CB, "MEM", "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002318 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06002319 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002320 if (VK_FALSE == skipCall) {
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002321 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdSetBlendConstants(cmdBuffer, blendConst);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002322 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06002323}
2324
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002325VK_LAYER_EXPORT void VKAPI vkCmdSetDepthBounds(
2326 VkCmdBuffer cmdBuffer,
2327 float minDepthBounds,
2328 float maxDepthBounds)
Tobin Ehlis257d9742015-07-08 17:08:02 -06002329{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002330 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002331 loader_platform_thread_lock_mutex(&globalLock);
2332 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
2333 if (!pCmdBuf) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06002334 skipCall = log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0,
2335 MEMTRACK_INVALID_CB, "MEM", "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002336 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06002337 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002338 if (VK_FALSE == skipCall) {
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002339 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdSetDepthBounds(cmdBuffer, minDepthBounds, maxDepthBounds);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002340 }
Cody Northrop82485a82015-08-18 15:21:16 -06002341}
2342
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002343VK_LAYER_EXPORT void VKAPI vkCmdSetStencilCompareMask(
2344 VkCmdBuffer cmdBuffer,
2345 VkStencilFaceFlags faceMask,
2346 uint32_t stencilCompareMask)
Cody Northrop82485a82015-08-18 15:21:16 -06002347{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002348 VkBool32 skipCall = VK_FALSE;
Cody Northrop82485a82015-08-18 15:21:16 -06002349 loader_platform_thread_lock_mutex(&globalLock);
2350 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
2351 if (!pCmdBuf) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06002352 skipCall = log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0,
2353 MEMTRACK_INVALID_CB, "MEM", "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
Cody Northrop82485a82015-08-18 15:21:16 -06002354 }
Cody Northrop82485a82015-08-18 15:21:16 -06002355 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002356 if (VK_FALSE == skipCall) {
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002357 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdSetStencilCompareMask(cmdBuffer, faceMask, stencilCompareMask);
2358 }
2359}
2360
2361VK_LAYER_EXPORT void VKAPI vkCmdSetStencilWriteMask(
2362 VkCmdBuffer cmdBuffer,
2363 VkStencilFaceFlags faceMask,
2364 uint32_t stencilWriteMask)
2365{
2366 VkBool32 skipCall = VK_FALSE;
2367 loader_platform_thread_lock_mutex(&globalLock);
2368 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
2369 if (!pCmdBuf) {
2370 skipCall = log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0,
2371 MEMTRACK_INVALID_CB, "MEM", "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
2372 }
2373 loader_platform_thread_unlock_mutex(&globalLock);
2374 if (VK_FALSE == skipCall) {
2375 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdSetStencilWriteMask(cmdBuffer, faceMask, stencilWriteMask);
2376 }
2377}
2378
2379VK_LAYER_EXPORT void VKAPI vkCmdSetStencilReference(
2380 VkCmdBuffer cmdBuffer,
2381 VkStencilFaceFlags faceMask,
2382 uint32_t stencilReference)
2383{
2384 VkBool32 skipCall = VK_FALSE;
2385 loader_platform_thread_lock_mutex(&globalLock);
2386 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
2387 if (!pCmdBuf) {
2388 skipCall = log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)cmdBuffer, 0,
2389 MEMTRACK_INVALID_CB, "MEM", "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
2390 }
2391 loader_platform_thread_unlock_mutex(&globalLock);
2392 if (VK_FALSE == skipCall) {
2393 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdSetStencilReference(cmdBuffer, faceMask, stencilReference);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002394 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002395}
2396
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002397VK_LAYER_EXPORT void VKAPI vkCmdBindDescriptorSets(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002398 VkCmdBuffer cmdBuffer,
2399 VkPipelineBindPoint pipelineBindPoint,
Mark Lobodzinskif2093b62015-06-15 13:21:21 -06002400 VkPipelineLayout layout,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002401 uint32_t firstSet,
2402 uint32_t setCount,
2403 const VkDescriptorSet *pDescriptorSets,
2404 uint32_t dynamicOffsetCount,
2405 const uint32_t *pDynamicOffsets)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002406{
Tobin Ehlisc145be82015-01-08 15:22:32 -07002407 // TODO : Somewhere need to verify that all textures referenced by shaders in DS are in some type of *SHADER_READ* state
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002408 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindDescriptorSets(
Mark Lobodzinskif2093b62015-06-15 13:21:21 -06002409 cmdBuffer, pipelineBindPoint, layout, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002410}
2411
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06002412VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002413 VkCmdBuffer cmdBuffer,
2414 uint32_t startBinding,
2415 uint32_t bindingCount,
2416 const VkBuffer *pBuffers,
2417 const VkDeviceSize *pOffsets)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002418{
Tobin Ehlis257d9742015-07-08 17:08:02 -06002419 // TODO : Somewhere need to verify that VBs have correct usage state flagged
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002420 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Chia-I Wu19156822015-01-05 13:42:56 +08002421}
2422
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002423VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(
2424 VkCmdBuffer cmdBuffer,
2425 VkBuffer buffer,
2426 VkDeviceSize offset,
2427 VkIndexType indexType)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002428{
Tobin Ehlis257d9742015-07-08 17:08:02 -06002429 // TODO : Somewhere need to verify that IBs have correct usage state flagged
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002430 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002431}
2432
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002433VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(
2434 VkCmdBuffer cmdBuffer,
2435 VkBuffer buffer,
2436 VkDeviceSize offset,
2437 uint32_t count,
2438 uint32_t stride)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002439{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002440 VkDeviceMemory mem;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002441 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002442 VkBool32 skipCall = get_mem_binding_from_object(cmdBuffer, buffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
2443 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdDrawIndirect");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002444 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002445 if (VK_FALSE == skipCall) {
2446 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
2447 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002448}
2449
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002450VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(
2451 VkCmdBuffer cmdBuffer,
2452 VkBuffer buffer,
2453 VkDeviceSize offset,
2454 uint32_t count,
2455 uint32_t stride)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002456{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002457 VkDeviceMemory mem;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002458 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002459 VkBool32 skipCall = get_mem_binding_from_object(cmdBuffer, buffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
2460 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdDrawIndexedIndirect");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002461 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002462 if (VK_FALSE == skipCall) {
2463 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
2464 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002465}
2466
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002467VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(
2468 VkCmdBuffer cmdBuffer,
2469 VkBuffer buffer,
2470 VkDeviceSize offset)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002471{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002472 VkDeviceMemory mem;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002473 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002474 VkBool32 skipCall = get_mem_binding_from_object(cmdBuffer, buffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
2475 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdDispatchIndirect");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002476 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002477 if (VK_FALSE == skipCall) {
2478 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdDispatchIndirect(cmdBuffer, buffer, offset);
2479 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002480}
2481
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002482VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(
2483 VkCmdBuffer cmdBuffer,
2484 VkBuffer srcBuffer,
2485 VkBuffer destBuffer,
2486 uint32_t regionCount,
2487 const VkBufferCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002488{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002489 VkDeviceMemory mem;
2490 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002491 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002492 skipCall = get_mem_binding_from_object(cmdBuffer, srcBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
2493 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyBuffer");
2494 skipCall |= get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
2495 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyBuffer");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002496 // Validate that SRC & DST buffers have correct usage flags set
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002497 skipCall |= validate_buffer_usage_flags(cmdBuffer, srcBuffer, VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdCopyBuffer()", "VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT");
2498 skipCall |= validate_buffer_usage_flags(cmdBuffer, destBuffer, VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdCopyBuffer()", "VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002499 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002500 if (VK_FALSE == skipCall) {
2501 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
2502 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002503}
2504
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002505VK_LAYER_EXPORT void VKAPI vkCmdCopyImage(
2506 VkCmdBuffer cmdBuffer,
2507 VkImage srcImage,
2508 VkImageLayout srcImageLayout,
2509 VkImage destImage,
2510 VkImageLayout destImageLayout,
2511 uint32_t regionCount,
2512 const VkImageCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002513{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002514 VkDeviceMemory mem;
2515 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002516 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41376e12015-07-03 08:45:14 -06002517 // Validate that src & dst images have correct usage flags set
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002518 skipCall = get_mem_binding_from_object(cmdBuffer, srcImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
2519 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyImage");
2520 skipCall |= get_mem_binding_from_object(cmdBuffer, destImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
2521 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyImage");
2522 skipCall |= validate_image_usage_flags(cmdBuffer, srcImage, VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdCopyImage()", "VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT");
2523 skipCall |= validate_image_usage_flags(cmdBuffer, destImage, VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdCopyImage()", "VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002524 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002525 if (VK_FALSE == skipCall) {
2526 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdCopyImage(
2527 cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
2528 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002529}
2530
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002531VK_LAYER_EXPORT void VKAPI vkCmdBlitImage(
2532 VkCmdBuffer cmdBuffer,
2533 VkImage srcImage,
2534 VkImageLayout srcImageLayout,
2535 VkImage destImage,
2536 VkImageLayout destImageLayout,
2537 uint32_t regionCount,
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05002538 const VkImageBlit *pRegions,
2539 VkTexFilter filter)
Courtney Goeltzenleuchter89299fa2015-03-08 17:02:18 -06002540{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002541 VkDeviceMemory mem;
2542 VkBool32 skipCall = VK_FALSE;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002543 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41376e12015-07-03 08:45:14 -06002544 // Validate that src & dst images have correct usage flags set
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002545 skipCall = get_mem_binding_from_object(cmdBuffer, srcImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
2546 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdBlitImage");
2547 skipCall |= get_mem_binding_from_object(cmdBuffer, destImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
2548 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdBlitImage");
2549 skipCall |= validate_image_usage_flags(cmdBuffer, srcImage, VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT");
2550 skipCall |= validate_image_usage_flags(cmdBuffer, destImage, VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002551 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002552 if (VK_FALSE == skipCall) {
2553 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBlitImage(
2554 cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter);
2555 }
Courtney Goeltzenleuchter89299fa2015-03-08 17:02:18 -06002556}
2557
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002558VK_LAYER_EXPORT void VKAPI vkCmdCopyBufferToImage(
2559 VkCmdBuffer cmdBuffer,
2560 VkBuffer srcBuffer,
2561 VkImage destImage,
2562 VkImageLayout destImageLayout,
2563 uint32_t regionCount,
2564 const VkBufferImageCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002565{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002566 VkDeviceMemory mem;
2567 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002568 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002569 skipCall = get_mem_binding_from_object(cmdBuffer, destImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
2570 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyBufferToImage");
2571 skipCall |= get_mem_binding_from_object(cmdBuffer, srcBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
2572 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyBufferToImage");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002573 // Validate that src buff & dst image have correct usage flags set
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002574 skipCall |= validate_buffer_usage_flags(cmdBuffer, srcBuffer, VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdCopyBufferToImage()", "VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT");
2575 skipCall |= validate_image_usage_flags(cmdBuffer, destImage, VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdCopyBufferToImage()", "VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002576 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002577 if (VK_FALSE == skipCall) {
2578 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdCopyBufferToImage(
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05002579 cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002580 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002581}
2582
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002583VK_LAYER_EXPORT void VKAPI vkCmdCopyImageToBuffer(
2584 VkCmdBuffer cmdBuffer,
2585 VkImage srcImage,
2586 VkImageLayout srcImageLayout,
2587 VkBuffer destBuffer,
2588 uint32_t regionCount,
2589 const VkBufferImageCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002590{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002591 VkDeviceMemory mem;
2592 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002593 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002594 skipCall = get_mem_binding_from_object(cmdBuffer, srcImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
2595 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyImageToBuffer");
2596 skipCall |= get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
2597 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdCopyImageToBuffer");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002598 // Validate that dst buff & src image have correct usage flags set
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002599 skipCall |= validate_image_usage_flags(cmdBuffer, srcImage, VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdCopyImageToBuffer()", "VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT");
2600 skipCall |= validate_buffer_usage_flags(cmdBuffer, destBuffer, VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdCopyImageToBuffer()", "VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002601 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002602 if (VK_FALSE == skipCall) {
2603 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdCopyImageToBuffer(
2604 cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
2605 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002606}
2607
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002608VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(
2609 VkCmdBuffer cmdBuffer,
2610 VkBuffer destBuffer,
2611 VkDeviceSize destOffset,
2612 VkDeviceSize dataSize,
2613 const uint32_t *pData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002614{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002615 VkDeviceMemory mem;
2616 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002617 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002618 skipCall = get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
2619 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdUpdateBuffer");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002620 // Validate that dst buff has correct usage flags set
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002621 skipCall |= validate_buffer_usage_flags(cmdBuffer, destBuffer, VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdUpdateBuffer()", "VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002622 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002623 if (VK_FALSE == skipCall) {
2624 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
2625 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002626}
2627
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002628VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(
2629 VkCmdBuffer cmdBuffer,
2630 VkBuffer destBuffer,
2631 VkDeviceSize destOffset,
2632 VkDeviceSize fillSize,
2633 uint32_t data)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002634{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002635 VkDeviceMemory mem;
2636 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002637 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002638 skipCall = get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER, &mem);
2639 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdFillBuffer");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002640 // Validate that dst buff has correct usage flags set
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002641 skipCall |= validate_buffer_usage_flags(cmdBuffer, destBuffer, VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdFillBuffer()", "VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002642 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002643 if (VK_FALSE == skipCall) {
2644 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
2645 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002646}
2647
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002648VK_LAYER_EXPORT void VKAPI vkCmdClearColorImage(
2649 VkCmdBuffer cmdBuffer,
2650 VkImage image,
2651 VkImageLayout imageLayout,
Chris Forbesf0796e12015-06-24 14:34:53 +12002652 const VkClearColorValue *pColor,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002653 uint32_t rangeCount,
2654 const VkImageSubresourceRange *pRanges)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002655{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002656 // TODO : Verify memory is in VK_IMAGE_STATE_CLEAR state
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002657 VkDeviceMemory mem;
2658 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002659 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002660 skipCall = get_mem_binding_from_object(cmdBuffer, image.handle, VK_OBJECT_TYPE_IMAGE, &mem);
2661 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdClearColorImage");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002662 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002663 if (VK_FALSE == skipCall) {
2664 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
2665 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002666}
2667
Chris Forbesd9be82b2015-06-22 17:21:59 +12002668VK_LAYER_EXPORT void VKAPI vkCmdClearDepthStencilImage(
Courtney Goeltzenleuchter45df9e12015-09-15 18:03:22 -06002669 VkCmdBuffer cmdBuffer,
2670 VkImage image,
2671 VkImageLayout imageLayout,
2672 const VkClearDepthStencilValue* pDepthStencil,
2673 uint32_t rangeCount,
2674 const VkImageSubresourceRange* pRanges)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002675{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002676 // TODO : Verify memory is in VK_IMAGE_STATE_CLEAR state
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002677 VkDeviceMemory mem;
2678 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002679 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002680 skipCall = get_mem_binding_from_object(cmdBuffer, image.handle, VK_OBJECT_TYPE_IMAGE, &mem);
2681 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdClearDepthStencilImage");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002682 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002683 if (VK_FALSE == skipCall) {
2684 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdClearDepthStencilImage(
Courtney Goeltzenleuchter45df9e12015-09-15 18:03:22 -06002685 cmdBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002686 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002687}
2688
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002689VK_LAYER_EXPORT void VKAPI vkCmdResolveImage(
2690 VkCmdBuffer cmdBuffer,
2691 VkImage srcImage,
2692 VkImageLayout srcImageLayout,
2693 VkImage destImage,
2694 VkImageLayout destImageLayout,
2695 uint32_t regionCount,
2696 const VkImageResolve *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002697{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002698 VkBool32 skipCall = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002699 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002700 VkDeviceMemory mem;
2701 skipCall = get_mem_binding_from_object(cmdBuffer, srcImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
2702 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdResolveImage");
2703 skipCall |= get_mem_binding_from_object(cmdBuffer, destImage.handle, VK_OBJECT_TYPE_IMAGE, &mem);
2704 skipCall |= update_cmd_buf_and_mem_references(cmdBuffer, mem, "vkCmdResolveImage");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002705 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002706 if (VK_FALSE == skipCall) {
2707 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdResolveImage(
2708 cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
2709 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002710}
2711
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002712VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(
2713 VkCmdBuffer cmdBuffer,
2714 VkQueryPool queryPool,
2715 uint32_t slot,
2716 VkFlags flags)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002717{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002718 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002719}
2720
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002721VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(
2722 VkCmdBuffer cmdBuffer,
2723 VkQueryPool queryPool,
2724 uint32_t slot)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002725{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002726 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdEndQuery(cmdBuffer, queryPool, slot);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002727}
2728
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002729VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(
2730 VkCmdBuffer cmdBuffer,
2731 VkQueryPool queryPool,
2732 uint32_t startQuery,
2733 uint32_t queryCount)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002734{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002735 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002736}
2737
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06002738VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback(
2739 VkInstance instance,
2740 VkFlags msgFlags,
2741 const PFN_vkDbgMsgCallback pfnMsgCallback,
2742 void* pUserData,
2743 VkDbgMsgCallback* pMsgCallback)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002744{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002745 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, instance);
2746 VkResult res = pTable->DbgCreateMsgCallback(instance, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
2747 if (res == VK_SUCCESS) {
2748 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
2749
2750 res = layer_create_msg_callback(my_data->report_data, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
2751 }
2752 return res;
Tobin Ehlis6663f492014-11-10 12:29:12 -07002753}
2754
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06002755VK_LAYER_EXPORT VkResult VKAPI vkDbgDestroyMsgCallback(
2756 VkInstance instance,
2757 VkDbgMsgCallback msgCallback)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002758{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002759 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, instance);
2760 VkResult res = pTable->DbgDestroyMsgCallback(instance, msgCallback);
2761
2762 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
2763 layer_destroy_msg_callback(my_data->report_data, msgCallback);
2764
2765 return res;
Tobin Ehlis6663f492014-11-10 12:29:12 -07002766}
2767
Ian Elliott7e40db92015-08-21 15:09:33 -06002768VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapchainKHR(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002769 VkDevice device,
Ian Elliott7e40db92015-08-21 15:09:33 -06002770 const VkSwapchainCreateInfoKHR *pCreateInfo,
2771 VkSwapchainKHR *pSwapchain)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002772{
Ian Elliott7e40db92015-08-21 15:09:33 -06002773 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pSwapchain);
Chia-I Wuf8693382015-04-16 22:02:10 +08002774
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002775 if (VK_SUCCESS == result) {
Chia-I Wuf8693382015-04-16 22:02:10 +08002776 loader_platform_thread_lock_mutex(&globalLock);
Ian Elliott7e40db92015-08-21 15:09:33 -06002777 add_swap_chain_info(*pSwapchain, pCreateInfo);
Chia-I Wuf8693382015-04-16 22:02:10 +08002778 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002779 }
Chia-I Wuf8693382015-04-16 22:02:10 +08002780
Tobin Ehlis6663f492014-11-10 12:29:12 -07002781 return result;
2782}
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002783
Ian Elliott7e40db92015-08-21 15:09:33 -06002784VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapchainKHR(
Ian Elliott1064fe32015-07-06 14:31:32 -06002785 VkDevice device,
Ian Elliott7e40db92015-08-21 15:09:33 -06002786 VkSwapchainKHR swapchain)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002787{
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002788 VkBool32 skipCall = VK_FALSE;
2789 VkResult result = VK_ERROR_VALIDATION_FAILED;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002790 loader_platform_thread_lock_mutex(&globalLock);
Ian Elliott7e40db92015-08-21 15:09:33 -06002791 if (swapchainMap.find(swapchain.handle) != swapchainMap.end()) {
2792 MT_SWAP_CHAIN_INFO* pInfo = swapchainMap[swapchain.handle];
Chia-I Wuf8693382015-04-16 22:02:10 +08002793
David Pinedod8f83d82015-04-27 16:36:17 -06002794 if (pInfo->images.size() > 0) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002795 for (auto it = pInfo->images.begin(); it != pInfo->images.end(); it++) {
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002796 skipCall = clear_object_binding(device, it->handle, VK_OBJECT_TYPE_SWAPCHAIN_KHR);
Ian Elliott2b6b68a2015-08-07 14:11:14 -06002797 auto image_item = imageMap.find(it->handle);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002798 if (image_item != imageMap.end())
2799 imageMap.erase(image_item);
David Pinedod8f83d82015-04-27 16:36:17 -06002800 }
Chia-I Wuf8693382015-04-16 22:02:10 +08002801 }
Chia-I Wuf8693382015-04-16 22:02:10 +08002802 delete pInfo;
Ian Elliott7e40db92015-08-21 15:09:33 -06002803 swapchainMap.erase(swapchain.handle);
Chia-I Wuf8693382015-04-16 22:02:10 +08002804 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002805 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002806 if (VK_FALSE == skipCall) {
2807 result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroySwapchainKHR(device, swapchain);
2808 }
2809 return result;
Chia-I Wuf8693382015-04-16 22:02:10 +08002810}
2811
Ian Elliott7e40db92015-08-21 15:09:33 -06002812VK_LAYER_EXPORT VkResult VKAPI vkGetSwapchainImagesKHR(
Ian Elliott1064fe32015-07-06 14:31:32 -06002813 VkDevice device,
Ian Elliott7e40db92015-08-21 15:09:33 -06002814 VkSwapchainKHR swapchain,
Ian Elliott2b6b68a2015-08-07 14:11:14 -06002815 uint32_t* pCount,
Ian Elliott7e40db92015-08-21 15:09:33 -06002816 VkImage* pSwapchainImages)
Chia-I Wuf8693382015-04-16 22:02:10 +08002817{
Ian Elliott7e40db92015-08-21 15:09:33 -06002818 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetSwapchainImagesKHR(device, swapchain, pCount, pSwapchainImages);
Chia-I Wuf8693382015-04-16 22:02:10 +08002819
Ian Elliott7e40db92015-08-21 15:09:33 -06002820 if (result == VK_SUCCESS && pSwapchainImages != NULL) {
Ian Elliott2b6b68a2015-08-07 14:11:14 -06002821 const size_t count = *pCount;
Ian Elliott7e40db92015-08-21 15:09:33 -06002822 MT_SWAP_CHAIN_INFO *pInfo = swapchainMap[swapchain.handle];
Chia-I Wuf8693382015-04-16 22:02:10 +08002823
2824 if (pInfo->images.empty()) {
2825 pInfo->images.resize(count);
Ian Elliott7e40db92015-08-21 15:09:33 -06002826 memcpy(&pInfo->images[0], pSwapchainImages, sizeof(pInfo->images[0]) * count);
Chia-I Wuf8693382015-04-16 22:02:10 +08002827
David Pinedod8f83d82015-04-27 16:36:17 -06002828 if (pInfo->images.size() > 0) {
Ian Elliott2b6b68a2015-08-07 14:11:14 -06002829 for (std::vector<VkImage>::const_iterator it = pInfo->images.begin();
David Pinedod8f83d82015-04-27 16:36:17 -06002830 it != pInfo->images.end(); it++) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002831 // Add image object binding, then insert the new Mem Object and then bind it to created image
Ian Elliott7e40db92015-08-21 15:09:33 -06002832 add_object_create_info(it->handle, VK_OBJECT_TYPE_SWAPCHAIN_KHR, &pInfo->createInfo);
Chia-I Wuf8693382015-04-16 22:02:10 +08002833 }
2834 }
2835 } else {
Ian Elliott2b6b68a2015-08-07 14:11:14 -06002836 const size_t count = *pCount;
Ian Elliott7e40db92015-08-21 15:09:33 -06002837 MT_SWAP_CHAIN_INFO *pInfo = swapchainMap[swapchain.handle];
Chia-I Wuf8693382015-04-16 22:02:10 +08002838 const bool mismatch = (pInfo->images.size() != count ||
Ian Elliott7e40db92015-08-21 15:09:33 -06002839 memcmp(&pInfo->images[0], pSwapchainImages, sizeof(pInfo->images[0]) * count));
Chia-I Wuf8693382015-04-16 22:02:10 +08002840
2841 if (mismatch) {
Mark Lobodzinskie8229fb2015-09-15 16:10:17 -06002842 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_SWAPCHAIN_KHR, swapchain.handle, 0, MEMTRACK_NONE, "SWAP_CHAIN",
Ian Elliott7e40db92015-08-21 15:09:33 -06002843 "vkGetSwapchainInfoKHR(%p, VK_SWAP_CHAIN_INFO_TYPE_PERSISTENT_IMAGES_KHR) returned mismatching data", swapchain);
Chia-I Wuf8693382015-04-16 22:02:10 +08002844 }
2845 }
2846 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002847 return result;
2848}
Tobin Ehlis6663f492014-11-10 12:29:12 -07002849
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002850VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetDeviceProcAddr(
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06002851 VkDevice dev,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002852 const char *funcName)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002853{
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06002854 if (dev == NULL) {
Tobin Ehlis6663f492014-11-10 12:29:12 -07002855 return NULL;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002856 }
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05002857
Jon Ashburn8fd08252015-05-28 16:25:02 -06002858 /* loader uses this to force layer initialization; device object is wrapped */
2859 if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002860 initDeviceTable(mem_tracker_device_table_map, (const VkBaseLayerObject *) dev);
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002861 return (PFN_vkVoidFunction) vkGetDeviceProcAddr;
Jon Ashburn8fd08252015-05-28 16:25:02 -06002862 }
Courtney Goeltzenleuchterca173b82015-06-25 18:01:43 -06002863 if (!strcmp(funcName, "vkCreateDevice"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002864 return (PFN_vkVoidFunction) vkCreateDevice;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002865 if (!strcmp(funcName, "vkDestroyDevice"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002866 return (PFN_vkVoidFunction) vkDestroyDevice;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002867 if (!strcmp(funcName, "vkQueueSubmit"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002868 return (PFN_vkVoidFunction) vkQueueSubmit;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002869 if (!strcmp(funcName, "vkAllocMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002870 return (PFN_vkVoidFunction) vkAllocMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002871 if (!strcmp(funcName, "vkFreeMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002872 return (PFN_vkVoidFunction) vkFreeMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002873 if (!strcmp(funcName, "vkMapMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002874 return (PFN_vkVoidFunction) vkMapMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002875 if (!strcmp(funcName, "vkUnmapMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002876 return (PFN_vkVoidFunction) vkUnmapMemory;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002877 if (!strcmp(funcName, "vkDestroyFence"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002878 return (PFN_vkVoidFunction) vkDestroyFence;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002879 if (!strcmp(funcName, "vkDestroyBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002880 return (PFN_vkVoidFunction) vkDestroyBuffer;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002881 if (!strcmp(funcName, "vkDestroyImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002882 return (PFN_vkVoidFunction) vkDestroyImage;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002883 if (!strcmp(funcName, "vkDestroyImageView"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002884 return (PFN_vkVoidFunction) vkDestroyImageView;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002885 if (!strcmp(funcName, "vkDestroyPipeline"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002886 return (PFN_vkVoidFunction) vkDestroyPipeline;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002887 if (!strcmp(funcName, "vkDestroySampler"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002888 return (PFN_vkVoidFunction) vkDestroySampler;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002889 if (!strcmp(funcName, "vkDestroySemaphore"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002890 return (PFN_vkVoidFunction) vkDestroySemaphore;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002891 if (!strcmp(funcName, "vkDestroyEvent"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002892 return (PFN_vkVoidFunction) vkDestroyEvent;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002893 if (!strcmp(funcName, "vkDestroyQueryPool"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002894 return (PFN_vkVoidFunction) vkDestroyQueryPool;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002895 if (!strcmp(funcName, "vkDestroyBufferView"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002896 return (PFN_vkVoidFunction) vkDestroyBufferView;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002897 if (!strcmp(funcName, "vkDestroyShaderModule"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002898 return (PFN_vkVoidFunction) vkDestroyShaderModule;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002899 if (!strcmp(funcName, "vkDestroyShader"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002900 return (PFN_vkVoidFunction) vkDestroyShader;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002901 if (!strcmp(funcName, "vkDestroyPipelineLayout"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002902 return (PFN_vkVoidFunction) vkDestroyPipelineLayout;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002903 if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002904 return (PFN_vkVoidFunction) vkDestroyDescriptorSetLayout;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002905 if (!strcmp(funcName, "vkDestroyDescriptorPool"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002906 return (PFN_vkVoidFunction) vkDestroyDescriptorPool;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002907 if (!strcmp(funcName, "vkDestroyRenderPass"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002908 return (PFN_vkVoidFunction) vkDestroyRenderPass;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002909 if (!strcmp(funcName, "vkDestroyFramebuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002910 return (PFN_vkVoidFunction) vkDestroyFramebuffer;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002911 if (!strcmp(funcName, "vkBindBufferMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002912 return (PFN_vkVoidFunction) vkBindBufferMemory;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002913 if (!strcmp(funcName, "vkBindImageMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002914 return (PFN_vkVoidFunction) vkBindImageMemory;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002915 if (!strcmp(funcName, "vkGetBufferMemoryRequirements"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002916 return (PFN_vkVoidFunction) vkGetBufferMemoryRequirements;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002917 if (!strcmp(funcName, "vkGetImageMemoryRequirements"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002918 return (PFN_vkVoidFunction) vkGetImageMemoryRequirements;
Mark Lobodzinski942b1722015-05-11 17:21:15 -05002919 if (!strcmp(funcName, "vkQueueBindSparseBufferMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002920 return (PFN_vkVoidFunction) vkQueueBindSparseBufferMemory;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002921 if (!strcmp(funcName, "vkQueueBindSparseImageOpaqueMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002922 return (PFN_vkVoidFunction) vkQueueBindSparseImageOpaqueMemory;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002923 if (!strcmp(funcName, "vkQueueBindSparseImageMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002924 return (PFN_vkVoidFunction) vkQueueBindSparseImageMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002925 if (!strcmp(funcName, "vkCreateFence"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002926 return (PFN_vkVoidFunction) vkCreateFence;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002927 if (!strcmp(funcName, "vkGetFenceStatus"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002928 return (PFN_vkVoidFunction) vkGetFenceStatus;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002929 if (!strcmp(funcName, "vkResetFences"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002930 return (PFN_vkVoidFunction) vkResetFences;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002931 if (!strcmp(funcName, "vkWaitForFences"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002932 return (PFN_vkVoidFunction) vkWaitForFences;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002933 if (!strcmp(funcName, "vkQueueWaitIdle"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002934 return (PFN_vkVoidFunction) vkQueueWaitIdle;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002935 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002936 return (PFN_vkVoidFunction) vkDeviceWaitIdle;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002937 if (!strcmp(funcName, "vkCreateEvent"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002938 return (PFN_vkVoidFunction) vkCreateEvent;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002939 if (!strcmp(funcName, "vkCreateQueryPool"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002940 return (PFN_vkVoidFunction) vkCreateQueryPool;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002941 if (!strcmp(funcName, "vkCreateBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002942 return (PFN_vkVoidFunction) vkCreateBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002943 if (!strcmp(funcName, "vkCreateBufferView"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002944 return (PFN_vkVoidFunction) vkCreateBufferView;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002945 if (!strcmp(funcName, "vkCreateImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002946 return (PFN_vkVoidFunction) vkCreateImage;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002947 if (!strcmp(funcName, "vkCreateImageView"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002948 return (PFN_vkVoidFunction) vkCreateImageView;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002949 if (!strcmp(funcName, "vkCreateShader"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002950 return (PFN_vkVoidFunction) vkCreateShader;
Jon Ashburnc669cc62015-07-09 15:02:25 -06002951 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002952 return (PFN_vkVoidFunction) vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06002953 if (!strcmp(funcName, "vkCreateComputePipelines"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002954 return (PFN_vkVoidFunction) vkCreateComputePipelines;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002955 if (!strcmp(funcName, "vkCreateSampler"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002956 return (PFN_vkVoidFunction) vkCreateSampler;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002957 if (!strcmp(funcName, "vkCreateCommandBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002958 return (PFN_vkVoidFunction) vkCreateCommandBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002959 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002960 return (PFN_vkVoidFunction) vkBeginCommandBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002961 if (!strcmp(funcName, "vkEndCommandBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002962 return (PFN_vkVoidFunction) vkEndCommandBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002963 if (!strcmp(funcName, "vkResetCommandBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002964 return (PFN_vkVoidFunction) vkResetCommandBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002965 if (!strcmp(funcName, "vkCmdBindPipeline"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002966 return (PFN_vkVoidFunction) vkCmdBindPipeline;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002967 if (!strcmp(funcName, "vkCmdSetViewport"))
2968 return (PFN_vkVoidFunction) vkCmdSetViewport;
Courtney Goeltzenleuchter078f8172015-09-21 11:44:06 -06002969 if (!strcmp(funcName, "vkCmdSetScissor"))
2970 return (PFN_vkVoidFunction) vkCmdSetScissor;
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -06002971 if (!strcmp(funcName, "vkCmdSetLineWidth"))
2972 return (PFN_vkVoidFunction) vkCmdSetLineWidth;
2973 if (!strcmp(funcName, "vkCmdSetDepthBias"))
2974 return (PFN_vkVoidFunction) vkCmdSetDepthBias;
2975 if (!strcmp(funcName, "vkCmdSetBlendConstants"))
2976 return (PFN_vkVoidFunction) vkCmdSetBlendConstants;
2977 if (!strcmp(funcName, "vkCmdSetDepthBounds"))
2978 return (PFN_vkVoidFunction) vkCmdSetDepthBounds;
2979 if (!strcmp(funcName, "vkCmdSetStencilCompareMask"))
2980 return (PFN_vkVoidFunction) vkCmdSetStencilCompareMask;
2981 if (!strcmp(funcName, "vkCmdSetStencilWriteMask"))
2982 return (PFN_vkVoidFunction) vkCmdSetStencilWriteMask;
2983 if (!strcmp(funcName, "vkCmdSetStencilReference"))
2984 return (PFN_vkVoidFunction) vkCmdSetStencilReference;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002985 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002986 return (PFN_vkVoidFunction) vkCmdBindDescriptorSets;
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06002987 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002988 return (PFN_vkVoidFunction) vkCmdBindVertexBuffers;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002989 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002990 return (PFN_vkVoidFunction) vkCmdBindIndexBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002991 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002992 return (PFN_vkVoidFunction) vkCmdDrawIndirect;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002993 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002994 return (PFN_vkVoidFunction) vkCmdDrawIndexedIndirect;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002995 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002996 return (PFN_vkVoidFunction) vkCmdDispatchIndirect;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002997 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06002998 return (PFN_vkVoidFunction) vkCmdCopyBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002999 if (!strcmp(funcName, "vkCmdCopyImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003000 return (PFN_vkVoidFunction) vkCmdCopyImage;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003001 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003002 return (PFN_vkVoidFunction) vkCmdCopyBufferToImage;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003003 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003004 return (PFN_vkVoidFunction) vkCmdCopyImageToBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003005 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003006 return (PFN_vkVoidFunction) vkCmdUpdateBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003007 if (!strcmp(funcName, "vkCmdFillBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003008 return (PFN_vkVoidFunction) vkCmdFillBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003009 if (!strcmp(funcName, "vkCmdClearColorImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003010 return (PFN_vkVoidFunction) vkCmdClearColorImage;
Chris Forbesd9be82b2015-06-22 17:21:59 +12003011 if (!strcmp(funcName, "vkCmdClearDepthStencilImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003012 return (PFN_vkVoidFunction) vkCmdClearDepthStencilImage;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003013 if (!strcmp(funcName, "vkCmdResolveImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003014 return (PFN_vkVoidFunction) vkCmdResolveImage;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003015 if (!strcmp(funcName, "vkCmdBeginQuery"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003016 return (PFN_vkVoidFunction) vkCmdBeginQuery;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003017 if (!strcmp(funcName, "vkCmdEndQuery"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003018 return (PFN_vkVoidFunction) vkCmdEndQuery;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003019 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003020 return (PFN_vkVoidFunction) vkCmdResetQueryPool;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003021 if (!strcmp(funcName, "vkGetDeviceQueue"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003022 return (PFN_vkVoidFunction) vkGetDeviceQueue;
Jon Ashburn747f2b62015-06-18 15:02:58 -06003023
Courtney Goeltzenleuchterd54749c2015-07-05 11:17:01 -06003024 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(dev), layer_data_map);
Ian Elliott1064fe32015-07-06 14:31:32 -06003025 if (my_device_data->wsi_enabled)
Jon Ashburn747f2b62015-06-18 15:02:58 -06003026 {
Ian Elliott7e40db92015-08-21 15:09:33 -06003027 if (!strcmp(funcName, "vkCreateSwapchainKHR"))
3028 return (PFN_vkVoidFunction) vkCreateSwapchainKHR;
3029 if (!strcmp(funcName, "vkDestroySwapchainKHR"))
3030 return (PFN_vkVoidFunction) vkDestroySwapchainKHR;
3031 if (!strcmp(funcName, "vkGetSwapchainImagesKHR"))
3032 return (PFN_vkVoidFunction) vkGetSwapchainImagesKHR;
3033// if (!strcmp(funcName, "vkAcquireNextImageKHR"))
3034// return (PFN_vkVoidFunction) vkAcquireNextImageKHR;
3035// if (!strcmp(funcName, "vkQueuePresentKHR"))
3036// return (PFN_vkVoidFunction) vkQueuePresentKHR;
Jon Ashburn747f2b62015-06-18 15:02:58 -06003037 }
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06003038
Courtney Goeltzenleuchterd54749c2015-07-05 11:17:01 -06003039 VkLayerDispatchTable *pDisp = get_dispatch_table(mem_tracker_device_table_map, dev);
3040 if (pDisp->GetDeviceProcAddr == NULL)
3041 return NULL;
3042 return pDisp->GetDeviceProcAddr(dev, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003043}
3044
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003045VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetInstanceProcAddr(
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003046 VkInstance instance,
3047 const char *funcName)
3048{
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003049 PFN_vkVoidFunction fptr;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003050 if (instance == NULL) {
3051 return NULL;
3052 }
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -06003053
Jon Ashburn8fd08252015-05-28 16:25:02 -06003054 /* loader uses this to force layer initialization; instance object is wrapped */
3055 if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06003056 initInstanceTable(mem_tracker_instance_table_map, (const VkBaseLayerObject *) instance);
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003057 return (PFN_vkVoidFunction) vkGetInstanceProcAddr;
Jon Ashburn8fd08252015-05-28 16:25:02 -06003058 }
3059
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05003060 if (!strcmp(funcName, "vkDestroyInstance"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003061 return (PFN_vkVoidFunction) vkDestroyInstance;
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06003062 if (!strcmp(funcName, "vkCreateInstance"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003063 return (PFN_vkVoidFunction) vkCreateInstance;
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -06003064 if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003065 return (PFN_vkVoidFunction) vkGetPhysicalDeviceMemoryProperties;
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -06003066 if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
3067 return (PFN_vkVoidFunction) vkEnumerateInstanceLayerProperties;
3068 if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
3069 return (PFN_vkVoidFunction) vkEnumerateInstanceExtensionProperties;
3070 if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
3071 return (PFN_vkVoidFunction) vkEnumerateDeviceLayerProperties;
3072 if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
3073 return (PFN_vkVoidFunction) vkEnumerateDeviceExtensionProperties;
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06003074
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06003075 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3076 fptr = debug_report_get_instance_proc_addr(my_data->report_data, funcName);
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06003077 if (fptr)
3078 return fptr;
3079
Jon Ashburn8fd08252015-05-28 16:25:02 -06003080 {
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06003081 if (get_dispatch_table(mem_tracker_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003082 return NULL;
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06003083 return get_dispatch_table(mem_tracker_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Tobin Ehlis6663f492014-11-10 12:29:12 -07003084 }
3085}