| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [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 <stdio.h> | 
 | 26 | #include <stdlib.h> | 
 | 27 | #include <string.h> | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 28 | #include "loader_platform.h" | 
| Chia-I Wu | aa4121f | 2015-01-04 23:11:43 +0800 | [diff] [blame] | 29 | #include "xgl_dispatch_table_helper.h" | 
| Tobin Ehlis | 296d5d5 | 2014-10-27 14:53:17 -0600 | [diff] [blame] | 30 | #include "xgl_struct_string_helper.h" | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 31 | #include "xgl_struct_graphviz_helper.h" | 
| Tobin Ehlis | 0411292 | 2015-03-16 10:44:40 -0600 | [diff] [blame] | 32 | #include "xgl_struct_size_helper.h" | 
| Tobin Ehlis | 246ba4d | 2014-11-18 16:38:08 -0700 | [diff] [blame] | 33 | #include "draw_state.h" | 
| Jon Ashburn | 892d918 | 2014-12-22 13:38:27 -0700 | [diff] [blame] | 34 | #include "layers_config.h" | 
| Ian Elliott | 655cad7 | 2015-02-12 17:08:34 -0700 | [diff] [blame] | 35 | // The following is #included again to catch certain OS-specific functions | 
 | 36 | // being used: | 
 | 37 | #include "loader_platform.h" | 
| Jon Ashburn | 2e67289 | 2015-02-16 08:46:53 -0700 | [diff] [blame] | 38 | #include "layers_msg.h" | 
| Tobin Ehlis | 10ae8c1 | 2015-03-17 16:24:32 -0600 | [diff] [blame] | 39 |  | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 40 | static XGL_LAYER_DISPATCH_TABLE nextTable; | 
 | 41 | static XGL_BASE_LAYER_OBJECT *pCurObj; | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 42 | static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce); | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 43 | // TODO : This can be much smarter, using separate locks for separate global data | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 44 | static int globalLockInitialized = 0; | 
 | 45 | static loader_platform_thread_mutex globalLock; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 46 | #define ALLOC_DEBUG 0 | 
 | 47 | #if ALLOC_DEBUG | 
 | 48 | static uint64_t g_alloc_count = 0; | 
 | 49 | static uint64_t g_free_count = 0; | 
 | 50 | #endif | 
| Tobin Ehlis | ea189f1 | 2015-02-23 09:06:28 -0700 | [diff] [blame] | 51 | #define MAX_TID 513 | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 52 | static loader_platform_thread_id g_tidMapping[MAX_TID] = {0}; | 
| Tobin Ehlis | ea189f1 | 2015-02-23 09:06:28 -0700 | [diff] [blame] | 53 | static uint32_t g_maxTID = 0; | 
 | 54 | // Map actual TID to an index value and return that index | 
 | 55 | //  This keeps TIDs in range from 0-MAX_TID and simplifies compares between runs | 
 | 56 | static uint32_t getTIDIndex() { | 
 | 57 |     loader_platform_thread_id tid = loader_platform_get_thread_id(); | 
 | 58 |     for (uint32_t i = 0; i < g_maxTID; i++) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 59 |         if (tid == g_tidMapping[i]) | 
| Tobin Ehlis | ea189f1 | 2015-02-23 09:06:28 -0700 | [diff] [blame] | 60 |             return i; | 
 | 61 |     } | 
 | 62 |     // Don't yet have mapping, set it and return newly set index | 
 | 63 |     uint32_t retVal = (uint32_t) g_maxTID; | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 64 |     g_tidMapping[g_maxTID++] = tid; | 
| Tobin Ehlis | ea189f1 | 2015-02-23 09:06:28 -0700 | [diff] [blame] | 65 |     assert(g_maxTID < MAX_TID); | 
 | 66 |     return retVal; | 
 | 67 | } | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 68 | // Return a string representation of CMD_TYPE enum | 
 | 69 | static char* cmdTypeToString(CMD_TYPE cmd) | 
 | 70 | { | 
 | 71 |     switch (cmd) | 
 | 72 |     { | 
 | 73 |         case CMD_BINDPIPELINE: | 
 | 74 |             return "CMD_BINDPIPELINE"; | 
 | 75 |         case CMD_BINDPIPELINEDELTA: | 
 | 76 |             return "CMD_BINDPIPELINEDELTA"; | 
 | 77 |         case CMD_BINDDYNAMICSTATEOBJECT: | 
 | 78 |             return "CMD_BINDDYNAMICSTATEOBJECT"; | 
 | 79 |         case CMD_BINDDESCRIPTORSET: | 
 | 80 |             return "CMD_BINDDESCRIPTORSET"; | 
 | 81 |         case CMD_BINDINDEXBUFFER: | 
 | 82 |             return "CMD_BINDINDEXBUFFER"; | 
 | 83 |         case CMD_BINDVERTEXBUFFER: | 
 | 84 |             return "CMD_BINDVERTEXBUFFER"; | 
 | 85 |         case CMD_DRAW: | 
 | 86 |             return "CMD_DRAW"; | 
 | 87 |         case CMD_DRAWINDEXED: | 
 | 88 |             return "CMD_DRAWINDEXED"; | 
 | 89 |         case CMD_DRAWINDIRECT: | 
 | 90 |             return "CMD_DRAWINDIRECT"; | 
 | 91 |         case CMD_DRAWINDEXEDINDIRECT: | 
 | 92 |             return "CMD_DRAWINDEXEDINDIRECT"; | 
 | 93 |         case CMD_DISPATCH: | 
 | 94 |             return "CMD_DISPATCH"; | 
 | 95 |         case CMD_DISPATCHINDIRECT: | 
 | 96 |             return "CMD_DISPATCHINDIRECT"; | 
 | 97 |         case CMD_COPYBUFFER: | 
 | 98 |             return "CMD_COPYBUFFER"; | 
 | 99 |         case CMD_COPYIMAGE: | 
 | 100 |             return "CMD_COPYIMAGE"; | 
 | 101 |         case CMD_COPYBUFFERTOIMAGE: | 
 | 102 |             return "CMD_COPYBUFFERTOIMAGE"; | 
 | 103 |         case CMD_COPYIMAGETOBUFFER: | 
 | 104 |             return "CMD_COPYIMAGETOBUFFER"; | 
 | 105 |         case CMD_CLONEIMAGEDATA: | 
 | 106 |             return "CMD_CLONEIMAGEDATA"; | 
 | 107 |         case CMD_UPDATEBUFFER: | 
 | 108 |             return "CMD_UPDATEBUFFER"; | 
 | 109 |         case CMD_FILLBUFFER: | 
 | 110 |             return "CMD_FILLBUFFER"; | 
 | 111 |         case CMD_CLEARCOLORIMAGE: | 
 | 112 |             return "CMD_CLEARCOLORIMAGE"; | 
 | 113 |         case CMD_CLEARCOLORIMAGERAW: | 
 | 114 |             return "CMD_CLEARCOLORIMAGERAW"; | 
 | 115 |         case CMD_CLEARDEPTHSTENCIL: | 
 | 116 |             return "CMD_CLEARDEPTHSTENCIL"; | 
 | 117 |         case CMD_RESOLVEIMAGE: | 
 | 118 |             return "CMD_RESOLVEIMAGE"; | 
 | 119 |         case CMD_SETEVENT: | 
 | 120 |             return "CMD_SETEVENT"; | 
 | 121 |         case CMD_RESETEVENT: | 
 | 122 |             return "CMD_RESETEVENT"; | 
 | 123 |         case CMD_WAITEVENTS: | 
 | 124 |             return "CMD_WAITEVENTS"; | 
 | 125 |         case CMD_PIPELINEBARRIER: | 
 | 126 |             return "CMD_PIPELINEBARRIER"; | 
 | 127 |         case CMD_BEGINQUERY: | 
 | 128 |             return "CMD_BEGINQUERY"; | 
 | 129 |         case CMD_ENDQUERY: | 
 | 130 |             return "CMD_ENDQUERY"; | 
 | 131 |         case CMD_RESETQUERYPOOL: | 
 | 132 |             return "CMD_RESETQUERYPOOL"; | 
 | 133 |         case CMD_WRITETIMESTAMP: | 
 | 134 |             return "CMD_WRITETIMESTAMP"; | 
 | 135 |         case CMD_INITATOMICCOUNTERS: | 
 | 136 |             return "CMD_INITATOMICCOUNTERS"; | 
 | 137 |         case CMD_LOADATOMICCOUNTERS: | 
 | 138 |             return "CMD_LOADATOMICCOUNTERS"; | 
 | 139 |         case CMD_SAVEATOMICCOUNTERS: | 
 | 140 |             return "CMD_SAVEATOMICCOUNTERS"; | 
 | 141 |         case CMD_BEGINRENDERPASS: | 
 | 142 |             return "CMD_BEGINRENDERPASS"; | 
 | 143 |         case CMD_ENDRENDERPASS: | 
 | 144 |             return "CMD_ENDRENDERPASS"; | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 145 |         case CMD_DBGMARKERBEGIN: | 
 | 146 |             return "CMD_DBGMARKERBEGIN"; | 
 | 147 |         case CMD_DBGMARKEREND: | 
 | 148 |             return "CMD_DBGMARKEREND"; | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 149 |         default: | 
 | 150 |             return "UNKNOWN"; | 
 | 151 |     } | 
 | 152 | } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 153 | // Block of code at start here for managing/tracking Pipeline state that this layer cares about | 
 | 154 | // Just track 2 shaders for now | 
| Tobin Ehlis | 5742e77 | 2014-11-20 09:49:17 -0700 | [diff] [blame] | 155 | #define XGL_NUM_GRAPHICS_SHADERS XGL_SHADER_STAGE_COMPUTE | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 156 | #define MAX_SLOTS 2048 | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 157 | #define NUM_COMMAND_BUFFERS_TO_DISPLAY 10 | 
| Tobin Ehlis | 296d5d5 | 2014-10-27 14:53:17 -0600 | [diff] [blame] | 158 |  | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 159 | static uint64_t g_drawCount[NUM_DRAW_TYPES] = {0, 0, 0, 0}; | 
 | 160 |  | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 161 | // TODO : Should be tracking lastBound per cmdBuffer and when draws occur, report based on that cmd buffer lastBound | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 162 | //   Then need to synchronize the accesses based on cmd buffer so that if I'm reading state on one cmd buffer, updates | 
 | 163 | //   to that same cmd buffer by separate thread are not changing state from underneath us | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 164 | static PIPELINE_NODE*    g_pPipelineHead = NULL; | 
 | 165 | static SAMPLER_NODE*     g_pSamplerHead = NULL; | 
 | 166 | static IMAGE_NODE*       g_pImageHead = NULL; | 
 | 167 | static BUFFER_NODE*      g_pBufferHead = NULL; | 
 | 168 | static GLOBAL_CB_NODE*   g_pCmdBufferHead = NULL; | 
| Tobin Ehlis | ae708b8 | 2015-02-27 08:48:43 -0700 | [diff] [blame] | 169 | // Track the last cmd buffer touched by this thread | 
| Tobin Ehlis | ea189f1 | 2015-02-23 09:06:28 -0700 | [diff] [blame] | 170 | static XGL_CMD_BUFFER    g_lastCmdBuffer[MAX_TID] = {NULL}; | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 171 | // Track the last group of CBs touched for displaying to dot file | 
 | 172 | static GLOBAL_CB_NODE*   g_pLastTouchedCB[NUM_COMMAND_BUFFERS_TO_DISPLAY] = {NULL}; | 
 | 173 | static uint32_t g_lastTouchedCBIndex = 0; | 
| Tobin Ehlis | ae708b8 | 2015-02-27 08:48:43 -0700 | [diff] [blame] | 174 | // Track the last global DrawState of interest touched by any thread | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 175 | static GLOBAL_CB_NODE*        g_lastGlobalCB = NULL; | 
| Tobin Ehlis | ae708b8 | 2015-02-27 08:48:43 -0700 | [diff] [blame] | 176 | static PIPELINE_NODE*         g_lastBoundPipeline = NULL; | 
 | 177 | static DYNAMIC_STATE_NODE*    g_lastBoundDynamicState[XGL_NUM_STATE_BIND_POINT] = {NULL}; | 
 | 178 | static XGL_DESCRIPTOR_SET     g_lastBoundDescriptorSet = NULL; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 179 | #define MAX_BINDING 0xFFFFFFFF // Default vtxBinding value in CB Node to identify if no vtxBinding set | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 180 |  | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 181 | static DYNAMIC_STATE_NODE* g_pDynamicStateHead[XGL_NUM_STATE_BIND_POINT] = {0}; | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 182 |  | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 183 | static void insertDynamicState(const XGL_DYNAMIC_STATE_OBJECT state, const GENERIC_HEADER* pCreateInfo, XGL_STATE_BIND_POINT bindPoint) | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 184 | { | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 185 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 186 |     // Insert new node at head of appropriate LL | 
 | 187 |     DYNAMIC_STATE_NODE* pStateNode = (DYNAMIC_STATE_NODE*)malloc(sizeof(DYNAMIC_STATE_NODE)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 188 | #if ALLOC_DEBUG | 
 | 189 |     printf("Alloc1 #%lu pStateNode addr(%p)\n", ++g_alloc_count, (void*)pStateNode); | 
 | 190 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 191 |     pStateNode->pNext = g_pDynamicStateHead[bindPoint]; | 
 | 192 |     g_pDynamicStateHead[bindPoint] = pStateNode; | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 193 |     pStateNode->stateObj = state; | 
| Tobin Ehlis | 0411292 | 2015-03-16 10:44:40 -0600 | [diff] [blame] | 194 |     pStateNode->pCreateInfo = (GENERIC_HEADER*)malloc(get_dynamic_struct_size(pCreateInfo)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 195 | #if ALLOC_DEBUG | 
 | 196 |     printf("Alloc2 #%lu pStateNode->pCreateInfo addr(%p)\n", ++g_alloc_count, (void*)pStateNode->pCreateInfo); | 
 | 197 | #endif | 
| Tobin Ehlis | 0411292 | 2015-03-16 10:44:40 -0600 | [diff] [blame] | 198 |     memcpy(pStateNode->pCreateInfo, pCreateInfo, get_dynamic_struct_size(pCreateInfo)); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 199 |     // VP has embedded ptr so need to handle that as special case | 
 | 200 |     if (XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO == pCreateInfo->sType) { | 
 | 201 |         XGL_DYNAMIC_VP_STATE_CREATE_INFO* pVPCI = (XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pStateNode->pCreateInfo; | 
 | 202 |         XGL_VIEWPORT** ppViewports = (XGL_VIEWPORT**)&pVPCI->pViewports; | 
| Courtney Goeltzenleuchter | bbe3cc5 | 2015-02-11 14:13:34 -0700 | [diff] [blame] | 203 |         size_t vpSize = sizeof(XGL_VIEWPORT) * pVPCI->viewportAndScissorCount; | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 204 |         if (vpSize) { | 
 | 205 |             *ppViewports = (XGL_VIEWPORT*)malloc(vpSize); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 206 | #if ALLOC_DEBUG | 
 | 207 |             printf("Alloc3 #%lu *ppViewports addr(%p)\n", ++g_alloc_count, (void*)*ppViewports); | 
 | 208 | #endif | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 209 |             memcpy(*ppViewports, ((XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pCreateInfo)->pViewports, vpSize); | 
 | 210 |         } | 
 | 211 |         XGL_RECT** ppScissors = (XGL_RECT**)&pVPCI->pScissors; | 
| Courtney Goeltzenleuchter | bbe3cc5 | 2015-02-11 14:13:34 -0700 | [diff] [blame] | 212 |         size_t scSize = sizeof(XGL_RECT) * pVPCI->viewportAndScissorCount; | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 213 |         if (scSize) { | 
 | 214 |             *ppScissors = (XGL_RECT*)malloc(scSize); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 215 | #if ALLOC_DEBUG | 
 | 216 |             printf("Alloc4 #%lu *ppScissors addr(%p)\n", ++g_alloc_count, (void*)*ppScissors); | 
 | 217 | #endif | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 218 |             memcpy(*ppScissors, ((XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pCreateInfo)->pScissors, scSize); | 
 | 219 |         } | 
 | 220 |     } | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 221 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 222 | } | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 223 | // Free all allocated nodes for Dynamic State objs | 
 | 224 | static void freeDynamicState() | 
 | 225 | { | 
 | 226 |     for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) { | 
 | 227 |         DYNAMIC_STATE_NODE* pStateNode = g_pDynamicStateHead[i]; | 
 | 228 |         DYNAMIC_STATE_NODE* pFreeMe = pStateNode; | 
 | 229 |         while (pStateNode) { | 
 | 230 |             pFreeMe = pStateNode; | 
 | 231 |             pStateNode = pStateNode->pNext; | 
 | 232 |             assert(pFreeMe->pCreateInfo); | 
 | 233 |             if (XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO == pFreeMe->pCreateInfo->sType) { | 
 | 234 |                 XGL_DYNAMIC_VP_STATE_CREATE_INFO* pVPCI = (XGL_DYNAMIC_VP_STATE_CREATE_INFO*)pFreeMe->pCreateInfo; | 
 | 235 |                 if (pVPCI->pViewports) { | 
 | 236 |                     void** ppToFree = (void**)&pVPCI->pViewports; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 237 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 238 |                     printf("Free3 #%lu pViewports addr(%p)\n", ++g_free_count, (void*)*ppToFree); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 239 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 240 |                     free(*ppToFree); | 
 | 241 |                 } | 
 | 242 |                 if (pVPCI->pScissors) { | 
 | 243 |                     void** ppToFree = (void**)&pVPCI->pScissors; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 244 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 245 |                     printf("Free4 #%lu pScissors addr(%p)\n", ++g_free_count, (void*)*ppToFree); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 246 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 247 |                     free(*ppToFree); | 
 | 248 |                 } | 
 | 249 |             } | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 250 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 251 |             printf("Free2 #%lu pStateNode->CreateInfo addr(%p)\n", ++g_free_count, (void*)pFreeMe->pCreateInfo); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 252 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 253 |             free(pFreeMe->pCreateInfo); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 254 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 255 |             printf("Free1 #%lu pStateNode addr(%p)\n", ++g_free_count, (void*)pFreeMe); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 256 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 257 |             free(pFreeMe); | 
 | 258 |         } | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 259 |         g_pDynamicStateHead[i] = NULL; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 260 |     } | 
 | 261 | } | 
 | 262 | // Free all sampler nodes | 
 | 263 | static void freeSamplers() | 
 | 264 | { | 
 | 265 |     SAMPLER_NODE* pSampler = g_pSamplerHead; | 
 | 266 |     SAMPLER_NODE* pFreeMe = pSampler; | 
 | 267 |     while (pSampler) { | 
 | 268 |         pFreeMe = pSampler; | 
 | 269 |         pSampler = pSampler->pNext; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 270 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 271 |         printf("Free25 #%lu pSampler addr(%p)\n", ++g_free_count, (void*)pFreeMe); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 272 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 273 |         free(pFreeMe); | 
 | 274 |     } | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 275 |     g_pSamplerHead = NULL; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 276 | } | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 277 | static XGL_IMAGE_VIEW_CREATE_INFO* getImageViewCreateInfo(XGL_IMAGE_VIEW view) | 
 | 278 | { | 
 | 279 |     loader_platform_thread_lock_mutex(&globalLock); | 
 | 280 |     IMAGE_NODE* pTrav = g_pImageHead; | 
 | 281 |     while (pTrav) { | 
 | 282 |         if (view == pTrav->image) { | 
 | 283 |             loader_platform_thread_unlock_mutex(&globalLock); | 
 | 284 |             return &pTrav->createInfo; | 
 | 285 |         } | 
 | 286 |         pTrav = pTrav->pNext; | 
 | 287 |     } | 
 | 288 |     loader_platform_thread_unlock_mutex(&globalLock); | 
 | 289 |     return NULL; | 
 | 290 | } | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 291 | // Free all image nodes | 
 | 292 | static void freeImages() | 
 | 293 | { | 
 | 294 |     IMAGE_NODE* pImage = g_pImageHead; | 
 | 295 |     IMAGE_NODE* pFreeMe = pImage; | 
 | 296 |     while (pImage) { | 
 | 297 |         pFreeMe = pImage; | 
 | 298 |         pImage = pImage->pNext; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 299 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 300 |         printf("Free22 #%lu pImage addr(%p)\n", ++g_free_count, (void*)pFreeMe); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 301 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 302 |         free(pFreeMe); | 
 | 303 |     } | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 304 |     g_pImageHead = NULL; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 305 | } | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 306 | static XGL_BUFFER_VIEW_CREATE_INFO* getBufferViewCreateInfo(XGL_BUFFER_VIEW view) | 
 | 307 | { | 
 | 308 |     loader_platform_thread_lock_mutex(&globalLock); | 
 | 309 |     BUFFER_NODE* pTrav = g_pBufferHead; | 
 | 310 |     while (pTrav) { | 
 | 311 |         if (view == pTrav->buffer) { | 
 | 312 |             loader_platform_thread_unlock_mutex(&globalLock); | 
 | 313 |             return &pTrav->createInfo; | 
 | 314 |         } | 
 | 315 |         pTrav = pTrav->pNext; | 
 | 316 |     } | 
 | 317 |     loader_platform_thread_unlock_mutex(&globalLock); | 
 | 318 |     return NULL; | 
 | 319 | } | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 320 | // Free all buffer nodes | 
 | 321 | static void freeBuffers() | 
 | 322 | { | 
 | 323 |     BUFFER_NODE* pBuffer = g_pBufferHead; | 
 | 324 |     BUFFER_NODE* pFreeMe = pBuffer; | 
 | 325 |     while (pBuffer) { | 
 | 326 |         pFreeMe = pBuffer; | 
 | 327 |         pBuffer = pBuffer->pNext; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 328 | #if ALLOC_DEBUG | 
 | 329 |     printf("Free21 #%lu pBuffer addr(%p)\n", ++g_free_count, (void*)pFreeMe); | 
 | 330 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 331 |         free(pFreeMe); | 
 | 332 |     } | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 333 |     g_pBufferHead = NULL; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 334 | } | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 335 | static GLOBAL_CB_NODE* getCBNode(XGL_CMD_BUFFER cb); | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 336 |  | 
 | 337 | static void updateCBTracking(XGL_CMD_BUFFER cb) | 
 | 338 | { | 
 | 339 |     g_lastCmdBuffer[getTIDIndex()] = cb; | 
 | 340 |     GLOBAL_CB_NODE* pCB = getCBNode(cb); | 
 | 341 |     loader_platform_thread_lock_mutex(&globalLock); | 
 | 342 |     g_lastGlobalCB = pCB; | 
 | 343 |     // TODO : This is a dumb algorithm. Need smart LRU that drops off oldest | 
 | 344 |     for (uint32_t i = 0; i < NUM_COMMAND_BUFFERS_TO_DISPLAY; i++) { | 
 | 345 |         if (g_pLastTouchedCB[i] == pCB) { | 
 | 346 |             loader_platform_thread_unlock_mutex(&globalLock); | 
 | 347 |             return; | 
 | 348 |         } | 
 | 349 |     } | 
 | 350 |     g_pLastTouchedCB[g_lastTouchedCBIndex++] = pCB; | 
 | 351 |     g_lastTouchedCBIndex = g_lastTouchedCBIndex % NUM_COMMAND_BUFFERS_TO_DISPLAY; | 
 | 352 |     loader_platform_thread_unlock_mutex(&globalLock); | 
 | 353 | } | 
 | 354 |  | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 355 | // Print the last bound dynamic state | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 356 | static void printDynamicState(const XGL_CMD_BUFFER cb) | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 357 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 358 |     GLOBAL_CB_NODE* pCB = getCBNode(cb); | 
 | 359 |     if (pCB) { | 
 | 360 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 361 |         char str[4*1024]; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 362 |         for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) { | 
 | 363 |             if (pCB->lastBoundDynamicState[i]) { | 
 | 364 |                 sprintf(str, "Reporting CreateInfo for currently bound %s object %p", string_XGL_STATE_BIND_POINT(i), pCB->lastBoundDynamicState[i]->stateObj); | 
 | 365 |                 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCB->lastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", str); | 
 | 366 |                 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCB->lastBoundDynamicState[i]->stateObj, 0, DRAWSTATE_NONE, "DS", dynamic_display(pCB->lastBoundDynamicState[i]->pCreateInfo, "  ")); | 
 | 367 |                 break; | 
 | 368 |             } | 
 | 369 |             else { | 
 | 370 |                 sprintf(str, "No dynamic state of type %s bound", string_XGL_STATE_BIND_POINT(i)); | 
 | 371 |                 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str); | 
 | 372 |             } | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 373 |         } | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 374 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 375 |     } | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 376 |     else { | 
 | 377 |         char str[1024]; | 
 | 378 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cb); | 
 | 379 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 380 |     } | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 381 | } | 
 | 382 | // Retrieve pipeline node ptr for given pipeline object | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 383 | static PIPELINE_NODE *getPipeline(XGL_PIPELINE pipeline) | 
 | 384 | { | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 385 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 386 |     PIPELINE_NODE *pTrav = g_pPipelineHead; | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 387 |     while (pTrav) { | 
| Tobin Ehlis | 4a74436 | 2014-11-21 12:04:39 -0700 | [diff] [blame] | 388 |         if (pTrav->pipeline == pipeline) { | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 389 |             loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 390 |             return pTrav; | 
| Tobin Ehlis | 4a74436 | 2014-11-21 12:04:39 -0700 | [diff] [blame] | 391 |         } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 392 |         pTrav = pTrav->pNext; | 
 | 393 |     } | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 394 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 395 |     return NULL; | 
 | 396 | } | 
 | 397 |  | 
