Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 1 | /* |
Courtney Goeltzenleuchter | 9cc421e | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 2 | * Vulkan |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 3 | * |
| 4 | * Copyright (C) 2014 LunarG, Inc. |
| 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 |
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 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 | |
Courtney Goeltzenleuchter | 9cc421e | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 25 | #include "vkLayer.h" |
Tobin Ehlis | 3c26a54 | 2014-11-18 11:28:33 -0700 | [diff] [blame] | 26 | // Object Tracker ERROR codes |
| 27 | typedef enum _OBJECT_TRACK_ERROR |
| 28 | { |
Chia-I Wu | b146618 | 2015-01-05 14:33:42 +0800 | [diff] [blame] | 29 | OBJTRACK_NONE, // Used for INFO & other non-error messages |
| 30 | OBJTRACK_UNKNOWN_OBJECT, // Updating uses of object that's not in global object list |
| 31 | OBJTRACK_INTERNAL_ERROR, // Bug with data tracking within the layer |
| 32 | OBJTRACK_DESTROY_OBJECT_FAILED, // Couldn't find object to be destroyed |
| 33 | OBJTRACK_MISSING_OBJECT, // Attempted look-up on object that isn't in global object list |
Mark Lobodzinski | 7a3d5ff | 2015-05-05 18:24:45 -0500 | [diff] [blame] | 34 | OBJTRACK_OBJECT_TYPE_MISMATCH, // Object did not match corresponding Object Type |
Chia-I Wu | b146618 | 2015-01-05 14:33:42 +0800 | [diff] [blame] | 35 | OBJTRACK_OBJECT_LEAK, // OBJECT was not correctly freed/destroyed |
| 36 | OBJTRACK_OBJCOUNT_MAX_EXCEEDED, // Request for Object data in excess of max obj count |
Tobin Ehlis | 235c20e | 2015-01-16 08:56:30 -0700 | [diff] [blame] | 37 | OBJTRACK_INVALID_FENCE, // Requested status of unsubmitted fence object |
Mark Lobodzinski | 0155270 | 2015-02-03 10:06:31 -0600 | [diff] [blame] | 38 | OBJTRACK_VIEWPORT_NOT_BOUND, // Draw submitted with no viewport state object bound |
| 39 | OBJTRACK_RASTER_NOT_BOUND, // Draw submitted with no raster state object bound |
| 40 | OBJTRACK_COLOR_BLEND_NOT_BOUND, // Draw submitted with no color blend state object bound |
| 41 | OBJTRACK_DEPTH_STENCIL_NOT_BOUND, // Draw submitted with no depth-stencil state object bound |
Mark Lobodzinski | 4186e71 | 2015-02-03 11:52:26 -0600 | [diff] [blame] | 42 | OBJTRACK_GPU_MEM_MAPPED, // Mem object ref'd in cmd buff is still mapped |
Mark Lobodzinski | e1d3f0c | 2015-02-09 10:20:53 -0600 | [diff] [blame] | 43 | OBJTRACK_GETGPUINFO_NOT_CALLED, // Gpu Information has not been requested before drawing |
| 44 | OBJTRACK_MEMREFCOUNT_MAX_EXCEEDED, // Number of QueueSubmit memory references exceeds GPU maximum |
Tobin Ehlis | 586aa01 | 2015-06-08 17:36:28 -0600 | [diff] [blame^] | 45 | OBJTRACK_INVALID_OBJECT, // Object used that has never been created |
Tobin Ehlis | 3c26a54 | 2014-11-18 11:28:33 -0700 | [diff] [blame] | 46 | } OBJECT_TRACK_ERROR; |
| 47 | |
Tobin Ehlis | 235c20e | 2015-01-16 08:56:30 -0700 | [diff] [blame] | 48 | // Object Status -- used to track state of individual objects |
Mark Lobodzinski | 7d2d5ac | 2015-05-20 17:33:47 -0500 | [diff] [blame] | 49 | typedef VkFlags ObjectStatusFlags; |
| 50 | typedef enum _ObjectStatusFlagBits |
Tobin Ehlis | 235c20e | 2015-01-16 08:56:30 -0700 | [diff] [blame] | 51 | { |
Mark Lobodzinski | 0155270 | 2015-02-03 10:06:31 -0600 | [diff] [blame] | 52 | OBJSTATUS_NONE = 0x00000000, // No status is set |
| 53 | OBJSTATUS_FENCE_IS_SUBMITTED = 0x00000001, // Fence has been submitted |
| 54 | OBJSTATUS_VIEWPORT_BOUND = 0x00000002, // Viewport state object has been bound |
| 55 | OBJSTATUS_RASTER_BOUND = 0x00000004, // Viewport state object has been bound |
| 56 | OBJSTATUS_COLOR_BLEND_BOUND = 0x00000008, // Viewport state object has been bound |
| 57 | OBJSTATUS_DEPTH_STENCIL_BOUND = 0x00000010, // Viewport state object has been bound |
Mark Lobodzinski | 4186e71 | 2015-02-03 11:52:26 -0600 | [diff] [blame] | 58 | OBJSTATUS_GPU_MEM_MAPPED = 0x00000020, // Memory object is currently mapped |
Mark Lobodzinski | 7d2d5ac | 2015-05-20 17:33:47 -0500 | [diff] [blame] | 59 | } ObjectStatusFlagBits; |
Chia-I Wu | 5b66aa5 | 2015-04-16 22:02:10 +0800 | [diff] [blame] | 60 | |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 61 | static const char* string_VkObjectType(VkObjectType type) { |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 62 | switch (type) |
| 63 | { |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 64 | case VK_OBJECT_TYPE_DEVICE: |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 65 | return "DEVICE"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 66 | case VK_OBJECT_TYPE_PIPELINE: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 67 | return "PIPELINE"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 68 | case VK_OBJECT_TYPE_FENCE: |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 69 | return "FENCE"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 70 | case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 71 | return "DESCRIPTOR_SET_LAYOUT"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 72 | case VK_OBJECT_TYPE_DEVICE_MEMORY: |
Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 73 | return "DEVICE_MEMORY"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 74 | case VK_OBJECT_TYPE_PIPELINE_LAYOUT: |
Mark Lobodzinski | 556f721 | 2015-04-17 14:11:39 -0500 | [diff] [blame] | 75 | return "PIPELINE_LAYOUT"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 76 | case VK_OBJECT_TYPE_QUEUE: |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 77 | return "QUEUE"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 78 | case VK_OBJECT_TYPE_IMAGE: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 79 | return "IMAGE"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 80 | case VK_OBJECT_TYPE_COMMAND_BUFFER: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 81 | return "CMD_BUFFER"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 82 | case VK_OBJECT_TYPE_SEMAPHORE: |
Courtney Goeltzenleuchter | 0d2efef | 2015-03-25 17:14:29 -0600 | [diff] [blame] | 83 | return "SEMAPHORE"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 84 | case VK_OBJECT_TYPE_FRAMEBUFFER: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 85 | return "FRAMEBUFFER"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 86 | case VK_OBJECT_TYPE_SAMPLER: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 87 | return "SAMPLER"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 88 | case VK_OBJECT_TYPE_COLOR_ATTACHMENT_VIEW: |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 89 | return "COLOR_ATTACHMENT_VIEW"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 90 | case VK_OBJECT_TYPE_BUFFER_VIEW: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 91 | return "BUFFER_VIEW"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 92 | case VK_OBJECT_TYPE_DESCRIPTOR_SET: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 93 | return "DESCRIPTOR_SET"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 94 | case VK_OBJECT_TYPE_PHYSICAL_DEVICE: |
Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 95 | return "PHYSICAL_DEVICE"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 96 | case VK_OBJECT_TYPE_IMAGE_VIEW: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 97 | return "IMAGE_VIEW"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 98 | case VK_OBJECT_TYPE_BUFFER: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 99 | return "BUFFER"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 100 | case VK_OBJECT_TYPE_DYNAMIC_RS_STATE: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 101 | return "DYNAMIC_RS_STATE_OBJECT"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 102 | case VK_OBJECT_TYPE_EVENT: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 103 | return "EVENT"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 104 | case VK_OBJECT_TYPE_DEPTH_STENCIL_VIEW: |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 105 | return "DEPTH_STENCIL_VIEW"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 106 | case VK_OBJECT_TYPE_SHADER: |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 107 | return "SHADER"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 108 | case VK_OBJECT_TYPE_DYNAMIC_DS_STATE: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 109 | return "DYNAMIC_DS_STATE_OBJECT"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 110 | case VK_OBJECT_TYPE_DYNAMIC_VP_STATE: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 111 | return "DYNAMIC_VP_STATE_OBJECT"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 112 | case VK_OBJECT_TYPE_DYNAMIC_CB_STATE: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 113 | return "DYNAMIC_CB_STATE_OBJECT"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 114 | case VK_OBJECT_TYPE_INSTANCE: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 115 | return "INSTANCE"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 116 | case VK_OBJECT_TYPE_RENDER_PASS: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 117 | return "RENDER_PASS"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 118 | case VK_OBJECT_TYPE_QUERY_POOL: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 119 | return "QUERY_POOL"; |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 120 | case VK_OBJECT_TYPE_DESCRIPTOR_POOL: |
Courtney Goeltzenleuchter | 24591b6 | 2015-04-02 22:54:15 -0600 | [diff] [blame] | 121 | return "DESCRIPTOR_POOL"; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 122 | default: |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 123 | return NULL; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 124 | } |
| 125 | } |
| 126 | |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 127 | static const char* string_VK_OBJECT_TYPE_WSI(uint32_t type) { |
| 128 | switch (type) |
| 129 | { |
| 130 | case VK_OBJECT_TYPE_DISPLAY_WSI: |
| 131 | return "DISPLAY_WSI"; |
| 132 | case VK_OBJECT_TYPE_SWAP_CHAIN_WSI: |
| 133 | return "SWAP_CHAIN_WSI"; |
| 134 | default: |
| 135 | return NULL; |
| 136 | } |
| 137 | } |
| 138 | |
| 139 | static const char* string_from_vulkan_object_type(uint32_t type) { |
| 140 | const char *vkEnumString = string_VkObjectType((VkObjectType)type); |
| 141 | if (vkEnumString != NULL) { |
| 142 | return vkEnumString; |
| 143 | } |
| 144 | else { |
| 145 | vkEnumString = string_VK_OBJECT_TYPE_WSI(type); |
| 146 | if (vkEnumString != NULL) { |
| 147 | return vkEnumString; |
| 148 | } |
| 149 | } |
| 150 | return "Unknown"; |
| 151 | } |
| 152 | |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 153 | typedef struct _OBJTRACK_NODE { |
Mark Lobodzinski | 7d2d5ac | 2015-05-20 17:33:47 -0500 | [diff] [blame] | 154 | VkObject vkObj; |
| 155 | VkObjectType objType; |
| 156 | ObjectStatusFlags status; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 157 | } OBJTRACK_NODE; |
Mark Lobodzinski | e1d3f0c | 2015-02-09 10:20:53 -0600 | [diff] [blame] | 158 | |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 159 | // prototype for extension functions |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 160 | uint64_t objTrackGetObjectsCount(void); |
| 161 | VkResult objTrackGetObjects(uint64_t objCount, OBJTRACK_NODE* pObjNodeArray); |
| 162 | uint64_t objTrackGetObjectsOfTypeCount(VkObjectType type); |
| 163 | VkResult objTrackGetObjectsOfType(VkObjectType type, uint64_t objCount, OBJTRACK_NODE* pObjNodeArray); |
Mark Lobodzinski | e1d3f0c | 2015-02-09 10:20:53 -0600 | [diff] [blame] | 164 | |
Tobin Ehlis | 3c26a54 | 2014-11-18 11:28:33 -0700 | [diff] [blame] | 165 | // Func ptr typedefs |
Mark Lobodzinski | 4e5016f | 2015-05-05 15:01:37 -0500 | [diff] [blame] | 166 | typedef uint64_t (*OBJ_TRACK_GET_OBJECTS_COUNT)(void); |
| 167 | typedef VkResult (*OBJ_TRACK_GET_OBJECTS)(uint64_t, OBJTRACK_NODE*); |
| 168 | typedef uint64_t (*OBJ_TRACK_GET_OBJECTS_OF_TYPE_COUNT)(VkObjectType); |
| 169 | typedef VkResult (*OBJ_TRACK_GET_OBJECTS_OF_TYPE)(VkObjectType, uint64_t, OBJTRACK_NODE*); |