| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1 | /* | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 2 |  * Vulkan | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 3 |  * | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 4 |  * Copyright (C) 2015 LunarG, Inc. | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 5 |  * | 
 | 6 |  * Permission is hereby granted, free of charge, to any person obtaining a | 
 | 7 |  * copy of this software and associated documentation files (the "Software"), | 
 | 8 |  * to deal in the Software without restriction, including without limitation | 
 | 9 |  * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 
 | 10 |  * and/or sell copies of the Software, and to permit persons to whom the | 
 | 11 |  * Software is furnished to do so, subject to the following conditions: | 
 | 12 |  * | 
 | 13 |  * The above copyright notice and this permission notice shall be included | 
 | 14 |  * in all copies or substantial portions of the Software. | 
 | 15 |  * | 
 | 16 |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 18 |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL | 
 | 19 |  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
 | 20 |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | 
 | 21 |  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 
 | 22 |  * DEALINGS IN THE SOFTWARE. | 
 | 23 |  */ | 
 | 24 |  | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 25 | #include <inttypes.h> | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 26 | #include <stdio.h> | 
 | 27 | #include <stdlib.h> | 
 | 28 | #include <string.h> | 
 | 29 | #include <assert.h> | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 30 | #include <list> | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 31 | #include <map> | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 32 | #include <vector> | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 33 | using namespace std; | 
 | 34 |  | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 35 | #include "loader_platform.h" | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 36 | #include "vk_dispatch_table_helper.h" | 
 | 37 | #include "vk_struct_string_helper_cpp.h" | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 38 | #include "mem_tracker.h" | 
| Jon Ashburn | 7d7b3cf | 2014-12-22 13:24:15 -0700 | [diff] [blame] | 39 | #include "layers_config.h" | 
| Ian Elliott | 655cad7 | 2015-02-12 17:08:34 -0700 | [diff] [blame] | 40 | // The following is #included again to catch certain OS-specific functions | 
 | 41 | // being used: | 
 | 42 | #include "loader_platform.h" | 
| Jon Ashburn | 9eed289 | 2015-06-01 10:02:09 -0600 | [diff] [blame] | 43 | #include "layers_table.h" | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 44 | #include "layer_data.h" | 
 | 45 | #include "layer_logging.h" | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 46 |  static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce); | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 47 |  | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 48 | typedef struct _layer_data { | 
 | 49 |     debug_report_data *report_data; | 
 | 50 |     // TODO: put instance data here | 
| Courtney Goeltzenleuchter | 6f48432 | 2015-06-14 11:37:01 -0600 | [diff] [blame] | 51 |     VkDbgMsgCallback logging_callback; | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 52 | } layer_data; | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 53 |  | 
| Jon Ashburn | 747f2b6 | 2015-06-18 15:02:58 -0600 | [diff] [blame] | 54 | struct devExts { | 
 | 55 |     bool wsi_lunarg_enabled; | 
 | 56 | }; | 
 | 57 | static std::unordered_map<void *, struct devExts>     deviceExtMap; | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 58 | static std::unordered_map<void *, layer_data *> layer_data_map; | 
 | 59 | static device_table_map mem_tracker_device_table_map; | 
 | 60 | static instance_table_map mem_tracker_instance_table_map; | 
| Jon Ashburn | 8c5cbcf | 2015-05-07 10:27:37 -0600 | [diff] [blame] | 61 |  | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 62 | // TODO : This can be much smarter, using separate locks for separate global data | 
 | 63 | static int globalLockInitialized = 0; | 
 | 64 | static loader_platform_thread_mutex globalLock; | 
| Jon Ashburn | 7d7b3cf | 2014-12-22 13:24:15 -0700 | [diff] [blame] | 65 |  | 
| Tobin Ehlis | c145be8 | 2015-01-08 15:22:32 -0700 | [diff] [blame] | 66 | #define MAX_BINDING 0xFFFFFFFF | 
| Tobin Ehlis | c145be8 | 2015-01-08 15:22:32 -0700 | [diff] [blame] | 67 |  | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 68 | unordered_map<VkCmdBuffer,    MT_CB_INFO>           cbMap; | 
 | 69 | unordered_map<VkDeviceMemory, MT_MEM_OBJ_INFO>      memObjMap; | 
 | 70 | unordered_map<VkObject,       MT_OBJ_INFO>          objectMap; | 
 | 71 | unordered_map<VkFence,        MT_FENCE_INFO>        fenceMap;    // Map fence to fence info | 
 | 72 | unordered_map<VkQueue,        MT_QUEUE_INFO>        queueMap; | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 73 | unordered_map<VkSwapChainWSI, MT_SWAP_CHAIN_INFO*>  swapChainMap; | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 74 |  | 
| Mark Lobodzinski | 5093297 | 2015-04-02 20:49:09 -0500 | [diff] [blame] | 75 | // TODO : Add per-device fence completion | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 76 | static uint64_t   g_currentFenceId  = 1; | 
| Mark Lobodzinski | c52b775 | 2015-02-18 16:38:17 -0600 | [diff] [blame] | 77 |  | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 78 | template layer_data *get_my_data_ptr<layer_data>( | 
 | 79 |         void *data_key, | 
 | 80 |         std::unordered_map<void *, layer_data *> &data_map); | 
 | 81 |  | 
 | 82 | debug_report_data *mdd(VkObject object) | 
 | 83 | { | 
| Courtney Goeltzenleuchter | 6211086 | 2015-06-13 21:39:35 -0600 | [diff] [blame] | 84 |     dispatch_key key = get_dispatch_key(object); | 
 | 85 |     layer_data *my_data = get_my_data_ptr(key, layer_data_map); | 
| Courtney Goeltzenleuchter | 89d6844 | 2015-06-13 21:40:22 -0600 | [diff] [blame] | 86 | #if DISPATCH_MAP_DEBUG | 
 | 87 |     fprintf(stderr, "MDD: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, my_data); | 
 | 88 | #endif | 
| Courtney Goeltzenleuchter | 1010044 | 2015-06-13 21:36:49 -0600 | [diff] [blame] | 89 |     assert(my_data->report_data != NULL); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 90 |     return my_data->report_data; | 
 | 91 | } | 
 | 92 |  | 
 | 93 | debug_report_data *mid(VkInstance object) | 
 | 94 | { | 
| Courtney Goeltzenleuchter | 6211086 | 2015-06-13 21:39:35 -0600 | [diff] [blame] | 95 |     dispatch_key key = get_dispatch_key(object); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 96 |     layer_data *my_data = get_my_data_ptr(get_dispatch_key(object), layer_data_map); | 
| Courtney Goeltzenleuchter | 89d6844 | 2015-06-13 21:40:22 -0600 | [diff] [blame] | 97 | #if DISPATCH_MAP_DEBUG | 
 | 98 |     fprintf(stderr, "MID: map: %p, object: %p, key: %p, data: %p\n", &layer_data_map, object, key, my_data); | 
 | 99 | #endif | 
| Courtney Goeltzenleuchter | 1010044 | 2015-06-13 21:36:49 -0600 | [diff] [blame] | 100 |     assert(my_data->report_data != NULL); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 101 |     return my_data->report_data; | 
 | 102 | } | 
 | 103 |  | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 104 | // Add new queue for this device to map container | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 105 | static void add_queue_info(const VkQueue queue) | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 106 | { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 107 |     MT_QUEUE_INFO* pInfo   = &queueMap[queue]; | 
| Mark Lobodzinski | 5093297 | 2015-04-02 20:49:09 -0500 | [diff] [blame] | 108 |     pInfo->lastRetiredId   = 0; | 
 | 109 |     pInfo->lastSubmittedId = 0; | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 110 | } | 
 | 111 |  | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 112 | static void delete_queue_info_list( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 113 |     void) | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 114 | { | 
 | 115 |     // Process queue list, cleaning up each entry before deleting | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 116 |     queueMap.clear(); | 
 | 117 | } | 
 | 118 |  | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 119 | static void add_swap_chain_info( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 120 |     const VkSwapChainWSI swapChain) | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 121 | { | 
 | 122 |     MT_SWAP_CHAIN_INFO* pInfo = new MT_SWAP_CHAIN_INFO; | 
 | 123 |     swapChainMap[swapChain] = pInfo; | 
 | 124 | } | 
 | 125 |  | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 126 | // Add new CBInfo for this cb to map container | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 127 | static void add_cmd_buf_info( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 128 |     const VkCmdBuffer cb) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 129 | { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 130 |     cbMap[cb].cmdBuffer = cb; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 131 | } | 
 | 132 |  | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 133 | // Return ptr to Info in CB map, or NULL if not found | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 134 | static MT_CB_INFO* get_cmd_buf_info( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 135 |     const VkCmdBuffer cb) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 136 | { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 137 |     unordered_map<VkCmdBuffer, MT_CB_INFO>::iterator item = cbMap.find(cb); | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 138 |     if (item != cbMap.end()) { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 139 |         return &(*item).second; | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 140 |     } else { | 
 | 141 |         return NULL; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 142 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 143 | } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 144 |  | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 145 | // Return object info for 'object' or return NULL if no info exists | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 146 | static MT_OBJ_INFO* get_object_info( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 147 |     const VkObject object) | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 148 | { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 149 |     unordered_map<VkObject, MT_OBJ_INFO>::iterator item = objectMap.find(object); | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 150 |     if (item != objectMap.end()) { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 151 |         return &(*item).second; | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 152 |     } else { | 
 | 153 |         return NULL; | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 154 |     } | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 155 | } | 
 | 156 |  | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 157 | static MT_OBJ_INFO* add_object_info( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 158 |     VkObject         object, | 
 | 159 |     VkStructureType  sType, | 
 | 160 |     const void      *pCreateInfo, | 
 | 161 |     const int        struct_size, | 
 | 162 |     const char      *name_prefix) | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 163 | { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 164 |     MT_OBJ_INFO* pInfo = &objectMap[object]; | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 165 |     memset(pInfo, 0, sizeof(MT_OBJ_INFO)); | 
 | 166 |     memcpy(&pInfo->create_info, pCreateInfo, struct_size); | 
 | 167 |     sprintf(pInfo->object_name, "%s_%p", name_prefix, object); | 
 | 168 |  | 
 | 169 |     pInfo->object     = object; | 
 | 170 |     pInfo->ref_count  = 1; | 
 | 171 |     pInfo->sType      = sType; | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 172 |  | 
 | 173 |     return pInfo; | 
 | 174 | } | 
 | 175 |  | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 176 | // Add a fence, creating one if necessary to our list of fences/fenceIds | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 177 | static uint64_t add_fence_info( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 178 |     VkFence fence, | 
 | 179 |     VkQueue queue) | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 180 | { | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 181 |     // Create fence object | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 182 |     uint64_t       fenceId    = g_currentFenceId++; | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 183 |     // If no fence, create an internal fence to track the submissions | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 184 |     if (fence != NULL) { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 185 |         fenceMap[fence].fenceId = fenceId; | 
 | 186 |         fenceMap[fence].queue = queue; | 
| Mark Lobodzinski | abc1bc4 | 2015-04-09 13:46:09 -0500 | [diff] [blame] | 187 |         // Validate that fence is in UNSIGNALED state | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 188 |         MT_OBJ_INFO* pObjectInfo = get_object_info(fence); | 
| Mark Lobodzinski | abc1bc4 | 2015-04-09 13:46:09 -0500 | [diff] [blame] | 189 |         if (pObjectInfo != NULL) { | 
| Tobin Ehlis | b870cbb | 2015-04-15 07:46:12 -0600 | [diff] [blame] | 190 |             if (pObjectInfo->create_info.fence_create_info.flags & VK_FENCE_CREATE_SIGNALED_BIT) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 191 |                 log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_FENCE, fence, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", | 
 | 192 |                         "Fence %p submitted in SIGNALED state.  Fences must be reset before being submitted", fence); | 
| Mark Lobodzinski | abc1bc4 | 2015-04-09 13:46:09 -0500 | [diff] [blame] | 193 |             } | 
 | 194 |         } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 195 |     } | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 196 |     // Update most recently submitted fence and fenceId for Queue | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 197 |     queueMap[queue].lastSubmittedId = fenceId; | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 198 |     return fenceId; | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 199 | } | 
 | 200 |  | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 201 | // Remove a fenceInfo from our list of fences/fenceIds | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 202 | static void delete_fence_info( | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 203 |     VkFence fence) | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 204 | { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 205 |     fenceMap.erase(fence); | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 206 | } | 
 | 207 |  | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 208 | // Record information when a fence is known to be signalled | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 209 | static void update_fence_tracking( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 210 |     VkFence fence) | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 211 | { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 212 |     unordered_map<VkFence, MT_FENCE_INFO>::iterator fence_item = fenceMap.find(fence); | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 213 |     if (fence_item != fenceMap.end()) { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 214 |         MT_FENCE_INFO *pCurFenceInfo = &(*fence_item).second; | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 215 |         VkQueue queue = pCurFenceInfo->queue; | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 216 |         unordered_map<VkQueue, MT_QUEUE_INFO>::iterator queue_item = queueMap.find(queue); | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 217 |         if (queue_item != queueMap.end()) { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 218 |             MT_QUEUE_INFO *pQueueInfo = &(*queue_item).second; | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 219 |             if (pQueueInfo->lastRetiredId < pCurFenceInfo->fenceId) { | 
 | 220 |                 pQueueInfo->lastRetiredId = pCurFenceInfo->fenceId; | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 221 |             } | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 222 |         } | 
 | 223 |     } | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 224 |  | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 225 |     // Update fence state in fenceCreateInfo structure | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 226 |     MT_OBJ_INFO* pObjectInfo = get_object_info(fence); | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 227 |     if (pObjectInfo != NULL) { | 
 | 228 |         pObjectInfo->create_info.fence_create_info.flags = | 
 | 229 |             static_cast<VkFenceCreateFlags>( | 
 | 230 |                 pObjectInfo->create_info.fence_create_info.flags | VK_FENCE_CREATE_SIGNALED_BIT); | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 231 |     } | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 232 | } | 
 | 233 |  | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 234 | // Helper routine that updates the fence list for a specific queue to all-retired | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 235 | static void retire_queue_fences( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 236 |     VkQueue queue) | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 237 | { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 238 |     MT_QUEUE_INFO *pQueueInfo = &queueMap[queue]; | 
 | 239 |     // Set queue's lastRetired to lastSubmitted indicating all fences completed | 
| Courtney Goeltzenleuchter | 2f3f8a2 | 2015-04-14 00:01:21 -0600 | [diff] [blame] | 240 |     pQueueInfo->lastRetiredId = pQueueInfo->lastSubmittedId; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 241 | } | 
 | 242 |  | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 243 | // Helper routine that updates all queues to all-retired | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 244 | static void retire_device_fences( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 245 |     VkDevice device) | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 246 | { | 
 | 247 |     // Process each queue for device | 
| Courtney Goeltzenleuchter | 2f3f8a2 | 2015-04-14 00:01:21 -0600 | [diff] [blame] | 248 |     // TODO: Add multiple device support | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 249 |     for (unordered_map<VkQueue, MT_QUEUE_INFO>::iterator ii=queueMap.begin(); ii!=queueMap.end(); ++ii) { | 
 | 250 |         // Set queue's lastRetired to lastSubmitted indicating all fences completed | 
 | 251 |         MT_QUEUE_INFO *pQueueInfo = &(*ii).second; | 
 | 252 |         pQueueInfo->lastRetiredId = pQueueInfo->lastSubmittedId; | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 253 |     } | 
 | 254 | } | 
 | 255 |  | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 256 | // Return ptr to info in map container containing mem, or NULL if not found | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 257 | //  Calls to this function should be wrapped in mutex | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 258 | static MT_MEM_OBJ_INFO* get_mem_obj_info( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 259 |     const VkDeviceMemory mem) | 