| Tobin Ehlis | 612ec6c | 2014-11-20 10:48:56 -0700 | [diff] [blame] | 398 | // For given sampler, return a ptr to its Create Info struct, or NULL if sampler not found | 
 | 399 | static XGL_SAMPLER_CREATE_INFO* getSamplerCreateInfo(const XGL_SAMPLER sampler) | 
 | 400 | { | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 401 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 402 |     SAMPLER_NODE *pTrav = g_pSamplerHead; | 
| Tobin Ehlis | 612ec6c | 2014-11-20 10:48:56 -0700 | [diff] [blame] | 403 |     while (pTrav) { | 
| Tobin Ehlis | 4a74436 | 2014-11-21 12:04:39 -0700 | [diff] [blame] | 404 |         if (sampler == pTrav->sampler) { | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 405 |             loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 612ec6c | 2014-11-20 10:48:56 -0700 | [diff] [blame] | 406 |             return &pTrav->createInfo; | 
| Tobin Ehlis | 4a74436 | 2014-11-21 12:04:39 -0700 | [diff] [blame] | 407 |         } | 
| Tobin Ehlis | 612ec6c | 2014-11-20 10:48:56 -0700 | [diff] [blame] | 408 |         pTrav = pTrav->pNext; | 
 | 409 |     } | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 410 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 612ec6c | 2014-11-20 10:48:56 -0700 | [diff] [blame] | 411 |     return NULL; | 
 | 412 | } | 
 | 413 |  | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 414 | // Init the pipeline mapping info based on pipeline create info LL tree | 
| Tobin Ehlis | 4a74436 | 2014-11-21 12:04:39 -0700 | [diff] [blame] | 415 | //  Threading note : Calls to this function should wrapped in mutex | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 416 | static void initPipeline(PIPELINE_NODE *pPipeline, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo) | 
 | 417 | { | 
| Tobin Ehlis | 5742e77 | 2014-11-20 09:49:17 -0700 | [diff] [blame] | 418 |     // First init create info, we'll shadow the structs as we go down the tree | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 419 |     pPipeline->pCreateTree = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)malloc(sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 420 | #if ALLOC_DEBUG | 
 | 421 |     printf("Alloc5 #%lu pPipeline->pCreateTree addr(%p)\n", ++g_alloc_count, (void*)pPipeline->pCreateTree); | 
 | 422 | #endif | 
| Tobin Ehlis | 5742e77 | 2014-11-20 09:49:17 -0700 | [diff] [blame] | 423 |     memcpy(pPipeline->pCreateTree, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO)); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 424 |     GENERIC_HEADER *pShadowTrav = (GENERIC_HEADER*)pPipeline->pCreateTree; | 
 | 425 |     GENERIC_HEADER *pTrav = (GENERIC_HEADER*)pCreateInfo->pNext; | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 426 |     while (pTrav) { | 
| Tobin Ehlis | 5742e77 | 2014-11-20 09:49:17 -0700 | [diff] [blame] | 427 |         // Shadow the struct | 
| Tobin Ehlis | 0411292 | 2015-03-16 10:44:40 -0600 | [diff] [blame] | 428 |         pShadowTrav->pNext = (GENERIC_HEADER*)malloc(get_dynamic_struct_size(pTrav)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 429 | #if ALLOC_DEBUG | 
 | 430 |     printf("Alloc6 #%lu pShadowTrav->pNext addr(%p)\n", ++g_alloc_count, (void*)pShadowTrav->pNext); | 
 | 431 | #endif | 
| Tobin Ehlis | 5742e77 | 2014-11-20 09:49:17 -0700 | [diff] [blame] | 432 |         // Typically pNext is const so have to cast to avoid warning when we modify it here | 
| Tobin Ehlis | 0411292 | 2015-03-16 10:44:40 -0600 | [diff] [blame] | 433 |         memcpy((void*)pShadowTrav->pNext, pTrav, get_dynamic_struct_size(pTrav)); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 434 |         pShadowTrav = (GENERIC_HEADER*)pShadowTrav->pNext; | 
 | 435 |         // Special copy of Vtx info as it has embedded array | 
 | 436 |         if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pTrav->sType) { | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 437 |             XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO *pVICI = (XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pShadowTrav; | 
| Tobin Ehlis | db20d60 | 2014-11-25 10:24:15 -0700 | [diff] [blame] | 438 |             pPipeline->vtxBindingCount = pVICI->bindingCount; | 
 | 439 |             uint32_t allocSize = pPipeline->vtxBindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 440 |             if (allocSize) { | 
 | 441 |                 pPipeline->pVertexBindingDescriptions = (XGL_VERTEX_INPUT_BINDING_DESCRIPTION*)malloc(allocSize); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 442 | #if ALLOC_DEBUG | 
 | 443 |     printf("Alloc7 #%lu pPipeline->pVertexBindingDescriptions addr(%p)\n", ++g_alloc_count, (void*)pPipeline->pVertexBindingDescriptions); | 
 | 444 | #endif | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 445 |                 memcpy(pPipeline->pVertexBindingDescriptions, ((XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav)->pVertexAttributeDescriptions, allocSize); | 
 | 446 |             } | 
| Tobin Ehlis | db20d60 | 2014-11-25 10:24:15 -0700 | [diff] [blame] | 447 |             pPipeline->vtxAttributeCount = pVICI->attributeCount; | 
 | 448 |             allocSize = pPipeline->vtxAttributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 449 |             if (allocSize) { | 
 | 450 |                 pPipeline->pVertexAttributeDescriptions = (XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION*)malloc(allocSize); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 451 | #if ALLOC_DEBUG | 
 | 452 |     printf("Alloc8 #%lu pPipeline->pVertexAttributeDescriptions addr(%p)\n", ++g_alloc_count, (void*)pPipeline->pVertexAttributeDescriptions); | 
 | 453 | #endif | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 454 |                 memcpy(pPipeline->pVertexAttributeDescriptions, ((XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pTrav)->pVertexAttributeDescriptions, allocSize); | 
 | 455 |             } | 
 | 456 |         } | 
 | 457 |         else if (XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO == pTrav->sType) { | 
 | 458 |             // Special copy of CB state as it has embedded array | 
 | 459 |             XGL_PIPELINE_CB_STATE_CREATE_INFO *pCBCI = (XGL_PIPELINE_CB_STATE_CREATE_INFO*)pShadowTrav; | 
 | 460 |             pPipeline->attachmentCount = pCBCI->attachmentCount; | 
 | 461 |             uint32_t allocSize = pPipeline->attachmentCount * sizeof(XGL_PIPELINE_CB_ATTACHMENT_STATE); | 
 | 462 |             if (allocSize) { | 
 | 463 |                 pPipeline->pAttachments = (XGL_PIPELINE_CB_ATTACHMENT_STATE*)malloc(allocSize); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 464 | #if ALLOC_DEBUG | 
 | 465 |     printf("Alloc9 #%lu pPipeline->pAttachments addr(%p)\n", ++g_alloc_count, (void*)pPipeline->pAttachments); | 
 | 466 | #endif | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 467 |                 XGL_PIPELINE_CB_ATTACHMENT_STATE** ppAttachments = (XGL_PIPELINE_CB_ATTACHMENT_STATE**)&pCBCI->pAttachments; | 
 | 468 |                 *ppAttachments = pPipeline->pAttachments; | 
 | 469 |                 memcpy(pPipeline->pAttachments, ((XGL_PIPELINE_CB_STATE_CREATE_INFO*)pTrav)->pAttachments, allocSize); | 
 | 470 |             } | 
| Tobin Ehlis | db20d60 | 2014-11-25 10:24:15 -0700 | [diff] [blame] | 471 |         } | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 472 |         pTrav = (GENERIC_HEADER*)pTrav->pNext; | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 473 |     } | 
 | 474 | } | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 475 | // Free the Pipeline nodes | 
 | 476 | static void freePipelines() | 
 | 477 | { | 
 | 478 |     PIPELINE_NODE* pPipeline = g_pPipelineHead; | 
 | 479 |     PIPELINE_NODE* pFreeMe = pPipeline; | 
 | 480 |     while (pPipeline) { | 
 | 481 |         pFreeMe = pPipeline; | 
 | 482 |         GENERIC_HEADER* pShadowTrav = (GENERIC_HEADER*)pPipeline->pCreateTree; | 
 | 483 |         GENERIC_HEADER* pShadowFree = pShadowTrav; | 
 | 484 |         while (pShadowTrav) { | 
 | 485 |             pShadowFree = pShadowTrav; | 
 | 486 |             pShadowTrav = (GENERIC_HEADER*)pShadowTrav->pNext; | 
 | 487 |             if (XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO == pShadowFree->sType) { | 
 | 488 |                 // Free the vtx data shadowed directly into pPipeline node | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 489 |                 if (pFreeMe->pVertexBindingDescriptions) { | 
 | 490 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 491 |                     printf("Free7 #%lu pVertexBindingDescriptions addr(%p)\n", ++g_free_count, (void*)pFreeMe->pVertexBindingDescriptions); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 492 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 493 |                     free(pFreeMe->pVertexBindingDescriptions); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 494 |                 } | 
 | 495 |                 if (pFreeMe->pVertexAttributeDescriptions) { | 
 | 496 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 497 |                     printf("Free8 #%lu pVertexAttributeDescriptions addr(%p)\n", ++g_free_count, (void*)pFreeMe->pVertexAttributeDescriptions); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 498 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 499 |                     free(pFreeMe->pVertexAttributeDescriptions); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 500 |                 } | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 501 |             } | 
 | 502 |             else if (XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO == pShadowFree->sType) { | 
 | 503 |                 // Free attachment data shadowed into pPipeline node | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 504 |                 if (pFreeMe->pAttachments) { | 
 | 505 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 506 |                     printf("Free9 #%lu pAttachments addr(%p)\n", ++g_free_count, (void*)pFreeMe->pAttachments); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 507 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 508 |                     free(pFreeMe->pAttachments); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 509 |                 } | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 510 |             } | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 511 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 512 |             printf("Free5 & Free6 #%lu pShadowNode addr(%p)\n", ++g_free_count, (void*)pShadowFree); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 513 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 514 |             free(pShadowFree); | 
 | 515 |         } | 
 | 516 |         pPipeline = pPipeline->pNext; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 517 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 518 |         printf("Free23 & Free24 #%lu pPipeline addr(%p)\n", ++g_free_count, (void*)pFreeMe); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 519 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 520 |         free(pFreeMe); | 
 | 521 |     } | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 522 |     g_pPipelineHead = NULL; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 523 | } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 524 | // Block of code at start here specifically for managing/tracking DSs | 
| Tobin Ehlis | 70f4726 | 2014-10-27 17:12:54 -0600 | [diff] [blame] | 525 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 526 | // ptr to HEAD of LL of DS Regions | 
 | 527 | static REGION_NODE* g_pRegionHead = NULL; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 528 | // ptr to HEAD of LL of top-level Layouts | 
 | 529 | static LAYOUT_NODE* g_pLayoutHead = NULL; | 
