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 |
| 34 | OBJTRACK_OBJECT_LEAK, // OBJECT was not correctly freed/destroyed |
| 35 | 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] | 36 | OBJTRACK_INVALID_FENCE, // Requested status of unsubmitted fence object |
Mark Lobodzinski | 0155270 | 2015-02-03 10:06:31 -0600 | [diff] [blame] | 37 | OBJTRACK_VIEWPORT_NOT_BOUND, // Draw submitted with no viewport state object bound |
| 38 | OBJTRACK_RASTER_NOT_BOUND, // Draw submitted with no raster state object bound |
| 39 | OBJTRACK_COLOR_BLEND_NOT_BOUND, // Draw submitted with no color blend state object bound |
| 40 | 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] | 41 | 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] | 42 | OBJTRACK_GETGPUINFO_NOT_CALLED, // Gpu Information has not been requested before drawing |
| 43 | OBJTRACK_MEMREFCOUNT_MAX_EXCEEDED, // Number of QueueSubmit memory references exceeds GPU maximum |
Tobin Ehlis | 3c26a54 | 2014-11-18 11:28:33 -0700 | [diff] [blame] | 44 | } OBJECT_TRACK_ERROR; |
| 45 | |
Tobin Ehlis | 235c20e | 2015-01-16 08:56:30 -0700 | [diff] [blame] | 46 | // Object Status -- used to track state of individual objects |
| 47 | typedef enum _OBJECT_STATUS |
| 48 | { |
Mark Lobodzinski | 0155270 | 2015-02-03 10:06:31 -0600 | [diff] [blame] | 49 | OBJSTATUS_NONE = 0x00000000, // No status is set |
| 50 | OBJSTATUS_FENCE_IS_SUBMITTED = 0x00000001, // Fence has been submitted |
| 51 | OBJSTATUS_VIEWPORT_BOUND = 0x00000002, // Viewport state object has been bound |
| 52 | OBJSTATUS_RASTER_BOUND = 0x00000004, // Viewport state object has been bound |
| 53 | OBJSTATUS_COLOR_BLEND_BOUND = 0x00000008, // Viewport state object has been bound |
| 54 | OBJSTATUS_DEPTH_STENCIL_BOUND = 0x00000010, // Viewport state object has been bound |
Mark Lobodzinski | 4186e71 | 2015-02-03 11:52:26 -0600 | [diff] [blame] | 55 | OBJSTATUS_GPU_MEM_MAPPED = 0x00000020, // Memory object is currently mapped |
Tobin Ehlis | 235c20e | 2015-01-16 08:56:30 -0700 | [diff] [blame] | 56 | } OBJECT_STATUS; |
| 57 | // TODO : Make this code-generated |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 58 | // Object type enum |
Courtney Goeltzenleuchter | 9cc421e | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 59 | typedef enum _VK_OBJECT_TYPE |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 60 | { |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 61 | VkObjectTypeSampler, |
Courtney Goeltzenleuchter | fcf855f | 2015-04-10 16:24:50 -0600 | [diff] [blame] | 62 | VkObjectTypeDynamicDsState, |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 63 | VkObjectTypeDescriptorSet, |
| 64 | VkObjectTypeDescriptorPool, |
Courtney Goeltzenleuchter | fcf855f | 2015-04-10 16:24:50 -0600 | [diff] [blame] | 65 | VkObjectTypeDynamicCbState, |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 66 | VkObjectTypeImageView, |
| 67 | VkObjectTypeSemaphore, |
| 68 | VkObjectTypeShader, |
| 69 | VkObjectTypeDescriptorSetLayout, |
| 70 | VkObjectTypeDescriptorSetLayoutChain, |
| 71 | VkObjectTypeBuffer, |
| 72 | VkObjectTypePipeline, |
| 73 | VkObjectTypeDevice, |
| 74 | VkObjectTypeQueryPool, |
| 75 | VkObjectTypeEvent, |
| 76 | VkObjectTypeQueue, |
Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 77 | VkObjectTypePhysicalDevice, |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 78 | VkObjectTypeRenderPass, |
| 79 | VkObjectTypeFramebuffer, |
| 80 | VkObjectTypeImage, |
| 81 | VkObjectTypeBufferView, |
| 82 | VkObjectTypeDepthStencilView, |
| 83 | VkObjectTypeInstance, |
Courtney Goeltzenleuchter | fcf855f | 2015-04-10 16:24:50 -0600 | [diff] [blame] | 84 | VkObjectTypeDynamicVpState, |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 85 | VkObjectTypeColorAttachmentView, |
Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 86 | VkObjectTypeDeviceMemory, |
Courtney Goeltzenleuchter | fcf855f | 2015-04-10 16:24:50 -0600 | [diff] [blame] | 87 | VkObjectTypeDynamicRsState, |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 88 | VkObjectTypeFence, |
| 89 | VkObjectTypeCmdBuffer, |
| 90 | VkObjectTypePresentableImageMemory, |
Chia-I Wu | b146618 | 2015-01-05 14:33:42 +0800 | [diff] [blame] | 91 | |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 92 | VkObjectTypeUnknown, |
| 93 | VkNumObjectType, |
| 94 | VkObjectTypeAny, // Allow global object list to be queried/retrieved |
Courtney Goeltzenleuchter | 9cc421e | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 95 | } VK_OBJECT_TYPE; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 96 | |
Courtney Goeltzenleuchter | 9cc421e | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 97 | static const char* string_VK_OBJECT_TYPE(VK_OBJECT_TYPE type) { |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 98 | switch (type) |
| 99 | { |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 100 | case VkObjectTypeDevice: |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 101 | return "DEVICE"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 102 | case VkObjectTypePipeline: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 103 | return "PIPELINE"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 104 | case VkObjectTypeFence: |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 105 | return "FENCE"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 106 | case VkObjectTypeDescriptorSetLayout: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 107 | return "DESCRIPTOR_SET_LAYOUT"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 108 | case VkObjectTypeDescriptorSetLayoutChain: |
Courtney Goeltzenleuchter | 24591b6 | 2015-04-02 22:54:15 -0600 | [diff] [blame] | 109 | return "DESCRIPTOR_SET_LAYOUT_CHAIN"; |
Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 110 | case VkObjectTypeDeviceMemory: |
| 111 | return "DEVICE_MEMORY"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 112 | case VkObjectTypeQueue: |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 113 | return "QUEUE"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 114 | case VkObjectTypeImage: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 115 | return "IMAGE"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 116 | case VkObjectTypeCmdBuffer: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 117 | return "CMD_BUFFER"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 118 | case VkObjectTypeSemaphore: |
Courtney Goeltzenleuchter | 0d2efef | 2015-03-25 17:14:29 -0600 | [diff] [blame] | 119 | return "SEMAPHORE"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 120 | case VkObjectTypeFramebuffer: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 121 | return "FRAMEBUFFER"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 122 | case VkObjectTypeSampler: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 123 | return "SAMPLER"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 124 | case VkObjectTypeColorAttachmentView: |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 125 | return "COLOR_ATTACHMENT_VIEW"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 126 | case VkObjectTypeBufferView: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 127 | return "BUFFER_VIEW"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 128 | case VkObjectTypeDescriptorSet: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 129 | return "DESCRIPTOR_SET"; |
Tony Barbour | 8205d90 | 2015-04-16 15:59:00 -0600 | [diff] [blame] | 130 | case VkObjectTypePhysicalDevice: |
| 131 | return "PHYSICAL_DEVICE"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 132 | case VkObjectTypeImageView: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 133 | return "IMAGE_VIEW"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 134 | case VkObjectTypeBuffer: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 135 | return "BUFFER"; |
Courtney Goeltzenleuchter | fcf855f | 2015-04-10 16:24:50 -0600 | [diff] [blame] | 136 | case VkObjectTypeDynamicRsState: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 137 | return "DYNAMIC_RS_STATE_OBJECT"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 138 | case VkObjectTypeEvent: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 139 | return "EVENT"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 140 | case VkObjectTypeDepthStencilView: |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 141 | return "DEPTH_STENCIL_VIEW"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 142 | case VkObjectTypeShader: |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 143 | return "SHADER"; |
Courtney Goeltzenleuchter | fcf855f | 2015-04-10 16:24:50 -0600 | [diff] [blame] | 144 | case VkObjectTypeDynamicDsState: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 145 | return "DYNAMIC_DS_STATE_OBJECT"; |
Courtney Goeltzenleuchter | fcf855f | 2015-04-10 16:24:50 -0600 | [diff] [blame] | 146 | case VkObjectTypeDynamicVpState: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 147 | return "DYNAMIC_VP_STATE_OBJECT"; |
Courtney Goeltzenleuchter | fcf855f | 2015-04-10 16:24:50 -0600 | [diff] [blame] | 148 | case VkObjectTypeDynamicCbState: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 149 | return "DYNAMIC_CB_STATE_OBJECT"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 150 | case VkObjectTypeInstance: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 151 | return "INSTANCE"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 152 | case VkObjectTypeRenderPass: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 153 | return "RENDER_PASS"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 154 | case VkObjectTypeQueryPool: |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 155 | return "QUERY_POOL"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 156 | case VkObjectTypeDescriptorPool: |
Courtney Goeltzenleuchter | 24591b6 | 2015-04-02 22:54:15 -0600 | [diff] [blame] | 157 | return "DESCRIPTOR_POOL"; |
Courtney Goeltzenleuchter | dfd1b2a | 2015-04-15 00:14:36 -0600 | [diff] [blame] | 158 | case VkObjectTypePresentableImageMemory: |
Courtney Goeltzenleuchter | f6adc30 | 2015-03-26 16:16:16 -0600 | [diff] [blame] | 159 | return "PRESENTABLE_IMAGE_MEMORY"; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 160 | default: |
| 161 | return "UNKNOWN"; |
| 162 | } |
| 163 | } |
| 164 | |
| 165 | typedef struct _OBJTRACK_NODE { |
Mark Lobodzinski | e2d07a5 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 166 | void *pObj; |
Courtney Goeltzenleuchter | 9cc421e | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 167 | VK_OBJECT_TYPE objType; |
Mark Lobodzinski | e2d07a5 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 168 | uint64_t numUses; |
Tobin Ehlis | 235c20e | 2015-01-16 08:56:30 -0700 | [diff] [blame] | 169 | OBJECT_STATUS status; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 170 | } OBJTRACK_NODE; |
Mark Lobodzinski | e1d3f0c | 2015-02-09 10:20:53 -0600 | [diff] [blame] | 171 | |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 172 | // prototype for extension functions |
Courtney Goeltzenleuchter | 9cc421e | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 173 | uint64_t objTrackGetObjectCount(VK_OBJECT_TYPE type); |
Courtney Goeltzenleuchter | 382489d | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 174 | VkResult objTrackGetObjects(VK_OBJECT_TYPE type, uint64_t objCount, OBJTRACK_NODE* pObjNodeArray); |
Mark Lobodzinski | e1d3f0c | 2015-02-09 10:20:53 -0600 | [diff] [blame] | 175 | |
Tobin Ehlis | 3c26a54 | 2014-11-18 11:28:33 -0700 | [diff] [blame] | 176 | // Func ptr typedefs |
Courtney Goeltzenleuchter | 9cc421e | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 177 | typedef uint64_t (*OBJ_TRACK_GET_OBJECT_COUNT)(VK_OBJECT_TYPE); |
Courtney Goeltzenleuchter | 382489d | 2015-04-10 08:34:15 -0600 | [diff] [blame] | 178 | typedef VkResult (*OBJ_TRACK_GET_OBJECTS)(VK_OBJECT_TYPE, uint64_t, OBJTRACK_NODE*); |