| Tobin Ehlis | c145be8 | 2015-01-08 15:22:32 -0700 | [diff] [blame] | 260 | { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 261 |     unordered_map<VkDeviceMemory, MT_MEM_OBJ_INFO>::iterator item = memObjMap.find(mem); | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 262 |     if (item != memObjMap.end()) { | 
| Courtney Goeltzenleuchter | 1010044 | 2015-06-13 21:36:49 -0600 | [diff] [blame] | 263 |         assert((*item).second.object != VK_NULL_HANDLE); | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 264 |         return &(*item).second; | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 265 |     } else { | 
 | 266 |         return NULL; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 267 |     } | 
| Tobin Ehlis | c145be8 | 2015-01-08 15:22:32 -0700 | [diff] [blame] | 268 | } | 
 | 269 |  | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 270 | static void add_mem_obj_info( | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 271 |     const VkObject           object, | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 272 |     const VkDeviceMemory     mem, | 
 | 273 |     const VkMemoryAllocInfo *pAllocInfo) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 274 | { | 
| Courtney Goeltzenleuchter | 17fd5ce | 2015-06-13 21:29:26 -0600 | [diff] [blame] | 275 |     assert(object != NULL); | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 276 |  | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 277 |     if (pAllocInfo) {  // MEM alloc created by vkCreateSwapChainWSI() doesn't have alloc info struct | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 278 |         memcpy(&memObjMap[mem].allocInfo, pAllocInfo, sizeof(VkMemoryAllocInfo)); | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 279 |         // TODO:  Update for real hardware, actually process allocation info structures | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 280 |         memObjMap[mem].allocInfo.pNext = NULL; | 
 | 281 |     } else { | 
 | 282 |         memset(&memObjMap[mem].allocInfo, 0, sizeof(VkMemoryAllocInfo)); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 283 |     } | 
| Courtney Goeltzenleuchter | 17fd5ce | 2015-06-13 21:29:26 -0600 | [diff] [blame] | 284 |     memObjMap[mem].object = object; | 
 | 285 |     memObjMap[mem].refCount = 0; | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 286 |     memObjMap[mem].mem = mem; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 287 | } | 
 | 288 |  | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 289 | // Find CB Info and add mem reference to list container | 
 | 290 | // Find Mem Obj Info and add CB reference to list container | 
 | 291 | static bool32_t update_cmd_buf_and_mem_references( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 292 |     const VkCmdBuffer    cb, | 
 | 293 |     const VkDeviceMemory mem) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 294 | { | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 295 |     bool32_t result = VK_TRUE; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 296 |     // First update CB binding in MemObj mini CB list | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 297 |     MT_MEM_OBJ_INFO* pMemInfo = get_mem_obj_info(mem); | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 298 |     if (!pMemInfo) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 299 |         log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", | 
 | 300 |                 "Trying to bind mem obj %p to CB %p but no info for that mem obj.\n    " | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 301 |                      "Was it correctly allocated? Did it already get freed?", mem, cb); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 302 |         result = VK_FALSE; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 303 |     } else { | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 304 |         // Search for cmd buffer object in memory object's binding list | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 305 |         bool32_t found  = VK_FALSE; | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 306 |         if (pMemInfo->pCmdBufferBindings.size() > 0) { | 
 | 307 |             for (list<VkCmdBuffer>::iterator it = pMemInfo->pCmdBufferBindings.begin(); it != pMemInfo->pCmdBufferBindings.end(); ++it) { | 
 | 308 |                 if ((*it) == cb) { | 
 | 309 |                     found = VK_TRUE; | 
 | 310 |                     break; | 
 | 311 |                 } | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 312 |             } | 
 | 313 |         } | 
 | 314 |         // If not present, add to list | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 315 |         if (found == VK_FALSE) { | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 316 |             pMemInfo->pCmdBufferBindings.push_front(cb); | 
 | 317 |             pMemInfo->refCount++; | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 318 |         } | 
 | 319 |  | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 320 |         // Now update CBInfo's Mem reference list | 
 | 321 |         MT_CB_INFO* pCBInfo = get_cmd_buf_info(cb); | 
 | 322 |         // TODO: keep track of all destroyed CBs so we know if this is a stale or simply invalid object | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 323 |         if (!pCBInfo) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 324 |             log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", | 
 | 325 |                     "Trying to bind mem obj %p to CB %p but no info for that CB. Was CB incorrectly destroyed?", mem, cb); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 326 |             result = VK_FALSE; | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 327 |         } else { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 328 |             // Search for memory object in cmd buffer's reference list | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 329 |             bool32_t found  = VK_FALSE; | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 330 |             if (pCBInfo->pMemObjList.size() > 0) { | 
 | 331 |                 for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) { | 
 | 332 |                     if ((*it) == mem) { | 
 | 333 |                         found = VK_TRUE; | 
 | 334 |                         break; | 
 | 335 |                     } | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 336 |                 } | 
 | 337 |             } | 
 | 338 |             // If not present, add to list | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 339 |             if (found == VK_FALSE) { | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 340 |                 pCBInfo->pMemObjList.push_front(mem); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 341 |             } | 
 | 342 |         } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 343 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 344 |     return result; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 345 | } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 346 |  | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 347 | // Clear the CB Binding for mem | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 348 | // Calls to this function should be wrapped in mutex | 
 | 349 | static void remove_cmd_buf_and_mem_reference( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 350 |     const VkCmdBuffer    cb, | 
 | 351 |     const VkDeviceMemory mem) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 352 | { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 353 |     MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem); | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 354 |     // TODO : Having this check is not ideal, really if memInfo was deleted, | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 355 |     //   its CB bindings should be cleared and then clear_cmd_buf_and_mem_references wouldn't call | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 356 |     //   us here with stale mem objs | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 357 |     if (pInfo) { | 
 | 358 |         pInfo->pCmdBufferBindings.remove(cb); | 
 | 359 |         pInfo->refCount--; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 360 |     } | 
 | 361 | } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 362 |  | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 363 | // Free bindings related to CB | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 364 | static bool32_t clear_cmd_buf_and_mem_references( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 365 |     const VkCmdBuffer cb) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 366 | { | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 367 |     bool32_t result = VK_TRUE; | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 368 |     MT_CB_INFO* pCBInfo = get_cmd_buf_info(cb); | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 369 |     if (!pCBInfo) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 370 |         log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cb, 0, MEMTRACK_INVALID_CB, "MEM", | 
 | 371 |                 "Unable to find global CB info %p for deletion", cb); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 372 |         result = VK_FALSE; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 373 |     } else { | 
| Courtney Goeltzenleuchter | e4171f0 | 2015-04-29 10:51:48 -0600 | [diff] [blame] | 374 |         if (pCBInfo->pMemObjList.size() > 0) { | 
 | 375 |             list<VkDeviceMemory> mem_obj_list = pCBInfo->pMemObjList; | 
 | 376 |             for (list<VkDeviceMemory>::iterator it=mem_obj_list.begin(); it!=mem_obj_list.end(); ++it) { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 377 |                 remove_cmd_buf_and_mem_reference(cb, (*it)); | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 378 |             } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 379 |         } | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 380 |         pCBInfo->pMemObjList.clear(); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 381 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 382 |     return result; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 383 | } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 384 |  | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 385 | // Delete CBInfo from list along with all of it's mini MemObjInfo | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 386 | //   and also clear mem references to CB | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 387 | static bool32_t delete_cmd_buf_info( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 388 |     const VkCmdBuffer cb) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 389 | { | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 390 |     bool32_t result = VK_TRUE; | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 391 |     result = clear_cmd_buf_and_mem_references(cb); | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 392 |     // Delete the CBInfo info | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 393 |     if (result == VK_TRUE) { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 394 |         cbMap.erase(cb); | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 395 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 396 |     return result; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 397 | } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 398 |  | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 399 | // Delete the entire CB list | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 400 | static bool32_t delete_cmd_buf_info_list( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 401 |     void) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 402 | { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 403 |     for (unordered_map<VkCmdBuffer, MT_CB_INFO>::iterator ii=cbMap.begin(); ii!=cbMap.end(); ++ii) { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 404 |         clear_cmd_buf_and_mem_references((*ii).first); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 405 |     } | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 406 |     cbMap.clear(); | 
 | 407 |     return VK_TRUE; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 408 | } | 
 | 409 |  | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 410 | // For given MemObjInfo, report Obj & CB bindings | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 411 | static void reportMemReferencesAndCleanUp( | 
 | 412 |     MT_MEM_OBJ_INFO* pMemObjInfo) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 413 | { | 
| Tony Barbour | 18f7155 | 2015-04-22 11:36:22 -0600 | [diff] [blame] | 414 |     size_t cmdBufRefCount = pMemObjInfo->pCmdBufferBindings.size(); | 
 | 415 |     size_t objRefCount    = pMemObjInfo->pObjBindings.size(); | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 416 |  | 
| Mark Lobodzinski | 40f7f40 | 2015-04-16 11:44:05 -0500 | [diff] [blame] | 417 |     if ((pMemObjInfo->pCmdBufferBindings.size() + pMemObjInfo->pObjBindings.size()) != 0) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 418 |         log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, pMemObjInfo->mem, 0, MEMTRACK_INTERNAL_ERROR, "MEM", | 
 | 419 |                 "Attempting to free memory object %p which still contains %lu references", | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 420 |             pMemObjInfo->mem, (cmdBufRefCount + objRefCount)); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 421 |     } | 
| Mark Lobodzinski | 40f7f40 | 2015-04-16 11:44:05 -0500 | [diff] [blame] | 422 |  | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 423 |     if (cmdBufRefCount > 0 && pMemObjInfo->pCmdBufferBindings.size() > 0) { | 
| Mark Lobodzinski | 40f7f40 | 2015-04-16 11:44:05 -0500 | [diff] [blame] | 424 |         for (list<VkCmdBuffer>::const_iterator it = pMemObjInfo->pCmdBufferBindings.begin(); it != pMemObjInfo->pCmdBufferBindings.end(); ++it) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 425 |             log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, (*it), 0, MEMTRACK_NONE, "MEM", | 
 | 426 |                     "Command Buffer %p still has a reference to mem obj %p", (*it), pMemObjInfo->mem); | 
| Mark Lobodzinski | 40f7f40 | 2015-04-16 11:44:05 -0500 | [diff] [blame] | 427 |         } | 
 | 428 |         // Clear the list of hanging references | 
 | 429 |         pMemObjInfo->pCmdBufferBindings.clear(); | 
 | 430 |     } | 
 | 431 |  | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 432 |     if (objRefCount > 0 && pMemObjInfo->pObjBindings.size() > 0) { | 
| Mark Lobodzinski | 40f7f40 | 2015-04-16 11:44:05 -0500 | [diff] [blame] | 433 |         for (list<VkObject>::const_iterator it = pMemObjInfo->pObjBindings.begin(); it != pMemObjInfo->pObjBindings.end(); ++it) { | 
| Courtney Goeltzenleuchter | f579fa6 | 2015-06-10 17:39:03 -0600 | [diff] [blame] | 434 |             /* TODO: Would be nice to return the actual object type */ | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 435 |             log_msg(mdd(pMemObjInfo->object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, (*it), 0, MEMTRACK_NONE, "MEM", | 
 | 436 |                     "VK Object %p still has a reference to mem obj %p", (*it), pMemObjInfo->mem); | 
| Mark Lobodzinski | 6568f91 | 2015-06-11 16:11:20 -0500 | [diff] [blame] | 437 |  | 
 | 438 |             // Found an object referencing this memory, remove its pointer to this memobj | 
 | 439 |             MT_OBJ_INFO *pObjInfo = get_object_info(*it); | 
 | 440 |             pObjInfo->pMemObjInfo = NULL; | 
| Mark Lobodzinski | 40f7f40 | 2015-04-16 11:44:05 -0500 | [diff] [blame] | 441 |         } | 
 | 442 |         // Clear the list of hanging references | 
 | 443 |         pMemObjInfo->pObjBindings.clear(); | 
 | 444 |     } | 
| Mark Lobodzinski | 3780e14 | 2015-05-14 15:08:13 -0500 | [diff] [blame] | 445 |  | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 446 | } | 
 | 447 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 448 | static void deleteMemObjInfo( | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 449 |     VkObject       object, | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 450 |     VkDeviceMemory mem) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 451 | { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 452 |     unordered_map<VkDeviceMemory, MT_MEM_OBJ_INFO>::iterator item = memObjMap.find(mem); | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 453 |     if (item != memObjMap.end()) { | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 454 |         memObjMap.erase(item); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 455 |     } | 
| Mark Lobodzinski | 40f7f40 | 2015-04-16 11:44:05 -0500 | [diff] [blame] | 456 |     else { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 457 |         log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", | 
 | 458 |                 "Request to delete memory object %p not present in memory Object Map", mem); | 
| Mark Lobodzinski | 40f7f40 | 2015-04-16 11:44:05 -0500 | [diff] [blame] | 459 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 460 | } | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 461 |  | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 462 | // Check if fence for given CB is completed | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 463 | static bool32_t checkCBCompleted( | 
 | 464 |     const VkCmdBuffer cb) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 465 | { | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 466 |     bool32_t result = VK_TRUE; | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 467 |     MT_CB_INFO* pCBInfo = get_cmd_buf_info(cb); | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 468 |     if (!pCBInfo) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 469 |         log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cb, 0, MEMTRACK_INVALID_CB, "MEM", | 
 | 470 |                 "Unable to find global CB info %p to check for completion", cb); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 471 |         result = VK_FALSE; | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 472 |     } else if (pCBInfo->lastSubmittedQueue != NULL) { | 
 | 473 |         VkQueue queue = pCBInfo->lastSubmittedQueue; | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 474 |         MT_QUEUE_INFO *pQueueInfo = &queueMap[queue]; | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 475 |         if (pCBInfo->fenceId > pQueueInfo->lastRetiredId) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 476 |             log_msg(mdd(cb), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cb, 0, MEMTRACK_NONE, "MEM", | 
 | 477 |                     "fence %p for CB %p has not been checked for completion", | 
 | 478 |                     (void*)pCBInfo->lastSubmittedFence, cb); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 479 |             result = VK_FALSE; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 480 |         } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 481 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 482 |     return result; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 483 | } | 
 | 484 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 485 | static bool32_t freeMemObjInfo( | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 486 |     VkObject       object, | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 487 |     VkDeviceMemory mem, | 
 | 488 |     bool           internal) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 489 | { | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 490 |     bool32_t result = VK_TRUE; | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 491 |     // Parse global list to find info w/ mem | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 492 |     MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem); | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 493 |     if (!pInfo) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 494 |         log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", | 
 | 495 |                 "Couldn't find mem info object for %p\n    Was %p never allocated or previously freed?", | 
 | 496 |                 (void*)mem, (void*)mem); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 497 |         result = VK_FALSE; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 498 |     } else { | 
| Courtney Goeltzenleuchter | 1c943a7 | 2015-03-26 16:15:39 -0600 | [diff] [blame] | 499 |         if (pInfo->allocInfo.allocationSize == 0 && !internal) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 500 |             log_msg(mdd(pInfo->object), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", | 
 | 501 |                     "Attempting to free memory associated with a Persistent Image, %p, " | 
 | 502 |                     "this should not be explicitly freed\n", (void*)mem); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 503 |             result = VK_FALSE; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 504 |         } else { | 
 | 505 |             // Clear any CB bindings for completed CBs | 
 | 506 |             //   TODO : Is there a better place to do this? | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 507 |  | 
| Courtney Goeltzenleuchter | 1010044 | 2015-06-13 21:36:49 -0600 | [diff] [blame] | 508 |             assert(pInfo->object != VK_NULL_HANDLE); | 
| Courtney Goeltzenleuchter | fb4efc6 | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 509 |             list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin(); | 
 | 510 |             list<VkCmdBuffer>::iterator temp; | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 511 |             while (pInfo->pCmdBufferBindings.size() > 0 && it != pInfo->pCmdBufferBindings.end()) { | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 512 |                 if (VK_TRUE == checkCBCompleted(*it)) { | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 513 |                     temp = it; | 
 | 514 |                     ++temp; | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 515 |                     clear_cmd_buf_and_mem_references(*it); | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 516 |                     it = temp; | 
 | 517 |                 } else { | 
 | 518 |                     ++it; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 519 |                 } | 
 | 520 |             } | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 521 |  | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 522 |             // Now verify that no references to this mem obj remain | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 523 |             if (0 != pInfo->refCount) { | 
| Mark Lobodzinski | 40f7f40 | 2015-04-16 11:44:05 -0500 | [diff] [blame] | 524 |                 reportMemReferencesAndCleanUp(pInfo); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 525 |                 result = VK_FALSE; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 526 |             } | 
| Courtney Goeltzenleuchter | 2f3f8a2 | 2015-04-14 00:01:21 -0600 | [diff] [blame] | 527 |             // Delete mem obj info | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 528 |             deleteMemObjInfo(object, mem); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 529 |         } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 530 |     } | 
 | 531 |     return result; | 
 | 532 | } | 
 | 533 |  | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 534 | // Remove object binding performs 3 tasks: | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 535 | // 1. Remove ObjectInfo from MemObjInfo list container of obj bindings & free it | 
 | 536 | // 2. Decrement refCount for MemObjInfo | 
 | 537 | // 3. Clear MemObjInfo ptr from ObjectInfo | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 538 | static bool32_t clear_object_binding( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 539 |     VkObject object) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 540 | { | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 541 |     bool32_t result = VK_FALSE; | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 542 |     MT_OBJ_INFO* pObjInfo = get_object_info(object); | 
 | 543 |     if (pObjInfo) { | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 544 |         if (!pObjInfo->pMemObjInfo || pObjInfo->pMemObjInfo->pObjBindings.size() <= 0) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 545 |             log_msg(mdd(object), VK_DBG_REPORT_WARN_BIT, (VkObjectType) 0, object, 0, MEMTRACK_MEM_OBJ_CLEAR_EMPTY_BINDINGS, "MEM", | 
 | 546 |                     "Attempting to clear mem binding on obj %p but it has no binding.", (void*)object); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 547 |         } else { | 
| Mark Lobodzinski | 40f7f40 | 2015-04-16 11:44:05 -0500 | [diff] [blame] | 548 |             // 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 | 
 | 549 |             // and set the objects memory binding pointer to NULL. | 
| Courtney Goeltzenleuchter | fb4efc6 | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 550 |             for (list<VkObject>::iterator it = pObjInfo->pMemObjInfo->pObjBindings.begin(); it != pObjInfo->pMemObjInfo->pObjBindings.end(); ++it) { | 
| Mark Lobodzinski | 40f7f40 | 2015-04-16 11:44:05 -0500 | [diff] [blame] | 551 |                 if ((*it) == object) { | 
 | 552 |                     pObjInfo->pMemObjInfo->refCount--; | 
 | 553 |                     pObjInfo->pMemObjInfo->pObjBindings.erase(it); | 
 | 554 |                     pObjInfo->pMemObjInfo = NULL; | 
 | 555 |                     result = VK_TRUE; | 
 | 556 |                     break; | 
 | 557 |                 } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 558 |             } | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 559 |             if (result == VK_FALSE) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 560 |                 log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", | 
 | 561 |                         "While trying to clear mem binding for object %p, unable to find that object referenced by mem obj %p", | 
 | 562 |                         object, pObjInfo->pMemObjInfo->mem); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 563 |             } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 564 |         } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 565 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 566 |     return result; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 567 | } | 
 | 568 |  | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 569 | // For NULL mem case, output warning | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 570 | // Make sure given object is in global object map | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 571 | //  IF a previous binding existed, output validation error | 
 | 572 | //  Otherwise, add reference from objectInfo to memoryInfo | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 573 | //  Add reference off of objInfo | 
| Courtney Goeltzenleuchter | 540d349 | 2015-06-13 21:37:34 -0600 | [diff] [blame] | 574 | //  device is required for error logging, need a dispatchable | 
 | 575 | //  object for that. | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 576 | // Return VK_TRUE if addition is successful, VK_FALSE otherwise | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 577 | static bool32_t set_object_binding( | 