| Tobin Ehlis | 7e65d75 | 2015-01-15 17:51:52 -0700 | [diff] [blame] | 530 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 531 | // Return Region node ptr for specified region or else NULL | 
 | 532 | static REGION_NODE* getRegionNode(XGL_DESCRIPTOR_REGION region) | 
 | 533 | { | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 534 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 535 |     REGION_NODE* pTrav = g_pRegionHead; | 
 | 536 |     while (pTrav) { | 
 | 537 |         if (pTrav->region == region) { | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 538 |             loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 539 |             return pTrav; | 
 | 540 |         } | 
 | 541 |         pTrav = pTrav->pNext; | 
 | 542 |     } | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 543 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 544 |     return NULL; | 
 | 545 | } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 546 | // Return Set node ptr for specified set or else NULL | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 547 | static SET_NODE* getSetNode(XGL_DESCRIPTOR_SET set) | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 548 | { | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 549 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 550 |     REGION_NODE* pTrav = g_pRegionHead; | 
 | 551 |     while (pTrav) { | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 552 |         SET_NODE* pSet = pTrav->pSets; | 
 | 553 |         while (pSet) { | 
 | 554 |             if (pSet->set == set) { | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 555 |                 loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 556 |                 return pSet; | 
 | 557 |             } | 
 | 558 |             pSet = pSet->pNext; | 
 | 559 |         } | 
 | 560 |         pTrav = pTrav->pNext; | 
 | 561 |     } | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 562 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 563 |     return NULL; | 
 | 564 | } | 
 | 565 |  | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 566 | // Return XGL_TRUE if DS Exists and is within an xglBeginDescriptorRegionUpdate() call sequence, otherwise XGL_FALSE | 
 | 567 | static bool32_t dsUpdateActive(XGL_DESCRIPTOR_SET ds) | 
 | 568 | { | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 569 |     // Note, both "get" functions use global mutex so this guy does not | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 570 |     SET_NODE* pTrav = getSetNode(ds); | 
 | 571 |     if (pTrav) { | 
 | 572 |         REGION_NODE* pRegion = NULL; | 
 | 573 |         pRegion = getRegionNode(pTrav->region); | 
 | 574 |         if (pRegion) { | 
 | 575 |             return pRegion->updateActive; | 
 | 576 |         } | 
 | 577 |     } | 
 | 578 |     return XGL_FALSE; | 
 | 579 | } | 
 | 580 |  | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 581 | static LAYOUT_NODE* getLayoutNode(XGL_DESCRIPTOR_SET_LAYOUT layout) { | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 582 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 583 |     LAYOUT_NODE* pTrav = g_pLayoutHead; | 
 | 584 |     while (pTrav) { | 
 | 585 |         if (pTrav->layout == layout) { | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 586 |             loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 587 |             return pTrav; | 
 | 588 |         } | 
 | 589 |         pTrav = pTrav->pNext; | 
 | 590 |     } | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 591 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 592 |     return NULL; | 
 | 593 | } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 594 |  | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 595 | static uint32_t getUpdateIndex(GENERIC_HEADER* pUpdateStruct) | 
 | 596 | { | 
 | 597 |     switch (pUpdateStruct->sType) | 
 | 598 |     { | 
 | 599 |         case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS: | 
 | 600 |             return ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index; | 
 | 601 |         case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES: | 
 | 602 |             return ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index; | 
 | 603 |         case XGL_STRUCTURE_TYPE_UPDATE_IMAGES: | 
 | 604 |             return ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index; | 
 | 605 |         case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS: | 
 | 606 |             return ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index; | 
 | 607 |         case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY: | 
 | 608 |             return ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex; | 
 | 609 |         default: | 
 | 610 |             // TODO : Flag specific error for this case | 
 | 611 |             return 0; | 
 | 612 |     } | 
 | 613 | } | 
 | 614 |  | 
 | 615 | static uint32_t getUpdateUpperBound(GENERIC_HEADER* pUpdateStruct) | 
 | 616 | { | 
 | 617 |     switch (pUpdateStruct->sType) | 
 | 618 |     { | 
 | 619 |         case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS: | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 620 |             return (((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLERS*)pUpdateStruct)->index); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 621 |         case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES: | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 622 |             return (((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->count + ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdateStruct)->index); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 623 |         case XGL_STRUCTURE_TYPE_UPDATE_IMAGES: | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 624 |             return (((XGL_UPDATE_IMAGES*)pUpdateStruct)->count + ((XGL_UPDATE_IMAGES*)pUpdateStruct)->index); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 625 |         case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS: | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 626 |             return (((XGL_UPDATE_BUFFERS*)pUpdateStruct)->count + ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->index); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 627 |         case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY: | 
 | 628 |             // TODO : Need to understand this case better and make sure code is correct | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 629 |             return (((XGL_UPDATE_AS_COPY*)pUpdateStruct)->count + ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorIndex); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 630 |         default: | 
 | 631 |             // TODO : Flag specific error for this case | 
 | 632 |             return 0; | 
 | 633 |     } | 
 | 634 | } | 
 | 635 |  | 
 | 636 | // Verify that the descriptor type in the update struct matches what's expected by the layout | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 637 | static bool32_t validateUpdateType(GENERIC_HEADER* pUpdateStruct, const LAYOUT_NODE* pLayout)//XGL_DESCRIPTOR_TYPE type) | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 638 | { | 
 | 639 |     // First get actual type of update | 
 | 640 |     XGL_DESCRIPTOR_TYPE actualType; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 641 |     uint32_t i = 0; | 
 | 642 |     uint32_t bound = getUpdateUpperBound(pUpdateStruct); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 643 |     switch (pUpdateStruct->sType) | 
 | 644 |     { | 
 | 645 |         case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS: | 
 | 646 |             actualType = XGL_DESCRIPTOR_TYPE_SAMPLER; | 
 | 647 |             break; | 
 | 648 |         case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES: | 
 | 649 |             actualType = XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE; | 
 | 650 |             break; | 
 | 651 |         case XGL_STRUCTURE_TYPE_UPDATE_IMAGES: | 
 | 652 |             actualType = ((XGL_UPDATE_IMAGES*)pUpdateStruct)->descriptorType; | 
 | 653 |             break; | 
 | 654 |         case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS: | 
 | 655 |             actualType = ((XGL_UPDATE_BUFFERS*)pUpdateStruct)->descriptorType; | 
 | 656 |             break; | 
 | 657 |         case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY: | 
 | 658 |             actualType = ((XGL_UPDATE_AS_COPY*)pUpdateStruct)->descriptorType; | 
 | 659 |             break; | 
 | 660 |         default: | 
 | 661 |             // TODO : Flag specific error for this case | 
 | 662 |             return 0; | 
 | 663 |     } | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 664 |     for (i = getUpdateIndex(pUpdateStruct); i < bound; i++) { | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 665 |         if (pLayout->pTypes[i] != actualType) | 
 | 666 |             return 0; | 
 | 667 |     } | 
 | 668 |     return 1; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 669 | } | 
 | 670 |  | 
 | 671 | // Verify that update region for this update does not exceed max layout index for this type | 
 | 672 | static bool32_t validateUpdateSize(GENERIC_HEADER* pUpdateStruct, uint32_t layoutIdx) | 
 | 673 | { | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 674 |     if ((getUpdateUpperBound(pUpdateStruct)-1) > layoutIdx) | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 675 |         return 0; | 
 | 676 |     return 1; | 
 | 677 | } | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 678 | // Determine the update type, allocate a new struct of that type, shadow the given pUpdate | 
 | 679 | //   struct into the new struct and return ptr to shadow struct cast as GENERIC_HEADER | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 680 | // NOTE : Calls to this function should be wrapped in mutex | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 681 | static GENERIC_HEADER* shadowUpdateNode(GENERIC_HEADER* pUpdate) | 
 | 682 | { | 
 | 683 |     GENERIC_HEADER* pNewNode = NULL; | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 684 |     size_t array_size = 0; | 
| Tobin Ehlis | 6926cd9 | 2015-02-11 13:13:18 -0700 | [diff] [blame] | 685 |     size_t base_array_size = 0; | 
 | 686 |     size_t total_array_size = 0; | 
| Tobin Ehlis | 3bca6b5 | 2015-02-18 14:38:11 -0700 | [diff] [blame] | 687 |     size_t baseBuffAddr = 0; | 
| Tobin Ehlis | 6926cd9 | 2015-02-11 13:13:18 -0700 | [diff] [blame] | 688 |     XGL_UPDATE_BUFFERS* pUBCI; | 
| Tobin Ehlis | 3bca6b5 | 2015-02-18 14:38:11 -0700 | [diff] [blame] | 689 |     XGL_UPDATE_IMAGES* pUICI; | 
| Tobin Ehlis | 297b985 | 2015-02-23 16:09:58 -0700 | [diff] [blame] | 690 |     char str[1024]; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 691 |     switch (pUpdate->sType) | 
 | 692 |     { | 
 | 693 |         case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS: | 
 | 694 |             pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLERS)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 695 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 696 |             printf("Alloc10 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 697 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 698 |             memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLERS)); | 
 | 699 |             array_size = sizeof(XGL_SAMPLER) * ((XGL_UPDATE_SAMPLERS*)pNewNode)->count; | 
 | 700 |             ((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers = (XGL_SAMPLER*)malloc(array_size); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 701 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 702 |             printf("Alloc11 #%lu pNewNode->pSamplers addr(%p)\n", ++g_alloc_count, (void*)((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 703 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 704 |             memcpy((XGL_SAMPLER*)((XGL_UPDATE_SAMPLERS*)pNewNode)->pSamplers, ((XGL_UPDATE_SAMPLERS*)pUpdate)->pSamplers, array_size); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 705 |             break; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 706 |         case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES: | 
 | 707 |             pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_SAMPLER_TEXTURES)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 708 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 709 |             printf("Alloc12 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 710 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 711 |             memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_SAMPLER_TEXTURES)); | 
 | 712 |             array_size = sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) * ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count; | 
 | 713 |             ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews = (XGL_SAMPLER_IMAGE_VIEW_INFO*)malloc(array_size); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 714 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 715 |             printf("Alloc13 #%lu pNewNode->pSamplerImageViews addr(%p)\n", ++g_alloc_count, (void*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 716 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 717 |             for (uint32_t i = 0; i < ((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->count; i++) { | 
 | 718 |                 memcpy((XGL_SAMPLER_IMAGE_VIEW_INFO*)&((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews[i], &((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdate)->pSamplerImageViews[i], sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO)); | 
 | 719 |                 ((XGL_SAMPLER_IMAGE_VIEW_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews)[i].pImageView = malloc(sizeof(XGL_IMAGE_VIEW_ATTACH_INFO)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 720 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 721 |                 printf("Alloc14 #%lu pSamplerImageViews)[%u].pImageView addr(%p)\n", ++g_alloc_count, i, (void*)((XGL_SAMPLER_IMAGE_VIEW_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews)[i].pImageView); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 722 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 723 |                 memcpy((XGL_IMAGE_VIEW_ATTACH_INFO*)((XGL_UPDATE_SAMPLER_TEXTURES*)pNewNode)->pSamplerImageViews[i].pImageView, ((XGL_UPDATE_SAMPLER_TEXTURES*)pUpdate)->pSamplerImageViews[i].pImageView, sizeof(XGL_IMAGE_VIEW_ATTACH_INFO)); | 
 | 724 |             } | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 725 |             break; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 726 |         case XGL_STRUCTURE_TYPE_UPDATE_IMAGES: | 
| Tobin Ehlis | 3bca6b5 | 2015-02-18 14:38:11 -0700 | [diff] [blame] | 727 |             pUICI = (XGL_UPDATE_IMAGES*)pUpdate; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 728 |             pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_IMAGES)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 729 | #if ALLOC_DEBUG | 
 | 730 |             printf("Alloc15 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode); | 
 | 731 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 732 |             memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_IMAGES)); | 
| Tobin Ehlis | 6926cd9 | 2015-02-11 13:13:18 -0700 | [diff] [blame] | 733 |             base_array_size = sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*) * ((XGL_UPDATE_IMAGES*)pNewNode)->count; | 
 | 734 |             total_array_size = (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) * ((XGL_UPDATE_IMAGES*)pNewNode)->count) + base_array_size; | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 735 |             XGL_IMAGE_VIEW_ATTACH_INFO*** pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO***)&((XGL_UPDATE_IMAGES*)pNewNode)->pImageViews; | 
 | 736 |             *pppLocalImageViews = (XGL_IMAGE_VIEW_ATTACH_INFO**)malloc(total_array_size); | 
| Tobin Ehlis | 3bca6b5 | 2015-02-18 14:38:11 -0700 | [diff] [blame] | 737 | #if ALLOC_DEBUG | 
 | 738 |             printf("Alloc16 #%lu *pppLocalImageViews addr(%p)\n", ++g_alloc_count, (void*)*pppLocalImageViews); | 
 | 739 | #endif | 
 | 740 |             baseBuffAddr = (size_t)(*pppLocalImageViews) + base_array_size; | 
 | 741 |             for (uint32_t i = 0; i < pUICI->count; i++) { | 
| Tobin Ehlis | 58c025c | 2015-02-19 13:14:59 -0700 | [diff] [blame] | 742 |                 (*pppLocalImageViews)[i] = (XGL_IMAGE_VIEW_ATTACH_INFO*)(baseBuffAddr + (i * sizeof(XGL_IMAGE_VIEW_ATTACH_INFO))); | 
 | 743 |                 memcpy((*pppLocalImageViews)[i], pUICI->pImageViews[i], sizeof(XGL_IMAGE_VIEW_ATTACH_INFO)); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 744 |             } | 
 | 745 |             break; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 746 |         case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS: | 
| Tobin Ehlis | 6926cd9 | 2015-02-11 13:13:18 -0700 | [diff] [blame] | 747 |             pUBCI = (XGL_UPDATE_BUFFERS*)pUpdate; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 748 |             pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_BUFFERS)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 749 | #if ALLOC_DEBUG | 
 | 750 |             printf("Alloc17 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode); | 
 | 751 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 752 |             memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_BUFFERS)); | 
| Tobin Ehlis | 6926cd9 | 2015-02-11 13:13:18 -0700 | [diff] [blame] | 753 |             base_array_size = sizeof(XGL_BUFFER_VIEW_ATTACH_INFO*) * pUBCI->count; | 
 | 754 |             total_array_size = (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) * pUBCI->count) + base_array_size; | 
 | 755 |             XGL_BUFFER_VIEW_ATTACH_INFO*** pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO***)&((XGL_UPDATE_BUFFERS*)pNewNode)->pBufferViews; | 
 | 756 |             *pppLocalBufferViews = (XGL_BUFFER_VIEW_ATTACH_INFO**)malloc(total_array_size); | 
| Tobin Ehlis | 3bca6b5 | 2015-02-18 14:38:11 -0700 | [diff] [blame] | 757 | #if ALLOC_DEBUG | 
 | 758 |             printf("Alloc18 #%lu *pppLocalBufferViews addr(%p)\n", ++g_alloc_count, (void*)*pppLocalBufferViews); | 
 | 759 | #endif | 
 | 760 |             baseBuffAddr = (size_t)(*pppLocalBufferViews) + base_array_size; | 
| Tobin Ehlis | 6926cd9 | 2015-02-11 13:13:18 -0700 | [diff] [blame] | 761 |             for (uint32_t i = 0; i < pUBCI->count; i++) { | 
 | 762 |                 // Set ptr and then copy data into that ptr | 
| Tobin Ehlis | 58c025c | 2015-02-19 13:14:59 -0700 | [diff] [blame] | 763 |                 (*pppLocalBufferViews)[i] = (XGL_BUFFER_VIEW_ATTACH_INFO*)(baseBuffAddr + (i * sizeof(XGL_BUFFER_VIEW_ATTACH_INFO))); | 
 | 764 |                 memcpy((*pppLocalBufferViews)[i], pUBCI->pBufferViews[i], sizeof(XGL_BUFFER_VIEW_ATTACH_INFO)); | 
| Tobin Ehlis | 6926cd9 | 2015-02-11 13:13:18 -0700 | [diff] [blame] | 765 |             } | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 766 |             break; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 767 |         case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY: | 
 | 768 |             pNewNode = (GENERIC_HEADER*)malloc(sizeof(XGL_UPDATE_AS_COPY)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 769 | #if ALLOC_DEBUG | 
 | 770 |             printf("Alloc19 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode); | 
 | 771 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 772 |             memcpy(pNewNode, pUpdate, sizeof(XGL_UPDATE_AS_COPY)); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 773 |             break; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 774 |         default: | 
| Tobin Ehlis | 297b985 | 2015-02-23 16:09:58 -0700 | [diff] [blame] | 775 |             sprintf(str, "Unexpected UPDATE struct of type %s (value %u) in xglUpdateDescriptors() struct tree", string_XGL_STRUCTURE_TYPE(pUpdate->sType), pUpdate->sType); | 
 | 776 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_INVALID_UPDATE_STRUCT, "DS", str); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 777 |             return NULL; | 
 | 778 |     } | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 779 |     // Make sure that pNext for the end of shadow copy is NULL | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 780 |     pNewNode->pNext = NULL; | 
 | 781 |     return pNewNode; | 
 | 782 | } | 
| Tobin Ehlis | 297b985 | 2015-02-23 16:09:58 -0700 | [diff] [blame] | 783 | // For given ds, update its mapping based on pUpdateChain linked-list | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 784 | static void dsUpdate(XGL_DESCRIPTOR_SET ds, GENERIC_HEADER* pUpdateChain) | 
 | 785 | { | 
 | 786 |     SET_NODE* pSet = getSetNode(ds); | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 787 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 4821eef | 2015-03-02 16:09:15 -0700 | [diff] [blame] | 788 |     g_lastBoundDescriptorSet = pSet->set; | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 789 |     LAYOUT_NODE* pLayout = NULL; | 
| Tobin Ehlis | ef0c47c | 2015-02-25 11:46:39 -0700 | [diff] [blame] | 790 |     XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLayoutCI = NULL; | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 791 |     // TODO : If pCIList is NULL, flag error | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 792 |     GENERIC_HEADER* pUpdates = pUpdateChain; | 
 | 793 |     // Perform all updates | 
 | 794 |     while (pUpdates) { | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 795 |         pLayout = pSet->pLayouts; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 796 |         // For each update first find the layout section that it overlaps | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 797 |         while (pLayout && (pLayout->startIndex > getUpdateIndex(pUpdates))) { | 
 | 798 |             pLayout = pLayout->pPriorSetLayout; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 799 |         } | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 800 |         if (!pLayout) { | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 801 |             char str[1024]; | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 802 |             sprintf(str, "Descriptor Set %p does not have index to match update index %u for update type %s!", ds, getUpdateIndex(pUpdates), string_XGL_STRUCTURE_TYPE(pUpdates->sType)); | 
 | 803 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", str); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 804 |         } | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 805 |         else { | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 806 |             // Next verify that update is correct size | 
 | 807 |             if (!validateUpdateSize(pUpdates, pLayout->endIndex)) { | 
 | 808 |                 char str[48*1024]; // TODO : Keep count of layout CI structs and size this string dynamically based on that count | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 809 |                 pLayoutCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLayout->pCreateInfoList; | 
| Tobin Ehlis | ef0c47c | 2015-02-25 11:46:39 -0700 | [diff] [blame] | 810 |                 char* pDSstr = xgl_print_xgl_descriptor_set_layout_create_info(pLayoutCI, "{DS}    "); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 811 |                 sprintf(str, "Descriptor update type of %s is out of bounds for matching layout w/ CI:\n%s!", string_XGL_STRUCTURE_TYPE(pUpdates->sType), pDSstr); | 
 | 812 |                 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_UPDATE_OUT_OF_BOUNDS, "DS", str); | 
 | 813 |                 free(pDSstr); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 814 |             } | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 815 |             else { // TODO : should we skip update on a type mismatch or force it? | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 816 |                 // We have the right layout section, now verify that update is of the right type | 
 | 817 |                 if (!validateUpdateType(pUpdates, pLayout)) { | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 818 |                     char str[1024]; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 819 |                     sprintf(str, "Descriptor update type of %s does not match overlapping layout type!", string_XGL_STRUCTURE_TYPE(pUpdates->sType)); | 
 | 820 |                     layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_DESCRIPTOR_TYPE_MISMATCH, "DS", str); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 821 |                 } | 
 | 822 |                 else { | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 823 |                     // Save the update info | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 824 |                     // TODO : Info message that update successful | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 825 |                     // Create new update struct for this set's shadow copy | 
 | 826 |                     GENERIC_HEADER* pNewNode = shadowUpdateNode(pUpdates); | 
 | 827 |                     if (NULL == pNewNode) { | 
 | 828 |                         char str[1024]; | 
 | 829 |                         sprintf(str, "Out of memory while attempting to allocate UPDATE struct in xglUpdateDescriptors()"); | 
 | 830 |                         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, ds, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 831 |                     } | 
 | 832 |                     else { | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 833 |                         // Insert shadow node into LL of updates for this set | 
 | 834 |                         pNewNode->pNext = pSet->pUpdateStructs; | 
 | 835 |                         pSet->pUpdateStructs = pNewNode; | 
 | 836 |                         // Now update appropriate descriptor(s) to point to new Update node | 
 | 837 |                         for (uint32_t i = getUpdateIndex(pUpdates); i < getUpdateUpperBound(pUpdates); i++) { | 
| Tobin Ehlis | b62a6fa | 2015-02-25 16:34:54 -0700 | [diff] [blame] | 838 |                             assert(i<pSet->descriptorCount); | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 839 |                             pSet->ppDescriptors[i] = pNewNode; | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 840 |                         } | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 841 |                     } | 
 | 842 |                 } | 
 | 843 |             } | 
 | 844 |         } | 
 | 845 |         pUpdates = (GENERIC_HEADER*)pUpdates->pNext; | 
 | 846 |     } | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 847 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 848 | } | 
| Tobin Ehlis | 297b985 | 2015-02-23 16:09:58 -0700 | [diff] [blame] | 849 | // Free the shadowed update node for this Set | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 850 | // NOTE : Calls to this function should be wrapped in mutex | 
| Tobin Ehlis | 297b985 | 2015-02-23 16:09:58 -0700 | [diff] [blame] | 851 | static void freeShadowUpdateTree(SET_NODE* pSet) | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 852 | { | 
| Tobin Ehlis | 297b985 | 2015-02-23 16:09:58 -0700 | [diff] [blame] | 853 |     GENERIC_HEADER* pShadowUpdate = pSet->pUpdateStructs; | 
 | 854 |     pSet->pUpdateStructs = NULL; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 855 |     GENERIC_HEADER* pFreeUpdate = pShadowUpdate; | 
| Tobin Ehlis | 8cb421e | 2015-02-25 15:01:21 -0700 | [diff] [blame] | 856 |     // Clear the descriptor mappings as they will now be invalid | 
| Tobin Ehlis | b62a6fa | 2015-02-25 16:34:54 -0700 | [diff] [blame] | 857 |     memset(pSet->ppDescriptors, 0, pSet->descriptorCount*sizeof(GENERIC_HEADER*)); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 858 |     while(pShadowUpdate) { | 
 | 859 |         pFreeUpdate = pShadowUpdate; | 
 | 860 |         pShadowUpdate = (GENERIC_HEADER*)pShadowUpdate->pNext; | 
 | 861 |         uint32_t index = 0; | 
 | 862 |         XGL_UPDATE_SAMPLERS* pUS = NULL; | 
 | 863 |         XGL_UPDATE_SAMPLER_TEXTURES* pUST = NULL; | 
 | 864 |         XGL_UPDATE_IMAGES* pUI = NULL; | 
 | 865 |         XGL_UPDATE_BUFFERS* pUB = NULL; | 
 | 866 |         void** ppToFree = NULL; | 
 | 867 |         switch (pFreeUpdate->sType) | 
 | 868 |         { | 
 | 869 |             case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS: | 
 | 870 |                 pUS = (XGL_UPDATE_SAMPLERS*)pFreeUpdate; | 
 | 871 |                 if (pUS->pSamplers) { | 
 | 872 |                     ppToFree = (void**)&pUS->pSamplers; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 873 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 874 |                     printf("Free11 #%lu pSamplers addr(%p)\n", ++g_free_count, (void*)*ppToFree); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 875 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 876 |                     free(*ppToFree); | 
 | 877 |                 } | 
 | 878 |                 break; | 
 | 879 |             case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES: | 
 | 880 |                 pUST = (XGL_UPDATE_SAMPLER_TEXTURES*)pFreeUpdate; | 
 | 881 |                 for (index = 0; index < pUST->count; index++) { | 
 | 882 |                     if (pUST->pSamplerImageViews[index].pImageView) { | 
 | 883 |                         ppToFree = (void**)&pUST->pSamplerImageViews[index].pImageView; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 884 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 885 |                         printf("Free14 #%lu pImageView addr(%p)\n", ++g_free_count, (void*)*ppToFree); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 886 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 887 |                         free(*ppToFree); | 
 | 888 |                     } | 
 | 889 |                 } | 
 | 890 |                 ppToFree = (void**)&pUST->pSamplerImageViews; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 891 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 892 |                 printf("Free13 #%lu pSamplerImageViews addr(%p)\n", ++g_free_count, (void*)*ppToFree); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 893 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 894 |                 free(*ppToFree); | 
 | 895 |                 break; | 
 | 896 |             case XGL_STRUCTURE_TYPE_UPDATE_IMAGES: | 
 | 897 |                 pUI = (XGL_UPDATE_IMAGES*)pFreeUpdate; | 
 | 898 |                 if (pUI->pImageViews) { | 
 | 899 |                     ppToFree = (void**)&pUI->pImageViews; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 900 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 901 |                     printf("Free16 #%lu pImageViews addr(%p)\n", ++g_free_count, (void*)*ppToFree); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 902 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 903 |                     free(*ppToFree); | 
 | 904 |                 } | 
 | 905 |                 break; | 
 | 906 |             case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS: | 
 | 907 |                 pUB = (XGL_UPDATE_BUFFERS*)pFreeUpdate; | 
 | 908 |                 if (pUB->pBufferViews) { | 
 | 909 |                     ppToFree = (void**)&pUB->pBufferViews; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 910 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 911 |                     printf("Free18 #%lu pBufferViews addr(%p)\n", ++g_free_count, (void*)*ppToFree); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 912 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 913 |                     free(*ppToFree); | 
 | 914 |                 } | 
 | 915 |                 break; | 
 | 916 |             case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY: | 
 | 917 |                 break; | 
 | 918 |             default: | 
 | 919 |                 assert(0); | 
 | 920 |                 break; | 
 | 921 |         } | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 922 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 923 |         printf("Free10, Free12, Free15, Free17, Free19 #%lu pUpdateNode addr(%p)\n", ++g_free_count, (void*)pFreeUpdate); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 924 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 925 |         free(pFreeUpdate); | 
 | 926 |     } | 
 | 927 | } | 
 | 928 | // Free all DS Regions including their Sets & related sub-structs | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 929 | // NOTE : Calls to this function should be wrapped in mutex | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 930 | static void freeRegions() | 
 | 931 | { | 
 | 932 |     REGION_NODE* pRegion = g_pRegionHead; | 
 | 933 |     REGION_NODE* pFreeMe = pRegion; | 
 | 934 |     while (pRegion) { | 
 | 935 |         pFreeMe = pRegion; | 
 | 936 |         SET_NODE* pSet = pRegion->pSets; | 
 | 937 |         SET_NODE* pFreeSet = pSet; | 
 | 938 |         while (pSet) { | 
 | 939 |             pFreeSet = pSet; | 
 | 940 |             pSet = pSet->pNext; | 
 | 941 |             // Freeing layouts handled in freeLayouts() function | 
 | 942 |             // Free Update shadow struct tree | 
| Tobin Ehlis | 297b985 | 2015-02-23 16:09:58 -0700 | [diff] [blame] | 943 |             freeShadowUpdateTree(pFreeSet); | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 944 |             if (pFreeSet->ppDescriptors) { | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 945 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 946 |                 printf("Free35 #%lu pSet->ppDescriptors addr(%p)\n", ++g_free_count, (void*)pFreeSet->ppDescriptors); | 
 | 947 | #endif | 
 | 948 |                 free(pFreeSet->ppDescriptors); | 
 | 949 |             } | 
 | 950 | #if ALLOC_DEBUG | 
 | 951 |             printf("Free32 #%lu pSet addr(%p)\n", ++g_free_count, (void*)pFreeSet); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 952 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 953 |             free(pFreeSet); | 
 | 954 |         } | 
 | 955 |         pRegion = pRegion->pNext; | 
 | 956 |         if (pFreeMe->createInfo.pTypeCount) { | 
 | 957 |             void** ppToFree = (void**)&pFreeMe->createInfo.pTypeCount; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 958 | #if ALLOC_DEBUG | 
 | 959 |     printf("Free31 #%lu pTypeCount addr(%p)\n", ++g_free_count, (void*)*ppToFree); | 
 | 960 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 961 |             free(*ppToFree); | 
 | 962 |         } | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 963 | #if ALLOC_DEBUG | 
 | 964 |     printf("Free30 #%lu pRegion addr(%p)\n", ++g_free_count, (void*)pFreeMe); | 
 | 965 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 966 |         free(pFreeMe); | 
 | 967 |     } | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 968 |     g_pRegionHead = NULL; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 969 | } | 
 | 970 | // WARN : Once freeLayouts() called, any layout ptrs in Region/Set data structure will be invalid | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 971 | // NOTE : Calls to this function should be wrapped in mutex | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 972 | static void freeLayouts() | 
 | 973 | { | 
 | 974 |     LAYOUT_NODE* pLayout = g_pLayoutHead; | 
 | 975 |     LAYOUT_NODE* pFreeLayout = pLayout; | 
 | 976 |     while (pLayout) { | 
 | 977 |         pFreeLayout = pLayout; | 
 | 978 |         GENERIC_HEADER* pTrav = (GENERIC_HEADER*)pLayout->pCreateInfoList; | 
 | 979 |         while (pTrav) { | 
 | 980 |             void* pToFree = (void*)pTrav; | 
 | 981 |             pTrav = (GENERIC_HEADER*)pTrav->pNext; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 982 | #if ALLOC_DEBUG | 
 | 983 |     printf("Free27 & Free28 #%lu pLayoutCITree addr(%p)\n", ++g_free_count, (void*)pToFree); | 
 | 984 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 985 |             free(pToFree); | 
 | 986 |         } | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 987 |         if (pLayout->pTypes) { | 
 | 988 | #if ALLOC_DEBUG | 
 | 989 |     printf("Free29 #%lu pLayout->pTypes addr(%p)\n", ++g_free_count, (void*)pLayout->pTypes); | 
 | 990 | #endif | 
 | 991 |             free(pLayout->pTypes); | 
 | 992 |         } | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 993 |         pLayout = pLayout->pNext; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 994 | #if ALLOC_DEBUG | 
 | 995 |     printf("Free26 #%lu pLayout addr(%p)\n", ++g_free_count, (void*)pFreeLayout); | 
 | 996 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 997 |         free(pFreeLayout); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 998 |     } | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 999 |     g_pLayoutHead = NULL; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1000 | } | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1001 | // Currently clearing a set is removing all previous updates to that set | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1002 | //  TODO : Validate if this is correct clearing behavior | 
 | 1003 | static void clearDescriptorSet(XGL_DESCRIPTOR_SET set) | 
 | 1004 | { | 
 | 1005 |     SET_NODE* pSet = getSetNode(set); | 
 | 1006 |     if (!pSet) { | 
 | 1007 |         // TODO : Return error | 
 | 1008 |     } | 
 | 1009 |     else { | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1010 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 297b985 | 2015-02-23 16:09:58 -0700 | [diff] [blame] | 1011 |         freeShadowUpdateTree(pSet); | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1012 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1013 |     } | 
 | 1014 | } | 
 | 1015 |  | 
 | 1016 | static void clearDescriptorRegion(XGL_DESCRIPTOR_REGION region) | 
 | 1017 | { | 
 | 1018 |     REGION_NODE* pRegion = getRegionNode(region); | 
 | 1019 |     if (!pRegion) { | 
 | 1020 |         char str[1024]; | 
 | 1021 |         sprintf(str, "Unable to find region node for region %p specified in xglClearDescriptorRegion() call", (void*)region); | 
 | 1022 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, region, 0, DRAWSTATE_INVALID_REGION, "DS", str); | 
 | 1023 |     } | 
 | 1024 |     else | 
 | 1025 |     { | 
 | 1026 |         // For every set off of this region, clear it | 
 | 1027 |         SET_NODE* pSet = pRegion->pSets; | 
 | 1028 |         while (pSet) { | 
 | 1029 |             clearDescriptorSet(pSet->set); | 
 | 1030 |         } | 
 | 1031 |     } | 
 | 1032 | } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1033 |  | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1034 | // Code here to manage the Cmd buffer LL | 
 | 1035 | static GLOBAL_CB_NODE* getCBNode(XGL_CMD_BUFFER cb) | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 1036 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1037 |     loader_platform_thread_lock_mutex(&globalLock); | 
 | 1038 |     GLOBAL_CB_NODE* pCB = g_pCmdBufferHead; | 
 | 1039 |     while (pCB) { | 
 | 1040 |         if (cb == pCB->cmdBuffer) { | 
 | 1041 |             loader_platform_thread_unlock_mutex(&globalLock); | 
 | 1042 |             return pCB; | 
 | 1043 |         } | 
 | 1044 |         pCB = pCB->pNextGlobalCBNode; | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 1045 |     } | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1046 |     loader_platform_thread_unlock_mutex(&globalLock); | 
 | 1047 |     return NULL; | 
 | 1048 | } | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1049 | // Free all CB Nodes | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1050 | // NOTE : Calls to this function should be wrapped in mutex | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1051 | static void freeCmdBuffers() | 
 | 1052 | { | 
 | 1053 |     GLOBAL_CB_NODE* pCB = g_pCmdBufferHead; | 
 | 1054 |     GLOBAL_CB_NODE* pFreeMe = pCB; | 
 | 1055 |     while (pCB) { | 
 | 1056 |         pFreeMe = pCB; | 
 | 1057 |         CMD_NODE* pCmd = pCB->pCmds; | 
 | 1058 |         CMD_NODE* pFreeCmd = pCmd; | 
 | 1059 |         while (pCmd) { | 
 | 1060 |             pFreeCmd = pCmd; | 
 | 1061 |             pCmd = pCmd->pNext; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1062 | #if ALLOC_DEBUG | 
 | 1063 |     printf("Free20 #%lu pCmd addr(%p)\n", ++g_free_count, (void*)pFreeCmd); | 
 | 1064 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1065 |             free(pFreeCmd); | 
 | 1066 |         } | 
 | 1067 |         pCB = pCB->pNextGlobalCBNode; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1068 | #if ALLOC_DEBUG | 
 | 1069 |     printf("Free33 #%lu pCB addr(%p)\n", ++g_free_count, (void*)pFreeMe); | 
 | 1070 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1071 |         free(pFreeMe); | 
 | 1072 |     } | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1073 |     g_pCmdBufferHead = NULL; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1074 | } | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 1075 | static void addCmd(GLOBAL_CB_NODE* pCB, const CMD_TYPE cmd) | 
 | 1076 | { | 
 | 1077 |     CMD_NODE* pCmd = (CMD_NODE*)malloc(sizeof(CMD_NODE)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1078 | #if ALLOC_DEBUG | 
 | 1079 |     printf("Alloc20 #%lu pCmd addr(%p)\n", ++g_alloc_count, (void*)pCmd); | 
 | 1080 | #endif | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 1081 |     if (pCmd) { | 
 | 1082 |         // init cmd node and append to end of cmd LL | 
 | 1083 |         memset(pCmd, 0, sizeof(CMD_NODE)); | 
 | 1084 |         pCB->numCmds++; | 
 | 1085 |         pCmd->cmdNumber = pCB->numCmds; | 
 | 1086 |         pCmd->type = cmd; | 
 | 1087 |         if (!pCB->pCmds) { | 
 | 1088 |             pCB->pCmds = pCmd; | 
 | 1089 |         } | 
 | 1090 |         else { | 
| Tobin Ehlis | 10ae8c1 | 2015-03-17 16:24:32 -0600 | [diff] [blame] | 1091 |             assert(pCB->pLastCmd); | 
 | 1092 |             pCB->pLastCmd->pNext = pCmd; | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 1093 |         } | 
| Tobin Ehlis | 10ae8c1 | 2015-03-17 16:24:32 -0600 | [diff] [blame] | 1094 |         pCB->pLastCmd = pCmd; | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 1095 |     } | 
 | 1096 |     else { | 
 | 1097 |         char str[1024]; | 
 | 1098 |         sprintf(str, "Out of memory while attempting to allocate new CMD_NODE for cmdBuffer %p", (void*)pCB->cmdBuffer); | 
 | 1099 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pCB->cmdBuffer, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str); | 
 | 1100 |     } | 
 | 1101 | } | 
 | 1102 | static void resetCB(const XGL_CMD_BUFFER cb) | 
 | 1103 | { | 
 | 1104 |     GLOBAL_CB_NODE* pCB = getCBNode(cb); | 
 | 1105 |     if (pCB) { | 
 | 1106 |         CMD_NODE* pCur = pCB->pCmds; | 
 | 1107 |         CMD_NODE* pFreeMe = pCur; | 
 | 1108 |         while (pCur) { | 
 | 1109 |             pFreeMe = pCur; | 
 | 1110 |             pCur = pCur->pNext; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1111 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1112 |             printf("Free20 #%lu pCmd addr(%p)\n", ++g_free_count, (void*)pFreeMe); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1113 | #endif | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 1114 |             free(pFreeMe); | 
 | 1115 |         } | 
 | 1116 |         // Reset CB state | 
 | 1117 |         GLOBAL_CB_NODE* pSaveNext = pCB->pNextGlobalCBNode; | 
 | 1118 |         XGL_FLAGS saveFlags = pCB->flags; | 
| Courtney Goeltzenleuchter | 18248e6 | 2015-03-05 18:09:39 -0700 | [diff] [blame] | 1119 |         uint32_t saveQueueNodeIndex = pCB->queueNodeIndex; | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 1120 |         memset(pCB, 0, sizeof(GLOBAL_CB_NODE)); | 
 | 1121 |         pCB->cmdBuffer = cb; | 
 | 1122 |         pCB->flags = saveFlags; | 
| Courtney Goeltzenleuchter | 18248e6 | 2015-03-05 18:09:39 -0700 | [diff] [blame] | 1123 |         pCB->queueNodeIndex = saveQueueNodeIndex; | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 1124 |         pCB->pNextGlobalCBNode = pSaveNext; | 
 | 1125 |         pCB->lastVtxBinding = MAX_BINDING; | 
 | 1126 |     } | 
 | 1127 | } | 
 | 1128 | // Set the last bound dynamic state of given type | 
 | 1129 | // TODO : Need to track this per cmdBuffer and correlate cmdBuffer for Draw w/ last bound for that cmdBuffer? | 
 | 1130 | static void setLastBoundDynamicState(const XGL_CMD_BUFFER cmdBuffer, const XGL_DYNAMIC_STATE_OBJECT state, const XGL_STATE_BIND_POINT sType) | 
 | 1131 | { | 
 | 1132 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 1133 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 1134 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1135 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 1136 |         addCmd(pCB, CMD_BINDDYNAMICSTATEOBJECT); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 1137 |         DYNAMIC_STATE_NODE* pTrav = g_pDynamicStateHead[sType]; | 
 | 1138 |         while (pTrav && (state != pTrav->stateObj)) { | 
 | 1139 |             pTrav = pTrav->pNext; | 
 | 1140 |         } | 
 | 1141 |         if (!pTrav) { | 
 | 1142 |             char str[1024]; | 
 | 1143 |             sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state); | 
 | 1144 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, state, 0, DRAWSTATE_INVALID_DYNAMIC_STATE_OBJECT, "DS", str); | 
 | 1145 |         } | 
 | 1146 |         pCB->lastBoundDynamicState[sType] = pTrav; | 
