Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 1 | /* |
| 2 | * XGL |
| 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 | |
| 25 | #include "xglLayer.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 |
Tobin Ehlis | 3c26a54 | 2014-11-18 11:28:33 -0700 | [diff] [blame] | 42 | } OBJECT_TRACK_ERROR; |
| 43 | |
Tobin Ehlis | 235c20e | 2015-01-16 08:56:30 -0700 | [diff] [blame] | 44 | // Object Status -- used to track state of individual objects |
| 45 | typedef enum _OBJECT_STATUS |
| 46 | { |
Mark Lobodzinski | 0155270 | 2015-02-03 10:06:31 -0600 | [diff] [blame] | 47 | OBJSTATUS_NONE = 0x00000000, // No status is set |
| 48 | OBJSTATUS_FENCE_IS_SUBMITTED = 0x00000001, // Fence has been submitted |
| 49 | OBJSTATUS_VIEWPORT_BOUND = 0x00000002, // Viewport state object has been bound |
| 50 | OBJSTATUS_RASTER_BOUND = 0x00000004, // Viewport state object has been bound |
| 51 | OBJSTATUS_COLOR_BLEND_BOUND = 0x00000008, // Viewport state object has been bound |
| 52 | OBJSTATUS_DEPTH_STENCIL_BOUND = 0x00000010, // Viewport state object has been bound |
Mark Lobodzinski | 4186e71 | 2015-02-03 11:52:26 -0600 | [diff] [blame^] | 53 | OBJSTATUS_GPU_MEM_MAPPED = 0x00000020, // Memory object is currently mapped |
Tobin Ehlis | 235c20e | 2015-01-16 08:56:30 -0700 | [diff] [blame] | 54 | } OBJECT_STATUS; |
| 55 | // TODO : Make this code-generated |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 56 | // Object type enum |
| 57 | typedef enum _XGL_OBJECT_TYPE |
| 58 | { |
Chia-I Wu | b146618 | 2015-01-05 14:33:42 +0800 | [diff] [blame] | 59 | XGL_OBJECT_TYPE_SAMPLER, |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 60 | XGL_OBJECT_TYPE_DYNAMIC_DS_STATE_OBJECT, |
Chia-I Wu | b146618 | 2015-01-05 14:33:42 +0800 | [diff] [blame] | 61 | XGL_OBJECT_TYPE_DESCRIPTOR_SET, |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 62 | XGL_OBJECT_TYPE_DESCRIPTOR_REGION, |
| 63 | XGL_OBJECT_TYPE_DYNAMIC_CB_STATE_OBJECT, |
| 64 | XGL_OBJECT_TYPE_IMAGE_VIEW, |
| 65 | XGL_OBJECT_TYPE_QUEUE_SEMAPHORE, |
| 66 | XGL_OBJECT_TYPE_SHADER, |
| 67 | XGL_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, |
| 68 | XGL_OBJECT_TYPE_BUFFER, |
| 69 | XGL_OBJECT_TYPE_PIPELINE, |
| 70 | XGL_OBJECT_TYPE_DEVICE, |
| 71 | XGL_OBJECT_TYPE_QUERY_POOL, |
| 72 | XGL_OBJECT_TYPE_EVENT, |
| 73 | XGL_OBJECT_TYPE_QUEUE, |
Chia-I Wu | b146618 | 2015-01-05 14:33:42 +0800 | [diff] [blame] | 74 | XGL_OBJECT_TYPE_PHYSICAL_GPU, |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 75 | XGL_OBJECT_TYPE_RENDER_PASS, |
| 76 | XGL_OBJECT_TYPE_FRAMEBUFFER, |
| 77 | XGL_OBJECT_TYPE_IMAGE, |
| 78 | XGL_OBJECT_TYPE_BUFFER_VIEW, |
| 79 | XGL_OBJECT_TYPE_DEPTH_STENCIL_VIEW, |
| 80 | XGL_OBJECT_TYPE_INSTANCE, |
| 81 | XGL_OBJECT_TYPE_PIPELINE_DELTA, |
| 82 | XGL_OBJECT_TYPE_DYNAMIC_VP_STATE_OBJECT, |
| 83 | XGL_OBJECT_TYPE_COLOR_ATTACHMENT_VIEW, |
| 84 | XGL_OBJECT_TYPE_GPU_MEMORY, |
| 85 | XGL_OBJECT_TYPE_DYNAMIC_RS_STATE_OBJECT, |
| 86 | XGL_OBJECT_TYPE_FENCE, |
| 87 | XGL_OBJECT_TYPE_CMD_BUFFER, |
Chia-I Wu | b146618 | 2015-01-05 14:33:42 +0800 | [diff] [blame] | 88 | |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 89 | XGL_OBJECT_TYPE_UNKNOWN, |
Chia-I Wu | b146618 | 2015-01-05 14:33:42 +0800 | [diff] [blame] | 90 | XGL_NUM_OBJECT_TYPE, |
| 91 | XGL_OBJECT_TYPE_ANY, // Allow global object list to be queried/retrieved |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 92 | } XGL_OBJECT_TYPE; |
| 93 | |
| 94 | static const char* string_XGL_OBJECT_TYPE(XGL_OBJECT_TYPE type) { |
| 95 | switch (type) |
| 96 | { |
| 97 | case XGL_OBJECT_TYPE_DEVICE: |
| 98 | return "DEVICE"; |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 99 | case XGL_OBJECT_TYPE_PIPELINE: |
| 100 | return "PIPELINE"; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 101 | case XGL_OBJECT_TYPE_FENCE: |
| 102 | return "FENCE"; |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 103 | case XGL_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT: |
| 104 | return "DESCRIPTOR_SET_LAYOUT"; |
| 105 | case XGL_OBJECT_TYPE_GPU_MEMORY: |
| 106 | return "GPU_MEMORY"; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 107 | case XGL_OBJECT_TYPE_QUEUE: |
| 108 | return "QUEUE"; |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 109 | case XGL_OBJECT_TYPE_IMAGE: |
| 110 | return "IMAGE"; |
| 111 | case XGL_OBJECT_TYPE_CMD_BUFFER: |
| 112 | return "CMD_BUFFER"; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 113 | case XGL_OBJECT_TYPE_QUEUE_SEMAPHORE: |
| 114 | return "QUEUE_SEMAPHORE"; |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 115 | case XGL_OBJECT_TYPE_FRAMEBUFFER: |
| 116 | return "FRAMEBUFFER"; |
| 117 | case XGL_OBJECT_TYPE_SAMPLER: |
| 118 | return "SAMPLER"; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 119 | case XGL_OBJECT_TYPE_COLOR_ATTACHMENT_VIEW: |
| 120 | return "COLOR_ATTACHMENT_VIEW"; |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 121 | case XGL_OBJECT_TYPE_BUFFER_VIEW: |
| 122 | return "BUFFER_VIEW"; |
| 123 | case XGL_OBJECT_TYPE_DESCRIPTOR_SET: |
| 124 | return "DESCRIPTOR_SET"; |
| 125 | case XGL_OBJECT_TYPE_PHYSICAL_GPU: |
| 126 | return "PHYSICAL_GPU"; |
| 127 | case XGL_OBJECT_TYPE_IMAGE_VIEW: |
| 128 | return "IMAGE_VIEW"; |
| 129 | case XGL_OBJECT_TYPE_BUFFER: |
| 130 | return "BUFFER"; |
| 131 | case XGL_OBJECT_TYPE_PIPELINE_DELTA: |
| 132 | return "PIPELINE_DELTA"; |
| 133 | case XGL_OBJECT_TYPE_DYNAMIC_RS_STATE_OBJECT: |
| 134 | return "DYNAMIC_RS_STATE_OBJECT"; |
| 135 | case XGL_OBJECT_TYPE_EVENT: |
| 136 | return "EVENT"; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 137 | case XGL_OBJECT_TYPE_DEPTH_STENCIL_VIEW: |
| 138 | return "DEPTH_STENCIL_VIEW"; |
| 139 | case XGL_OBJECT_TYPE_SHADER: |
| 140 | return "SHADER"; |
Tobin Ehlis | 2f3726c | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 141 | case XGL_OBJECT_TYPE_DYNAMIC_DS_STATE_OBJECT: |
| 142 | return "DYNAMIC_DS_STATE_OBJECT"; |
| 143 | case XGL_OBJECT_TYPE_DYNAMIC_VP_STATE_OBJECT: |
| 144 | return "DYNAMIC_VP_STATE_OBJECT"; |
| 145 | case XGL_OBJECT_TYPE_DYNAMIC_CB_STATE_OBJECT: |
| 146 | return "DYNAMIC_CB_STATE_OBJECT"; |
| 147 | case XGL_OBJECT_TYPE_INSTANCE: |
| 148 | return "INSTANCE"; |
| 149 | case XGL_OBJECT_TYPE_RENDER_PASS: |
| 150 | return "RENDER_PASS"; |
| 151 | case XGL_OBJECT_TYPE_QUERY_POOL: |
| 152 | return "QUERY_POOL"; |
| 153 | case XGL_OBJECT_TYPE_DESCRIPTOR_REGION: |
| 154 | return "DESCRIPTOR_REGION"; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 155 | default: |
| 156 | return "UNKNOWN"; |
| 157 | } |
| 158 | } |
| 159 | |
| 160 | typedef struct _OBJTRACK_NODE { |
Mark Lobodzinski | e2d07a5 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 161 | void *pObj; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 162 | XGL_OBJECT_TYPE objType; |
Mark Lobodzinski | e2d07a5 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 163 | uint64_t numUses; |
Tobin Ehlis | 235c20e | 2015-01-16 08:56:30 -0700 | [diff] [blame] | 164 | OBJECT_STATUS status; |
Tobin Ehlis | acab888 | 2014-11-14 13:01:02 -0700 | [diff] [blame] | 165 | } OBJTRACK_NODE; |
| 166 | // prototype for extension functions |
Mark Lobodzinski | e2d07a5 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 167 | uint64_t objTrackGetObjectCount(XGL_OBJECT_TYPE type); |
| 168 | XGL_RESULT objTrackGetObjects(XGL_OBJECT_TYPE type, uint64_t objCount, OBJTRACK_NODE* pObjNodeArray); |
Tobin Ehlis | 3c26a54 | 2014-11-18 11:28:33 -0700 | [diff] [blame] | 169 | // Func ptr typedefs |
Mark Lobodzinski | e2d07a5 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 170 | typedef uint64_t (*OBJ_TRACK_GET_OBJECT_COUNT)(XGL_OBJECT_TYPE); |
| 171 | typedef XGL_RESULT (*OBJ_TRACK_GET_OBJECTS)(XGL_OBJECT_TYPE, uint64_t, OBJTRACK_NODE*); |