| Courtney Goeltzenleuchter | 540d349 | 2015-06-13 21:37:34 -0600 | [diff] [blame] | 578 |     VkObject       dispatch_object, | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 579 |     VkObject       object, | 
 | 580 |     VkDeviceMemory mem) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 581 | { | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 582 |     bool32_t result = VK_FALSE; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 583 |     // Handle NULL case separately, just clear previous binding & decrement reference | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 584 |     if (mem == VK_NULL_HANDLE) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 585 |         log_msg(mdd(dispatch_object), VK_DBG_REPORT_WARN_BIT, (VkObjectType) 0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", | 
 | 586 |                 "Attempting to Bind Obj(%p) to NULL", (void*)object); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 587 |         return VK_TRUE; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 588 |     } else { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 589 |         MT_OBJ_INFO* pObjInfo = get_object_info(object); | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 590 |         if (!pObjInfo) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 591 |             log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", | 
 | 592 |                     "Attempting to update Binding of Obj(%p) that's not in global list()", (void*)object); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 593 |             return VK_FALSE; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 594 |         } | 
 | 595 |         // non-null case so should have real mem obj | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 596 |         MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem); | 
 | 597 |         if (!pInfo) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 598 |             log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", | 
 | 599 |                     "While trying to bind mem for obj %p, couldn't find info for mem obj %p", (void*)object, (void*)mem); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 600 |             return VK_FALSE; | 
 | 601 |         } else { | 
 | 602 |             if (pObjInfo->pMemObjInfo != NULL) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 603 |                 log_msg(mdd(dispatch_object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem, 0, MEMTRACK_REBIND_OBJECT, "MEM", | 
 | 604 |                         "Attempting to bind memory (%p) to object (%p) which has already been bound to mem object %p", | 
 | 605 |                         (void*)mem, (void*)object, (void*)pObjInfo->pMemObjInfo->mem); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 606 |                 return VK_FALSE; | 
 | 607 |             } | 
 | 608 |             else { | 
 | 609 |                 pInfo->pObjBindings.push_front(object); | 
 | 610 |                 pInfo->refCount++; | 
 | 611 |  | 
 | 612 |                 // For image objects, make sure default memory state is correctly set | 
 | 613 |                 // TODO : What's the best/correct way to handle this? | 
 | 614 |                 if (VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO == pObjInfo->sType) { | 
 | 615 |                     if (pObjInfo->create_info.image_create_info.usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | | 
 | 616 |                                                                          VK_IMAGE_USAGE_DEPTH_STENCIL_BIT)) { | 
 | 617 |                         // TODO::  More memory state transition stuff. | 
 | 618 |                     } | 
 | 619 |                 } | 
 | 620 |                 pObjInfo->pMemObjInfo = pInfo; | 
 | 621 |             } | 
 | 622 |         } | 
 | 623 |     } | 
 | 624 |     return VK_TRUE; | 
 | 625 | } | 
 | 626 |  | 
 | 627 | // For NULL mem case, clear any previous binding Else... | 
 | 628 | // Make sure given object is in global object map | 
 | 629 | //  IF a previous binding existed, update binding | 
 | 630 | //  Add reference from objectInfo to memoryInfo | 
 | 631 | //  Add reference off of objInfo | 
 | 632 | // Return VK_TRUE if addition is successful, VK_FALSE otherwise | 
 | 633 | static bool32_t set_sparse_buffer_binding( | 
 | 634 |     VkObject       object, | 
 | 635 |     VkDeviceMemory mem) | 
 | 636 | { | 
 | 637 |     bool32_t result = VK_FALSE; | 
 | 638 |     // Handle NULL case separately, just clear previous binding & decrement reference | 
 | 639 |     if (mem == VK_NULL_HANDLE) { | 
 | 640 |         clear_object_binding(object); | 
 | 641 |         return VK_TRUE; | 
 | 642 |     } else { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 643 |         MT_OBJ_INFO* pObjInfo = get_object_info(object); | 
 | 644 |         if (!pObjInfo) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 645 |             log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", | 
 | 646 |                     "Attempting to update Binding of Obj(%p) that's not in global list()", (void*)object); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 647 |             return VK_FALSE; | 
 | 648 |         } | 
 | 649 |         // non-null case so should have real mem obj | 
 | 650 |         MT_MEM_OBJ_INFO* pInfo = get_mem_obj_info(mem); | 
| Courtney Goeltzenleuchter | e4171f0 | 2015-04-29 10:51:48 -0600 | [diff] [blame] | 651 |         if (!pInfo) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 652 |             log_msg(mdd(object), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", | 
 | 653 |                     "While trying to bind mem for obj %p, couldn't find info for mem obj %p", (void*)object, (void*)mem); | 
| Mark Lobodzinski | 3780e14 | 2015-05-14 15:08:13 -0500 | [diff] [blame] | 654 |             return VK_FALSE; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 655 |         } else { | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 656 |             // Search for object in memory object's binding list | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 657 |             bool32_t found  = VK_FALSE; | 
| Courtney Goeltzenleuchter | e4171f0 | 2015-04-29 10:51:48 -0600 | [diff] [blame] | 658 |             if (pInfo->pObjBindings.size() > 0) { | 
 | 659 |                 for (list<VkObject>::iterator it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) { | 
 | 660 |                     if ((*it) == object) { | 
 | 661 |                         found = VK_TRUE; | 
 | 662 |                         break; | 
 | 663 |                     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 664 |                 } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 665 |             } | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 666 |             // If not present, add to list | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 667 |             if (found == VK_FALSE) { | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 668 |                 pInfo->pObjBindings.push_front(object); | 
 | 669 |                 pInfo->refCount++; | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 670 |             } | 
 | 671 |  | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 672 |             if (pObjInfo->pMemObjInfo) { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 673 |                 clear_object_binding(object); // Need to clear the previous object binding before setting new binding | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 674 |                 log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, object, 0, MEMTRACK_NONE, "MEM", | 
 | 675 |                         "Updating memory binding for object %p from mem obj %p to %p", object, pObjInfo->pMemObjInfo->mem, mem); | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 676 |             } | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 677 |             pObjInfo->pMemObjInfo = pInfo; | 
| Tobin Ehlis | 8be20fd | 2015-01-07 17:49:29 -0700 | [diff] [blame] | 678 |         } | 
 | 679 |     } | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 680 |     return VK_TRUE; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 681 | } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 682 |  | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 683 | // Print details of global Obj tracking list | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 684 | static void print_object_list( | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 685 |     VkObject object) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 686 | { | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 687 |     MT_OBJ_INFO* pInfo = NULL; | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 688 |     log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 689 |             "Details of Object list of size %lu elements", objectMap.size()); | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 690 |     if (objectMap.size() <= 0) | 
 | 691 |         return; | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 692 |     for (unordered_map<VkObject, MT_OBJ_INFO>::iterator ii=objectMap.begin(); ii!=objectMap.end(); ++ii) { | 
 | 693 |         pInfo = &(*ii).second; | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 694 |         log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, pInfo->object, 0, MEMTRACK_NONE, "MEM", | 
 | 695 |                 "    ObjInfo %p has object %p, pMemObjInfo %p", pInfo, pInfo->object, pInfo->pMemObjInfo); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 696 |     } | 
 | 697 | } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 698 |  | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 699 | // For given Object, get 'mem' obj that it's bound to or NULL if no binding | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 700 | static VkDeviceMemory get_mem_binding_from_object( | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 701 |     const VkObject dispObj, const VkObject object) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 702 | { | 
| Tony Barbour | d1c3572 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 703 |     VkDeviceMemory mem = NULL; | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 704 |     MT_OBJ_INFO* pObjInfo = get_object_info(object); | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 705 |     if (pObjInfo) { | 
 | 706 |         if (pObjInfo->pMemObjInfo) { | 
 | 707 |             mem = pObjInfo->pMemObjInfo->mem; | 
| Courtney Goeltzenleuchter | e4171f0 | 2015-04-29 10:51:48 -0600 | [diff] [blame] | 708 |         } else { | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 709 |             log_msg(mdd(dispObj), VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, object, 0, MEMTRACK_MISSING_MEM_BINDINGS, "MEM", | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 710 |                     "Trying to get mem binding for object %p but object has no mem binding", (void*)object); | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 711 |             print_object_list(object); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 712 |         } | 
| Courtney Goeltzenleuchter | e4171f0 | 2015-04-29 10:51:48 -0600 | [diff] [blame] | 713 |     } else { | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 714 |         log_msg(mdd(dispObj), VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, object, 0, MEMTRACK_INVALID_OBJECT, "MEM", | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 715 |                 "Trying to get mem binding for object %p but no such object in global list", (void*)object); | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 716 |         print_object_list(object); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 717 |     } | 
 | 718 |     return mem; | 
 | 719 | } | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 720 |  | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 721 | // Print details of MemObjInfo list | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 722 | static void print_mem_list( | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 723 |     VkObject object) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 724 | { | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 725 |     MT_MEM_OBJ_INFO* pInfo = NULL; | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 726 |     // Just printing each msg individually for now, may want to package these into single large print | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 727 |     log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 728 |             "MEM INFO : Details of Memory Object list of size %lu elements", memObjMap.size()); | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 729 |  | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 730 |     if (memObjMap.size() <= 0) | 
 | 731 |         return; | 
 | 732 |  | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 733 |     for (unordered_map<VkDeviceMemory, MT_MEM_OBJ_INFO>::iterator ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) { | 
 | 734 |         pInfo = &(*ii).second; | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 735 |  | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 736 |         log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 737 |                 "    ===MemObjInfo at %p===", (void*)pInfo); | 
 | 738 |         log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 739 |                 "    Mem object: %p", (void*)pInfo->mem); | 
 | 740 |         log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 741 |                 "    Ref Count: %u", pInfo->refCount); | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 742 |         if (0 != pInfo->allocInfo.allocationSize) { | 
| Courtney Goeltzenleuchter | 95487bc | 2015-04-14 18:48:46 -0600 | [diff] [blame] | 743 |             string pAllocInfoMsg = vk_print_vkmemoryallocinfo(&pInfo->allocInfo, "{MEM}INFO :       "); | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 744 |             log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 745 |                     "    Mem Alloc info:\n%s", pAllocInfoMsg.c_str()); | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 746 |         } else { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 747 |             log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 748 |                     "    Mem Alloc info is NULL (alloc done by vkCreateSwapChainWSI())"); | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 749 |         } | 
 | 750 |  | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 751 |         log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 752 |                 "    VK OBJECT Binding list of size %lu elements:", pInfo->pObjBindings.size()); | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 753 |         if (pInfo->pObjBindings.size() > 0) { | 
 | 754 |             for (list<VkObject>::iterator it = pInfo->pObjBindings.begin(); it != pInfo->pObjBindings.end(); ++it) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 755 |                 log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 756 |                         "       VK OBJECT %p", (*it)); | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 757 |             } | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 758 |         } | 
 | 759 |  | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 760 |         log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 761 |                 "    VK Command Buffer (CB) binding list of size %lu elements", pInfo->pCmdBufferBindings.size()); | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 762 |         if (pInfo->pCmdBufferBindings.size() > 0) | 
 | 763 |         { | 
 | 764 |             for (list<VkCmdBuffer>::iterator it = pInfo->pCmdBufferBindings.begin(); it != pInfo->pCmdBufferBindings.end(); ++it) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 765 |                 log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 766 |                         "      VK CB %p", (*it)); | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 767 |             } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 768 |         } | 
 | 769 |     } | 
 | 770 | } | 
 | 771 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 772 | static void printCBList( | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 773 |     VkObject object) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 774 | { | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 775 |     MT_CB_INFO* pCBInfo = NULL; | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 776 |     log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 777 |             "Details of CB list of size %lu elements", cbMap.size()); | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 778 |  | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 779 |     if (cbMap.size() <= 0) | 
 | 780 |         return; | 
 | 781 |  | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 782 |     for (unordered_map<VkCmdBuffer, MT_CB_INFO>::iterator ii=cbMap.begin(); ii!=cbMap.end(); ++ii) { | 
 | 783 |         pCBInfo = &(*ii).second; | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 784 |  | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 785 |         log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 786 |                 "    CB Info (%p) has CB %p, fenceId %" PRIx64", and fence %p", | 
 | 787 |                 (void*)pCBInfo, (void*)pCBInfo->cmdBuffer, pCBInfo->fenceId, | 
 | 788 |                 (void*)pCBInfo->lastSubmittedFence); | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 789 |  | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 790 |         if (pCBInfo->pMemObjList.size() <= 0) | 
 | 791 |             continue; | 
| Tony Barbour | d1c3572 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 792 |         for (list<VkDeviceMemory>::iterator it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 793 |             log_msg(mdd(object), VK_DBG_REPORT_INFO_BIT, (VkObjectType) 0, NULL, 0, MEMTRACK_NONE, "MEM", | 
 | 794 |                     "      Mem obj %p", (*it)); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 795 |         } | 
 | 796 |     } | 
 | 797 | } | 
 | 798 |  | 
| Courtney Goeltzenleuchter | 6f48432 | 2015-06-14 11:37:01 -0600 | [diff] [blame] | 799 | static void init_mem_tracker( | 
 | 800 |     layer_data *my_data) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 801 | { | 
| Courtney Goeltzenleuchter | 6f48432 | 2015-06-14 11:37:01 -0600 | [diff] [blame] | 802 |     uint32_t report_flags = 0; | 
 | 803 |     uint32_t debug_action = 0; | 
 | 804 |     FILE *log_output = NULL; | 
 | 805 |     const char *option_str; | 
| Jon Ashburn | 7d7b3cf | 2014-12-22 13:24:15 -0700 | [diff] [blame] | 806 |     // initialize MemTracker options | 
| Courtney Goeltzenleuchter | 6f48432 | 2015-06-14 11:37:01 -0600 | [diff] [blame] | 807 |     report_flags = getLayerOptionFlags("MemTrackerReportFlags", 0); | 
 | 808 |     getLayerOptionEnum("MemTrackerDebugAction", (uint32_t *) &debug_action); | 
| Tobin Ehlis | ee70223 | 2015-01-08 14:26:53 -0700 | [diff] [blame] | 809 |  | 
| Courtney Goeltzenleuchter | 6f48432 | 2015-06-14 11:37:01 -0600 | [diff] [blame] | 810 |     if (debug_action & VK_DBG_LAYER_ACTION_LOG_MSG) | 
| Jon Ashburn | 7d7b3cf | 2014-12-22 13:24:15 -0700 | [diff] [blame] | 811 |     { | 
| Courtney Goeltzenleuchter | 6f48432 | 2015-06-14 11:37:01 -0600 | [diff] [blame] | 812 |         option_str = getLayerOption("MemTrackerLogFilename"); | 
 | 813 |         if (option_str) { | 
 | 814 |             log_output = fopen(option_str, "w"); | 
| Jon Ashburn | 7d7b3cf | 2014-12-22 13:24:15 -0700 | [diff] [blame] | 815 |         } | 
| Courtney Goeltzenleuchter | 6f48432 | 2015-06-14 11:37:01 -0600 | [diff] [blame] | 816 |         if (log_output == NULL) { | 
 | 817 |             log_output = stdout; | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 818 |         } | 
| Courtney Goeltzenleuchter | 6f48432 | 2015-06-14 11:37:01 -0600 | [diff] [blame] | 819 |  | 
 | 820 |         layer_create_msg_callback(my_data->report_data, report_flags, log_callback, (void *) log_output, &my_data->logging_callback); | 
| Jon Ashburn | 7d7b3cf | 2014-12-22 13:24:15 -0700 | [diff] [blame] | 821 |     } | 
 | 822 |  | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 823 |     if (!globalLockInitialized) | 
 | 824 |     { | 
 | 825 |         // TODO/TBD: Need to delete this mutex sometime.  How???  One | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 826 |         // suggestion is to call this during vkCreateInstance(), and then we | 
 | 827 |         // can clean it up during vkDestroyInstance().  However, that requires | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 828 |         // that the layer have per-instance locks.  We need to come back and | 
 | 829 |         // address this soon. | 
 | 830 |         loader_platform_thread_create_mutex(&globalLock); | 
 | 831 |         globalLockInitialized = 1; | 
 | 832 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 833 | } | 
 | 834 |  | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 835 | // hook DestroyInstance to remove tableInstanceMap entry | 
 | 836 | VK_LAYER_EXPORT VkResult VKAPI vkDestroyInstance(VkInstance instance) | 
 | 837 | { | 
| Jeremy Hayes | 35f8afc | 2015-06-18 10:25:55 -0600 | [diff] [blame] | 838 |     // Grab the key before the instance is destroyed. | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 839 |     dispatch_key key = get_dispatch_key(instance); | 
 | 840 |     VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, instance); | 
 | 841 |     VkResult res = pTable->DestroyInstance(instance); | 
| Courtney Goeltzenleuchter | 6f48432 | 2015-06-14 11:37:01 -0600 | [diff] [blame] | 842 |  | 
 | 843 |     // Clean up logging callback, if any | 
| Courtney Goeltzenleuchter | 095e677 | 2015-06-16 16:58:52 -0600 | [diff] [blame] | 844 |     layer_data *my_data = get_my_data_ptr(key, layer_data_map); | 
| Courtney Goeltzenleuchter | 6f48432 | 2015-06-14 11:37:01 -0600 | [diff] [blame] | 845 |     if (my_data->logging_callback) { | 
 | 846 |         layer_destroy_msg_callback(my_data->report_data, my_data->logging_callback); | 
 | 847 |     } | 
 | 848 |  | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 849 |     layer_debug_report_destroy_instance(mid(instance)); | 
 | 850 |     layer_data_map.erase(pTable); | 
 | 851 |  | 
 | 852 |     mem_tracker_instance_table_map.erase(key); | 
 | 853 |     assert(mem_tracker_instance_table_map.size() == 0 && "Should not have any instance mappings hanging around"); | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 854 |     return res; | 
 | 855 | } | 
| Courtney Goeltzenleuchter | f579fa6 | 2015-06-10 17:39:03 -0600 | [diff] [blame] | 856 |  | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 857 | VkResult VKAPI vkCreateInstance( | 
 | 858 |     const VkInstanceCreateInfo*                 pCreateInfo, | 
 | 859 |     VkInstance*                                 pInstance) | 
 | 860 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 861 |     VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, *pInstance); | 
| Courtney Goeltzenleuchter | d02a964 | 2015-06-08 14:58:39 -0600 | [diff] [blame] | 862 |     VkResult result = pTable->CreateInstance(pCreateInfo, pInstance); | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 863 |  | 
 | 864 |     if (result == VK_SUCCESS) { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 865 |         layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map); | 
 | 866 |         my_data->report_data = debug_report_create_instance( | 
 | 867 |                                    pTable, | 
 | 868 |                                    *pInstance, | 
 | 869 |                                    pCreateInfo->extensionCount, | 
 | 870 |                                    pCreateInfo->pEnabledExtensions); | 