| Tobin Ehlis | ae708b8 | 2015-02-27 08:48:43 -0700 | [diff] [blame] | 1147 |         g_lastBoundDynamicState[sType] = pTrav; | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 1148 |         loader_platform_thread_unlock_mutex(&globalLock); | 
 | 1149 |     } | 
 | 1150 |     else { | 
 | 1151 |         char str[1024]; | 
 | 1152 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 1153 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 1154 |     } | 
 | 1155 | } | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1156 | // Print the last bound Gfx Pipeline | 
 | 1157 | static void printPipeline(const XGL_CMD_BUFFER cb) | 
 | 1158 | { | 
 | 1159 |     GLOBAL_CB_NODE* pCB = getCBNode(cb); | 
 | 1160 |     if (pCB) { | 
 | 1161 |         PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline); | 
 | 1162 |         if (!pPipeTrav) { | 
 | 1163 |             // nothing to print | 
 | 1164 |         } | 
 | 1165 |         else { | 
 | 1166 |             char* pipeStr = xgl_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "{DS}"); | 
 | 1167 |             layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", pipeStr); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1168 |             free(pipeStr); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1169 |         } | 
| Tobin Ehlis | 9dc93af | 2014-11-21 08:58:46 -0700 | [diff] [blame] | 1170 |     } | 
 | 1171 | } | 
| Tobin Ehlis | ae708b8 | 2015-02-27 08:48:43 -0700 | [diff] [blame] | 1172 | // Common Dot dumping code | 
 | 1173 | static void dsCoreDumpDot(const XGL_DESCRIPTOR_SET ds, FILE* pOutFile) | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 1174 | { | 
| Tobin Ehlis | ae708b8 | 2015-02-27 08:48:43 -0700 | [diff] [blame] | 1175 |     SET_NODE* pSet = getSetNode(ds); | 
 | 1176 |     if (pSet) { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1177 |         REGION_NODE* pRegion = getRegionNode(pSet->region); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1178 |         char tmp_str[4*1024]; | 
| Tobin Ehlis | 6926cd9 | 2015-02-11 13:13:18 -0700 | [diff] [blame] | 1179 |         fprintf(pOutFile, "subgraph cluster_DescriptorRegion\n{\nlabel=\"Descriptor Region\"\n"); | 
 | 1180 |         sprintf(tmp_str, "Region (%p)", pRegion->region); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1181 |         char* pGVstr = xgl_gv_print_xgl_descriptor_region_create_info(&pRegion->createInfo, tmp_str); | 
 | 1182 |         fprintf(pOutFile, "%s", pGVstr); | 
 | 1183 |         free(pGVstr); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1184 |         fprintf(pOutFile, "subgraph cluster_DescriptorSet\n{\nlabel=\"Descriptor Set (%p)\"\n", pSet->set); | 
 | 1185 |         sprintf(tmp_str, "Descriptor Set (%p)", pSet->set); | 
 | 1186 |         LAYOUT_NODE* pLayout = pSet->pLayouts; | 
 | 1187 |         uint32_t layout_index = 0; | 
 | 1188 |         while (pLayout) { | 
 | 1189 |             ++layout_index; | 
 | 1190 |             sprintf(tmp_str, "LAYOUT%u", layout_index); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1191 |             pGVstr = xgl_gv_print_xgl_descriptor_set_layout_create_info(pLayout->pCreateInfoList, tmp_str); | 
 | 1192 |             fprintf(pOutFile, "%s", pGVstr); | 
 | 1193 |             free(pGVstr); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1194 |             pLayout = pLayout->pNext; | 
 | 1195 |             if (pLayout) { | 
 | 1196 |                 fprintf(pOutFile, "\"%s\" -> \"LAYOUT%u\" [];\n", tmp_str, layout_index+1); | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 1197 |             } | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 1198 |         } | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1199 |         if (pSet->pUpdateStructs) { | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1200 |             pGVstr = dynamic_gv_display(pSet->pUpdateStructs, "Descriptor Updates"); | 
 | 1201 |             fprintf(pOutFile, "%s", pGVstr); | 
 | 1202 |             free(pGVstr); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1203 |         } | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 1204 |         if (pSet->ppDescriptors) { | 
 | 1205 |             //void* pDesc = NULL; | 
| Tobin Ehlis | 4821eef | 2015-03-02 16:09:15 -0700 | [diff] [blame] | 1206 |             fprintf(pOutFile, "\"DESCRIPTORS\" [\nlabel=<<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"> <TR><TD COLSPAN=\"2\" PORT=\"desc\">DESCRIPTORS</TD></TR>"); | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 1207 |             uint32_t i = 0; | 
 | 1208 |             for (i=0; i < pSet->descriptorCount; i++) { | 
 | 1209 |                 if (pSet->ppDescriptors[i]) { | 
| Tobin Ehlis | 4821eef | 2015-03-02 16:09:15 -0700 | [diff] [blame] | 1210 |                     fprintf(pOutFile, "<TR><TD PORT=\"slot%u\">slot%u</TD><TD>%s</TD></TR>", i, i, string_XGL_STRUCTURE_TYPE(pSet->ppDescriptors[i]->sType)); | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 1211 |                 } | 
 | 1212 |             } | 
| Ian Elliott | 5bd12da | 2015-02-25 17:34:46 -0700 | [diff] [blame] | 1213 | #define NUM_COLORS 7 | 
| Tobin Ehlis | 8cb421e | 2015-02-25 15:01:21 -0700 | [diff] [blame] | 1214 |             char* edgeColors[NUM_COLORS]; | 
 | 1215 |             edgeColors[0] = "0000ff"; | 
 | 1216 |             edgeColors[1] = "ff00ff"; | 
 | 1217 |             edgeColors[2] = "ffff00"; | 
 | 1218 |             edgeColors[3] = "00ff00"; | 
 | 1219 |             edgeColors[4] = "000000"; | 
 | 1220 |             edgeColors[5] = "00ffff"; | 
 | 1221 |             edgeColors[6] = "ff0000"; | 
 | 1222 |             uint32_t colorIdx = 0; | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 1223 |             fprintf(pOutFile, "</TABLE>>\n];\n"); | 
 | 1224 |             // Now add the views that are mapped to active descriptors | 
 | 1225 |             XGL_UPDATE_SAMPLERS* pUS = NULL; | 
 | 1226 |             XGL_UPDATE_SAMPLER_TEXTURES* pUST = NULL; | 
 | 1227 |             XGL_UPDATE_IMAGES* pUI = NULL; | 
 | 1228 |             XGL_UPDATE_BUFFERS* pUB = NULL; | 
 | 1229 |             XGL_UPDATE_AS_COPY* pUAC = NULL; | 
 | 1230 |             XGL_SAMPLER_CREATE_INFO* pSCI = NULL; | 
 | 1231 |             XGL_IMAGE_VIEW_CREATE_INFO* pIVCI = NULL; | 
 | 1232 |             XGL_BUFFER_VIEW_CREATE_INFO* pBVCI = NULL; | 
 | 1233 |             for (i=0; i < pSet->descriptorCount; i++) { | 
 | 1234 |                 if (pSet->ppDescriptors[i]) { | 
 | 1235 |                     switch (pSet->ppDescriptors[i]->sType) | 
 | 1236 |                     { | 
 | 1237 |                         case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS: | 
 | 1238 |                             pUS = (XGL_UPDATE_SAMPLERS*)pSet->ppDescriptors[i]; | 
 | 1239 |                             pSCI = getSamplerCreateInfo(pUS->pSamplers[i-pUS->index]); | 
 | 1240 |                             if (pSCI) { | 
 | 1241 |                                 sprintf(tmp_str, "SAMPLER%u", i); | 
 | 1242 |                                 fprintf(pOutFile, "%s", xgl_gv_print_xgl_sampler_create_info(pSCI, tmp_str)); | 
| Tobin Ehlis | 8cb421e | 2015-02-25 15:01:21 -0700 | [diff] [blame] | 1243 |                                 fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [color=\"#%s\"];\n", i, tmp_str, edgeColors[colorIdx]); | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 1244 |                             } | 
 | 1245 |                             break; | 
 | 1246 |                         case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES: | 
 | 1247 |                             pUST = (XGL_UPDATE_SAMPLER_TEXTURES*)pSet->ppDescriptors[i]; | 
 | 1248 |                             pSCI = getSamplerCreateInfo(pUST->pSamplerImageViews[i-pUST->index].pSampler); | 
 | 1249 |                             if (pSCI) { | 
 | 1250 |                                 sprintf(tmp_str, "SAMPLER%u", i); | 
 | 1251 |                                 fprintf(pOutFile, "%s", xgl_gv_print_xgl_sampler_create_info(pSCI, tmp_str)); | 
| Tobin Ehlis | 8cb421e | 2015-02-25 15:01:21 -0700 | [diff] [blame] | 1252 |                                 fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [color=\"#%s\"];\n", i, tmp_str, edgeColors[colorIdx]); | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 1253 |                             } | 
 | 1254 |                             pIVCI = getImageViewCreateInfo(pUST->pSamplerImageViews[i-pUST->index].pImageView->view); | 
 | 1255 |                             if (pIVCI) { | 
 | 1256 |                                 sprintf(tmp_str, "IMAGE_VIEW%u", i); | 
 | 1257 |                                 fprintf(pOutFile, "%s", xgl_gv_print_xgl_image_view_create_info(pIVCI, tmp_str)); | 
| Tobin Ehlis | 8cb421e | 2015-02-25 15:01:21 -0700 | [diff] [blame] | 1258 |                                 fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [color=\"#%s\"];\n", i, tmp_str, edgeColors[colorIdx]); | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 1259 |                             } | 
 | 1260 |                             break; | 
 | 1261 |                         case XGL_STRUCTURE_TYPE_UPDATE_IMAGES: | 
 | 1262 |                             pUI = (XGL_UPDATE_IMAGES*)pSet->ppDescriptors[i]; | 
 | 1263 |                             pIVCI = getImageViewCreateInfo(pUI->pImageViews[i-pUI->index]->view); | 
 | 1264 |                             if (pIVCI) { | 
 | 1265 |                                 sprintf(tmp_str, "IMAGE_VIEW%u", i); | 
 | 1266 |                                 fprintf(pOutFile, "%s", xgl_gv_print_xgl_image_view_create_info(pIVCI, tmp_str)); | 
| Tobin Ehlis | 8cb421e | 2015-02-25 15:01:21 -0700 | [diff] [blame] | 1267 |                                 fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [color=\"#%s\"];\n", i, tmp_str, edgeColors[colorIdx]); | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 1268 |                             } | 
 | 1269 |                             break; | 
 | 1270 |                         case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS: | 
 | 1271 |                             pUB = (XGL_UPDATE_BUFFERS*)pSet->ppDescriptors[i]; | 
 | 1272 |                             pBVCI = getBufferViewCreateInfo(pUB->pBufferViews[i-pUB->index]->view); | 
 | 1273 |                             if (pBVCI) { | 
 | 1274 |                                 sprintf(tmp_str, "BUFFER_VIEW%u", i); | 
 | 1275 |                                 fprintf(pOutFile, "%s", xgl_gv_print_xgl_buffer_view_create_info(pBVCI, tmp_str)); | 
| Tobin Ehlis | 8cb421e | 2015-02-25 15:01:21 -0700 | [diff] [blame] | 1276 |                                 fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [color=\"#%s\"];\n", i, tmp_str, edgeColors[colorIdx]); | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 1277 |                             } | 
 | 1278 |                             break; | 
 | 1279 |                         case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY: | 
 | 1280 |                             pUAC = (XGL_UPDATE_AS_COPY*)pSet->ppDescriptors[i]; | 
 | 1281 |                             // TODO : Need to validate this code | 
 | 1282 |                             // Save off pNext and set to NULL while printing this struct, then restore it | 
 | 1283 |                             void** ppNextPtr = (void*)&pUAC->pNext; | 
 | 1284 |                             void* pSaveNext = *ppNextPtr; | 
 | 1285 |                             *ppNextPtr = NULL; | 
 | 1286 |                             sprintf(tmp_str, "UPDATE_AS_COPY%u", i); | 
 | 1287 |                             fprintf(pOutFile, "%s", xgl_gv_print_xgl_update_as_copy(pUAC, tmp_str)); | 
| Tobin Ehlis | 8cb421e | 2015-02-25 15:01:21 -0700 | [diff] [blame] | 1288 |                             fprintf(pOutFile, "\"DESCRIPTORS\":slot%u -> \"%s\" [color=\"#%s\"];\n", i, tmp_str, edgeColors[colorIdx]); | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 1289 |                             // Restore next ptr | 
 | 1290 |                             *ppNextPtr = pSaveNext; | 
 | 1291 |                             break; | 
 | 1292 |                         default: | 
 | 1293 |                             break; | 
 | 1294 |                     } | 
| Tobin Ehlis | 8cb421e | 2015-02-25 15:01:21 -0700 | [diff] [blame] | 1295 |                     colorIdx = (colorIdx+1) % NUM_COLORS; | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 1296 |                 } | 
 | 1297 |             } | 
 | 1298 |         } | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1299 |         fprintf(pOutFile, "}\n"); | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 1300 |         fprintf(pOutFile, "}\n"); | 
| Tobin Ehlis | 6926cd9 | 2015-02-11 13:13:18 -0700 | [diff] [blame] | 1301 |         pRegion = pRegion->pNext; | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 1302 |     } | 
 | 1303 | } | 
| Tobin Ehlis | ae708b8 | 2015-02-27 08:48:43 -0700 | [diff] [blame] | 1304 | // Dump subgraph w/ DS info | 
 | 1305 | static void dsDumpDot(const XGL_CMD_BUFFER cb, FILE* pOutFile) | 
 | 1306 | { | 
 | 1307 |     GLOBAL_CB_NODE* pCB = getCBNode(cb); | 
 | 1308 |     if (pCB && pCB->lastBoundDescriptorSet) { | 
 | 1309 |         dsCoreDumpDot(pCB->lastBoundDescriptorSet, pOutFile); | 
 | 1310 |     } | 
 | 1311 | } | 
