blob: 846cc5bc23534d9f7b2bfe8af61fa8000c26448c [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
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -060049typedef struct _layer_data {
50 debug_report_data *report_data;
51 // TODO: put instance data here
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -060052 VkDbgMsgCallback logging_callback;
Ian Elliott1064fe32015-07-06 14:31:32 -060053 bool wsi_enabled;
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -060054} layer_data;
Mark Lobodzinski76c991d2015-05-20 16:16:37 -050055
Tobin Ehlis257d9742015-07-08 17:08:02 -060056static unordered_map<void *, layer_data *> layer_data_map;
57
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -060058static device_table_map mem_tracker_device_table_map;
59static instance_table_map mem_tracker_instance_table_map;
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -060060static VkPhysicalDeviceMemoryProperties memProps;
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -060061
Mark Lobodzinski93f494b2015-03-02 20:23:52 -060062// TODO : This can be much smarter, using separate locks for separate global data
63static int globalLockInitialized = 0;
64static loader_platform_thread_mutex globalLock;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070065
Tobin Ehlisc145be82015-01-08 15:22:32 -070066#define MAX_BINDING 0xFFFFFFFF
Tobin Ehlisc145be82015-01-08 15:22:32 -070067
Tobin Ehlis257d9742015-07-08 17:08:02 -060068// Maps for tracking key structs related to MemTracker state
Mike Stroyandd7aed72015-05-19 17:03:40 -060069unordered_map<VkCmdBuffer, MT_CB_INFO> cbMap;
Tobin Ehlis257d9742015-07-08 17:08:02 -060070unordered_map<uint64_t, MT_MEM_OBJ_INFO> memObjMap;
71unordered_map<uint64_t, MT_FENCE_INFO> fenceMap; // Map fence to fence info
Mike Stroyandd7aed72015-05-19 17:03:40 -060072unordered_map<VkQueue, MT_QUEUE_INFO> queueMap;
Ian Elliott1064fe32015-07-06 14:31:32 -060073unordered_map<uint64_t, MT_SWAP_CHAIN_INFO*> swapChainMap;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -050074
Tobin Ehlis257d9742015-07-08 17:08:02 -060075// Images and Buffers are 2 objects that can have memory bound to them so they get special treatment
76unordered_map<uint64_t, MT_OBJ_BINDING_INFO> imageMap;
77unordered_map<uint64_t, MT_OBJ_BINDING_INFO> bufferMap;
78
79// Maps for non-dispatchable objects that store createInfo based on handle
80unordered_map<uint64_t, VkAttachmentViewCreateInfo> attachmentViewMap;
81unordered_map<uint64_t, VkImageViewCreateInfo> imageViewMap;
82// TODO : If we ever really care about Compute pipelines, split them into own map
83unordered_map<uint64_t, VkGraphicsPipelineCreateInfo> pipelineMap;
84unordered_map<uint64_t, VkSamplerCreateInfo> samplerMap;
85unordered_map<uint64_t, VkSemaphoreCreateInfo> semaphoreMap;
86unordered_map<uint64_t, VkEventCreateInfo> eventMap;
87unordered_map<uint64_t, VkQueryPoolCreateInfo> queryPoolMap;
88unordered_map<uint64_t, VkBufferViewCreateInfo> bufferViewMap;
89unordered_map<uint64_t, VkShaderModuleCreateInfo> shaderModuleMap;
90unordered_map<uint64_t, VkShaderCreateInfo> shaderMap;
91unordered_map<uint64_t, VkPipelineLayoutCreateInfo> pipelineLayoutMap;
92unordered_map<uint64_t, VkDescriptorSetLayoutCreateInfo> descriptorSetLayoutMap;
93unordered_map<uint64_t, VkDescriptorPoolCreateInfo> descriptorPoolMap;
94unordered_map<uint64_t, VkRenderPassCreateInfo> renderPassMap;
95unordered_map<uint64_t, VkFramebufferCreateInfo> framebufferMap;
96//unordered_map<uint64_t, VkDescriptorSetCreateInfo> descriptorSetMap;
97unordered_map<uint64_t, VkDynamicViewportStateCreateInfo> dynamicViewportStateMap;
Cody Northrop12365112015-08-17 11:10:49 -060098unordered_map<uint64_t, VkDynamicRasterLineStateCreateInfo> dynamicRasterLineStateMap;
99unordered_map<uint64_t, VkDynamicRasterDepthBiasStateCreateInfo> dynamicRasterDepthBiasStateMap;
Tobin Ehlis257d9742015-07-08 17:08:02 -0600100unordered_map<uint64_t, VkDynamicColorBlendStateCreateInfo> dynamicColorBlendStateMap;
101unordered_map<uint64_t, VkDynamicDepthStencilStateCreateInfo> dynamicDepthStencilStateMap;
102
103// For a given handle and object type, return a ptr to its CreateInfo struct, or NULL if not found
104static void* get_object_create_info(uint64_t handle, VkDbgObjectType type)
105{
106 void* retValue = NULL;
107 switch (type)
108 {
109 case VK_OBJECT_TYPE_ATTACHMENT_VIEW:
110 {
111 auto it = attachmentViewMap.find(handle);
112 if (it != attachmentViewMap.end())
113 return (void*)&(*it).second;
114 break;
115 }
116 case VK_OBJECT_TYPE_IMAGE_VIEW:
117 {
118 auto it = imageViewMap.find(handle);
119 if (it != imageViewMap.end())
120 return (void*)&(*it).second;
121 break;
122 }
123 case VK_OBJECT_TYPE_IMAGE:
124 {
125 auto it = imageMap.find(handle);
126 if (it != imageMap.end())
127 return (void*)&(*it).second;
128 break;
129 }
130 case VK_OBJECT_TYPE_PIPELINE:
131 {
132 auto it = pipelineMap.find(handle);
133 if (it != pipelineMap.end())
134 return (void*)&(*it).second;
135 break;
136 }
137 case VK_OBJECT_TYPE_SAMPLER:
138 {
139 auto it = samplerMap.find(handle);
140 if (it != samplerMap.end())
141 return (void*)&(*it).second;
142 break;
143 }
144 case VK_OBJECT_TYPE_BUFFER:
145 {
146 auto it = bufferMap.find(handle);
147 if (it != bufferMap.end())
148 return (void*)&(*it).second;
149 break;
150 }
151 case VK_OBJECT_TYPE_SEMAPHORE:
152 {
153 auto it = semaphoreMap.find(handle);
154 if (it != semaphoreMap.end())
155 return (void*)&(*it).second;
156 break;
157 }
158 case VK_OBJECT_TYPE_EVENT:
159 {
160 auto it = eventMap.find(handle);
161 if (it != eventMap.end())
162 return (void*)&(*it).second;
163 break;
164 }
165 case VK_OBJECT_TYPE_QUERY_POOL:
166 {
167 auto it = queryPoolMap.find(handle);
168 if (it != queryPoolMap.end())
169 return (void*)&(*it).second;
170 break;
171 }
172 case VK_OBJECT_TYPE_BUFFER_VIEW:
173 {
174 auto it = bufferViewMap.find(handle);
175 if (it != bufferViewMap.end())
176 return (void*)&(*it).second;
177 break;
178 }
179 case VK_OBJECT_TYPE_SHADER_MODULE:
180 {
181 auto it = shaderModuleMap.find(handle);
182 if (it != shaderModuleMap.end())
183 return (void*)&(*it).second;
184 break;
185 }
186 case VK_OBJECT_TYPE_SHADER:
187 {
188 auto it = shaderMap.find(handle);
189 if (it != shaderMap.end())
190 return (void*)&(*it).second;
191 break;
192 }
193 case VK_OBJECT_TYPE_PIPELINE_LAYOUT:
194 {
195 auto it = pipelineLayoutMap.find(handle);
196 if (it != pipelineLayoutMap.end())
197 return (void*)&(*it).second;
198 break;
199 }
200 case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT:
201 {
202 auto it = descriptorSetLayoutMap.find(handle);
203 if (it != descriptorSetLayoutMap.end())
204 return (void*)&(*it).second;
205 break;
206 }
207 case VK_OBJECT_TYPE_DESCRIPTOR_POOL:
208 {
209 auto it = descriptorPoolMap.find(handle);
210 if (it != descriptorPoolMap.end())
211 return (void*)&(*it).second;
212 break;
213 }
214// case VK_OBJECT_TYPE_DESCRIPTOR_SET:
215// {
216// auto it = descriptorSetMap.find(handle);
217// if (it != descriptorSetMap.end())
218// return (void*)&(*it).second;
219// break;
220// }
221 case VK_OBJECT_TYPE_DYNAMIC_VIEWPORT_STATE:
222 {
223 auto it = dynamicViewportStateMap.find(handle);
224 if (it != dynamicViewportStateMap.end())
225 return (void*)&(*it).second;
226 break;
227 }
Cody Northrop12365112015-08-17 11:10:49 -0600228 case VK_OBJECT_TYPE_DYNAMIC_RASTER_LINE_STATE:
Tobin Ehlis257d9742015-07-08 17:08:02 -0600229 {
Cody Northrop12365112015-08-17 11:10:49 -0600230 auto it = dynamicRasterLineStateMap.find(handle);
231 if (it != dynamicRasterLineStateMap.end())
232 return (void*)&(*it).second;
233 break;
234 }
235 case VK_OBJECT_TYPE_DYNAMIC_RASTER_DEPTH_BIAS_STATE:
236 {
237 auto it = dynamicRasterDepthBiasStateMap.find(handle);
238 if (it != dynamicRasterDepthBiasStateMap.end())
Tobin Ehlis257d9742015-07-08 17:08:02 -0600239 return (void*)&(*it).second;
240 break;
241 }
242 case VK_OBJECT_TYPE_DYNAMIC_COLOR_BLEND_STATE:
243 {
244 auto it = dynamicColorBlendStateMap.find(handle);
245 if (it != dynamicColorBlendStateMap.end())
246 return (void*)&(*it).second;
247 break;
248 }
249 case VK_OBJECT_TYPE_DYNAMIC_DEPTH_STENCIL_STATE:
250 {
251 auto it = dynamicDepthStencilStateMap.find(handle);
252 if (it != dynamicDepthStencilStateMap.end())
253 return (void*)&(*it).second;
254 break;
255 }
256 case VK_OBJECT_TYPE_RENDER_PASS:
257 {
258 auto it = renderPassMap.find(handle);
259 if (it != renderPassMap.end())
260 return (void*)&(*it).second;
261 break;
262 }
263 case VK_OBJECT_TYPE_FRAMEBUFFER:
264 {
265 auto it = framebufferMap.find(handle);
266 if (it != framebufferMap.end())
267 return (void*)&(*it).second;
268 break;
269 }
270 default:
271 {
272 // NULL will be returned below by default
273 break;
274 }
275 }
276 return retValue;
277}
278
279static MT_OBJ_BINDING_INFO* get_object_binding_info(uint64_t handle, VkDbgObjectType type)
280{
281 MT_OBJ_BINDING_INFO* retValue = NULL;
282 switch (type)
283 {
284 case VK_OBJECT_TYPE_IMAGE:
285 {
286 auto it = imageMap.find(handle);
287 if (it != imageMap.end())
288 return &(*it).second;
289 break;
290 }
291 case VK_OBJECT_TYPE_BUFFER:
292 {
293 auto it = bufferMap.find(handle);
294 if (it != bufferMap.end())
295 return &(*it).second;
296 break;
297 }
298 }
299 return retValue;
300}
Mark Lobodzinski50932972015-04-02 20:49:09 -0500301// TODO : Add per-device fence completion
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600302static uint64_t g_currentFenceId = 1;
Mark Lobodzinskic52b7752015-02-18 16:38:17 -0600303
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -0600304template layer_data *get_my_data_ptr<layer_data>(
305 void *data_key,
306 std::unordered_map<void *, layer_data *> &data_map);
307
Tobin Ehlis257d9742015-07-08 17:08:02 -0600308debug_report_data *mdd(void* object)
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -0600309{
Courtney Goeltzenleuchter62110862015-06-13 21:39:35 -0600310 dispatch_key key = get_dispatch_key(object);
311 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Courtney Goeltzenleuchter89d68442015-06-13 21:40:22 -0600312#if DISPATCH_MAP_DEBUG
313 fprintf(stderr, "MDD: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, my_data);
314#endif
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -0600315 return my_data->report_data;
316}
317
318debug_report_data *mid(VkInstance object)
319{
Courtney Goeltzenleuchter62110862015-06-13 21:39:35 -0600320 dispatch_key key = get_dispatch_key(object);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -0600321 layer_data *my_data = get_my_data_ptr(get_dispatch_key(object), layer_data_map);
Courtney Goeltzenleuchter89d68442015-06-13 21:40:22 -0600322#if DISPATCH_MAP_DEBUG
323 fprintf(stderr, "MID: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, my_data);
324#endif
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -0600325 return my_data->report_data;
326}
327
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500328// Add new queue for this device to map container
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500329static void add_queue_info(const VkQueue queue)
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500330{
Mike Stroyandd7aed72015-05-19 17:03:40 -0600331 MT_QUEUE_INFO* pInfo = &queueMap[queue];
Mark Lobodzinski50932972015-04-02 20:49:09 -0500332 pInfo->lastRetiredId = 0;
333 pInfo->lastSubmittedId = 0;
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500334}
335
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500336static void delete_queue_info_list(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600337 void)
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500338{
339 // Process queue list, cleaning up each entry before deleting
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500340 queueMap.clear();
341}
342
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500343static void add_swap_chain_info(
Tobin Ehlis41376e12015-07-03 08:45:14 -0600344 const VkSwapChainWSI swapChain, const VkSwapChainCreateInfoWSI* pCI)
Chia-I Wuf8693382015-04-16 22:02:10 +0800345{
346 MT_SWAP_CHAIN_INFO* pInfo = new MT_SWAP_CHAIN_INFO;
Tobin Ehlis41376e12015-07-03 08:45:14 -0600347 memcpy(&pInfo->createInfo, pCI, sizeof(VkSwapChainCreateInfoWSI));
Ian Elliott1064fe32015-07-06 14:31:32 -0600348 swapChainMap[swapChain.handle] = pInfo;
Chia-I Wuf8693382015-04-16 22:02:10 +0800349}
350
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500351// Add new CBInfo for this cb to map container
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500352static void add_cmd_buf_info(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600353 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700354{
Mike Stroyandd7aed72015-05-19 17:03:40 -0600355 cbMap[cb].cmdBuffer = cb;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700356}
357
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500358// Return ptr to Info in CB map, or NULL if not found
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500359static MT_CB_INFO* get_cmd_buf_info(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600360 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700361{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600362 auto item = cbMap.find(cb);
Mike Stroyan950496e2015-05-19 15:16:08 -0600363 if (item != cbMap.end()) {
Mike Stroyandd7aed72015-05-19 17:03:40 -0600364 return &(*item).second;
Mike Stroyan950496e2015-05-19 15:16:08 -0600365 } else {
366 return NULL;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600367 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700368}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600369
Tobin Ehlis257d9742015-07-08 17:08:02 -0600370static void add_object_binding_info(const uint64_t handle, const VkDbgObjectType type, const VkDeviceMemory mem)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500371{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600372 switch (type)
373 {
374 // Buffers and images are unique as their CreateInfo is in container struct
375 case VK_OBJECT_TYPE_BUFFER:
376 {
377 auto pCI = &bufferMap[handle];
378 pCI->mem = mem;
379 break;
380 }
381 case VK_OBJECT_TYPE_IMAGE:
382 {
383 auto pCI = &imageMap[handle];
384 pCI->mem = mem;
385 break;
386 }
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500387 }
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500388}
389
Tobin Ehlis257d9742015-07-08 17:08:02 -0600390static void add_object_create_info(const uint64_t handle, const VkDbgObjectType type, const void* pCreateInfo)
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500391{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600392 // TODO : For any CreateInfo struct that has ptrs, need to deep copy them and appropriately clean up on Destroy
393 switch (type)
394 {
395 // Buffers and images are unique as their CreateInfo is in container struct
396 case VK_OBJECT_TYPE_BUFFER:
397 {
398 auto pCI = &bufferMap[handle];
399 memset(pCI, 0, sizeof(MT_OBJ_BINDING_INFO));
400 memcpy(&pCI->create_info.buffer, pCreateInfo, sizeof(VkBufferCreateInfo));
401 break;
402 }
403 case VK_OBJECT_TYPE_IMAGE:
404 {
405 auto pCI = &imageMap[handle];
406 memset(pCI, 0, sizeof(MT_OBJ_BINDING_INFO));
407 memcpy(&pCI->create_info.image, pCreateInfo, sizeof(VkImageCreateInfo));
408 break;
409 }
410 // Swap Chain is very unique, use imageMap, but copy in SwapChainCreatInfo
411 // This is used by vkCreateAttachmentView to distinguish swap chain images
412 case VK_OBJECT_TYPE_SWAP_CHAIN_WSI:
413 {
414 auto pCI = &imageMap[handle];
415 memset(pCI, 0, sizeof(MT_OBJ_BINDING_INFO));
Tony Barbour791646c2015-07-13 16:37:21 -0600416 // memcpy(&pCI->create_info.swapchain, pCreateInfo, sizeof(VkSwapChainCreateInfoWSI));
Tobin Ehlis257d9742015-07-08 17:08:02 -0600417 break;
418 }
419 // All other non-disp objects store their Create info struct as map value
420 case VK_OBJECT_TYPE_ATTACHMENT_VIEW:
421 {
422 auto pCI = &attachmentViewMap[handle];
423 memcpy(pCI, pCreateInfo, sizeof(VkAttachmentViewCreateInfo));
424 break;
425 }
426 case VK_OBJECT_TYPE_IMAGE_VIEW:
427 {
428 auto pCI = &imageViewMap[handle];
429 memcpy(pCI, pCreateInfo, sizeof(VkImageViewCreateInfo));
430 break;
431 }
432 case VK_OBJECT_TYPE_PIPELINE:
433 {
434 auto pCI = &pipelineMap[handle];
435 memcpy(pCI, pCreateInfo, sizeof(VkGraphicsPipelineCreateInfo));
436 break;
437 }
438 case VK_OBJECT_TYPE_SAMPLER:
439 {
440 auto pCI = &samplerMap[handle];
441 memcpy(pCI, pCreateInfo, sizeof(VkSamplerCreateInfo));
442 break;
443 }
444 case VK_OBJECT_TYPE_SEMAPHORE:
445 {
446 auto pCI = &semaphoreMap[handle];
447 memcpy(pCI, pCreateInfo, sizeof(VkSemaphoreCreateInfo));
448 break;
449 }
450 case VK_OBJECT_TYPE_EVENT:
451 {
452 auto pCI = &eventMap[handle];
453 memcpy(pCI, pCreateInfo, sizeof(VkEventCreateInfo));
454 break;
455 }
456 case VK_OBJECT_TYPE_QUERY_POOL:
457 {
458 auto pCI = &queryPoolMap[handle];
459 memcpy(pCI, pCreateInfo, sizeof(VkQueryPoolCreateInfo));
460 break;
461 }
462 case VK_OBJECT_TYPE_BUFFER_VIEW:
463 {
464 auto pCI = &bufferViewMap[handle];
465 memcpy(pCI, pCreateInfo, sizeof(VkBufferViewCreateInfo));
466 break;
467 }
468 case VK_OBJECT_TYPE_SHADER_MODULE:
469 {
470 auto pCI = &shaderModuleMap[handle];
471 memcpy(pCI, pCreateInfo, sizeof(VkShaderModuleCreateInfo));
472 break;
473 }
474 case VK_OBJECT_TYPE_SHADER:
475 {
476 auto pCI = &shaderMap[handle];
477 memcpy(pCI, pCreateInfo, sizeof(VkShaderCreateInfo));
478 break;
479 }
480 case VK_OBJECT_TYPE_PIPELINE_LAYOUT:
481 {
482 auto pCI = &pipelineLayoutMap[handle];
483 memcpy(pCI, pCreateInfo, sizeof(VkPipelineLayoutCreateInfo));
484 break;
485 }
486 case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT:
487 {
488 auto pCI = &descriptorSetLayoutMap[handle];
489 memcpy(pCI, pCreateInfo, sizeof(VkDescriptorSetLayoutCreateInfo));
490 break;
491 }
492 case VK_OBJECT_TYPE_DESCRIPTOR_POOL:
493 {
494 auto pCI = &descriptorPoolMap[handle];
495 memcpy(pCI, pCreateInfo, sizeof(VkDescriptorPoolCreateInfo));
496 break;
497 }
498// case VK_OBJECT_TYPE_DESCRIPTOR_SET:
499// {
500// auto pCI = &descriptorSetMap[handle];
501// memcpy(pCI, pCreateInfo, sizeof(VkDescriptorSetCreateInfo));
502// break;
503// }
504 case VK_OBJECT_TYPE_RENDER_PASS:
505 {
506 auto pCI = &renderPassMap[handle];
507 memcpy(pCI, pCreateInfo, sizeof(VkRenderPassCreateInfo));
508 break;
509 }
510 case VK_OBJECT_TYPE_FRAMEBUFFER:
511 {
512 auto pCI = &framebufferMap[handle];
513 memcpy(pCI, pCreateInfo, sizeof(VkFramebufferCreateInfo));
514 break;
515 }
516 case VK_OBJECT_TYPE_DYNAMIC_VIEWPORT_STATE:
517 {
518 auto pCI = &dynamicViewportStateMap[handle];
519 memcpy(pCI, pCreateInfo, sizeof(VkDynamicViewportStateCreateInfo));
520 break;
521 }
Cody Northrop12365112015-08-17 11:10:49 -0600522 case VK_OBJECT_TYPE_DYNAMIC_RASTER_LINE_STATE:
Tobin Ehlis257d9742015-07-08 17:08:02 -0600523 {
Cody Northrop12365112015-08-17 11:10:49 -0600524 auto pCI = &dynamicRasterLineStateMap[handle];
525 memcpy(pCI, pCreateInfo, sizeof(VkDynamicRasterLineStateCreateInfo));
526 break;
527 }
528 case VK_OBJECT_TYPE_DYNAMIC_RASTER_DEPTH_BIAS_STATE:
529 {
530 auto pCI = &dynamicRasterDepthBiasStateMap[handle];
531 memcpy(pCI, pCreateInfo, sizeof(VkDynamicRasterDepthBiasStateCreateInfo));
Tobin Ehlis257d9742015-07-08 17:08:02 -0600532 break;
533 }
534 case VK_OBJECT_TYPE_DYNAMIC_COLOR_BLEND_STATE:
535 {
536 auto pCI = &dynamicColorBlendStateMap[handle];
537 memcpy(pCI, pCreateInfo, sizeof(VkDynamicColorBlendStateCreateInfo));
538 break;
539 }
540 case VK_OBJECT_TYPE_DYNAMIC_DEPTH_STENCIL_STATE:
541 {
542 auto pCI = &dynamicDepthStencilStateMap[handle];
543 memcpy(pCI, pCreateInfo, sizeof(VkDynamicDepthStencilStateCreateInfo));
544 break;
545 }
546 default:
547 {
548 // NULL will be returned below by default
549 break;
550 }
551 }
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500552}
553
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500554// Add a fence, creating one if necessary to our list of fences/fenceIds
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500555static uint64_t add_fence_info(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600556 VkFence fence,
557 VkQueue queue)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500558{
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500559 // Create fence object
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500560 uint64_t fenceId = g_currentFenceId++;
Mark Lobodzinski76c991d2015-05-20 16:16:37 -0500561 // If no fence, create an internal fence to track the submissions
Tobin Ehlis257d9742015-07-08 17:08:02 -0600562 if (fence.handle != 0) {
563 fenceMap[fence.handle].fenceId = fenceId;
564 fenceMap[fence.handle].queue = queue;
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -0500565 // Validate that fence is in UNSIGNALED state
Tobin Ehlis257d9742015-07-08 17:08:02 -0600566 VkFenceCreateInfo* pFenceCI = &(fenceMap[fence.handle].createInfo);
567 if (pFenceCI->flags & VK_FENCE_CREATE_SIGNALED_BIT) {
568 log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_FENCE, fence.handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
569 "Fence %#" PRIxLEAST64 " submitted in SIGNALED state. Fences must be reset before being submitted", fence.handle);
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -0500570 }
Tobin Ehlis257d9742015-07-08 17:08:02 -0600571 } else {
572 // TODO : Do we need to create an internal fence here for tracking purposes?
Tobin Ehlis6663f492014-11-10 12:29:12 -0700573 }
Mike Stroyan950496e2015-05-19 15:16:08 -0600574 // Update most recently submitted fence and fenceId for Queue
Mike Stroyandd7aed72015-05-19 17:03:40 -0600575 queueMap[queue].lastSubmittedId = fenceId;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500576 return fenceId;
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500577}
578
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500579// Remove a fenceInfo from our list of fences/fenceIds
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500580static void delete_fence_info(
Mike Stroyan950496e2015-05-19 15:16:08 -0600581 VkFence fence)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500582{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600583 fenceMap.erase(fence.handle);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500584}
585
Mike Stroyan950496e2015-05-19 15:16:08 -0600586// Record information when a fence is known to be signalled
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500587static void update_fence_tracking(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600588 VkFence fence)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500589{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600590 auto fence_item = fenceMap.find(fence.handle);
Mike Stroyan950496e2015-05-19 15:16:08 -0600591 if (fence_item != fenceMap.end()) {
Mike Stroyandd7aed72015-05-19 17:03:40 -0600592 MT_FENCE_INFO *pCurFenceInfo = &(*fence_item).second;
Mike Stroyan950496e2015-05-19 15:16:08 -0600593 VkQueue queue = pCurFenceInfo->queue;
Tobin Ehlis257d9742015-07-08 17:08:02 -0600594 auto queue_item = queueMap.find(queue);
Mike Stroyan950496e2015-05-19 15:16:08 -0600595 if (queue_item != queueMap.end()) {
Mike Stroyandd7aed72015-05-19 17:03:40 -0600596 MT_QUEUE_INFO *pQueueInfo = &(*queue_item).second;
Mike Stroyan950496e2015-05-19 15:16:08 -0600597 if (pQueueInfo->lastRetiredId < pCurFenceInfo->fenceId) {
598 pQueueInfo->lastRetiredId = pCurFenceInfo->fenceId;
Mark Lobodzinski148e1582015-04-07 16:07:57 -0500599 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500600 }
601 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500602
Mike Stroyan950496e2015-05-19 15:16:08 -0600603 // Update fence state in fenceCreateInfo structure
Tobin Ehlis257d9742015-07-08 17:08:02 -0600604 auto pFCI = &(fenceMap[fence.handle].createInfo);
605 pFCI->flags = static_cast<VkFenceCreateFlags>(pFCI->flags | VK_FENCE_CREATE_SIGNALED_BIT);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500606}
607
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500608// Helper routine that updates the fence list for a specific queue to all-retired
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500609static void retire_queue_fences(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600610 VkQueue queue)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500611{
Mike Stroyandd7aed72015-05-19 17:03:40 -0600612 MT_QUEUE_INFO *pQueueInfo = &queueMap[queue];
613 // Set queue's lastRetired to lastSubmitted indicating all fences completed
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600614 pQueueInfo->lastRetiredId = pQueueInfo->lastSubmittedId;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700615}
616
Mike Stroyandd7aed72015-05-19 17:03:40 -0600617// Helper routine that updates all queues to all-retired
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500618static void retire_device_fences(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600619 VkDevice device)
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500620{
621 // Process each queue for device
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600622 // TODO: Add multiple device support
Tobin Ehlis257d9742015-07-08 17:08:02 -0600623 for (auto ii=queueMap.begin(); ii!=queueMap.end(); ++ii) {
Mike Stroyandd7aed72015-05-19 17:03:40 -0600624 // Set queue's lastRetired to lastSubmitted indicating all fences completed
625 MT_QUEUE_INFO *pQueueInfo = &(*ii).second;
626 pQueueInfo->lastRetiredId = pQueueInfo->lastSubmittedId;
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500627 }
628}
Tobin Ehlis41376e12015-07-03 08:45:14 -0600629// Helper function to validate correct usage bits set for buffers or images
630// Verify that (actual & desired) flags != 0 or,
631// if strict is true, verify that (actual & desired) flags == desired
632// In case of error, report it via dbg callbacks
David Pinedo38310942015-07-09 16:23:44 -0600633static void validate_usage_flags(void* disp_obj, VkFlags actual, VkFlags desired,
Tobin Ehlis257d9742015-07-08 17:08:02 -0600634 VkBool32 strict, uint64_t obj_handle, VkDbgObjectType obj_type,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600635 char const* ty_str, char const* func_name, char const* usage_str)
636{
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600637 VkBool32 correct_usage = VK_FALSE;
Tobin Ehlis41376e12015-07-03 08:45:14 -0600638 if (strict)
639 correct_usage = ((actual & desired) == desired);
640 else
641 correct_usage = ((actual & desired) != 0);
642 if (!correct_usage) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600643 log_msg(mdd(disp_obj), VK_DBG_REPORT_ERROR_BIT, obj_type, obj_handle, 0, MEMTRACK_INVALID_USAGE_FLAG, "MEM",
644 "Invalid usage flag for %s %#" PRIxLEAST64 " used by %s. In this case, %s should have %s set during creation.",
645 ty_str, obj_handle, func_name, ty_str, usage_str);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600646 }
647}
648// Helper function to validate usage flags for images
649// Pulls image info and then sends actual vs. desired usage off to helper above where
650// an error will be flagged if usage is not correct
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600651static void validate_image_usage_flags(void* disp_obj, VkImage image, VkFlags desired, VkBool32 strict,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600652 char const* func_name, char const* usage_string)
653{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600654 MT_OBJ_BINDING_INFO* pBindInfo = get_object_binding_info(image.handle, VK_OBJECT_TYPE_IMAGE);
655 if (pBindInfo) {
656 validate_usage_flags(disp_obj, pBindInfo->create_info.image.usage, desired, strict,
657 image.handle, VK_OBJECT_TYPE_IMAGE, "image", func_name, usage_string);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600658 }
659}
660// Helper function to validate usage flags for buffers
661// Pulls buffer info and then sends actual vs. desired usage off to helper above where
662// an error will be flagged if usage is not correct
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600663static void validate_buffer_usage_flags(void* disp_obj, VkBuffer buffer, VkFlags desired, VkBool32 strict,
Tobin Ehlis41376e12015-07-03 08:45:14 -0600664 char const* func_name, char const* usage_string)
665{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600666 MT_OBJ_BINDING_INFO* pBindInfo = get_object_binding_info(buffer.handle, VK_OBJECT_TYPE_BUFFER);
667 if (pBindInfo) {
668 validate_usage_flags(disp_obj, pBindInfo->create_info.buffer.usage, desired, strict,
669 buffer.handle, VK_OBJECT_TYPE_BUFFER, "buffer", func_name, usage_string);
Tobin Ehlis41376e12015-07-03 08:45:14 -0600670 }
671}
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500672// Return ptr to info in map container containing mem, or NULL if not found
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700673// Calls to this function should be wrapped in mutex
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500674static MT_MEM_OBJ_INFO* get_mem_obj_info(
Tobin Ehlis257d9742015-07-08 17:08:02 -0600675 const uint64_t device_mem_handle)
Tobin Ehlisc145be82015-01-08 15:22:32 -0700676{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600677 auto item = memObjMap.find(device_mem_handle);
Mike Stroyan950496e2015-05-19 15:16:08 -0600678 if (item != memObjMap.end()) {
Mike Stroyandd7aed72015-05-19 17:03:40 -0600679 return &(*item).second;
Mike Stroyan950496e2015-05-19 15:16:08 -0600680 } else {
681 return NULL;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600682 }
Tobin Ehlisc145be82015-01-08 15:22:32 -0700683}
684
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500685static void add_mem_obj_info(
Mark Lobodzinski524df112015-08-10 14:37:52 -0600686 void* object,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600687 const VkDeviceMemory mem,
Tobin Ehlis257d9742015-07-08 17:08:02 -0600688 const VkMemoryAllocInfo* pAllocInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700689{
Courtney Goeltzenleuchter17fd5ce2015-06-13 21:29:26 -0600690 assert(object != NULL);
Courtney Goeltzenleuchter7dcc6a72015-06-11 16:01:11 -0600691
Ian Elliott1064fe32015-07-06 14:31:32 -0600692 memcpy(&memObjMap[mem.handle].allocInfo, pAllocInfo, sizeof(VkMemoryAllocInfo));
693 // TODO: Update for real hardware, actually process allocation info structures
694 memObjMap[mem.handle].allocInfo.pNext = NULL;
Tobin Ehlis257d9742015-07-08 17:08:02 -0600695 memObjMap[mem.handle].object = object;
696 memObjMap[mem.handle].refCount = 0;
697 memObjMap[mem.handle].mem = mem;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700698}
699
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500700// Find CB Info and add mem reference to list container
701// Find Mem Obj Info and add CB reference to list container
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600702static VkBool32 update_cmd_buf_and_mem_references(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600703 const VkCmdBuffer cb,
704 const VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700705{
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600706 VkBool32 result = VK_TRUE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700707 // First update CB binding in MemObj mini CB list
Tobin Ehlis257d9742015-07-08 17:08:02 -0600708 MT_MEM_OBJ_INFO* pMemInfo = get_mem_obj_info(mem.handle);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500709 if (!pMemInfo) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600710 // TODO : cb should be srcObj
711 log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
712 "Trying to bind mem obj %#" PRIxLEAST64 " to CB %p but no info for that mem obj.\n "
713 "Was it correctly allocated? Did it already get freed?", mem.handle, cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600714 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600715 } else {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500716 // Search for cmd buffer object in memory object's binding list
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600717 VkBool32 found = VK_FALSE;
David Pinedod8f83d82015-04-27 16:36:17 -0600718 if (pMemInfo->pCmdBufferBindings.size() > 0) {
719 for (list<VkCmdBuffer>::iterator it = pMemInfo->pCmdBufferBindings.begin(); it != pMemInfo->pCmdBufferBindings.end(); ++it) {
720 if ((*it) == cb) {
721 found = VK_TRUE;
722 break;
723 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500724 }
725 }
726 // If not present, add to list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600727 if (found == VK_FALSE) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500728 pMemInfo->pCmdBufferBindings.push_front(cb);
729 pMemInfo->refCount++;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500730 }
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500731 // Now update CBInfo's Mem reference list
732 MT_CB_INFO* pCBInfo = get_cmd_buf_info(cb);
733 // TODO: keep track of all destroyed CBs so we know if this is a stale or simply invalid object
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500734 if (!pCBInfo) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600735 // TODO : cb should be srcObj
736 log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
737 "Trying to bind mem obj %#" PRIxLEAST64 " to CB %p but no info for that CB. Was CB incorrectly destroyed?", mem.handle, cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600738 result = VK_FALSE;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500739 } else {
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500740 // Search for memory object in cmd buffer's reference list
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600741 VkBool32 found = VK_FALSE;
David Pinedod8f83d82015-04-27 16:36:17 -0600742 if (pCBInfo->pMemObjList.size() > 0) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600743 for (auto it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
David Pinedod8f83d82015-04-27 16:36:17 -0600744 if ((*it) == mem) {
745 found = VK_TRUE;
746 break;
747 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500748 }
749 }
750 // If not present, add to list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600751 if (found == VK_FALSE) {
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500752 pCBInfo->pMemObjList.push_front(mem);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600753 }
754 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700755 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600756 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700757}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600758
Tobin Ehlis6663f492014-11-10 12:29:12 -0700759// Clear the CB Binding for mem
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500760// Calls to this function should be wrapped in mutex
761static void remove_cmd_buf_and_mem_reference(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600762 const VkCmdBuffer cb,
763 const VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700764{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600765 MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem.handle);
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500766 // TODO : Having this check is not ideal, really if memInfo was deleted,
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500767 // its CB bindings should be cleared and then clear_cmd_buf_and_mem_references wouldn't call
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -0700768 // us here with stale mem objs
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500769 if (pInfo) {
770 pInfo->pCmdBufferBindings.remove(cb);
771 pInfo->refCount--;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700772 }
773}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600774
Tobin Ehlis6663f492014-11-10 12:29:12 -0700775// Free bindings related to CB
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600776static VkBool32 clear_cmd_buf_and_mem_references(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600777 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700778{
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600779 VkBool32 result = VK_TRUE;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500780 MT_CB_INFO* pCBInfo = get_cmd_buf_info(cb);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500781 if (!pCBInfo) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600782 // TODO : cb should be srcObj
783 log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_INVALID_CB, "MEM",
Courtney Goeltzenleuchterb9f0bf32015-06-14 09:50:18 -0600784 "Unable to find global CB info %p for deletion", cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600785 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600786 } else {
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -0600787 if (pCBInfo->pMemObjList.size() > 0) {
788 list<VkDeviceMemory> mem_obj_list = pCBInfo->pMemObjList;
789 for (list<VkDeviceMemory>::iterator it=mem_obj_list.begin(); it!=mem_obj_list.end(); ++it) {
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500790 remove_cmd_buf_and_mem_reference(cb, (*it));
David Pinedod8f83d82015-04-27 16:36:17 -0600791 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600792 }
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500793 pCBInfo->pMemObjList.clear();
Tobin Ehlis6663f492014-11-10 12:29:12 -0700794 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600795 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700796}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600797
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500798// Delete CBInfo from list along with all of it's mini MemObjInfo
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500799// and also clear mem references to CB
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600800static VkBool32 delete_cmd_buf_info(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600801 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700802{
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600803 VkBool32 result = VK_TRUE;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500804 result = clear_cmd_buf_and_mem_references(cb);
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500805 // Delete the CBInfo info
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600806 if (result == VK_TRUE) {
Mike Stroyandd7aed72015-05-19 17:03:40 -0600807 cbMap.erase(cb);
Ian Elliott2d4ab1e2015-01-13 17:52:38 -0700808 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600809 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700810}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600811
Tobin Ehlis6663f492014-11-10 12:29:12 -0700812// Delete the entire CB list
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600813static VkBool32 delete_cmd_buf_info_list(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600814 void)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700815{
Mike Stroyandd7aed72015-05-19 17:03:40 -0600816 for (unordered_map<VkCmdBuffer, MT_CB_INFO>::iterator ii=cbMap.begin(); ii!=cbMap.end(); ++ii) {
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500817 clear_cmd_buf_and_mem_references((*ii).first);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700818 }
Mike Stroyandd7aed72015-05-19 17:03:40 -0600819 cbMap.clear();
820 return VK_TRUE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700821}
822
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500823// For given MemObjInfo, report Obj & CB bindings
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600824static void reportMemReferencesAndCleanUp(
825 MT_MEM_OBJ_INFO* pMemObjInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700826{
Tony Barbour18f71552015-04-22 11:36:22 -0600827 size_t cmdBufRefCount = pMemObjInfo->pCmdBufferBindings.size();
828 size_t objRefCount = pMemObjInfo->pObjBindings.size();
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500829
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500830 if ((pMemObjInfo->pCmdBufferBindings.size() + pMemObjInfo->pObjBindings.size()) != 0) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600831 log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, pMemObjInfo->mem.handle, 0, MEMTRACK_INTERNAL_ERROR, "MEM",
832 "Attempting to free memory object %#" PRIxLEAST64 " which still contains %lu references",
833 pMemObjInfo->mem.handle, (cmdBufRefCount + objRefCount));
Tobin Ehlis6663f492014-11-10 12:29:12 -0700834 }
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500835
David Pinedod8f83d82015-04-27 16:36:17 -0600836 if (cmdBufRefCount > 0 && pMemObjInfo->pCmdBufferBindings.size() > 0) {
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500837 for (list<VkCmdBuffer>::const_iterator it = pMemObjInfo->pCmdBufferBindings.begin(); it != pMemObjInfo->pCmdBufferBindings.end(); ++it) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600838 // TODO : cmdBuffer should be source Obj here
839 log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_NONE, "MEM",
840 "Command Buffer %p still has a reference to mem obj %#" PRIxLEAST64, (*it), pMemObjInfo->mem.handle);
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500841 }
842 // Clear the list of hanging references
843 pMemObjInfo->pCmdBufferBindings.clear();
844 }
845
David Pinedod8f83d82015-04-27 16:36:17 -0600846 if (objRefCount > 0 && pMemObjInfo->pObjBindings.size() > 0) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600847 for (auto it = pMemObjInfo->pObjBindings.begin(); it != pMemObjInfo->pObjBindings.end(); ++it) {
848 log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_INFO_BIT, it->type, it->handle, 0, MEMTRACK_NONE, "MEM",
849 "VK Object %#" PRIxLEAST64 " still has a reference to mem obj %#" PRIxLEAST64, it->handle, pMemObjInfo->mem.handle);
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500850 }
851 // Clear the list of hanging references
852 pMemObjInfo->pObjBindings.clear();
853 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500854
Tobin Ehlis6663f492014-11-10 12:29:12 -0700855}
856
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600857static void deleteMemObjInfo(
Tobin Ehlis257d9742015-07-08 17:08:02 -0600858 void* object,
859 const uint64_t device_mem_handle)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700860{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600861 auto item = memObjMap.find(device_mem_handle);
Mike Stroyan950496e2015-05-19 15:16:08 -0600862 if (item != memObjMap.end()) {
Mike Stroyan950496e2015-05-19 15:16:08 -0600863 memObjMap.erase(item);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700864 }
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500865 else {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600866 log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, device_mem_handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
867 "Request to delete memory object %#" PRIxLEAST64 " not present in memory Object Map", device_mem_handle);
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500868 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700869}
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -0500870
Tobin Ehlis6663f492014-11-10 12:29:12 -0700871// Check if fence for given CB is completed
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600872static VkBool32 checkCBCompleted(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600873 const VkCmdBuffer cb)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700874{
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600875 VkBool32 result = VK_TRUE;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500876 MT_CB_INFO* pCBInfo = get_cmd_buf_info(cb);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500877 if (!pCBInfo) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600878 // TODO : cb should be srcObj
879 log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_INVALID_CB, "MEM",
Courtney Goeltzenleuchterb9f0bf32015-06-14 09:50:18 -0600880 "Unable to find global CB info %p to check for completion", cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600881 result = VK_FALSE;
Mike Stroyan950496e2015-05-19 15:16:08 -0600882 } else if (pCBInfo->lastSubmittedQueue != NULL) {
883 VkQueue queue = pCBInfo->lastSubmittedQueue;
Mike Stroyandd7aed72015-05-19 17:03:40 -0600884 MT_QUEUE_INFO *pQueueInfo = &queueMap[queue];
Mike Stroyan950496e2015-05-19 15:16:08 -0600885 if (pCBInfo->fenceId > pQueueInfo->lastRetiredId) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600886 // TODO : cb should be srcObj and print cb handle
887 log_msg(mdd(cb), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_NONE, "MEM",
888 "fence %#" PRIxLEAST64 " for CB %p has not been checked for completion",
889 pCBInfo->lastSubmittedFence.handle, cb);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600890 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600891 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700892 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600893 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700894}
895
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600896static VkBool32 freeMemObjInfo(
Tobin Ehlis257d9742015-07-08 17:08:02 -0600897 void* object,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -0600898 VkDeviceMemory mem,
899 bool internal)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700900{
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -0600901 VkBool32 result = VK_TRUE;
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500902 // Parse global list to find info w/ mem
Tobin Ehlis257d9742015-07-08 17:08:02 -0600903 MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem.handle);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500904 if (!pInfo) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600905 log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
906 "Couldn't find mem info object for %#" PRIxLEAST64 "\n Was %#" PRIxLEAST64 " never allocated or previously freed?",
907 mem.handle, mem.handle);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600908 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600909 } else {
Courtney Goeltzenleuchter1c943a72015-03-26 16:15:39 -0600910 if (pInfo->allocInfo.allocationSize == 0 && !internal) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600911 log_msg(mdd(pInfo->object), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
912 "Attempting to free memory associated with a Persistent Image, %#" PRIxLEAST64 ", "
913 "this should not be explicitly freed\n", mem.handle);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600914 result = VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600915 } else {
916 // Clear any CB bindings for completed CBs
917 // TODO : Is there a better place to do this?
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500918
Courtney Goeltzenleuchter10100442015-06-13 21:36:49 -0600919 assert(pInfo->object != VK_NULL_HANDLE);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600920 list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin();
921 list<VkCmdBuffer>::iterator temp;
David Pinedod8f83d82015-04-27 16:36:17 -0600922 while (pInfo->pCmdBufferBindings.size() > 0 && it != pInfo->pCmdBufferBindings.end()) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600923 if (VK_TRUE == checkCBCompleted(*it)) {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500924 temp = it;
925 ++temp;
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500926 clear_cmd_buf_and_mem_references(*it);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500927 it = temp;
928 } else {
929 ++it;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600930 }
931 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500932
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600933 // Now verify that no references to this mem obj remain
Tobin Ehlis2717d132015-07-10 18:25:07 -0600934 // TODO : Is this check still valid? I don't think so
935 // Even if not, we still need to remove binding from obj
936// if (0 != pInfo->refCount) {
937// reportMemReferencesAndCleanUp(pInfo);
938// result = VK_FALSE;
939// }
Courtney Goeltzenleuchter2f3f8a22015-04-14 00:01:21 -0600940 // Delete mem obj info
Tobin Ehlis257d9742015-07-08 17:08:02 -0600941 deleteMemObjInfo(object, mem.handle);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700942 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700943 }
944 return result;
945}
946
Tobin Ehlis6663f492014-11-10 12:29:12 -0700947// Remove object binding performs 3 tasks:
Mark Lobodzinski6434eff2015-03-31 16:05:35 -0500948// 1. Remove ObjectInfo from MemObjInfo list container of obj bindings & free it
949// 2. Decrement refCount for MemObjInfo
Tobin Ehlis257d9742015-07-08 17:08:02 -0600950// 3. Clear mem binding for image/buffer by setting its handle to 0
951// TODO : This only applied to Buffer and Image objects now, how should it be updated/customized?
952static VkBool32 clear_object_binding(void* dispObj, uint64_t handle, VkDbgObjectType type)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700953{
Tobin Ehlis257d9742015-07-08 17:08:02 -0600954 // TODO : Need to customize images/buffers to track mem binding and clear it here appropriately
955 VkBool32 result = VK_TRUE;
956 MT_OBJ_BINDING_INFO* pObjBindInfo = get_object_binding_info(handle, type);
957 if (pObjBindInfo) {
958 MT_MEM_OBJ_INFO* pMemObjInfo = get_mem_obj_info(pObjBindInfo->mem.handle);
959 if (!pMemObjInfo) {
960 log_msg(mdd(dispObj), VK_DBG_REPORT_WARN_BIT, type, handle, 0, MEMTRACK_MEM_OBJ_CLEAR_EMPTY_BINDINGS, "MEM",
961 "Attempting to clear mem binding on %s obj %#" PRIxLEAST64 " but it has no binding.",
962 (VK_OBJECT_TYPE_IMAGE == type) ? "image" : "buffer", handle);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600963 } else {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600964 // 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
965 // and set the objects memory binding pointer to NULL.
966 for (auto it = pMemObjInfo->pObjBindings.begin(); it != pMemObjInfo->pObjBindings.end(); ++it) {
967 if ((it->handle == handle) && (it->type == type)) {
968 pMemObjInfo->refCount--;
969 pMemObjInfo->pObjBindings.erase(it);
970 // TODO : Make sure this is a reasonable way to reset mem binding
971 pObjBindInfo->mem.handle = 0;
Mark Lobodzinski40f7f402015-04-16 11:44:05 -0500972 result = VK_TRUE;
973 break;
974 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600975 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600976 if (result == VK_FALSE) {
Tobin Ehlis257d9742015-07-08 17:08:02 -0600977 log_msg(mdd(dispObj), VK_DBG_REPORT_ERROR_BIT, type, handle, 0, MEMTRACK_INTERNAL_ERROR, "MEM",
978 "While trying to clear mem binding for %s obj %#" PRIxLEAST64 ", unable to find that object referenced by mem obj %#" PRIxLEAST64,
979 (VK_OBJECT_TYPE_IMAGE == type) ? "image" : "buffer", handle, pMemObjInfo->mem.handle);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600980 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700981 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700982 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -0600983 return result;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700984}
985
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500986// For NULL mem case, output warning
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -0500987// Make sure given object is in global object map
Mark Lobodzinski944aab12015-06-05 13:59:04 -0500988// IF a previous binding existed, output validation error
989// Otherwise, add reference from objectInfo to memoryInfo
Mark Lobodzinski223ca202015-04-02 08:52:53 -0500990// Add reference off of objInfo
Courtney Goeltzenleuchter540d3492015-06-13 21:37:34 -0600991// device is required for error logging, need a dispatchable
992// object for that.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600993// Return VK_TRUE if addition is successful, VK_FALSE otherwise
Tobin Ehlis257d9742015-07-08 17:08:02 -0600994static VkBool32 set_mem_binding(
995 void* dispatch_object,
996 VkDeviceMemory mem,
997 uint64_t handle,
998 VkDbgObjectType type)
Tobin Ehlis6663f492014-11-10 12:29:12 -0700999{
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -06001000 VkBool32 result = VK_FALSE;
Tobin Ehlis6663f492014-11-10 12:29:12 -07001001 // Handle NULL case separately, just clear previous binding & decrement reference
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001002 if (mem == VK_NULL_HANDLE) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001003 log_msg(mdd(dispatch_object), VK_DBG_REPORT_WARN_BIT, type, handle, 0, MEMTRACK_INTERNAL_ERROR, "MEM",
1004 "Attempting to Bind Obj(%#" PRIxLEAST64 ") to NULL", handle);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001005 return VK_TRUE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001006 } else {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001007 MT_OBJ_BINDING_INFO* pObjBindInfo = get_object_binding_info(handle, type);
1008 if (!pObjBindInfo) {
1009 log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, type, handle, 0, MEMTRACK_INTERNAL_ERROR, "MEM",
1010 "Attempting to update Binding of %s Obj(%#" PRIxLEAST64 ") that's not in global list()", (VK_OBJECT_TYPE_IMAGE == type) ? "image" : "buffer", handle);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001011 return VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001012 }
1013 // non-null case so should have real mem obj
Tobin Ehlis257d9742015-07-08 17:08:02 -06001014 MT_MEM_OBJ_INFO* pMemInfo = get_mem_obj_info(mem.handle);
1015 if (!pMemInfo) {
1016 log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
1017 "While trying to bind mem for %s obj %#" PRIxLEAST64 ", couldn't find info for mem obj %#" PRIxLEAST64, (VK_OBJECT_TYPE_IMAGE == type) ? "image" : "buffer", handle, mem.handle);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001018 return VK_FALSE;
1019 } else {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001020 // TODO : Need to track mem binding for obj and report conflict here
1021 MT_MEM_OBJ_INFO* pPrevBinding = get_mem_obj_info(pObjBindInfo->mem.handle);
1022 if (pPrevBinding != NULL) {
1023 log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_REBIND_OBJECT, "MEM",
1024 "Attempting to bind memory (%#" PRIxLEAST64 ") to object (%#" PRIxLEAST64 ") which has already been bound to mem object %#" PRIxLEAST64,
1025 mem.handle, handle, pPrevBinding->mem.handle);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001026 return VK_FALSE;
1027 }
1028 else {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001029 MT_OBJ_HANDLE_TYPE oht;
1030 oht.handle = handle;
1031 oht.type = type;
1032 pMemInfo->pObjBindings.push_front(oht);
1033 pMemInfo->refCount++;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001034 // For image objects, make sure default memory state is correctly set
1035 // TODO : What's the best/correct way to handle this?
Tobin Ehlis257d9742015-07-08 17:08:02 -06001036 if (VK_OBJECT_TYPE_IMAGE == type) {
1037 VkImageCreateInfo ici = pObjBindInfo->create_info.image;
1038 if (ici.usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
1039 VK_IMAGE_USAGE_DEPTH_STENCIL_BIT)) {
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001040 // TODO:: More memory state transition stuff.
1041 }
1042 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06001043 pObjBindInfo->mem = mem;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001044 }
1045 }
1046 }
1047 return VK_TRUE;
1048}
1049
1050// For NULL mem case, clear any previous binding Else...
Tobin Ehlis257d9742015-07-08 17:08:02 -06001051// Make sure given object is in its object map
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001052// IF a previous binding existed, update binding
1053// Add reference from objectInfo to memoryInfo
Tobin Ehlis257d9742015-07-08 17:08:02 -06001054// Add reference off of object's binding info
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001055// Return VK_TRUE if addition is successful, VK_FALSE otherwise
Tobin Ehlis257d9742015-07-08 17:08:02 -06001056static VkBool32 set_sparse_mem_binding(
1057 void* dispObject,
1058 VkDeviceMemory mem,
1059 uint64_t handle,
1060 VkDbgObjectType type)
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001061{
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -06001062 VkBool32 result = VK_FALSE;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001063 // Handle NULL case separately, just clear previous binding & decrement reference
1064 if (mem == VK_NULL_HANDLE) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001065 clear_object_binding(dispObject, handle, type);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001066 return VK_TRUE;
1067 } else {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001068 MT_OBJ_BINDING_INFO* pObjBindInfo = get_object_binding_info(handle, type);
1069 if (!pObjBindInfo) {
1070 log_msg(mdd(dispObject), VK_DBG_REPORT_ERROR_BIT, type, handle, 0, MEMTRACK_INTERNAL_ERROR, "MEM",
1071 "Attempting to update Binding of Obj(%#" PRIxLEAST64 ") that's not in global list()", handle);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001072 return VK_FALSE;
1073 }
1074 // non-null case so should have real mem obj
Tobin Ehlis257d9742015-07-08 17:08:02 -06001075 MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem.handle);
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -06001076 if (!pInfo) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001077 log_msg(mdd(dispObject), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
1078 "While trying to bind mem for obj %#" PRIxLEAST64 ", couldn't find info for mem obj %#" PRIxLEAST64, handle, mem.handle);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001079 return VK_FALSE;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001080 } else {
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001081 // Search for object in memory object's binding list
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -06001082 VkBool32 found = VK_FALSE;
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -06001083 if (pInfo->pObjBindings.size() > 0) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001084 for (auto it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) {
1085 if (((*it).handle == handle) && ((*it).type == type)) {
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -06001086 found = VK_TRUE;
1087 break;
1088 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001089 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001090 }
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001091 // If not present, add to list
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001092 if (found == VK_FALSE) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001093 MT_OBJ_HANDLE_TYPE oht;
1094 oht.handle = handle;
1095 oht.type = type;
1096 pInfo->pObjBindings.push_front(oht);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001097 pInfo->refCount++;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001098 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06001099 // Need to set mem binding for this object
1100 // TODO : Do we still need to check for previous binding?
1101 MT_MEM_OBJ_INFO* pPrevBinding = get_mem_obj_info(pObjBindInfo->mem.handle);
1102 if (pPrevBinding) {
1103 clear_object_binding(dispObject, handle, type); // Need to clear the previous object binding before setting new binding
1104 log_msg(mdd(dispObject), VK_DBG_REPORT_INFO_BIT, type, handle, 0, MEMTRACK_NONE, "MEM",
1105 "Updating memory binding for object %#" PRIxLEAST64 " from mem obj %#" PRIxLEAST64 " to %#" PRIxLEAST64, handle, pPrevBinding->mem.handle, mem.handle);
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001106 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06001107 pObjBindInfo->mem = mem;
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07001108 }
1109 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001110 return VK_TRUE;
Tobin Ehlis6663f492014-11-10 12:29:12 -07001111}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001112
Mark Lobodzinski524df112015-08-10 14:37:52 -06001113template <typename T>
1114void print_object_map_members(
1115 void* dispObj,
1116 T const& objectName,
1117 VkDbgObjectType objectType,
1118 const char *objectStr)
1119{
1120 for (auto const& element : objectName) {
1121 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, objectType, 0, 0, MEMTRACK_NONE, "MEM",
1122 " %s Object list contains %s Object %#" PRIxLEAST64 " ", objectStr, objectStr, element.first);
1123 }
1124}
1125
Tobin Ehlis6663f492014-11-10 12:29:12 -07001126// Print details of global Obj tracking list
Mark Lobodzinski524df112015-08-10 14:37:52 -06001127static void print_object_list(
1128 void* dispObj)
1129{
1130 // Early out if info is not requested
1131 if (!(mdd(dispObj)->active_flags & VK_DBG_REPORT_INFO_BIT)) {
1132 return;
1133 }
1134
1135 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE, 0, 0, MEMTRACK_NONE, "MEM", "Details of Object lists:");
1136 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE, 0, 0, MEMTRACK_NONE, "MEM", "========================");
1137
1138 print_object_map_members(dispObj, attachmentViewMap, VK_OBJECT_TYPE_ATTACHMENT_VIEW, "AttachmentView");
1139 print_object_map_members(dispObj, imageViewMap, VK_OBJECT_TYPE_IMAGE_VIEW, "ImageView");
1140 print_object_map_members(dispObj, samplerMap, VK_OBJECT_TYPE_SAMPLER, "Sampler");
1141 print_object_map_members(dispObj, semaphoreMap, VK_OBJECT_TYPE_SEMAPHORE, "Semaphore");
1142 print_object_map_members(dispObj, eventMap, VK_OBJECT_TYPE_EVENT, "Event");
1143 print_object_map_members(dispObj, queryPoolMap, VK_OBJECT_TYPE_QUERY_POOL, "QueryPool");
1144 print_object_map_members(dispObj, bufferViewMap, VK_OBJECT_TYPE_BUFFER_VIEW, "BufferView");
1145 print_object_map_members(dispObj, shaderModuleMap, VK_OBJECT_TYPE_SHADER_MODULE, "ShaderModule");
1146 print_object_map_members(dispObj, shaderMap, VK_OBJECT_TYPE_SHADER, "Shader");
1147 print_object_map_members(dispObj, pipelineLayoutMap, VK_OBJECT_TYPE_PIPELINE_LAYOUT, "PipelineLayout");
1148 print_object_map_members(dispObj, descriptorSetLayoutMap, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, "DescriptorSetLayout");
1149 print_object_map_members(dispObj, descriptorPoolMap, VK_OBJECT_TYPE_DESCRIPTOR_POOL, "DescriptorPool");
1150 print_object_map_members(dispObj, renderPassMap, VK_OBJECT_TYPE_RENDER_PASS, "RenderPass");
1151 print_object_map_members(dispObj, framebufferMap, VK_OBJECT_TYPE_FRAMEBUFFER, "Framebuffer");
1152 print_object_map_members(dispObj, dynamicViewportStateMap, VK_OBJECT_TYPE_DYNAMIC_VIEWPORT_STATE, "DynamicViewportState");
Cody Northrop12365112015-08-17 11:10:49 -06001153 print_object_map_members(dispObj, dynamicRasterLineStateMap, VK_OBJECT_TYPE_DYNAMIC_RASTER_LINE_STATE, "DynamicRasterLineState");
1154 print_object_map_members(dispObj, dynamicRasterDepthBiasStateMap, VK_OBJECT_TYPE_DYNAMIC_RASTER_DEPTH_BIAS_STATE, "DynamicRasterDepthBiasState");
Mark Lobodzinski524df112015-08-10 14:37:52 -06001155 print_object_map_members(dispObj, dynamicColorBlendStateMap, VK_OBJECT_TYPE_DYNAMIC_COLOR_BLEND_STATE, "DynamicColorBlendState");
1156 print_object_map_members(dispObj, dynamicDepthStencilStateMap, VK_OBJECT_TYPE_DYNAMIC_DEPTH_STENCIL_STATE, "DynamicDepthStencilState");
1157 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE, 0, 0, MEMTRACK_NONE, "MEM", "*** End of Object lists ***");
1158}
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001159
Tobin Ehlis6663f492014-11-10 12:29:12 -07001160// For given Object, get 'mem' obj that it's bound to or NULL if no binding
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001161static VkDeviceMemory get_mem_binding_from_object(
Tobin Ehlis257d9742015-07-08 17:08:02 -06001162 void* dispObj, const uint64_t handle, const VkDbgObjectType type)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001163{
Tobin Ehlis257d9742015-07-08 17:08:02 -06001164 VkDeviceMemory mem;
1165 mem.handle = 0;
1166 MT_OBJ_BINDING_INFO* pObjBindInfo = get_object_binding_info(handle, type);
1167 if (pObjBindInfo) {
1168 if (pObjBindInfo->mem) {
1169 mem = pObjBindInfo->mem;
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -06001170 } else {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001171 log_msg(mdd(dispObj), VK_DBG_REPORT_ERROR_BIT, type, handle, 0, MEMTRACK_MISSING_MEM_BINDINGS, "MEM",
1172 "Trying to get mem binding for object %#" PRIxLEAST64 " but object has no mem binding", handle);
Mark Lobodzinski524df112015-08-10 14:37:52 -06001173 print_object_list(dispObj);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001174 }
Courtney Goeltzenleuchtere4171f02015-04-29 10:51:48 -06001175 } else {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001176 log_msg(mdd(dispObj), VK_DBG_REPORT_ERROR_BIT, type, handle, 0, MEMTRACK_INVALID_OBJECT, "MEM",
1177 "Trying to get mem binding for object %#" PRIxLEAST64 " but no such object in %s list", handle, (VK_OBJECT_TYPE_IMAGE == type) ? "image" : "buffer");
Mark Lobodzinski524df112015-08-10 14:37:52 -06001178 print_object_list(dispObj);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001179 }
1180 return mem;
1181}
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001182
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001183// Print details of MemObjInfo list
Mark Lobodzinski524df112015-08-10 14:37:52 -06001184static void print_mem_list(
1185 void* dispObj)
1186{
1187 MT_MEM_OBJ_INFO* pInfo = NULL;
Mark Lobodzinskib6ddb462015-03-24 16:29:24 -05001188
Mark Lobodzinski524df112015-08-10 14:37:52 -06001189 // Early out if info is not requested
1190 if (!(mdd(dispObj)->active_flags & VK_DBG_REPORT_INFO_BIT)) {
1191 return;
1192 }
1193
1194 // Just printing each msg individually for now, may want to package these into single large print
1195 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1196 "Details of Memory Object list (of size %lu elements)", memObjMap.size());
1197 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1198 "=============================");
1199
1200 if (memObjMap.size() <= 0)
1201 return;
1202
1203 for (auto ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
1204 pInfo = &(*ii).second;
1205
1206 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1207 " ===MemObjInfo at %p===", (void*)pInfo);
1208 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1209 " Mem object: %#" PRIxLEAST64, (void*)pInfo->mem.handle);
1210 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1211 " Ref Count: %u", pInfo->refCount);
1212 if (0 != pInfo->allocInfo.allocationSize) {
1213 string pAllocInfoMsg = vk_print_vkmemoryallocinfo(&pInfo->allocInfo, "MEM(INFO): ");
1214 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1215 " Mem Alloc info:\n%s", pAllocInfoMsg.c_str());
1216 } else {
1217 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1218 " Mem Alloc info is NULL (alloc done by vkCreateSwapChainWSI())");
1219 }
1220
1221 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1222 " VK OBJECT Binding list of size %lu elements:", pInfo->pObjBindings.size());
1223 if (pInfo->pObjBindings.size() > 0) {
1224 for (list<MT_OBJ_HANDLE_TYPE>::iterator it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) {
1225 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1226 " VK OBJECT %p", (*it));
1227 }
1228 }
1229
1230 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1231 " VK Command Buffer (CB) binding list of size %lu elements", pInfo->pCmdBufferBindings.size());
1232 if (pInfo->pCmdBufferBindings.size() > 0)
1233 {
1234 for (list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin(); it != pInfo->pCmdBufferBindings.end(); ++it) {
1235 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1236 " VK CB %p", (*it));
1237 }
1238 }
1239 }
1240}
1241
1242static void printCBList(
1243 void* dispObj)
1244{
1245 MT_CB_INFO* pCBInfo = NULL;
1246
1247 // Early out if info is not requested
1248 if (!(mdd(dispObj)->active_flags & VK_DBG_REPORT_INFO_BIT)) {
1249 return;
1250 }
1251
1252 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1253 "Details of CB list (of size %lu elements)", cbMap.size());
1254 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1255 "==================");
1256
1257 if (cbMap.size() <= 0)
1258 return;
1259
1260 for (auto ii=cbMap.begin(); ii!=cbMap.end(); ++ii) {
1261 pCBInfo = &(*ii).second;
1262
1263 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1264 " CB Info (%p) has CB %p, fenceId %" PRIx64", and fence %#" PRIxLEAST64,
1265 (void*)pCBInfo, (void*)pCBInfo->cmdBuffer, pCBInfo->fenceId,
1266 pCBInfo->lastSubmittedFence.handle);
1267
1268 if (pCBInfo->pMemObjList.size() <= 0)
1269 continue;
1270 for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
1271 log_msg(mdd(dispObj), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, 0, 0, MEMTRACK_NONE, "MEM",
1272 " Mem obj %p", (*it));
1273 }
1274 }
1275}
Tobin Ehlis6663f492014-11-10 12:29:12 -07001276
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001277static void init_mem_tracker(
1278 layer_data *my_data)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001279{
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001280 uint32_t report_flags = 0;
1281 uint32_t debug_action = 0;
1282 FILE *log_output = NULL;
1283 const char *option_str;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07001284 // initialize MemTracker options
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001285 report_flags = getLayerOptionFlags("MemTrackerReportFlags", 0);
1286 getLayerOptionEnum("MemTrackerDebugAction", (uint32_t *) &debug_action);
Tobin Ehlisee702232015-01-08 14:26:53 -07001287
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001288 if (debug_action & VK_DBG_LAYER_ACTION_LOG_MSG)
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07001289 {
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001290 option_str = getLayerOption("MemTrackerLogFilename");
1291 if (option_str) {
1292 log_output = fopen(option_str, "w");
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07001293 }
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001294 if (log_output == NULL) {
1295 log_output = stdout;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001296 }
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001297
1298 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 -07001299 }
1300
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001301 if (!globalLockInitialized)
1302 {
1303 // TODO/TBD: Need to delete this mutex sometime. How??? One
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001304 // suggestion is to call this during vkCreateInstance(), and then we
1305 // can clean it up during vkDestroyInstance(). However, that requires
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001306 // that the layer have per-instance locks. We need to come back and
1307 // address this soon.
1308 loader_platform_thread_create_mutex(&globalLock);
1309 globalLockInitialized = 1;
1310 }
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -06001311
1312 // Zero out memory property data
1313 memset(&memProps, 0, sizeof(VkPhysicalDeviceMemoryProperties));
Tobin Ehlis6663f492014-11-10 12:29:12 -07001314}
1315
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05001316// hook DestroyInstance to remove tableInstanceMap entry
1317VK_LAYER_EXPORT VkResult VKAPI vkDestroyInstance(VkInstance instance)
1318{
Jeremy Hayes35f8afc2015-06-18 10:25:55 -06001319 // Grab the key before the instance is destroyed.
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001320 dispatch_key key = get_dispatch_key(instance);
1321 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, instance);
1322 VkResult res = pTable->DestroyInstance(instance);
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001323
1324 // Clean up logging callback, if any
Courtney Goeltzenleuchter095e6772015-06-16 16:58:52 -06001325 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001326 if (my_data->logging_callback) {
1327 layer_destroy_msg_callback(my_data->report_data, my_data->logging_callback);
1328 }
1329
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001330 layer_debug_report_destroy_instance(mid(instance));
1331 layer_data_map.erase(pTable);
1332
1333 mem_tracker_instance_table_map.erase(key);
1334 assert(mem_tracker_instance_table_map.size() == 0 && "Should not have any instance mappings hanging around");
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05001335 return res;
1336}
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001337
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06001338VkResult VKAPI vkCreateInstance(
1339 const VkInstanceCreateInfo* pCreateInfo,
1340 VkInstance* pInstance)
1341{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001342 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, *pInstance);
Courtney Goeltzenleuchterd02a9642015-06-08 14:58:39 -06001343 VkResult result = pTable->CreateInstance(pCreateInfo, pInstance);
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06001344
1345 if (result == VK_SUCCESS) {
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001346 layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
1347 my_data->report_data = debug_report_create_instance(
1348 pTable,
1349 *pInstance,
1350 pCreateInfo->extensionCount,
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001351 pCreateInfo->ppEnabledExtensionNames);
Courtney Goeltzenleuchter6f484322015-06-14 11:37:01 -06001352
1353 init_mem_tracker(my_data);
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06001354 }
1355 return result;
1356}
1357
Jon Ashburn747f2b62015-06-18 15:02:58 -06001358static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
1359{
Courtney Goeltzenleuchterd54749c2015-07-05 11:17:01 -06001360 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Ian Elliott1064fe32015-07-06 14:31:32 -06001361 my_device_data->wsi_enabled = false;
Courtney Goeltzenleuchterd54749c2015-07-05 11:17:01 -06001362 for (uint32_t i = 0; i < pCreateInfo->extensionCount; i++) {
Ian Elliott1064fe32015-07-06 14:31:32 -06001363 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_WSI_DEVICE_SWAPCHAIN_EXTENSION_NAME) == 0)
1364 my_device_data->wsi_enabled = true;
Jon Ashburn747f2b62015-06-18 15:02:58 -06001365 }
1366}
1367
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001368VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(
1369 VkPhysicalDevice gpu,
1370 const VkDeviceCreateInfo *pCreateInfo,
1371 VkDevice *pDevice)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001372{
Courtney Goeltzenleuchterca173b82015-06-25 18:01:43 -06001373 VkLayerDispatchTable *pDeviceTable = get_dispatch_table(mem_tracker_device_table_map, *pDevice);
1374 VkResult result = pDeviceTable->CreateDevice(gpu, pCreateInfo, pDevice);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001375 if (result == VK_SUCCESS) {
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001376 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001377 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
1378 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
Jon Ashburn747f2b62015-06-18 15:02:58 -06001379 createDeviceRegisterExtensions(pCreateInfo, *pDevice);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001380 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001381 return result;
1382}
1383
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001384VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice(
1385 VkDevice device)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001386{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001387 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001388 // TODO : Need to set device as srcObj
Mark Lobodzinski524df112015-08-10 14:37:52 -06001389 log_msg(mdd(device), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE, 0, 0, MEMTRACK_NONE, "MEM",
1390 "Printing List details prior to vkDestroyDevice()");
1391 log_msg(mdd(device), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE, 0, 0, MEMTRACK_NONE, "MEM",
1392 "================================================");
1393 print_mem_list(device);
1394 printCBList(device);
1395 print_object_list(device);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001396 if (VK_FALSE == delete_cmd_buf_info_list()) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001397 // TODO : Need to set device as srcObj
1398 log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE, 0, 0, MEMTRACK_INTERNAL_ERROR, "MEM",
Courtney Goeltzenleuchterb9f0bf32015-06-14 09:50:18 -06001399 "Issue deleting global CB list in vkDestroyDevice()");
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001400 }
Tobin Ehlisb54ef782014-11-25 18:01:12 -07001401 // Report any memory leaks
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001402 MT_MEM_OBJ_INFO* pInfo = NULL;
David Pinedod8f83d82015-04-27 16:36:17 -06001403 if (memObjMap.size() > 0) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001404 for (auto ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) {
Mike Stroyandd7aed72015-05-19 17:03:40 -06001405 pInfo = &(*ii).second;
David Pinedod8f83d82015-04-27 16:36:17 -06001406 if (pInfo->allocInfo.allocationSize != 0) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001407 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, pInfo->mem.handle, 0, MEMTRACK_MEMORY_LEAK, "MEM",
Courtney Goeltzenleuchterb9f0bf32015-06-14 09:50:18 -06001408 "Mem Object %p has not been freed. You should clean up this memory by calling "
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001409 "vkFreeMemory(%p) prior to vkDestroyDevice().", pInfo->mem, pInfo->mem);
David Pinedod8f83d82015-04-27 16:36:17 -06001410 }
Mark Lobodzinski2f3b19b2015-02-18 18:06:24 -06001411 }
Tobin Ehlisb54ef782014-11-25 18:01:12 -07001412 }
Mark Lobodzinski223ca202015-04-02 08:52:53 -05001413 // Queues persist until device is destroyed
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001414 delete_queue_info_list();
Courtney Goeltzenleuchter7dcc6a72015-06-11 16:01:11 -06001415 layer_debug_report_destroy_device(device);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001416 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05001417
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001418 dispatch_key key = get_dispatch_key(device);
Courtney Goeltzenleuchter89d68442015-06-13 21:40:22 -06001419#if DISPATCH_MAP_DEBUG
1420 fprintf(stderr, "Device: %p, key: %p\n", device, key);
1421#endif
Jon Ashburn747f2b62015-06-18 15:02:58 -06001422 VkLayerDispatchTable *pDisp = get_dispatch_table(mem_tracker_device_table_map, device);
1423 VkResult result = pDisp->DestroyDevice(device);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001424 mem_tracker_device_table_map.erase(key);
Courtney Goeltzenleuchter10100442015-06-13 21:36:49 -06001425 assert(mem_tracker_device_table_map.size() == 0 && "Should not have any instance mappings hanging around");
Jon Ashburn747f2b62015-06-18 15:02:58 -06001426
Tobin Ehlis6663f492014-11-10 12:29:12 -07001427 return result;
1428}
1429
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -06001430VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceMemoryProperties(
1431 VkPhysicalDevice physicalDevice,
1432 VkPhysicalDeviceMemoryProperties *pMemoryProperties)
1433{
1434 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(mem_tracker_instance_table_map, physicalDevice);
1435 VkResult result = pInstanceTable->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
1436 if (result == VK_SUCCESS) {
1437 // copy mem props to local var...
1438 memcpy(&memProps, pMemoryProperties, sizeof(VkPhysicalDeviceMemoryProperties));
1439 }
1440 return result;
1441}
1442
Courtney Goeltzenleuchtere7481332015-07-07 10:04:16 -06001443static const VkLayerProperties mtGlobalLayers[] = {
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001444 {
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001445 "MemTracker",
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001446 VK_API_VERSION,
1447 VK_MAKE_VERSION(0, 1, 0),
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06001448 "Validation layer: MemTracker",
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06001449 }
Jon Ashburn9fd4cc42015-04-10 14:33:07 -06001450};
1451
Tony Barbour59a47322015-06-24 16:06:58 -06001452VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionProperties(
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001453 const char *pLayerName,
1454 uint32_t *pCount,
1455 VkExtensionProperties* pProperties)
Jon Ashburn9fd4cc42015-04-10 14:33:07 -06001456{
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001457 /* Mem tracker does not have any global extensions */
Courtney Goeltzenleuchtere7481332015-07-07 10:04:16 -06001458 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Tony Barbour59a47322015-06-24 16:06:58 -06001459}
1460
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001461VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalLayerProperties(
1462 uint32_t *pCount,
1463 VkLayerProperties* pProperties)
Tony Barbour59a47322015-06-24 16:06:58 -06001464{
Courtney Goeltzenleuchtere7481332015-07-07 10:04:16 -06001465 return util_GetLayerProperties(ARRAY_SIZE(mtGlobalLayers),
1466 mtGlobalLayers,
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001467 pCount, pProperties);
Jon Ashburn9fd4cc42015-04-10 14:33:07 -06001468}
1469
Tony Barbour59a47322015-06-24 16:06:58 -06001470VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionProperties(
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001471 VkPhysicalDevice physicalDevice,
1472 const char* pLayerName,
1473 uint32_t* pCount,
1474 VkExtensionProperties* pProperties)
Tony Barbour59a47322015-06-24 16:06:58 -06001475{
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001476 /* Mem tracker does not have any physical device extensions */
Courtney Goeltzenleuchtere7481332015-07-07 10:04:16 -06001477 return util_GetExtensionProperties(0, NULL, pCount, pProperties);
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001478}
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06001479
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001480VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceLayerProperties(
1481 VkPhysicalDevice physicalDevice,
1482 uint32_t* pCount,
1483 VkLayerProperties* pProperties)
1484{
1485 /* Mem tracker's physical device layers are the same as global */
Courtney Goeltzenleuchtere7481332015-07-07 10:04:16 -06001486 return util_GetLayerProperties(ARRAY_SIZE(mtGlobalLayers), mtGlobalLayers,
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06001487 pCount, pProperties);
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06001488}
1489
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001490VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue(
1491 VkDevice device,
1492 uint32_t queueNodeIndex,
1493 uint32_t queueIndex,
1494 VkQueue *pQueue)
Mark Lobodzinski748eddf2015-03-31 16:05:35 -05001495{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001496 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001497 if (result == VK_SUCCESS) {
Mark Lobodzinskied450b02015-04-07 13:38:21 -05001498 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001499 add_queue_info(*pQueue);
Mark Lobodzinskied450b02015-04-07 13:38:21 -05001500 loader_platform_thread_unlock_mutex(&globalLock);
1501 }
Mark Lobodzinski748eddf2015-03-31 16:05:35 -05001502 return result;
1503}
1504
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001505VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(
1506 VkQueue queue,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001507 uint32_t cmdBufferCount,
1508 const VkCmdBuffer *pCmdBuffers,
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001509 VkFence fence)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001510{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001511 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001512 // TODO : Need to track fence and clear mem references when fence clears
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001513 MT_CB_INFO* pCBInfo = NULL;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001514 uint64_t fenceId = add_fence_info(fence, queue);
Mark Lobodzinskied450b02015-04-07 13:38:21 -05001515
Mark Lobodzinski524df112015-08-10 14:37:52 -06001516 print_mem_list(queue);
1517 printCBList(queue);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001518 for (uint32_t i = 0; i < cmdBufferCount; i++) {
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001519 pCBInfo = get_cmd_buf_info(pCmdBuffers[i]);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05001520 pCBInfo->fenceId = fenceId;
Mike Stroyan950496e2015-05-19 15:16:08 -06001521 pCBInfo->lastSubmittedFence = fence;
1522 pCBInfo->lastSubmittedQueue = queue;
Tobin Ehlis6663f492014-11-10 12:29:12 -07001523 }
Mark Lobodzinskied450b02015-04-07 13:38:21 -05001524
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001525 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001526 VkResult result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueSubmit(
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05001527 queue, cmdBufferCount, pCmdBuffers, fence);
Courtney Goeltzenleuchterd3fb9552015-04-02 13:39:07 -06001528 return result;
1529}
1530
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001531VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory(
1532 VkDevice device,
1533 const VkMemoryAllocInfo *pAllocInfo,
1534 VkDeviceMemory *pMem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001535{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001536 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->AllocMemory(device, pAllocInfo, pMem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001537 // TODO : Track allocations and overall size here
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001538 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchter7dcc6a72015-06-11 16:01:11 -06001539 add_mem_obj_info(device, *pMem, pAllocInfo);
Mark Lobodzinski524df112015-08-10 14:37:52 -06001540 print_mem_list(device);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001541 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001542 return result;
1543}
1544
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001545VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory(
1546 VkDevice device,
1547 VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001548{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001549 /* From spec : A memory object is freed by calling vkFreeMemory() when it is no longer needed. Before
Tobin Ehlisc0418f92014-11-25 14:47:20 -07001550 * freeing a memory object, an application must ensure the memory object is unbound from
1551 * all API objects referencing it and that it is not referenced by any queued command buffers
1552 */
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001553 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -06001554 VkBool32 noerror = freeMemObjInfo(device, mem, false);
Mark Lobodzinski524df112015-08-10 14:37:52 -06001555 print_mem_list(device);
1556 print_object_list(device);
1557 printCBList(device);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001558 // Output an warning message for proper error/warning handling
1559 if (noerror == VK_FALSE) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001560 log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_FREED_MEM_REF, "MEM",
1561 "Freeing memory object while it still has references: mem obj %#" PRIxLEAST64, mem.handle);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001562 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001563 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001564 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->FreeMemory(device, mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001565 return result;
1566}
1567
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001568VK_LAYER_EXPORT VkResult VKAPI vkMapMemory(
1569 VkDevice device,
1570 VkDeviceMemory mem,
1571 VkDeviceSize offset,
1572 VkDeviceSize size,
1573 VkFlags flags,
1574 void **ppData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001575{
1576 // TODO : Track when memory is mapped
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001577 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001578 MT_MEM_OBJ_INFO *pMemObj = get_mem_obj_info(mem.handle);
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -06001579 if ((memProps.memoryTypes[pMemObj->allocInfo.memoryTypeIndex].propertyFlags &
1580 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06001581 log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem.handle, 0, MEMTRACK_INVALID_STATE, "MEM",
1582 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set: mem obj %#" PRIxLEAST64, mem.handle);
Mark Lobodzinski95152dc2015-02-25 12:16:04 -06001583 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001584 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001585 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->MapMemory(device, mem, offset, size, flags, ppData);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001586 return result;
1587}
1588
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06001589VK_LAYER_EXPORT VkResult VKAPI vkUnmapMemory(
1590 VkDevice device,
1591 VkDeviceMemory mem)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001592{
1593 // TODO : Track as memory gets unmapped, do we want to check what changed following map?
1594 // Make sure that memory was ever mapped to begin with
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001595 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->UnmapMemory(device, mem);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001596 return result;
1597}
1598
Tobin Ehlis257d9742015-07-08 17:08:02 -06001599VK_LAYER_EXPORT VkResult VKAPI vkDestroyFence(VkDevice device, VkFence fence)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001600{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001601 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001602 delete_fence_info(fence);
1603 auto item = fenceMap.find(fence.handle);
1604 if (item != fenceMap.end()) {
1605 fenceMap.erase(item);
Tobin Ehlisa98df732014-11-27 07:52:04 -07001606 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001607 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001608 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyFence(device, fence);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001609 return result;
1610}
1611
Tobin Ehlis257d9742015-07-08 17:08:02 -06001612VK_LAYER_EXPORT VkResult VKAPI vkDestroyBuffer(VkDevice device, VkBuffer buffer)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001613{
Tobin Ehlis257d9742015-07-08 17:08:02 -06001614 loader_platform_thread_lock_mutex(&globalLock);
1615 auto item = bufferMap.find(buffer.handle);
1616 if (item != bufferMap.end()) {
1617 bufferMap.erase(item);
1618 }
1619 loader_platform_thread_unlock_mutex(&globalLock);
1620 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyBuffer(device, buffer);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001621 return result;
1622}
1623
Tobin Ehlis257d9742015-07-08 17:08:02 -06001624VK_LAYER_EXPORT VkResult VKAPI vkDestroyImage(VkDevice device, VkImage image)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001625{
Tobin Ehlis257d9742015-07-08 17:08:02 -06001626 loader_platform_thread_lock_mutex(&globalLock);
1627 auto item = imageMap.find(image.handle);
1628 if (item != imageMap.end()) {
1629 imageMap.erase(item);
1630 }
1631 loader_platform_thread_unlock_mutex(&globalLock);
1632 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyImage(device, image);
1633 return result;
1634}
1635
1636VK_LAYER_EXPORT VkResult VKAPI vkDestroyAttachmentView(VkDevice device, VkAttachmentView attachmentView)
1637{
1638 loader_platform_thread_lock_mutex(&globalLock);
1639 auto item = attachmentViewMap.find(attachmentView.handle);
1640 if (item != attachmentViewMap.end()) {
1641 attachmentViewMap.erase(item);
1642 }
1643 loader_platform_thread_unlock_mutex(&globalLock);
1644 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyAttachmentView(device, attachmentView);
1645 return result;
1646}
1647
1648VK_LAYER_EXPORT VkResult VKAPI vkDestroyImageView(VkDevice device, VkImageView imageView)
1649{
1650 loader_platform_thread_lock_mutex(&globalLock);
1651 auto item = imageViewMap.find(imageView.handle);
1652 if (item != imageViewMap.end()) {
1653 imageViewMap.erase(item);
1654 }
1655 loader_platform_thread_unlock_mutex(&globalLock);
1656 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyImageView(device, imageView);
1657 return result;
1658}
1659
1660VK_LAYER_EXPORT VkResult VKAPI vkDestroyPipeline(VkDevice device, VkPipeline pipeline)
1661{
1662 loader_platform_thread_lock_mutex(&globalLock);
1663 auto item = pipelineMap.find(pipeline.handle);
1664 if (item != pipelineMap.end()) {
1665 pipelineMap.erase(item);
1666 }
1667 loader_platform_thread_unlock_mutex(&globalLock);
1668 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyPipeline(device, pipeline);
1669 return result;
1670}
1671
1672VK_LAYER_EXPORT VkResult VKAPI vkDestroySampler(VkDevice device, VkSampler sampler)
1673{
1674 loader_platform_thread_lock_mutex(&globalLock);
1675 auto item = samplerMap.find(sampler.handle);
1676 if (item != samplerMap.end()) {
1677 samplerMap.erase(item);
1678 }
1679 loader_platform_thread_unlock_mutex(&globalLock);
1680 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroySampler(device, sampler);
1681 return result;
1682}
1683
1684VK_LAYER_EXPORT VkResult VKAPI vkDestroySemaphore(VkDevice device, VkSemaphore semaphore)
1685{
1686 loader_platform_thread_lock_mutex(&globalLock);
1687 auto item = semaphoreMap.find(semaphore.handle);
1688 if (item != semaphoreMap.end()) {
1689 semaphoreMap.erase(item);
1690 }
1691 loader_platform_thread_unlock_mutex(&globalLock);
1692 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroySemaphore(device, semaphore);
1693 return result;
1694}
1695
1696VK_LAYER_EXPORT VkResult VKAPI vkDestroyEvent(VkDevice device, VkEvent event)
1697{
1698 loader_platform_thread_lock_mutex(&globalLock);
1699 auto item = eventMap.find(event.handle);
1700 if (item != eventMap.end()) {
1701 eventMap.erase(item);
1702 }
1703 loader_platform_thread_unlock_mutex(&globalLock);
1704 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyEvent(device, event);
1705 return result;
1706}
1707
1708VK_LAYER_EXPORT VkResult VKAPI vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool)
1709{
1710 loader_platform_thread_lock_mutex(&globalLock);
1711 auto item = queryPoolMap.find(queryPool.handle);
1712 if (item != queryPoolMap.end()) {
1713 queryPoolMap.erase(item);
1714 }
1715 loader_platform_thread_unlock_mutex(&globalLock);
1716 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyQueryPool(device, queryPool);
1717 return result;
1718}
1719
1720VK_LAYER_EXPORT VkResult VKAPI vkDestroyBufferView(VkDevice device, VkBufferView bufferView)
1721{
1722 loader_platform_thread_lock_mutex(&globalLock);
1723 auto item = bufferViewMap.find(bufferView.handle);
1724 if (item != bufferViewMap.end()) {
1725 bufferViewMap.erase(item);
1726 }
1727 loader_platform_thread_unlock_mutex(&globalLock);
1728 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyBufferView(device, bufferView);
1729 return result;
1730}
1731
1732VK_LAYER_EXPORT VkResult VKAPI vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule)
1733{
1734 loader_platform_thread_lock_mutex(&globalLock);
1735 auto item = shaderModuleMap.find(shaderModule.handle);
1736 if (item != shaderModuleMap.end()) {
1737 shaderModuleMap.erase(item);
1738 }
1739 loader_platform_thread_unlock_mutex(&globalLock);
1740 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyShaderModule(device, shaderModule);
1741 return result;
1742}
1743
1744VK_LAYER_EXPORT VkResult VKAPI vkDestroyShader(VkDevice device, VkShader shader)
1745{
1746 loader_platform_thread_lock_mutex(&globalLock);
1747 auto item = shaderMap.find(shader.handle);
1748 if (item != shaderMap.end()) {
1749 shaderMap.erase(item);
1750 }
1751 loader_platform_thread_unlock_mutex(&globalLock);
1752 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyShader(device, shader);
1753 return result;
1754}
1755
1756VK_LAYER_EXPORT VkResult VKAPI vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout)
1757{
1758 loader_platform_thread_lock_mutex(&globalLock);
1759 auto item = pipelineLayoutMap.find(pipelineLayout.handle);
1760 if (item != pipelineLayoutMap.end()) {
1761 pipelineLayoutMap.erase(item);
1762 }
1763 loader_platform_thread_unlock_mutex(&globalLock);
1764 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout);
1765 return result;
1766}
1767
1768VK_LAYER_EXPORT VkResult VKAPI vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout)
1769{
1770 loader_platform_thread_lock_mutex(&globalLock);
1771 auto item = descriptorSetLayoutMap.find(descriptorSetLayout.handle);
1772 if (item != descriptorSetLayoutMap.end()) {
1773 descriptorSetLayoutMap.erase(item);
1774 }
1775 loader_platform_thread_unlock_mutex(&globalLock);
1776 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout);
1777 return result;
1778}
1779
1780VK_LAYER_EXPORT VkResult VKAPI vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool)
1781{
1782 loader_platform_thread_lock_mutex(&globalLock);
1783 auto item = descriptorPoolMap.find(descriptorPool.handle);
1784 if (item != descriptorPoolMap.end()) {
1785 descriptorPoolMap.erase(item);
1786 }
1787 loader_platform_thread_unlock_mutex(&globalLock);
1788 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool);
1789 return result;
1790}
1791
1792//VK_LAYER_EXPORT VkResult VKAPI vkDestroyDescriptorSet(VkDevice device, VkDescriptorSet descriptorSet)
1793//{
1794// loader_platform_thread_lock_mutex(&globalLock);
1795// auto item = descriptorSetMap.find(descriptorSet.handle);
1796// if (item != descriptorSetMap.end()) {
1797// descriptorSetMap.erase(item);
1798// }
1799// loader_platform_thread_unlock_mutex(&globalLock);
1800// VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyDescriptorSet(device, descriptorSet);
1801// return result;
1802//}
1803
1804VK_LAYER_EXPORT VkResult VKAPI vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass)
1805{
1806 loader_platform_thread_lock_mutex(&globalLock);
1807 auto item = renderPassMap.find(renderPass.handle);
1808 if (item != renderPassMap.end()) {
1809 renderPassMap.erase(item);
1810 }
1811 loader_platform_thread_unlock_mutex(&globalLock);
1812 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyRenderPass(device, renderPass);
1813 return result;
1814}
1815
1816VK_LAYER_EXPORT VkResult VKAPI vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer)
1817{
1818 loader_platform_thread_lock_mutex(&globalLock);
1819 auto item = framebufferMap.find(framebuffer.handle);
1820 if (item != framebufferMap.end()) {
1821 framebufferMap.erase(item);
1822 }
1823 loader_platform_thread_unlock_mutex(&globalLock);
1824 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyFramebuffer(device, framebuffer);
Tony Barbour343d6212015-07-10 18:32:33 -06001825 return result;
Tobin Ehlis257d9742015-07-08 17:08:02 -06001826}
1827
1828VK_LAYER_EXPORT VkResult VKAPI vkDestroyDynamicViewportState(VkDevice device, VkDynamicViewportState dynamicViewportState)
1829{
1830 loader_platform_thread_lock_mutex(&globalLock);
1831 auto item = dynamicViewportStateMap.find(dynamicViewportState.handle);
1832 if (item != dynamicViewportStateMap.end()) {
1833 dynamicViewportStateMap.erase(item);
1834 }
1835 loader_platform_thread_unlock_mutex(&globalLock);
1836 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyDynamicViewportState(device, dynamicViewportState);
1837 return result;
1838}
1839
Cody Northrop12365112015-08-17 11:10:49 -06001840VK_LAYER_EXPORT VkResult VKAPI vkDestroyDynamicRasterLineState(VkDevice device, VkDynamicRasterLineState dynamicRasterLineState)
Tobin Ehlis257d9742015-07-08 17:08:02 -06001841{
1842 loader_platform_thread_lock_mutex(&globalLock);
Cody Northrop12365112015-08-17 11:10:49 -06001843 auto item = dynamicRasterLineStateMap.find(dynamicRasterLineState.handle);
1844 if (item != dynamicRasterLineStateMap.end()) {
1845 dynamicRasterLineStateMap.erase(item);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001846 }
1847 loader_platform_thread_unlock_mutex(&globalLock);
Cody Northrop12365112015-08-17 11:10:49 -06001848 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyDynamicRasterLineState(device, dynamicRasterLineState);
1849 return result;
1850}
1851
1852VK_LAYER_EXPORT VkResult VKAPI vkDestroyDynamicRasterDepthBiasState(VkDevice device, VkDynamicRasterDepthBiasState dynamicRasterDepthBiasState)
1853{
1854 loader_platform_thread_lock_mutex(&globalLock);
1855 auto item = dynamicRasterDepthBiasStateMap.find(dynamicRasterDepthBiasState.handle);
1856 if (item != dynamicRasterDepthBiasStateMap.end()) {
1857 dynamicRasterDepthBiasStateMap.erase(item);
1858 }
1859 loader_platform_thread_unlock_mutex(&globalLock);
1860 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyDynamicRasterDepthBiasState(device, dynamicRasterDepthBiasState);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001861 return result;
1862}
1863
1864VK_LAYER_EXPORT VkResult VKAPI vkDestroyDynamicColorBlendState(VkDevice device, VkDynamicColorBlendState dynamicColorBlendState)
1865{
1866 loader_platform_thread_lock_mutex(&globalLock);
1867 auto item = dynamicColorBlendStateMap.find(dynamicColorBlendState.handle);
1868 if (item != dynamicColorBlendStateMap.end()) {
1869 dynamicColorBlendStateMap.erase(item);
1870 }
1871 loader_platform_thread_unlock_mutex(&globalLock);
1872 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyDynamicColorBlendState(device, dynamicColorBlendState);
1873 return result;
1874}
1875
1876VK_LAYER_EXPORT VkResult VKAPI vkDestroyDynamicDepthStencilState(VkDevice device, VkDynamicDepthStencilState dynamicDepthStencilState)
1877{
1878 loader_platform_thread_lock_mutex(&globalLock);
1879 auto item = dynamicDepthStencilStateMap.find(dynamicDepthStencilState.handle);
1880 if (item != dynamicDepthStencilStateMap.end()) {
1881 dynamicDepthStencilStateMap.erase(item);
1882 }
1883 loader_platform_thread_unlock_mutex(&globalLock);
1884 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyDynamicDepthStencilState(device, dynamicDepthStencilState);
1885 return result;
1886}
1887
1888VkResult VKAPI vkBindBufferMemory(
1889 VkDevice device,
1890 VkBuffer buffer,
1891 VkDeviceMemory mem,
1892 VkDeviceSize memOffset)
1893{
1894 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->BindBufferMemory(device, buffer, mem, memOffset);
Mike Stroyanb050c682015-04-17 12:36:38 -06001895 loader_platform_thread_lock_mutex(&globalLock);
1896 // Track objects tied to memory
Tobin Ehlis257d9742015-07-08 17:08:02 -06001897 set_mem_binding(device, mem, buffer.handle, VK_OBJECT_TYPE_BUFFER);
Tobin Ehlis2717d132015-07-10 18:25:07 -06001898 add_object_binding_info(buffer.handle, VK_OBJECT_TYPE_BUFFER, mem);
Mark Lobodzinski524df112015-08-10 14:37:52 -06001899 print_object_list(device);
1900 print_mem_list(device);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001901 loader_platform_thread_unlock_mutex(&globalLock);
1902 return result;
1903}
1904
1905VkResult VKAPI vkBindImageMemory(
1906 VkDevice device,
1907 VkImage image,
1908 VkDeviceMemory mem,
1909 VkDeviceSize memOffset)
1910{
1911 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->BindImageMemory(device, image, mem, memOffset);
1912 loader_platform_thread_lock_mutex(&globalLock);
1913 // Track objects tied to memory
Tobin Ehlis257d9742015-07-08 17:08:02 -06001914 set_mem_binding(device, mem, image.handle, VK_OBJECT_TYPE_IMAGE);
Tobin Ehlis2717d132015-07-10 18:25:07 -06001915 add_object_binding_info(image.handle, VK_OBJECT_TYPE_IMAGE, mem);
Mark Lobodzinski524df112015-08-10 14:37:52 -06001916 print_object_list(device);
1917 print_mem_list(device);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001918 loader_platform_thread_unlock_mutex(&globalLock);
1919 return result;
1920}
1921
1922VkResult VKAPI vkGetBufferMemoryRequirements(
1923 VkDevice device,
1924 VkBuffer buffer,
1925 VkMemoryRequirements* pMemoryRequirements)
1926{
1927 // TODO : What to track here?
1928 // Could potentially save returned mem requirements and validate values passed into BindBufferMemory
1929 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
1930 return result;
1931}
1932
1933VkResult VKAPI vkGetImageMemoryRequirements(
1934 VkDevice device,
1935 VkImage image,
1936 VkMemoryRequirements* pMemoryRequirements)
1937{
1938 // TODO : What to track here?
1939 // Could potentially save returned mem requirements and validate values passed into BindImageMemory
1940 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
1941 return result;
1942}
1943
1944VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageOpaqueMemory(
1945 VkQueue queue,
1946 VkImage image,
1947 uint32_t numBindings,
1948 const VkSparseMemoryBindInfo* pBindInfo)
1949{
1950 VkResult result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueBindSparseImageOpaqueMemory(
1951 queue, image, numBindings, pBindInfo);
1952 loader_platform_thread_lock_mutex(&globalLock);
1953 // Track objects tied to memory
1954 if (VK_FALSE == set_sparse_mem_binding(queue, pBindInfo->mem, image.handle, VK_OBJECT_TYPE_IMAGE)) {
1955 log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE, image.handle, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
1956 "In vkQueueBindSparseImageOpaqueMemory(), unable to set image %#" PRIxLEAST64 " binding to mem obj %#" PRIxLEAST64, image.handle, pBindInfo->mem.handle);
1957 }
Mark Lobodzinski524df112015-08-10 14:37:52 -06001958 print_object_list(queue);
1959 print_mem_list(queue);
Tobin Ehlis257d9742015-07-08 17:08:02 -06001960 loader_platform_thread_unlock_mutex(&globalLock);
1961 return result;
1962}
1963
1964VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseImageMemory(
1965 VkQueue queue,
1966 VkImage image,
1967 uint32_t numBindings,
1968 const VkSparseImageMemoryBindInfo* pBindInfo)
1969{
1970 VkResult result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueBindSparseImageMemory(
1971 queue, image, numBindings, pBindInfo);
1972 loader_platform_thread_lock_mutex(&globalLock);
1973 // Track objects tied to memory
1974 if (VK_FALSE == set_sparse_mem_binding(queue, pBindInfo->mem, image.handle, VK_OBJECT_TYPE_IMAGE)) {
1975 log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE, image.handle, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
1976 "In vkQueueBindSparseImageMemory(), unable to set image %#" PRIxLEAST64 " binding to mem obj %#" PRIxLEAST64, image.handle, pBindInfo->mem.handle);
1977 }
Mark Lobodzinski524df112015-08-10 14:37:52 -06001978 print_object_list(queue);
1979 print_mem_list(queue);
Mike Stroyanb050c682015-04-17 12:36:38 -06001980 loader_platform_thread_unlock_mutex(&globalLock);
1981 return result;
1982}
1983
Mark Lobodzinski942b1722015-05-11 17:21:15 -05001984VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory(
Mark Lobodzinski16e8bef2015-07-03 15:58:09 -06001985 VkQueue queue,
1986 VkBuffer buffer,
1987 uint32_t numBindings,
1988 const VkSparseMemoryBindInfo* pBindInfo)
Mike Stroyanb050c682015-04-17 12:36:38 -06001989{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06001990 VkResult result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueBindSparseBufferMemory(
Mark Lobodzinski16e8bef2015-07-03 15:58:09 -06001991 queue, buffer, numBindings, pBindInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06001992 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001993 // Track objects tied to memory
Tobin Ehlis257d9742015-07-08 17:08:02 -06001994 if (VK_FALSE == set_sparse_mem_binding(queue, pBindInfo->mem, buffer.handle, VK_OBJECT_TYPE_BUFFER)) {
1995 log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_BUFFER, buffer.handle, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
1996 "Unable to set object %#" PRIxLEAST64 " binding to mem obj %#" PRIxLEAST64, buffer.handle, pBindInfo->mem.handle);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001997 }
Mark Lobodzinski524df112015-08-10 14:37:52 -06001998 print_object_list(queue);
1999 print_mem_list(queue);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002000 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002001 return result;
2002}
2003
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002004VK_LAYER_EXPORT VkResult VKAPI vkCreateFence(
2005 VkDevice device,
2006 const VkFenceCreateInfo *pCreateInfo,
2007 VkFence *pFence)
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002008{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002009 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateFence(device, pCreateInfo, pFence);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002010 if (VK_SUCCESS == result) {
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002011 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002012 MT_FENCE_INFO* pFI = &fenceMap[pFence->handle];
2013 memset(pFI, 0, sizeof(MT_FENCE_INFO));
2014 memcpy(&(pFI->createInfo), pCreateInfo, sizeof(VkFenceCreateInfo));
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002015 loader_platform_thread_unlock_mutex(&globalLock);
2016 }
2017 return result;
2018}
2019
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002020VK_LAYER_EXPORT VkResult VKAPI vkResetFences(
2021 VkDevice device,
2022 uint32_t fenceCount,
Courtney Goeltzenleuchter2bf8f902015-06-18 17:28:20 -06002023 const VkFence *pFences)
Mark Lobodzinski148e1582015-04-07 16:07:57 -05002024{
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06002025 /*
2026 * TODO: Shouldn't we check for error conditions before passing down the chain?
2027 * What if reason result is not VK_SUCCESS is something we could report as a validation error?
2028 */
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002029 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->ResetFences(device, fenceCount, pFences);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002030 if (VK_SUCCESS == result) {
Mark Lobodzinski148e1582015-04-07 16:07:57 -05002031 loader_platform_thread_lock_mutex(&globalLock);
2032 // Reset fence state in fenceCreateInfo structure
2033 for (uint32_t i = 0; i < fenceCount; i++) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002034 //MT_OBJ_INFO* pObjectInfo = get_object_info(pFences[i].handle);
2035 auto fence_item = fenceMap.find(pFences[i].handle);
2036 if (fence_item != fenceMap.end()) {
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -05002037 // Validate fences in SIGNALED state
Tobin Ehlis257d9742015-07-08 17:08:02 -06002038 if (!(fence_item->second.createInfo.flags & VK_FENCE_CREATE_SIGNALED_BIT)) {
2039 log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_FENCE, pFences[i].handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
2040 "Fence %#" PRIxLEAST64 " submitted to VkResetFences in UNSIGNALED STATE", pFences[i].handle);
2041 result = VK_ERROR_INVALID_VALUE;
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -05002042 }
2043 else {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002044 fence_item->second.createInfo.flags =
2045 static_cast<VkFenceCreateFlags>(fence_item->second.createInfo.flags & ~VK_FENCE_CREATE_SIGNALED_BIT);
Mark Lobodzinskiabc1bc42015-04-09 13:46:09 -05002046 }
Mark Lobodzinski148e1582015-04-07 16:07:57 -05002047 }
2048 }
2049 loader_platform_thread_unlock_mutex(&globalLock);
2050 }
2051 return result;
2052}
2053
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002054VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus(
2055 VkDevice device,
2056 VkFence fence)
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002057{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002058 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetFenceStatus(device, fence);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002059 if (VK_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002060 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002061 update_fence_tracking(fence);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002062 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002063 }
2064 return result;
2065}
2066
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002067VK_LAYER_EXPORT VkResult VKAPI vkWaitForFences(
2068 VkDevice device,
2069 uint32_t fenceCount,
2070 const VkFence *pFences,
Courtney Goeltzenleuchtercd2a0992015-07-09 11:44:38 -06002071 VkBool32 waitAll,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002072 uint64_t timeout)
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002073{
Mark Lobodzinski148e1582015-04-07 16:07:57 -05002074 // Verify fence status of submitted fences
2075 for(uint32_t i = 0; i < fenceCount; i++) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002076 auto pFenceInfo = fenceMap.find(pFences[i].handle);
2077 if (pFenceInfo != fenceMap.end()) {
2078 if (pFenceInfo->second.createInfo.flags & VK_FENCE_CREATE_SIGNALED_BIT) {
2079 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, pFences[i].handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM",
2080 "VkWaitForFences specified fence %#" PRIxLEAST64 " already in SIGNALED state.", pFences[i].handle);
Mark Lobodzinski148e1582015-04-07 16:07:57 -05002081 }
2082 }
2083 }
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002084 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002085 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski50932972015-04-02 20:49:09 -05002086
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002087 if (VK_SUCCESS == result) {
Mark Lobodzinski50932972015-04-02 20:49:09 -05002088 if (waitAll || fenceCount == 1) { // Clear all the fences
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002089 for(uint32_t i = 0; i < fenceCount; i++) {
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002090 update_fence_tracking(pFences[i]);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002091 }
2092 }
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002093 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002094 loader_platform_thread_unlock_mutex(&globalLock);
2095 return result;
2096}
2097
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002098VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle(
2099 VkQueue queue)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002100{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002101 VkResult result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueWaitIdle(queue);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002102 if (VK_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002103 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002104 retire_queue_fences(queue);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002105 loader_platform_thread_unlock_mutex(&globalLock);
2106 }
2107 return result;
2108}
2109
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002110VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle(
2111 VkDevice device)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002112{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002113 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DeviceWaitIdle(device);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002114 if (VK_SUCCESS == result) {
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002115 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002116 retire_device_fences(device);
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05002117 loader_platform_thread_unlock_mutex(&globalLock);
2118 }
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002119 return result;
2120}
2121
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002122VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent(
2123 VkDevice device,
2124 const VkEventCreateInfo *pCreateInfo,
2125 VkEvent *pEvent)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002126{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002127 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateEvent(device, pCreateInfo, pEvent);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002128 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002129 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002130 add_object_create_info(pEvent->handle, VK_OBJECT_TYPE_EVENT, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002131 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06002132 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002133 return result;
2134}
2135
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002136VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool(
2137 VkDevice device,
2138 const VkQueryPoolCreateInfo *pCreateInfo,
2139 VkQueryPool *pQueryPool)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002140{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002141 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pQueryPool);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002142 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002143 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002144 add_object_create_info(pQueryPool->handle, VK_OBJECT_TYPE_QUERY_POOL, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002145 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06002146 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002147 return result;
2148}
2149
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002150VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer(
2151 VkDevice device,
2152 const VkBufferCreateInfo *pCreateInfo,
2153 VkBuffer *pBuffer)
Tobin Ehlis7265e832015-01-19 08:42:29 -07002154{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002155 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateBuffer(device, pCreateInfo, pBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002156 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002157 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002158 add_object_create_info(pBuffer->handle, VK_OBJECT_TYPE_BUFFER, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002159 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06002160 }
Tobin Ehlis7265e832015-01-19 08:42:29 -07002161 return result;
2162}
2163
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002164VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView(
2165 VkDevice device,
2166 const VkBufferViewCreateInfo *pCreateInfo,
2167 VkBufferView *pView)
Tobin Ehlis7265e832015-01-19 08:42:29 -07002168{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002169 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateBufferView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002170 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002171 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002172 add_object_create_info(pView->handle, VK_OBJECT_TYPE_BUFFER_VIEW, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002173 loader_platform_thread_unlock_mutex(&globalLock);
Mark Lobodzinskic52b7752015-02-18 16:38:17 -06002174 }
Tobin Ehlis7265e832015-01-19 08:42:29 -07002175 return result;
2176}
2177
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002178VK_LAYER_EXPORT VkResult VKAPI vkCreateImage(
2179 VkDevice device,
2180 const VkImageCreateInfo *pCreateInfo,
2181 VkImage *pImage)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002182{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002183 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateImage(device, pCreateInfo, pImage);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002184 if (VK_SUCCESS == result) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002185 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002186 add_object_create_info(pImage->handle, VK_OBJECT_TYPE_IMAGE, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002187 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002188 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002189 return result;
2190}
2191
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002192VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(
2193 VkDevice device,
2194 const VkImageViewCreateInfo *pCreateInfo,
2195 VkImageView *pView)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002196{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002197 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateImageView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002198 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002199 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002200 add_object_create_info(pView->handle, VK_OBJECT_TYPE_IMAGE_VIEW, pCreateInfo);
Tobin Ehlis41376e12015-07-03 08:45:14 -06002201 // Validate that img has correct usage flags set
2202 validate_image_usage_flags(device, pCreateInfo->image, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT,
2203 false, "vkCreateImageView()", "VK_IMAGE_USAGE_[SAMPLED|STORAGE]_BIT");
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002204 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002205 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002206 return result;
2207}
2208
Chia-I Wu08accc62015-07-07 11:50:03 +08002209VK_LAYER_EXPORT VkResult VKAPI vkCreateAttachmentView(
Tobin Ehlisc0ff3e02015-07-13 13:42:25 -06002210 VkDevice device,
Chia-I Wu08accc62015-07-07 11:50:03 +08002211 const VkAttachmentViewCreateInfo *pCreateInfo,
2212 VkAttachmentView *pView)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002213{
Chia-I Wu08accc62015-07-07 11:50:03 +08002214 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateAttachmentView(device, pCreateInfo, pView);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002215 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002216 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002217 add_object_create_info(pView->handle, VK_OBJECT_TYPE_ATTACHMENT_VIEW, pCreateInfo);
Tobin Ehlis41376e12015-07-03 08:45:14 -06002218 // Validate that img has correct usage flags set
2219 // We don't use the image helper function here as it's a special case that checks struct type
Tobin Ehlis257d9742015-07-08 17:08:02 -06002220 MT_OBJ_BINDING_INFO* pInfo = get_object_binding_info(pCreateInfo->image.handle, VK_OBJECT_TYPE_IMAGE);
Tobin Ehlis41376e12015-07-03 08:45:14 -06002221 if (pInfo) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002222 if (VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO == pInfo->create_info.image.sType) {
Tobin Ehlisc0ff3e02015-07-13 13:42:25 -06002223 // TODO : Now that this is generalized for all Attachments, need to only check COLOR or DS USAGE bits
2224 // if/when we know that Image being attached to is Color or DS. Can probably do this for DS based on format
2225// validate_usage_flags(device, pInfo->create_info.image.usage, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, true,
2226// pCreateInfo->image.handle, VK_OBJECT_TYPE_IMAGE, "image", "vkCreateAttachmentView()", "VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
Tony Barbour791646c2015-07-13 16:37:21 -06002227 }// else if (VK_STRUCTURE_TYPE_SWAP_CHAIN_CREATE_INFO_WSI == pInfo->create_info.swapchain.sType) {
2228 // validate_usage_flags(device, pInfo->create_info.swapchain.imageUsageFlags, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, true,
2229 // pCreateInfo->image.handle, VK_OBJECT_TYPE_IMAGE, "image", "vkCreateAttachmentView()", "VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
2230 //}
Tobin Ehlis41376e12015-07-03 08:45:14 -06002231 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002232 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002233 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002234 return result;
2235}
2236
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002237VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(
2238 VkDevice device,
2239 const VkShaderCreateInfo *pCreateInfo,
2240 VkShader *pShader)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002241{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002242 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateShader(device, pCreateInfo, pShader);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002243 if (result == VK_SUCCESS) {
2244 loader_platform_thread_lock_mutex(&globalLock);
2245 add_object_create_info(pShader->handle, VK_OBJECT_TYPE_SHADER, pCreateInfo);
2246 loader_platform_thread_unlock_mutex(&globalLock);
2247 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002248 return result;
2249}
2250
Jon Ashburnc669cc62015-07-09 15:02:25 -06002251//TODO do we need to intercept pipelineCache functions to track objects?
2252VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelines(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002253 VkDevice device,
Jon Ashburnc669cc62015-07-09 15:02:25 -06002254 VkPipelineCache pipelineCache,
2255 uint32_t count,
2256 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2257 VkPipeline *pPipelines)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002258{
Jon Ashburnc669cc62015-07-09 15:02:25 -06002259 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateGraphicsPipelines(device, pipelineCache, count, pCreateInfos, pPipelines);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002260 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002261 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002262 /* TODO: pPipelines is now an array of pipelines */
2263 add_object_create_info(pPipelines->handle, VK_OBJECT_TYPE_PIPELINE, &pCreateInfos[0]);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002264 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002265 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002266 return result;
2267}
2268
Jon Ashburnc669cc62015-07-09 15:02:25 -06002269VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipelines(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002270 VkDevice device,
Jon Ashburnc669cc62015-07-09 15:02:25 -06002271 VkPipelineCache pipelineCache,
2272 uint32_t count,
2273 const VkComputePipelineCreateInfo *pCreateInfos,
2274 VkPipeline *pPipelines)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002275{
Jon Ashburnc669cc62015-07-09 15:02:25 -06002276 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateComputePipelines(device, pipelineCache, count, pCreateInfos, pPipelines);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002277 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002278 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002279 /* TODO: pPipelines is now an array of pipelines */
2280 add_object_create_info(pPipelines->handle, VK_OBJECT_TYPE_PIPELINE, &pCreateInfos[0]);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002281 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002282 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002283 return result;
2284}
2285
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002286VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler(
2287 VkDevice device,
2288 const VkSamplerCreateInfo *pCreateInfo,
2289 VkSampler *pSampler)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002290{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002291 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateSampler(device, pCreateInfo, pSampler);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002292 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002293 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002294 add_object_create_info(pSampler->handle, VK_OBJECT_TYPE_SAMPLER, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002295 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002296 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002297 return result;
2298}
2299
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002300VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState(
2301 VkDevice device,
Tobin Ehlis257d9742015-07-08 17:08:02 -06002302 const VkDynamicViewportStateCreateInfo *pCreateInfo,
2303 VkDynamicViewportState *pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002304{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002305 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateDynamicViewportState(device, pCreateInfo, pState);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002306 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002307 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002308 add_object_create_info(pState->handle, VK_OBJECT_TYPE_DYNAMIC_VIEWPORT_STATE, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002309 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002310 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002311 return result;
2312}
2313
Cody Northrop12365112015-08-17 11:10:49 -06002314VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterLineState(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002315 VkDevice device,
Cody Northrop12365112015-08-17 11:10:49 -06002316 const VkDynamicRasterLineStateCreateInfo *pCreateInfo,
2317 VkDynamicRasterLineState *pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002318{
Cody Northrop12365112015-08-17 11:10:49 -06002319 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateDynamicRasterLineState(device, pCreateInfo, pState);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002320 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002321 loader_platform_thread_lock_mutex(&globalLock);
Cody Northrop12365112015-08-17 11:10:49 -06002322 add_object_create_info(pState->handle, VK_OBJECT_TYPE_DYNAMIC_RASTER_LINE_STATE, pCreateInfo);
2323 loader_platform_thread_unlock_mutex(&globalLock);
2324 }
2325 return result;
2326}
2327
2328VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterDepthBiasState(
2329 VkDevice device,
2330 const VkDynamicRasterDepthBiasStateCreateInfo *pCreateInfo,
2331 VkDynamicRasterDepthBiasState *pState)
2332{
2333 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateDynamicRasterDepthBiasState(device, pCreateInfo, pState);
2334 if (result == VK_SUCCESS) {
2335 loader_platform_thread_lock_mutex(&globalLock);
2336 add_object_create_info(pState->handle, VK_OBJECT_TYPE_DYNAMIC_RASTER_DEPTH_BIAS_STATE, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002337 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002338 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002339 return result;
2340}
2341
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002342VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState(
2343 VkDevice device,
Tobin Ehlis257d9742015-07-08 17:08:02 -06002344 const VkDynamicColorBlendStateCreateInfo *pCreateInfo,
2345 VkDynamicColorBlendState *pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002346{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002347 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateDynamicColorBlendState(device, pCreateInfo, pState);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002348 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002349 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002350 add_object_create_info(pState->handle, VK_OBJECT_TYPE_DYNAMIC_COLOR_BLEND_STATE, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002351 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002352 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002353 return result;
2354}
2355
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002356VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState(
2357 VkDevice device,
Tobin Ehlis257d9742015-07-08 17:08:02 -06002358 const VkDynamicDepthStencilStateCreateInfo *pCreateInfo,
2359 VkDynamicDepthStencilState *pState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002360{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002361 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002362 if (result == VK_SUCCESS) {
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002363 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002364 add_object_create_info(pState->handle, VK_OBJECT_TYPE_DYNAMIC_DEPTH_STENCIL_STATE, pCreateInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002365 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis8be20fd2015-01-07 17:49:29 -07002366 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002367 return result;
2368}
2369
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002370VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer(
2371 VkDevice device,
2372 const VkCmdBufferCreateInfo *pCreateInfo,
2373 VkCmdBuffer *pCmdBuffer)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002374{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002375 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
Mark Lobodzinski223ca202015-04-02 08:52:53 -05002376 // At time of cmd buffer creation, create global cmd buffer info for the returned cmd buffer
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002377 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002378 if (*pCmdBuffer)
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002379 add_cmd_buf_info(*pCmdBuffer);
Mark Lobodzinski524df112015-08-10 14:37:52 -06002380 printCBList(device);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002381 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002382 return result;
2383}
2384
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002385VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer(
2386 VkCmdBuffer cmdBuffer,
2387 const VkCmdBufferBeginInfo *pBeginInfo)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002388{
Mike Stroyan950496e2015-05-19 15:16:08 -06002389 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002390 // This implicitly resets the Cmd Buffer so make sure any fence is done and then clear memory references
Mike Stroyan950496e2015-05-19 15:16:08 -06002391 if (!checkCBCompleted(cmdBuffer)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002392 // TODO : want cmdBuffer to be srcObj here
2393 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_RESET_CB_WHILE_IN_FLIGHT, "MEM",
Courtney Goeltzenleuchterb9f0bf32015-06-14 09:50:18 -06002394 "Calling vkBeginCommandBuffer() on active CB %p before it has completed. "
Mike Stroyan950496e2015-05-19 15:16:08 -06002395 "You must check CB flag before this call.", cmdBuffer);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002396 }
Mike Stroyan950496e2015-05-19 15:16:08 -06002397 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002398 VkResult result = get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->BeginCommandBuffer(cmdBuffer, pBeginInfo);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002399 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002400 clear_cmd_buf_and_mem_references(cmdBuffer);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002401 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002402 return result;
2403}
2404
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002405VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer(
2406 VkCmdBuffer cmdBuffer)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002407{
2408 // TODO : Anything to do here?
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002409 VkResult result = get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->EndCommandBuffer(cmdBuffer);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002410 return result;
2411}
2412
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002413VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer(
Cody Northrope62183e2015-07-09 18:08:05 -06002414 VkCmdBuffer cmdBuffer,
2415 VkCmdBufferResetFlags flags)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002416{
Mike Stroyan950496e2015-05-19 15:16:08 -06002417 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002418 // Verify that CB is complete (not in-flight)
Mike Stroyan950496e2015-05-19 15:16:08 -06002419 if (!checkCBCompleted(cmdBuffer)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002420 // TODO : Want cmdBuffer to be srcObj here
2421 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_RESET_CB_WHILE_IN_FLIGHT, "MEM",
Courtney Goeltzenleuchterb9f0bf32015-06-14 09:50:18 -06002422 "Resetting CB %p before it has completed. You must check CB flag before "
Mike Stroyan950496e2015-05-19 15:16:08 -06002423 "calling vkResetCommandBuffer().", cmdBuffer);
Tobin Ehlisc9dbcd52015-03-04 08:38:22 -07002424 }
2425 // Clear memory references as this point.
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002426 clear_cmd_buf_and_mem_references(cmdBuffer);
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002427 loader_platform_thread_unlock_mutex(&globalLock);
Cody Northrope62183e2015-07-09 18:08:05 -06002428 VkResult result = get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->ResetCommandBuffer(cmdBuffer, flags);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002429 return result;
2430}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002431// TODO : For any vkCmdBind* calls that include an object which has mem bound to it,
Tobin Ehlis6663f492014-11-10 12:29:12 -07002432// need to account for that mem now having binding to given cmdBuffer
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002433VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline(
2434 VkCmdBuffer cmdBuffer,
2435 VkPipelineBindPoint pipelineBindPoint,
2436 VkPipeline pipeline)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002437{
Tobin Ehlisc145be82015-01-08 15:22:32 -07002438#if 0
2439 // TODO : If memory bound to pipeline, then need to tie that mem to cmdBuffer
2440 if (getPipeline(pipeline)) {
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002441 MT_CB_INFO *pCBInfo = get_cmd_buf_info(cmdBuffer);
Mark Lobodzinski6434eff2015-03-31 16:05:35 -05002442 if (pCBInfo) {
2443 pCBInfo->pipelines[pipelineBindPoint] = pipeline;
Tobin Ehlisc145be82015-01-08 15:22:32 -07002444 } else {
Courtney Goeltzenleuchterb9f0bf32015-06-14 09:50:18 -06002445 "Attempt to bind Pipeline %p to non-existant command buffer %p!", (void*)pipeline, cmdBuffer);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06002446 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 -07002447 }
2448 }
2449 else {
Courtney Goeltzenleuchterb9f0bf32015-06-14 09:50:18 -06002450 "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06002451 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 -07002452 }
2453#endif
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002454 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002455}
2456
Tobin Ehlis257d9742015-07-08 17:08:02 -06002457void VKAPI vkCmdBindDynamicViewportState(
2458 VkCmdBuffer cmdBuffer,
2459 VkDynamicViewportState dynamicViewportState)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002460{
Tobin Ehlis257d9742015-07-08 17:08:02 -06002461 VkDynamicViewportStateCreateInfo* pCI;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002462 loader_platform_thread_lock_mutex(&globalLock);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002463 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
Tobin Ehlisc145be82015-01-08 15:22:32 -07002464 if (!pCmdBuf) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002465 // TODO : Want cmdBuffer to be srcObj here
2466 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_INVALID_CB, "MEM",
Courtney Goeltzenleuchterb9f0bf32015-06-14 09:50:18 -06002467 "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
Tobin Ehlisc145be82015-01-08 15:22:32 -07002468 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06002469 pCI = (VkDynamicViewportStateCreateInfo*)get_object_create_info(dynamicViewportState.handle, VK_OBJECT_TYPE_DYNAMIC_VIEWPORT_STATE);
2470 if (!pCI) {
2471 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DYNAMIC_VIEWPORT_STATE, dynamicViewportState.handle, 0, MEMTRACK_INVALID_OBJECT, "MEM",
2472 "Unable to find dynamic viewport state object %#" PRIxLEAST64 ", was it ever created?", dynamicViewportState.handle);
Tobin Ehlisc145be82015-01-08 15:22:32 -07002473 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06002474 pCmdBuf->pLastBoundDynamicState[VK_STATE_BIND_POINT_VIEWPORT] = dynamicViewportState.handle;
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002475 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002476 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindDynamicViewportState(cmdBuffer, dynamicViewportState);
2477}
2478
Cody Northrop12365112015-08-17 11:10:49 -06002479void VKAPI vkCmdBindDynamicRasterLineState(
Tobin Ehlis257d9742015-07-08 17:08:02 -06002480 VkCmdBuffer cmdBuffer,
Cody Northrop12365112015-08-17 11:10:49 -06002481 VkDynamicRasterLineState dynamicRasterLineState)
Tobin Ehlis257d9742015-07-08 17:08:02 -06002482{
Cody Northrop12365112015-08-17 11:10:49 -06002483 VkDynamicRasterLineStateCreateInfo* pCI;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002484 loader_platform_thread_lock_mutex(&globalLock);
2485 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
2486 if (!pCmdBuf) {
2487 // TODO : Want cmdBuffer to be srcObj here
2488 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_INVALID_CB, "MEM",
2489 "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
2490 }
Cody Northrop12365112015-08-17 11:10:49 -06002491 pCI = (VkDynamicRasterLineStateCreateInfo*)get_object_create_info(dynamicRasterLineState.handle, VK_OBJECT_TYPE_DYNAMIC_RASTER_LINE_STATE);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002492 if (!pCI) {
Cody Northrop12365112015-08-17 11:10:49 -06002493 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DYNAMIC_RASTER_LINE_STATE, dynamicRasterLineState.handle, 0, MEMTRACK_INVALID_OBJECT, "MEM",
2494 "Unable to find dynamic raster state object %#" PRIxLEAST64 ", was it ever created?", dynamicRasterLineState.handle);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002495 }
Cody Northrop12365112015-08-17 11:10:49 -06002496 pCmdBuf->pLastBoundDynamicState[VK_STATE_BIND_POINT_RASTER_LINE] = dynamicRasterLineState.handle;
Tobin Ehlis257d9742015-07-08 17:08:02 -06002497 loader_platform_thread_unlock_mutex(&globalLock);
Cody Northrop12365112015-08-17 11:10:49 -06002498 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindDynamicRasterLineState(cmdBuffer, dynamicRasterLineState);
2499}
2500
2501void VKAPI vkCmdBindDynamicRasterDepthBiasState(
2502 VkCmdBuffer cmdBuffer,
2503 VkDynamicRasterDepthBiasState dynamicRasterDepthBiasState)
2504{
2505 VkDynamicRasterDepthBiasStateCreateInfo* pCI;
2506 loader_platform_thread_lock_mutex(&globalLock);
2507 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
2508 if (!pCmdBuf) {
2509 // TODO : Want cmdBuffer to be srcObj here
2510 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_INVALID_CB, "MEM",
2511 "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
2512 }
2513 pCI = (VkDynamicRasterDepthBiasStateCreateInfo*)get_object_create_info(dynamicRasterDepthBiasState.handle, VK_OBJECT_TYPE_DYNAMIC_RASTER_DEPTH_BIAS_STATE);
2514 if (!pCI) {
2515 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DYNAMIC_RASTER_DEPTH_BIAS_STATE, dynamicRasterDepthBiasState.handle, 0, MEMTRACK_INVALID_OBJECT, "MEM",
2516 "Unable to find dynamic raster state object %#" PRIxLEAST64 ", was it ever created?", dynamicRasterDepthBiasState.handle);
2517 }
2518 pCmdBuf->pLastBoundDynamicState[VK_STATE_BIND_POINT_RASTER_DEPTH_BIAS] = dynamicRasterDepthBiasState.handle;
2519 loader_platform_thread_unlock_mutex(&globalLock);
2520 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindDynamicRasterDepthBiasState(cmdBuffer, dynamicRasterDepthBiasState);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002521}
2522
2523void VKAPI vkCmdBindDynamicColorBlendState(
2524 VkCmdBuffer cmdBuffer,
2525 VkDynamicColorBlendState dynamicColorBlendState)
2526{
2527 VkDynamicColorBlendStateCreateInfo* pCI;
2528 loader_platform_thread_lock_mutex(&globalLock);
2529 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
2530 if (!pCmdBuf) {
2531 // TODO : Want cmdBuffer to be srcObj here
2532 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_INVALID_CB, "MEM",
2533 "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
2534 }
2535 pCI = (VkDynamicColorBlendStateCreateInfo*)get_object_create_info(dynamicColorBlendState.handle, VK_OBJECT_TYPE_DYNAMIC_COLOR_BLEND_STATE);
2536 if (!pCI) {
2537 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DYNAMIC_COLOR_BLEND_STATE, dynamicColorBlendState.handle, 0, MEMTRACK_INVALID_OBJECT, "MEM",
2538 "Unable to find dynamic raster state object %#" PRIxLEAST64 ", was it ever created?", dynamicColorBlendState.handle);
2539 }
2540 pCmdBuf->pLastBoundDynamicState[VK_STATE_BIND_POINT_COLOR_BLEND] = dynamicColorBlendState.handle;
2541 loader_platform_thread_unlock_mutex(&globalLock);
2542 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindDynamicColorBlendState(cmdBuffer, dynamicColorBlendState);
2543}
2544
2545void VKAPI vkCmdBindDynamicDepthStencilState(
2546 VkCmdBuffer cmdBuffer,
2547 VkDynamicDepthStencilState dynamicDepthStencilState)
2548{
2549 VkDynamicDepthStencilStateCreateInfo* pCI;
2550 loader_platform_thread_lock_mutex(&globalLock);
2551 MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer);
2552 if (!pCmdBuf) {
2553 // TODO : Want cmdBuffer to be srcObj here
2554 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_INVALID_CB, "MEM",
2555 "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
2556 }
2557 pCI = (VkDynamicDepthStencilStateCreateInfo*)get_object_create_info(dynamicDepthStencilState.handle, VK_OBJECT_TYPE_DYNAMIC_DEPTH_STENCIL_STATE);
2558 if (!pCI) {
2559 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DYNAMIC_DEPTH_STENCIL_STATE, dynamicDepthStencilState.handle, 0, MEMTRACK_INVALID_OBJECT, "MEM",
2560 "Unable to find dynamic raster state object %#" PRIxLEAST64 ", was it ever created?", dynamicDepthStencilState.handle);
2561 }
2562 pCmdBuf->pLastBoundDynamicState[VK_STATE_BIND_POINT_DEPTH_STENCIL] = dynamicDepthStencilState.handle;
2563 loader_platform_thread_unlock_mutex(&globalLock);
2564 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindDynamicDepthStencilState(cmdBuffer, dynamicDepthStencilState);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002565}
2566
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002567VK_LAYER_EXPORT void VKAPI vkCmdBindDescriptorSets(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002568 VkCmdBuffer cmdBuffer,
2569 VkPipelineBindPoint pipelineBindPoint,
Mark Lobodzinskif2093b62015-06-15 13:21:21 -06002570 VkPipelineLayout layout,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002571 uint32_t firstSet,
2572 uint32_t setCount,
2573 const VkDescriptorSet *pDescriptorSets,
2574 uint32_t dynamicOffsetCount,
2575 const uint32_t *pDynamicOffsets)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002576{
Tobin Ehlisc145be82015-01-08 15:22:32 -07002577 // 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 -06002578 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindDescriptorSets(
Mark Lobodzinskif2093b62015-06-15 13:21:21 -06002579 cmdBuffer, pipelineBindPoint, layout, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002580}
2581
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06002582VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002583 VkCmdBuffer cmdBuffer,
2584 uint32_t startBinding,
2585 uint32_t bindingCount,
2586 const VkBuffer *pBuffers,
2587 const VkDeviceSize *pOffsets)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002588{
Tobin Ehlis257d9742015-07-08 17:08:02 -06002589 // TODO : Somewhere need to verify that VBs have correct usage state flagged
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002590 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets);
Chia-I Wu19156822015-01-05 13:42:56 +08002591}
2592
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002593VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(
2594 VkCmdBuffer cmdBuffer,
2595 VkBuffer buffer,
2596 VkDeviceSize offset,
2597 VkIndexType indexType)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002598{
Tobin Ehlis257d9742015-07-08 17:08:02 -06002599 // TODO : Somewhere need to verify that IBs have correct usage state flagged
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002600 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002601}
2602
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002603VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect(
2604 VkCmdBuffer cmdBuffer,
2605 VkBuffer buffer,
2606 VkDeviceSize offset,
2607 uint32_t count,
2608 uint32_t stride)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002609{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002610 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002611 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, buffer.handle, VK_OBJECT_TYPE_BUFFER);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002612 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002613 // TODO : Want cmdBuffer to be srcObj here
2614 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2615 "In vkCmdDrawIndirect() call unable to update binding of buffer %#" PRIxLEAST64 " to cmdBuffer %p", buffer.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002616 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002617 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002618 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002619}
2620
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002621VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect(
2622 VkCmdBuffer cmdBuffer,
2623 VkBuffer buffer,
2624 VkDeviceSize offset,
2625 uint32_t count,
2626 uint32_t stride)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002627{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002628 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002629 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, buffer.handle, VK_OBJECT_TYPE_BUFFER);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002630 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002631 // TODO : Want cmdBuffer to be srcObj here
2632 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2633 "In vkCmdDrawIndexedIndirect() call unable to update binding of buffer %#" PRIxLEAST64 " to cmdBuffer %p", buffer.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002634 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002635 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002636 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002637}
2638
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002639VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect(
2640 VkCmdBuffer cmdBuffer,
2641 VkBuffer buffer,
2642 VkDeviceSize offset)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002643{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002644 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002645 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, buffer.handle, VK_OBJECT_TYPE_BUFFER);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002646 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002647 // TODO : Want cmdBuffer to be srcObj here
2648 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2649 "In vkCmdDispatchIndirect() call unable to update binding of buffer %#" PRIxLEAST64 " to cmdBuffer %p", buffer.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002650 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002651 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002652 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002653}
2654
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002655VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer(
2656 VkCmdBuffer cmdBuffer,
2657 VkBuffer srcBuffer,
2658 VkBuffer destBuffer,
2659 uint32_t regionCount,
2660 const VkBufferCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002661{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002662 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002663 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, srcBuffer.handle, VK_OBJECT_TYPE_BUFFER);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002664 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002665 // TODO : Want cmdBuffer to be srcObj here
2666 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2667 "In vkCmdCopyBuffer() call unable to update binding of srcBuffer %#" PRIxLEAST64 " to cmdBuffer %p", srcBuffer.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002668 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06002669 mem = get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002670 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002671 // TODO : Want cmdBuffer to be srcObj here
2672 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2673 "In vkCmdCopyBuffer() call unable to update binding of destBuffer %#" PRIxLEAST64 " to cmdBuffer %p", destBuffer.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002674 }
Tobin Ehlis41376e12015-07-03 08:45:14 -06002675 // Validate that SRC & DST buffers have correct usage flags set
2676 validate_buffer_usage_flags(cmdBuffer, srcBuffer, VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdCopyBuffer()", "VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT");
2677 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 -06002678 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002679 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002680}
2681
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002682VK_LAYER_EXPORT void VKAPI vkCmdCopyImage(
2683 VkCmdBuffer cmdBuffer,
2684 VkImage srcImage,
2685 VkImageLayout srcImageLayout,
2686 VkImage destImage,
2687 VkImageLayout destImageLayout,
2688 uint32_t regionCount,
2689 const VkImageCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002690{
Tobin Ehlis41376e12015-07-03 08:45:14 -06002691 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41376e12015-07-03 08:45:14 -06002692 // Validate that src & dst images have correct usage flags set
Tobin Ehlis257d9742015-07-08 17:08:02 -06002693 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, srcImage.handle, VK_OBJECT_TYPE_IMAGE);
2694 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
2695 // TODO : Want cmdBuffer to be srcObj here
2696 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2697 "In vkCmdCopyImage() call unable to update binding of srcImage %#" PRIxLEAST64 " to cmdBuffer %p", srcImage.handle, cmdBuffer);
2698 }
2699 mem = get_mem_binding_from_object(cmdBuffer, destImage.handle, VK_OBJECT_TYPE_IMAGE);
2700 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
2701 // TODO : Want cmdBuffer to be srcObj here
2702 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2703 "In vkCmdCopyImage() call unable to update binding of destImage %#" PRIxLEAST64 " to cmdBuffer %p", destImage.handle, cmdBuffer);
2704 }
Tobin Ehlis41376e12015-07-03 08:45:14 -06002705 validate_image_usage_flags(cmdBuffer, srcImage, VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdCopyImage()", "VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT");
2706 validate_image_usage_flags(cmdBuffer, destImage, VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdCopyImage()", "VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT");
2707 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002708 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdCopyImage(
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05002709 cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002710}
2711
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002712VK_LAYER_EXPORT void VKAPI vkCmdBlitImage(
2713 VkCmdBuffer cmdBuffer,
2714 VkImage srcImage,
2715 VkImageLayout srcImageLayout,
2716 VkImage destImage,
2717 VkImageLayout destImageLayout,
2718 uint32_t regionCount,
Mark Lobodzinskiee5eef12015-05-22 14:43:25 -05002719 const VkImageBlit *pRegions,
2720 VkTexFilter filter)
Courtney Goeltzenleuchter89299fa2015-03-08 17:02:18 -06002721{
Tobin Ehlis41376e12015-07-03 08:45:14 -06002722 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis41376e12015-07-03 08:45:14 -06002723 // Validate that src & dst images have correct usage flags set
Tobin Ehlis257d9742015-07-08 17:08:02 -06002724 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, srcImage.handle, VK_OBJECT_TYPE_IMAGE);
2725 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
2726 // TODO : Want cmdBuffer to be srcObj here
2727 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2728 "In vkCmdBlitImage() call unable to update binding of srcImage %#" PRIxLEAST64 " to cmdBuffer %p", srcImage.handle, cmdBuffer);
2729 }
2730 mem = get_mem_binding_from_object(cmdBuffer, destImage.handle, VK_OBJECT_TYPE_IMAGE);
2731 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
2732 // TODO : Want cmdBuffer to be srcObj here
2733 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2734 "In vkCmdBlitImage() call unable to update binding of destImage %#" PRIxLEAST64 " to cmdBuffer %p", destImage.handle, cmdBuffer);
2735 }
Tobin Ehlis41376e12015-07-03 08:45:14 -06002736 validate_image_usage_flags(cmdBuffer, srcImage, VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT");
2737 validate_image_usage_flags(cmdBuffer, destImage, VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT, true, "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT");
2738 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002739 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBlitImage(
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05002740 cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter);
Courtney Goeltzenleuchter89299fa2015-03-08 17:02:18 -06002741}
2742
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002743VK_LAYER_EXPORT void VKAPI vkCmdCopyBufferToImage(
2744 VkCmdBuffer cmdBuffer,
2745 VkBuffer srcBuffer,
2746 VkImage destImage,
2747 VkImageLayout destImageLayout,
2748 uint32_t regionCount,
2749 const VkBufferImageCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002750{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002751 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002752 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, destImage.handle, VK_OBJECT_TYPE_IMAGE);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002753 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002754 // TODO : Want cmdBuffer to be srcObj here
2755 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2756 "In vkCmdCopyMemoryToImage() call unable to update binding of destImage %#" PRIxLEAST64 " to cmdBuffer %p", destImage.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002757 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06002758 mem = get_mem_binding_from_object(cmdBuffer, srcBuffer.handle, VK_OBJECT_TYPE_BUFFER);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002759 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002760 // TODO : Want cmdBuffer to be srcObj here
2761 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2762 "In vkCmdCopyMemoryToImage() call unable to update binding of srcBuffer %#" PRIxLEAST64 " to cmdBuffer %p", srcBuffer.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002763 }
Tobin Ehlis41376e12015-07-03 08:45:14 -06002764 // Validate that src buff & dst image have correct usage flags set
2765 validate_buffer_usage_flags(cmdBuffer, srcBuffer, VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdCopyBufferToImage()", "VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT");
2766 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 -06002767 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002768 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdCopyBufferToImage(
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05002769 cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002770}
2771
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002772VK_LAYER_EXPORT void VKAPI vkCmdCopyImageToBuffer(
2773 VkCmdBuffer cmdBuffer,
2774 VkImage srcImage,
2775 VkImageLayout srcImageLayout,
2776 VkBuffer destBuffer,
2777 uint32_t regionCount,
2778 const VkBufferImageCopy *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002779{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002780 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002781 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, srcImage.handle, VK_OBJECT_TYPE_IMAGE);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002782 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002783 // TODO : Want cmdBuffer to be srcObj here
2784 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2785 "In vkCmdCopyImageToMemory() call unable to update binding of srcImage buffer %#" PRIxLEAST64 " to cmdBuffer %p", srcImage.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002786 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06002787 mem = get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002788 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002789 // TODO : Want cmdBuffer to be srcObj here
2790 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2791 "In vkCmdCopyImageToMemory() call unable to update binding of destBuffer %#" PRIxLEAST64 " to cmdBuffer %p", destBuffer.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002792 }
Tobin Ehlis41376e12015-07-03 08:45:14 -06002793 // Validate that dst buff & src image have correct usage flags set
2794 validate_image_usage_flags(cmdBuffer, srcImage, VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT, true, "vkCmdCopyImageToBuffer()", "VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT");
2795 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 -06002796 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002797 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdCopyImageToBuffer(
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05002798 cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002799}
2800
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002801VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer(
2802 VkCmdBuffer cmdBuffer,
2803 VkBuffer destBuffer,
2804 VkDeviceSize destOffset,
2805 VkDeviceSize dataSize,
2806 const uint32_t *pData)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002807{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002808 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002809 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002810 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002811 // TODO : Want cmdBuffer to be srcObj here
2812 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2813 "In vkCmdUpdateMemory() call unable to update binding of destBuffer %#" PRIxLEAST64 " to cmdBuffer %p", destBuffer.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002814 }
Tobin Ehlis41376e12015-07-03 08:45:14 -06002815 // Validate that dst buff has correct usage flags set
2816 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 -06002817 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002818 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002819}
2820
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002821VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer(
2822 VkCmdBuffer cmdBuffer,
2823 VkBuffer destBuffer,
2824 VkDeviceSize destOffset,
2825 VkDeviceSize fillSize,
2826 uint32_t data)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002827{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002828 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002829 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, destBuffer.handle, VK_OBJECT_TYPE_BUFFER);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002830 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002831 // TODO : Want cmdBuffer to be srcObj here
2832 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2833 "In vkCmdFillMemory() call unable to update binding of destBuffer %#" PRIxLEAST64 " to cmdBuffer %p", destBuffer.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002834 }
Tobin Ehlis41376e12015-07-03 08:45:14 -06002835 // Validate that dst buff has correct usage flags set
2836 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 -06002837 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002838 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002839}
2840
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002841VK_LAYER_EXPORT void VKAPI vkCmdClearColorImage(
2842 VkCmdBuffer cmdBuffer,
2843 VkImage image,
2844 VkImageLayout imageLayout,
Chris Forbesf0796e12015-06-24 14:34:53 +12002845 const VkClearColorValue *pColor,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002846 uint32_t rangeCount,
2847 const VkImageSubresourceRange *pRanges)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002848{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002849 // TODO : Verify memory is in VK_IMAGE_STATE_CLEAR state
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002850 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002851 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, image.handle, VK_OBJECT_TYPE_IMAGE);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002852 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002853 // TODO : Want cmdBuffer to be srcObj here
2854 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2855 "In vkCmdClearColorImage() call unable to update binding of image buffer %#" PRIxLEAST64 " to cmdBuffer %p", image.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002856 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002857 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002858 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002859}
2860
Chris Forbesd9be82b2015-06-22 17:21:59 +12002861VK_LAYER_EXPORT void VKAPI vkCmdClearDepthStencilImage(
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002862 VkCmdBuffer cmdBuffer,
2863 VkImage image,
2864 VkImageLayout imageLayout,
2865 float depth,
2866 uint32_t stencil,
2867 uint32_t rangeCount,
2868 const VkImageSubresourceRange *pRanges)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002869{
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002870 // TODO : Verify memory is in VK_IMAGE_STATE_CLEAR state
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002871 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002872 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, image.handle, VK_OBJECT_TYPE_IMAGE);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002873 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002874 // TODO : Want cmdBuffer to be srcObj here
2875 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2876 "In vkCmdClearDepthStencil() call unable to update binding of image buffer %#" PRIxLEAST64 " to cmdBuffer %p", image.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002877 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002878 loader_platform_thread_unlock_mutex(&globalLock);
Chris Forbesd9be82b2015-06-22 17:21:59 +12002879 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdClearDepthStencilImage(
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05002880 cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002881}
2882
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002883VK_LAYER_EXPORT void VKAPI vkCmdResolveImage(
2884 VkCmdBuffer cmdBuffer,
2885 VkImage srcImage,
2886 VkImageLayout srcImageLayout,
2887 VkImage destImage,
2888 VkImageLayout destImageLayout,
2889 uint32_t regionCount,
2890 const VkImageResolve *pRegions)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002891{
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002892 loader_platform_thread_lock_mutex(&globalLock);
Tobin Ehlis257d9742015-07-08 17:08:02 -06002893 VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, srcImage.handle, VK_OBJECT_TYPE_IMAGE);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002894 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002895 // TODO : Want cmdBuffer to be srcObj here
2896 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2897 "In vkCmdResolveImage() call unable to update binding of srcImage buffer %#" PRIxLEAST64 " to cmdBuffer %p", srcImage.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002898 }
Tobin Ehlis257d9742015-07-08 17:08:02 -06002899 mem = get_mem_binding_from_object(cmdBuffer, destImage.handle, VK_OBJECT_TYPE_IMAGE);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002900 if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06002901 // TODO : Want cmdBuffer to be srcObj here
2902 log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2903 "In vkCmdResolveImage() call unable to update binding of destImage buffer %#" PRIxLEAST64 " to cmdBuffer %p", destImage.handle, cmdBuffer);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002904 }
Mark Lobodzinski93f494b2015-03-02 20:23:52 -06002905 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002906 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdResolveImage(
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05002907 cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002908}
2909
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002910VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery(
2911 VkCmdBuffer cmdBuffer,
2912 VkQueryPool queryPool,
2913 uint32_t slot,
2914 VkFlags flags)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002915{
Tobin Ehlis257d9742015-07-08 17:08:02 -06002916// loader_platform_thread_lock_mutex(&globalLock);
2917// VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, queryPool);
2918// if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
2919// log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2920// "In vkCmdBeginQuery() call unable to update binding of queryPool buffer %#" PRIxLEAST64 " to cmdBuffer %p", queryPool.handle, cmdBuffer);
2921// }
2922// loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002923 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002924}
2925
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002926VK_LAYER_EXPORT void VKAPI vkCmdEndQuery(
2927 VkCmdBuffer cmdBuffer,
2928 VkQueryPool queryPool,
2929 uint32_t slot)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002930{
Tobin Ehlis257d9742015-07-08 17:08:02 -06002931// loader_platform_thread_lock_mutex(&globalLock);
2932// VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, queryPool);
2933// if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
2934// // TODO : Want cmdBuffer to be srcObj here
2935// log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2936// "In vkCmdEndQuery() call unable to update binding of queryPool buffer %#" PRIxLEAST64 " to cmdBuffer %p", queryPool.handle, cmdBuffer);
2937// }
2938// loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002939 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdEndQuery(cmdBuffer, queryPool, slot);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002940}
2941
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002942VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool(
2943 VkCmdBuffer cmdBuffer,
2944 VkQueryPool queryPool,
2945 uint32_t startQuery,
2946 uint32_t queryCount)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002947{
Tobin Ehlis257d9742015-07-08 17:08:02 -06002948// loader_platform_thread_lock_mutex(&globalLock);
2949// VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, queryPool);
2950// if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) {
2951// // TODO : Want cmdBuffer to be srcObj here
2952// log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM",
2953// "In vkCmdResetQueryPool() call unable to update binding of queryPool buffer %#" PRIxLEAST64 " to cmdBuffer %p", queryPool.handle, cmdBuffer);
2954// }
2955// loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002956 get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002957}
2958
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06002959VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback(
2960 VkInstance instance,
2961 VkFlags msgFlags,
2962 const PFN_vkDbgMsgCallback pfnMsgCallback,
2963 void* pUserData,
2964 VkDbgMsgCallback* pMsgCallback)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002965{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002966 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, instance);
2967 VkResult res = pTable->DbgCreateMsgCallback(instance, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
2968 if (res == VK_SUCCESS) {
2969 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
2970
2971 res = layer_create_msg_callback(my_data->report_data, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
2972 }
2973 return res;
Tobin Ehlis6663f492014-11-10 12:29:12 -07002974}
2975
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -06002976VK_LAYER_EXPORT VkResult VKAPI vkDbgDestroyMsgCallback(
2977 VkInstance instance,
2978 VkDbgMsgCallback msgCallback)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002979{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002980 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, instance);
2981 VkResult res = pTable->DbgDestroyMsgCallback(instance, msgCallback);
2982
2983 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
2984 layer_destroy_msg_callback(my_data->report_data, msgCallback);
2985
2986 return res;
Tobin Ehlis6663f492014-11-10 12:29:12 -07002987}
2988
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06002989VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI(
2990 VkDevice device,
2991 const VkSwapChainCreateInfoWSI *pCreateInfo,
2992 VkSwapChainWSI *pSwapChain)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002993{
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06002994 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateSwapChainWSI(device, pCreateInfo, pSwapChain);
Chia-I Wuf8693382015-04-16 22:02:10 +08002995
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002996 if (VK_SUCCESS == result) {
Chia-I Wuf8693382015-04-16 22:02:10 +08002997 loader_platform_thread_lock_mutex(&globalLock);
Courtney Goeltzenleuchtercf48cad2015-07-13 18:41:17 -06002998 MT_SWAP_CHAIN_INFO *new_rec = new MT_SWAP_CHAIN_INFO;
2999 new_rec->createInfo = *pCreateInfo;
3000 swapChainMap[pSwapChain->handle]= new_rec;
Chia-I Wuf8693382015-04-16 22:02:10 +08003001 loader_platform_thread_unlock_mutex(&globalLock);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07003002 }
Chia-I Wuf8693382015-04-16 22:02:10 +08003003
Tobin Ehlis6663f492014-11-10 12:29:12 -07003004 return result;
3005}
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05003006
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06003007VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapChainWSI(
Ian Elliott1064fe32015-07-06 14:31:32 -06003008 VkDevice device,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06003009 VkSwapChainWSI swapChain)
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05003010{
3011 loader_platform_thread_lock_mutex(&globalLock);
Ian Elliott1064fe32015-07-06 14:31:32 -06003012 if (swapChainMap.find(swapChain.handle) != swapChainMap.end()) {
3013 MT_SWAP_CHAIN_INFO* pInfo = swapChainMap[swapChain.handle];
Chia-I Wuf8693382015-04-16 22:02:10 +08003014
David Pinedod8f83d82015-04-27 16:36:17 -06003015 if (pInfo->images.size() > 0) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06003016 for (auto it = pInfo->images.begin(); it != pInfo->images.end(); it++) {
Ian Elliott2b6b68a2015-08-07 14:11:14 -06003017 clear_object_binding(device, it->handle, VK_OBJECT_TYPE_SWAP_CHAIN_WSI);
3018 auto image_item = imageMap.find(it->handle);
Tobin Ehlis257d9742015-07-08 17:08:02 -06003019 if (image_item != imageMap.end())
3020 imageMap.erase(image_item);
David Pinedod8f83d82015-04-27 16:36:17 -06003021 }
Chia-I Wuf8693382015-04-16 22:02:10 +08003022 }
Chia-I Wuf8693382015-04-16 22:02:10 +08003023 delete pInfo;
Ian Elliott1064fe32015-07-06 14:31:32 -06003024 swapChainMap.erase(swapChain.handle);
Chia-I Wuf8693382015-04-16 22:02:10 +08003025 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05003026 loader_platform_thread_unlock_mutex(&globalLock);
Courtney Goeltzenleuchtercf48cad2015-07-13 18:41:17 -06003027 return get_dispatch_table(mem_tracker_device_table_map, device)->DestroySwapChainWSI(device, swapChain);
Chia-I Wuf8693382015-04-16 22:02:10 +08003028}
3029
Ian Elliott2b6b68a2015-08-07 14:11:14 -06003030VK_LAYER_EXPORT VkResult VKAPI vkGetSwapChainImagesWSI(
Ian Elliott1064fe32015-07-06 14:31:32 -06003031 VkDevice device,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06003032 VkSwapChainWSI swapChain,
Ian Elliott2b6b68a2015-08-07 14:11:14 -06003033 uint32_t* pCount,
3034 VkImage* pSwapChainImages)
Chia-I Wuf8693382015-04-16 22:02:10 +08003035{
Ian Elliott2b6b68a2015-08-07 14:11:14 -06003036 VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetSwapChainImagesWSI(device, swapChain, pCount, pSwapChainImages);
Chia-I Wuf8693382015-04-16 22:02:10 +08003037
Ian Elliott2b6b68a2015-08-07 14:11:14 -06003038 if (result == VK_SUCCESS && pSwapChainImages != NULL) {
3039 const size_t count = *pCount;
Ian Elliott1064fe32015-07-06 14:31:32 -06003040 MT_SWAP_CHAIN_INFO *pInfo = swapChainMap[swapChain.handle];
Chia-I Wuf8693382015-04-16 22:02:10 +08003041
3042 if (pInfo->images.empty()) {
3043 pInfo->images.resize(count);
Ian Elliott2b6b68a2015-08-07 14:11:14 -06003044 memcpy(&pInfo->images[0], pSwapChainImages, sizeof(pInfo->images[0]) * count);
Chia-I Wuf8693382015-04-16 22:02:10 +08003045
David Pinedod8f83d82015-04-27 16:36:17 -06003046 if (pInfo->images.size() > 0) {
Ian Elliott2b6b68a2015-08-07 14:11:14 -06003047 for (std::vector<VkImage>::const_iterator it = pInfo->images.begin();
David Pinedod8f83d82015-04-27 16:36:17 -06003048 it != pInfo->images.end(); it++) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06003049 // Add image object binding, then insert the new Mem Object and then bind it to created image
Ian Elliott2b6b68a2015-08-07 14:11:14 -06003050 add_object_create_info(it->handle, VK_OBJECT_TYPE_SWAP_CHAIN_WSI, &pInfo->createInfo);
Chia-I Wuf8693382015-04-16 22:02:10 +08003051 }
3052 }
3053 } else {
Ian Elliott2b6b68a2015-08-07 14:11:14 -06003054 const size_t count = *pCount;
Ian Elliott1064fe32015-07-06 14:31:32 -06003055 MT_SWAP_CHAIN_INFO *pInfo = swapChainMap[swapChain.handle];
Chia-I Wuf8693382015-04-16 22:02:10 +08003056 const bool mismatch = (pInfo->images.size() != count ||
Ian Elliott2b6b68a2015-08-07 14:11:14 -06003057 memcmp(&pInfo->images[0], pSwapChainImages, sizeof(pInfo->images[0]) * count));
Chia-I Wuf8693382015-04-16 22:02:10 +08003058
3059 if (mismatch) {
Tobin Ehlis257d9742015-07-08 17:08:02 -06003060 // TODO : Want swapChain to be srcObj here
Courtney Goeltzenleuchtercf48cad2015-07-13 18:41:17 -06003061 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_SWAP_CHAIN_WSI, 0, 0, MEMTRACK_NONE, "SWAP_CHAIN",
Courtney Goeltzenleuchterb9f0bf32015-06-14 09:50:18 -06003062 "vkGetSwapChainInfoWSI(%p, VK_SWAP_CHAIN_INFO_TYPE_PERSISTENT_IMAGES_WSI) returned mismatching data", swapChain);
Chia-I Wuf8693382015-04-16 22:02:10 +08003063 }
3064 }
3065 }
Mark Lobodzinskie61ebe72015-03-17 10:53:12 -05003066 return result;
3067}
Tobin Ehlis6663f492014-11-10 12:29:12 -07003068
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003069VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetDeviceProcAddr(
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06003070 VkDevice dev,
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06003071 const char *funcName)
Tobin Ehlis6663f492014-11-10 12:29:12 -07003072{
Jon Ashburn8d1b0b52015-05-18 13:20:15 -06003073 if (dev == NULL) {
Tobin Ehlis6663f492014-11-10 12:29:12 -07003074 return NULL;
Mark Lobodzinskib1567a02015-04-21 15:33:04 -06003075 }
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05003076
Jon Ashburn8fd08252015-05-28 16:25:02 -06003077 /* loader uses this to force layer initialization; device object is wrapped */
3078 if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06003079 initDeviceTable(mem_tracker_device_table_map, (const VkBaseLayerObject *) dev);
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003080 return (PFN_vkVoidFunction) vkGetDeviceProcAddr;
Jon Ashburn8fd08252015-05-28 16:25:02 -06003081 }
Courtney Goeltzenleuchterca173b82015-06-25 18:01:43 -06003082 if (!strcmp(funcName, "vkCreateDevice"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003083 return (PFN_vkVoidFunction) vkCreateDevice;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003084 if (!strcmp(funcName, "vkDestroyDevice"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003085 return (PFN_vkVoidFunction) vkDestroyDevice;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003086 if (!strcmp(funcName, "vkQueueSubmit"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003087 return (PFN_vkVoidFunction) vkQueueSubmit;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003088 if (!strcmp(funcName, "vkAllocMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003089 return (PFN_vkVoidFunction) vkAllocMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003090 if (!strcmp(funcName, "vkFreeMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003091 return (PFN_vkVoidFunction) vkFreeMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003092 if (!strcmp(funcName, "vkMapMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003093 return (PFN_vkVoidFunction) vkMapMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003094 if (!strcmp(funcName, "vkUnmapMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003095 return (PFN_vkVoidFunction) vkUnmapMemory;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003096 if (!strcmp(funcName, "vkDestroyFence"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003097 return (PFN_vkVoidFunction) vkDestroyFence;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003098 if (!strcmp(funcName, "vkDestroyBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003099 return (PFN_vkVoidFunction) vkDestroyBuffer;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003100 if (!strcmp(funcName, "vkDestroyImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003101 return (PFN_vkVoidFunction) vkDestroyImage;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003102 if (!strcmp(funcName, "vkDestroyAttachmentView"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003103 return (PFN_vkVoidFunction) vkDestroyAttachmentView;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003104 if (!strcmp(funcName, "vkDestroyImageView"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003105 return (PFN_vkVoidFunction) vkDestroyImageView;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003106 if (!strcmp(funcName, "vkDestroyPipeline"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003107 return (PFN_vkVoidFunction) vkDestroyPipeline;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003108 if (!strcmp(funcName, "vkDestroySampler"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003109 return (PFN_vkVoidFunction) vkDestroySampler;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003110 if (!strcmp(funcName, "vkDestroySemaphore"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003111 return (PFN_vkVoidFunction) vkDestroySemaphore;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003112 if (!strcmp(funcName, "vkDestroyEvent"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003113 return (PFN_vkVoidFunction) vkDestroyEvent;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003114 if (!strcmp(funcName, "vkDestroyQueryPool"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003115 return (PFN_vkVoidFunction) vkDestroyQueryPool;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003116 if (!strcmp(funcName, "vkDestroyBufferView"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003117 return (PFN_vkVoidFunction) vkDestroyBufferView;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003118 if (!strcmp(funcName, "vkDestroyShaderModule"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003119 return (PFN_vkVoidFunction) vkDestroyShaderModule;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003120 if (!strcmp(funcName, "vkDestroyShader"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003121 return (PFN_vkVoidFunction) vkDestroyShader;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003122 if (!strcmp(funcName, "vkDestroyPipelineLayout"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003123 return (PFN_vkVoidFunction) vkDestroyPipelineLayout;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003124 if (!strcmp(funcName, "vkDestroyDescriptorSetLayout"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003125 return (PFN_vkVoidFunction) vkDestroyDescriptorSetLayout;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003126 if (!strcmp(funcName, "vkDestroyDescriptorPool"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003127 return (PFN_vkVoidFunction) vkDestroyDescriptorPool;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003128 if (!strcmp(funcName, "vkDestroyRenderPass"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003129 return (PFN_vkVoidFunction) vkDestroyRenderPass;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003130 if (!strcmp(funcName, "vkDestroyFramebuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003131 return (PFN_vkVoidFunction) vkDestroyFramebuffer;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003132 if (!strcmp(funcName, "vkDestroyDynamicViewportState"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003133 return (PFN_vkVoidFunction) vkDestroyDynamicViewportState;
Cody Northrop12365112015-08-17 11:10:49 -06003134 if (!strcmp(funcName, "vkDestroyDynamicRasterLineState"))
3135 return (PFN_vkVoidFunction) vkDestroyDynamicRasterLineState;
3136 if (!strcmp(funcName, "vkDestroyDynamicRasterDepthBiasState"))
3137 return (PFN_vkVoidFunction) vkDestroyDynamicRasterDepthBiasState;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003138 if (!strcmp(funcName, "vkDestroyDynamicColorBlendState"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003139 return (PFN_vkVoidFunction) vkDestroyDynamicColorBlendState;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003140 if (!strcmp(funcName, "vkDestroyDynamicDepthStencilState"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003141 return (PFN_vkVoidFunction) vkDestroyDynamicDepthStencilState;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003142 if (!strcmp(funcName, "vkBindBufferMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003143 return (PFN_vkVoidFunction) vkBindBufferMemory;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003144 if (!strcmp(funcName, "vkBindImageMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003145 return (PFN_vkVoidFunction) vkBindImageMemory;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003146 if (!strcmp(funcName, "vkGetBufferMemoryRequirements"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003147 return (PFN_vkVoidFunction) vkGetBufferMemoryRequirements;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003148 if (!strcmp(funcName, "vkGetImageMemoryRequirements"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003149 return (PFN_vkVoidFunction) vkGetImageMemoryRequirements;
Mark Lobodzinski942b1722015-05-11 17:21:15 -05003150 if (!strcmp(funcName, "vkQueueBindSparseBufferMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003151 return (PFN_vkVoidFunction) vkQueueBindSparseBufferMemory;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003152 if (!strcmp(funcName, "vkQueueBindSparseImageOpaqueMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003153 return (PFN_vkVoidFunction) vkQueueBindSparseImageOpaqueMemory;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003154 if (!strcmp(funcName, "vkQueueBindSparseImageMemory"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003155 return (PFN_vkVoidFunction) vkQueueBindSparseImageMemory;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003156 if (!strcmp(funcName, "vkCreateFence"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003157 return (PFN_vkVoidFunction) vkCreateFence;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003158 if (!strcmp(funcName, "vkGetFenceStatus"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003159 return (PFN_vkVoidFunction) vkGetFenceStatus;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003160 if (!strcmp(funcName, "vkResetFences"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003161 return (PFN_vkVoidFunction) vkResetFences;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003162 if (!strcmp(funcName, "vkWaitForFences"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003163 return (PFN_vkVoidFunction) vkWaitForFences;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003164 if (!strcmp(funcName, "vkQueueWaitIdle"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003165 return (PFN_vkVoidFunction) vkQueueWaitIdle;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003166 if (!strcmp(funcName, "vkDeviceWaitIdle"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003167 return (PFN_vkVoidFunction) vkDeviceWaitIdle;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003168 if (!strcmp(funcName, "vkCreateEvent"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003169 return (PFN_vkVoidFunction) vkCreateEvent;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003170 if (!strcmp(funcName, "vkCreateQueryPool"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003171 return (PFN_vkVoidFunction) vkCreateQueryPool;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003172 if (!strcmp(funcName, "vkCreateBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003173 return (PFN_vkVoidFunction) vkCreateBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003174 if (!strcmp(funcName, "vkCreateBufferView"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003175 return (PFN_vkVoidFunction) vkCreateBufferView;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003176 if (!strcmp(funcName, "vkCreateImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003177 return (PFN_vkVoidFunction) vkCreateImage;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003178 if (!strcmp(funcName, "vkCreateImageView"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003179 return (PFN_vkVoidFunction) vkCreateImageView;
Chia-I Wu08accc62015-07-07 11:50:03 +08003180 if (!strcmp(funcName, "vkCreateAttachmentView"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003181 return (PFN_vkVoidFunction) vkCreateAttachmentView;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003182 if (!strcmp(funcName, "vkCreateShader"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003183 return (PFN_vkVoidFunction) vkCreateShader;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003184 if (!strcmp(funcName, "vkCreateGraphicsPipelines"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003185 return (PFN_vkVoidFunction) vkCreateGraphicsPipelines;
Jon Ashburnc669cc62015-07-09 15:02:25 -06003186 if (!strcmp(funcName, "vkCreateComputePipelines"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003187 return (PFN_vkVoidFunction) vkCreateComputePipelines;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003188 if (!strcmp(funcName, "vkCreateSampler"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003189 return (PFN_vkVoidFunction) vkCreateSampler;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003190 if (!strcmp(funcName, "vkCreateDynamicViewportState"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003191 return (PFN_vkVoidFunction) vkCreateDynamicViewportState;
Cody Northrop12365112015-08-17 11:10:49 -06003192 if (!strcmp(funcName, "vkCreateDynamicRasterLineState"))
3193 return (PFN_vkVoidFunction) vkCreateDynamicRasterLineState;
3194 if (!strcmp(funcName, "vkCreateDynamicRasterDepthBiasState"))
3195 return (PFN_vkVoidFunction) vkCreateDynamicRasterDepthBiasState;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003196 if (!strcmp(funcName, "vkCreateDynamicColorBlendState"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003197 return (PFN_vkVoidFunction) vkCreateDynamicColorBlendState;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003198 if (!strcmp(funcName, "vkCreateDynamicDepthStencilState"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003199 return (PFN_vkVoidFunction) vkCreateDynamicDepthStencilState;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003200 if (!strcmp(funcName, "vkCreateCommandBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003201 return (PFN_vkVoidFunction) vkCreateCommandBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003202 if (!strcmp(funcName, "vkBeginCommandBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003203 return (PFN_vkVoidFunction) vkBeginCommandBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003204 if (!strcmp(funcName, "vkEndCommandBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003205 return (PFN_vkVoidFunction) vkEndCommandBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003206 if (!strcmp(funcName, "vkResetCommandBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003207 return (PFN_vkVoidFunction) vkResetCommandBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003208 if (!strcmp(funcName, "vkCmdBindPipeline"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003209 return (PFN_vkVoidFunction) vkCmdBindPipeline;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003210 if (!strcmp(funcName, "vkCmdBindDynamicViewportState"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003211 return (PFN_vkVoidFunction) vkCmdBindDynamicViewportState;
Cody Northrop12365112015-08-17 11:10:49 -06003212 if (!strcmp(funcName, "vkCmdBindDynamicRasterLineState"))
3213 return (PFN_vkVoidFunction) vkCmdBindDynamicRasterLineState;
3214 if (!strcmp(funcName, "vkCmdBindDynamicRasterDepthBiasState"))
3215 return (PFN_vkVoidFunction) vkCmdBindDynamicRasterDepthBiasState;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003216 if (!strcmp(funcName, "vkCmdBindDynamicColorBlendState"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003217 return (PFN_vkVoidFunction) vkCmdBindDynamicColorBlendState;
Tobin Ehlis257d9742015-07-08 17:08:02 -06003218 if (!strcmp(funcName, "vkCmdBindDynamicDepthStencilState"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003219 return (PFN_vkVoidFunction) vkCmdBindDynamicDepthStencilState;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003220 if (!strcmp(funcName, "vkCmdBindDescriptorSets"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003221 return (PFN_vkVoidFunction) vkCmdBindDescriptorSets;
Courtney Goeltzenleuchterf68ad722015-04-16 13:38:46 -06003222 if (!strcmp(funcName, "vkCmdBindVertexBuffers"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003223 return (PFN_vkVoidFunction) vkCmdBindVertexBuffers;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003224 if (!strcmp(funcName, "vkCmdBindIndexBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003225 return (PFN_vkVoidFunction) vkCmdBindIndexBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003226 if (!strcmp(funcName, "vkCmdDrawIndirect"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003227 return (PFN_vkVoidFunction) vkCmdDrawIndirect;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003228 if (!strcmp(funcName, "vkCmdDrawIndexedIndirect"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003229 return (PFN_vkVoidFunction) vkCmdDrawIndexedIndirect;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003230 if (!strcmp(funcName, "vkCmdDispatchIndirect"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003231 return (PFN_vkVoidFunction) vkCmdDispatchIndirect;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003232 if (!strcmp(funcName, "vkCmdCopyBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003233 return (PFN_vkVoidFunction) vkCmdCopyBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003234 if (!strcmp(funcName, "vkCmdCopyImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003235 return (PFN_vkVoidFunction) vkCmdCopyImage;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003236 if (!strcmp(funcName, "vkCmdCopyBufferToImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003237 return (PFN_vkVoidFunction) vkCmdCopyBufferToImage;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003238 if (!strcmp(funcName, "vkCmdCopyImageToBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003239 return (PFN_vkVoidFunction) vkCmdCopyImageToBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003240 if (!strcmp(funcName, "vkCmdUpdateBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003241 return (PFN_vkVoidFunction) vkCmdUpdateBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003242 if (!strcmp(funcName, "vkCmdFillBuffer"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003243 return (PFN_vkVoidFunction) vkCmdFillBuffer;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003244 if (!strcmp(funcName, "vkCmdClearColorImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003245 return (PFN_vkVoidFunction) vkCmdClearColorImage;
Chris Forbesd9be82b2015-06-22 17:21:59 +12003246 if (!strcmp(funcName, "vkCmdClearDepthStencilImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003247 return (PFN_vkVoidFunction) vkCmdClearDepthStencilImage;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003248 if (!strcmp(funcName, "vkCmdResolveImage"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003249 return (PFN_vkVoidFunction) vkCmdResolveImage;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003250 if (!strcmp(funcName, "vkCmdBeginQuery"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003251 return (PFN_vkVoidFunction) vkCmdBeginQuery;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003252 if (!strcmp(funcName, "vkCmdEndQuery"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003253 return (PFN_vkVoidFunction) vkCmdEndQuery;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003254 if (!strcmp(funcName, "vkCmdResetQueryPool"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003255 return (PFN_vkVoidFunction) vkCmdResetQueryPool;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003256 if (!strcmp(funcName, "vkGetDeviceQueue"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003257 return (PFN_vkVoidFunction) vkGetDeviceQueue;
Jon Ashburn747f2b62015-06-18 15:02:58 -06003258
Courtney Goeltzenleuchterd54749c2015-07-05 11:17:01 -06003259 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(dev), layer_data_map);
Ian Elliott1064fe32015-07-06 14:31:32 -06003260 if (my_device_data->wsi_enabled)
Jon Ashburn747f2b62015-06-18 15:02:58 -06003261 {
3262 if (!strcmp(funcName, "vkCreateSwapChainWSI"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003263 return (PFN_vkVoidFunction) vkCreateSwapChainWSI;
Jon Ashburn747f2b62015-06-18 15:02:58 -06003264 if (!strcmp(funcName, "vkDestroySwapChainWSI"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003265 return (PFN_vkVoidFunction) vkDestroySwapChainWSI;
Ian Elliott2b6b68a2015-08-07 14:11:14 -06003266 if (!strcmp(funcName, "vkGetSwapChainImagesWSI"))
3267 return (PFN_vkVoidFunction) vkGetSwapChainImagesWSI;
Tobin Ehlis6bc1b8e2015-07-13 14:21:59 -06003268// if (!strcmp(funcName, "vkAcquireNextImageWSI"))
3269// return (PFN_vkVoidFunction) vkAcquireNextImageWSI;
3270// if (!strcmp(funcName, "vkQueuePresentWSI"))
3271// return (PFN_vkVoidFunction) vkQueuePresentWSI;
Jon Ashburn747f2b62015-06-18 15:02:58 -06003272 }
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06003273
Courtney Goeltzenleuchterd54749c2015-07-05 11:17:01 -06003274 VkLayerDispatchTable *pDisp = get_dispatch_table(mem_tracker_device_table_map, dev);
3275 if (pDisp->GetDeviceProcAddr == NULL)
3276 return NULL;
3277 return pDisp->GetDeviceProcAddr(dev, funcName);
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003278}
3279
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003280VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetInstanceProcAddr(
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003281 VkInstance instance,
3282 const char *funcName)
3283{
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003284 PFN_vkVoidFunction fptr;
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003285 if (instance == NULL) {
3286 return NULL;
3287 }
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -06003288
Jon Ashburn8fd08252015-05-28 16:25:02 -06003289 /* loader uses this to force layer initialization; instance object is wrapped */
3290 if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06003291 initInstanceTable(mem_tracker_instance_table_map, (const VkBaseLayerObject *) instance);
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003292 return (PFN_vkVoidFunction) vkGetInstanceProcAddr;
Jon Ashburn8fd08252015-05-28 16:25:02 -06003293 }
3294
Mark Lobodzinski76c991d2015-05-20 16:16:37 -05003295 if (!strcmp(funcName, "vkDestroyInstance"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003296 return (PFN_vkVoidFunction) vkDestroyInstance;
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06003297 if (!strcmp(funcName, "vkCreateInstance"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003298 return (PFN_vkVoidFunction) vkCreateInstance;
Mark Lobodzinskib3fbcd92015-07-02 16:49:40 -06003299 if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003300 return (PFN_vkVoidFunction) vkGetPhysicalDeviceMemoryProperties;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06003301 if (!strcmp(funcName, "vkGetGlobalLayerProperties"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003302 return (PFN_vkVoidFunction) vkGetGlobalLayerProperties;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06003303 if (!strcmp(funcName, "vkGetGlobalExtensionProperties"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003304 return (PFN_vkVoidFunction) vkGetGlobalExtensionProperties;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06003305 if (!strcmp(funcName, "vkGetPhysicalDeviceLayerProperties"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003306 return (PFN_vkVoidFunction) vkGetPhysicalDeviceLayerProperties;
Courtney Goeltzenleuchter110fdf92015-06-29 15:39:26 -06003307 if (!strcmp(funcName, "vkGetPhysicalDeviceExtensionProperties"))
Courtney Goeltzenleuchter2d3ba632015-07-12 14:35:22 -06003308 return (PFN_vkVoidFunction) vkGetPhysicalDeviceExtensionProperties;
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06003309
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06003310 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3311 fptr = debug_report_get_instance_proc_addr(my_data->report_data, funcName);
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -06003312 if (fptr)
3313 return fptr;
3314
Jon Ashburn8fd08252015-05-28 16:25:02 -06003315 {
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06003316 if (get_dispatch_table(mem_tracker_instance_table_map, instance)->GetInstanceProcAddr == NULL)
Jon Ashburnf6b33db2015-05-05 14:22:52 -06003317 return NULL;
Courtney Goeltzenleuchtere45acec2015-06-14 12:03:26 -06003318 return get_dispatch_table(mem_tracker_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
Tobin Ehlis6663f492014-11-10 12:29:12 -07003319 }
3320}