| Courtney Goeltzenleuchter | 6f48432 | 2015-06-14 11:37:01 -0600 | [diff] [blame] | 871 |  | 
 | 872 |         init_mem_tracker(my_data); | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 873 |     } | 
 | 874 |     return result; | 
 | 875 | } | 
 | 876 |  | 
| Jon Ashburn | 747f2b6 | 2015-06-18 15:02:58 -0600 | [diff] [blame] | 877 | static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device) | 
 | 878 | { | 
 | 879 |     uint32_t i, ext_idx; | 
 | 880 |     VkLayerDispatchTable *pDisp  = get_dispatch_table(mem_tracker_device_table_map, device); | 
 | 881 |     deviceExtMap[pDisp].wsi_lunarg_enabled = false; | 
 | 882 |     for (i = 0; i < pCreateInfo->extensionCount; i++) { | 
 | 883 |         if (strcmp(pCreateInfo->pEnabledExtensions[i].name, VK_WSI_LUNARG_EXTENSION_NAME) == 0) | 
 | 884 |             deviceExtMap[pDisp].wsi_lunarg_enabled = true; | 
 | 885 |  | 
 | 886 |     } | 
 | 887 | } | 
 | 888 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 889 | VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice( | 
 | 890 |     VkPhysicalDevice          gpu, | 
 | 891 |     const VkDeviceCreateInfo *pCreateInfo, | 
 | 892 |     VkDevice                 *pDevice) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 893 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 894 |     VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(mem_tracker_instance_table_map, gpu); | 
 | 895 |     VkResult result = pInstanceTable->CreateDevice(gpu, pCreateInfo, pDevice); | 
| Courtney Goeltzenleuchter | f579fa6 | 2015-06-10 17:39:03 -0600 | [diff] [blame] | 896 |     if (result == VK_SUCCESS) { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 897 |         layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 898 |         layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map); | 
 | 899 |         my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice); | 
| Jon Ashburn | 747f2b6 | 2015-06-18 15:02:58 -0600 | [diff] [blame] | 900 |         createDeviceRegisterExtensions(pCreateInfo, *pDevice); | 
| Courtney Goeltzenleuchter | f579fa6 | 2015-06-10 17:39:03 -0600 | [diff] [blame] | 901 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 902 |     return result; | 
 | 903 | } | 
 | 904 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 905 | VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice( | 
 | 906 |     VkDevice device) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 907 | { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 908 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 909 |     log_msg(mdd(device), VK_DBG_REPORT_INFO_BIT, VK_OBJECT_TYPE_DEVICE, device, 0, MEMTRACK_NONE, "MEM", | 
 | 910 |             "Printing List details prior to vkDestroyDevice()"); | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 911 |     print_mem_list(device); | 
 | 912 |     printCBList(device); | 
 | 913 |     print_object_list(device); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 914 |     if (VK_FALSE == delete_cmd_buf_info_list()) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 915 |         log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE, device, 0, MEMTRACK_INTERNAL_ERROR, "MEM", | 
 | 916 |                 "Issue deleting global CB list in vkDestroyDevice()"); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 917 |     } | 
| Tobin Ehlis | b54ef78 | 2014-11-25 18:01:12 -0700 | [diff] [blame] | 918 |     // Report any memory leaks | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 919 |     MT_MEM_OBJ_INFO* pInfo = NULL; | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 920 |     if (memObjMap.size() > 0) { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 921 |         for (unordered_map<VkDeviceMemory, MT_MEM_OBJ_INFO>::iterator ii=memObjMap.begin(); ii!=memObjMap.end(); ++ii) { | 
 | 922 |             pInfo = &(*ii).second; | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 923 |  | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 924 |             if (pInfo->allocInfo.allocationSize != 0) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 925 |                 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, pInfo->mem, 0, MEMTRACK_MEMORY_LEAK, "MEM", | 
 | 926 |                         "Mem Object %p has not been freed. You should clean up this memory by calling " | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 927 |                          "vkFreeMemory(%p) prior to vkDestroyDevice().", pInfo->mem, pInfo->mem); | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 928 |             } | 
| Mark Lobodzinski | 2f3b19b | 2015-02-18 18:06:24 -0600 | [diff] [blame] | 929 |         } | 
| Tobin Ehlis | b54ef78 | 2014-11-25 18:01:12 -0700 | [diff] [blame] | 930 |     } | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 931 |  | 
 | 932 |     // Queues persist until device is destroyed | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 933 |     delete_queue_info_list(); | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 934 |  | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 935 |     layer_debug_report_destroy_device(device); | 
 | 936 |  | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 937 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 938 |  | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 939 |     dispatch_key key = get_dispatch_key(device); | 
| Courtney Goeltzenleuchter | 89d6844 | 2015-06-13 21:40:22 -0600 | [diff] [blame] | 940 | #if DISPATCH_MAP_DEBUG | 
 | 941 |     fprintf(stderr, "Device: %p, key: %p\n", device, key); | 
 | 942 | #endif | 
| Jon Ashburn | 747f2b6 | 2015-06-18 15:02:58 -0600 | [diff] [blame] | 943 |     VkLayerDispatchTable *pDisp  = get_dispatch_table(mem_tracker_device_table_map, device); | 
 | 944 |     VkResult result = pDisp->DestroyDevice(device); | 
 | 945 |     deviceExtMap.erase(pDisp); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 946 |     mem_tracker_device_table_map.erase(key); | 
| Courtney Goeltzenleuchter | 1010044 | 2015-06-13 21:36:49 -0600 | [diff] [blame] | 947 |     assert(mem_tracker_device_table_map.size() == 0 && "Should not have any instance mappings hanging around"); | 
| Jon Ashburn | 747f2b6 | 2015-06-18 15:02:58 -0600 | [diff] [blame] | 948 |  | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 949 |     return result; | 
 | 950 | } | 
 | 951 |  | 
| Jon Ashburn | 9fd4cc4 | 2015-04-10 14:33:07 -0600 | [diff] [blame] | 952 | struct extProps { | 
 | 953 |     uint32_t version; | 
 | 954 |     const char * const name; | 
 | 955 | }; | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 956 | #define MEM_TRACKER_LAYER_EXT_ARRAY_SIZE 2 | 
| Courtney Goeltzenleuchter | f579fa6 | 2015-06-10 17:39:03 -0600 | [diff] [blame] | 957 | static const VkExtensionProperties mtExts[MEM_TRACKER_LAYER_EXT_ARRAY_SIZE] = { | 
 | 958 |     { | 
 | 959 |         VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES, | 
 | 960 |         "MemTracker", | 
 | 961 |         0x10, | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 962 |         "Validation layer: MemTracker", | 
 | 963 |     }, | 
 | 964 |     { | 
 | 965 |         VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES, | 
 | 966 |         "Validation", | 
 | 967 |         0x10, | 
 | 968 |         "Validation layer: MemTracker", | 
| Courtney Goeltzenleuchter | f579fa6 | 2015-06-10 17:39:03 -0600 | [diff] [blame] | 969 |     } | 
| Jon Ashburn | 9fd4cc4 | 2015-04-10 14:33:07 -0600 | [diff] [blame] | 970 | }; | 
 | 971 |  | 
| Tony Barbour | 59a4732 | 2015-06-24 16:06:58 -0600 | [diff] [blame^] | 972 | VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionProperties( | 
 | 973 |                                                uint32_t extensionIndex, | 
 | 974 |                                                VkExtensionProperties*    pData) | 
| Jon Ashburn | 9fd4cc4 | 2015-04-10 14:33:07 -0600 | [diff] [blame] | 975 | { | 
| Tony Barbour | 59a4732 | 2015-06-24 16:06:58 -0600 | [diff] [blame^] | 976 |     /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */ | 
| Jon Ashburn | 9fd4cc4 | 2015-04-10 14:33:07 -0600 | [diff] [blame] | 977 |  | 
| Tony Barbour | 59a4732 | 2015-06-24 16:06:58 -0600 | [diff] [blame^] | 978 |     if (extensionIndex >= MEM_TRACKER_LAYER_EXT_ARRAY_SIZE) | 
 | 979 |         return VK_ERROR_INVALID_VALUE; | 
 | 980 |     memcpy((VkExtensionProperties *) pData, &mtExts[extensionIndex], sizeof(VkExtensionProperties)); | 
| Jon Ashburn | 9fd4cc4 | 2015-04-10 14:33:07 -0600 | [diff] [blame] | 981 |  | 
| Tony Barbour | 59a4732 | 2015-06-24 16:06:58 -0600 | [diff] [blame^] | 982 |     return VK_SUCCESS; | 
 | 983 | } | 
 | 984 |  | 
 | 985 | VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionCount(uint32_t* pCount) | 
 | 986 | { | 
 | 987 |     *pCount = MEM_TRACKER_LAYER_EXT_ARRAY_SIZE; | 
| Jon Ashburn | 9fd4cc4 | 2015-04-10 14:33:07 -0600 | [diff] [blame] | 988 |  | 
 | 989 |     return VK_SUCCESS; | 
 | 990 | } | 
 | 991 |  | 
| Jon Ashburn | 13ed075 | 2015-06-19 12:02:24 -0600 | [diff] [blame] | 992 | #define MEM_TRACKER_LAYER_DEV_EXT_ARRAY_SIZE 3 | 
 | 993 | static const VkExtensionProperties mtDevExts[MEM_TRACKER_LAYER_DEV_EXT_ARRAY_SIZE] = { | 
 | 994 |     { | 
 | 995 |         VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES, | 
 | 996 |         "MemTracker", | 
 | 997 |         0x10, | 
 | 998 |         "Validation layer: MemTracker", | 
 | 999 |     }, | 
 | 1000 |     { | 
 | 1001 |         VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES, | 
 | 1002 |         "Validation", | 
 | 1003 |         0x10, | 
 | 1004 |         "Validation layer: MemTracker", | 
 | 1005 |     }, | 
 | 1006 |     { | 
 | 1007 |         VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES, | 
 | 1008 |         VK_WSI_LUNARG_EXTENSION_NAME, | 
 | 1009 |         0x10, | 
 | 1010 |         "Validation layer: MemTracker", | 
 | 1011 |     } | 
 | 1012 | }; | 
 | 1013 |  | 
| Tony Barbour | 59a4732 | 2015-06-24 16:06:58 -0600 | [diff] [blame^] | 1014 |  | 
 | 1015 | VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionCount( | 
 | 1016 |                                                VkPhysicalDevice gpu, | 
 | 1017 |                                                uint32_t* pCount) | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 1018 | { | 
| Tony Barbour | 59a4732 | 2015-06-24 16:06:58 -0600 | [diff] [blame^] | 1019 |     *pCount = MEM_TRACKER_LAYER_DEV_EXT_ARRAY_SIZE; | 
 | 1020 |     return VK_SUCCESS; | 
 | 1021 | } | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 1022 |  | 
| Tony Barbour | 59a4732 | 2015-06-24 16:06:58 -0600 | [diff] [blame^] | 1023 | VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionProperties( | 
 | 1024 |                                                VkPhysicalDevice gpu, | 
 | 1025 |                                                uint32_t extensionIndex, | 
 | 1026 |                                                VkExtensionProperties* pProperties) | 
 | 1027 | { | 
 | 1028 |     if (extensionIndex >= MEM_TRACKER_LAYER_DEV_EXT_ARRAY_SIZE) | 
 | 1029 |         return VK_ERROR_INVALID_VALUE; | 
 | 1030 |     memcpy(pProperties, &mtDevExts[extensionIndex], sizeof(VkExtensionProperties)); | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 1031 |  | 
 | 1032 |     return VK_SUCCESS; | 
 | 1033 | } | 
 | 1034 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1035 | VK_LAYER_EXPORT VkResult VKAPI vkGetDeviceQueue( | 
 | 1036 |     VkDevice  device, | 
 | 1037 |     uint32_t  queueNodeIndex, | 
 | 1038 |     uint32_t  queueIndex, | 
 | 1039 |     VkQueue   *pQueue) | 
| Mark Lobodzinski | 748eddf | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 1040 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1041 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1042 |     if (result == VK_SUCCESS) { | 
| Mark Lobodzinski | ed450b0 | 2015-04-07 13:38:21 -0500 | [diff] [blame] | 1043 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1044 |         add_queue_info(*pQueue); | 
| Mark Lobodzinski | ed450b0 | 2015-04-07 13:38:21 -0500 | [diff] [blame] | 1045 |         loader_platform_thread_unlock_mutex(&globalLock); | 
 | 1046 |     } | 
| Mark Lobodzinski | 748eddf | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 1047 |     return result; | 
 | 1048 | } | 
 | 1049 |  | 
| Courtney Goeltzenleuchter | fb4efc6 | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 1050 | VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit( | 
 | 1051 |     VkQueue             queue, | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1052 |     uint32_t            cmdBufferCount, | 
 | 1053 |     const VkCmdBuffer  *pCmdBuffers, | 
| Courtney Goeltzenleuchter | fb4efc6 | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 1054 |     VkFence             fence) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1055 | { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1056 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1057 |     // TODO : Need to track fence and clear mem references when fence clears | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 1058 |     MT_CB_INFO* pCBInfo = NULL; | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1059 |     uint64_t    fenceId = add_fence_info(fence, queue); | 
| Mark Lobodzinski | ed450b0 | 2015-04-07 13:38:21 -0500 | [diff] [blame] | 1060 |  | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 1061 |     print_mem_list(queue); | 
 | 1062 |     printCBList(queue); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1063 |     for (uint32_t i = 0; i < cmdBufferCount; i++) { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1064 |         pCBInfo = get_cmd_buf_info(pCmdBuffers[i]); | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 1065 |         pCBInfo->fenceId = fenceId; | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1066 |         pCBInfo->lastSubmittedFence = fence; | 
 | 1067 |         pCBInfo->lastSubmittedQueue = queue; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1068 |     } | 
| Mark Lobodzinski | ed450b0 | 2015-04-07 13:38:21 -0500 | [diff] [blame] | 1069 |  | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1070 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1071 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueSubmit( | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 1072 |         queue, cmdBufferCount, pCmdBuffers, fence); | 
| Courtney Goeltzenleuchter | d3fb955 | 2015-04-02 13:39:07 -0600 | [diff] [blame] | 1073 |     return result; | 
 | 1074 | } | 
 | 1075 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1076 | VK_LAYER_EXPORT VkResult VKAPI vkAllocMemory( | 
 | 1077 |     VkDevice                 device, | 
 | 1078 |     const VkMemoryAllocInfo *pAllocInfo, | 
 | 1079 |     VkDeviceMemory          *pMem) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1080 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1081 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->AllocMemory(device, pAllocInfo, pMem); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1082 |     // TODO : Track allocations and overall size here | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1083 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 1084 |     add_mem_obj_info(device, *pMem, pAllocInfo); | 
 | 1085 |     print_mem_list(device); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1086 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1087 |     return result; | 
 | 1088 | } | 
 | 1089 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1090 | VK_LAYER_EXPORT VkResult VKAPI vkFreeMemory( | 
 | 1091 |     VkDevice       device, | 
 | 1092 |     VkDeviceMemory mem) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1093 | { | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1094 |     /* From spec : A memory object is freed by calling vkFreeMemory() when it is no longer needed. Before | 
| Tobin Ehlis | c0418f9 | 2014-11-25 14:47:20 -0700 | [diff] [blame] | 1095 |      * freeing a memory object, an application must ensure the memory object is unbound from | 
 | 1096 |      * all API objects referencing it and that it is not referenced by any queued command buffers | 
 | 1097 |      */ | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1098 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 1099 |     bool32_t noerror = freeMemObjInfo(device, mem, false); | 
 | 1100 |     print_mem_list(device); | 
 | 1101 |     print_object_list(device); | 
 | 1102 |     printCBList(device); | 
| Mark Lobodzinski | 3780e14 | 2015-05-14 15:08:13 -0500 | [diff] [blame] | 1103 |     // Output an warning message for proper error/warning handling | 
 | 1104 |     if (noerror == VK_FALSE) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1105 |         log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem, 0, MEMTRACK_FREED_MEM_REF, "MEM", | 
 | 1106 |                 "Freeing memory object while it still has references: mem obj %p", (void*)mem); | 