| Tobin Ehlis | 249c77e | 2015-02-24 15:40:22 -0700 | [diff] [blame] | 1312 | // Dump a GraphViz dot file showing the Cmd Buffers | 
 | 1313 | static void cbDumpDotFile(char *outFileName) | 
 | 1314 | { | 
 | 1315 |     // Print CB Chain for each CB | 
 | 1316 |     FILE* pOutFile; | 
 | 1317 |     pOutFile = fopen(outFileName, "w"); | 
 | 1318 |     fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n"); | 
 | 1319 |     fprintf(pOutFile, "subgraph cluster_cmdBuffers\n{\nlabel=\"Command Buffers\"\n"); | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 1320 |     GLOBAL_CB_NODE* pCB = g_pCmdBufferHead; | 
 | 1321 |     for (uint32_t i = 0; i < NUM_COMMAND_BUFFERS_TO_DISPLAY; i++) { | 
 | 1322 |         pCB = g_pLastTouchedCB[i]; | 
 | 1323 |         if (pCB) { | 
 | 1324 |             fprintf(pOutFile, "subgraph cluster_cmdBuffer%u\n{\nlabel=\"Command Buffer #%u\"\n", i, i); | 
 | 1325 |             CMD_NODE* pCmd = pCB->pCmds; | 
 | 1326 |             uint32_t instNum = 0; | 
 | 1327 |             while (pCmd) { | 
 | 1328 |                 if (instNum) { | 
 | 1329 |                     fprintf(pOutFile, "\"CB%pCMD%u\" -> \"CB%pCMD%u\" [];\n", (void*)pCB->cmdBuffer, instNum-1, (void*)pCB->cmdBuffer, instNum); | 
| Tobin Ehlis | 249c77e | 2015-02-24 15:40:22 -0700 | [diff] [blame] | 1330 |                 } | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 1331 |                 if (pCB == g_lastGlobalCB) { | 
 | 1332 |                     fprintf(pOutFile, "\"CB%pCMD%u\" [\nlabel=<<TABLE BGCOLOR=\"#00FF00\" BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"> <TR><TD>CMD#</TD><TD>%u</TD></TR><TR><TD>CMD Type</TD><TD>%s</TD></TR></TABLE>>\n];\n", (void*)pCB->cmdBuffer, instNum, instNum, cmdTypeToString(pCmd->type)); | 
 | 1333 |                 } | 
 | 1334 |                 else { | 
 | 1335 |                     fprintf(pOutFile, "\"CB%pCMD%u\" [\nlabel=<<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"> <TR><TD>CMD#</TD><TD>%u</TD></TR><TR><TD>CMD Type</TD><TD>%s</TD></TR></TABLE>>\n];\n", (void*)pCB->cmdBuffer, instNum, instNum, cmdTypeToString(pCmd->type)); | 
 | 1336 |                 } | 
 | 1337 |                 ++instNum; | 
 | 1338 |                 pCmd = pCmd->pNext; | 
| Tobin Ehlis | 249c77e | 2015-02-24 15:40:22 -0700 | [diff] [blame] | 1339 |             } | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 1340 |             fprintf(pOutFile, "}\n"); | 
| Tobin Ehlis | 249c77e | 2015-02-24 15:40:22 -0700 | [diff] [blame] | 1341 |         } | 
 | 1342 |     } | 
 | 1343 |     fprintf(pOutFile, "}\n"); | 
 | 1344 |     fprintf(pOutFile, "}\n"); // close main graph "g" | 
 | 1345 |     fclose(pOutFile); | 
 | 1346 | } | 
| Tobin Ehlis | ae708b8 | 2015-02-27 08:48:43 -0700 | [diff] [blame] | 1347 | // Dump a GraphViz dot file showing the pipeline for last bound global state | 
 | 1348 | static void dumpGlobalDotFile(char *outFileName) | 
 | 1349 | { | 
 | 1350 |     PIPELINE_NODE *pPipeTrav = g_lastBoundPipeline; | 
 | 1351 |     if (pPipeTrav) { | 
 | 1352 |         FILE* pOutFile; | 
 | 1353 |         pOutFile = fopen(outFileName, "w"); | 
 | 1354 |         fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n"); | 
 | 1355 |         fprintf(pOutFile, "subgraph cluster_dynamicState\n{\nlabel=\"Dynamic State\"\n"); | 
 | 1356 |         char* pGVstr = NULL; | 
 | 1357 |         for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) { | 
 | 1358 |             if (g_lastBoundDynamicState[i] && g_lastBoundDynamicState[i]->pCreateInfo) { | 
 | 1359 |                 pGVstr = dynamic_gv_display(g_lastBoundDynamicState[i]->pCreateInfo, string_XGL_STATE_BIND_POINT(i)); | 
 | 1360 |                 fprintf(pOutFile, "%s", pGVstr); | 
 | 1361 |                 free(pGVstr); | 
 | 1362 |             } | 
 | 1363 |         } | 
 | 1364 |         fprintf(pOutFile, "}\n"); // close dynamicState subgraph | 
 | 1365 |         fprintf(pOutFile, "subgraph cluster_PipelineStateObject\n{\nlabel=\"Pipeline State Object\"\n"); | 
 | 1366 |         pGVstr = xgl_gv_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "PSO HEAD"); | 
 | 1367 |         fprintf(pOutFile, "%s", pGVstr); | 
 | 1368 |         free(pGVstr); | 
 | 1369 |         fprintf(pOutFile, "}\n"); | 
 | 1370 |         dsCoreDumpDot(g_lastBoundDescriptorSet, pOutFile); | 
 | 1371 |         fprintf(pOutFile, "}\n"); // close main graph "g" | 
 | 1372 |         fclose(pOutFile); | 
 | 1373 |     } | 
 | 1374 | } | 
 | 1375 | // Dump a GraphViz dot file showing the pipeline for a given CB | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1376 | static void dumpDotFile(const XGL_CMD_BUFFER cb, char *outFileName) | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 1377 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1378 |     GLOBAL_CB_NODE* pCB = getCBNode(cb); | 
 | 1379 |     if (pCB) { | 
 | 1380 |         PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline); | 
 | 1381 |         if (pPipeTrav) { | 
 | 1382 |             FILE* pOutFile; | 
 | 1383 |             pOutFile = fopen(outFileName, "w"); | 
 | 1384 |             fprintf(pOutFile, "digraph g {\ngraph [\nrankdir = \"TB\"\n];\nnode [\nfontsize = \"16\"\nshape = \"plaintext\"\n];\nedge [\n];\n"); | 
 | 1385 |             fprintf(pOutFile, "subgraph cluster_dynamicState\n{\nlabel=\"Dynamic State\"\n"); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1386 |             char* pGVstr = NULL; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1387 |             for (uint32_t i = 0; i < XGL_NUM_STATE_BIND_POINT; i++) { | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 1388 |                 if (pCB->lastBoundDynamicState[i] && pCB->lastBoundDynamicState[i]->pCreateInfo) { | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1389 |                     pGVstr = dynamic_gv_display(pCB->lastBoundDynamicState[i]->pCreateInfo, string_XGL_STATE_BIND_POINT(i)); | 
 | 1390 |                     fprintf(pOutFile, "%s", pGVstr); | 
 | 1391 |                     free(pGVstr); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1392 |                 } | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 1393 |             } | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1394 |             fprintf(pOutFile, "}\n"); // close dynamicState subgraph | 
 | 1395 |             fprintf(pOutFile, "subgraph cluster_PipelineStateObject\n{\nlabel=\"Pipeline State Object\"\n"); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1396 |             pGVstr = xgl_gv_print_xgl_graphics_pipeline_create_info(pPipeTrav->pCreateTree, "PSO HEAD"); | 
 | 1397 |             fprintf(pOutFile, "%s", pGVstr); | 
 | 1398 |             free(pGVstr); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1399 |             fprintf(pOutFile, "}\n"); | 
 | 1400 |             dsDumpDot(cb, pOutFile); | 
 | 1401 |             fprintf(pOutFile, "}\n"); // close main graph "g" | 
 | 1402 |             fclose(pOutFile); | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 1403 |         } | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 1404 |     } | 
 | 1405 | } | 
| Tobin Ehlis | db186c0 | 2015-03-16 11:49:58 -0600 | [diff] [blame] | 1406 | // Verify VB Buffer binding | 
 | 1407 | static void validateVBBinding(const XGL_CMD_BUFFER cb) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1408 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1409 |     GLOBAL_CB_NODE* pCB = getCBNode(cb); | 
 | 1410 |     if (pCB && pCB->lastBoundPipeline) { | 
 | 1411 |         // First verify that we have a Node for bound pipeline | 
 | 1412 |         PIPELINE_NODE *pPipeTrav = getPipeline(pCB->lastBoundPipeline); | 
 | 1413 |         char str[1024]; | 
 | 1414 |         if (!pPipeTrav) { | 
 | 1415 |             sprintf(str, "Can't find last bound Pipeline %p!", (void*)pCB->lastBoundPipeline); | 
 | 1416 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NO_PIPELINE_BOUND, "DS", str); | 
 | 1417 |         } | 
 | 1418 |         else { | 
 | 1419 |             // Verify Vtx binding | 
 | 1420 |             if (MAX_BINDING != pCB->lastVtxBinding) { | 
 | 1421 |                 if (pCB->lastVtxBinding >= pPipeTrav->vtxBindingCount) { | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1422 |                     if (0 == pPipeTrav->vtxBindingCount) { | 
 | 1423 |                         sprintf(str, "Vtx Buffer Index %u was bound, but no vtx buffers are attached to PSO.", pCB->lastVtxBinding); | 
 | 1424 |                         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str); | 
 | 1425 |                     } | 
 | 1426 |                     else { | 
 | 1427 |                         sprintf(str, "Vtx binding Index of %u exceeds PSO pVertexBindingDescriptions max array index of %u.", pCB->lastVtxBinding, (pPipeTrav->vtxBindingCount - 1)); | 
 | 1428 |                         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", str); | 
 | 1429 |                     } | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1430 |                 } | 
 | 1431 |                 else { | 
 | 1432 |                     char *tmpStr = xgl_print_xgl_vertex_input_binding_description(&pPipeTrav->pVertexBindingDescriptions[pCB->lastVtxBinding], "{DS}INFO : "); | 
 | 1433 |                     layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmpStr); | 
 | 1434 |                     free(tmpStr); | 
 | 1435 |                 } | 
| Tobin Ehlis | db20d60 | 2014-11-25 10:24:15 -0700 | [diff] [blame] | 1436 |             } | 
 | 1437 |         } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1438 |     } | 
 | 1439 | } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1440 | // Print details of DS config to stdout | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1441 | static void printDSConfig(const XGL_CMD_BUFFER cb) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1442 | { | 
| Tobin Ehlis | 246ba4d | 2014-11-18 16:38:08 -0700 | [diff] [blame] | 1443 |     char tmp_str[1024]; | 
 | 1444 |     char ds_config_str[1024*256] = {0}; // TODO : Currently making this buffer HUGE w/o overrun protection.  Need to be smarter, start smaller, and grow as needed. | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1445 |     GLOBAL_CB_NODE* pCB = getCBNode(cb); | 
 | 1446 |     if (pCB) { | 
 | 1447 |         SET_NODE* pSet = getSetNode(pCB->lastBoundDescriptorSet); | 
 | 1448 |         REGION_NODE* pRegion = getRegionNode(pSet->region); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1449 |         // Print out region details | 
 | 1450 |         sprintf(tmp_str, "Details for region %p.", (void*)pRegion->region); | 
 | 1451 |         layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1452 |         char* pRegionStr = xgl_print_xgl_descriptor_region_create_info(&pRegion->createInfo, " "); | 
 | 1453 |         sprintf(ds_config_str, "%s", pRegionStr); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1454 |         layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1455 |         free(pRegionStr); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1456 |         // Print out set details | 
 | 1457 |         char prefix[10]; | 
 | 1458 |         uint32_t index = 0; | 
 | 1459 |         sprintf(tmp_str, "Details for descriptor set %p.", (void*)pSet->set); | 
 | 1460 |         layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str); | 
 | 1461 |         LAYOUT_NODE* pLayout = pSet->pLayouts; | 
 | 1462 |         while (pLayout) { | 
 | 1463 |             // Print layout details | 
 | 1464 |             sprintf(tmp_str, "Layout #%u, (object %p) for DS %p.", index+1, (void*)pLayout->layout, (void*)pSet->set); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1465 |             layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1466 |             sprintf(prefix, "  [L%u] ", index); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1467 |             char* pDSLstr = xgl_print_xgl_descriptor_set_layout_create_info(&pLayout->pCreateInfoList[0], prefix); | 
 | 1468 |             sprintf(ds_config_str, "%s", pDSLstr); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1469 |             layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1470 |             free(pDSLstr); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1471 |             pLayout = pLayout->pPriorSetLayout; | 
 | 1472 |             index++; | 
 | 1473 |         } | 
 | 1474 |         GENERIC_HEADER* pUpdate = pSet->pUpdateStructs; | 
 | 1475 |         if (pUpdate) { | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1476 |             sprintf(tmp_str, "Update Chain [UC] for descriptor set %p:", (void*)pSet->set); | 
 | 1477 |             layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str); | 
 | 1478 |             sprintf(prefix, "  [UC] "); | 
 | 1479 |             sprintf(ds_config_str, "%s", dynamic_display(pUpdate, prefix)); | 
 | 1480 |             layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", ds_config_str); | 
 | 1481 |             // TODO : If there is a "view" associated with this update, print CI for that view | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1482 |         } | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1483 |         else { | 
 | 1484 |             sprintf(tmp_str, "No Update Chain for descriptor set %p (xglUpdateDescriptors has not been called)", (void*)pSet->set); | 
 | 1485 |             layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", tmp_str); | 
 | 1486 |         } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1487 |     } | 
 | 1488 | } | 
 | 1489 |  | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 1490 | static void printCB(const XGL_CMD_BUFFER cb) | 
 | 1491 | { | 
 | 1492 |     GLOBAL_CB_NODE* pCB = getCBNode(cb); | 
 | 1493 |     if (pCB) { | 
 | 1494 |         char str[1024]; | 
 | 1495 |         CMD_NODE* pCmd = pCB->pCmds; | 
 | 1496 |         sprintf(str, "Cmds in CB %p", (void*)cb); | 
 | 1497 |         layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_NONE, "DS", str); | 
 | 1498 |         while (pCmd) { | 
 | 1499 |             sprintf(str, "  CMD#%lu: %s", pCmd->cmdNumber, cmdTypeToString(pCmd->type)); | 
 | 1500 |             layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, DRAWSTATE_NONE, "DS", str); | 
 | 1501 |             pCmd = pCmd->pNext; | 
 | 1502 |         } | 
 | 1503 |     } | 
 | 1504 |     else { | 
 | 1505 |         // Nothing to print | 
 | 1506 |     } | 
 | 1507 | } | 
 | 1508 |  | 
| Jeremy Hayes | 250e274 | 2015-01-29 13:03:36 -0700 | [diff] [blame] | 1509 |  | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1510 | static void synchAndPrintDSConfig(const XGL_CMD_BUFFER cb) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1511 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1512 |     printDSConfig(cb); | 
 | 1513 |     printPipeline(cb); | 
 | 1514 |     printDynamicState(cb); | 
| Tobin Ehlis | 65c4660 | 2015-02-19 15:26:49 -0700 | [diff] [blame] | 1515 |     static int autoDumpOnce = 0; | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 1516 |     if (autoDumpOnce) { | 
 | 1517 |         autoDumpOnce = 0; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1518 |         dumpDotFile(cb, "pipeline_dump.dot"); | 
| Tobin Ehlis | 249c77e | 2015-02-24 15:40:22 -0700 | [diff] [blame] | 1519 |         cbDumpDotFile("cb_dump.dot"); | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 1520 | #if defined(_WIN32) | 
 | 1521 | // FIXME: NEED WINDOWS EQUIVALENT | 
 | 1522 | #else // WIN32 | 
| Jeremy Hayes | 943dc2f | 2015-02-12 16:15:58 -0700 | [diff] [blame] | 1523 |         // Convert dot to svg if dot available | 
| Tobin Ehlis | f27eba7 | 2014-12-16 17:34:50 -0700 | [diff] [blame] | 1524 |         if(access( "/usr/bin/dot", X_OK) != -1) { | 
| Jeremy Hayes | 943dc2f | 2015-02-12 16:15:58 -0700 | [diff] [blame] | 1525 |             system("/usr/bin/dot pipeline_dump.dot -Tsvg -o pipeline_dump.svg"); | 
| Tobin Ehlis | f27eba7 | 2014-12-16 17:34:50 -0700 | [diff] [blame] | 1526 |         } | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 1527 | #endif // WIN32 | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 1528 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1529 | } | 
 | 1530 |  | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 1531 | static void initDrawState(void) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1532 | { | 
| Jon Ashburn | 892d918 | 2014-12-22 13:38:27 -0700 | [diff] [blame] | 1533 |     const char *strOpt; | 
| Tobin Ehlis | ee70223 | 2015-01-08 14:26:53 -0700 | [diff] [blame] | 1534 |     // initialize DrawState options | 
| Ian Elliott | e782671 | 2015-03-06 13:50:05 -0700 | [diff] [blame] | 1535 |     getLayerOptionEnum("DrawStateReportLevel", (uint32_t *) &g_reportingLevel); | 
 | 1536 |     g_actionIsDefault = getLayerOptionEnum("DrawStateDebugAction", (uint32_t *) &g_debugAction); | 
| Tobin Ehlis | ee70223 | 2015-01-08 14:26:53 -0700 | [diff] [blame] | 1537 |  | 
| Jon Ashburn | 892d918 | 2014-12-22 13:38:27 -0700 | [diff] [blame] | 1538 |     if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG) | 
 | 1539 |     { | 
 | 1540 |         strOpt = getLayerOption("DrawStateLogFilename"); | 
 | 1541 |         if (strOpt) | 
 | 1542 |         { | 
 | 1543 |             g_logFile = fopen(strOpt, "w"); | 
| Jon Ashburn | 892d918 | 2014-12-22 13:38:27 -0700 | [diff] [blame] | 1544 |         } | 
 | 1545 |         if (g_logFile == NULL) | 
 | 1546 |             g_logFile = stdout; | 
 | 1547 |     } | 
| Jon Ashburn | 892d918 | 2014-12-22 13:38:27 -0700 | [diff] [blame] | 1548 |     // initialize Layer dispatch table | 
 | 1549 |     // TODO handle multiple GPUs | 
| Mark Lobodzinski | 391bb6d | 2015-01-09 15:12:03 -0600 | [diff] [blame] | 1550 |     xglGetProcAddrType fpNextGPA; | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1551 |     fpNextGPA = pCurObj->pGPA; | 
 | 1552 |     assert(fpNextGPA); | 
 | 1553 |  | 
| Chia-I Wu | aa4121f | 2015-01-04 23:11:43 +0800 | [diff] [blame] | 1554 |     layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject); | 
 | 1555 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 1556 |     xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr"); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1557 |     nextTable.GetProcAddr = fpGetProcAddr; | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 1558 |  | 
 | 1559 |     if (!globalLockInitialized) | 
 | 1560 |     { | 
 | 1561 |         // TODO/TBD: Need to delete this mutex sometime.  How???  One | 
 | 1562 |         // suggestion is to call this during xglCreateInstance(), and then we | 
 | 1563 |         // can clean it up during xglDestroyInstance().  However, that requires | 
 | 1564 |         // that the layer have per-instance locks.  We need to come back and | 
 | 1565 |         // address this soon. | 
 | 1566 |         loader_platform_thread_create_mutex(&globalLock); | 
 | 1567 |         globalLockInitialized = 1; | 
 | 1568 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1569 | } | 
 | 1570 |  | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1571 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice) | 
 | 1572 | { | 
 | 1573 |     XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu; | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1574 |     pCurObj = gpuw; | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 1575 |     loader_platform_thread_once(&g_initOnce, initDrawState); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1576 |     XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1577 |     return result; | 
 | 1578 | } | 
 | 1579 |  | 
 | 1580 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device) | 
 | 1581 | { | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1582 |     // Free all the memory | 
 | 1583 |     loader_platform_thread_lock_mutex(&globalLock); | 
 | 1584 |     freePipelines(); | 
 | 1585 |     freeSamplers(); | 
 | 1586 |     freeImages(); | 
 | 1587 |     freeBuffers(); | 
 | 1588 |     freeCmdBuffers(); | 
 | 1589 |     freeDynamicState(); | 
 | 1590 |     freeRegions(); | 
 | 1591 |     freeLayouts(); | 
 | 1592 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1593 |     XGL_RESULT result = nextTable.DestroyDevice(device); | 
 | 1594 |     return result; | 
 | 1595 | } | 
 | 1596 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 1597 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, size_t maxLayerCount, size_t maxStringSize, size_t* pOutLayerCount, char* const* pOutLayers, void* pReserved) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1598 | { | 
| Jon Ashburn | f7a0874 | 2014-11-25 11:08:42 -0700 | [diff] [blame] | 1599 |     if (gpu != NULL) | 
 | 1600 |     { | 
 | 1601 |         XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu; | 
 | 1602 |         pCurObj = gpuw; | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 1603 |         loader_platform_thread_once(&g_initOnce, initDrawState); | 
| Mark Lobodzinski | 391bb6d | 2015-01-09 15:12:03 -0600 | [diff] [blame] | 1604 |         XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved); | 
| Jon Ashburn | f7a0874 | 2014-11-25 11:08:42 -0700 | [diff] [blame] | 1605 |         return result; | 
 | 1606 |     } else | 
 | 1607 |     { | 
 | 1608 |         if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL) | 
 | 1609 |             return XGL_ERROR_INVALID_POINTER; | 
 | 1610 |         // This layer compatible with all GPUs | 
 | 1611 |         *pOutLayerCount = 1; | 
| Chia-I Wu | 1da4b9f | 2014-12-16 10:47:33 +0800 | [diff] [blame] | 1612 |         strncpy((char *) pOutLayers[0], "DrawState", maxStringSize); | 
| Jon Ashburn | f7a0874 | 2014-11-25 11:08:42 -0700 | [diff] [blame] | 1613 |         return XGL_SUCCESS; | 
 | 1614 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1615 | } | 
 | 1616 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 1617 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSubmit(XGL_QUEUE queue, uint32_t cmdBufferCount, const XGL_CMD_BUFFER* pCmdBuffers, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs, XGL_FENCE fence) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1618 | { | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 1619 |     for (uint32_t i=0; i < cmdBufferCount; i++) { | 
 | 1620 |         // Validate that cmd buffers have been updated | 
 | 1621 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1622 |     XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, fence); | 
 | 1623 |     return result; | 
 | 1624 | } | 
 | 1625 |  | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1626 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object) | 
 | 1627 | { | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1628 |     // TODO : When wrapped objects (such as dynamic state) are destroyed, need to clean up memory | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1629 |     XGL_RESULT result = nextTable.DestroyObject(object); | 
 | 1630 |     return result; | 
 | 1631 | } | 
 | 1632 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1633 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView) | 
 | 1634 | { | 
 | 1635 |     XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView); | 
