blob: f971c906812e8aa26f0194c0b11afdeac7c43c22 [file] [log] [blame]
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001/*
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>
28#include <assert.h>
Ian Elliott81ac44c2015-01-13 17:52:38 -070029#include "loader_platform.h"
Chia-I Wu0f65b1e2015-01-04 23:11:43 +080030#include "xgl_dispatch_table_helper.h"
Chia-I Wu706533e2015-01-05 13:18:57 +080031#include "xgl_generic_intercept_proc_helper.h"
Tobin Ehlis791a49c2014-11-10 12:29:12 -070032#include "xgl_struct_string_helper.h"
Tobin Ehlis62086412014-11-19 16:19:28 -070033#include "mem_tracker.h"
Jon Ashburnf57ea372014-12-22 13:24:15 -070034#include "layers_config.h"
Ian Elliott20f06872015-02-12 17:08:34 -070035// The following is #included again to catch certain OS-specific functions
36// being used:
37#include "loader_platform.h"
Jon Ashburn5a7be202015-02-16 08:46:53 -070038#include "layers_msg.h"
Tobin Ehlis791a49c2014-11-10 12:29:12 -070039
40static XGL_LAYER_DISPATCH_TABLE nextTable;
41static XGL_BASE_LAYER_OBJECT *pCurObj;
Ian Elliott81ac44c2015-01-13 17:52:38 -070042static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce);
Jon Ashburnf57ea372014-12-22 13:24:15 -070043
Jon Ashburnf57ea372014-12-22 13:24:15 -070044
Tobin Ehlis2836a7d2015-01-08 15:22:32 -070045#define MAX_BINDING 0xFFFFFFFF
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060046static uint32_t lastVtxBinding = MAX_BINDING;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -070047
Tobin Ehlis791a49c2014-11-10 12:29:12 -070048static GLOBAL_CB_NODE* pGlobalCBHead = NULL;
49static GLOBAL_MEM_OBJ_NODE* pGlobalMemObjHead = NULL;
50static GLOBAL_OBJECT_NODE* pGlobalObjectHead = NULL;
51static XGL_DEVICE globalDevice = NULL;
Tobin Ehlis62086412014-11-19 16:19:28 -070052static uint64_t numCBNodes = 0;
53static uint64_t numMemObjNodes = 0;
54static uint64_t numObjectNodes = 0;
Tobin Ehlis791a49c2014-11-10 12:29:12 -070055// Check list for data and if it's not included insert new node
56// into HEAD of list pointed to by pHEAD & update pHEAD
Tobin Ehlis62086412014-11-19 16:19:28 -070057// Increment 'insert' if new node was inserted
Tobin Ehlis791a49c2014-11-10 12:29:12 -070058// return XGL_SUCCESS if no errors occur
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060059static XGL_RESULT insertMiniNode(MINI_NODE** pHEAD, const XGL_BASE_OBJECT data, uint32_t* insert)
Tobin Ehlis791a49c2014-11-10 12:29:12 -070060{
61 MINI_NODE* pTrav = *pHEAD;
62 while (pTrav && (pTrav->data != data)) {
63 pTrav = pTrav->pNext;
64 }
65 if (!pTrav) { // Add node to front of LL
66 pTrav = (MINI_NODE*)malloc(sizeof(MINI_NODE));
67 if (!pTrav)
68 return XGL_ERROR_OUT_OF_MEMORY;
69 memset(pTrav, 0, sizeof(MINI_NODE));
70 if (*pHEAD)
71 pTrav->pNext = *pHEAD;
72 *pHEAD = pTrav;
73 *insert += 1;
74 //pMemTrav->refCount++;
Tobin Ehlis62086412014-11-19 16:19:28 -070075 //sprintf(str, "MEM INFO : Incremented refCount for mem obj %p to %u", (void*)mem, pMemTrav->refCount);
Tobin Ehlis791a49c2014-11-10 12:29:12 -070076 }
77 if (pTrav->data) { // This is just FYI
78 assert(data == pTrav->data);
Tobin Ehlis62086412014-11-19 16:19:28 -070079 char str[1024];
80 sprintf(str, "Data %p is already in data LL w/ HEAD at %p", data, *pHEAD);
81 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, data, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -070082 }
83 pTrav->data = data;
84 return XGL_SUCCESS;
85}
86
87// Add new CB node for this cb at end of global CB LL
88static void insertGlobalCB(const XGL_CMD_BUFFER cb)
89{
90 GLOBAL_CB_NODE* pTrav = pGlobalCBHead;
91 if (!pTrav) {
92 pTrav = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE));
93 pGlobalCBHead = pTrav;
94 }
95 else {
96 while (NULL != pTrav->pNextGlobalCBNode)
97 pTrav = pTrav->pNextGlobalCBNode;
98 pTrav->pNextGlobalCBNode = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE));
99 pTrav = pTrav->pNextGlobalCBNode;
100 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700101 if (!pTrav) {
102 char str[1024];
103 sprintf(str, "Malloc failed to alloc node for Cmd Buffer %p", (void*)cb);
104 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
105 }
106 else {
107 numCBNodes++;
108 memset(pTrav, 0, sizeof(GLOBAL_CB_NODE));
109 pTrav->cmdBuffer = cb;
110 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700111}
112
113// Return ptr to node in global LL containing cb, or NULL if not found
114static GLOBAL_CB_NODE* getGlobalCBNode(const XGL_CMD_BUFFER cb)
115{
116 GLOBAL_CB_NODE* pTrav = pGlobalCBHead;
117 while (pTrav && (pTrav->cmdBuffer != cb))
118 pTrav = pTrav->pNextGlobalCBNode;
119 return pTrav;
120}
121// Set fence for given cb in global cb node
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600122static bool32_t setCBFence(const XGL_CMD_BUFFER cb, const XGL_FENCE fence)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700123{
124 GLOBAL_CB_NODE* pTrav = getGlobalCBNode(cb);
125 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700126 char str[1024];
127 sprintf(str, "Unable to find node for CB %p in order to set fence to %p", (void*)cb, (void*)fence);
128 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700129 return XGL_FALSE;
130 }
131 pTrav->fence = fence;
132 return XGL_TRUE;
133}
134
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600135static bool32_t validateCBMemRef(const XGL_CMD_BUFFER cb, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700136{
137 GLOBAL_CB_NODE* pTrav = getGlobalCBNode(cb);
138 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700139 char str[1024];
140 sprintf(str, "Unable to find node for CB %p in order to check memory references", (void*)cb);
141 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700142 return XGL_FALSE;
143 }
144 // Validate that all actual references are accounted for in pMemRefs
145 MINI_NODE* pMemNode = pTrav->pMemObjList;
146 uint32_t i;
147 uint8_t found = 0;
148 uint64_t foundCount = 0;
149 while (pMemNode) {
150 // TODO : Improve this algorithm
151 for (i = 0; i < memRefCount; i++) {
152 if (pMemNode->mem == pMemRefs[i].mem) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700153 char str[1024];
154 sprintf(str, "Found Mem Obj %p binding to CB %p", pMemNode->mem, cb);
155 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700156 found = 1;
157 foundCount++;
Tobin Ehlisa747e682014-11-25 14:47:20 -0700158 break;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700159 }
160 }
161 if (!found) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700162 char str[1024];
163 sprintf(str, "Memory reference list for Command Buffer %p is missing ref to mem obj %p", cb, pMemNode->mem);
164 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_CB_MISSING_MEM_REF, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700165 return XGL_FALSE;
166 }
167 found = 0;
168 pMemNode = pMemNode->pNext;
169 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700170 char str[1024];
171 sprintf(str, "Verified all %lu memory dependencies for CB %p are included in pMemRefs list", foundCount, cb);
172 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700173 // TODO : Could report mem refs in pMemRefs that AREN'T in mem LL, that would be primarily informational
174 // Currently just noting that there is a difference
Tobin Ehlis62086412014-11-19 16:19:28 -0700175 if (foundCount != memRefCount) {
176 sprintf(str, "Note that %u mem refs included in pMemRefs list, but only %lu appear to be required", memRefCount, foundCount);
177 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
178 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700179 return XGL_TRUE;
180}
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700181// Return ptr to node in global LL containing mem, or NULL if not found
182static GLOBAL_MEM_OBJ_NODE* getGlobalMemNode(const XGL_GPU_MEMORY mem)
183{
184 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
185 while (pTrav && (pTrav->mem != mem))
186 pTrav = pTrav->pNextGlobalNode;
187 return pTrav;
188}
189
190// Set a memory state transition for region of memory
191static void setMemTransition(const XGL_GPU_MEMORY mem, const XGL_MEMORY_STATE_TRANSITION* pTransition)
192{
193 // find memory node
194 GLOBAL_MEM_OBJ_NODE* pTrav = getGlobalMemNode(mem);
195 if (NULL == pTrav) {
196 // TODO : Flag error for missing node
197 }
198 else {
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700199 MEM_STATE_TRANSITION_NODE* pMTNode = pTrav->pRegions;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700200 MEM_STATE_TRANSITION_NODE* pPrevMTNode = pMTNode;
201 // TODO : Not sure of best way (or need) to distinguish mem from image here
202 // Verify that it's being used as memory (not image)
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700203 //if (!pTrav->pRegions.isMem) {
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700204 // TODO : Flag error for setting mem transition on image memory
205 //}
206 // Basic state update algorithm
207 // 1. Find insertion point where offset of new region will fall
208 // 1a. If insertion falls in middle of existing region, split that region
209 // 2. Find end point where offset+regionSize of new region will fall
210 // 2b. If end falls in middle of existing region, split
211 // 3. Free any newly unneeded regions
212
213 // As we make insertions, set ptr to first node to free and count number of nodes to free
214 uint32_t numToFree = 0;
215 MEM_STATE_TRANSITION_NODE* pFreeMe = NULL;
216 // Bool to track if start node was split so we don't delete it
217 uint32_t saveStartNode = 0;
218 // Create new node
219 MEM_STATE_TRANSITION_NODE* pNewNode = (MEM_STATE_TRANSITION_NODE*)malloc(sizeof(MEM_STATE_TRANSITION_NODE));
220 memset(pNewNode, 0, sizeof(MEM_STATE_TRANSITION_NODE));
221 memcpy(&pNewNode->transition, pTransition, sizeof(XGL_MEMORY_STATE_TRANSITION));
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700222 // Increment numRegions here and will be appropriately decremented below if needed
223 pTrav->numRegions++;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700224 if (!pMTNode) { // Initialization case, just set HEAD ptr to new node
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700225 pTrav->pRegions = pNewNode;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700226 }
227 else {
228 // If offset of new state is less than current offset, insert it & update state after it as needed
229 while (pMTNode->transition.memory.offset > pTransition->offset) {
230 pPrevMTNode = pMTNode;
231 pMTNode = pMTNode->pNext;
232 }
233 // pMTNode is the region where new region's start will fall
234 if (pTransition->offset > pMTNode->transition.memory.offset) {
235 // split start region
236 saveStartNode = 1;
237 pMTNode->transition.memory.regionSize = pTransition->offset - pMTNode->transition.memory.offset;
238 pMTNode->pNext = pNewNode;
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700239 // TODO: Verify that prev newState matches new oldState
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700240 }
241 else { // start point of regions are equal
242 // Prev ptr now points to new region
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700243 if (pPrevMTNode == pTrav->pRegions)
244 pTrav->pRegions = pNewNode;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700245 else
246 pPrevMTNode->pNext = pNewNode;
247 }
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700248 // New region is overlaying old region so make sure states match
249 if (pMTNode->transition.memory.newState != pNewNode->transition.memory.oldState) {
250 char str[1024];
251 sprintf(str, "Setting Memory state transition for mem %p, current newState of %s doesn't match overlapping transition oldState of %s", mem, string_XGL_MEMORY_STATE(pMTNode->transition.memory.newState), string_XGL_MEMORY_STATE(pNewNode->transition.memory.oldState));
252 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_STATE, "MEM", str);
253 }
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700254 // Start point insertion complete, find end point
255 XGL_GPU_SIZE newEndPoint = pTransition->offset + pTransition->regionSize;
256 XGL_GPU_SIZE curEndPoint = pMTNode->transition.memory.offset + pMTNode->transition.memory.regionSize;
257 while (newEndPoint > curEndPoint) {
258 // Flag any passed-over regions here for deletion
259 if (NULL == pFreeMe) {
260 pFreeMe = pMTNode;
261 }
262 numToFree++;
263 pPrevMTNode = pMTNode;
264 pMTNode = pMTNode->pNext;
265 // TODO : Handle NULL pMTNode case
266 curEndPoint = pMTNode->transition.memory.offset + pMTNode->transition.memory.regionSize;
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700267 if (pMTNode->transition.memory.newState != pNewNode->transition.memory.oldState) {
268 char str[1024];
269 sprintf(str, "Setting Memory state transition for mem %p, current newState of %s doesn't match overlapping transition oldState of %s", mem, string_XGL_MEMORY_STATE(pMTNode->transition.memory.newState), string_XGL_MEMORY_STATE(pNewNode->transition.memory.oldState));
270 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_STATE, "MEM", str);
271 }
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700272 }
273 if (newEndPoint < curEndPoint) {
274 // split end region
275 pMTNode->transition.memory.offset = pTransition->offset + pTransition->regionSize;
276 pNewNode->pNext = pMTNode;
277 }
278 else { // end points of regions are equal
279 pNewNode->pNext = pMTNode->pNext;
280 numToFree++;
281 if (NULL == pFreeMe)
282 pFreeMe = pMTNode;
283 }
284 // Free any regions that are no longer needed
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700285 if ((1 == saveStartNode) && (NULL != pFreeMe)) {
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700286 pFreeMe = pFreeMe->pNext;
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700287 numToFree--;
288 }
289 pTrav->numRegions -= numToFree;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700290 MEM_STATE_TRANSITION_NODE* pNodeToFree;
291 while (numToFree) {
292 pNodeToFree = pFreeMe;
293 pFreeMe = pFreeMe->pNext;
294 free(pNodeToFree);
295 numToFree--;
296 }
297 }
298 }
299}
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700300
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700301static void insertGlobalMemObj(const XGL_GPU_MEMORY mem, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_IMAGE_STATE defaultState)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700302{
303 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
304 if (!pTrav) {
305 pTrav = (GLOBAL_MEM_OBJ_NODE*)malloc(sizeof(GLOBAL_MEM_OBJ_NODE));
306 pGlobalMemObjHead = pTrav;
307 }
308 else {
309 while (NULL != pTrav->pNextGlobalNode)
310 pTrav = pTrav->pNextGlobalNode;
311 pTrav->pNextGlobalNode = (GLOBAL_MEM_OBJ_NODE*)malloc(sizeof(GLOBAL_MEM_OBJ_NODE));
312 pTrav = pTrav->pNextGlobalNode;
313 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700314 if (!pTrav) {
315 char str[1024];
316 sprintf(str, "Malloc failed to alloc node for Mem Object %p", (void*)mem);
317 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
318 }
319 else {
320 numMemObjNodes++;
321 memset(pTrav, 0, sizeof(GLOBAL_MEM_OBJ_NODE));
322 if (pAllocInfo) // MEM alloc created by xglWsiX11CreatePresentableImage() doesn't have alloc info struct
323 memcpy(&pTrav->allocInfo, pAllocInfo, sizeof(XGL_MEMORY_ALLOC_INFO));
324 pTrav->mem = mem;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700325 if (pAllocInfo) { // TODO : How to handle Wsi-created alloc?
326 // Create initial state node that covers entire allocation
327 // TODO : How to handle image memory?
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700328 pTrav->numRegions = 0; // This will be updated during setMemTransition call
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700329 XGL_MEMORY_STATE_TRANSITION initMemStateTrans;
330 memset(&initMemStateTrans, 0, sizeof(XGL_MEMORY_STATE_TRANSITION));
331 initMemStateTrans.sType = XGL_STRUCTURE_TYPE_MEMORY_STATE_TRANSITION;
332 initMemStateTrans.mem = mem;
333 initMemStateTrans.oldState = defaultState;
334 initMemStateTrans.newState = defaultState;
335 initMemStateTrans.offset = 0;
336 initMemStateTrans.regionSize = pAllocInfo->allocationSize;
337 setMemTransition(mem, &initMemStateTrans);
338 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700339 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700340}
341
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700342// Find Global CB Node and add mem binding to mini LL
343// Find Global Mem Obj Node and add CB binding to mini LL
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600344static bool32_t updateCBBinding(const XGL_CMD_BUFFER cb, const XGL_GPU_MEMORY mem)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700345{
346 // First update CB binding in MemObj mini CB list
347 GLOBAL_MEM_OBJ_NODE* pMemTrav = getGlobalMemNode(mem);
348 if (!pMemTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700349 char str[1024];
350 sprintf(str, "Trying to bind mem obj %p to CB %p but no Node for that mem obj.\n Was it correctly allocated? Did it already get freed?", mem, cb);
351 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700352 return XGL_FALSE;
353 }
354
355 XGL_RESULT result = insertMiniNode(&pMemTrav->pCmdBufferBindings, cb, &pMemTrav->refCount);
Ian Elliott81ac44c2015-01-13 17:52:38 -0700356 if (XGL_SUCCESS != result) {
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700357 return result;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700358 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700359
360 // Now update Global CB's Mini Mem binding list
361 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cb);
362 if (!pCBTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700363 char str[1024];
364 sprintf(str, "Trying to bind mem obj %p to CB %p but no Node for that CB. Was it CB incorrectly destroyed?", mem, cb);
365 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700366 return XGL_FALSE;
367 }
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600368 uint32_t dontCare;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700369 result = insertMiniNode(&pCBTrav->pMemObjList, mem, &dontCare);
370 if (XGL_SUCCESS != result)
371 return result;
372
373 return XGL_TRUE;
374}
375// Clear the CB Binding for mem
376static void clearCBBinding(const XGL_CMD_BUFFER cb, const XGL_GPU_MEMORY mem)
377{
378 GLOBAL_MEM_OBJ_NODE* pTrav = getGlobalMemNode(mem);
379 MINI_NODE* pMiniCB = pTrav->pCmdBufferBindings;
380 MINI_NODE* pPrev = pMiniCB;
381 while (pMiniCB && (cb != pMiniCB->cmdBuffer)) {
382 pPrev = pMiniCB;
383 pMiniCB = pMiniCB->pNext;
384 }
385 if (!pMiniCB) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700386 char str[1024];
387 sprintf(str, "Trying to clear CB binding but CB %p not in binding list for mem obj %p", cb, mem);
388 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700389 }
390 else { // remove node from list & decrement refCount
391 pPrev->pNext = pMiniCB->pNext;
392 if (pMiniCB == pTrav->pCmdBufferBindings)
393 pTrav->pCmdBufferBindings = NULL;
394 free(pMiniCB);
395 pTrav->refCount--;
396 }
397}
398// Free bindings related to CB
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600399static bool32_t freeCBBindings(const XGL_CMD_BUFFER cb)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700400{
401 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cb);
402 if (!pCBTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700403 char str[1024];
404 sprintf(str, "Unable to find global CB node %p for deletion", cb);
405 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700406 return XGL_FALSE;
407 }
408 MINI_NODE* pMemTrav = pCBTrav->pMemObjList;
409 MINI_NODE* pDeleteMe = NULL;
410 // We traverse LL in order and free nodes as they're cleared
411 while (pMemTrav) {
412 pDeleteMe = pMemTrav;
413 if (pMemTrav->mem)
414 clearCBBinding(cb, pMemTrav->mem);
415 pMemTrav = pMemTrav->pNext;
416 free(pDeleteMe);
417 }
418 pCBTrav->pMemObjList = NULL;
419 return XGL_TRUE;
420}
421// Delete Global CB Node from list along with all of it's mini mem obj node
422// and also clear Global mem references to CB
423// TODO : When should this be called? There's no Destroy of CBs that I see
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600424static bool32_t deleteGlobalCBNode(const XGL_CMD_BUFFER cb)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700425{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700426 if (XGL_FALSE == freeCBBindings(cb)) {
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700427 return XGL_FALSE;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700428 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700429 // Delete the Global CB node
430 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cb);
431 pCBTrav = pGlobalCBHead;
432 GLOBAL_CB_NODE* pPrev = pCBTrav;
433 while (pCBTrav && (cb != pCBTrav->cmdBuffer)) {
434 pPrev = pCBTrav;
435 pCBTrav = pCBTrav->pNextGlobalCBNode;
436 }
437 assert(cb); // We found node at start of function so it should still be here
438 pPrev->pNextGlobalCBNode = pCBTrav->pNextGlobalCBNode;
439 if (pCBTrav == pGlobalCBHead)
440 pGlobalCBHead = pCBTrav->pNextGlobalCBNode;
441 free(pCBTrav);
442 return XGL_TRUE;
443}
444// Delete the entire CB list
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600445static bool32_t deleteGlobalCBList()
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700446{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600447 bool32_t result = XGL_TRUE;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700448 GLOBAL_CB_NODE* pCBTrav = pGlobalCBHead;
449 while (pCBTrav) {
Tobin Ehlisa747e682014-11-25 14:47:20 -0700450 XGL_CMD_BUFFER cbToDelete = pCBTrav->cmdBuffer;
451 pCBTrav = pCBTrav->pNextGlobalCBNode;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600452 bool32_t tmpResult = deleteGlobalCBNode(cbToDelete);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700453 // If any result is FALSE, final result should be FALSE
454 if ((XGL_FALSE == tmpResult) || (XGL_FALSE == result))
455 result = XGL_FALSE;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700456 }
457 return result;
458}
459
460// For given MemObj node, report Obj & CB bindings
461static void reportMemReferences(const GLOBAL_MEM_OBJ_NODE* pMemObjTrav)
462{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600463 uint32_t refCount = 0; // Count found references
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700464 MINI_NODE* pObjTrav = pMemObjTrav->pObjBindings;
465 MINI_NODE* pCBTrav = pMemObjTrav->pCmdBufferBindings;
466 while (pCBTrav) {
467 refCount++;
Tobin Ehlis62086412014-11-19 16:19:28 -0700468 char str[1024];
469 sprintf(str, "Command Buffer %p has reference to mem obj %p", pCBTrav->cmdBuffer, pMemObjTrav->mem);
470 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCBTrav->cmdBuffer, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700471 pCBTrav = pCBTrav->pNext;
472 }
473 while (pObjTrav) {
474 refCount++;
Tobin Ehlis62086412014-11-19 16:19:28 -0700475 char str[1024];
476 sprintf(str, "XGL Object %p has reference to mem obj %p", pObjTrav->object, pMemObjTrav->mem);
477 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pObjTrav->object, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700478 pObjTrav = pObjTrav->pNext;
479 }
480 if (refCount != pMemObjTrav->refCount) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700481 char str[1024];
482 sprintf(str, "Refcount of %u for Mem Obj %p does't match reported refs of %u", pMemObjTrav->refCount, pMemObjTrav->mem, refCount);
483 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pObjTrav->object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700484 }
485}
486
487static void deleteGlobalMemNode(XGL_GPU_MEMORY mem)
488{
489 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
490 GLOBAL_MEM_OBJ_NODE* pPrev = pTrav;
491 while (pTrav && (pTrav->mem != mem)) {
492 pPrev = pTrav;
493 pTrav = pTrav->pNextGlobalNode;
494 }
495 if (pTrav) {
496 pPrev->pNextGlobalNode = pTrav->pNextGlobalNode;
497 if (pGlobalMemObjHead == pTrav)
498 pGlobalMemObjHead = pTrav->pNextGlobalNode;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700499 // delete transition list off of this node
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700500 MEM_STATE_TRANSITION_NODE* pMSTNode = pTrav->pRegions;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700501 MEM_STATE_TRANSITION_NODE* pPrevMSTNode = pMSTNode;
502 while(pMSTNode) {
503 pPrevMSTNode = pMSTNode;
504 pMSTNode = pMSTNode->pNext;
505 free(pPrevMSTNode);
506 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700507 free(pTrav);
508 }
509 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700510 char str[1024];
511 sprintf(str, "Could not find global mem obj node for %p to delete!", mem);
512 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700513 }
514}
515// Check if fence for given CB is completed
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600516static bool32_t checkCBCompleted(const XGL_CMD_BUFFER cb)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700517{
518 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cb);
519 if (!pCBTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700520 char str[1024];
521 sprintf(str, "Unable to find global CB node %p to check for completion", cb);
522 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700523 return XGL_FALSE;
524 }
525 if (!pCBTrav->fence) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700526 char str[1024];
527 sprintf(str, "No fence found for CB %p to check for completion", cb);
528 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_CB_MISSING_FENCE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700529 return XGL_FALSE;
530 }
531 if (XGL_SUCCESS != nextTable.GetFenceStatus(pCBTrav->fence)) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700532 char str[1024];
533 sprintf(str, "Fence %p for CB %p has not completed", pCBTrav->fence, cb);
534 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700535 return XGL_FALSE;
536 }
537 return XGL_TRUE;
538}
539
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600540static bool32_t freeMemNode(XGL_GPU_MEMORY mem)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700541{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600542 bool32_t result = XGL_TRUE;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700543 // Parse global list to find node w/ mem
544 GLOBAL_MEM_OBJ_NODE* pTrav = getGlobalMemNode(mem);
545 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700546 char str[1024];
547 sprintf(str, "Couldn't find mem node object for %p\n Was %p never allocated or previously freed?", (void*)mem, (void*)mem);
548 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700549 return XGL_FALSE;
550 }
551 else {
552 // First clear any CB bindings for completed CBs
553 // TODO : Is there a better place to do this?
554 MINI_NODE* pMiniCB = pTrav->pCmdBufferBindings;
555 while (pMiniCB) {
556 XGL_CMD_BUFFER curCB = pMiniCB->cmdBuffer;
557 pMiniCB = pMiniCB->pNext;
558 if (XGL_TRUE == checkCBCompleted(curCB)) {
559 freeCBBindings(curCB);
560 }
561 }
562 // Now verify that no references to this mem obj remain
563 if (0 != pTrav->refCount) {
564 // If references remain, report the error and can search down CB LL to find references
565 result = XGL_FALSE;
Tobin Ehlis62086412014-11-19 16:19:28 -0700566 char str[1024];
567 sprintf(str, "Freeing mem obj %p while it still has references", (void*)mem);
568 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREED_MEM_REF, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700569 reportMemReferences(pTrav);
570 }
571 // Delete global node
572 deleteGlobalMemNode(mem);
573 }
574 return result;
575}
576
577// Return object node for 'object' or return NULL if no node exists
578static GLOBAL_OBJECT_NODE* getGlobalObjectNode(const XGL_OBJECT object)
579{
580 GLOBAL_OBJECT_NODE* pTrav = pGlobalObjectHead;
581 while (pTrav && (object != pTrav->object)) {
582 pTrav = pTrav->pNext;
583 }
584 return pTrav;
585}
586
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700587static GLOBAL_OBJECT_NODE* insertGlobalObjectNode(XGL_OBJECT object, XGL_STRUCTURE_TYPE sType, const void *pCreateInfo, const int struct_size, char *name_prefix)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700588{
589 GLOBAL_OBJECT_NODE* pTrav = pGlobalObjectHead;
590 if (!pTrav) {
591 pTrav = (GLOBAL_OBJECT_NODE*)malloc(sizeof(GLOBAL_OBJECT_NODE));
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700592 memset(pTrav, 0, sizeof(GLOBAL_OBJECT_NODE));
593 pGlobalObjectHead = pTrav;
594 }
595 else {
596 GLOBAL_OBJECT_NODE* pPrev = pTrav;
597 while (pTrav) {
598 pPrev = pTrav;
599 pTrav = pTrav->pNext;
600 }
601 pTrav = (GLOBAL_OBJECT_NODE*)malloc(sizeof(GLOBAL_OBJECT_NODE));
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700602 memset(pTrav, 0, sizeof(GLOBAL_OBJECT_NODE));
603 pPrev->pNext = pTrav;
604 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700605 if (!pTrav) {
606 char str[1024];
607 sprintf(str, "Malloc failed to alloc node for XGL Object %p", (void*)object);
608 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
609 return NULL;
610 }
611 else {
612 numObjectNodes++;
613 pTrav->object = object;
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700614 pTrav->ref_count = 1;
615 pTrav->sType = sType;
616 memcpy(&pTrav->create_info, pCreateInfo, struct_size);
617 sprintf(pTrav->object_name, "%s_%p", name_prefix, object);
Tobin Ehlis62086412014-11-19 16:19:28 -0700618 return pTrav;
619 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700620}
621
622// Remove object binding performs 3 tasks:
623// 1. Remove object node from Global Mem Obj mini LL of obj bindings & free it
624// 2. Decrement refCount for Global Mem Obj
625// 3. Clear Global Mem Obj ptr from Global Object Node
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600626static bool32_t clearObjectBinding(XGL_OBJECT object)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700627{
628 GLOBAL_OBJECT_NODE* pGlobalObjTrav = getGlobalObjectNode(object);
629 if (!pGlobalObjTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700630 char str[1024];
631 sprintf(str, "Attempting to clear mem binding for object %p", object);
632 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700633 return XGL_FALSE;
634 }
635 if (!pGlobalObjTrav->pMemNode) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700636 char str[1024];
637 sprintf(str, "Attempting to clear mem binding on obj %p but it has no binding.", (void*)object);
638 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEM_OBJ_CLEAR_EMPTY_BINDINGS, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700639 return XGL_FALSE;
640 }
641 MINI_NODE* pObjTrav = pGlobalObjTrav->pMemNode->pObjBindings;
642 MINI_NODE* pPrevObj = pObjTrav;
643 while (pObjTrav) {
644 if (object == pObjTrav->object) {
645 pPrevObj->pNext = pObjTrav->pNext;
646 // check if HEAD needs to be updated
647 if (pGlobalObjTrav->pMemNode->pObjBindings == pObjTrav)
648 pGlobalObjTrav->pMemNode->pObjBindings = pObjTrav->pNext;
649 free(pObjTrav);
650 pGlobalObjTrav->pMemNode->refCount--;
651 pGlobalObjTrav->pMemNode = NULL;
652 return XGL_TRUE;
653 }
654 pPrevObj = pObjTrav;
655 pObjTrav = pObjTrav->pNext;
656 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700657 char str[1024];
658 sprintf(str, "While trying to clear mem binding for object %p, unable to find that object referenced by mem obj %p", object, pGlobalObjTrav->pMemNode->mem);
659 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700660 return XGL_FALSE;
661}
662
663// For NULL mem case, clear any previous binding Else...
664// Make sure given object is in global object LL
Tobin Ehlis62086412014-11-19 16:19:28 -0700665// IF a previous binding existed, clear it
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700666// Add link from global object node to global memory node
667// Add mini-object node & reference off of global obj node
668// Return XGL_TRUE if addition is successful, XGL_FALSE otherwise
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600669static bool32_t updateObjectBinding(XGL_OBJECT object, XGL_GPU_MEMORY mem)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700670{
671 // Handle NULL case separately, just clear previous binding & decrement reference
672 if (mem == XGL_NULL_HANDLE) {
673 clearObjectBinding(object);
674 return XGL_TRUE;
675 }
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700676 char str[1024];
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700677 GLOBAL_OBJECT_NODE* pGlobalObjTrav = getGlobalObjectNode(object);
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700678 assert(pGlobalObjTrav);
679 if (!pGlobalObjTrav) {
680 sprintf(str, "Attempting to update Binding of Obj(%p) that's not in global list()", (void*)object);
681 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
682 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700683 // non-null case so should have real mem obj
684 GLOBAL_MEM_OBJ_NODE* pTrav = getGlobalMemNode(mem);
685 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700686 sprintf(str, "While trying to bind mem for obj %p, couldn't find node for mem obj %p", (void*)object, (void*)mem);
687 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700688 return XGL_FALSE;
689 }
690 XGL_RESULT result = insertMiniNode(&pTrav->pObjBindings, object, &pTrav->refCount);
691 if (XGL_SUCCESS != result)
692 return result;
693
Tobin Ehlis62086412014-11-19 16:19:28 -0700694 if (pGlobalObjTrav->pMemNode) {
695 clearObjectBinding(object); // Need to clear the previous object binding before setting new binding
Tobin Ehlis62086412014-11-19 16:19:28 -0700696 sprintf(str, "Updating memory binding for object %p from mem obj %p to %p", object, pGlobalObjTrav->pMemNode->mem, mem);
697 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_NONE, "MEM", str);
698 }
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700699 // For image objects, make sure default memory state is correctly set
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700700 // TODO : What's the best/correct way to handle this?
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700701 if (XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO == pGlobalObjTrav->sType) {
702 if (pGlobalObjTrav->create_info.image_create_info.usage & (XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT)) {
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700703 XGL_MEMORY_STATE_TRANSITION initMemStateTrans;
704 memset(&initMemStateTrans, 0, sizeof(XGL_MEMORY_STATE_TRANSITION));
705 initMemStateTrans.mem = mem;
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700706 //initMemStateTrans.oldState = XGL_IMAGE_STATE_UNINITIALIZED_TARGET;
707 //initMemStateTrans.newState = XGL_IMAGE_STATE_UNINITIALIZED_TARGET;
708 // TODO : For now just using initial memory state
709 initMemStateTrans.oldState = XGL_MEMORY_STATE_DATA_TRANSFER;
710 initMemStateTrans.newState = XGL_MEMORY_STATE_DATA_TRANSFER;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700711 initMemStateTrans.offset = 0;
712 initMemStateTrans.regionSize = pTrav->allocInfo.allocationSize;
713 setMemTransition(mem, &initMemStateTrans);
714/*
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700715 pTrav->transition.image.oldState = XGL_IMAGE_STATE_UNINITIALIZED_TARGET;
716 pTrav->transition.image.newState = XGL_IMAGE_STATE_UNINITIALIZED_TARGET;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700717*/
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700718 }
719 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700720 pGlobalObjTrav->pMemNode = pTrav;
721 return XGL_TRUE;
722}
723// Print details of global Obj tracking list
724static void printObjList()
725{
726 GLOBAL_OBJECT_NODE* pGlobalObjTrav = pGlobalObjectHead;
727 if (!pGlobalObjTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700728 char str[1024];
729 sprintf(str, "Global Object list is empty :(\n");
730 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700731 }
732 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700733 char str[1024];
734 sprintf(str, "Details of Global Object list w/ HEAD at %p", (void*)pGlobalObjTrav);
735 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700736 while (pGlobalObjTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700737 sprintf(str, " GlobObjNode %p has object %p, pNext %p, pMemNode %p", pGlobalObjTrav, pGlobalObjTrav->object, pGlobalObjTrav->pNext, pGlobalObjTrav->pMemNode);
738 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pGlobalObjTrav->object, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700739 pGlobalObjTrav = pGlobalObjTrav->pNext;
740 }
741 }
742}
743// For given Object, get 'mem' obj that it's bound to or NULL if no binding
744static XGL_GPU_MEMORY getMemBindingFromObject(const XGL_OBJECT object)
745{
746 XGL_GPU_MEMORY mem = NULL;
747 GLOBAL_OBJECT_NODE* pObjNode = getGlobalObjectNode(object);
748 if (pObjNode) {
749 if (pObjNode->pMemNode) {
750 mem = pObjNode->pMemNode->mem;
751 }
752 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700753 char str[1024];
754 sprintf(str, "Trying to get mem binding for object %p but object has no mem binding", (void*)object);
755 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MISSING_MEM_BINDINGS, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700756 printObjList();
757 }
758 }
759 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700760 char str[1024];
761 sprintf(str, "Trying to get mem binding for object %p but no such object in global list", (void*)object);
762 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_OBJECT, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700763 printObjList();
764 }
765 return mem;
766}
767// Print details of global Mem Obj list
768static void printMemList()
769{
770 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
Tobin Ehlis62086412014-11-19 16:19:28 -0700771 // Just printing each msg individually for now, may want to package these into single large print
772 char str[1024];
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700773 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700774 sprintf(str, "MEM INFO : Global Memory Object list is empty :(\n");
775 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700776 }
777 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700778 sprintf(str, "MEM INFO : Details of Global Memory Object list w/ HEAD at %p", (void*)pTrav);
779 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700780 while (pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700781 sprintf(str, " ===MemObj Node at %p===", (void*)pTrav);
782 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
783 sprintf(str, " Mem object: %p", (void*)pTrav->mem);
784 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
785 sprintf(str, " Ref Count: %u", pTrav->refCount);
786 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
787 sprintf(str, " pNext Mem Obj Node: %p", (void*)pTrav->pNextGlobalNode);
788 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
789 if (0 != pTrav->allocInfo.allocationSize)
790 sprintf(str, " Mem Alloc info:\n%s", xgl_print_xgl_memory_alloc_info(&pTrav->allocInfo, "{MEM}INFO : "));
791 else
792 sprintf(str, " Mem Alloc info is NULL (alloc done by xglWsiX11CreatePresentableImage())");
793 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700794 MINI_NODE* pObjTrav = pTrav->pObjBindings;
Tobin Ehlis62086412014-11-19 16:19:28 -0700795 if (!pObjTrav) {
796 sprintf(str, " No XGL Object bindings");
797 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
798 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700799 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700800 sprintf(str, " XGL OBJECT Binding list w/ HEAD at %p:", pObjTrav);
801 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700802 while (pObjTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700803 sprintf(str, " OBJ_NODE(%p): XGL OBJECT %p, pNext %p", pObjTrav, pObjTrav->object, pObjTrav->pNext);
804 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700805 pObjTrav = pObjTrav->pNext;
806 }
807 }
808 MINI_NODE* pCBTrav = pTrav->pCmdBufferBindings;
Tobin Ehlis62086412014-11-19 16:19:28 -0700809 if (!pCBTrav) {
810 sprintf(str, " No Command Buffer bindings");
811 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
812 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700813 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700814 sprintf(str, " XGL Command Buffer (CB) binding list w/ HEAD at %p:", pCBTrav);
815 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700816 while (pCBTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700817 sprintf(str, " CB_NODE(%p): XGL CB %p, pNext %p", pCBTrav, pCBTrav->cmdBuffer, pCBTrav->pNext);
818 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700819 pCBTrav = pCBTrav->pNext;
820 }
821 }
Tobin Ehlis366fbd32015-01-14 12:47:30 -0700822 MEM_STATE_TRANSITION_NODE* pTrans = pTrav->pRegions;
823 if (!pTrans) {
824 sprintf(str, " No regions");
825 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
826 }
827 else {
828 sprintf(str, " XGL_MEMORY_STATE_TRANSITION (MST) regions list w/ HEAD at %p:", pTrans);
829 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
830 while (pTrans) {
831 sprintf(str, " MST_NODE(%p):\n%s", pTrans, xgl_print_xgl_memory_state_transition(&pTrans->transition.memory, "{MEM}INFO : "));
832 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
833 pTrans = pTrans->pNext;
834 }
835 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700836 pTrav = pTrav->pNextGlobalNode;
837 }
838 }
839}
840
841static void printGlobalCB()
842{
Tobin Ehlis62086412014-11-19 16:19:28 -0700843 char str[1024] = {0};
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700844 GLOBAL_CB_NODE* pTrav = pGlobalCBHead;
845 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700846 sprintf(str, "Global Command Buffer (CB) list is empty :(\n");
847 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700848 }
849 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700850 sprintf(str, "Details of Global CB list w/ HEAD at %p:", (void*)pTrav);
851 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700852 while (pTrav) {
Tobin Ehlisa747e682014-11-25 14:47:20 -0700853 sprintf(str, " Global CB Node (%p) w/ pNextGlobalCBNode (%p) has CB %p, fence %p, and pMemObjList %p", (void*)pTrav, (void*)pTrav->pNextGlobalCBNode, (void*)pTrav->cmdBuffer, (void*)pTrav->fence, (void*)pTrav->pMemObjList);
Tobin Ehlis62086412014-11-19 16:19:28 -0700854 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700855 MINI_NODE* pMemObjTrav = pTrav->pMemObjList;
856 while (pMemObjTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700857 sprintf(str, " MEM_NODE(%p): Mem obj %p, pNext %p", (void*)pMemObjTrav, (void*)pMemObjTrav->mem, (void*)pMemObjTrav->pNext);
858 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700859 pMemObjTrav = pMemObjTrav->pNext;
860 }
861 pTrav = pTrav->pNextGlobalCBNode;
862 }
863 }
864}
865
866static XGL_FENCE createLocalFence()
867{
868 XGL_FENCE_CREATE_INFO fci;
869 fci.sType = XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO;
870 fci.pNext = NULL;
871 fci.flags = 0;
872 XGL_FENCE fence;
873 nextTable.CreateFence(globalDevice, &fci, &fence);
874 return fence;
875}
876
Jon Ashburnf57ea372014-12-22 13:24:15 -0700877static void initMemTracker()
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700878{
Jon Ashburnf57ea372014-12-22 13:24:15 -0700879 const char *strOpt;
880 // initialize MemTracker options
881 strOpt = getLayerOption("MemTrackerReportLevel");
882 if (strOpt != NULL)
883 g_reportingLevel = atoi(strOpt);
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -0700884
Jon Ashburnf57ea372014-12-22 13:24:15 -0700885 strOpt = getLayerOption("MemTrackerDebugAction");
886 if (strOpt != NULL)
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -0700887 g_debugAction = atoi(strOpt);
888
Jon Ashburnf57ea372014-12-22 13:24:15 -0700889 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
890 {
891 strOpt = getLayerOption("MemTrackerLogFilename");
892 if (strOpt)
893 {
894 g_logFile = fopen(strOpt, "w");
Jon Ashburnf57ea372014-12-22 13:24:15 -0700895 }
896 if (g_logFile == NULL)
897 g_logFile = stdout;
898 }
899
900 // initialize Layer dispatch table
901 // TODO handle multiple GPUs
Mark Lobodzinski953a1692015-01-09 15:12:03 -0600902 xglGetProcAddrType fpNextGPA;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700903 fpNextGPA = pCurObj->pGPA;
904 assert(fpNextGPA);
905
Chia-I Wu0f65b1e2015-01-04 23:11:43 +0800906 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
907
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600908 xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr");
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700909 nextTable.GetProcAddr = fpGetProcAddr;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700910}
911
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700912XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateInstance(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_INSTANCE* pInstance)
913{
914 XGL_RESULT result = nextTable.CreateInstance(pAppInfo, pAllocCb, pInstance);
915 return result;
916}
917
918XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyInstance(XGL_INSTANCE instance)
919{
920 XGL_RESULT result = nextTable.DestroyInstance(instance);
921 return result;
922}
923
924XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateGpus(XGL_INSTANCE instance, uint32_t maxGpus, uint32_t* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
925{
926 XGL_RESULT result = nextTable.EnumerateGpus(instance, maxGpus, pGpuCount, pGpus);
927 return result;
928}
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700929
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600930XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetGpuInfo(XGL_PHYSICAL_GPU gpu, XGL_PHYSICAL_GPU_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700931{
932 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
933 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700934 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700935 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
936 return result;
937}
938
939XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
940{
941 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
942 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700943 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700944 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
945 // Save off device in case we need it to create Fences
946 globalDevice = *pDevice;
947 return result;
948}
949
950XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
951{
Tobin Ehlis62086412014-11-19 16:19:28 -0700952 char str[1024];
953 sprintf(str, "Printing List details prior to xglDestroyDevice()");
954 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, device, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700955 printMemList();
956 printGlobalCB();
957 printObjList();
Tobin Ehlis62086412014-11-19 16:19:28 -0700958 if (XGL_FALSE == deleteGlobalCBList()) {
959 sprintf(str, "Issue deleting global CB list in xglDestroyDevice()");
960 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, device, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
961 }
Tobin Ehlis22d03232014-11-25 18:01:12 -0700962 // Report any memory leaks
963 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
964 while (pTrav) {
965 sprintf(str, "Mem Object %p has not been freed. You should clean up this memory by calling xglFreeMemory(%p) prior to xglDestroyDevice().", pTrav->mem, pTrav->mem);
966 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, pTrav->mem, 0, MEMTRACK_MEMORY_LEAK, "MEM", str);
967 pTrav = pTrav->pNextGlobalNode;
968 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700969 XGL_RESULT result = nextTable.DestroyDevice(device);
970 return result;
971}
972
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600973XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const char* pExtName)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700974{
975 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
976 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700977 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700978 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
979 return result;
980}
981
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600982XGL_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 Ehlis791a49c2014-11-10 12:29:12 -0700983{
Jon Ashburn451c16f2014-11-25 11:08:42 -0700984 if (gpu != NULL)
985 {
986 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
987 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700988 loader_platform_thread_once(&g_initOnce, initMemTracker);
Mark Lobodzinski953a1692015-01-09 15:12:03 -0600989 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -0700990 return result;
991 } else
992 {
993 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
994 return XGL_ERROR_INVALID_POINTER;
995 // This layer compatible with all GPUs
996 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +0800997 strncpy((char *) pOutLayers[0], "MemTracker", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -0700998 return XGL_SUCCESS;
999 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001000}
1001
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001002XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetDeviceQueue(XGL_DEVICE device, XGL_QUEUE_TYPE queueType, uint32_t queueIndex, XGL_QUEUE* pQueue)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001003{
1004 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
1005 return result;
1006}
1007
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001008XGL_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 Ehlis791a49c2014-11-10 12:29:12 -07001009{
1010 // TODO : Need to track fence and clear mem references when fence clears
1011 XGL_FENCE localFence = fence;
1012 if (XGL_NULL_HANDLE == fence) { // allocate our own fence to track cmd buffer
1013 localFence = createLocalFence();
1014 }
Tobin Ehlis62086412014-11-19 16:19:28 -07001015 char str[1024];
1016 sprintf(str, "In xglQueueSubmit(), checking %u cmdBuffers with %u memRefs", cmdBufferCount, memRefCount);
1017 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, queue, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001018 printMemList();
1019 printGlobalCB();
1020 for (uint32_t i = 0; i < cmdBufferCount; i++) {
1021 setCBFence(pCmdBuffers[i], localFence);
Tobin Ehlis62086412014-11-19 16:19:28 -07001022 sprintf(str, "Verifying mem refs for CB %p", pCmdBuffers[i]);
1023 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001024 if (XGL_FALSE == validateCBMemRef(pCmdBuffers[i], memRefCount, pMemRefs)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001025 sprintf(str, "Unable to verify memory references for CB %p", (void*)pCmdBuffers[i]);
1026 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_CB_MISSING_MEM_REF, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001027 }
1028 }
1029 printGlobalCB();
1030 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, localFence);
1031 return result;
1032}
1033
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001034XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001035{
1036 // TODO : Use global mem references as part of list checked on QueueSubmit above
1037 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
1038 return result;
1039}
1040
1041XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1042{
1043 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1044 return result;
1045}
1046
1047XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1048{
1049 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1050 return result;
1051}
1052
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001053XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
1054{
1055 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
1056 // TODO : Track allocations and overall size here
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001057 insertGlobalMemObj(*pMem, pAllocInfo, XGL_MEMORY_STATE_DATA_TRANSFER);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001058 printMemList();
1059 return result;
1060}
1061
1062XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
1063{
Tobin Ehlisa747e682014-11-25 14:47:20 -07001064 /* From spec : A memory object is freed by calling xglFreeMemory() when it is no longer needed. Before
1065 * freeing a memory object, an application must ensure the memory object is unbound from
1066 * all API objects referencing it and that it is not referenced by any queued command buffers
1067 */
Tobin Ehlis62086412014-11-19 16:19:28 -07001068 if (XGL_FALSE == freeMemNode(mem)) {
1069 char str[1024];
1070 sprintf(str, "Issue while freeing mem obj %p", (void*)mem);
1071 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREE_MEM_ERROR, "MEM", str);
1072 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001073 printMemList();
1074 printObjList();
1075 printGlobalCB();
1076 XGL_RESULT result = nextTable.FreeMemory(mem);
1077 return result;
1078}
1079
1080XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
1081{
1082 // TODO : Update tracking for this alloc
1083 // Make sure memory is not pinned, which can't have priority set
1084 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
1085 return result;
1086}
1087
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001088XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, void** ppData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001089{
1090 // TODO : Track when memory is mapped
1091 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
1092 return result;
1093}
1094
1095XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
1096{
1097 // TODO : Track as memory gets unmapped, do we want to check what changed following map?
1098 // Make sure that memory was ever mapped to begin with
1099 XGL_RESULT result = nextTable.UnmapMemory(mem);
1100 return result;
1101}
1102
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001103XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglPinSystemMemory(XGL_DEVICE device, const void* pSysMem, size_t memSize, XGL_GPU_MEMORY* pMem)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001104{
1105 // TODO : Track this
1106 // Verify that memory is actually pinnable
1107 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
1108 return result;
1109}
1110
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001111XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
1112{
1113 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
1114 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001115 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001116 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
1117 return result;
1118}
1119
1120XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1121{
1122 // TODO : Track this
1123 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
1124 return result;
1125}
1126
1127XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1128{
1129 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
1130 return result;
1131}
1132
1133XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1134{
1135 // TODO : Track this
1136 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1137 return result;
1138}
1139
1140XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1141{
1142 // TODO : Track this
1143 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1144 return result;
1145}
1146
1147XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1148{
Tobin Ehlise6884ef2014-11-27 07:52:04 -07001149 // First check if this is a CmdBuffer
1150 if (NULL != getGlobalCBNode((XGL_CMD_BUFFER)object)) {
1151 deleteGlobalCBNode((XGL_CMD_BUFFER)object);
1152 }
1153 // Now locate node in global list along with prev node
Tobin Ehlis580c1b32014-11-25 12:27:38 -07001154 GLOBAL_OBJECT_NODE* pTrav = pGlobalObjectHead;
1155 GLOBAL_OBJECT_NODE* pPrev = pTrav;
Tobin Ehlis580c1b32014-11-25 12:27:38 -07001156 while (pTrav) {
1157 if (object == pTrav->object)
1158 break;
1159 pPrev = pTrav;
1160 pTrav = pTrav->pNext;
1161 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001162 if (pTrav) {
1163 if (pTrav->pMemNode) {
Tobin Ehlise6884ef2014-11-27 07:52:04 -07001164 // Wsi allocated Memory is tied to image object so clear the binding and free that memory automatically
1165 if (0 == pTrav->pMemNode->allocInfo.allocationSize) { // Wsi allocated memory has NULL allocInfo w/ 0 size
1166 XGL_GPU_MEMORY memToFree = pTrav->pMemNode->mem;
1167 clearObjectBinding(object);
1168 freeMemNode(memToFree);
1169 }
1170 else {
1171 char str[1024];
1172 sprintf(str, "Destroying obj %p that is still bound to memory object %p\nYou should first clear binding by calling xglBindObjectMemory(%p, 0, XGL_NULL_HANDLE)", object, (void*)pTrav->pMemNode->mem, object);
1173 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_DESTROY_OBJECT_ERROR, "MEM", str);
1174 // From the spec : If an object has previous memory binding, it is required to unbind memory from an API object before it is destroyed.
1175 clearObjectBinding(object);
1176 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001177 }
1178 if (pGlobalObjectHead == pTrav) // update HEAD if needed
1179 pGlobalObjectHead = pTrav->pNext;
Tobin Ehlis580c1b32014-11-25 12:27:38 -07001180 // Delete the obj node from global list
1181 pPrev->pNext = pTrav->pNext;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001182 free(pTrav);
1183 }
1184 XGL_RESULT result = nextTable.DestroyObject(object);
1185 return result;
1186}
1187
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001188XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetObjectInfo(XGL_BASE_OBJECT object, XGL_OBJECT_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001189{
1190 // TODO : What to track here?
1191 // Could potentially save returned mem requirements and validate values passed into BindObjectMemory for this object
Tobin Ehlis62086412014-11-19 16:19:28 -07001192 // From spec : The only objects that are guaranteed to have no external memory requirements are devices, queues, command buffers, shaders and memory objects.
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001193 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1194 return result;
1195}
1196
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001197XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindObjectMemory(XGL_OBJECT object, uint32_t allocationIdx, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001198{
Jon Ashburned62b412015-01-15 10:39:19 -07001199 XGL_RESULT result = nextTable.BindObjectMemory(object, allocationIdx, mem, offset);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001200 // Track objects tied to memory
Tobin Ehlis62086412014-11-19 16:19:28 -07001201 if (XGL_FALSE == updateObjectBinding(object, mem)) {
1202 char str[1024];
1203 sprintf(str, "Unable to set object %p binding to mem obj %p", (void*)object, (void*)mem);
1204 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1205 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001206 printObjList();
1207 printMemList();
1208 return result;
1209}
1210
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001211XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindObjectMemoryRange(XGL_OBJECT object, uint32_t allocationIdx, XGL_GPU_SIZE rangeOffset, XGL_GPU_SIZE rangeSize, XGL_GPU_MEMORY mem, XGL_GPU_SIZE memOffset)
1212{
1213 XGL_RESULT result = nextTable.BindObjectMemoryRange(object, allocationIdx, rangeOffset, rangeSize, mem, memOffset);
1214 return result;
1215}
1216
1217XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindImageMemoryRange(XGL_IMAGE image, uint32_t allocationIdx, const XGL_IMAGE_MEMORY_BIND_INFO* bindInfo, XGL_GPU_MEMORY mem, XGL_GPU_SIZE memOffset)
1218{
1219 XGL_RESULT result = nextTable.BindImageMemoryRange(image, allocationIdx, bindInfo, mem, memOffset);
1220 return result;
1221}
1222
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001223XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1224{
1225 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1226 return result;
1227}
1228
1229XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1230{
1231 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1232 return result;
1233}
1234
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001235XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitForFences(XGL_DEVICE device, uint32_t fenceCount, const XGL_FENCE* pFences, bool32_t waitAll, uint64_t timeout)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001236{
1237 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1238 return result;
1239}
1240
1241XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1242{
1243 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1244 return result;
1245}
1246
1247XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1248{
1249 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1250 return result;
1251}
1252
1253XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1254{
1255 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1256 return result;
1257}
1258
1259XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1260{
1261 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
1262 return result;
1263}
1264
1265XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1266{
1267 XGL_RESULT result = nextTable.GetEventStatus(event);
1268 return result;
1269}
1270
1271XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1272{
1273 XGL_RESULT result = nextTable.SetEvent(event);
1274 return result;
1275}
1276
1277XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1278{
1279 XGL_RESULT result = nextTable.ResetEvent(event);
1280 return result;
1281}
1282
1283XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1284{
1285 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
1286 return result;
1287}
1288
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001289XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetQueryPoolResults(XGL_QUERY_POOL queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001290{
1291 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1292 return result;
1293}
1294
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001295XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFormatInfo(XGL_DEVICE device, XGL_FORMAT format, XGL_FORMAT_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001296{
1297 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1298 return result;
1299}
1300
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001301XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
1302{
1303 XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
1304 return result;
1305}
1306
1307XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
1308{
1309 XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
1310 return result;
1311}
1312
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001313XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1314{
1315 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001316 if (XGL_SUCCESS == result) {
1317 insertGlobalObjectNode(*pImage, pCreateInfo->sType, pCreateInfo, sizeof(XGL_IMAGE_CREATE_INFO), "image");
1318 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001319 return result;
1320}
1321
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001322XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearColor(XGL_IMAGE image, const float color[4])
1323{
1324 XGL_RESULT result = nextTable.SetFastClearColor(image, color);
1325 return result;
1326}
1327
1328XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearDepth(XGL_IMAGE image, float depth)
1329{
1330 XGL_RESULT result = nextTable.SetFastClearDepth(image, depth);
1331 return result;
1332}
1333
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001334XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetImageSubresourceInfo(XGL_IMAGE image, const XGL_IMAGE_SUBRESOURCE* pSubresource, XGL_SUBRESOURCE_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001335{
1336 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1337 return result;
1338}
1339
1340XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1341{
1342 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001343 if (result == XGL_SUCCESS) {
1344 insertGlobalObjectNode(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO), "image_view");
1345 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001346 return result;
1347}
1348
1349XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1350{
1351 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001352 if (result == XGL_SUCCESS) {
1353 insertGlobalObjectNode(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO), "color_attachment_view");
1354 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001355 return result;
1356}
1357
1358XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1359{
1360 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001361 if (result == XGL_SUCCESS) {
1362 insertGlobalObjectNode(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DEPTH_STENCIL_VIEW_CREATE_INFO), "ds_view");
1363 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001364 return result;
1365}
1366
1367XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1368{
1369 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1370 return result;
1371}
1372
1373XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1374{
1375 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001376 if (result == XGL_SUCCESS) {
1377 insertGlobalObjectNode(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO), "graphics_pipeline");
1378 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001379 return result;
1380}
1381
1382XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1383{
1384 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001385 if (result == XGL_SUCCESS) {
1386 insertGlobalObjectNode(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO), "compute_pipeline");
1387 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001388 return result;
1389}
1390
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001391XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001392{
1393 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
1394 return result;
1395}
1396
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001397XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglLoadPipeline(XGL_DEVICE device, size_t dataSize, const void* pData, XGL_PIPELINE* pPipeline)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001398{
1399 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
1400 return result;
1401}
1402
1403XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
1404{
1405 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
1406 return result;
1407}
1408
1409XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
1410{
1411 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001412 if (result == XGL_SUCCESS) {
1413 insertGlobalObjectNode(*pSampler, pCreateInfo->sType, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO), "sampler");
1414 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001415 return result;
1416}
1417
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001418XGL_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)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001419{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001420 XGL_RESULT result = nextTable.CreateDescriptorSetLayout(device, stageFlags, pSetBindPoints, priorSetLayout, pSetLayoutInfoList, pSetLayout);
1421 // TODO : Need to do anything with the rest of the pSetLayoutInfoList elements?
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001422 if (result == XGL_SUCCESS) {
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001423 insertGlobalObjectNode(*pSetLayout, pSetLayoutInfoList[0]->sType, pSetLayoutInfoList[0], sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO), "descriptor_set_layout");
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001424 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001425 return result;
1426}
1427
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001428XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001429{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001430 XGL_RESULT result = nextTable.BeginDescriptorRegionUpdate(device, updateMode);
1431 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001432}
1433
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001434XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(XGL_DEVICE device, XGL_CMD_BUFFER cmd)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001435{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001436 XGL_RESULT result = nextTable.EndDescriptorRegionUpdate(device, cmd);
1437 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001438}
1439
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001440XGL_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)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001441{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001442 XGL_RESULT result = nextTable.CreateDescriptorRegion(device, regionUsage, maxSets, pCreateInfo, pDescriptorRegion);
1443 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001444}
1445
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001446XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglClearDescriptorRegion(XGL_DESCRIPTOR_REGION descriptorRegion)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001447{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001448 XGL_RESULT result = nextTable.ClearDescriptorRegion(descriptorRegion);
1449 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001450}
1451
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001452XGL_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)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001453{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001454 XGL_RESULT result = nextTable.AllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
1455 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001456}
1457
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001458XGL_LAYER_EXPORT void XGLAPI xglClearDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, uint32_t count, const XGL_DESCRIPTOR_SET* pDescriptorSets)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001459{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001460 nextTable.ClearDescriptorSets(descriptorRegion, count, pDescriptorSets);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001461}
1462
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001463XGL_LAYER_EXPORT void XGLAPI xglUpdateDescriptors(XGL_DESCRIPTOR_SET descriptorSet, const void* pUpdateChain)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001464{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001465 nextTable.UpdateDescriptors(descriptorSet, pUpdateChain);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001466}
1467
1468XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateViewportState(XGL_DEVICE device, const XGL_VIEWPORT_STATE_CREATE_INFO* pCreateInfo, XGL_VIEWPORT_STATE_OBJECT* pState)
1469{
1470 XGL_RESULT result = nextTable.CreateViewportState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001471 if (result == XGL_SUCCESS) {
1472 // viewport doesn't have an sType
1473 insertGlobalObjectNode(*pState, _XGL_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, sizeof(XGL_VIEWPORT_STATE_CREATE_INFO), "viewport_state");
1474 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001475 return result;
1476}
1477
1478XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRasterState(XGL_DEVICE device, const XGL_RASTER_STATE_CREATE_INFO* pCreateInfo, XGL_RASTER_STATE_OBJECT* pState)
1479{
1480 XGL_RESULT result = nextTable.CreateRasterState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001481 if (result == XGL_SUCCESS) {
1482 insertGlobalObjectNode(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_RASTER_STATE_CREATE_INFO), "raster_state");
1483 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001484 return result;
1485}
1486
1487XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateMsaaState(XGL_DEVICE device, const XGL_MSAA_STATE_CREATE_INFO* pCreateInfo, XGL_MSAA_STATE_OBJECT* pState)
1488{
1489 XGL_RESULT result = nextTable.CreateMsaaState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001490 if (result == XGL_SUCCESS) {
1491 insertGlobalObjectNode(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_MSAA_STATE_CREATE_INFO), "msaa_state");
1492 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001493 return result;
1494}
1495
1496XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorBlendState(XGL_DEVICE device, const XGL_COLOR_BLEND_STATE_CREATE_INFO* pCreateInfo, XGL_COLOR_BLEND_STATE_OBJECT* pState)
1497{
1498 XGL_RESULT result = nextTable.CreateColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001499 if (result == XGL_SUCCESS) {
1500 insertGlobalObjectNode(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_COLOR_BLEND_STATE_CREATE_INFO), "cb_state");
1501 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001502 return result;
1503}
1504
1505XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilState(XGL_DEVICE device, const XGL_DEPTH_STENCIL_STATE_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_STATE_OBJECT* pState)
1506{
1507 XGL_RESULT result = nextTable.CreateDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001508 if (result == XGL_SUCCESS) {
1509 insertGlobalObjectNode(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DEPTH_STENCIL_STATE_CREATE_INFO), "ds_state");
1510 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001511 return result;
1512}
1513
1514XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
1515{
1516 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
1517 // At time of cmd buffer creation, create global cmd buffer node for the returned cmd buffer
1518 if (*pCmdBuffer)
1519 insertGlobalCB(*pCmdBuffer);
1520 printGlobalCB();
1521 return result;
1522}
1523
Jon Ashburn57ba18d2014-12-31 17:11:49 -07001524XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001525{
1526 // This implicitly resets the Cmd Buffer so clear memory references
Jon Ashburn57ba18d2014-12-31 17:11:49 -07001527 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001528 freeCBBindings(cmdBuffer);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001529 return result;
1530}
1531
1532XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1533{
1534 // TODO : Anything to do here?
1535 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
1536 return result;
1537}
1538
1539XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1540{
1541 // Clear memory references as this point. Anything else to do here?
1542 freeCBBindings(cmdBuffer);
1543 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
1544 return result;
1545}
1546// TODO : For any xglCmdBind* calls that include an object which has mem bound to it,
1547// need to account for that mem now having binding to given cmdBuffer
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001548XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001549{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001550#if 0
1551 // TODO : If memory bound to pipeline, then need to tie that mem to cmdBuffer
1552 if (getPipeline(pipeline)) {
1553 GLOBAL_CB_NODE *pCBTrav = getGlobalCBNode(cmdBuffer);
1554 if (pCBTrav) {
1555 pCBTrav->pipelines[pipelineBindPoint] = pipeline;
1556 } else {
1557 char str[1024];
1558 sprintf(str, "Attempt to bind Pipeline %p to non-existant command buffer %p!", (void*)pipeline, cmdBuffer);
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001559 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, (char *) "DS", (char *) str);
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001560 }
1561 }
1562 else {
1563 char str[1024];
1564 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001565 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, MEMTRACK_INVALID_OBJECT, (char *) "DS", (char *) str);
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001566 }
1567#endif
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001568 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1569}
1570
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001571XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipelineDelta(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE_DELTA delta)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001572{
1573 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
1574}
1575
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001576XGL_LAYER_EXPORT void XGLAPI xglCmdBindDynamicStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001577{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001578 GLOBAL_OBJECT_NODE *pNode;
1579 GLOBAL_CB_NODE *pCmdBuf = getGlobalCBNode(cmdBuffer);
1580 if (!pCmdBuf) {
1581 char str[1024];
1582 sprintf(str, "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
1583 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, "DD", str);
1584 }
1585 pNode = getGlobalObjectNode(state);
1586 if (!pNode) {
1587 char str[1024];
1588 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
1589 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, state, 0, MEMTRACK_INVALID_OBJECT, "DD", str);
1590 }
1591 pCmdBuf->pDynamicState[stateBindPoint] = pNode;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001592 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001593}
1594
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001595XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_DESCRIPTOR_SET descriptorSet, const uint32_t* pUserData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001596{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001597 // TODO : Somewhere need to verify that all textures referenced by shaders in DS are in some type of *SHADER_READ* state
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001598 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001599}
1600
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001601XGL_LAYER_EXPORT void XGLAPI xglCmdBindVertexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t binding)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001602{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001603 if (XGL_FALSE == updateCBBinding(cmdBuffer, buffer)) {
Chia-I Wufb5062e2015-01-05 13:42:56 +08001604 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001605 sprintf(str, "In xglCmdBindVertexData() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Chia-I Wufb5062e2015-01-05 13:42:56 +08001606 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1607 }
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001608 // Now update CB's vertex binding list
1609 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cmdBuffer);
1610 if (!pCBTrav) {
1611 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001612 sprintf(str, "Trying to BindVertexData buffer obj %p to CB %p but no Node for that CB. Was CB incorrectly destroyed?", buffer, cmdBuffer);
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001613 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, "MEM", str);
1614 } else {
1615 MEMORY_BINDING *pBindInfo;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001616 uint32_t dontCare;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001617 XGL_RESULT result;
1618 pBindInfo = malloc(sizeof(MEMORY_BINDING));
1619 pBindInfo->offset = offset;
1620 pBindInfo->binding = binding;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001621 pBindInfo->buffer = buffer;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001622 result = insertMiniNode(&pCBTrav->pVertexBufList, pBindInfo, &dontCare);
1623 if (result) {
1624 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001625 sprintf(str, "In xglCmdBindVertexData and ran out of memory to track binding. CmdBuffer: %p, buffer %p", cmdBuffer, buffer);
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001626 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
1627 }
1628 }
1629 lastVtxBinding = binding;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001630 nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
Chia-I Wufb5062e2015-01-05 13:42:56 +08001631}
1632
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001633XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001634{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001635 // Track this buffer. What exactly is this call doing?
1636 // TODO : verify state of buffer is XGL_MEMORY_STATE_INDEX_DATA
1637 if (XGL_FALSE == updateCBBinding(cmdBuffer, buffer)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001638 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001639 sprintf(str, "In xglCmdBindIndexData() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001640 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1641 }
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001642 // Now update CB's index binding list
1643 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cmdBuffer);
1644 if (!pCBTrav) {
1645 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001646 sprintf(str, "Trying to BindIndexData buffer obj %p to CB %p but no Node for that CB. Was CB incorrectly destroyed?", buffer, cmdBuffer);
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001647 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_MEM_OBJ, (char *) "MEM", (char *) str);
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001648 } else {
1649 MEMORY_BINDING *pBindInfo;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001650 uint32_t dontCare;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001651 XGL_RESULT result;
1652 pBindInfo = malloc(sizeof(MEMORY_BINDING));
1653 pBindInfo->indexType = indexType;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001654 pBindInfo->buffer = buffer;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001655 pBindInfo->offset = offset;
1656 pBindInfo->binding = 0;
1657 result = insertMiniNode(&pCBTrav->pIndexBufList, pBindInfo, &dontCare);
1658 if (result) {
1659 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001660 sprintf(str, "In xglCmdBindIndexData and ran out of memory to track binding. CmdBuffer: %p, buffer %p", cmdBuffer, buffer);
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001661 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
1662 }
1663 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001664
1665 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001666}
1667
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001668
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001669
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001670XGL_LAYER_EXPORT void XGLAPI xglCmdDraw(XGL_CMD_BUFFER cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001671{
1672 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
1673}
1674
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001675XGL_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 Ehlis791a49c2014-11-10 12:29:12 -07001676{
1677 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
1678}
1679
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001680XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t count, uint32_t stride)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001681{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001682 if (XGL_FALSE == updateCBBinding(cmdBuffer, buffer)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001683 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001684 sprintf(str, "In xglCmdDrawIndirect() call unable to update binding of mem %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001685 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1686 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001687 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001688}
1689
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001690XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndexedIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t count, uint32_t stride)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001691{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001692 if (XGL_FALSE == updateCBBinding(cmdBuffer, buffer)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001693 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001694 sprintf(str, "In xglCmdDrawIndexedIndirect() call unable to update binding of mem %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001695 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1696 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001697 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001698}
1699
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001700XGL_LAYER_EXPORT void XGLAPI xglCmdDispatch(XGL_CMD_BUFFER cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001701{
1702 nextTable.CmdDispatch(cmdBuffer, x, y, z);
1703}
1704
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001705XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001706{
Tobin Ehlis62086412014-11-19 16:19:28 -07001707 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1708 char str[1024];
1709 sprintf(str, "In xglCmdDispatchIndirect() call unable to update binding of mem %p to cmdBuffer %p", mem, cmdBuffer);
1710 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1711 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001712 nextTable.CmdDispatchIndirect(cmdBuffer, mem, offset);
1713}
1714
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001715XGL_LAYER_EXPORT void XGLAPI xglCmdCopyMemory(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY srcMem, XGL_GPU_MEMORY destMem, uint32_t regionCount, const XGL_MEMORY_COPY* pRegions)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001716{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001717 if (XGL_FALSE == updateCBBinding(cmdBuffer, srcBuffer)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001718 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001719 sprintf(str, "In xglCmdCopyMemory() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001720 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1721 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001722 if (XGL_FALSE == updateCBBinding(cmdBuffer, destBuffer)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001723 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001724 sprintf(str, "In xglCmdCopyMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001725 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1726 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001727 nextTable.CmdCopyMemory(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001728}
1729
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001730XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, uint32_t regionCount, const XGL_IMAGE_COPY* pRegions)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001731{
1732 // TODO : Each image will have mem mapping so track them
1733 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
1734}
1735
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001736XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBufferToImage(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER srcBuffer, XGL_IMAGE destImage, uint32_t regionCount, const XGL_BUFFER_IMAGE_COPY* pRegions)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001737{
1738 // TODO : Track this
1739 XGL_GPU_MEMORY mem = getMemBindingFromObject(destImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001740 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1741 char str[1024];
1742 sprintf(str, "In xglCmdCopyMemoryToImage() call unable to update binding of destImage mem %p to cmdBuffer %p", mem, cmdBuffer);
1743 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1744 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001745 if (XGL_FALSE == updateCBBinding(cmdBuffer, srcBuffer)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001746 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001747 sprintf(str, "In xglCmdCopyMemoryToImage() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001748 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1749 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001750 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, regionCount, pRegions);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001751}
1752
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001753XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImageToBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_BUFFER destBuffer, uint32_t regionCount, const XGL_BUFFER_IMAGE_COPY* pRegions)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001754{
1755 // TODO : Track this
1756 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001757 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1758 char str[1024];
1759 sprintf(str, "In xglCmdCopyImageToMemory() call unable to update binding of srcImage mem %p to cmdBuffer %p", mem, cmdBuffer);
1760 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1761 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001762 if (XGL_FALSE == updateCBBinding(cmdBuffer, destBuffer)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001763 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001764 sprintf(str, "In xglCmdCopyImageToMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001765 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1766 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001767 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, destBuffer, regionCount, pRegions);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001768}
1769
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001770XGL_LAYER_EXPORT void XGLAPI xglCmdCloneImageData(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE_LAYOUT srcImageLayout, XGL_IMAGE destImage, XGL_IMAGE_LAYOUT destImageLayout)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001771{
1772 // TODO : Each image will have mem mapping so track them
1773 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001774 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1775 char str[1024];
1776 sprintf(str, "In xglCmdCloneImageData() call unable to update binding of srcImage mem %p to cmdBuffer %p", mem, cmdBuffer);
1777 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1778 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001779 mem = getMemBindingFromObject(destImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001780 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1781 char str[1024];
1782 sprintf(str, "In xglCmdCloneImageData() call unable to update binding of destImage mem %p to cmdBuffer %p", mem, cmdBuffer);
1783 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1784 }
Mike Stroyan55658c22014-12-04 11:08:39 +00001785 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001786}
1787
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001788XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const uint32_t* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001789{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001790 if (XGL_FALSE == updateCBBinding(cmdBuffer, destBuffer)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001791 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001792 sprintf(str, "In xglCmdUpdateMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001793 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1794 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001795 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001796}
1797
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001798XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, uint32_t data)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001799{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001800 if (XGL_FALSE == updateCBBinding(cmdBuffer, destBuffer)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001801 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001802 sprintf(str, "In xglCmdFillMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001803 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1804 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001805 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001806}
1807
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001808XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const float color[4], uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001809{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001810 // TODO : Verify memory is in XGL_IMAGE_STATE_CLEAR state
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001811 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehlis62086412014-11-19 16:19:28 -07001812 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1813 char str[1024];
1814 sprintf(str, "In xglCmdClearColorImage() call unable to update binding of image mem %p to cmdBuffer %p", mem, cmdBuffer);
1815 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1816 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001817 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
1818}
1819
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001820XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImageRaw(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const uint32_t color[4], uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001821{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001822 // TODO : Verify memory is in XGL_IMAGE_STATE_CLEAR state
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001823 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehlis62086412014-11-19 16:19:28 -07001824 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1825 char str[1024];
1826 sprintf(str, "In xglCmdClearColorImageRaw() call unable to update binding of image mem %p to cmdBuffer %p", mem, cmdBuffer);
1827 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1828 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001829 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
1830}
1831
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001832XGL_LAYER_EXPORT void XGLAPI xglCmdClearDepthStencil(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, float depth, uint32_t stencil, uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001833{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001834 // TODO : Verify memory is in XGL_IMAGE_STATE_CLEAR state
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001835 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehlis62086412014-11-19 16:19:28 -07001836 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1837 char str[1024];
1838 sprintf(str, "In xglCmdClearDepthStencil() call unable to update binding of image mem %p to cmdBuffer %p", mem, cmdBuffer);
1839 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1840 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001841 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
1842}
1843
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001844XGL_LAYER_EXPORT void XGLAPI xglCmdResolveImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, uint32_t rectCount, const XGL_IMAGE_RESOLVE* pRects)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001845{
1846 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001847 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1848 char str[1024];
1849 sprintf(str, "In xglCmdResolveImage() call unable to update binding of srcImage mem %p to cmdBuffer %p", mem, cmdBuffer);
1850 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1851 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001852 mem = getMemBindingFromObject(destImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001853 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1854 char str[1024];
1855 sprintf(str, "In xglCmdResolveImage() call unable to update binding of destImage mem %p to cmdBuffer %p", mem, cmdBuffer);
1856 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1857 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001858 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
1859}
1860
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001861XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_SET_EVENT pipeEvent)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001862{
Mike Stroyan55658c22014-12-04 11:08:39 +00001863 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001864}
1865
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001866XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001867{
1868 nextTable.CmdResetEvent(cmdBuffer, event);
1869}
1870
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001871XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo)
Mike Stroyan55658c22014-12-04 11:08:39 +00001872{
1873 nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo);
1874}
1875
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001876XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier)
Mike Stroyan55658c22014-12-04 11:08:39 +00001877{
1878 nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier);
1879}
1880
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001881XGL_LAYER_EXPORT void XGLAPI xglCmdBeginQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot, XGL_FLAGS flags)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001882{
1883 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehlis62086412014-11-19 16:19:28 -07001884 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1885 char str[1024];
1886 sprintf(str, "In xglCmdBeginQuery() call unable to update binding of queryPool mem %p to cmdBuffer %p", mem, cmdBuffer);
1887 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1888 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001889 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
1890}
1891
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001892XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001893{
1894 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehlis62086412014-11-19 16:19:28 -07001895 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1896 char str[1024];
1897 sprintf(str, "In xglCmdEndQuery() call unable to update binding of queryPool mem %p to cmdBuffer %p", mem, cmdBuffer);
1898 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1899 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001900 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
1901}
1902
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001903XGL_LAYER_EXPORT void XGLAPI xglCmdResetQueryPool(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t startQuery, uint32_t queryCount)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001904{
1905 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehlis62086412014-11-19 16:19:28 -07001906 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1907 char str[1024];
1908 sprintf(str, "In xglCmdResetQueryPool() call unable to update binding of queryPool mem %p to cmdBuffer %p", mem, cmdBuffer);
1909 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1910 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001911 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
1912}
1913
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001914XGL_LAYER_EXPORT void XGLAPI xglCmdWriteTimestamp(XGL_CMD_BUFFER cmdBuffer, XGL_TIMESTAMP_TYPE timestampType, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001915{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001916 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001917}
1918
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001919XGL_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 Ehlis791a49c2014-11-10 12:29:12 -07001920{
1921 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
1922}
1923
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001924XGL_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 Ehlis791a49c2014-11-10 12:29:12 -07001925{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001926 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001927}
1928
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001929XGL_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 Ehlis791a49c2014-11-10 12:29:12 -07001930{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001931 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
1932}
1933
1934XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFramebuffer(XGL_DEVICE device, const XGL_FRAMEBUFFER_CREATE_INFO* pCreateInfo, XGL_FRAMEBUFFER* pFramebuffer)
1935{
1936 XGL_RESULT result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
1937 return result;
1938}
1939
1940XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRenderPass(XGL_DEVICE device, const XGL_RENDER_PASS_CREATE_INFO* pCreateInfo, XGL_RENDER_PASS* pRenderPass)
1941{
1942 XGL_RESULT result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
1943 return result;
1944}
1945
1946XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
1947{
1948 nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
1949}
1950
1951XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
1952{
1953 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001954}
1955
1956XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
1957{
1958 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
1959 return result;
1960}
1961
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001962XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001963{
Tobin Ehlis62086412014-11-19 16:19:28 -07001964 // This layer intercepts callbacks
1965 XGL_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
1966 if (!pNewDbgFuncNode)
1967 return XGL_ERROR_OUT_OF_MEMORY;
1968 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
1969 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburnf57ea372014-12-22 13:24:15 -07001970 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
1971 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001972 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
1973 return result;
1974}
1975
1976XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
1977{
Jon Ashburnf57ea372014-12-22 13:24:15 -07001978 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlis62086412014-11-19 16:19:28 -07001979 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
1980 while (pTrav) {
1981 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
1982 pPrev->pNext = pTrav->pNext;
Jon Ashburnf57ea372014-12-22 13:24:15 -07001983 if (g_pDbgFunctionHead == pTrav)
1984 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlis62086412014-11-19 16:19:28 -07001985 free(pTrav);
1986 break;
1987 }
1988 pPrev = pTrav;
1989 pTrav = pTrav->pNext;
1990 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001991 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
1992 return result;
1993}
1994
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001995XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, int32_t msgCode, XGL_DBG_MSG_FILTER filter)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001996{
1997 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
1998 return result;
1999}
2000
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002001XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, size_t tagSize, const void* pTag)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002002{
2003 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
2004 return result;
2005}
2006
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002007XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002008{
2009 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
2010 return result;
2011}
2012
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002013XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetDeviceOption(XGL_DEVICE device, XGL_DBG_DEVICE_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002014{
2015 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
2016 return result;
2017}
2018
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002019XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002020{
2021 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
2022}
2023
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002024XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002025{
2026 nextTable.CmdDbgMarkerEnd(cmdBuffer);
2027}
2028
Ian Elliott81ac44c2015-01-13 17:52:38 -07002029#if defined(_WIN32)
2030// FIXME: NEED WINDOWS EQUIVALENT
2031#else // WIN32
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002032XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
2033{
2034 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002035 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07002036 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002037 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002038 return result;
2039}
2040
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002041XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11GetMSC(XGL_DEVICE device, xcb_window_t window, xcb_randr_crtc_t crtc, uint64_t* pMsc)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002042{
Tobin Ehlis4a5d7e22014-11-11 08:00:58 -07002043 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002044 return result;
2045}
2046
2047XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11CreatePresentableImage(XGL_DEVICE device, const XGL_WSI_X11_PRESENTABLE_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
2048{
2049 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07002050 if (XGL_SUCCESS == result) {
2051 // Add image object, then insert the new Mem Object and then bind it to created image
2052 insertGlobalObjectNode(*pImage, _XGL_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, sizeof(XGL_WSI_X11_PRESENTABLE_IMAGE_CREATE_INFO), "wsi_x11_image");
2053 insertGlobalMemObj(*pMem, NULL, XGL_IMAGE_STATE_UNINITIALIZED_TARGET);
2054 if (XGL_FALSE == updateObjectBinding(*pImage, *pMem)) {
2055 char str[1024];
2056 sprintf(str, "In xglWsiX11CreatePresentableImage(), unable to set image %p binding to mem obj %p", (void*)*pImage, (void*)*pMem);
2057 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pImage, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
2058 }
Tobin Ehlis62086412014-11-19 16:19:28 -07002059 }
2060 printObjList();
2061 printMemList();
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002062 return result;
2063}
2064
2065XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
2066{
2067 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
2068 return result;
2069}
Ian Elliott81ac44c2015-01-13 17:52:38 -07002070#endif // WIN32
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002071
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06002072XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002073{
2074 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08002075 void *addr;
2076
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002077 if (gpu == NULL)
2078 return NULL;
2079 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07002080 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002081
Chia-I Wu706533e2015-01-05 13:18:57 +08002082 addr = layer_intercept_proc(funcName);
2083 if (addr)
2084 return addr;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002085 else {
Tobin Ehlis791a49c2014-11-10 12:29:12 -07002086 if (gpuw->pGPA == NULL)
2087 return NULL;
2088 return gpuw->pGPA(gpuw->nextObject, funcName);
2089 }
2090}