| Mark Lobodzinski | 3780e14 | 2015-05-14 15:08:13 -0500 | [diff] [blame] | 1107 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1108 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1109 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->FreeMemory(device, mem); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1110 |     return result; | 
 | 1111 | } | 
 | 1112 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1113 | VK_LAYER_EXPORT VkResult VKAPI vkMapMemory( | 
 | 1114 |     VkDevice         device, | 
 | 1115 |     VkDeviceMemory   mem, | 
 | 1116 |     VkDeviceSize     offset, | 
 | 1117 |     VkDeviceSize     size, | 
 | 1118 |     VkFlags          flags, | 
 | 1119 |     void           **ppData) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1120 | { | 
 | 1121 |     // TODO : Track when memory is mapped | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1122 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1123 |     MT_MEM_OBJ_INFO *pMemObj = get_mem_obj_info(mem); | 
| Tony Barbour | d1c3572 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 1124 |     if ((pMemObj->allocInfo.memProps & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1125 |         log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE_MEMORY, mem, 0, MEMTRACK_INVALID_STATE, "MEM", | 
 | 1126 |                 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set: mem obj %p", (void*)mem); | 
| Mark Lobodzinski | 95152dc | 2015-02-25 12:16:04 -0600 | [diff] [blame] | 1127 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1128 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1129 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->MapMemory(device, mem, offset, size, flags, ppData); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1130 |     return result; | 
 | 1131 | } | 
 | 1132 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1133 | VK_LAYER_EXPORT VkResult VKAPI vkUnmapMemory( | 
 | 1134 |     VkDevice       device, | 
 | 1135 |     VkDeviceMemory mem) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1136 | { | 
 | 1137 |     // TODO : Track as memory gets unmapped, do we want to check what changed following map? | 
 | 1138 |     //   Make sure that memory was ever mapped to begin with | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1139 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->UnmapMemory(device, mem); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1140 |     return result; | 
 | 1141 | } | 
 | 1142 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1143 | VK_LAYER_EXPORT VkResult VKAPI vkDestroyObject( | 
 | 1144 |     VkDevice     device, | 
 | 1145 |     VkObjectType objType, | 
 | 1146 |     VkObject     object) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1147 | { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 1148 |     unordered_map<VkObject, MT_OBJ_INFO>::iterator item; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1149 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 1150 |  | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1151 |     // First check if this is a CmdBuffer or fence | 
 | 1152 |     switch (objType) { | 
 | 1153 |     case VK_OBJECT_TYPE_COMMAND_BUFFER: | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1154 |         delete_cmd_buf_info((VkCmdBuffer)object); | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1155 |         break; | 
 | 1156 |     case VK_OBJECT_TYPE_FENCE: | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1157 |         delete_fence_info((VkFence)object); | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1158 |         break; | 
 | 1159 |     default: | 
 | 1160 |         break; | 
| Tobin Ehlis | a98df73 | 2014-11-27 07:52:04 -0700 | [diff] [blame] | 1161 |     } | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 1162 |  | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1163 |     if ((item = objectMap.find(object)) != objectMap.end()) { | 
| Mike Stroyan | dd7aed7 | 2015-05-19 17:03:40 -0600 | [diff] [blame] | 1164 |         MT_OBJ_INFO* pDelInfo = &(*item).second; | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 1165 |         if (pDelInfo->pMemObjInfo) { | 
| Tobin Ehlis | a98df73 | 2014-11-27 07:52:04 -0700 | [diff] [blame] | 1166 |             // Wsi allocated Memory is tied to image object so clear the binding and free that memory automatically | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 1167 |             if (0 == pDelInfo->pMemObjInfo->allocInfo.allocationSize) { // Wsi allocated memory has NULL allocInfo w/ 0 size | 
| Tony Barbour | d1c3572 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 1168 |                 VkDeviceMemory memToFree = pDelInfo->pMemObjInfo->mem; | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1169 |                 clear_object_binding(object); | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 1170 |                 freeMemObjInfo(device, memToFree, true); | 
| Courtney Goeltzenleuchter | 1c943a7 | 2015-03-26 16:15:39 -0600 | [diff] [blame] | 1171 |             } | 
 | 1172 |             else { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1173 |                 // Remove this object from memory object's reference list and decrement its ref counter | 
 | 1174 |                 clear_object_binding(object); | 
| Tobin Ehlis | a98df73 | 2014-11-27 07:52:04 -0700 | [diff] [blame] | 1175 |             } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1176 |         } | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1177 |         objectMap.erase(item); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1178 |     } | 
| Mark Lobodzinski | b6ddb46 | 2015-03-24 16:29:24 -0500 | [diff] [blame] | 1179 |  | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1180 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1181 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DestroyObject(device, objType, object); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1182 |     return result; | 
 | 1183 | } | 
 | 1184 |  | 
| Tony Barbour | 59a4732 | 2015-06-24 16:06:58 -0600 | [diff] [blame^] | 1185 | VK_LAYER_EXPORT VkResult VKAPI vkGetObjectMemoryRequirements( | 
 | 1186 |     VkDevice                          device, | 
 | 1187 |     VkObjectType                      objType, | 
 | 1188 |     VkObject                          object, | 
 | 1189 |     VkMemoryRequirements*             pRequirements) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1190 | { | 
 | 1191 |     // TODO : What to track here? | 
| Mark Lobodzinski | 942b172 | 2015-05-11 17:21:15 -0500 | [diff] [blame] | 1192 |     //   Could potentially save returned mem requirements and validate values passed into BindObjectMemory for this object | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1193 |     // From spec : The only objects that are guaranteed to have no external memory requirements are devices, queues, | 
 | 1194 |     //             command buffers, shaders and memory objects. | 
| Tony Barbour | 59a4732 | 2015-06-24 16:06:58 -0600 | [diff] [blame^] | 1195 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetObjectMemoryRequirements(device, objType, object, pRequirements); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1196 |     return result; | 
 | 1197 | } | 
 | 1198 |  | 
| Mark Lobodzinski | 942b172 | 2015-05-11 17:21:15 -0500 | [diff] [blame] | 1199 | VK_LAYER_EXPORT VkResult VKAPI vkBindObjectMemory( | 
 | 1200 |     VkDevice       device, | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1201 |     VkObjectType   objType, | 
 | 1202 |     VkObject       object, | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1203 |     VkDeviceMemory mem, | 
 | 1204 |     VkDeviceSize   offset) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1205 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1206 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->BindObjectMemory(device, objType, object, mem, offset); | 
| Mike Stroyan | b050c68 | 2015-04-17 12:36:38 -0600 | [diff] [blame] | 1207 |     loader_platform_thread_lock_mutex(&globalLock); | 
 | 1208 |     // Track objects tied to memory | 
| Courtney Goeltzenleuchter | 540d349 | 2015-06-13 21:37:34 -0600 | [diff] [blame] | 1209 |     set_object_binding(device, object, mem); | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 1210 |     print_object_list(device); | 
 | 1211 |     print_mem_list(device); | 
| Mike Stroyan | b050c68 | 2015-04-17 12:36:38 -0600 | [diff] [blame] | 1212 |     loader_platform_thread_unlock_mutex(&globalLock); | 
 | 1213 |     return result; | 
 | 1214 | } | 
 | 1215 |  | 
| Mark Lobodzinski | 942b172 | 2015-05-11 17:21:15 -0500 | [diff] [blame] | 1216 | VK_LAYER_EXPORT VkResult VKAPI vkQueueBindSparseBufferMemory( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1217 |     VkQueue        queue, | 
| Mark Lobodzinski | 942b172 | 2015-05-11 17:21:15 -0500 | [diff] [blame] | 1218 |     VkBuffer       buffer, | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1219 |     VkDeviceSize   rangeOffset, | 
 | 1220 |     VkDeviceSize   rangeSize, | 
 | 1221 |     VkDeviceMemory mem, | 
 | 1222 |     VkDeviceSize   memOffset) | 
| Mike Stroyan | b050c68 | 2015-04-17 12:36:38 -0600 | [diff] [blame] | 1223 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1224 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueBindSparseBufferMemory( | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 1225 |         queue, buffer, rangeOffset, rangeSize, mem, memOffset); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1226 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1227 |     // Track objects tied to memory | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1228 |     if (VK_FALSE == set_sparse_buffer_binding(buffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1229 |         log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_BUFFER, buffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1230 |                 "Unable to set object %p binding to mem obj %p", (void*)buffer, (void*)mem); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1231 |     } | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 1232 |     print_object_list(queue); | 
 | 1233 |     print_mem_list(queue); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1234 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1235 |     return result; | 
 | 1236 | } | 
 | 1237 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1238 | VK_LAYER_EXPORT VkResult VKAPI vkCreateFence( | 
 | 1239 |     VkDevice                 device, | 
 | 1240 |     const VkFenceCreateInfo *pCreateInfo, | 
 | 1241 |     VkFence                 *pFence) | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1242 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1243 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateFence(device, pCreateInfo, pFence); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1244 |     if (VK_SUCCESS == result) { | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1245 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1246 |         add_object_info(*pFence, pCreateInfo->sType, pCreateInfo, sizeof(VkFenceCreateInfo), "fence"); | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1247 |         loader_platform_thread_unlock_mutex(&globalLock); | 
 | 1248 |     } | 
 | 1249 |     return result; | 
 | 1250 | } | 
 | 1251 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1252 | VK_LAYER_EXPORT VkResult VKAPI vkResetFences( | 
 | 1253 |     VkDevice  device, | 
 | 1254 |     uint32_t  fenceCount, | 
| Courtney Goeltzenleuchter | 2bf8f90 | 2015-06-18 17:28:20 -0600 | [diff] [blame] | 1255 |     const VkFence  *pFences) | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 1256 | { | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 1257 |     /* | 
 | 1258 |      * TODO: Shouldn't we check for error conditions before passing down the chain? | 
 | 1259 |      * What if reason result is not VK_SUCCESS is something we could report as a validation error? | 
 | 1260 |      */ | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1261 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->ResetFences(device, fenceCount, pFences); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1262 |     if (VK_SUCCESS == result) { | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 1263 |         loader_platform_thread_lock_mutex(&globalLock); | 
 | 1264 |         // Reset fence state in fenceCreateInfo structure | 
 | 1265 |         for (uint32_t i = 0; i < fenceCount; i++) { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1266 |             MT_OBJ_INFO* pObjectInfo = get_object_info(pFences[i]); | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 1267 |             if (pObjectInfo != NULL) { | 
| Mark Lobodzinski | abc1bc4 | 2015-04-09 13:46:09 -0500 | [diff] [blame] | 1268 |                 // Validate fences in SIGNALED state | 
| Tobin Ehlis | b870cbb | 2015-04-15 07:46:12 -0600 | [diff] [blame] | 1269 |                 if (!(pObjectInfo->create_info.fence_create_info.flags & VK_FENCE_CREATE_SIGNALED_BIT)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1270 |                     log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_FENCE, pFences[i], 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", | 
 | 1271 |                             "Fence %p submitted to VkResetFences in UNSIGNALED STATE", pFences[i]); | 
| Tobin Ehlis | b870cbb | 2015-04-15 07:46:12 -0600 | [diff] [blame] | 1272 |                     result = VK_ERROR_INVALID_VALUE; | 
| Mark Lobodzinski | abc1bc4 | 2015-04-09 13:46:09 -0500 | [diff] [blame] | 1273 |                 } | 
 | 1274 |                 else { | 
 | 1275 |                     pObjectInfo->create_info.fence_create_info.flags = | 
| Tobin Ehlis | b870cbb | 2015-04-15 07:46:12 -0600 | [diff] [blame] | 1276 |                         static_cast<VkFenceCreateFlags>(pObjectInfo->create_info.fence_create_info.flags & ~VK_FENCE_CREATE_SIGNALED_BIT); | 
| Mark Lobodzinski | abc1bc4 | 2015-04-09 13:46:09 -0500 | [diff] [blame] | 1277 |                 } | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 1278 |             } | 
 | 1279 |         } | 
 | 1280 |         loader_platform_thread_unlock_mutex(&globalLock); | 
 | 1281 |     } | 
 | 1282 |     return result; | 
 | 1283 | } | 
 | 1284 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1285 | VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus( | 
 | 1286 |     VkDevice device, | 
 | 1287 |     VkFence  fence) | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1288 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1289 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetFenceStatus(device, fence); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1290 |     if (VK_SUCCESS == result) { | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 1291 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1292 |         update_fence_tracking(fence); | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 1293 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1294 |     } | 
 | 1295 |     return result; | 
 | 1296 | } | 
 | 1297 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1298 | VK_LAYER_EXPORT VkResult VKAPI vkWaitForFences( | 
 | 1299 |     VkDevice       device, | 
 | 1300 |     uint32_t       fenceCount, | 
 | 1301 |     const VkFence *pFences, | 
 | 1302 |     bool32_t       waitAll, | 
 | 1303 |     uint64_t       timeout) | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1304 | { | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 1305 |     // Verify fence status of submitted fences | 
 | 1306 |     for(uint32_t i = 0; i < fenceCount; i++) { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1307 |         MT_OBJ_INFO* pObjectInfo = get_object_info(pFences[i]); | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 1308 |         if (pObjectInfo != NULL) { | 
| Tobin Ehlis | b870cbb | 2015-04-15 07:46:12 -0600 | [diff] [blame] | 1309 |             if (pObjectInfo->create_info.fence_create_info.flags & VK_FENCE_CREATE_SIGNALED_BIT) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1310 |                 log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, pFences[i], 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", | 
 | 1311 |                         "VkWaitForFences specified fence %p already in SIGNALED state.", pFences[i]); | 
| Mark Lobodzinski | 148e158 | 2015-04-07 16:07:57 -0500 | [diff] [blame] | 1312 |             } | 
 | 1313 |         } | 
 | 1314 |     } | 
 | 1315 |  | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1316 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout); | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 1317 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 5093297 | 2015-04-02 20:49:09 -0500 | [diff] [blame] | 1318 |  | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1319 |     if (VK_SUCCESS == result) { | 
| Mark Lobodzinski | 5093297 | 2015-04-02 20:49:09 -0500 | [diff] [blame] | 1320 |         if (waitAll || fenceCount == 1) { // Clear all the fences | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1321 |             for(uint32_t i = 0; i < fenceCount; i++) { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1322 |                 update_fence_tracking(pFences[i]); | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1323 |             } | 
 | 1324 |         } | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1325 |     } | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 1326 |     loader_platform_thread_unlock_mutex(&globalLock); | 
 | 1327 |     return result; | 
 | 1328 | } | 
 | 1329 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1330 | VK_LAYER_EXPORT VkResult VKAPI vkQueueWaitIdle( | 
 | 1331 |     VkQueue queue) | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 1332 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1333 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueWaitIdle(queue); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1334 |     if (VK_SUCCESS == result) { | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 1335 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1336 |         retire_queue_fences(queue); | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 1337 |         loader_platform_thread_unlock_mutex(&globalLock); | 
 | 1338 |     } | 
 | 1339 |     return result; | 
 | 1340 | } | 
 | 1341 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1342 | VK_LAYER_EXPORT VkResult VKAPI vkDeviceWaitIdle( | 
 | 1343 |     VkDevice device) | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 1344 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1345 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->DeviceWaitIdle(device); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1346 |     if (VK_SUCCESS == result) { | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 1347 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1348 |         retire_device_fences(device); | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 1349 |         loader_platform_thread_unlock_mutex(&globalLock); | 
 | 1350 |     } | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1351 |     return result; | 
 | 1352 | } | 
 | 1353 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1354 | VK_LAYER_EXPORT VkResult VKAPI vkCreateEvent( | 
 | 1355 |     VkDevice                 device, | 
 | 1356 |     const VkEventCreateInfo *pCreateInfo, | 
 | 1357 |     VkEvent                 *pEvent) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1358 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1359 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateEvent(device, pCreateInfo, pEvent); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1360 |     if (VK_SUCCESS == result) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1361 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1362 |         add_object_info(*pEvent, pCreateInfo->sType, pCreateInfo, sizeof(VkEventCreateInfo), "event"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1363 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Mark Lobodzinski | c52b775 | 2015-02-18 16:38:17 -0600 | [diff] [blame] | 1364 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1365 |     return result; | 
 | 1366 | } | 
 | 1367 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1368 | VK_LAYER_EXPORT VkResult VKAPI vkCreateQueryPool( | 
 | 1369 |     VkDevice                     device, | 
 | 1370 |     const VkQueryPoolCreateInfo *pCreateInfo, | 
 | 1371 |     VkQueryPool                 *pQueryPool) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1372 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1373 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pQueryPool); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1374 |     if (VK_SUCCESS == result) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1375 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1376 |         add_object_info(*pQueryPool, pCreateInfo->sType, pCreateInfo, sizeof(VkQueryPoolCreateInfo), "query_pool"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1377 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Mark Lobodzinski | c52b775 | 2015-02-18 16:38:17 -0600 | [diff] [blame] | 1378 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1379 |     return result; | 
 | 1380 | } | 
 | 1381 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1382 | VK_LAYER_EXPORT VkResult VKAPI vkCreateBuffer( | 
 | 1383 |     VkDevice                  device, | 
 | 1384 |     const VkBufferCreateInfo *pCreateInfo, | 
 | 1385 |     VkBuffer                 *pBuffer) | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1386 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1387 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateBuffer(device, pCreateInfo, pBuffer); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1388 |     if (VK_SUCCESS == result) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1389 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1390 |         add_object_info(*pBuffer, pCreateInfo->sType, pCreateInfo, sizeof(VkBufferCreateInfo), "buffer"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1391 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Mark Lobodzinski | c52b775 | 2015-02-18 16:38:17 -0600 | [diff] [blame] | 1392 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1393 |     return result; | 
 | 1394 | } | 
 | 1395 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1396 | VK_LAYER_EXPORT VkResult VKAPI vkCreateBufferView( | 
 | 1397 |     VkDevice                      device, | 
 | 1398 |     const VkBufferViewCreateInfo *pCreateInfo, | 
 | 1399 |     VkBufferView                 *pView) | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1400 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1401 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateBufferView(device, pCreateInfo, pView); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1402 |     if (result == VK_SUCCESS) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1403 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1404 |         add_object_info(*pView, pCreateInfo->sType, pCreateInfo, sizeof(VkBufferViewCreateInfo), "buffer_view"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1405 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Mark Lobodzinski | c52b775 | 2015-02-18 16:38:17 -0600 | [diff] [blame] | 1406 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1407 |     return result; | 
 | 1408 | } | 
 | 1409 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1410 | VK_LAYER_EXPORT VkResult VKAPI vkCreateImage( | 
 | 1411 |     VkDevice                 device, | 
 | 1412 |     const VkImageCreateInfo *pCreateInfo, | 
 | 1413 |     VkImage                 *pImage) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1414 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1415 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateImage(device, pCreateInfo, pImage); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1416 |     if (VK_SUCCESS == result) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1417 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1418 |         add_object_info(*pImage, pCreateInfo->sType, pCreateInfo, sizeof(VkImageCreateInfo), "image"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1419 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 8be20fd | 2015-01-07 17:49:29 -0700 | [diff] [blame] | 1420 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1421 |     return result; | 
 | 1422 | } | 
 | 1423 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1424 | VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView( | 
 | 1425 |     VkDevice                     device, | 
 | 1426 |     const VkImageViewCreateInfo *pCreateInfo, | 
 | 1427 |     VkImageView                 *pView) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1428 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1429 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateImageView(device, pCreateInfo, pView); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1430 |     if (result == VK_SUCCESS) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1431 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1432 |         add_object_info(*pView, pCreateInfo->sType, pCreateInfo, sizeof(VkImageViewCreateInfo), "image_view"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1433 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 8be20fd | 2015-01-07 17:49:29 -0700 | [diff] [blame] | 1434 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1435 |     return result; | 
 | 1436 | } | 
 | 1437 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1438 | VK_LAYER_EXPORT VkResult VKAPI vkCreateColorAttachmentView( | 
 | 1439 |     VkDevice                               device, | 
 | 1440 |     const VkColorAttachmentViewCreateInfo *pCreateInfo, | 
 | 1441 |     VkColorAttachmentView                 *pView) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1442 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1443 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateColorAttachmentView(device, pCreateInfo, pView); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1444 |     if (result == VK_SUCCESS) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1445 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1446 |         add_object_info(*pView, pCreateInfo->sType, pCreateInfo, sizeof(VkColorAttachmentViewCreateInfo), "color_attachment_view"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1447 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 8be20fd | 2015-01-07 17:49:29 -0700 | [diff] [blame] | 1448 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1449 |     return result; | 
 | 1450 | } | 
 | 1451 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1452 | VK_LAYER_EXPORT VkResult VKAPI vkCreateDepthStencilView( | 
 | 1453 |     VkDevice                            device, | 
 | 1454 |     const VkDepthStencilViewCreateInfo *pCreateInfo, | 
 | 1455 |     VkDepthStencilView                 *pView) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1456 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1457 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateDepthStencilView(device, pCreateInfo, pView); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1458 |     if (result == VK_SUCCESS) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1459 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1460 |         add_object_info(*pView, pCreateInfo->sType, pCreateInfo, sizeof(VkDepthStencilViewCreateInfo), "ds_view"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1461 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 8be20fd | 2015-01-07 17:49:29 -0700 | [diff] [blame] | 1462 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1463 |     return result; | 
 | 1464 | } | 
 | 1465 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1466 | VK_LAYER_EXPORT VkResult VKAPI vkCreateShader( | 
 | 1467 |     VkDevice                  device, | 
 | 1468 |     const VkShaderCreateInfo *pCreateInfo, | 
 | 1469 |     VkShader                 *pShader) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1470 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1471 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateShader(device, pCreateInfo, pShader); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1472 |     return result; | 
 | 1473 | } | 
 | 1474 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1475 | VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipeline( | 
 | 1476 |     VkDevice                            device, | 
 | 1477 |     const VkGraphicsPipelineCreateInfo *pCreateInfo, | 
 | 1478 |     VkPipeline                         *pPipeline) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1479 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1480 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateGraphicsPipeline(device, pCreateInfo, pPipeline); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1481 |     if (result == VK_SUCCESS) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1482 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1483 |         add_object_info(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(VkGraphicsPipelineCreateInfo), "graphics_pipeline"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1484 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 8be20fd | 2015-01-07 17:49:29 -0700 | [diff] [blame] | 1485 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1486 |     return result; | 
 | 1487 | } | 
 | 1488 |  | 