| Tobin Ehlis | 2a15a5f | 2015-02-24 09:16:47 -0700 | [diff] [blame] | 1636 |     if (XGL_SUCCESS == result) { | 
 | 1637 |         loader_platform_thread_lock_mutex(&globalLock); | 
 | 1638 |         BUFFER_NODE *pNewNode = (BUFFER_NODE*)malloc(sizeof(BUFFER_NODE)); | 
 | 1639 | #if ALLOC_DEBUG | 
 | 1640 |     printf("Alloc21 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode); | 
 | 1641 | #endif | 
 | 1642 |         pNewNode->buffer = *pView; | 
 | 1643 |         memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_BUFFER_VIEW_CREATE_INFO)); | 
 | 1644 |         pNewNode->pNext = g_pBufferHead; | 
 | 1645 |         g_pBufferHead = pNewNode; | 
 | 1646 |         loader_platform_thread_unlock_mutex(&globalLock); | 
 | 1647 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1648 |     return result; | 
 | 1649 | } | 
 | 1650 |  | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1651 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView) | 
 | 1652 | { | 
 | 1653 |     XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1654 |     if (XGL_SUCCESS == result) { | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 1655 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1656 |         IMAGE_NODE *pNewNode = (IMAGE_NODE*)malloc(sizeof(IMAGE_NODE)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1657 | #if ALLOC_DEBUG | 
 | 1658 |     printf("Alloc22 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode); | 
 | 1659 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1660 |         pNewNode->image = *pView; | 
 | 1661 |         memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO)); | 
 | 1662 |         pNewNode->pNext = g_pImageHead; | 
 | 1663 |         g_pImageHead = pNewNode; | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 1664 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1665 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1666 |     return result; | 
 | 1667 | } | 
 | 1668 |  | 
| Courtney Goeltzenleuchter | 0d40f15 | 2015-03-25 15:37:49 -0600 | [diff] [blame] | 1669 | static void track_pipeline(const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1670 | { | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 1671 |     loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1672 |     PIPELINE_NODE *pTrav = g_pPipelineHead; | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1673 |     if (pTrav) { | 
 | 1674 |         while (pTrav->pNext) | 
 | 1675 |             pTrav = pTrav->pNext; | 
 | 1676 |         pTrav->pNext = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1677 | #if ALLOC_DEBUG | 
 | 1678 |     printf("Alloc23 #%lu pTrav->pNext addr(%p)\n", ++g_alloc_count, (void*)pTrav->pNext); | 
 | 1679 | #endif | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1680 |         pTrav = pTrav->pNext; | 
 | 1681 |     } | 
 | 1682 |     else { | 
 | 1683 |         pTrav = (PIPELINE_NODE*)malloc(sizeof(PIPELINE_NODE)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1684 | #if ALLOC_DEBUG | 
 | 1685 |     printf("Alloc24 #%lu pTrav addr(%p)\n", ++g_alloc_count, (void*)pTrav); | 
 | 1686 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1687 |         g_pPipelineHead = pTrav; | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1688 |     } | 
 | 1689 |     memset((void*)pTrav, 0, sizeof(PIPELINE_NODE)); | 
 | 1690 |     pTrav->pipeline = *pPipeline; | 
 | 1691 |     initPipeline(pTrav, pCreateInfo); | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 1692 |     loader_platform_thread_unlock_mutex(&globalLock); | 
| Courtney Goeltzenleuchter | 0d40f15 | 2015-03-25 15:37:49 -0600 | [diff] [blame] | 1693 | } | 
 | 1694 |  | 
 | 1695 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline) | 
 | 1696 | { | 
 | 1697 |     XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline); | 
 | 1698 |     // Create LL HEAD for this Pipeline | 
 | 1699 |     char str[1024]; | 
 | 1700 |     sprintf(str, "Created Gfx Pipeline %p", (void*)*pPipeline); | 
 | 1701 |     layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_NONE, "DS", str); | 
 | 1702 |  | 
 | 1703 |     track_pipeline(pCreateInfo, pPipeline); | 
 | 1704 |  | 
 | 1705 |     return result; | 
 | 1706 | } | 
 | 1707 |  | 
 | 1708 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipelineDerivative( | 
 | 1709 |         XGL_DEVICE device, | 
 | 1710 |         const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, | 
 | 1711 |         XGL_PIPELINE basePipeline, | 
 | 1712 |         XGL_PIPELINE* pPipeline) | 
 | 1713 | { | 
 | 1714 |     XGL_RESULT result = nextTable.CreateGraphicsPipelineDerivative(device, pCreateInfo, basePipeline, pPipeline); | 
 | 1715 |     // Create LL HEAD for this Pipeline | 
 | 1716 |     char str[1024]; | 
 | 1717 |     sprintf(str, "Created Gfx Pipeline %p (derived from pipeline %p)", (void*)*pPipeline, basePipeline); | 
 | 1718 |     layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pPipeline, 0, DRAWSTATE_NONE, "DS", str); | 
 | 1719 |  | 
 | 1720 |     track_pipeline(pCreateInfo, pPipeline); | 
 | 1721 |  | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1722 |     return result; | 
 | 1723 | } | 
 | 1724 |  | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1725 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler) | 
 | 1726 | { | 
 | 1727 |     XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1728 |     if (XGL_SUCCESS == result) { | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 1729 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1730 |         SAMPLER_NODE *pNewNode = (SAMPLER_NODE*)malloc(sizeof(SAMPLER_NODE)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1731 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1732 |         printf("Alloc25 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1733 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1734 |         pNewNode->sampler = *pSampler; | 
 | 1735 |         memcpy(&pNewNode->createInfo, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO)); | 
 | 1736 |         pNewNode->pNext = g_pSamplerHead; | 
 | 1737 |         g_pSamplerHead = pNewNode; | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 1738 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1739 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 1740 |     return result; | 
 | 1741 | } | 
 | 1742 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1743 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDescriptorSetLayout(XGL_DEVICE device, XGL_FLAGS stageFlags, const uint32_t* pSetBindPoints, XGL_DESCRIPTOR_SET_LAYOUT priorSetLayout, const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pSetLayoutInfoList, XGL_DESCRIPTOR_SET_LAYOUT* pSetLayout) | 
 | 1744 | { | 
 | 1745 |     XGL_RESULT result = nextTable.CreateDescriptorSetLayout(device, stageFlags, pSetBindPoints, priorSetLayout, pSetLayoutInfoList, pSetLayout); | 
 | 1746 |     if (XGL_SUCCESS == result) { | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1747 |         LAYOUT_NODE* pNewNode = (LAYOUT_NODE*)malloc(sizeof(LAYOUT_NODE)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1748 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1749 |         printf("Alloc26 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1750 | #endif | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1751 |         if (NULL == pNewNode) { | 
 | 1752 |             char str[1024]; | 
 | 1753 |             sprintf(str, "Out of memory while attempting to allocate LAYOUT_NODE in xglCreateDescriptorSetLayout()"); | 
 | 1754 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pSetLayout, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str); | 
 | 1755 |         } | 
 | 1756 |         memset(pNewNode, 0, sizeof(LAYOUT_NODE)); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1757 |         // TODO : API Currently missing a count here that we should multiply by struct size | 
 | 1758 |         pNewNode->pCreateInfoList = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1759 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1760 |         printf("Alloc27 #%lu pNewNode->pCreateInfoList addr(%p)\n", ++g_alloc_count, (void*)pNewNode->pCreateInfoList); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1761 | #endif | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1762 |         memset((void*)pNewNode->pCreateInfoList, 0, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO)); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1763 |         void* pCITrav = NULL; | 
 | 1764 |         uint32_t totalCount = 0; | 
 | 1765 |         if (pSetLayoutInfoList) { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 1766 |             memcpy((void*)pNewNode->pCreateInfoList, pSetLayoutInfoList, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO)); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1767 |             pCITrav = (void*)pSetLayoutInfoList->pNext; | 
 | 1768 |             totalCount = pSetLayoutInfoList->count; | 
 | 1769 |         } | 
 | 1770 |         void** ppNext = (void**)&pNewNode->pCreateInfoList->pNext; | 
 | 1771 |         while (pCITrav) { | 
 | 1772 |             totalCount += ((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->count; | 
 | 1773 |             *ppNext = (void*)malloc(sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1774 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1775 |             printf("Alloc28 #%lu *ppNext addr(%p)\n", ++g_alloc_count, (void*)*ppNext); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1776 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1777 |             memcpy((void*)*ppNext, pCITrav, sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO)); | 
 | 1778 |             pCITrav = (void*)((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCITrav)->pNext; | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 1779 |             ppNext = (void**)&((XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)*ppNext)->pNext; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1780 |         } | 
 | 1781 |         if (totalCount > 0) { | 
 | 1782 |             pNewNode->pTypes = (XGL_DESCRIPTOR_TYPE*)malloc(totalCount*sizeof(XGL_DESCRIPTOR_TYPE)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1783 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1784 |             printf("Alloc29 #%lu pNewNode->pTypes addr(%p)\n", ++g_alloc_count, (void*)pNewNode->pTypes); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1785 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1786 |             XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pSetLayoutInfoList; | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 1787 |             uint32_t offset = 0; | 
 | 1788 |             uint32_t i = 0; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1789 |             while (pLCI) { | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 1790 |                 for (i = 0; i < pLCI->count; i++) { | 
 | 1791 |                     pNewNode->pTypes[offset + i] = pLCI->descriptorType; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1792 |                 } | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 1793 |                 offset += i; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1794 |                 pLCI = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pLCI->pNext; | 
 | 1795 |             } | 
 | 1796 |         } | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1797 |         pNewNode->layout = *pSetLayout; | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1798 |         pNewNode->stageFlags = stageFlags; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1799 |         uint32_t i = (XGL_SHADER_STAGE_FLAGS_ALL == stageFlags) ? 0 : XGL_SHADER_STAGE_COMPUTE; | 
| Tobin Ehlis | c5ad801 | 2015-02-16 14:29:30 -0700 | [diff] [blame] | 1800 |         for (uint32_t stage = XGL_SHADER_STAGE_FLAGS_COMPUTE_BIT; stage > 0; stage >>= 1) { | 
 | 1801 |             assert(i < XGL_NUM_SHADER_STAGE); | 
 | 1802 |             if (stage & stageFlags) | 
 | 1803 |                 pNewNode->shaderStageBindPoints[i] = pSetBindPoints[i]; | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1804 |             i = (i == 0) ? 0 : (i-1); | 
| Tobin Ehlis | c5ad801 | 2015-02-16 14:29:30 -0700 | [diff] [blame] | 1805 |         } | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1806 |         pNewNode->startIndex = 0; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1807 |         LAYOUT_NODE* pPriorNode = getLayoutNode(priorSetLayout); | 
 | 1808 |         // Point to prior node or NULL if no prior node | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1809 |         if (NULL != priorSetLayout && pPriorNode == NULL) { | 
 | 1810 |             char str[1024]; | 
 | 1811 |             sprintf(str, "Invalid priorSetLayout of %p passed to xglCreateDescriptorSetLayout()", (void*)priorSetLayout); | 
 | 1812 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, priorSetLayout, 0, DRAWSTATE_INVALID_LAYOUT, "DS", str); | 
 | 1813 |         } | 
 | 1814 |         else if (pPriorNode != NULL) { // We have a node for a valid prior layout | 
 | 1815 |             // Get count for prior layout | 
 | 1816 |             pNewNode->startIndex = pPriorNode->endIndex + 1; | 
 | 1817 |         } | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1818 |         pNewNode->endIndex = pNewNode->startIndex + totalCount - 1; | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1819 |         assert(pNewNode->endIndex >= pNewNode->startIndex); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1820 |         pNewNode->pPriorSetLayout = pPriorNode; | 
 | 1821 |         // Put new node at Head of global Layer list | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1822 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1823 |         pNewNode->pNext = g_pLayoutHead; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1824 |         g_pLayoutHead = pNewNode; | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1825 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1826 |     } | 
 | 1827 |     return result; | 
 | 1828 | } | 
 | 1829 |  | 
 | 1830 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode) | 
 | 1831 | { | 
 | 1832 |     XGL_RESULT result = nextTable.BeginDescriptorRegionUpdate(device, updateMode); | 
 | 1833 |     if (XGL_SUCCESS == result) { | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1834 |         loader_platform_thread_lock_mutex(&globalLock); | 
 | 1835 |         REGION_NODE* pRegionNode = g_pRegionHead; | 
 | 1836 |         if (!pRegionNode) { | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1837 |             char str[1024]; | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1838 |             sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead); | 
 | 1839 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1840 |         } | 
 | 1841 |         else { | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1842 |             pRegionNode->updateActive = 1; | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1843 |         } | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1844 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1845 |     } | 
 | 1846 |     return result; | 
 | 1847 | } | 
 | 1848 |  | 
 | 1849 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(XGL_DEVICE device, XGL_CMD_BUFFER cmd) | 
 | 1850 | { | 
 | 1851 |     XGL_RESULT result = nextTable.EndDescriptorRegionUpdate(device, cmd); | 
 | 1852 |     if (XGL_SUCCESS == result) { | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1853 |         loader_platform_thread_lock_mutex(&globalLock); | 
 | 1854 |         REGION_NODE* pRegionNode = g_pRegionHead; | 
 | 1855 |         if (!pRegionNode) { | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1856 |             char str[1024]; | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1857 |             sprintf(str, "Unable to find region node for global region head %p", (void*)g_pRegionHead); | 
 | 1858 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_INTERNAL_ERROR, "DS", str); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1859 |         } | 
 | 1860 |         else { | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1861 |             if (!pRegionNode->updateActive) { | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1862 |                 char str[1024]; | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1863 |                 sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglEndDescriptorRegionUpdate()!"); | 
 | 1864 |                 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead, 0, DRAWSTATE_DS_END_WITHOUT_BEGIN, "DS", str); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1865 |             } | 
 | 1866 |             else { | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1867 |                 pRegionNode->updateActive = 0; | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1868 |             } | 
 | 1869 |         } | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1870 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1871 |     } | 
 | 1872 |     return result; | 
 | 1873 | } | 
 | 1874 |  | 
 | 1875 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDescriptorRegion(XGL_DEVICE device, XGL_DESCRIPTOR_REGION_USAGE regionUsage, uint32_t maxSets, const XGL_DESCRIPTOR_REGION_CREATE_INFO* pCreateInfo, XGL_DESCRIPTOR_REGION* pDescriptorRegion) | 
 | 1876 | { | 
 | 1877 |     XGL_RESULT result = nextTable.CreateDescriptorRegion(device, regionUsage, maxSets, pCreateInfo, pDescriptorRegion); | 
 | 1878 |     if (XGL_SUCCESS == result) { | 
 | 1879 |         // Insert this region into Global Region LL at head | 
 | 1880 |         char str[1024]; | 
 | 1881 |         sprintf(str, "Created Descriptor Region %p", (void*)*pDescriptorRegion); | 
 | 1882 |         layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorRegion, 0, DRAWSTATE_NONE, "DS", str); | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 1883 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1884 |         REGION_NODE* pNewNode = (REGION_NODE*)malloc(sizeof(REGION_NODE)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1885 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1886 |         printf("Alloc30 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1887 | #endif | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1888 |         if (NULL == pNewNode) { | 
 | 1889 |             char str[1024]; | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1890 |             sprintf(str, "Out of memory while attempting to allocate REGION_NODE in xglCreateDescriptorRegion()"); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1891 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pDescriptorRegion, 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str); | 
 | 1892 |         } | 
 | 1893 |         else { | 
 | 1894 |             memset(pNewNode, 0, sizeof(REGION_NODE)); | 
 | 1895 |             pNewNode->pNext = g_pRegionHead; | 
 | 1896 |             g_pRegionHead = pNewNode; | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1897 |             XGL_DESCRIPTOR_REGION_CREATE_INFO* pCI = (XGL_DESCRIPTOR_REGION_CREATE_INFO*)&pNewNode->createInfo; | 
 | 1898 |             memcpy((void*)pCI, pCreateInfo, sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO)); | 
 | 1899 |             size_t typeCountSize = pNewNode->createInfo.count * sizeof(XGL_DESCRIPTOR_TYPE_COUNT); | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1900 |             if (typeCountSize) { | 
 | 1901 |                 XGL_DESCRIPTOR_TYPE_COUNT** ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT**)&pNewNode->createInfo.pTypeCount; | 
 | 1902 |                 *ppTypeCount = (XGL_DESCRIPTOR_TYPE_COUNT*)malloc(typeCountSize); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1903 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1904 |                 printf("Alloc31 #%lu *ppTypeCount addr(%p)\n", ++g_alloc_count, (void*)*ppTypeCount); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1905 | #endif | 
| Tobin Ehlis | 3d0d99b | 2015-02-17 09:54:13 -0700 | [diff] [blame] | 1906 |                 memcpy((void*)*ppTypeCount, pCreateInfo->pTypeCount, typeCountSize); | 
 | 1907 |             } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1908 |             pNewNode->regionUsage  = regionUsage; | 
 | 1909 |             pNewNode->updateActive = 0; | 
 | 1910 |             pNewNode->maxSets      = maxSets; | 
 | 1911 |             pNewNode->region       = *pDescriptorRegion; | 
 | 1912 |         } | 
| Tobin Ehlis | b049785 | 2015-02-11 14:24:02 -0700 | [diff] [blame] | 1913 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1914 |     } | 
 | 1915 |     else { | 
 | 1916 |         // Need to do anything if region create fails? | 
 | 1917 |     } | 
 | 1918 |     return result; | 
 | 1919 | } | 
 | 1920 |  | 
 | 1921 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglClearDescriptorRegion(XGL_DESCRIPTOR_REGION descriptorRegion) | 
 | 1922 | { | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1923 |     XGL_RESULT result = nextTable.ClearDescriptorRegion(descriptorRegion); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1924 |     if (XGL_SUCCESS == result) { | 
 | 1925 |         clearDescriptorRegion(descriptorRegion); | 
 | 1926 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1927 |     return result; | 
 | 1928 | } | 
 | 1929 |  | 
 | 1930 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, XGL_DESCRIPTOR_SET_USAGE setUsage, uint32_t count, const XGL_DESCRIPTOR_SET_LAYOUT* pSetLayouts, XGL_DESCRIPTOR_SET* pDescriptorSets, uint32_t* pCount) | 
 | 1931 | { | 
 | 1932 |     XGL_RESULT result = nextTable.AllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1933 |     if ((XGL_SUCCESS == result) || (*pCount > 0)) { | 
 | 1934 |         REGION_NODE *pRegionNode = getRegionNode(descriptorRegion); | 
 | 1935 |         if (!pRegionNode) { | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1936 |             char str[1024]; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1937 |             sprintf(str, "Unable to find region node for region %p specified in xglAllocDescriptorSets() call", (void*)descriptorRegion); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1938 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorRegion, 0, DRAWSTATE_INVALID_REGION, "DS", str); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1939 |         } | 
 | 1940 |         else { | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1941 |             for (uint32_t i = 0; i < *pCount; i++) { | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1942 |                 char str[1024]; | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1943 |                 sprintf(str, "Created Descriptor Set %p", (void*)pDescriptorSets[i]); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1944 |                 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pDescriptorSets[i], 0, DRAWSTATE_NONE, "DS", str); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1945 |                 // Create new set node and add to head of region nodes | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1946 |                 SET_NODE* pNewNode = (SET_NODE*)malloc(sizeof(SET_NODE)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1947 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 1948 |                 printf("Alloc32 #%lu pNewNode addr(%p)\n", ++g_alloc_count, (void*)pNewNode); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 1949 | #endif | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1950 |                 if (NULL == pNewNode) { | 
 | 1951 |                     char str[1024]; | 
 | 1952 |                     sprintf(str, "Out of memory while attempting to allocate SET_NODE in xglAllocDescriptorSets()"); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1953 |                     layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pDescriptorSets[i], 0, DRAWSTATE_OUT_OF_MEMORY, "DS", str); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1954 |                 } | 
 | 1955 |                 else { | 
 | 1956 |                     memset(pNewNode, 0, sizeof(SET_NODE)); | 
 | 1957 |                     // Insert set at head of Set LL for this region | 
 | 1958 |                     pNewNode->pNext = pRegionNode->pSets; | 
 | 1959 |                     pRegionNode->pSets = pNewNode; | 
 | 1960 |                     LAYOUT_NODE* pLayout = getLayoutNode(pSetLayouts[i]); | 
 | 1961 |                     if (NULL == pLayout) { | 
 | 1962 |                         char str[1024]; | 
 | 1963 |                         sprintf(str, "Unable to find set layout node for layout %p specified in xglAllocDescriptorSets() call", (void*)pSetLayouts[i]); | 
 | 1964 |                         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pSetLayouts[i], 0, DRAWSTATE_INVALID_LAYOUT, "DS", str); | 
 | 1965 |                     } | 
 | 1966 |                     pNewNode->pLayouts = pLayout; | 
 | 1967 |                     pNewNode->region = descriptorRegion; | 
 | 1968 |                     pNewNode->set = pDescriptorSets[i]; | 
 | 1969 |                     pNewNode->setUsage = setUsage; | 
| Tobin Ehlis | 6926cd9 | 2015-02-11 13:13:18 -0700 | [diff] [blame] | 1970 |                     pNewNode->descriptorCount = pLayout->endIndex + 1; | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 1971 |                     size_t descriptorArraySize = sizeof(GENERIC_HEADER*)*pNewNode->descriptorCount; | 
 | 1972 |                     pNewNode->ppDescriptors = (GENERIC_HEADER**)malloc(descriptorArraySize); | 
 | 1973 | #if ALLOC_DEBUG | 
 | 1974 |                     printf("Alloc35 #%lu pSet->ppDescriptors addr(%p)\n", ++g_alloc_count, (void*)pNewNode->ppDescriptors); | 
 | 1975 | #endif | 
 | 1976 |                     memset(pNewNode->ppDescriptors, 0, descriptorArraySize); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1977 |                 } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1978 |             } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1979 |         } | 
 | 1980 |     } | 
 | 1981 |     return result; | 
 | 1982 | } | 
 | 1983 |  | 
 | 1984 | XGL_LAYER_EXPORT void XGLAPI xglClearDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, uint32_t count, const XGL_DESCRIPTOR_SET* pDescriptorSets) | 
 | 1985 | { | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1986 |     for (uint32_t i = 0; i < count; i++) { | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1987 |         clearDescriptorSet(pDescriptorSets[i]); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1988 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1989 |     nextTable.ClearDescriptorSets(descriptorRegion, count, pDescriptorSets); | 
 | 1990 | } | 
 | 1991 |  | 
 | 1992 | XGL_LAYER_EXPORT void XGLAPI xglUpdateDescriptors(XGL_DESCRIPTOR_SET descriptorSet, const void* pUpdateChain) | 
 | 1993 | { | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 1994 |     if (!dsUpdateActive(descriptorSet)) { | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1995 |         char str[1024]; | 
 | 1996 |         sprintf(str, "You must call xglBeginDescriptorRegionUpdate() before this call to xglUpdateDescriptors()!"); | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 1997 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, g_pRegionHead->region, 0, DRAWSTATE_UPDATE_WITHOUT_BEGIN, "DS", str); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 1998 |     } | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 1999 |     else { | 
 | 2000 |         // pUpdateChain is a Linked-list of XGL_UPDATE_* structures defining the mappings for the descriptors | 
 | 2001 |         dsUpdate(descriptorSet, (GENERIC_HEADER*)pUpdateChain); | 
 | 2002 |     } | 
 | 2003 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2004 |     nextTable.UpdateDescriptors(descriptorSet, pUpdateChain); | 
 | 2005 | } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2006 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2007 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicViewportState(XGL_DEVICE device, const XGL_DYNAMIC_VP_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_VP_STATE_OBJECT* pState) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2008 | { | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2009 |     XGL_RESULT result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 2010 |     insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_VIEWPORT); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2011 |     return result; | 
 | 2012 | } | 
 | 2013 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2014 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicRasterState(XGL_DEVICE device, const XGL_DYNAMIC_RS_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_RS_STATE_OBJECT* pState) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2015 | { | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2016 |     XGL_RESULT result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 2017 |     insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_RASTER); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2018 |     return result; | 
 | 2019 | } | 
 | 2020 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2021 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicColorBlendState(XGL_DEVICE device, const XGL_DYNAMIC_CB_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_CB_STATE_OBJECT* pState) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2022 | { | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2023 |     XGL_RESULT result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 2024 |     insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_COLOR_BLEND); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2025 |     return result; | 
 | 2026 | } | 
 | 2027 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2028 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicDepthStencilState(XGL_DEVICE device, const XGL_DYNAMIC_DS_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_DS_STATE_OBJECT* pState) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2029 | { | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2030 |     XGL_RESULT result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState); | 
| Tobin Ehlis | 04178d7 | 2015-01-22 10:45:21 -0700 | [diff] [blame] | 2031 |     insertDynamicState(*pState, (GENERIC_HEADER*)pCreateInfo, XGL_STATE_BIND_DEPTH_STENCIL); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2032 |     return result; | 
 | 2033 | } | 
 | 2034 |  | 
 | 2035 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer) | 
 | 2036 | { | 
 | 2037 |     XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2038 |     if (XGL_SUCCESS == result) { | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 2039 |         loader_platform_thread_lock_mutex(&globalLock); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2040 |         GLOBAL_CB_NODE* pCB = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE)); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 2041 | #if ALLOC_DEBUG | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 2042 |         printf("Alloc33 #%lu pCB addr(%p)\n", ++g_alloc_count, (void*)pCB); | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 2043 | #endif | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2044 |         memset(pCB, 0, sizeof(GLOBAL_CB_NODE)); | 
 | 2045 |         pCB->pNextGlobalCBNode = g_pCmdBufferHead; | 
 | 2046 |         g_pCmdBufferHead = pCB; | 
 | 2047 |         pCB->cmdBuffer = *pCmdBuffer; | 
 | 2048 |         pCB->flags = pCreateInfo->flags; | 
| Courtney Goeltzenleuchter | 18248e6 | 2015-03-05 18:09:39 -0700 | [diff] [blame] | 2049 |         pCB->queueNodeIndex = pCreateInfo->queueNodeIndex; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2050 |         pCB->lastVtxBinding = MAX_BINDING; | 
| Tobin Ehlis | 8c2ed21 | 2015-02-20 09:30:06 -0700 | [diff] [blame] | 2051 |         loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2052 |         updateCBTracking(*pCmdBuffer); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2053 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2054 |     return result; | 
 | 2055 | } | 
 | 2056 |  | 