| Courtney Goeltzenleuchter | fb4efc6 | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 1489 | VK_LAYER_EXPORT VkResult VKAPI vkCreateGraphicsPipelineDerivative( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1490 |     VkDevice                            device, | 
 | 1491 |     const VkGraphicsPipelineCreateInfo *pCreateInfo, | 
 | 1492 |     VkPipeline                          basePipeline, | 
 | 1493 |     VkPipeline                         *pPipeline) | 
| Courtney Goeltzenleuchter | 0d40f15 | 2015-03-25 15:37:49 -0600 | [diff] [blame] | 1494 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1495 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateGraphicsPipelineDerivative( | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 1496 |         device, pCreateInfo, basePipeline, pPipeline); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1497 |     if (result == VK_SUCCESS) { | 
| Courtney Goeltzenleuchter | 0d40f15 | 2015-03-25 15:37:49 -0600 | [diff] [blame] | 1498 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1499 |         add_object_info(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(VkGraphicsPipelineCreateInfo), "graphics_pipeline"); | 
| Courtney Goeltzenleuchter | 0d40f15 | 2015-03-25 15:37:49 -0600 | [diff] [blame] | 1500 |         loader_platform_thread_unlock_mutex(&globalLock); | 
 | 1501 |     } | 
 | 1502 |     return result; | 
 | 1503 | } | 
 | 1504 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1505 | VK_LAYER_EXPORT VkResult VKAPI vkCreateComputePipeline( | 
 | 1506 |     VkDevice                           device, | 
 | 1507 |     const VkComputePipelineCreateInfo *pCreateInfo, | 
 | 1508 |     VkPipeline                        *pPipeline) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1509 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1510 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateComputePipeline(device, pCreateInfo, pPipeline); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1511 |     if (result == VK_SUCCESS) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1512 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1513 |         add_object_info(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(VkComputePipelineCreateInfo), "compute_pipeline"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1514 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 8be20fd | 2015-01-07 17:49:29 -0700 | [diff] [blame] | 1515 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1516 |     return result; | 
 | 1517 | } | 
 | 1518 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1519 | VK_LAYER_EXPORT VkResult VKAPI vkCreateSampler( | 
 | 1520 |     VkDevice                   device, | 
 | 1521 |     const VkSamplerCreateInfo *pCreateInfo, | 
 | 1522 |     VkSampler                 *pSampler) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1523 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1524 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateSampler(device, pCreateInfo, pSampler); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1525 |     if (result == VK_SUCCESS) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1526 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1527 |         add_object_info(*pSampler, pCreateInfo->sType, pCreateInfo, sizeof(VkSamplerCreateInfo), "sampler"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1528 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 8be20fd | 2015-01-07 17:49:29 -0700 | [diff] [blame] | 1529 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1530 |     return result; | 
 | 1531 | } | 
 | 1532 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1533 | VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicViewportState( | 
 | 1534 |     VkDevice                          device, | 
 | 1535 |     const VkDynamicVpStateCreateInfo *pCreateInfo, | 
 | 1536 |     VkDynamicVpState                 *pState) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1537 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1538 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateDynamicViewportState(device, pCreateInfo, pState); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1539 |     if (result == VK_SUCCESS) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1540 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1541 |         add_object_info(*pState, pCreateInfo->sType, pCreateInfo, sizeof(VkDynamicVpStateCreateInfo), "viewport_state"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1542 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 8be20fd | 2015-01-07 17:49:29 -0700 | [diff] [blame] | 1543 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1544 |     return result; | 
 | 1545 | } | 
 | 1546 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1547 | VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicRasterState( | 
 | 1548 |     VkDevice                          device, | 
 | 1549 |     const VkDynamicRsStateCreateInfo *pCreateInfo, | 
 | 1550 |     VkDynamicRsState                 *pState) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1551 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1552 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateDynamicRasterState(device, pCreateInfo, pState); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1553 |     if (result == VK_SUCCESS) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1554 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1555 |         add_object_info(*pState, pCreateInfo->sType, pCreateInfo, sizeof(VkDynamicRsStateCreateInfo), "raster_state"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1556 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 8be20fd | 2015-01-07 17:49:29 -0700 | [diff] [blame] | 1557 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1558 |     return result; | 
 | 1559 | } | 
 | 1560 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1561 | VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicColorBlendState( | 
 | 1562 |     VkDevice                          device, | 
 | 1563 |     const VkDynamicCbStateCreateInfo *pCreateInfo, | 
 | 1564 |     VkDynamicCbState                 *pState) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1565 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1566 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateDynamicColorBlendState(device, pCreateInfo, pState); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1567 |     if (result == VK_SUCCESS) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1568 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1569 |         add_object_info(*pState, pCreateInfo->sType, pCreateInfo, sizeof(VkDynamicCbStateCreateInfo), "cb_state"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1570 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 8be20fd | 2015-01-07 17:49:29 -0700 | [diff] [blame] | 1571 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1572 |     return result; | 
 | 1573 | } | 
 | 1574 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1575 | VK_LAYER_EXPORT VkResult VKAPI vkCreateDynamicDepthStencilState( | 
 | 1576 |     VkDevice                          device, | 
 | 1577 |     const VkDynamicDsStateCreateInfo *pCreateInfo, | 
 | 1578 |     VkDynamicDsState                 *pState) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1579 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1580 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateDynamicDepthStencilState(device, pCreateInfo, pState); | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1581 |     if (result == VK_SUCCESS) { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1582 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1583 |         add_object_info(*pState, pCreateInfo->sType, pCreateInfo, sizeof(VkDynamicDsStateCreateInfo), "ds_state"); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1584 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 8be20fd | 2015-01-07 17:49:29 -0700 | [diff] [blame] | 1585 |     } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1586 |     return result; | 
 | 1587 | } | 
 | 1588 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1589 | VK_LAYER_EXPORT VkResult VKAPI vkCreateCommandBuffer( | 
 | 1590 |     VkDevice                     device, | 
 | 1591 |     const VkCmdBufferCreateInfo *pCreateInfo, | 
 | 1592 |     VkCmdBuffer                 *pCmdBuffer) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1593 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1594 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateCommandBuffer(device, pCreateInfo, pCmdBuffer); | 
| Mark Lobodzinski | 223ca20 | 2015-04-02 08:52:53 -0500 | [diff] [blame] | 1595 |     // At time of cmd buffer creation, create global cmd buffer info for the returned cmd buffer | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1596 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1597 |     if (*pCmdBuffer) | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1598 |         add_cmd_buf_info(*pCmdBuffer); | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 1599 |     printCBList(device); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1600 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1601 |     return result; | 
 | 1602 | } | 
 | 1603 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1604 | VK_LAYER_EXPORT VkResult VKAPI vkBeginCommandBuffer( | 
 | 1605 |     VkCmdBuffer                 cmdBuffer, | 
 | 1606 |     const VkCmdBufferBeginInfo *pBeginInfo) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1607 | { | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1608 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1609 |     // This implicitly resets the Cmd Buffer so make sure any fence is done and then clear memory references | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1610 |     if (!checkCBCompleted(cmdBuffer)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1611 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_RESET_CB_WHILE_IN_FLIGHT, "MEM", | 
 | 1612 |                 "Calling vkBeginCommandBuffer() on active CB %p before it has completed. " | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1613 |                      "You must check CB flag before this call.", cmdBuffer); | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1614 |     } | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1615 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1616 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->BeginCommandBuffer(cmdBuffer, pBeginInfo); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1617 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1618 |     clear_cmd_buf_and_mem_references(cmdBuffer); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1619 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1620 |     return result; | 
 | 1621 | } | 
 | 1622 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1623 | VK_LAYER_EXPORT VkResult VKAPI vkEndCommandBuffer( | 
 | 1624 |     VkCmdBuffer cmdBuffer) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1625 | { | 
 | 1626 |     // TODO : Anything to do here? | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1627 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->EndCommandBuffer(cmdBuffer); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1628 |     return result; | 
 | 1629 | } | 
 | 1630 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1631 | VK_LAYER_EXPORT VkResult VKAPI vkResetCommandBuffer( | 
 | 1632 |     VkCmdBuffer cmdBuffer) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1633 | { | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1634 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1635 |     // Verify that CB is complete (not in-flight) | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1636 |     if (!checkCBCompleted(cmdBuffer)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1637 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_RESET_CB_WHILE_IN_FLIGHT, "MEM", | 
 | 1638 |                 "Resetting CB %p before it has completed. You must check CB flag before " | 
| Mike Stroyan | 950496e | 2015-05-19 15:16:08 -0600 | [diff] [blame] | 1639 |                      "calling vkResetCommandBuffer().", cmdBuffer); | 
| Tobin Ehlis | c9dbcd5 | 2015-03-04 08:38:22 -0700 | [diff] [blame] | 1640 |     } | 
 | 1641 |     // Clear memory references as this point. | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1642 |     clear_cmd_buf_and_mem_references(cmdBuffer); | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1643 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1644 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->ResetCommandBuffer(cmdBuffer); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1645 |     return result; | 
 | 1646 | } | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1647 | // TODO : For any vkCmdBind* calls that include an object which has mem bound to it, | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1648 | //    need to account for that mem now having binding to given cmdBuffer | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1649 | VK_LAYER_EXPORT void VKAPI vkCmdBindPipeline( | 
 | 1650 |     VkCmdBuffer         cmdBuffer, | 
 | 1651 |     VkPipelineBindPoint pipelineBindPoint, | 
 | 1652 |     VkPipeline          pipeline) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1653 | { | 
| Tobin Ehlis | c145be8 | 2015-01-08 15:22:32 -0700 | [diff] [blame] | 1654 | #if 0 | 
 | 1655 |     // TODO : If memory bound to pipeline, then need to tie that mem to cmdBuffer | 
 | 1656 |     if (getPipeline(pipeline)) { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1657 |         MT_CB_INFO *pCBInfo = get_cmd_buf_info(cmdBuffer); | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 1658 |         if (pCBInfo) { | 
 | 1659 |             pCBInfo->pipelines[pipelineBindPoint] = pipeline; | 
| Tobin Ehlis | c145be8 | 2015-01-08 15:22:32 -0700 | [diff] [blame] | 1660 |         } else { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1661 |                     "Attempt to bind Pipeline %p to non-existant command buffer %p!", (void*)pipeline, cmdBuffer); | 
| Courtney Goeltzenleuchter | f579fa6 | 2015-06-10 17:39:03 -0600 | [diff] [blame] | 1662 |             layerCbMsg(VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_INVALID_CB, (char *) "DS", (char *) str); | 
| Tobin Ehlis | c145be8 | 2015-01-08 15:22:32 -0700 | [diff] [blame] | 1663 |         } | 
 | 1664 |     } | 
 | 1665 |     else { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1666 |                 "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline); | 
| Courtney Goeltzenleuchter | f579fa6 | 2015-06-10 17:39:03 -0600 | [diff] [blame] | 1667 |         layerCbMsg(VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_PIPELINE, pipeline, 0, MEMTRACK_INVALID_OBJECT, (char *) "DS", (char *) str); | 
| Tobin Ehlis | c145be8 | 2015-01-08 15:22:32 -0700 | [diff] [blame] | 1668 |     } | 
 | 1669 | #endif | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1670 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1671 | } | 
 | 1672 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1673 | VK_LAYER_EXPORT void VKAPI vkCmdBindDynamicStateObject( | 
 | 1674 |     VkCmdBuffer          cmdBuffer, | 
 | 1675 |     VkStateBindPoint     stateBindPoint, | 
 | 1676 |     VkDynamicStateObject state) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1677 | { | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 1678 |     MT_OBJ_INFO *pObjInfo; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1679 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1680 |     MT_CB_INFO *pCmdBuf = get_cmd_buf_info(cmdBuffer); | 
| Tobin Ehlis | c145be8 | 2015-01-08 15:22:32 -0700 | [diff] [blame] | 1681 |     if (!pCmdBuf) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1682 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_INVALID_CB, "MEM", | 
 | 1683 |                 "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer); | 
| Tobin Ehlis | c145be8 | 2015-01-08 15:22:32 -0700 | [diff] [blame] | 1684 |     } | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1685 |     pObjInfo = get_object_info(state); | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 1686 |     if (!pObjInfo) { | 
| Courtney Goeltzenleuchter | f579fa6 | 2015-06-10 17:39:03 -0600 | [diff] [blame] | 1687 |         /* TODO: put in real object type */ | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1688 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, (VkObjectType) 0, state, 0, MEMTRACK_INVALID_OBJECT, "MEM", | 
 | 1689 |                 "Unable to find dynamic state object %p, was it ever created?", (void*)state); | 
| Tobin Ehlis | c145be8 | 2015-01-08 15:22:32 -0700 | [diff] [blame] | 1690 |     } | 
| Mark Lobodzinski | 6434eff | 2015-03-31 16:05:35 -0500 | [diff] [blame] | 1691 |     pCmdBuf->pDynamicState[stateBindPoint] = pObjInfo; | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1692 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1693 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1694 | } | 
 | 1695 |  | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1696 | VK_LAYER_EXPORT void VKAPI vkCmdBindDescriptorSets( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1697 |     VkCmdBuffer            cmdBuffer, | 
 | 1698 |     VkPipelineBindPoint    pipelineBindPoint, | 
| Mark Lobodzinski | f2093b6 | 2015-06-15 13:21:21 -0600 | [diff] [blame] | 1699 |     VkPipelineLayout       layout, | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1700 |     uint32_t               firstSet, | 
 | 1701 |     uint32_t               setCount, | 
 | 1702 |     const VkDescriptorSet *pDescriptorSets, | 
 | 1703 |     uint32_t               dynamicOffsetCount, | 
 | 1704 |     const uint32_t        *pDynamicOffsets) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1705 | { | 
| Tobin Ehlis | c145be8 | 2015-01-08 15:22:32 -0700 | [diff] [blame] | 1706 |     // TODO : Somewhere need to verify that all textures referenced by shaders in DS are in some type of *SHADER_READ* state | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1707 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindDescriptorSets( | 
| Mark Lobodzinski | f2093b6 | 2015-06-15 13:21:21 -0600 | [diff] [blame] | 1708 |         cmdBuffer, pipelineBindPoint, layout, firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1709 | } | 
 | 1710 |  | 
| Courtney Goeltzenleuchter | f68ad72 | 2015-04-16 13:38:46 -0600 | [diff] [blame] | 1711 | VK_LAYER_EXPORT void VKAPI vkCmdBindVertexBuffers( | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1712 |     VkCmdBuffer         cmdBuffer, | 
 | 1713 |     uint32_t            startBinding, | 
 | 1714 |     uint32_t            bindingCount, | 
 | 1715 |     const VkBuffer     *pBuffers, | 
 | 1716 |     const VkDeviceSize *pOffsets) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1717 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1718 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindVertexBuffers(cmdBuffer, startBinding, bindingCount, pBuffers, pOffsets); | 
| Chia-I Wu | 1915682 | 2015-01-05 13:42:56 +0800 | [diff] [blame] | 1719 | } | 
 | 1720 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1721 | VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer( | 
 | 1722 |     VkCmdBuffer  cmdBuffer, | 
 | 1723 |     VkBuffer     buffer, | 
 | 1724 |     VkDeviceSize offset, | 
 | 1725 |     VkIndexType  indexType) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1726 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1727 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1728 | } | 
 | 1729 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1730 | VK_LAYER_EXPORT void VKAPI vkCmdDrawIndirect( | 
 | 1731 |     VkCmdBuffer   cmdBuffer, | 
 | 1732 |      VkBuffer     buffer, | 
 | 1733 |      VkDeviceSize offset, | 
 | 1734 |      uint32_t     count, | 
 | 1735 |      uint32_t     stride) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1736 | { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1737 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1738 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, buffer); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1739 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1740 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1741 |                 "In vkCmdDrawIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1742 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1743 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1744 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1745 | } | 
 | 1746 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1747 | VK_LAYER_EXPORT void VKAPI vkCmdDrawIndexedIndirect( | 
 | 1748 |     VkCmdBuffer  cmdBuffer, | 
 | 1749 |     VkBuffer     buffer, | 
 | 1750 |     VkDeviceSize offset, | 
 | 1751 |     uint32_t     count, | 
 | 1752 |     uint32_t     stride) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1753 | { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1754 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1755 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, buffer); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1756 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1757 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1758 |                 "In vkCmdDrawIndexedIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1759 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1760 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1761 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1762 | } | 
 | 1763 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1764 | VK_LAYER_EXPORT void VKAPI vkCmdDispatchIndirect( | 
 | 1765 |     VkCmdBuffer  cmdBuffer, | 
 | 1766 |     VkBuffer     buffer, | 
 | 1767 |     VkDeviceSize offset) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1768 | { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1769 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1770 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, buffer); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1771 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1772 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1773 |                 "In vkCmdDispatchIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1774 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1775 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1776 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdDispatchIndirect(cmdBuffer, buffer, offset); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1777 | } | 
 | 1778 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1779 | VK_LAYER_EXPORT void VKAPI vkCmdCopyBuffer( | 
 | 1780 |     VkCmdBuffer         cmdBuffer, | 
 | 1781 |     VkBuffer            srcBuffer, | 
 | 1782 |     VkBuffer            destBuffer, | 
 | 1783 |     uint32_t            regionCount, | 
 | 1784 |     const VkBufferCopy *pRegions) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1785 | { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1786 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1787 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, srcBuffer); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1788 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1789 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1790 |                 "In vkCmdCopyBuffer() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1791 |     } | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1792 |     mem = get_mem_binding_from_object(cmdBuffer, destBuffer); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1793 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1794 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1795 |                 "In vkCmdCopyBuffer() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1796 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1797 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1798 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1799 | } | 
 | 1800 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1801 | VK_LAYER_EXPORT void VKAPI vkCmdCopyImage( | 
 | 1802 |     VkCmdBuffer        cmdBuffer, | 
 | 1803 |     VkImage            srcImage, | 
 | 1804 |     VkImageLayout      srcImageLayout, | 
 | 1805 |     VkImage            destImage, | 
 | 1806 |     VkImageLayout      destImageLayout, | 
 | 1807 |     uint32_t           regionCount, | 
 | 1808 |     const VkImageCopy *pRegions) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1809 | { | 
 | 1810 |     // TODO : Each image will have mem mapping so track them | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1811 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdCopyImage( | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 1812 |         cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1813 | } | 
 | 1814 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1815 | VK_LAYER_EXPORT void VKAPI vkCmdBlitImage( | 
 | 1816 |     VkCmdBuffer        cmdBuffer, | 
 | 1817 |     VkImage            srcImage, | 
 | 1818 |     VkImageLayout      srcImageLayout, | 
 | 1819 |     VkImage            destImage, | 
 | 1820 |     VkImageLayout      destImageLayout, | 
 | 1821 |     uint32_t           regionCount, | 
| Mark Lobodzinski | ee5eef1 | 2015-05-22 14:43:25 -0500 | [diff] [blame] | 1822 |     const VkImageBlit *pRegions, | 
 | 1823 |     VkTexFilter        filter) | 
| Courtney Goeltzenleuchter | 89299fa | 2015-03-08 17:02:18 -0600 | [diff] [blame] | 1824 | { | 
 | 1825 |     // TODO : Each image will have mem mapping so track them | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1826 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBlitImage( | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 1827 |         cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions, filter); | 
| Courtney Goeltzenleuchter | 89299fa | 2015-03-08 17:02:18 -0600 | [diff] [blame] | 1828 | } | 
 | 1829 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1830 | VK_LAYER_EXPORT void VKAPI vkCmdCopyBufferToImage( | 
 | 1831 |     VkCmdBuffer              cmdBuffer, | 
 | 1832 |     VkBuffer                 srcBuffer, | 
 | 1833 |     VkImage                  destImage, | 
 | 1834 |     VkImageLayout            destImageLayout, | 
 | 1835 |     uint32_t                 regionCount, | 
 | 1836 |     const VkBufferImageCopy *pRegions) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1837 | { | 
 | 1838 |     // TODO : Track this | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1839 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1840 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, destImage); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1841 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1842 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1843 |                 "In vkCmdCopyMemoryToImage() call unable to update binding of destImage buffer %p to cmdBuffer %p", destImage, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1844 |     } | 
| Mark Lobodzinski | c52b775 | 2015-02-18 16:38:17 -0600 | [diff] [blame] | 1845 |  | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1846 |     mem = get_mem_binding_from_object(cmdBuffer, srcBuffer); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1847 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1848 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1849 |                 "In vkCmdCopyMemoryToImage() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1850 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1851 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1852 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdCopyBufferToImage( | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 1853 |         cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1854 | } | 
 | 1855 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1856 | VK_LAYER_EXPORT void VKAPI vkCmdCopyImageToBuffer( | 
 | 1857 |     VkCmdBuffer              cmdBuffer, | 
 | 1858 |     VkImage                  srcImage, | 
 | 1859 |     VkImageLayout            srcImageLayout, | 
 | 1860 |     VkBuffer                 destBuffer, | 
 | 1861 |     uint32_t                 regionCount, | 
 | 1862 |     const VkBufferImageCopy *pRegions) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1863 | { | 
 | 1864 |     // TODO : Track this | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1865 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1866 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, srcImage); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1867 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1868 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1869 |                 "In vkCmdCopyImageToMemory() call unable to update binding of srcImage buffer %p to cmdBuffer %p", srcImage, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1870 |     } | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1871 |     mem = get_mem_binding_from_object(cmdBuffer, destBuffer); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1872 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1873 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1874 |                 "In vkCmdCopyImageToMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1875 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1876 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1877 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdCopyImageToBuffer( | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 1878 |         cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1879 | } | 
 | 1880 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1881 | VK_LAYER_EXPORT void VKAPI vkCmdUpdateBuffer( | 
 | 1882 |     VkCmdBuffer     cmdBuffer, | 
 | 1883 |     VkBuffer        destBuffer, | 
 | 1884 |     VkDeviceSize    destOffset, | 
 | 1885 |     VkDeviceSize    dataSize, | 
 | 1886 |     const uint32_t *pData) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1887 | { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1888 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1889 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, destBuffer); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1890 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1891 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1892 |                 "In vkCmdUpdateMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1893 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1894 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1895 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1896 | } | 
 | 1897 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1898 | VK_LAYER_EXPORT void VKAPI vkCmdFillBuffer( | 
 | 1899 |     VkCmdBuffer  cmdBuffer, | 
 | 1900 |     VkBuffer     destBuffer, | 
 | 1901 |     VkDeviceSize destOffset, | 
 | 1902 |     VkDeviceSize fillSize, | 
 | 1903 |     uint32_t     data) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1904 | { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1905 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1906 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, destBuffer); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1907 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1908 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1909 |                 "In vkCmdFillMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1910 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1911 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1912 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1913 | } | 
 | 1914 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1915 | VK_LAYER_EXPORT void VKAPI vkCmdClearColorImage( | 
 | 1916 |     VkCmdBuffer                    cmdBuffer, | 
 | 1917 |     VkImage                        image, | 
 | 1918 |     VkImageLayout                  imageLayout, | 
| Courtney Goeltzenleuchter | d7a5cff | 2015-04-23 17:49:22 -0600 | [diff] [blame] | 1919 |     const VkClearColor            *pColor, | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1920 |     uint32_t                       rangeCount, | 
 | 1921 |     const VkImageSubresourceRange *pRanges) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1922 | { | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1923 |     // TODO : Verify memory is in VK_IMAGE_STATE_CLEAR state | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1924 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1925 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, image); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1926 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1927 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1928 |                 "In vkCmdClearColorImage() call unable to update binding of image buffer %p to cmdBuffer %p", image, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1929 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1930 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1931 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdClearColorImage(cmdBuffer, image, imageLayout, pColor, rangeCount, pRanges); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1932 | } | 
 | 1933 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1934 | VK_LAYER_EXPORT void VKAPI vkCmdClearDepthStencil( | 
 | 1935 |     VkCmdBuffer                    cmdBuffer, | 
 | 1936 |     VkImage                        image, | 
 | 1937 |     VkImageLayout                  imageLayout, | 
 | 1938 |     float                          depth, | 
 | 1939 |     uint32_t                       stencil, | 
 | 1940 |     uint32_t                       rangeCount, | 
 | 1941 |     const VkImageSubresourceRange *pRanges) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1942 | { | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 1943 |     // TODO : Verify memory is in VK_IMAGE_STATE_CLEAR state | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1944 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1945 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, image); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1946 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1947 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1948 |                 "In vkCmdClearDepthStencil() call unable to update binding of image buffer %p to cmdBuffer %p", image, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1949 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1950 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1951 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdClearDepthStencil( | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 1952 |         cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1953 | } | 
 | 1954 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1955 | VK_LAYER_EXPORT void VKAPI vkCmdResolveImage( | 
 | 1956 |     VkCmdBuffer           cmdBuffer, | 
 | 1957 |     VkImage               srcImage, | 
 | 1958 |     VkImageLayout         srcImageLayout, | 
 | 1959 |     VkImage               destImage, | 
 | 1960 |     VkImageLayout         destImageLayout, | 
 | 1961 |     uint32_t              regionCount, | 
 | 1962 |     const VkImageResolve *pRegions) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1963 | { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1964 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1965 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, srcImage); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1966 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1967 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1968 |                 "In vkCmdResolveImage() call unable to update binding of srcImage buffer %p to cmdBuffer %p", srcImage, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1969 |     } | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1970 |     mem = get_mem_binding_from_object(cmdBuffer, destImage); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1971 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1972 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1973 |                 "In vkCmdResolveImage() call unable to update binding of destImage buffer %p to cmdBuffer %p", destImage, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1974 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1975 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1976 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdResolveImage( | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 1977 |         cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1978 | } | 
 | 1979 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1980 | VK_LAYER_EXPORT void VKAPI vkCmdBeginQuery( | 
 | 1981 |     VkCmdBuffer cmdBuffer, | 
 | 1982 |     VkQueryPool queryPool, | 
 | 1983 |     uint32_t    slot, | 
 | 1984 |     VkFlags     flags) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1985 | { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1986 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 1987 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, queryPool); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 1988 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 1989 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 1990 |                 "In vkCmdBeginQuery() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 1991 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 1992 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 1993 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdBeginQuery(cmdBuffer, queryPool, slot, flags); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 1994 | } | 
 | 1995 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 1996 | VK_LAYER_EXPORT void VKAPI vkCmdEndQuery( | 
 | 1997 |     VkCmdBuffer cmdBuffer, | 
 | 1998 |     VkQueryPool queryPool, | 
 | 1999 |     uint32_t    slot) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2000 | { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 2001 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 2002 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, queryPool); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 2003 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 2004 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 2005 |                 "In vkCmdEndQuery() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 2006 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 2007 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 2008 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdEndQuery(cmdBuffer, queryPool, slot); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2009 | } | 
 | 2010 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 2011 | VK_LAYER_EXPORT void VKAPI vkCmdResetQueryPool( | 
 | 2012 |     VkCmdBuffer cmdBuffer, | 
 | 2013 |     VkQueryPool queryPool, | 
 | 2014 |     uint32_t    startQuery, | 
 | 2015 |     uint32_t    queryCount) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2016 | { | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 2017 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Jon Ashburn | a79828d | 2015-06-18 17:12:57 -0600 | [diff] [blame] | 2018 |     VkDeviceMemory mem = get_mem_binding_from_object(cmdBuffer, queryPool); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 2019 |     if (VK_FALSE == update_cmd_buf_and_mem_references(cmdBuffer, mem)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 2020 |         log_msg(mdd(cmdBuffer), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 2021 |                 "In vkCmdResetQueryPool() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 2022 |     } | 
| Mark Lobodzinski | 93f494b | 2015-03-02 20:23:52 -0600 | [diff] [blame] | 2023 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 2024 |     get_dispatch_table(mem_tracker_device_table_map, cmdBuffer)->CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2025 | } | 
 | 2026 |  | 
| Courtney Goeltzenleuchter | f579fa6 | 2015-06-10 17:39:03 -0600 | [diff] [blame] | 2027 | VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback( | 
 | 2028 |         VkInstance instance, | 
 | 2029 |         VkFlags msgFlags, | 
 | 2030 |         const PFN_vkDbgMsgCallback pfnMsgCallback, | 
 | 2031 |         void* pUserData, | 
 | 2032 |         VkDbgMsgCallback* pMsgCallback) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2033 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 2034 |     VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, instance); | 
 | 2035 |     VkResult res =  pTable->DbgCreateMsgCallback(instance, msgFlags, pfnMsgCallback, pUserData, pMsgCallback); | 
 | 2036 |     if (res == VK_SUCCESS) { | 
 | 2037 |         layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); | 
 | 2038 |  | 
 | 2039 |         res = layer_create_msg_callback(my_data->report_data, msgFlags, pfnMsgCallback, pUserData, pMsgCallback); | 
 | 2040 |     } | 
 | 2041 |     return res; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2042 | } | 
 | 2043 |  | 
| Courtney Goeltzenleuchter | f579fa6 | 2015-06-10 17:39:03 -0600 | [diff] [blame] | 2044 | VK_LAYER_EXPORT VkResult VKAPI vkDbgDestroyMsgCallback( | 
 | 2045 |         VkInstance instance, | 
 | 2046 |         VkDbgMsgCallback msgCallback) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2047 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 2048 |     VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, instance); | 
 | 2049 |     VkResult res =  pTable->DbgDestroyMsgCallback(instance, msgCallback); | 
 | 2050 |  | 
 | 2051 |     layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); | 
 | 2052 |     layer_destroy_msg_callback(my_data->report_data, msgCallback); | 
 | 2053 |  | 
 | 2054 |     return res; | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2055 | } | 
 | 2056 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 2057 | VK_LAYER_EXPORT VkResult VKAPI vkCreateSwapChainWSI( | 
 | 2058 |     VkDevice                        device, | 
 | 2059 |     const VkSwapChainCreateInfoWSI *pCreateInfo, | 
 | 2060 |     VkSwapChainWSI                 *pSwapChain) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2061 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 2062 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->CreateSwapChainWSI(device, pCreateInfo, pSwapChain); | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2063 |  | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 2064 |     if (VK_SUCCESS == result) { | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2065 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 2066 |         add_swap_chain_info(*pSwapChain); | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2067 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | cd9223b | 2014-11-19 16:19:28 -0700 | [diff] [blame] | 2068 |     } | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2069 |  | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2070 |     return result; | 
 | 2071 | } | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 2072 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 2073 | VK_LAYER_EXPORT VkResult VKAPI vkDestroySwapChainWSI( | 
 | 2074 |     VkSwapChainWSI swapChain) | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 2075 | { | 
 | 2076 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2077 |  | 
 | 2078 |     if (swapChainMap.find(swapChain) != swapChainMap.end()) { | 
 | 2079 |         MT_SWAP_CHAIN_INFO* pInfo = swapChainMap[swapChain]; | 
 | 2080 |  | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 2081 |         if (pInfo->images.size() > 0) { | 
 | 2082 |             for (std::vector<VkSwapChainImageInfoWSI>::const_iterator it = pInfo->images.begin(); | 
 | 2083 |                  it != pInfo->images.end(); it++) { | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 2084 |                 clear_object_binding(it->image); | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 2085 |                 freeMemObjInfo(swapChain, it->memory, true); | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2086 |  | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 2087 |                 objectMap.erase(it->image); | 
 | 2088 |             } | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2089 |         } | 
 | 2090 |  | 
 | 2091 |         delete pInfo; | 
 | 2092 |         swapChainMap.erase(swapChain); | 
 | 2093 |     } | 
 | 2094 |  | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 2095 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2096 |  | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 2097 |     return get_dispatch_table(mem_tracker_device_table_map, swapChain)->DestroySwapChainWSI(swapChain); | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2098 | } | 
 | 2099 |  | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 2100 | VK_LAYER_EXPORT VkResult VKAPI vkGetSwapChainInfoWSI( | 
 | 2101 |     VkSwapChainWSI          swapChain, | 
 | 2102 |     VkSwapChainInfoTypeWSI  infoType, | 
 | 2103 |     size_t                 *pDataSize, | 
 | 2104 |     void                   *pData) | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2105 | { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 2106 |     VkResult result = get_dispatch_table(mem_tracker_device_table_map, swapChain)->GetSwapChainInfoWSI(swapChain, infoType, pDataSize, pData); | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2107 |  | 
 | 2108 |     if (infoType == VK_SWAP_CHAIN_INFO_TYPE_PERSISTENT_IMAGES_WSI && result == VK_SUCCESS) { | 
 | 2109 |         const size_t count = *pDataSize / sizeof(VkSwapChainImageInfoWSI); | 
 | 2110 |         MT_SWAP_CHAIN_INFO *pInfo = swapChainMap[swapChain]; | 
 | 2111 |  | 
 | 2112 |         if (pInfo->images.empty()) { | 
 | 2113 |             pInfo->images.resize(count); | 
 | 2114 |             memcpy(&pInfo->images[0], pData, sizeof(pInfo->images[0]) * count); | 
 | 2115 |  | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 2116 |             if (pInfo->images.size() > 0) { | 
 | 2117 |                 for (std::vector<VkSwapChainImageInfoWSI>::const_iterator it = pInfo->images.begin(); | 
 | 2118 |                      it != pInfo->images.end(); it++) { | 
 | 2119 |                     // Add image object, then insert the new Mem Object and then bind it to created image | 
| Mark Lobodzinski | 944aab1 | 2015-06-05 13:59:04 -0500 | [diff] [blame] | 2120 |                     add_object_info(it->image, VK_STRUCTURE_TYPE_MAX_ENUM, &pInfo->createInfo, sizeof(pInfo->createInfo), "persistent_image"); | 
| Courtney Goeltzenleuchter | 7dcc6a7 | 2015-06-11 16:01:11 -0600 | [diff] [blame] | 2121 |                     add_mem_obj_info(swapChain, it->memory, NULL); | 
| Courtney Goeltzenleuchter | 540d349 | 2015-06-13 21:37:34 -0600 | [diff] [blame] | 2122 |                     if (VK_FALSE == set_object_binding(swapChain, it->image, it->memory)) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 2123 |                         log_msg(mdd(swapChain), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE, it->image, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", | 
 | 2124 |                                 "In vkGetSwapChainInfoWSI(), unable to set image %p binding to mem obj %p", (void*)it->image, (void*)it->memory); | 
| David Pinedo | d8f83d8 | 2015-04-27 16:36:17 -0600 | [diff] [blame] | 2125 |                     } | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2126 |                 } | 
 | 2127 |             } | 
 | 2128 |         } else { | 
 | 2129 |             const bool mismatch = (pInfo->images.size() != count || | 
 | 2130 |                     memcmp(&pInfo->images[0], pData, sizeof(pInfo->images[0]) * count)); | 
 | 2131 |  | 
 | 2132 |             if (mismatch) { | 
| Courtney Goeltzenleuchter | b9f0bf3 | 2015-06-14 09:50:18 -0600 | [diff] [blame] | 2133 |                 log_msg(mdd(swapChain), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_SWAP_CHAIN_WSI, (VkObject) swapChain, 0, MEMTRACK_NONE, "SWAP_CHAIN", | 
 | 2134 |                         "vkGetSwapChainInfoWSI(%p, VK_SWAP_CHAIN_INFO_TYPE_PERSISTENT_IMAGES_WSI) returned mismatching data", swapChain); | 
| Chia-I Wu | f869338 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 2135 |             } | 
 | 2136 |         } | 
 | 2137 |     } | 
 | 2138 |  | 