| Jon Ashburn | 8652237 | 2014-12-31 17:11:49 -0700 | [diff] [blame] | 2057 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2058 | { | 
| Jon Ashburn | 8652237 | 2014-12-31 17:11:49 -0700 | [diff] [blame] | 2059 |     XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2060 |     if (XGL_SUCCESS == result) { | 
 | 2061 |         GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 2062 |         if (pCB) { | 
 | 2063 |             if (CB_NEW != pCB->state) | 
 | 2064 |                 resetCB(cmdBuffer); | 
 | 2065 |             pCB->state = CB_UPDATE_ACTIVE; | 
 | 2066 |         } | 
 | 2067 |         else { | 
 | 2068 |             char str[1024]; | 
 | 2069 |             sprintf(str, "In xglBeginCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer); | 
 | 2070 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2071 |         } | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2072 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2073 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2074 |     return result; | 
 | 2075 | } | 
 | 2076 |  | 
 | 2077 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer) | 
 | 2078 | { | 
 | 2079 |     XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2080 |     if (XGL_SUCCESS == result) { | 
 | 2081 |         GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
| Tobin Ehlis | 481ec71 | 2015-02-19 09:55:18 -0700 | [diff] [blame] | 2082 |         if (pCB) { | 
 | 2083 |             pCB->state = CB_UPDATE_COMPLETE; | 
 | 2084 |             printCB(cmdBuffer); | 
 | 2085 |         } | 
 | 2086 |         else { | 
 | 2087 |             char str[1024]; | 
 | 2088 |             sprintf(str, "In xglEndCommandBuffer() and unable to find CmdBuffer Node for CB %p!", (void*)cmdBuffer); | 
 | 2089 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2090 |         } | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2091 |         updateCBTracking(cmdBuffer); | 
 | 2092 |         //cbDumpDotFile("cb_dump.dot"); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2093 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2094 |     return result; | 
 | 2095 | } | 
 | 2096 |  | 
 | 2097 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer) | 
 | 2098 | { | 
 | 2099 |     XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2100 |     if (XGL_SUCCESS == result) { | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2101 |         resetCB(cmdBuffer); | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2102 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2103 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2104 |     return result; | 
 | 2105 | } | 
 | 2106 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2107 | XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2108 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2109 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2110 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2111 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2112 |         addCmd(pCB, CMD_BINDPIPELINE); | 
| Tobin Ehlis | 5c7e7b8 | 2015-03-03 13:58:42 -0700 | [diff] [blame] | 2113 |         PIPELINE_NODE* pPN = getPipeline(pipeline); | 
 | 2114 |         if (pPN) { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2115 |             pCB->lastBoundPipeline = pipeline; | 
| Tobin Ehlis | 5c7e7b8 | 2015-03-03 13:58:42 -0700 | [diff] [blame] | 2116 |             loader_platform_thread_lock_mutex(&globalLock); | 
 | 2117 |             g_lastBoundPipeline = pPN; | 
 | 2118 |             loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2119 |         } | 
 | 2120 |         else { | 
 | 2121 |             char str[1024]; | 
 | 2122 |             sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline); | 
 | 2123 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, DRAWSTATE_INVALID_PIPELINE, "DS", str); | 
 | 2124 |         } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2125 |     } | 
 | 2126 |     else { | 
| Tobin Ehlis | 246ba4d | 2014-11-18 16:38:08 -0700 | [diff] [blame] | 2127 |         char str[1024]; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2128 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2129 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2130 |     } | 
 | 2131 |     nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline); | 
 | 2132 | } | 
 | 2133 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2134 | XGL_LAYER_EXPORT void XGLAPI xglCmdBindDynamicStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state) | 
 | 2135 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2136 |     setLastBoundDynamicState(cmdBuffer, state, stateBindPoint); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2137 |     nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state); | 
 | 2138 | } | 
 | 2139 |  | 
 | 2140 | XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_DESCRIPTOR_SET descriptorSet, const uint32_t* pUserData) | 
 | 2141 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2142 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2143 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2144 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2145 |         addCmd(pCB, CMD_BINDDESCRIPTORSET); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2146 |         if (getSetNode(descriptorSet)) { | 
 | 2147 |             if (dsUpdateActive(descriptorSet)) { | 
| Tobin Ehlis | 65c4660 | 2015-02-19 15:26:49 -0700 | [diff] [blame] | 2148 |                 // TODO : This check here needs to be made at QueueSubmit time | 
 | 2149 | /* | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2150 |                 char str[1024]; | 
 | 2151 |                 sprintf(str, "You must call xglEndDescriptorRegionUpdate(%p) before this call to xglCmdBindDescriptorSet()!", (void*)descriptorSet); | 
 | 2152 |                 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_BINDING_DS_NO_END_UPDATE, "DS", str); | 
| Tobin Ehlis | 65c4660 | 2015-02-19 15:26:49 -0700 | [diff] [blame] | 2153 | */ | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2154 |             } | 
 | 2155 |             loader_platform_thread_lock_mutex(&globalLock); | 
 | 2156 |             pCB->lastBoundDescriptorSet = descriptorSet; | 
| Tobin Ehlis | ae708b8 | 2015-02-27 08:48:43 -0700 | [diff] [blame] | 2157 |             g_lastBoundDescriptorSet = descriptorSet; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2158 |             loader_platform_thread_unlock_mutex(&globalLock); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 2159 |             char str[1024]; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2160 |             sprintf(str, "DS %p bound on pipeline %s", (void*)descriptorSet, string_XGL_PIPELINE_BIND_POINT(pipelineBindPoint)); | 
 | 2161 |             layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_NONE, "DS", str); | 
| Tobin Ehlis | b8013a2 | 2015-02-26 12:57:08 -0700 | [diff] [blame] | 2162 |             synchAndPrintDSConfig(cmdBuffer); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 2163 |         } | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2164 |         else { | 
 | 2165 |             char str[1024]; | 
 | 2166 |             sprintf(str, "Attempt to bind DS %p that doesn't exist!", (void*)descriptorSet); | 
 | 2167 |             layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, descriptorSet, 0, DRAWSTATE_INVALID_SET, "DS", str); | 
 | 2168 |         } | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 2169 |     } | 
 | 2170 |     else { | 
 | 2171 |         char str[1024]; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2172 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2173 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
| Tobin Ehlis | a3a693e | 2015-02-10 15:35:23 -0700 | [diff] [blame] | 2174 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2175 |     nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData); | 
 | 2176 | } | 
 | 2177 |  | 
 | 2178 | XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType) | 
 | 2179 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2180 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2181 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2182 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2183 |         addCmd(pCB, CMD_BINDINDEXBUFFER); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2184 |         // TODO : Track idxBuffer binding | 
 | 2185 |     } | 
 | 2186 |     else { | 
 | 2187 |         char str[1024]; | 
 | 2188 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2189 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2190 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2191 |     nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType); | 
 | 2192 | } | 
 | 2193 |  | 
 | 2194 | XGL_LAYER_EXPORT void XGLAPI xglCmdBindVertexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t binding) | 
| Chia-I Wu | 7a42e12 | 2014-11-08 10:48:20 +0800 | [diff] [blame] | 2195 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2196 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2197 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2198 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2199 |         addCmd(pCB, CMD_BINDVERTEXBUFFER); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2200 |         pCB->lastVtxBinding = binding; | 
| Tobin Ehlis | db186c0 | 2015-03-16 11:49:58 -0600 | [diff] [blame] | 2201 |         validateVBBinding(cmdBuffer); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2202 |     } | 
 | 2203 |     else { | 
 | 2204 |         char str[1024]; | 
 | 2205 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2206 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2207 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2208 |     nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2209 | } | 
 | 2210 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2211 | XGL_LAYER_EXPORT void XGLAPI xglCmdDraw(XGL_CMD_BUFFER cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2212 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2213 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2214 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2215 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2216 |         addCmd(pCB, CMD_DRAW); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2217 |         pCB->drawCount[DRAW]++; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2218 |         char str[1024]; | 
 | 2219 |         sprintf(str, "xglCmdDraw() call #%lu, reporting DS state:", g_drawCount[DRAW]++); | 
 | 2220 |         layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str); | 
 | 2221 |         synchAndPrintDSConfig(cmdBuffer); | 
 | 2222 |     } | 
 | 2223 |     else { | 
 | 2224 |         char str[1024]; | 
 | 2225 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2226 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2227 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2228 |     nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount); | 
 | 2229 | } | 
 | 2230 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2231 | XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndexed(XGL_CMD_BUFFER cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2232 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2233 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2234 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2235 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2236 |         addCmd(pCB, CMD_DRAWINDEXED); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2237 |         pCB->drawCount[DRAW_INDEXED]++; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2238 |         char str[1024]; | 
 | 2239 |         sprintf(str, "xglCmdDrawIndexed() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED]++); | 
 | 2240 |         layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str); | 
 | 2241 |         synchAndPrintDSConfig(cmdBuffer); | 
 | 2242 |     } | 
 | 2243 |     else { | 
 | 2244 |         char str[1024]; | 
 | 2245 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2246 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2247 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2248 |     nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount); | 
 | 2249 | } | 
 | 2250 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2251 | XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t count, uint32_t stride) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2252 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2253 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2254 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2255 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2256 |         addCmd(pCB, CMD_DRAWINDIRECT); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2257 |         pCB->drawCount[DRAW_INDIRECT]++; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2258 |         char str[1024]; | 
 | 2259 |         sprintf(str, "xglCmdDrawIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDIRECT]++); | 
 | 2260 |         layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str); | 
 | 2261 |         synchAndPrintDSConfig(cmdBuffer); | 
 | 2262 |     } | 
 | 2263 |     else { | 
 | 2264 |         char str[1024]; | 
 | 2265 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2266 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2267 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2268 |     nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2269 | } | 
 | 2270 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2271 | XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndexedIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t count, uint32_t stride) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2272 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2273 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2274 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2275 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2276 |         addCmd(pCB, CMD_DRAWINDEXEDINDIRECT); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2277 |         pCB->drawCount[DRAW_INDEXED_INDIRECT]++; | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2278 |         char str[1024]; | 
 | 2279 |         sprintf(str, "xglCmdDrawIndexedIndirect() call #%lu, reporting DS state:", g_drawCount[DRAW_INDEXED_INDIRECT]++); | 
 | 2280 |         layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_NONE, "DS", str); | 
 | 2281 |         synchAndPrintDSConfig(cmdBuffer); | 
 | 2282 |     } | 
 | 2283 |     else { | 
 | 2284 |         char str[1024]; | 
 | 2285 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2286 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2287 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2288 |     nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2289 | } | 
 | 2290 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2291 | XGL_LAYER_EXPORT void XGLAPI xglCmdDispatch(XGL_CMD_BUFFER cmdBuffer, uint32_t x, uint32_t y, uint32_t z) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2292 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2293 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2294 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2295 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2296 |         addCmd(pCB, CMD_DISPATCH); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2297 |     } | 
 | 2298 |     else { | 
 | 2299 |         char str[1024]; | 
 | 2300 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2301 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2302 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2303 |     nextTable.CmdDispatch(cmdBuffer, x, y, z); | 
 | 2304 | } | 
 | 2305 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2306 | XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2307 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2308 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2309 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2310 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2311 |         addCmd(pCB, CMD_DISPATCHINDIRECT); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2312 |     } | 
 | 2313 |     else { | 
 | 2314 |         char str[1024]; | 
 | 2315 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2316 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2317 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2318 |     nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2319 | } | 
 | 2320 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2321 | XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER srcBuffer, XGL_BUFFER destBuffer, uint32_t regionCount, const XGL_BUFFER_COPY* pRegions) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2322 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2323 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2324 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2325 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2326 |         addCmd(pCB, CMD_COPYBUFFER); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2327 |     } | 
 | 2328 |     else { | 
 | 2329 |         char str[1024]; | 
 | 2330 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2331 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2332 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2333 |     nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2334 | } | 
 | 2335 |  | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2336 | XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImage(XGL_CMD_BUFFER cmdBuffer, | 
 | 2337 |                                              XGL_IMAGE srcImage, | 
 | 2338 |                                              XGL_IMAGE_LAYOUT srcImageLayout, | 
 | 2339 |                                              XGL_IMAGE destImage, | 
 | 2340 |                                              XGL_IMAGE_LAYOUT destImageLayout, | 
 | 2341 |                                              uint32_t regionCount, const XGL_IMAGE_COPY* pRegions) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2342 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2343 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2344 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2345 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2346 |         addCmd(pCB, CMD_COPYIMAGE); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2347 |     } | 
 | 2348 |     else { | 
 | 2349 |         char str[1024]; | 
 | 2350 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2351 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2352 |     } | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2353 |     nextTable.CmdCopyImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2354 | } | 
 | 2355 |  | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2356 | XGL_LAYER_EXPORT void XGLAPI xglCmdBlitImage(XGL_CMD_BUFFER cmdBuffer, | 
 | 2357 |                                              XGL_IMAGE srcImage, XGL_IMAGE_LAYOUT srcImageLayout, | 
 | 2358 |                                              XGL_IMAGE destImage, XGL_IMAGE_LAYOUT destImageLayout, | 
| Courtney Goeltzenleuchter | 89299fa | 2015-03-08 17:02:18 -0600 | [diff] [blame] | 2359 |                                              uint32_t regionCount, const XGL_IMAGE_BLIT* pRegions) | 
 | 2360 | { | 
 | 2361 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2362 |     if (pCB) { | 
 | 2363 |         updateCBTracking(cmdBuffer); | 
 | 2364 |         addCmd(pCB, CMD_COPYIMAGE); | 
 | 2365 |     } | 
 | 2366 |     else { | 
 | 2367 |         char str[1024]; | 
 | 2368 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2369 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2370 |     } | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2371 |     nextTable.CmdBlitImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions); | 
| Courtney Goeltzenleuchter | 89299fa | 2015-03-08 17:02:18 -0600 | [diff] [blame] | 2372 | } | 
 | 2373 |  | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2374 | XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBufferToImage(XGL_CMD_BUFFER cmdBuffer, | 
 | 2375 |                                                      XGL_BUFFER srcBuffer, | 
 | 2376 |                                                      XGL_IMAGE destImage, XGL_IMAGE_LAYOUT destImageLayout, | 
 | 2377 |                                                      uint32_t regionCount, const XGL_BUFFER_IMAGE_COPY* pRegions) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2378 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2379 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2380 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2381 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2382 |         addCmd(pCB, CMD_COPYBUFFERTOIMAGE); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2383 |     } | 
 | 2384 |     else { | 
 | 2385 |         char str[1024]; | 
 | 2386 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2387 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2388 |     } | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2389 |     nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, destImageLayout, regionCount, pRegions); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2390 | } | 
 | 2391 |  | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2392 | XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImageToBuffer(XGL_CMD_BUFFER cmdBuffer, | 
 | 2393 |                                                      XGL_IMAGE srcImage, XGL_IMAGE_LAYOUT srcImageLayout, | 
 | 2394 |                                                      XGL_BUFFER destBuffer, | 
 | 2395 |                                                      uint32_t regionCount, const XGL_BUFFER_IMAGE_COPY* pRegions) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2396 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2397 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2398 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2399 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2400 |         addCmd(pCB, CMD_COPYIMAGETOBUFFER); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2401 |     } | 
 | 2402 |     else { | 
 | 2403 |         char str[1024]; | 
 | 2404 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2405 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2406 |     } | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2407 |     nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, srcImageLayout, destBuffer, regionCount, pRegions); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2408 | } | 
 | 2409 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2410 | XGL_LAYER_EXPORT void XGLAPI xglCmdCloneImageData(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE_LAYOUT srcImageLayout, XGL_IMAGE destImage, XGL_IMAGE_LAYOUT destImageLayout) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2411 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2412 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2413 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2414 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2415 |         addCmd(pCB, CMD_CLONEIMAGEDATA); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2416 |     } | 
 | 2417 |     else { | 
 | 2418 |         char str[1024]; | 
 | 2419 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2420 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2421 |     } | 
| Mike Stroyan | fb80d5f | 2014-12-04 11:08:39 +0000 | [diff] [blame] | 2422 |     nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2423 | } | 
 | 2424 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2425 | XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const uint32_t* pData) | 
 | 2426 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2427 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2428 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2429 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2430 |         addCmd(pCB, CMD_UPDATEBUFFER); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2431 |     } | 
 | 2432 |     else { | 
 | 2433 |         char str[1024]; | 
 | 2434 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2435 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2436 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2437 |     nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData); | 
 | 2438 | } | 
 | 2439 |  | 
 | 2440 | XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, uint32_t data) | 
 | 2441 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2442 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2443 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2444 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2445 |         addCmd(pCB, CMD_FILLBUFFER); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2446 |     } | 
 | 2447 |     else { | 
 | 2448 |         char str[1024]; | 
 | 2449 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2450 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2451 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2452 |     nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data); | 
 | 2453 | } | 
 | 2454 |  | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2455 | XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImage(XGL_CMD_BUFFER cmdBuffer, | 
 | 2456 |                                                    XGL_IMAGE image, XGL_IMAGE_LAYOUT imageLayout, | 
 | 2457 |                                                    XGL_CLEAR_COLOR color, | 
 | 2458 |                                                    uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2459 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2460 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2461 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2462 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2463 |         addCmd(pCB, CMD_CLEARCOLORIMAGE); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2464 |     } | 
 | 2465 |     else { | 
 | 2466 |         char str[1024]; | 
 | 2467 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2468 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2469 |     } | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2470 |     nextTable.CmdClearColorImage(cmdBuffer, image, imageLayout, color, rangeCount, pRanges); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2471 | } | 
 | 2472 |  | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2473 | XGL_LAYER_EXPORT void XGLAPI xglCmdClearDepthStencil(XGL_CMD_BUFFER cmdBuffer, | 
 | 2474 |                                                      XGL_IMAGE image, XGL_IMAGE_LAYOUT imageLayout, | 
 | 2475 |                                                      float depth, uint32_t stencil, | 
 | 2476 |                                                      uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2477 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2478 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2479 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2480 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2481 |         addCmd(pCB, CMD_CLEARDEPTHSTENCIL); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2482 |     } | 
 | 2483 |     else { | 
 | 2484 |         char str[1024]; | 
 | 2485 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2486 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2487 |     } | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2488 |     nextTable.CmdClearDepthStencil(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2489 | } | 
 | 2490 |  | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2491 | XGL_LAYER_EXPORT void XGLAPI xglCmdResolveImage(XGL_CMD_BUFFER cmdBuffer, | 
 | 2492 |                                                 XGL_IMAGE srcImage, XGL_IMAGE_LAYOUT srcImageLayout, | 
 | 2493 |                                                 XGL_IMAGE destImage, XGL_IMAGE_LAYOUT destImageLayout, | 
 | 2494 |                                                 uint32_t rectCount, const XGL_IMAGE_RESOLVE* pRects) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2495 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2496 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2497 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2498 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2499 |         addCmd(pCB, CMD_RESOLVEIMAGE); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2500 |     } | 
 | 2501 |     else { | 
 | 2502 |         char str[1024]; | 
 | 2503 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2504 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2505 |     } | 
| Courtney Goeltzenleuchter | b3efe9b | 2015-03-25 11:25:10 -0600 | [diff] [blame] | 2506 |     nextTable.CmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, rectCount, pRects); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2507 | } | 
 | 2508 |  | 
| Courtney Goeltzenleuchter | 1e8f3be | 2015-03-24 18:02:34 -0600 | [diff] [blame] | 2509 | XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_PIPE_EVENT pipeEvent) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2510 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2511 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2512 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2513 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2514 |         addCmd(pCB, CMD_SETEVENT); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2515 |     } | 
 | 2516 |     else { | 
 | 2517 |         char str[1024]; | 
 | 2518 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2519 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2520 |     } | 
| Mike Stroyan | fb80d5f | 2014-12-04 11:08:39 +0000 | [diff] [blame] | 2521 |     nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2522 | } | 
 | 2523 |  | 
| Courtney Goeltzenleuchter | 1e8f3be | 2015-03-24 18:02:34 -0600 | [diff] [blame] | 2524 | XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_PIPE_EVENT pipeEvent) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2525 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2526 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2527 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2528 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2529 |         addCmd(pCB, CMD_RESETEVENT); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2530 |     } | 
 | 2531 |     else { | 
 | 2532 |         char str[1024]; | 
 | 2533 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2534 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2535 |     } | 
| Courtney Goeltzenleuchter | 1e8f3be | 2015-03-24 18:02:34 -0600 | [diff] [blame] | 2536 |     nextTable.CmdResetEvent(cmdBuffer, event, pipeEvent); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2537 | } | 
 | 2538 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2539 | XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo) | 
| Mike Stroyan | fb80d5f | 2014-12-04 11:08:39 +0000 | [diff] [blame] | 2540 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2541 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2542 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2543 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2544 |         addCmd(pCB, CMD_WAITEVENTS); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2545 |     } | 
 | 2546 |     else { | 
 | 2547 |         char str[1024]; | 
 | 2548 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2549 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2550 |     } | 
| Mike Stroyan | fb80d5f | 2014-12-04 11:08:39 +0000 | [diff] [blame] | 2551 |     nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo); | 
 | 2552 | } | 
 | 2553 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2554 | XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier) | 
| Mike Stroyan | fb80d5f | 2014-12-04 11:08:39 +0000 | [diff] [blame] | 2555 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2556 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2557 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2558 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2559 |         addCmd(pCB, CMD_PIPELINEBARRIER); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2560 |     } | 
 | 2561 |     else { | 
 | 2562 |         char str[1024]; | 
 | 2563 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2564 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2565 |     } | 
| Mike Stroyan | fb80d5f | 2014-12-04 11:08:39 +0000 | [diff] [blame] | 2566 |     nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier); | 
 | 2567 | } | 
 | 2568 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2569 | XGL_LAYER_EXPORT void XGLAPI xglCmdBeginQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot, XGL_FLAGS flags) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2570 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2571 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2572 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2573 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2574 |         addCmd(pCB, CMD_BEGINQUERY); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2575 |     } | 
 | 2576 |     else { | 
 | 2577 |         char str[1024]; | 
 | 2578 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2579 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2580 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2581 |     nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags); | 
 | 2582 | } | 
 | 2583 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2584 | XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2585 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2586 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2587 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2588 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2589 |         addCmd(pCB, CMD_ENDQUERY); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2590 |     } | 
 | 2591 |     else { | 
 | 2592 |         char str[1024]; | 
 | 2593 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2594 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2595 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2596 |     nextTable.CmdEndQuery(cmdBuffer, queryPool, slot); | 
 | 2597 | } | 
 | 2598 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2599 | XGL_LAYER_EXPORT void XGLAPI xglCmdResetQueryPool(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t startQuery, uint32_t queryCount) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2600 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2601 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2602 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2603 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2604 |         addCmd(pCB, CMD_RESETQUERYPOOL); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2605 |     } | 
 | 2606 |     else { | 
 | 2607 |         char str[1024]; | 
 | 2608 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2609 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2610 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2611 |     nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount); | 
 | 2612 | } | 
 | 2613 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2614 | XGL_LAYER_EXPORT void XGLAPI xglCmdWriteTimestamp(XGL_CMD_BUFFER cmdBuffer, XGL_TIMESTAMP_TYPE timestampType, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2615 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2616 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2617 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2618 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2619 |         addCmd(pCB, CMD_WRITETIMESTAMP); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2620 |     } | 
 | 2621 |     else { | 
 | 2622 |         char str[1024]; | 
 | 2623 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2624 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2625 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2626 |     nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2627 | } | 
 | 2628 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2629 | XGL_LAYER_EXPORT void XGLAPI xglCmdInitAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, const uint32_t* pData) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2630 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2631 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2632 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2633 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2634 |         addCmd(pCB, CMD_INITATOMICCOUNTERS); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2635 |     } | 
 | 2636 |     else { | 
 | 2637 |         char str[1024]; | 
 | 2638 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2639 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2640 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2641 |     nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData); | 
 | 2642 | } | 
 | 2643 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2644 | XGL_LAYER_EXPORT void XGLAPI xglCmdLoadAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, XGL_BUFFER srcBuffer, XGL_GPU_SIZE srcOffset) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2645 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2646 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2647 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2648 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2649 |         addCmd(pCB, CMD_LOADATOMICCOUNTERS); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2650 |     } | 
 | 2651 |     else { | 
 | 2652 |         char str[1024]; | 
 | 2653 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2654 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2655 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2656 |     nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2657 | } | 
 | 2658 |  | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2659 | XGL_LAYER_EXPORT void XGLAPI xglCmdSaveAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2660 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2661 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2662 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2663 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2664 |         addCmd(pCB, CMD_SAVEATOMICCOUNTERS); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2665 |     } | 
 | 2666 |     else { | 
 | 2667 |         char str[1024]; | 
 | 2668 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2669 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2670 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2671 |     nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset); | 
 | 2672 | } | 
 | 2673 |  | 