| Mark Lobodzinski | e61ebe7 | 2015-03-17 10:53:12 -0500 | [diff] [blame] | 2139 |     return result; | 
 | 2140 | } | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2141 |  | 
| Jon Ashburn | 8d1b0b5 | 2015-05-18 13:20:15 -0600 | [diff] [blame] | 2142 | VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr( | 
 | 2143 |     VkDevice         dev, | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 2144 |     const char       *funcName) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2145 | { | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 2146 |     void *fptr; | 
 | 2147 |  | 
| Jon Ashburn | 8d1b0b5 | 2015-05-18 13:20:15 -0600 | [diff] [blame] | 2148 |     if (dev == NULL) { | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2149 |         return NULL; | 
| Mark Lobodzinski | b1567a0 | 2015-04-21 15:33:04 -0600 | [diff] [blame] | 2150 |     } | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 2151 |  | 
| Jon Ashburn | 8fd0825 | 2015-05-28 16:25:02 -0600 | [diff] [blame] | 2152 |     /* loader uses this to force layer initialization; device object is wrapped */ | 
 | 2153 |     if (!strcmp(funcName, "vkGetDeviceProcAddr")) { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 2154 |         initDeviceTable(mem_tracker_device_table_map, (const VkBaseLayerObject *) dev); | 
| Jon Ashburn | 8d1b0b5 | 2015-05-18 13:20:15 -0600 | [diff] [blame] | 2155 |         return (void *) vkGetDeviceProcAddr; | 
| Jon Ashburn | 8fd0825 | 2015-05-28 16:25:02 -0600 | [diff] [blame] | 2156 |     } | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 2157 |     if (!strcmp(funcName, "vkDestroyDevice")) | 
 | 2158 |         return (void*) vkDestroyDevice; | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 2159 |     if (!strcmp(funcName, "vkQueueSubmit")) | 
 | 2160 |         return (void*) vkQueueSubmit; | 
 | 2161 |     if (!strcmp(funcName, "vkAllocMemory")) | 
 | 2162 |         return (void*) vkAllocMemory; | 
 | 2163 |     if (!strcmp(funcName, "vkFreeMemory")) | 
 | 2164 |         return (void*) vkFreeMemory; | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 2165 |     if (!strcmp(funcName, "vkMapMemory")) | 
 | 2166 |         return (void*) vkMapMemory; | 
 | 2167 |     if (!strcmp(funcName, "vkUnmapMemory")) | 
 | 2168 |         return (void*) vkUnmapMemory; | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 2169 |     if (!strcmp(funcName, "vkDestroyObject")) | 
 | 2170 |         return (void*) vkDestroyObject; | 
| Tony Barbour | 59a4732 | 2015-06-24 16:06:58 -0600 | [diff] [blame^] | 2171 |     if (!strcmp(funcName, "vkGetObjectMemoryRequirements")) | 
 | 2172 |         return (void*) vkGetObjectMemoryRequirements; | 
| Mark Lobodzinski | 942b172 | 2015-05-11 17:21:15 -0500 | [diff] [blame] | 2173 |     if (!strcmp(funcName, "vkBindObjectMemory")) | 
 | 2174 |         return (void*) vkBindObjectMemory; | 
 | 2175 |     if (!strcmp(funcName, "vkQueueBindSparseBufferMemory")) | 
 | 2176 |         return (void*) vkQueueBindSparseBufferMemory; | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 2177 |     if (!strcmp(funcName, "vkCreateFence")) | 
 | 2178 |         return (void*) vkCreateFence; | 
 | 2179 |     if (!strcmp(funcName, "vkGetFenceStatus")) | 
 | 2180 |         return (void*) vkGetFenceStatus; | 
 | 2181 |     if (!strcmp(funcName, "vkResetFences")) | 
 | 2182 |         return (void*) vkResetFences; | 
 | 2183 |     if (!strcmp(funcName, "vkWaitForFences")) | 
 | 2184 |         return (void*) vkWaitForFences; | 
 | 2185 |     if (!strcmp(funcName, "vkQueueWaitIdle")) | 
 | 2186 |         return (void*) vkQueueWaitIdle; | 
 | 2187 |     if (!strcmp(funcName, "vkDeviceWaitIdle")) | 
 | 2188 |         return (void*) vkDeviceWaitIdle; | 
 | 2189 |     if (!strcmp(funcName, "vkCreateEvent")) | 
 | 2190 |         return (void*) vkCreateEvent; | 
 | 2191 |     if (!strcmp(funcName, "vkCreateQueryPool")) | 
 | 2192 |         return (void*) vkCreateQueryPool; | 
 | 2193 |     if (!strcmp(funcName, "vkCreateBuffer")) | 
 | 2194 |         return (void*) vkCreateBuffer; | 
 | 2195 |     if (!strcmp(funcName, "vkCreateBufferView")) | 
 | 2196 |         return (void*) vkCreateBufferView; | 
 | 2197 |     if (!strcmp(funcName, "vkCreateImage")) | 
 | 2198 |         return (void*) vkCreateImage; | 
 | 2199 |     if (!strcmp(funcName, "vkCreateImageView")) | 
 | 2200 |         return (void*) vkCreateImageView; | 
 | 2201 |     if (!strcmp(funcName, "vkCreateColorAttachmentView")) | 
 | 2202 |         return (void*) vkCreateColorAttachmentView; | 
 | 2203 |     if (!strcmp(funcName, "vkCreateDepthStencilView")) | 
 | 2204 |         return (void*) vkCreateDepthStencilView; | 
 | 2205 |     if (!strcmp(funcName, "vkCreateShader")) | 
 | 2206 |         return (void*) vkCreateShader; | 
 | 2207 |     if (!strcmp(funcName, "vkCreateGraphicsPipeline")) | 
 | 2208 |         return (void*) vkCreateGraphicsPipeline; | 
 | 2209 |     if (!strcmp(funcName, "vkCreateGraphicsPipelineDerivative")) | 
 | 2210 |         return (void*) vkCreateGraphicsPipelineDerivative; | 
 | 2211 |     if (!strcmp(funcName, "vkCreateComputePipeline")) | 
 | 2212 |         return (void*) vkCreateComputePipeline; | 
 | 2213 |     if (!strcmp(funcName, "vkCreateSampler")) | 
 | 2214 |         return (void*) vkCreateSampler; | 
 | 2215 |     if (!strcmp(funcName, "vkCreateDynamicViewportState")) | 
 | 2216 |         return (void*) vkCreateDynamicViewportState; | 
 | 2217 |     if (!strcmp(funcName, "vkCreateDynamicRasterState")) | 
 | 2218 |         return (void*) vkCreateDynamicRasterState; | 
 | 2219 |     if (!strcmp(funcName, "vkCreateDynamicColorBlendState")) | 
 | 2220 |         return (void*) vkCreateDynamicColorBlendState; | 
 | 2221 |     if (!strcmp(funcName, "vkCreateDynamicDepthStencilState")) | 
 | 2222 |         return (void*) vkCreateDynamicDepthStencilState; | 
 | 2223 |     if (!strcmp(funcName, "vkCreateCommandBuffer")) | 
 | 2224 |         return (void*) vkCreateCommandBuffer; | 
 | 2225 |     if (!strcmp(funcName, "vkBeginCommandBuffer")) | 
 | 2226 |         return (void*) vkBeginCommandBuffer; | 
 | 2227 |     if (!strcmp(funcName, "vkEndCommandBuffer")) | 
 | 2228 |         return (void*) vkEndCommandBuffer; | 
 | 2229 |     if (!strcmp(funcName, "vkResetCommandBuffer")) | 
 | 2230 |         return (void*) vkResetCommandBuffer; | 
 | 2231 |     if (!strcmp(funcName, "vkCmdBindPipeline")) | 
 | 2232 |         return (void*) vkCmdBindPipeline; | 
 | 2233 |     if (!strcmp(funcName, "vkCmdBindDynamicStateObject")) | 
 | 2234 |         return (void*) vkCmdBindDynamicStateObject; | 
 | 2235 |     if (!strcmp(funcName, "vkCmdBindDescriptorSets")) | 
 | 2236 |         return (void*) vkCmdBindDescriptorSets; | 
| Courtney Goeltzenleuchter | f68ad72 | 2015-04-16 13:38:46 -0600 | [diff] [blame] | 2237 |     if (!strcmp(funcName, "vkCmdBindVertexBuffers")) | 
 | 2238 |         return (void*) vkCmdBindVertexBuffers; | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 2239 |     if (!strcmp(funcName, "vkCmdBindIndexBuffer")) | 
 | 2240 |         return (void*) vkCmdBindIndexBuffer; | 
 | 2241 |     if (!strcmp(funcName, "vkCmdDrawIndirect")) | 
 | 2242 |         return (void*) vkCmdDrawIndirect; | 
 | 2243 |     if (!strcmp(funcName, "vkCmdDrawIndexedIndirect")) | 
 | 2244 |         return (void*) vkCmdDrawIndexedIndirect; | 
 | 2245 |     if (!strcmp(funcName, "vkCmdDispatchIndirect")) | 
 | 2246 |         return (void*) vkCmdDispatchIndirect; | 
 | 2247 |     if (!strcmp(funcName, "vkCmdCopyBuffer")) | 
 | 2248 |         return (void*) vkCmdCopyBuffer; | 
 | 2249 |     if (!strcmp(funcName, "vkCmdCopyImage")) | 
 | 2250 |         return (void*) vkCmdCopyImage; | 
 | 2251 |     if (!strcmp(funcName, "vkCmdCopyBufferToImage")) | 
 | 2252 |         return (void*) vkCmdCopyBufferToImage; | 
 | 2253 |     if (!strcmp(funcName, "vkCmdCopyImageToBuffer")) | 
 | 2254 |         return (void*) vkCmdCopyImageToBuffer; | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 2255 |     if (!strcmp(funcName, "vkCmdUpdateBuffer")) | 
 | 2256 |         return (void*) vkCmdUpdateBuffer; | 
 | 2257 |     if (!strcmp(funcName, "vkCmdFillBuffer")) | 
 | 2258 |         return (void*) vkCmdFillBuffer; | 
 | 2259 |     if (!strcmp(funcName, "vkCmdClearColorImage")) | 
 | 2260 |         return (void*) vkCmdClearColorImage; | 
 | 2261 |     if (!strcmp(funcName, "vkCmdClearDepthStencil")) | 
 | 2262 |         return (void*) vkCmdClearDepthStencil; | 
 | 2263 |     if (!strcmp(funcName, "vkCmdResolveImage")) | 
 | 2264 |         return (void*) vkCmdResolveImage; | 
 | 2265 |     if (!strcmp(funcName, "vkCmdBeginQuery")) | 
 | 2266 |         return (void*) vkCmdBeginQuery; | 
 | 2267 |     if (!strcmp(funcName, "vkCmdEndQuery")) | 
 | 2268 |         return (void*) vkCmdEndQuery; | 
 | 2269 |     if (!strcmp(funcName, "vkCmdResetQueryPool")) | 
 | 2270 |         return (void*) vkCmdResetQueryPool; | 
| Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 2271 |     if (!strcmp(funcName, "vkGetDeviceQueue")) | 
 | 2272 |         return (void*) vkGetDeviceQueue; | 
| Tony Barbour | 59a4732 | 2015-06-24 16:06:58 -0600 | [diff] [blame^] | 2273 |     if (!strcmp(funcName, "vkGetGlobalExtensionCount")) | 
 | 2274 |         return (void*) vkGetGlobalExtensionCount; | 
 | 2275 |     if (!strcmp(funcName, "vkGetGlobalExtensionProperties")) | 
 | 2276 |         return (void*) vkGetGlobalExtensionProperties; | 
| Jon Ashburn | 747f2b6 | 2015-06-18 15:02:58 -0600 | [diff] [blame] | 2277 |  | 
 | 2278 |     VkLayerDispatchTable *pDisp =  get_dispatch_table(mem_tracker_device_table_map, dev); | 
 | 2279 |     if (deviceExtMap.size() == 0 || deviceExtMap[pDisp].wsi_lunarg_enabled) | 
 | 2280 |     { | 
 | 2281 |         if (!strcmp(funcName, "vkCreateSwapChainWSI")) | 
 | 2282 |             return (void*) vkCreateSwapChainWSI; | 
 | 2283 |         if (!strcmp(funcName, "vkDestroySwapChainWSI")) | 
 | 2284 |             return (void*) vkDestroySwapChainWSI; | 
 | 2285 |         if (!strcmp(funcName, "vkGetSwapChainInfoWSI")) | 
 | 2286 |             return (void*) vkGetSwapChainInfoWSI; | 
 | 2287 |     } | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 2288 |  | 
| Jon Ashburn | 8fd0825 | 2015-05-28 16:25:02 -0600 | [diff] [blame] | 2289 |     { | 
| Jon Ashburn | 747f2b6 | 2015-06-18 15:02:58 -0600 | [diff] [blame] | 2290 |         if (pDisp->GetDeviceProcAddr == NULL) | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2291 |             return NULL; | 
| Jon Ashburn | 747f2b6 | 2015-06-18 15:02:58 -0600 | [diff] [blame] | 2292 |         return pDisp->GetDeviceProcAddr(dev, funcName); | 
| Jon Ashburn | f6b33db | 2015-05-05 14:22:52 -0600 | [diff] [blame] | 2293 |     } | 
 | 2294 | } | 
 | 2295 |  | 
 | 2296 | VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr( | 
 | 2297 |     VkInstance       instance, | 
 | 2298 |     const char       *funcName) | 
 | 2299 | { | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 2300 |     void *fptr; | 
| Jon Ashburn | f6b33db | 2015-05-05 14:22:52 -0600 | [diff] [blame] | 2301 |     if (instance == NULL) { | 
 | 2302 |         return NULL; | 
 | 2303 |     } | 
| Jon Ashburn | 8c5cbcf | 2015-05-07 10:27:37 -0600 | [diff] [blame] | 2304 |  | 
| Jon Ashburn | 8fd0825 | 2015-05-28 16:25:02 -0600 | [diff] [blame] | 2305 |     /* loader uses this to force layer initialization; instance object is wrapped */ | 
 | 2306 |     if (!strcmp(funcName, "vkGetInstanceProcAddr")) { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 2307 |         initInstanceTable(mem_tracker_instance_table_map, (const VkBaseLayerObject *) instance); | 
| Jon Ashburn | f6b33db | 2015-05-05 14:22:52 -0600 | [diff] [blame] | 2308 |         return (void *) vkGetInstanceProcAddr; | 
| Jon Ashburn | 8fd0825 | 2015-05-28 16:25:02 -0600 | [diff] [blame] | 2309 |     } | 
 | 2310 |  | 
| Mark Lobodzinski | 76c991d | 2015-05-20 16:16:37 -0500 | [diff] [blame] | 2311 |     if (!strcmp(funcName, "vkDestroyInstance")) | 
 | 2312 |         return (void *) vkDestroyInstance; | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 2313 |     if (!strcmp(funcName, "vkCreateInstance")) | 
 | 2314 |         return (void*) vkCreateInstance; | 
| Jon Ashburn | f6b33db | 2015-05-05 14:22:52 -0600 | [diff] [blame] | 2315 |     if (!strcmp(funcName, "vkCreateDevice")) | 
 | 2316 |         return (void*) vkCreateDevice; | 
| Tony Barbour | 59a4732 | 2015-06-24 16:06:58 -0600 | [diff] [blame^] | 2317 |     if (!strcmp(funcName, "vkGetPhysicalDeviceExtensionCount")) | 
 | 2318 |         return (void*) vkGetGlobalExtensionCount; | 
 | 2319 |     if (!strcmp(funcName, "vkGetPhysicalDeviceExtensionProperties")) | 
 | 2320 |         return (void*) vkGetGlobalExtensionProperties; | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 2321 |  | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 2322 |     layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); | 
 | 2323 |     fptr = debug_report_get_instance_proc_addr(my_data->report_data, funcName); | 
| Courtney Goeltzenleuchter | d971b61 | 2015-06-17 20:51:59 -0600 | [diff] [blame] | 2324 |     if (fptr) | 
 | 2325 |         return fptr; | 
 | 2326 |  | 
| Jon Ashburn | 8fd0825 | 2015-05-28 16:25:02 -0600 | [diff] [blame] | 2327 |     { | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 2328 |         if (get_dispatch_table(mem_tracker_instance_table_map, instance)->GetInstanceProcAddr == NULL) | 
| Jon Ashburn | f6b33db | 2015-05-05 14:22:52 -0600 | [diff] [blame] | 2329 |             return NULL; | 
| Courtney Goeltzenleuchter | e45acec | 2015-06-14 12:03:26 -0600 | [diff] [blame] | 2330 |         return get_dispatch_table(mem_tracker_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName); | 
| Tobin Ehlis | 6663f49 | 2014-11-10 12:29:12 -0700 | [diff] [blame] | 2331 |     } | 
 | 2332 | } |