| Courtney Goeltzenleuchter | 69894b7 | 2015-04-03 15:25:24 -0600 | [diff] [blame] | 2674 | XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, const XGL_RENDER_PASS_BEGIN *pRenderPassBegin) | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2675 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2676 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2677 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2678 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2679 |         addCmd(pCB, CMD_BEGINRENDERPASS); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2680 |     } | 
 | 2681 |     else { | 
 | 2682 |         char str[1024]; | 
 | 2683 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2684 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2685 |     } | 
| Courtney Goeltzenleuchter | 69894b7 | 2015-04-03 15:25:24 -0600 | [diff] [blame] | 2686 |     nextTable.CmdBeginRenderPass(cmdBuffer, pRenderPassBegin); | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2687 | } | 
 | 2688 |  | 
 | 2689 | XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass) | 
 | 2690 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2691 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2692 |     if (pCB) { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2693 |         updateCBTracking(cmdBuffer); | 
| Tobin Ehlis | 93837a0 | 2015-02-13 13:30:07 -0700 | [diff] [blame] | 2694 |         addCmd(pCB, CMD_ENDRENDERPASS); | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2695 |     } | 
 | 2696 |     else { | 
 | 2697 |         char str[1024]; | 
 | 2698 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2699 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2700 |     } | 
| Tobin Ehlis | 7265e83 | 2015-01-19 08:42:29 -0700 | [diff] [blame] | 2701 |     nextTable.CmdEndRenderPass(cmdBuffer, renderPass); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2702 | } | 
 | 2703 |  | 
| Courtney Goeltzenleuchter | c80a557 | 2015-04-13 14:10:06 -0600 | [diff] [blame] | 2704 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_INSTANCE instance, XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2705 | { | 
| Tobin Ehlis | 246ba4d | 2014-11-18 16:38:08 -0700 | [diff] [blame] | 2706 |     // This layer intercepts callbacks | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 2707 |     XGL_LAYER_DBG_FUNCTION_NODE* pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE)); | 
 | 2708 | #if ALLOC_DEBUG | 
 | 2709 |     printf("Alloc34 #%lu pNewDbgFuncNode addr(%p)\n", ++g_alloc_count, (void*)pNewDbgFuncNode); | 
 | 2710 | #endif | 
| Tobin Ehlis | 246ba4d | 2014-11-18 16:38:08 -0700 | [diff] [blame] | 2711 |     if (!pNewDbgFuncNode) | 
 | 2712 |         return XGL_ERROR_OUT_OF_MEMORY; | 
 | 2713 |     pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback; | 
 | 2714 |     pNewDbgFuncNode->pUserData = pUserData; | 
| Jon Ashburn | 892d918 | 2014-12-22 13:38:27 -0700 | [diff] [blame] | 2715 |     pNewDbgFuncNode->pNext = g_pDbgFunctionHead; | 
 | 2716 |     g_pDbgFunctionHead = pNewDbgFuncNode; | 
| Jon Ashburn | a8aa837 | 2015-03-03 15:07:15 -0700 | [diff] [blame] | 2717 |     // force callbacks if DebugAction hasn't been set already other than initial value | 
| Courtney Goeltzenleuchter | 90d9320 | 2015-03-04 15:47:34 -0700 | [diff] [blame] | 2718 | 	if (g_actionIsDefault) { | 
 | 2719 | 		g_debugAction = XGL_DBG_LAYER_ACTION_CALLBACK; | 
 | 2720 | 	} | 
| Courtney Goeltzenleuchter | c80a557 | 2015-04-13 14:10:06 -0600 | [diff] [blame] | 2721 |     XGL_RESULT result = nextTable.DbgRegisterMsgCallback(instance, pfnMsgCallback, pUserData); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2722 |     return result; | 
 | 2723 | } | 
 | 2724 |  | 
| Courtney Goeltzenleuchter | c80a557 | 2015-04-13 14:10:06 -0600 | [diff] [blame] | 2725 | XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_INSTANCE instance, XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2726 | { | 
| Jon Ashburn | 892d918 | 2014-12-22 13:38:27 -0700 | [diff] [blame] | 2727 |     XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead; | 
| Tobin Ehlis | 246ba4d | 2014-11-18 16:38:08 -0700 | [diff] [blame] | 2728 |     XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav; | 
 | 2729 |     while (pTrav) { | 
 | 2730 |         if (pTrav->pfnMsgCallback == pfnMsgCallback) { | 
 | 2731 |             pPrev->pNext = pTrav->pNext; | 
| Jon Ashburn | 892d918 | 2014-12-22 13:38:27 -0700 | [diff] [blame] | 2732 |             if (g_pDbgFunctionHead == pTrav) | 
 | 2733 |                 g_pDbgFunctionHead = pTrav->pNext; | 
| Tobin Ehlis | 03d7a09 | 2015-02-17 16:27:03 -0700 | [diff] [blame] | 2734 | #if ALLOC_DEBUG | 
 | 2735 |     printf("Free34 #%lu pNewDbgFuncNode addr(%p)\n", ++g_alloc_count, (void*)pTrav); | 
 | 2736 | #endif | 
| Tobin Ehlis | 246ba4d | 2014-11-18 16:38:08 -0700 | [diff] [blame] | 2737 |             free(pTrav); | 
 | 2738 |             break; | 
 | 2739 |         } | 
 | 2740 |         pPrev = pTrav; | 
 | 2741 |         pTrav = pTrav->pNext; | 
 | 2742 |     } | 
| Jon Ashburn | a8aa837 | 2015-03-03 15:07:15 -0700 | [diff] [blame] | 2743 |     if (g_pDbgFunctionHead == NULL) | 
 | 2744 |     { | 
 | 2745 |         if (g_actionIsDefault) | 
 | 2746 |             g_debugAction = XGL_DBG_LAYER_ACTION_LOG_MSG; | 
 | 2747 |         else | 
 | 2748 |             g_debugAction &= ~XGL_DBG_LAYER_ACTION_CALLBACK; | 
 | 2749 |     } | 
| Courtney Goeltzenleuchter | c80a557 | 2015-04-13 14:10:06 -0600 | [diff] [blame] | 2750 |     XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(instance, pfnMsgCallback); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2751 |     return result; | 
 | 2752 | } | 
 | 2753 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2754 | XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2755 | { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2756 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2757 |     if (pCB) { | 
 | 2758 |         updateCBTracking(cmdBuffer); | 
 | 2759 |         addCmd(pCB, CMD_DBGMARKERBEGIN); | 
 | 2760 |     } | 
 | 2761 |     else { | 
 | 2762 |         char str[1024]; | 
 | 2763 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2764 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2765 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2766 |     nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker); | 
 | 2767 | } | 
 | 2768 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2769 | XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2770 | { | 
| Tobin Ehlis | 6744942 | 2015-03-02 10:16:40 -0700 | [diff] [blame] | 2771 |     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer); | 
 | 2772 |     if (pCB) { | 
 | 2773 |         updateCBTracking(cmdBuffer); | 
 | 2774 |         addCmd(pCB, CMD_DBGMARKEREND); | 
 | 2775 |     } | 
 | 2776 |     else { | 
 | 2777 |         char str[1024]; | 
 | 2778 |         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer); | 
 | 2779 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str); | 
 | 2780 |     } | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2781 |     nextTable.CmdDbgMarkerEnd(cmdBuffer); | 
 | 2782 | } | 
 | 2783 |  | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2784 | // TODO : Want to pass in a cmdBuffer here based on which state to display | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2785 | void drawStateDumpDotFile(char* outFileName) | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 2786 | { | 
| Tobin Ehlis | d01f7d6 | 2015-02-13 10:26:14 -0700 | [diff] [blame] | 2787 |     // TODO : Currently just setting cmdBuffer based on global var | 
| Tobin Ehlis | ae708b8 | 2015-02-27 08:48:43 -0700 | [diff] [blame] | 2788 |     //dumpDotFile(g_lastDrawStateCmdBuffer, outFileName); | 
 | 2789 |     dumpGlobalDotFile(outFileName); | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 2790 | } | 
 | 2791 |  | 
| Tobin Ehlis | 249c77e | 2015-02-24 15:40:22 -0700 | [diff] [blame] | 2792 | void drawStateDumpCommandBufferDotFile(char* outFileName) | 
 | 2793 | { | 
 | 2794 |     cbDumpDotFile(outFileName); | 
 | 2795 | } | 
 | 2796 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2797 | void drawStateDumpPngFile(char* outFileName) | 
| Tobin Ehlis | f27eba7 | 2014-12-16 17:34:50 -0700 | [diff] [blame] | 2798 | { | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 2799 | #if defined(_WIN32) | 
 | 2800 | // FIXME: NEED WINDOWS EQUIVALENT | 
 | 2801 |         char str[1024]; | 
 | 2802 |         sprintf(str, "Cannot execute dot program yet on Windows."); | 
 | 2803 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str); | 
 | 2804 | #else // WIN32 | 
| Tobin Ehlis | f27eba7 | 2014-12-16 17:34:50 -0700 | [diff] [blame] | 2805 |     char dotExe[32] = "/usr/bin/dot"; | 
 | 2806 |     if( access(dotExe, X_OK) != -1) { | 
| Tobin Ehlis | ea189f1 | 2015-02-23 09:06:28 -0700 | [diff] [blame] | 2807 |         dumpDotFile(g_lastCmdBuffer[getTIDIndex()], "/tmp/tmp.dot"); | 
| Tobin Ehlis | f27eba7 | 2014-12-16 17:34:50 -0700 | [diff] [blame] | 2808 |         char dotCmd[1024]; | 
 | 2809 |         sprintf(dotCmd, "%s /tmp/tmp.dot -Tpng -o %s", dotExe, outFileName); | 
 | 2810 |         system(dotCmd); | 
 | 2811 |         remove("/tmp/tmp.dot"); | 
 | 2812 |     } | 
 | 2813 |     else { | 
 | 2814 |         char str[1024]; | 
 | 2815 |         sprintf(str, "Cannot execute dot program at (%s) to dump requested %s file.", dotExe, outFileName); | 
 | 2816 |         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, DRAWSTATE_MISSING_DOT_PROGRAM, "DS", str); | 
 | 2817 |     } | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 2818 | #endif // WIN32 | 
| Tobin Ehlis | f27eba7 | 2014-12-16 17:34:50 -0700 | [diff] [blame] | 2819 | } | 
 | 2820 |  | 
| Mark Lobodzinski | 17caf57 | 2015-01-29 08:55:56 -0600 | [diff] [blame] | 2821 | XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName) | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2822 | { | 
 | 2823 |     XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu; | 
| Chia-I Wu | 4d11dcc | 2015-01-05 13:18:57 +0800 | [diff] [blame] | 2824 |  | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2825 |     if (gpu == NULL) | 
 | 2826 |         return NULL; | 
 | 2827 |     pCurObj = gpuw; | 
| Ian Elliott | 2d4ab1e | 2015-01-13 17:52:38 -0700 | [diff] [blame] | 2828 |     loader_platform_thread_once(&g_initOnce, initDrawState); | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2829 |  | 
| Jon Ashburn | 925fee9 | 2015-03-02 11:32:24 -0700 | [diff] [blame] | 2830 |     if (!strcmp(funcName, "xglGetProcAddr")) | 
 | 2831 |         return (void *) xglGetProcAddr; | 
 | 2832 |     if (!strcmp(funcName, "xglCreateDevice")) | 
 | 2833 |         return (void*) xglCreateDevice; | 
 | 2834 |     if (!strcmp(funcName, "xglDestroyDevice")) | 
 | 2835 |         return (void*) xglDestroyDevice; | 
 | 2836 |     if (!strcmp(funcName, "xglEnumerateLayers")) | 
 | 2837 |         return (void*) xglEnumerateLayers; | 
 | 2838 |     if (!strcmp(funcName, "xglQueueSubmit")) | 
 | 2839 |         return (void*) xglQueueSubmit; | 
 | 2840 |     if (!strcmp(funcName, "xglDestroyObject")) | 
 | 2841 |         return (void*) xglDestroyObject; | 
 | 2842 |     if (!strcmp(funcName, "xglCreateBufferView")) | 
 | 2843 |         return (void*) xglCreateBufferView; | 
 | 2844 |     if (!strcmp(funcName, "xglCreateImageView")) | 
 | 2845 |         return (void*) xglCreateImageView; | 
 | 2846 |     if (!strcmp(funcName, "xglCreateGraphicsPipeline")) | 
 | 2847 |         return (void*) xglCreateGraphicsPipeline; | 
| Courtney Goeltzenleuchter | 0d40f15 | 2015-03-25 15:37:49 -0600 | [diff] [blame] | 2848 |     if (!strcmp(funcName, "xglCreateGraphicsPipelineDerivative")) | 
 | 2849 |         return (void*) xglCreateGraphicsPipelineDerivative; | 
| Jon Ashburn | 925fee9 | 2015-03-02 11:32:24 -0700 | [diff] [blame] | 2850 |     if (!strcmp(funcName, "xglCreateSampler")) | 
 | 2851 |         return (void*) xglCreateSampler; | 
 | 2852 |     if (!strcmp(funcName, "xglCreateDescriptorSetLayout")) | 
 | 2853 |         return (void*) xglCreateDescriptorSetLayout; | 
 | 2854 |     if (!strcmp(funcName, "xglBeginDescriptorRegionUpdate")) | 
 | 2855 |         return (void*) xglBeginDescriptorRegionUpdate; | 
 | 2856 |     if (!strcmp(funcName, "xglEndDescriptorRegionUpdate")) | 
 | 2857 |         return (void*) xglEndDescriptorRegionUpdate; | 
 | 2858 |     if (!strcmp(funcName, "xglCreateDescriptorRegion")) | 
 | 2859 |         return (void*) xglCreateDescriptorRegion; | 
 | 2860 |     if (!strcmp(funcName, "xglClearDescriptorRegion")) | 
 | 2861 |         return (void*) xglClearDescriptorRegion; | 
 | 2862 |     if (!strcmp(funcName, "xglAllocDescriptorSets")) | 
 | 2863 |         return (void*) xglAllocDescriptorSets; | 
 | 2864 |     if (!strcmp(funcName, "xglClearDescriptorSets")) | 
 | 2865 |         return (void*) xglClearDescriptorSets; | 
 | 2866 |     if (!strcmp(funcName, "xglUpdateDescriptors")) | 
 | 2867 |         return (void*) xglUpdateDescriptors; | 
 | 2868 |     if (!strcmp(funcName, "xglCreateDynamicViewportState")) | 
 | 2869 |         return (void*) xglCreateDynamicViewportState; | 
 | 2870 |     if (!strcmp(funcName, "xglCreateDynamicRasterState")) | 
 | 2871 |         return (void*) xglCreateDynamicRasterState; | 
 | 2872 |     if (!strcmp(funcName, "xglCreateDynamicColorBlendState")) | 
 | 2873 |         return (void*) xglCreateDynamicColorBlendState; | 
 | 2874 |     if (!strcmp(funcName, "xglCreateDynamicDepthStencilState")) | 
 | 2875 |         return (void*) xglCreateDynamicDepthStencilState; | 
 | 2876 |     if (!strcmp(funcName, "xglCreateCommandBuffer")) | 
 | 2877 |         return (void*) xglCreateCommandBuffer; | 
 | 2878 |     if (!strcmp(funcName, "xglBeginCommandBuffer")) | 
 | 2879 |         return (void*) xglBeginCommandBuffer; | 
 | 2880 |     if (!strcmp(funcName, "xglEndCommandBuffer")) | 
 | 2881 |         return (void*) xglEndCommandBuffer; | 
 | 2882 |     if (!strcmp(funcName, "xglResetCommandBuffer")) | 
 | 2883 |         return (void*) xglResetCommandBuffer; | 
 | 2884 |     if (!strcmp(funcName, "xglCmdBindPipeline")) | 
 | 2885 |         return (void*) xglCmdBindPipeline; | 
| Jon Ashburn | 925fee9 | 2015-03-02 11:32:24 -0700 | [diff] [blame] | 2886 |     if (!strcmp(funcName, "xglCmdBindDynamicStateObject")) | 
 | 2887 |         return (void*) xglCmdBindDynamicStateObject; | 
 | 2888 |     if (!strcmp(funcName, "xglCmdBindDescriptorSet")) | 
 | 2889 |         return (void*) xglCmdBindDescriptorSet; | 
 | 2890 |     if (!strcmp(funcName, "xglCmdBindVertexBuffer")) | 
 | 2891 |         return (void*) xglCmdBindVertexBuffer; | 
 | 2892 |     if (!strcmp(funcName, "xglCmdBindIndexBuffer")) | 
 | 2893 |         return (void*) xglCmdBindIndexBuffer; | 
 | 2894 |     if (!strcmp(funcName, "xglCmdDraw")) | 
 | 2895 |         return (void*) xglCmdDraw; | 
 | 2896 |     if (!strcmp(funcName, "xglCmdDrawIndexed")) | 
 | 2897 |         return (void*) xglCmdDrawIndexed; | 
 | 2898 |     if (!strcmp(funcName, "xglCmdDrawIndirect")) | 
 | 2899 |         return (void*) xglCmdDrawIndirect; | 
 | 2900 |     if (!strcmp(funcName, "xglCmdDrawIndexedIndirect")) | 
 | 2901 |         return (void*) xglCmdDrawIndexedIndirect; | 
 | 2902 |     if (!strcmp(funcName, "xglCmdDispatch")) | 
 | 2903 |         return (void*) xglCmdDispatch; | 
 | 2904 |     if (!strcmp(funcName, "xglCmdDispatchIndirect")) | 
 | 2905 |         return (void*) xglCmdDispatchIndirect; | 
 | 2906 |     if (!strcmp(funcName, "xglCmdCopyBuffer")) | 
 | 2907 |         return (void*) xglCmdCopyBuffer; | 
 | 2908 |     if (!strcmp(funcName, "xglCmdCopyImage")) | 
 | 2909 |         return (void*) xglCmdCopyImage; | 
 | 2910 |     if (!strcmp(funcName, "xglCmdCopyBufferToImage")) | 
 | 2911 |         return (void*) xglCmdCopyBufferToImage; | 
 | 2912 |     if (!strcmp(funcName, "xglCmdCopyImageToBuffer")) | 
 | 2913 |         return (void*) xglCmdCopyImageToBuffer; | 
 | 2914 |     if (!strcmp(funcName, "xglCmdCloneImageData")) | 
 | 2915 |         return (void*) xglCmdCloneImageData; | 
 | 2916 |     if (!strcmp(funcName, "xglCmdUpdateBuffer")) | 
 | 2917 |         return (void*) xglCmdUpdateBuffer; | 
 | 2918 |     if (!strcmp(funcName, "xglCmdFillBuffer")) | 
 | 2919 |         return (void*) xglCmdFillBuffer; | 
 | 2920 |     if (!strcmp(funcName, "xglCmdClearColorImage")) | 
 | 2921 |         return (void*) xglCmdClearColorImage; | 
| Jon Ashburn | 925fee9 | 2015-03-02 11:32:24 -0700 | [diff] [blame] | 2922 |     if (!strcmp(funcName, "xglCmdClearDepthStencil")) | 
 | 2923 |         return (void*) xglCmdClearDepthStencil; | 
 | 2924 |     if (!strcmp(funcName, "xglCmdResolveImage")) | 
 | 2925 |         return (void*) xglCmdResolveImage; | 
 | 2926 |     if (!strcmp(funcName, "xglCmdSetEvent")) | 
 | 2927 |         return (void*) xglCmdSetEvent; | 
 | 2928 |     if (!strcmp(funcName, "xglCmdResetEvent")) | 
 | 2929 |         return (void*) xglCmdResetEvent; | 
 | 2930 |     if (!strcmp(funcName, "xglCmdWaitEvents")) | 
 | 2931 |         return (void*) xglCmdWaitEvents; | 
 | 2932 |     if (!strcmp(funcName, "xglCmdPipelineBarrier")) | 
 | 2933 |         return (void*) xglCmdPipelineBarrier; | 
 | 2934 |     if (!strcmp(funcName, "xglCmdBeginQuery")) | 
 | 2935 |         return (void*) xglCmdBeginQuery; | 
 | 2936 |     if (!strcmp(funcName, "xglCmdEndQuery")) | 
 | 2937 |         return (void*) xglCmdEndQuery; | 
 | 2938 |     if (!strcmp(funcName, "xglCmdResetQueryPool")) | 
 | 2939 |         return (void*) xglCmdResetQueryPool; | 
 | 2940 |     if (!strcmp(funcName, "xglCmdWriteTimestamp")) | 
 | 2941 |         return (void*) xglCmdWriteTimestamp; | 
 | 2942 |     if (!strcmp(funcName, "xglCmdInitAtomicCounters")) | 
 | 2943 |         return (void*) xglCmdInitAtomicCounters; | 
 | 2944 |     if (!strcmp(funcName, "xglCmdLoadAtomicCounters")) | 
 | 2945 |         return (void*) xglCmdLoadAtomicCounters; | 
 | 2946 |     if (!strcmp(funcName, "xglCmdSaveAtomicCounters")) | 
 | 2947 |         return (void*) xglCmdSaveAtomicCounters; | 
 | 2948 |     if (!strcmp(funcName, "xglCmdBeginRenderPass")) | 
 | 2949 |         return (void*) xglCmdBeginRenderPass; | 
 | 2950 |     if (!strcmp(funcName, "xglCmdEndRenderPass")) | 
 | 2951 |         return (void*) xglCmdEndRenderPass; | 
 | 2952 |     if (!strcmp(funcName, "xglDbgRegisterMsgCallback")) | 
 | 2953 |         return (void*) xglDbgRegisterMsgCallback; | 
 | 2954 |     if (!strcmp(funcName, "xglDbgUnregisterMsgCallback")) | 
 | 2955 |         return (void*) xglDbgUnregisterMsgCallback; | 
 | 2956 |     if (!strcmp(funcName, "xglCmdDbgMarkerBegin")) | 
 | 2957 |         return (void*) xglCmdDbgMarkerBegin; | 
 | 2958 |     if (!strcmp(funcName, "xglCmdDbgMarkerEnd")) | 
 | 2959 |         return (void*) xglCmdDbgMarkerEnd; | 
 | 2960 |     if (!strcmp("drawStateDumpDotFile", funcName)) | 
| Tobin Ehlis | 8356288 | 2014-11-27 15:43:39 -0700 | [diff] [blame] | 2961 |         return drawStateDumpDotFile; | 
| Jon Ashburn | 925fee9 | 2015-03-02 11:32:24 -0700 | [diff] [blame] | 2962 |     if (!strcmp("drawStateDumpCommandBufferDotFile", funcName)) | 
| Tobin Ehlis | 249c77e | 2015-02-24 15:40:22 -0700 | [diff] [blame] | 2963 |         return drawStateDumpCommandBufferDotFile; | 
| Jon Ashburn | 925fee9 | 2015-03-02 11:32:24 -0700 | [diff] [blame] | 2964 |     if (!strcmp("drawStateDumpPngFile", funcName)) | 
| Tobin Ehlis | f27eba7 | 2014-12-16 17:34:50 -0700 | [diff] [blame] | 2965 |         return drawStateDumpPngFile; | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2966 |     else { | 
| Tobin Ehlis | 97657ce | 2014-10-24 12:01:45 -0600 | [diff] [blame] | 2967 |         if (gpuw->pGPA == NULL) | 
 | 2968 |             return NULL; | 
 | 2969 |         return gpuw->pGPA(gpuw->nextObject, funcName); | 
 | 2970 |     } | 
 | 2971 | } |