blob: 8d1b22851fe2364d875a362ba6e63b9553a4845a [file] [log] [blame]
Tobin Ehlis6663f492014-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>
29#include <pthread.h>
Tobin Ehlis6663f492014-11-10 12:29:12 -070030#include "xgl_struct_string_helper.h"
Tobin Ehliscd9223b2014-11-19 16:19:28 -070031#include "mem_tracker.h"
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070032#include "layers_config.h"
Tobin Ehlis6663f492014-11-10 12:29:12 -070033
34static XGL_LAYER_DISPATCH_TABLE nextTable;
35static XGL_BASE_LAYER_OBJECT *pCurObj;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070036static pthread_once_t g_initOnce = PTHREAD_ONCE_INIT;
37
Tobin Ehliscd9223b2014-11-19 16:19:28 -070038// Ptr to LL of dbg functions
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070039static XGL_LAYER_DBG_FUNCTION_NODE *g_pDbgFunctionHead = NULL;
40static XGL_LAYER_DBG_REPORT_LEVEL g_reportingLevel = XGL_DBG_LAYER_LEVEL_ERROR;
41static XGL_LAYER_DBG_ACTION g_debugAction = XGL_DBG_LAYER_ACTION_LOG_MSG;
42static FILE *g_logFile = NULL;
43
Tobin Ehliscd9223b2014-11-19 16:19:28 -070044// Utility function to handle reporting
Tobin Ehliscd9223b2014-11-19 16:19:28 -070045static XGL_VOID layerCbMsg(XGL_DBG_MSG_TYPE msgType,
46 XGL_VALIDATION_LEVEL validationLevel,
47 XGL_BASE_OBJECT srcObject,
48 XGL_SIZE location,
49 XGL_INT msgCode,
Chia-I Wu1da4b9f2014-12-16 10:47:33 +080050 const char* pLayerPrefix,
51 const char* pMsg)
Tobin Ehliscd9223b2014-11-19 16:19:28 -070052{
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070053 if (g_debugAction & (XGL_DBG_LAYER_ACTION_LOG_MSG | XGL_DBG_LAYER_ACTION_CALLBACK)) {
54 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
55 switch (msgType) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -070056 case XGL_DBG_MSG_ERROR:
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070057 if (g_reportingLevel <= XGL_DBG_LAYER_LEVEL_ERROR) {
58 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
59 fprintf(g_logFile, "{%s}ERROR : %s\n", pLayerPrefix, pMsg);
60 if (g_debugAction & XGL_DBG_LAYER_ACTION_CALLBACK)
61 while (pTrav) {
62 pTrav->pfnMsgCallback(msgType, validationLevel, srcObject, location, msgCode, pMsg, pTrav->pUserData);
63 pTrav = pTrav->pNext;
64 }
65 }
Tobin Ehliscd9223b2014-11-19 16:19:28 -070066 break;
67 case XGL_DBG_MSG_WARNING:
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070068 if (g_reportingLevel <= XGL_DBG_LAYER_LEVEL_WARN) {
69 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
70 fprintf(g_logFile, "{%s}WARN : %s\n", pLayerPrefix, pMsg);
71 if (g_debugAction & XGL_DBG_LAYER_ACTION_CALLBACK)
72 while (pTrav) {
73 pTrav->pfnMsgCallback(msgType, validationLevel, srcObject, location, msgCode, pMsg, pTrav->pUserData);
74 pTrav = pTrav->pNext;
75 }
76 }
Tobin Ehliscd9223b2014-11-19 16:19:28 -070077 break;
78 case XGL_DBG_MSG_PERF_WARNING:
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070079 if (g_reportingLevel <= XGL_DBG_LAYER_LEVEL_PERF_WARN) {
80 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
81 fprintf(g_logFile, "{%s}PERF_WARN : %s\n", pLayerPrefix, pMsg);
82 if (g_debugAction & XGL_DBG_LAYER_ACTION_CALLBACK)
83 while (pTrav) {
84 pTrav->pfnMsgCallback(msgType, validationLevel, srcObject, location, msgCode, pMsg, pTrav->pUserData);
85 pTrav = pTrav->pNext;
86 }
87 }
Tobin Ehliscd9223b2014-11-19 16:19:28 -070088 break;
89 default:
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -070090 if (g_reportingLevel <= XGL_DBG_LAYER_LEVEL_INFO) {
91 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
92 fprintf(g_logFile, "{%s}INFO : %s\n", pLayerPrefix, pMsg);
93 if (g_debugAction & XGL_DBG_LAYER_ACTION_CALLBACK)
94 while (pTrav) {
95 pTrav->pfnMsgCallback(msgType, validationLevel, srcObject, location, msgCode, pMsg, pTrav->pUserData);
96 pTrav = pTrav->pNext;
97 }
98 }
Tobin Ehliscd9223b2014-11-19 16:19:28 -070099 break;
100 }
101 }
102}
Tobin Ehlis6663f492014-11-10 12:29:12 -0700103/*
104 * Data Structure overview
105 * There are 3 global Linked-Lists (LLs)
106 * pGlobalCBHead points to head of Command Buffer (CB) LL
107 * Off of each node in this LL there is a separate LL of
108 * memory objects that are referenced by this CB
109 * pGlobalMemObjHead points to head of Memory Object LL
110 * Off of each node in this LL there are 2 separate LL
111 * One is a list of all CBs referencing this mem obj
112 * Two is a list of all XGL Objects that are bound to this memory
113 * pGlobalObjHead point to head of XGL Objects w/ bound mem LL
114 * Each node of this LL contains a ptr to global Mem Obj node for bound mem
115 *
116 * The "Global" nodes are for the main LLs
117 * The "mini" nodes are for ancillary LLs that are pointed to from global nodes
118 *
119 * Algorithm overview
120 * These are the primary events that should happen related to different objects
121 * 1. Command buffers
122 * CREATION - Add node to global LL
123 * CMD BIND - If mem associated, add mem reference to mini LL
124 * DESTROY - Remove from global LL, decrement (and report) mem references
125 * 2. Mem Objects
126 * CREATION - Add node to global LL
127 * OBJ BIND - Add obj node to mini LL for that mem node
128 * CMB BIND - If mem-related add CB node to mini LL for that mem node
129 * DESTROY - Flag as errors any remaining refs and Remove from global LL
130 * 3. Generic Objects
131 * MEM BIND - DESTROY any previous binding, Add global obj node w/ ref to global mem obj node, Add obj node to mini LL for that mem node
132 * DESTROY - If mem bound, remove reference from mini LL for that mem Node, remove global obj node
133 */
134// TODO : Is there a way to track when Cmd Buffer finishes & remove mem references at that point?
135// TODO : Could potentially store a list of freed mem allocs to flag when they're incorrectly used
136
137// Generic data struct for various "mini" Linked-Lists
138// This just wraps some type of XGL OBJ and a pNext ptr
139// Used for xgl obj, cmd buffer, and mem obj wrapping
140typedef struct _MINI_NODE {
141 struct _MINI_NODE* pNext;
142 union { // different objects that can be wrapped
143 XGL_OBJECT object;
144 XGL_GPU_MEMORY mem;
145 XGL_CMD_BUFFER cmdBuffer;
146 XGL_BASE_OBJECT data; // for generic handling of data
147 };
148} MINI_NODE;
149
150struct GLOBAL_MEM_OBJ_NODE;
151
152// Store a single LL of command buffers
153typedef struct _GLOBAL_CB_NODE {
154 struct _GLOBAL_CB_NODE* pNextGlobalCBNode;
155 MINI_NODE* pMemObjList; // LL of Mem objs referenced by this CB
156 XGL_CMD_BUFFER cmdBuffer;
157 XGL_FENCE fence; // fence tracking this cmd buffer
158} GLOBAL_CB_NODE;
159
160// Data struct for tracking memory object
161typedef struct _GLOBAL_MEM_OBJ_NODE {
162 struct _GLOBAL_MEM_OBJ_NODE* pNextGlobalNode; // Ptr to next mem obj in global list of all objs
163 MINI_NODE* pObjBindings; // Ptr to list of objects bound to this memory
164 MINI_NODE* pCmdBufferBindings; // Ptr to list of cmd buffers that this mem object references
165 XGL_UINT refCount; // Count of references (obj bindings or CB use)
166 XGL_GPU_MEMORY mem;
167 XGL_MEMORY_ALLOC_INFO allocInfo;
168} GLOBAL_MEM_OBJ_NODE;
169
170typedef struct _GLOBAL_OBJECT_NODE {
171 struct _GLOBAL_OBJECT_NODE* pNext;
172 GLOBAL_MEM_OBJ_NODE* pMemNode;
173 XGL_OBJECT object;
174} GLOBAL_OBJECT_NODE;
175
176static GLOBAL_CB_NODE* pGlobalCBHead = NULL;
177static GLOBAL_MEM_OBJ_NODE* pGlobalMemObjHead = NULL;
178static GLOBAL_OBJECT_NODE* pGlobalObjectHead = NULL;
179static XGL_DEVICE globalDevice = NULL;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700180static uint64_t numCBNodes = 0;
181static uint64_t numMemObjNodes = 0;
182static uint64_t numObjectNodes = 0;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700183// Check list for data and if it's not included insert new node
184// into HEAD of list pointed to by pHEAD & update pHEAD
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700185// Increment 'insert' if new node was inserted
Tobin Ehlis6663f492014-11-10 12:29:12 -0700186// return XGL_SUCCESS if no errors occur
187static XGL_RESULT insertMiniNode(MINI_NODE** pHEAD, const XGL_BASE_OBJECT data, XGL_UINT* insert)
188{
189 MINI_NODE* pTrav = *pHEAD;
190 while (pTrav && (pTrav->data != data)) {
191 pTrav = pTrav->pNext;
192 }
193 if (!pTrav) { // Add node to front of LL
194 pTrav = (MINI_NODE*)malloc(sizeof(MINI_NODE));
195 if (!pTrav)
196 return XGL_ERROR_OUT_OF_MEMORY;
197 memset(pTrav, 0, sizeof(MINI_NODE));
198 if (*pHEAD)
199 pTrav->pNext = *pHEAD;
200 *pHEAD = pTrav;
201 *insert += 1;
202 //pMemTrav->refCount++;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700203 //sprintf(str, "MEM INFO : Incremented refCount for mem obj %p to %u", (void*)mem, pMemTrav->refCount);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700204 }
205 if (pTrav->data) { // This is just FYI
206 assert(data == pTrav->data);
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700207 char str[1024];
208 sprintf(str, "Data %p is already in data LL w/ HEAD at %p", data, *pHEAD);
209 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, data, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700210 }
211 pTrav->data = data;
212 return XGL_SUCCESS;
213}
214
215// Add new CB node for this cb at end of global CB LL
216static void insertGlobalCB(const XGL_CMD_BUFFER cb)
217{
218 GLOBAL_CB_NODE* pTrav = pGlobalCBHead;
219 if (!pTrav) {
220 pTrav = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE));
221 pGlobalCBHead = pTrav;
222 }
223 else {
224 while (NULL != pTrav->pNextGlobalCBNode)
225 pTrav = pTrav->pNextGlobalCBNode;
226 pTrav->pNextGlobalCBNode = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE));
227 pTrav = pTrav->pNextGlobalCBNode;
228 }
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700229 if (!pTrav) {
230 char str[1024];
231 sprintf(str, "Malloc failed to alloc node for Cmd Buffer %p", (void*)cb);
232 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
233 }
234 else {
235 numCBNodes++;
236 memset(pTrav, 0, sizeof(GLOBAL_CB_NODE));
237 pTrav->cmdBuffer = cb;
238 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700239}
240
241// Return ptr to node in global LL containing cb, or NULL if not found
242static GLOBAL_CB_NODE* getGlobalCBNode(const XGL_CMD_BUFFER cb)
243{
244 GLOBAL_CB_NODE* pTrav = pGlobalCBHead;
245 while (pTrav && (pTrav->cmdBuffer != cb))
246 pTrav = pTrav->pNextGlobalCBNode;
247 return pTrav;
248}
249// Set fence for given cb in global cb node
250static XGL_BOOL setCBFence(const XGL_CMD_BUFFER cb, const XGL_FENCE fence)
251{
252 GLOBAL_CB_NODE* pTrav = getGlobalCBNode(cb);
253 if (!pTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700254 char str[1024];
255 sprintf(str, "Unable to find node for CB %p in order to set fence to %p", (void*)cb, (void*)fence);
256 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700257 return XGL_FALSE;
258 }
259 pTrav->fence = fence;
260 return XGL_TRUE;
261}
262
263static XGL_BOOL validateCBMemRef(const XGL_CMD_BUFFER cb, XGL_UINT memRefCount, const XGL_MEMORY_REF* pMemRefs)
264{
265 GLOBAL_CB_NODE* pTrav = getGlobalCBNode(cb);
266 if (!pTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700267 char str[1024];
268 sprintf(str, "Unable to find node for CB %p in order to check memory references", (void*)cb);
269 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700270 return XGL_FALSE;
271 }
272 // Validate that all actual references are accounted for in pMemRefs
273 MINI_NODE* pMemNode = pTrav->pMemObjList;
274 uint32_t i;
275 uint8_t found = 0;
276 uint64_t foundCount = 0;
277 while (pMemNode) {
278 // TODO : Improve this algorithm
279 for (i = 0; i < memRefCount; i++) {
280 if (pMemNode->mem == pMemRefs[i].mem) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700281 char str[1024];
282 sprintf(str, "Found Mem Obj %p binding to CB %p", pMemNode->mem, cb);
283 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700284 found = 1;
285 foundCount++;
Tobin Ehlisc0418f92014-11-25 14:47:20 -0700286 break;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700287 }
288 }
289 if (!found) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700290 char str[1024];
291 sprintf(str, "Memory reference list for Command Buffer %p is missing ref to mem obj %p", cb, pMemNode->mem);
292 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_CB_MISSING_MEM_REF, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700293 return XGL_FALSE;
294 }
295 found = 0;
296 pMemNode = pMemNode->pNext;
297 }
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700298 char str[1024];
299 sprintf(str, "Verified all %lu memory dependencies for CB %p are included in pMemRefs list", foundCount, cb);
300 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700301 // TODO : Could report mem refs in pMemRefs that AREN'T in mem LL, that would be primarily informational
302 // Currently just noting that there is a difference
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700303 if (foundCount != memRefCount) {
304 sprintf(str, "Note that %u mem refs included in pMemRefs list, but only %lu appear to be required", memRefCount, foundCount);
305 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
306 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700307 return XGL_TRUE;
308}
309
310static void insertGlobalMemObj(const XGL_GPU_MEMORY mem, const XGL_MEMORY_ALLOC_INFO* pAllocInfo)
311{
312 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
313 if (!pTrav) {
314 pTrav = (GLOBAL_MEM_OBJ_NODE*)malloc(sizeof(GLOBAL_MEM_OBJ_NODE));
315 pGlobalMemObjHead = pTrav;
316 }
317 else {
318 while (NULL != pTrav->pNextGlobalNode)
319 pTrav = pTrav->pNextGlobalNode;
320 pTrav->pNextGlobalNode = (GLOBAL_MEM_OBJ_NODE*)malloc(sizeof(GLOBAL_MEM_OBJ_NODE));
321 pTrav = pTrav->pNextGlobalNode;
322 }
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700323 if (!pTrav) {
324 char str[1024];
325 sprintf(str, "Malloc failed to alloc node for Mem Object %p", (void*)mem);
326 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
327 }
328 else {
329 numMemObjNodes++;
330 memset(pTrav, 0, sizeof(GLOBAL_MEM_OBJ_NODE));
331 if (pAllocInfo) // MEM alloc created by xglWsiX11CreatePresentableImage() doesn't have alloc info struct
332 memcpy(&pTrav->allocInfo, pAllocInfo, sizeof(XGL_MEMORY_ALLOC_INFO));
333 pTrav->mem = mem;
334 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700335}
336
337// Return ptr to node in global LL containing mem, or NULL if not found
338static GLOBAL_MEM_OBJ_NODE* getGlobalMemNode(const XGL_GPU_MEMORY mem)
339{
340 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
341 while (pTrav && (pTrav->mem != mem))
342 pTrav = pTrav->pNextGlobalNode;
343 return pTrav;
344}
345
346// Find Global CB Node and add mem binding to mini LL
347// Find Global Mem Obj Node and add CB binding to mini LL
348static XGL_BOOL updateCBBinding(const XGL_CMD_BUFFER cb, const XGL_GPU_MEMORY mem)
349{
350 // First update CB binding in MemObj mini CB list
351 GLOBAL_MEM_OBJ_NODE* pMemTrav = getGlobalMemNode(mem);
352 if (!pMemTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700353 char str[1024];
354 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);
355 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700356 return XGL_FALSE;
357 }
358
359 XGL_RESULT result = insertMiniNode(&pMemTrav->pCmdBufferBindings, cb, &pMemTrav->refCount);
360 if (XGL_SUCCESS != result)
361 return result;
362
363 // Now update Global CB's Mini Mem binding list
364 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cb);
365 if (!pCBTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700366 char str[1024];
367 sprintf(str, "Trying to bind mem obj %p to CB %p but no Node for that CB. Was it CB incorrectly destroyed?", mem, cb);
368 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700369 return XGL_FALSE;
370 }
371 XGL_UINT dontCare;
372 result = insertMiniNode(&pCBTrav->pMemObjList, mem, &dontCare);
373 if (XGL_SUCCESS != result)
374 return result;
375
376 return XGL_TRUE;
377}
378// Clear the CB Binding for mem
379static void clearCBBinding(const XGL_CMD_BUFFER cb, const XGL_GPU_MEMORY mem)
380{
381 GLOBAL_MEM_OBJ_NODE* pTrav = getGlobalMemNode(mem);
382 MINI_NODE* pMiniCB = pTrav->pCmdBufferBindings;
383 MINI_NODE* pPrev = pMiniCB;
384 while (pMiniCB && (cb != pMiniCB->cmdBuffer)) {
385 pPrev = pMiniCB;
386 pMiniCB = pMiniCB->pNext;
387 }
388 if (!pMiniCB) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700389 char str[1024];
390 sprintf(str, "Trying to clear CB binding but CB %p not in binding list for mem obj %p", cb, mem);
391 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700392 }
393 else { // remove node from list & decrement refCount
394 pPrev->pNext = pMiniCB->pNext;
395 if (pMiniCB == pTrav->pCmdBufferBindings)
396 pTrav->pCmdBufferBindings = NULL;
397 free(pMiniCB);
398 pTrav->refCount--;
399 }
400}
401// Free bindings related to CB
402static XGL_BOOL freeCBBindings(const XGL_CMD_BUFFER cb)
403{
404 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cb);
405 if (!pCBTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700406 char str[1024];
407 sprintf(str, "Unable to find global CB node %p for deletion", cb);
408 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700409 return XGL_FALSE;
410 }
411 MINI_NODE* pMemTrav = pCBTrav->pMemObjList;
412 MINI_NODE* pDeleteMe = NULL;
413 // We traverse LL in order and free nodes as they're cleared
414 while (pMemTrav) {
415 pDeleteMe = pMemTrav;
416 if (pMemTrav->mem)
417 clearCBBinding(cb, pMemTrav->mem);
418 pMemTrav = pMemTrav->pNext;
419 free(pDeleteMe);
420 }
421 pCBTrav->pMemObjList = NULL;
422 return XGL_TRUE;
423}
424// Delete Global CB Node from list along with all of it's mini mem obj node
425// and also clear Global mem references to CB
426// TODO : When should this be called? There's no Destroy of CBs that I see
427static XGL_BOOL deleteGlobalCBNode(const XGL_CMD_BUFFER cb)
428{
429 if (XGL_FALSE == freeCBBindings(cb))
430 return XGL_FALSE;
431 // Delete the Global CB node
432 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cb);
433 pCBTrav = pGlobalCBHead;
434 GLOBAL_CB_NODE* pPrev = pCBTrav;
435 while (pCBTrav && (cb != pCBTrav->cmdBuffer)) {
436 pPrev = pCBTrav;
437 pCBTrav = pCBTrav->pNextGlobalCBNode;
438 }
439 assert(cb); // We found node at start of function so it should still be here
440 pPrev->pNextGlobalCBNode = pCBTrav->pNextGlobalCBNode;
441 if (pCBTrav == pGlobalCBHead)
442 pGlobalCBHead = pCBTrav->pNextGlobalCBNode;
443 free(pCBTrav);
444 return XGL_TRUE;
445}
446// Delete the entire CB list
447static XGL_BOOL deleteGlobalCBList()
448{
449 XGL_BOOL result = XGL_TRUE;
450 GLOBAL_CB_NODE* pCBTrav = pGlobalCBHead;
451 while (pCBTrav) {
Tobin Ehlisc0418f92014-11-25 14:47:20 -0700452 XGL_CMD_BUFFER cbToDelete = pCBTrav->cmdBuffer;
453 pCBTrav = pCBTrav->pNextGlobalCBNode;
454 XGL_BOOL tmpResult = deleteGlobalCBNode(cbToDelete);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700455 // If any result is FALSE, final result should be FALSE
456 if ((XGL_FALSE == tmpResult) || (XGL_FALSE == result))
457 result = XGL_FALSE;
Tobin Ehlis6663f492014-11-10 12:29:12 -0700458 }
459 return result;
460}
461
462// For given MemObj node, report Obj & CB bindings
463static void reportMemReferences(const GLOBAL_MEM_OBJ_NODE* pMemObjTrav)
464{
465 XGL_UINT refCount = 0; // Count found references
466 MINI_NODE* pObjTrav = pMemObjTrav->pObjBindings;
467 MINI_NODE* pCBTrav = pMemObjTrav->pCmdBufferBindings;
468 while (pCBTrav) {
469 refCount++;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700470 char str[1024];
471 sprintf(str, "Command Buffer %p has reference to mem obj %p", pCBTrav->cmdBuffer, pMemObjTrav->mem);
472 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCBTrav->cmdBuffer, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700473 pCBTrav = pCBTrav->pNext;
474 }
475 while (pObjTrav) {
476 refCount++;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700477 char str[1024];
478 sprintf(str, "XGL Object %p has reference to mem obj %p", pObjTrav->object, pMemObjTrav->mem);
479 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pObjTrav->object, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700480 pObjTrav = pObjTrav->pNext;
481 }
482 if (refCount != pMemObjTrav->refCount) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700483 char str[1024];
484 sprintf(str, "Refcount of %u for Mem Obj %p does't match reported refs of %u", pMemObjTrav->refCount, pMemObjTrav->mem, refCount);
485 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pObjTrav->object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700486 }
487}
488
489static void deleteGlobalMemNode(XGL_GPU_MEMORY mem)
490{
491 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
492 GLOBAL_MEM_OBJ_NODE* pPrev = pTrav;
493 while (pTrav && (pTrav->mem != mem)) {
494 pPrev = pTrav;
495 pTrav = pTrav->pNextGlobalNode;
496 }
497 if (pTrav) {
498 pPrev->pNextGlobalNode = pTrav->pNextGlobalNode;
499 if (pGlobalMemObjHead == pTrav)
500 pGlobalMemObjHead = pTrav->pNextGlobalNode;
501 free(pTrav);
502 }
503 else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700504 char str[1024];
505 sprintf(str, "Could not find global mem obj node for %p to delete!", mem);
506 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700507 }
508}
509// Check if fence for given CB is completed
510static XGL_BOOL checkCBCompleted(const XGL_CMD_BUFFER cb)
511{
512 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cb);
513 if (!pCBTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700514 char str[1024];
515 sprintf(str, "Unable to find global CB node %p to check for completion", cb);
516 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700517 return XGL_FALSE;
518 }
519 if (!pCBTrav->fence) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700520 char str[1024];
521 sprintf(str, "No fence found for CB %p to check for completion", cb);
522 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_CB_MISSING_FENCE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700523 return XGL_FALSE;
524 }
525 if (XGL_SUCCESS != nextTable.GetFenceStatus(pCBTrav->fence)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700526 char str[1024];
527 sprintf(str, "Fence %p for CB %p has not completed", pCBTrav->fence, cb);
528 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700529 return XGL_FALSE;
530 }
531 return XGL_TRUE;
532}
533
534static XGL_BOOL freeMemNode(XGL_GPU_MEMORY mem)
535{
536 XGL_BOOL result = XGL_TRUE;
537 // Parse global list to find node w/ mem
538 GLOBAL_MEM_OBJ_NODE* pTrav = getGlobalMemNode(mem);
539 if (!pTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700540 char str[1024];
541 sprintf(str, "Couldn't find mem node object for %p\n Was %p never allocated or previously freed?", (void*)mem, (void*)mem);
542 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700543 return XGL_FALSE;
544 }
545 else {
546 // First clear any CB bindings for completed CBs
547 // TODO : Is there a better place to do this?
548 MINI_NODE* pMiniCB = pTrav->pCmdBufferBindings;
549 while (pMiniCB) {
550 XGL_CMD_BUFFER curCB = pMiniCB->cmdBuffer;
551 pMiniCB = pMiniCB->pNext;
552 if (XGL_TRUE == checkCBCompleted(curCB)) {
553 freeCBBindings(curCB);
554 }
555 }
556 // Now verify that no references to this mem obj remain
557 if (0 != pTrav->refCount) {
558 // If references remain, report the error and can search down CB LL to find references
559 result = XGL_FALSE;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700560 char str[1024];
561 sprintf(str, "Freeing mem obj %p while it still has references", (void*)mem);
562 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREED_MEM_REF, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700563 reportMemReferences(pTrav);
564 }
565 // Delete global node
566 deleteGlobalMemNode(mem);
567 }
568 return result;
569}
570
571// Return object node for 'object' or return NULL if no node exists
572static GLOBAL_OBJECT_NODE* getGlobalObjectNode(const XGL_OBJECT object)
573{
574 GLOBAL_OBJECT_NODE* pTrav = pGlobalObjectHead;
575 while (pTrav && (object != pTrav->object)) {
576 pTrav = pTrav->pNext;
577 }
578 return pTrav;
579}
580
581static GLOBAL_OBJECT_NODE* insertGlobalObjectNode(XGL_OBJECT object)
582{
583 GLOBAL_OBJECT_NODE* pTrav = pGlobalObjectHead;
584 if (!pTrav) {
585 pTrav = (GLOBAL_OBJECT_NODE*)malloc(sizeof(GLOBAL_OBJECT_NODE));
Tobin Ehlis6663f492014-11-10 12:29:12 -0700586 memset(pTrav, 0, sizeof(GLOBAL_OBJECT_NODE));
587 pGlobalObjectHead = pTrav;
588 }
589 else {
590 GLOBAL_OBJECT_NODE* pPrev = pTrav;
591 while (pTrav) {
592 pPrev = pTrav;
593 pTrav = pTrav->pNext;
594 }
595 pTrav = (GLOBAL_OBJECT_NODE*)malloc(sizeof(GLOBAL_OBJECT_NODE));
Tobin Ehlis6663f492014-11-10 12:29:12 -0700596 memset(pTrav, 0, sizeof(GLOBAL_OBJECT_NODE));
597 pPrev->pNext = pTrav;
598 }
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700599 if (!pTrav) {
600 char str[1024];
601 sprintf(str, "Malloc failed to alloc node for XGL Object %p", (void*)object);
602 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
603 return NULL;
604 }
605 else {
606 numObjectNodes++;
607 pTrav->object = object;
608 return pTrav;
609 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700610}
611
612// Remove object binding performs 3 tasks:
613// 1. Remove object node from Global Mem Obj mini LL of obj bindings & free it
614// 2. Decrement refCount for Global Mem Obj
615// 3. Clear Global Mem Obj ptr from Global Object Node
616static XGL_BOOL clearObjectBinding(XGL_OBJECT object)
617{
618 GLOBAL_OBJECT_NODE* pGlobalObjTrav = getGlobalObjectNode(object);
619 if (!pGlobalObjTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700620 char str[1024];
621 sprintf(str, "Attempting to clear mem binding for object %p", object);
622 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700623 return XGL_FALSE;
624 }
625 if (!pGlobalObjTrav->pMemNode) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700626 char str[1024];
627 sprintf(str, "Attempting to clear mem binding on obj %p but it has no binding.", (void*)object);
628 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEM_OBJ_CLEAR_EMPTY_BINDINGS, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700629 return XGL_FALSE;
630 }
631 MINI_NODE* pObjTrav = pGlobalObjTrav->pMemNode->pObjBindings;
632 MINI_NODE* pPrevObj = pObjTrav;
633 while (pObjTrav) {
634 if (object == pObjTrav->object) {
635 pPrevObj->pNext = pObjTrav->pNext;
636 // check if HEAD needs to be updated
637 if (pGlobalObjTrav->pMemNode->pObjBindings == pObjTrav)
638 pGlobalObjTrav->pMemNode->pObjBindings = pObjTrav->pNext;
639 free(pObjTrav);
640 pGlobalObjTrav->pMemNode->refCount--;
641 pGlobalObjTrav->pMemNode = NULL;
642 return XGL_TRUE;
643 }
644 pPrevObj = pObjTrav;
645 pObjTrav = pObjTrav->pNext;
646 }
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700647 char str[1024];
648 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);
649 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700650 return XGL_FALSE;
651}
652
653// For NULL mem case, clear any previous binding Else...
654// Make sure given object is in global object LL
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700655// IF a previous binding existed, clear it
Tobin Ehlis6663f492014-11-10 12:29:12 -0700656// Add link from global object node to global memory node
657// Add mini-object node & reference off of global obj node
658// Return XGL_TRUE if addition is successful, XGL_FALSE otherwise
659static XGL_BOOL updateObjectBinding(XGL_OBJECT object, XGL_GPU_MEMORY mem)
660{
661 // Handle NULL case separately, just clear previous binding & decrement reference
662 if (mem == XGL_NULL_HANDLE) {
663 clearObjectBinding(object);
664 return XGL_TRUE;
665 }
666 // Find obj node or add it if we don't have one
667 GLOBAL_OBJECT_NODE* pGlobalObjTrav = getGlobalObjectNode(object);
668 if (!pGlobalObjTrav)
669 pGlobalObjTrav = insertGlobalObjectNode(object);
670
671 // non-null case so should have real mem obj
672 GLOBAL_MEM_OBJ_NODE* pTrav = getGlobalMemNode(mem);
673 if (!pTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700674 char str[1024];
675 sprintf(str, "While trying to bind mem for obj %p, couldn't find node for mem obj %p", (void*)object, (void*)mem);
676 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700677 return XGL_FALSE;
678 }
679 XGL_RESULT result = insertMiniNode(&pTrav->pObjBindings, object, &pTrav->refCount);
680 if (XGL_SUCCESS != result)
681 return result;
682
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700683 if (pGlobalObjTrav->pMemNode) {
684 clearObjectBinding(object); // Need to clear the previous object binding before setting new binding
685 char str[1024];
686 sprintf(str, "Updating memory binding for object %p from mem obj %p to %p", object, pGlobalObjTrav->pMemNode->mem, mem);
687 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_NONE, "MEM", str);
688 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700689 pGlobalObjTrav->pMemNode = pTrav;
690 return XGL_TRUE;
691}
692// Print details of global Obj tracking list
693static void printObjList()
694{
695 GLOBAL_OBJECT_NODE* pGlobalObjTrav = pGlobalObjectHead;
696 if (!pGlobalObjTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700697 char str[1024];
698 sprintf(str, "Global Object list is empty :(\n");
699 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700700 }
701 else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700702 char str[1024];
703 sprintf(str, "Details of Global Object list w/ HEAD at %p", (void*)pGlobalObjTrav);
704 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700705 while (pGlobalObjTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700706 sprintf(str, " GlobObjNode %p has object %p, pNext %p, pMemNode %p", pGlobalObjTrav, pGlobalObjTrav->object, pGlobalObjTrav->pNext, pGlobalObjTrav->pMemNode);
707 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pGlobalObjTrav->object, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700708 pGlobalObjTrav = pGlobalObjTrav->pNext;
709 }
710 }
711}
712// For given Object, get 'mem' obj that it's bound to or NULL if no binding
713static XGL_GPU_MEMORY getMemBindingFromObject(const XGL_OBJECT object)
714{
715 XGL_GPU_MEMORY mem = NULL;
716 GLOBAL_OBJECT_NODE* pObjNode = getGlobalObjectNode(object);
717 if (pObjNode) {
718 if (pObjNode->pMemNode) {
719 mem = pObjNode->pMemNode->mem;
720 }
721 else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700722 char str[1024];
723 sprintf(str, "Trying to get mem binding for object %p but object has no mem binding", (void*)object);
724 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MISSING_MEM_BINDINGS, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700725 printObjList();
726 }
727 }
728 else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700729 char str[1024];
730 sprintf(str, "Trying to get mem binding for object %p but no such object in global list", (void*)object);
731 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_OBJECT, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700732 printObjList();
733 }
734 return mem;
735}
736// Print details of global Mem Obj list
737static void printMemList()
738{
739 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700740 // Just printing each msg individually for now, may want to package these into single large print
741 char str[1024];
Tobin Ehlis6663f492014-11-10 12:29:12 -0700742 if (!pTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700743 sprintf(str, "MEM INFO : Global Memory Object list is empty :(\n");
744 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700745 }
746 else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700747 sprintf(str, "MEM INFO : Details of Global Memory Object list w/ HEAD at %p", (void*)pTrav);
748 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700749 while (pTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700750 sprintf(str, " ===MemObj Node at %p===", (void*)pTrav);
751 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
752 sprintf(str, " Mem object: %p", (void*)pTrav->mem);
753 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
754 sprintf(str, " Ref Count: %u", pTrav->refCount);
755 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
756 sprintf(str, " pNext Mem Obj Node: %p", (void*)pTrav->pNextGlobalNode);
757 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
758 if (0 != pTrav->allocInfo.allocationSize)
759 sprintf(str, " Mem Alloc info:\n%s", xgl_print_xgl_memory_alloc_info(&pTrav->allocInfo, "{MEM}INFO : "));
760 else
761 sprintf(str, " Mem Alloc info is NULL (alloc done by xglWsiX11CreatePresentableImage())");
762 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700763 MINI_NODE* pObjTrav = pTrav->pObjBindings;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700764 if (!pObjTrav) {
765 sprintf(str, " No XGL Object bindings");
766 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
767 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700768 else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700769 sprintf(str, " XGL OBJECT Binding list w/ HEAD at %p:", pObjTrav);
770 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700771 while (pObjTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700772 sprintf(str, " OBJ_NODE(%p): XGL OBJECT %p, pNext %p", pObjTrav, pObjTrav->object, pObjTrav->pNext);
773 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700774 pObjTrav = pObjTrav->pNext;
775 }
776 }
777 MINI_NODE* pCBTrav = pTrav->pCmdBufferBindings;
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700778 if (!pCBTrav) {
779 sprintf(str, " No Command Buffer bindings");
780 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
781 }
Tobin Ehlis6663f492014-11-10 12:29:12 -0700782 else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700783 sprintf(str, " XGL Command Buffer (CB) binding list w/ HEAD at %p:", pCBTrav);
784 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700785 while (pCBTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700786 sprintf(str, " CB_NODE(%p): XGL CB %p, pNext %p", pCBTrav, pCBTrav->cmdBuffer, pCBTrav->pNext);
787 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700788 pCBTrav = pCBTrav->pNext;
789 }
790 }
791 pTrav = pTrav->pNextGlobalNode;
792 }
793 }
794}
795
796static void printGlobalCB()
797{
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700798 char str[1024] = {0};
Tobin Ehlis6663f492014-11-10 12:29:12 -0700799 GLOBAL_CB_NODE* pTrav = pGlobalCBHead;
800 if (!pTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700801 sprintf(str, "Global Command Buffer (CB) list is empty :(\n");
802 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700803 }
804 else {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700805 sprintf(str, "Details of Global CB list w/ HEAD at %p:", (void*)pTrav);
806 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700807 while (pTrav) {
Tobin Ehlisc0418f92014-11-25 14:47:20 -0700808 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 Ehliscd9223b2014-11-19 16:19:28 -0700809 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700810 MINI_NODE* pMemObjTrav = pTrav->pMemObjList;
811 while (pMemObjTrav) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -0700812 sprintf(str, " MEM_NODE(%p): Mem obj %p, pNext %p", (void*)pMemObjTrav, (void*)pMemObjTrav->mem, (void*)pMemObjTrav->pNext);
813 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -0700814 pMemObjTrav = pMemObjTrav->pNext;
815 }
816 pTrav = pTrav->pNextGlobalCBNode;
817 }
818 }
819}
820
821static XGL_FENCE createLocalFence()
822{
823 XGL_FENCE_CREATE_INFO fci;
824 fci.sType = XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO;
825 fci.pNext = NULL;
826 fci.flags = 0;
827 XGL_FENCE fence;
828 nextTable.CreateFence(globalDevice, &fci, &fence);
829 return fence;
830}
831
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700832static void initMemTracker()
Tobin Ehlis6663f492014-11-10 12:29:12 -0700833{
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -0700834 const char *strOpt;
835 // initialize MemTracker options
836 strOpt = getLayerOption("MemTrackerReportLevel");
837 if (strOpt != NULL)
838 g_reportingLevel = atoi(strOpt);
839 strOpt = getLayerOption("MemTrackerDebugAction");
840 if (strOpt != NULL)
841 g_debugAction = atoi(strOpt);
842 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
843 {
844 strOpt = getLayerOption("MemTrackerLogFilename");
845 if (strOpt)
846 {
847 g_logFile = fopen(strOpt, "w");
848
849 }
850 if (g_logFile == NULL)
851 g_logFile = stdout;
852 }
853
854 // initialize Layer dispatch table
855 // TODO handle multiple GPUs
Tobin Ehlis6663f492014-11-10 12:29:12 -0700856 GetProcAddrType fpNextGPA;
857 fpNextGPA = pCurObj->pGPA;
858 assert(fpNextGPA);
859
860 GetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetProcAddr");
861 nextTable.GetProcAddr = fpGetProcAddr;
862 InitAndEnumerateGpusType fpInitAndEnumerateGpus = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglInitAndEnumerateGpus");
863 nextTable.InitAndEnumerateGpus = fpInitAndEnumerateGpus;
864 GetGpuInfoType fpGetGpuInfo = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetGpuInfo");
865 nextTable.GetGpuInfo = fpGetGpuInfo;
866 CreateDeviceType fpCreateDevice = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateDevice");
867 nextTable.CreateDevice = fpCreateDevice;
868 DestroyDeviceType fpDestroyDevice = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglDestroyDevice");
869 nextTable.DestroyDevice = fpDestroyDevice;
870 GetExtensionSupportType fpGetExtensionSupport = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetExtensionSupport");
871 nextTable.GetExtensionSupport = fpGetExtensionSupport;
872 EnumerateLayersType fpEnumerateLayers = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglEnumerateLayers");
873 nextTable.EnumerateLayers = fpEnumerateLayers;
874 GetDeviceQueueType fpGetDeviceQueue = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetDeviceQueue");
875 nextTable.GetDeviceQueue = fpGetDeviceQueue;
876 QueueSubmitType fpQueueSubmit = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglQueueSubmit");
877 nextTable.QueueSubmit = fpQueueSubmit;
878 QueueSetGlobalMemReferencesType fpQueueSetGlobalMemReferences = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglQueueSetGlobalMemReferences");
879 nextTable.QueueSetGlobalMemReferences = fpQueueSetGlobalMemReferences;
880 QueueWaitIdleType fpQueueWaitIdle = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglQueueWaitIdle");
881 nextTable.QueueWaitIdle = fpQueueWaitIdle;
882 DeviceWaitIdleType fpDeviceWaitIdle = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglDeviceWaitIdle");
883 nextTable.DeviceWaitIdle = fpDeviceWaitIdle;
884 GetMemoryHeapCountType fpGetMemoryHeapCount = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetMemoryHeapCount");
885 nextTable.GetMemoryHeapCount = fpGetMemoryHeapCount;
886 GetMemoryHeapInfoType fpGetMemoryHeapInfo = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetMemoryHeapInfo");
887 nextTable.GetMemoryHeapInfo = fpGetMemoryHeapInfo;
888 AllocMemoryType fpAllocMemory = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglAllocMemory");
889 nextTable.AllocMemory = fpAllocMemory;
890 FreeMemoryType fpFreeMemory = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglFreeMemory");
891 nextTable.FreeMemory = fpFreeMemory;
892 SetMemoryPriorityType fpSetMemoryPriority = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglSetMemoryPriority");
893 nextTable.SetMemoryPriority = fpSetMemoryPriority;
894 MapMemoryType fpMapMemory = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglMapMemory");
895 nextTable.MapMemory = fpMapMemory;
896 UnmapMemoryType fpUnmapMemory = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglUnmapMemory");
897 nextTable.UnmapMemory = fpUnmapMemory;
898 PinSystemMemoryType fpPinSystemMemory = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglPinSystemMemory");
899 nextTable.PinSystemMemory = fpPinSystemMemory;
900 RemapVirtualMemoryPagesType fpRemapVirtualMemoryPages = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglRemapVirtualMemoryPages");
901 nextTable.RemapVirtualMemoryPages = fpRemapVirtualMemoryPages;
902 GetMultiGpuCompatibilityType fpGetMultiGpuCompatibility = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetMultiGpuCompatibility");
903 nextTable.GetMultiGpuCompatibility = fpGetMultiGpuCompatibility;
904 OpenSharedMemoryType fpOpenSharedMemory = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglOpenSharedMemory");
905 nextTable.OpenSharedMemory = fpOpenSharedMemory;
906 OpenSharedQueueSemaphoreType fpOpenSharedQueueSemaphore = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglOpenSharedQueueSemaphore");
907 nextTable.OpenSharedQueueSemaphore = fpOpenSharedQueueSemaphore;
908 OpenPeerMemoryType fpOpenPeerMemory = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglOpenPeerMemory");
909 nextTable.OpenPeerMemory = fpOpenPeerMemory;
910 OpenPeerImageType fpOpenPeerImage = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglOpenPeerImage");
911 nextTable.OpenPeerImage = fpOpenPeerImage;
912 DestroyObjectType fpDestroyObject = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglDestroyObject");
913 nextTable.DestroyObject = fpDestroyObject;
914 GetObjectInfoType fpGetObjectInfo = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetObjectInfo");
915 nextTable.GetObjectInfo = fpGetObjectInfo;
916 BindObjectMemoryType fpBindObjectMemory = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglBindObjectMemory");
917 nextTable.BindObjectMemory = fpBindObjectMemory;
918 CreateFenceType fpCreateFence = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateFence");
919 nextTable.CreateFence = fpCreateFence;
920 GetFenceStatusType fpGetFenceStatus = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetFenceStatus");
921 nextTable.GetFenceStatus = fpGetFenceStatus;
922 WaitForFencesType fpWaitForFences = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglWaitForFences");
923 nextTable.WaitForFences = fpWaitForFences;
924 CreateQueueSemaphoreType fpCreateQueueSemaphore = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateQueueSemaphore");
925 nextTable.CreateQueueSemaphore = fpCreateQueueSemaphore;
926 SignalQueueSemaphoreType fpSignalQueueSemaphore = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglSignalQueueSemaphore");
927 nextTable.SignalQueueSemaphore = fpSignalQueueSemaphore;
928 WaitQueueSemaphoreType fpWaitQueueSemaphore = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglWaitQueueSemaphore");
929 nextTable.WaitQueueSemaphore = fpWaitQueueSemaphore;
930 CreateEventType fpCreateEvent = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateEvent");
931 nextTable.CreateEvent = fpCreateEvent;
932 GetEventStatusType fpGetEventStatus = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetEventStatus");
933 nextTable.GetEventStatus = fpGetEventStatus;
934 SetEventType fpSetEvent = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglSetEvent");
935 nextTable.SetEvent = fpSetEvent;
936 ResetEventType fpResetEvent = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglResetEvent");
937 nextTable.ResetEvent = fpResetEvent;
938 CreateQueryPoolType fpCreateQueryPool = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateQueryPool");
939 nextTable.CreateQueryPool = fpCreateQueryPool;
940 GetQueryPoolResultsType fpGetQueryPoolResults = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetQueryPoolResults");
941 nextTable.GetQueryPoolResults = fpGetQueryPoolResults;
942 GetFormatInfoType fpGetFormatInfo = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetFormatInfo");
943 nextTable.GetFormatInfo = fpGetFormatInfo;
944 CreateImageType fpCreateImage = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateImage");
945 nextTable.CreateImage = fpCreateImage;
946 GetImageSubresourceInfoType fpGetImageSubresourceInfo = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglGetImageSubresourceInfo");
947 nextTable.GetImageSubresourceInfo = fpGetImageSubresourceInfo;
948 CreateImageViewType fpCreateImageView = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateImageView");
949 nextTable.CreateImageView = fpCreateImageView;
950 CreateColorAttachmentViewType fpCreateColorAttachmentView = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateColorAttachmentView");
951 nextTable.CreateColorAttachmentView = fpCreateColorAttachmentView;
952 CreateDepthStencilViewType fpCreateDepthStencilView = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateDepthStencilView");
953 nextTable.CreateDepthStencilView = fpCreateDepthStencilView;
954 CreateShaderType fpCreateShader = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateShader");
955 nextTable.CreateShader = fpCreateShader;
956 CreateGraphicsPipelineType fpCreateGraphicsPipeline = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateGraphicsPipeline");
957 nextTable.CreateGraphicsPipeline = fpCreateGraphicsPipeline;
958 CreateComputePipelineType fpCreateComputePipeline = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateComputePipeline");
959 nextTable.CreateComputePipeline = fpCreateComputePipeline;
960 StorePipelineType fpStorePipeline = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglStorePipeline");
961 nextTable.StorePipeline = fpStorePipeline;
962 LoadPipelineType fpLoadPipeline = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglLoadPipeline");
963 nextTable.LoadPipeline = fpLoadPipeline;
964 CreatePipelineDeltaType fpCreatePipelineDelta = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreatePipelineDelta");
965 nextTable.CreatePipelineDelta = fpCreatePipelineDelta;
966 CreateSamplerType fpCreateSampler = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateSampler");
967 nextTable.CreateSampler = fpCreateSampler;
968 CreateDescriptorSetType fpCreateDescriptorSet = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateDescriptorSet");
969 nextTable.CreateDescriptorSet = fpCreateDescriptorSet;
970 BeginDescriptorSetUpdateType fpBeginDescriptorSetUpdate = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglBeginDescriptorSetUpdate");
971 nextTable.BeginDescriptorSetUpdate = fpBeginDescriptorSetUpdate;
972 EndDescriptorSetUpdateType fpEndDescriptorSetUpdate = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglEndDescriptorSetUpdate");
973 nextTable.EndDescriptorSetUpdate = fpEndDescriptorSetUpdate;
974 AttachSamplerDescriptorsType fpAttachSamplerDescriptors = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglAttachSamplerDescriptors");
975 nextTable.AttachSamplerDescriptors = fpAttachSamplerDescriptors;
976 AttachImageViewDescriptorsType fpAttachImageViewDescriptors = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglAttachImageViewDescriptors");
977 nextTable.AttachImageViewDescriptors = fpAttachImageViewDescriptors;
978 AttachMemoryViewDescriptorsType fpAttachMemoryViewDescriptors = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglAttachMemoryViewDescriptors");
979 nextTable.AttachMemoryViewDescriptors = fpAttachMemoryViewDescriptors;
980 AttachNestedDescriptorsType fpAttachNestedDescriptors = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglAttachNestedDescriptors");
981 nextTable.AttachNestedDescriptors = fpAttachNestedDescriptors;
982 ClearDescriptorSetSlotsType fpClearDescriptorSetSlots = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglClearDescriptorSetSlots");
983 nextTable.ClearDescriptorSetSlots = fpClearDescriptorSetSlots;
984 CreateViewportStateType fpCreateViewportState = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateViewportState");
985 nextTable.CreateViewportState = fpCreateViewportState;
986 CreateRasterStateType fpCreateRasterState = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateRasterState");
987 nextTable.CreateRasterState = fpCreateRasterState;
988 CreateMsaaStateType fpCreateMsaaState = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateMsaaState");
989 nextTable.CreateMsaaState = fpCreateMsaaState;
990 CreateColorBlendStateType fpCreateColorBlendState = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateColorBlendState");
991 nextTable.CreateColorBlendState = fpCreateColorBlendState;
992 CreateDepthStencilStateType fpCreateDepthStencilState = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateDepthStencilState");
993 nextTable.CreateDepthStencilState = fpCreateDepthStencilState;
994 CreateCommandBufferType fpCreateCommandBuffer = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCreateCommandBuffer");
995 nextTable.CreateCommandBuffer = fpCreateCommandBuffer;
996 BeginCommandBufferType fpBeginCommandBuffer = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglBeginCommandBuffer");
997 nextTable.BeginCommandBuffer = fpBeginCommandBuffer;
998 EndCommandBufferType fpEndCommandBuffer = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglEndCommandBuffer");
999 nextTable.EndCommandBuffer = fpEndCommandBuffer;
1000 ResetCommandBufferType fpResetCommandBuffer = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglResetCommandBuffer");
1001 nextTable.ResetCommandBuffer = fpResetCommandBuffer;
1002 CmdBindPipelineType fpCmdBindPipeline = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdBindPipeline");
1003 nextTable.CmdBindPipeline = fpCmdBindPipeline;
1004 CmdBindPipelineDeltaType fpCmdBindPipelineDelta = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdBindPipelineDelta");
1005 nextTable.CmdBindPipelineDelta = fpCmdBindPipelineDelta;
1006 CmdBindStateObjectType fpCmdBindStateObject = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdBindStateObject");
1007 nextTable.CmdBindStateObject = fpCmdBindStateObject;
1008 CmdBindDescriptorSetType fpCmdBindDescriptorSet = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdBindDescriptorSet");
1009 nextTable.CmdBindDescriptorSet = fpCmdBindDescriptorSet;
1010 CmdBindDynamicMemoryViewType fpCmdBindDynamicMemoryView = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdBindDynamicMemoryView");
1011 nextTable.CmdBindDynamicMemoryView = fpCmdBindDynamicMemoryView;
1012 CmdBindIndexDataType fpCmdBindIndexData = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdBindIndexData");
1013 nextTable.CmdBindIndexData = fpCmdBindIndexData;
1014 CmdBindAttachmentsType fpCmdBindAttachments = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdBindAttachments");
1015 nextTable.CmdBindAttachments = fpCmdBindAttachments;
1016 CmdPrepareMemoryRegionsType fpCmdPrepareMemoryRegions = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdPrepareMemoryRegions");
1017 nextTable.CmdPrepareMemoryRegions = fpCmdPrepareMemoryRegions;
1018 CmdPrepareImagesType fpCmdPrepareImages = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdPrepareImages");
1019 nextTable.CmdPrepareImages = fpCmdPrepareImages;
1020 CmdDrawType fpCmdDraw = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdDraw");
1021 nextTable.CmdDraw = fpCmdDraw;
1022 CmdDrawIndexedType fpCmdDrawIndexed = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdDrawIndexed");
1023 nextTable.CmdDrawIndexed = fpCmdDrawIndexed;
1024 CmdDrawIndirectType fpCmdDrawIndirect = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdDrawIndirect");
1025 nextTable.CmdDrawIndirect = fpCmdDrawIndirect;
1026 CmdDrawIndexedIndirectType fpCmdDrawIndexedIndirect = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdDrawIndexedIndirect");
1027 nextTable.CmdDrawIndexedIndirect = fpCmdDrawIndexedIndirect;
1028 CmdDispatchType fpCmdDispatch = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdDispatch");
1029 nextTable.CmdDispatch = fpCmdDispatch;
1030 CmdDispatchIndirectType fpCmdDispatchIndirect = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdDispatchIndirect");
1031 nextTable.CmdDispatchIndirect = fpCmdDispatchIndirect;
1032 CmdCopyMemoryType fpCmdCopyMemory = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdCopyMemory");
1033 nextTable.CmdCopyMemory = fpCmdCopyMemory;
1034 CmdCopyImageType fpCmdCopyImage = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdCopyImage");
1035 nextTable.CmdCopyImage = fpCmdCopyImage;
1036 CmdCopyMemoryToImageType fpCmdCopyMemoryToImage = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdCopyMemoryToImage");
1037 nextTable.CmdCopyMemoryToImage = fpCmdCopyMemoryToImage;
1038 CmdCopyImageToMemoryType fpCmdCopyImageToMemory = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdCopyImageToMemory");
1039 nextTable.CmdCopyImageToMemory = fpCmdCopyImageToMemory;
1040 CmdCloneImageDataType fpCmdCloneImageData = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdCloneImageData");
1041 nextTable.CmdCloneImageData = fpCmdCloneImageData;
1042 CmdUpdateMemoryType fpCmdUpdateMemory = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdUpdateMemory");
1043 nextTable.CmdUpdateMemory = fpCmdUpdateMemory;
1044 CmdFillMemoryType fpCmdFillMemory = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdFillMemory");
1045 nextTable.CmdFillMemory = fpCmdFillMemory;
1046 CmdClearColorImageType fpCmdClearColorImage = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdClearColorImage");
1047 nextTable.CmdClearColorImage = fpCmdClearColorImage;
1048 CmdClearColorImageRawType fpCmdClearColorImageRaw = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdClearColorImageRaw");
1049 nextTable.CmdClearColorImageRaw = fpCmdClearColorImageRaw;
1050 CmdClearDepthStencilType fpCmdClearDepthStencil = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdClearDepthStencil");
1051 nextTable.CmdClearDepthStencil = fpCmdClearDepthStencil;
1052 CmdResolveImageType fpCmdResolveImage = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdResolveImage");
1053 nextTable.CmdResolveImage = fpCmdResolveImage;
1054 CmdSetEventType fpCmdSetEvent = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdSetEvent");
1055 nextTable.CmdSetEvent = fpCmdSetEvent;
1056 CmdResetEventType fpCmdResetEvent = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdResetEvent");
1057 nextTable.CmdResetEvent = fpCmdResetEvent;
1058 CmdMemoryAtomicType fpCmdMemoryAtomic = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdMemoryAtomic");
1059 nextTable.CmdMemoryAtomic = fpCmdMemoryAtomic;
1060 CmdBeginQueryType fpCmdBeginQuery = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdBeginQuery");
1061 nextTable.CmdBeginQuery = fpCmdBeginQuery;
1062 CmdEndQueryType fpCmdEndQuery = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdEndQuery");
1063 nextTable.CmdEndQuery = fpCmdEndQuery;
1064 CmdResetQueryPoolType fpCmdResetQueryPool = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdResetQueryPool");
1065 nextTable.CmdResetQueryPool = fpCmdResetQueryPool;
1066 CmdWriteTimestampType fpCmdWriteTimestamp = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdWriteTimestamp");
1067 nextTable.CmdWriteTimestamp = fpCmdWriteTimestamp;
1068 CmdInitAtomicCountersType fpCmdInitAtomicCounters = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdInitAtomicCounters");
1069 nextTable.CmdInitAtomicCounters = fpCmdInitAtomicCounters;
1070 CmdLoadAtomicCountersType fpCmdLoadAtomicCounters = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdLoadAtomicCounters");
1071 nextTable.CmdLoadAtomicCounters = fpCmdLoadAtomicCounters;
1072 CmdSaveAtomicCountersType fpCmdSaveAtomicCounters = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdSaveAtomicCounters");
1073 nextTable.CmdSaveAtomicCounters = fpCmdSaveAtomicCounters;
1074 DbgSetValidationLevelType fpDbgSetValidationLevel = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglDbgSetValidationLevel");
1075 nextTable.DbgSetValidationLevel = fpDbgSetValidationLevel;
1076 DbgRegisterMsgCallbackType fpDbgRegisterMsgCallback = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglDbgRegisterMsgCallback");
1077 nextTable.DbgRegisterMsgCallback = fpDbgRegisterMsgCallback;
1078 DbgUnregisterMsgCallbackType fpDbgUnregisterMsgCallback = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglDbgUnregisterMsgCallback");
1079 nextTable.DbgUnregisterMsgCallback = fpDbgUnregisterMsgCallback;
1080 DbgSetMessageFilterType fpDbgSetMessageFilter = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglDbgSetMessageFilter");
1081 nextTable.DbgSetMessageFilter = fpDbgSetMessageFilter;
1082 DbgSetObjectTagType fpDbgSetObjectTag = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglDbgSetObjectTag");
1083 nextTable.DbgSetObjectTag = fpDbgSetObjectTag;
1084 DbgSetGlobalOptionType fpDbgSetGlobalOption = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglDbgSetGlobalOption");
1085 nextTable.DbgSetGlobalOption = fpDbgSetGlobalOption;
1086 DbgSetDeviceOptionType fpDbgSetDeviceOption = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglDbgSetDeviceOption");
1087 nextTable.DbgSetDeviceOption = fpDbgSetDeviceOption;
1088 CmdDbgMarkerBeginType fpCmdDbgMarkerBegin = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdDbgMarkerBegin");
1089 nextTable.CmdDbgMarkerBegin = fpCmdDbgMarkerBegin;
1090 CmdDbgMarkerEndType fpCmdDbgMarkerEnd = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglCmdDbgMarkerEnd");
1091 nextTable.CmdDbgMarkerEnd = fpCmdDbgMarkerEnd;
1092 WsiX11AssociateConnectionType fpWsiX11AssociateConnection = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglWsiX11AssociateConnection");
1093 nextTable.WsiX11AssociateConnection = fpWsiX11AssociateConnection;
1094 WsiX11GetMSCType fpWsiX11GetMSC = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglWsiX11GetMSC");
1095 nextTable.WsiX11GetMSC = fpWsiX11GetMSC;
1096 WsiX11CreatePresentableImageType fpWsiX11CreatePresentableImage = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglWsiX11CreatePresentableImage");
1097 nextTable.WsiX11CreatePresentableImage = fpWsiX11CreatePresentableImage;
1098 WsiX11QueuePresentType fpWsiX11QueuePresent = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (XGL_CHAR *) "xglWsiX11QueuePresent");
1099 nextTable.WsiX11QueuePresent = fpWsiX11QueuePresent;
1100}
1101
1102
1103XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetGpuInfo(XGL_PHYSICAL_GPU gpu, XGL_PHYSICAL_GPU_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
1104{
1105 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
1106 pCurObj = gpuw;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07001107 pthread_once(&g_initOnce, initMemTracker);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001108 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
1109 return result;
1110}
1111
1112XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
1113{
1114 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
1115 pCurObj = gpuw;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07001116 pthread_once(&g_initOnce, initMemTracker);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001117 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
1118 // Save off device in case we need it to create Fences
1119 globalDevice = *pDevice;
1120 return result;
1121}
1122
1123XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
1124{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001125 char str[1024];
1126 sprintf(str, "Printing List details prior to xglDestroyDevice()");
1127 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, device, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001128 printMemList();
1129 printGlobalCB();
1130 printObjList();
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001131 if (XGL_FALSE == deleteGlobalCBList()) {
1132 sprintf(str, "Issue deleting global CB list in xglDestroyDevice()");
1133 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, device, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
1134 }
Tobin Ehlisb54ef782014-11-25 18:01:12 -07001135 // Report any memory leaks
1136 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
1137 while (pTrav) {
1138 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);
1139 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, pTrav->mem, 0, MEMTRACK_MEMORY_LEAK, "MEM", str);
1140 pTrav = pTrav->pNextGlobalNode;
1141 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001142 XGL_RESULT result = nextTable.DestroyDevice(device);
1143 return result;
1144}
1145
1146XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const XGL_CHAR* pExtName)
1147{
1148 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
1149 pCurObj = gpuw;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07001150 pthread_once(&g_initOnce, initMemTracker);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001151 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
1152 return result;
1153}
1154
Jon Ashburnd5864592014-11-25 12:56:49 -07001155XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, XGL_SIZE maxLayerCount, XGL_SIZE maxStringSize, XGL_CHAR* const* pOutLayers, XGL_SIZE * pOutLayerCount, XGL_VOID* pReserved)
Tobin Ehlis6663f492014-11-10 12:29:12 -07001156{
Jon Ashburnf7a08742014-11-25 11:08:42 -07001157 if (gpu != NULL)
1158 {
1159 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
1160 pCurObj = gpuw;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07001161 pthread_once(&g_initOnce, initMemTracker);
Jon Ashburnd5864592014-11-25 12:56:49 -07001162 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayers, pOutLayerCount, pReserved);
Jon Ashburnf7a08742014-11-25 11:08:42 -07001163 return result;
1164 } else
1165 {
1166 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
1167 return XGL_ERROR_INVALID_POINTER;
1168 // This layer compatible with all GPUs
1169 *pOutLayerCount = 1;
Chia-I Wu1da4b9f2014-12-16 10:47:33 +08001170 strncpy((char *) pOutLayers[0], "MemTracker", maxStringSize);
Jon Ashburnf7a08742014-11-25 11:08:42 -07001171 return XGL_SUCCESS;
1172 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001173}
1174
1175XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetDeviceQueue(XGL_DEVICE device, XGL_QUEUE_TYPE queueType, XGL_UINT queueIndex, XGL_QUEUE* pQueue)
1176{
1177 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
1178 return result;
1179}
1180
1181XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSubmit(XGL_QUEUE queue, XGL_UINT cmdBufferCount, const XGL_CMD_BUFFER* pCmdBuffers, XGL_UINT memRefCount, const XGL_MEMORY_REF* pMemRefs, XGL_FENCE fence)
1182{
1183 // TODO : Need to track fence and clear mem references when fence clears
1184 XGL_FENCE localFence = fence;
1185 if (XGL_NULL_HANDLE == fence) { // allocate our own fence to track cmd buffer
1186 localFence = createLocalFence();
1187 }
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001188 char str[1024];
1189 sprintf(str, "In xglQueueSubmit(), checking %u cmdBuffers with %u memRefs", cmdBufferCount, memRefCount);
1190 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, queue, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001191 printMemList();
1192 printGlobalCB();
1193 for (uint32_t i = 0; i < cmdBufferCount; i++) {
1194 setCBFence(pCmdBuffers[i], localFence);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001195 sprintf(str, "Verifying mem refs for CB %p", pCmdBuffers[i]);
1196 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001197 if (XGL_FALSE == validateCBMemRef(pCmdBuffers[i], memRefCount, pMemRefs)) {
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001198 sprintf(str, "Unable to verify memory references for CB %p", (void*)pCmdBuffers[i]);
1199 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_CB_MISSING_MEM_REF, "MEM", str);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001200 }
1201 }
1202 printGlobalCB();
1203 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, localFence);
1204 return result;
1205}
1206
1207XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, XGL_UINT memRefCount, const XGL_MEMORY_REF* pMemRefs)
1208{
1209 // TODO : Use global mem references as part of list checked on QueueSubmit above
1210 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
1211 return result;
1212}
1213
1214XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
1215{
1216 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
1217 return result;
1218}
1219
1220XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
1221{
1222 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
1223 return result;
1224}
1225
1226XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMemoryHeapCount(XGL_DEVICE device, XGL_UINT* pCount)
1227{
1228 // TODO : Track memory stats here
1229 XGL_RESULT result = nextTable.GetMemoryHeapCount(device, pCount);
1230 return result;
1231}
1232
1233XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMemoryHeapInfo(XGL_DEVICE device, XGL_UINT heapId, XGL_MEMORY_HEAP_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
1234{
1235 // TODO : Track memory stats here
1236 XGL_RESULT result = nextTable.GetMemoryHeapInfo(device, heapId, infoType, pDataSize, pData);
1237 return result;
1238}
1239
1240XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
1241{
1242 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
1243 // TODO : Track allocations and overall size here
1244 insertGlobalMemObj(*pMem, pAllocInfo);
1245 printMemList();
1246 return result;
1247}
1248
1249XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
1250{
Tobin Ehlisc0418f92014-11-25 14:47:20 -07001251 /* From spec : A memory object is freed by calling xglFreeMemory() when it is no longer needed. Before
1252 * freeing a memory object, an application must ensure the memory object is unbound from
1253 * all API objects referencing it and that it is not referenced by any queued command buffers
1254 */
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001255 if (XGL_FALSE == freeMemNode(mem)) {
1256 char str[1024];
1257 sprintf(str, "Issue while freeing mem obj %p", (void*)mem);
1258 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREE_MEM_ERROR, "MEM", str);
1259 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001260 printMemList();
1261 printObjList();
1262 printGlobalCB();
1263 XGL_RESULT result = nextTable.FreeMemory(mem);
1264 return result;
1265}
1266
1267XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
1268{
1269 // TODO : Update tracking for this alloc
1270 // Make sure memory is not pinned, which can't have priority set
1271 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
1272 return result;
1273}
1274
1275XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, XGL_VOID** ppData)
1276{
1277 // TODO : Track when memory is mapped
1278 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
1279 return result;
1280}
1281
1282XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
1283{
1284 // TODO : Track as memory gets unmapped, do we want to check what changed following map?
1285 // Make sure that memory was ever mapped to begin with
1286 XGL_RESULT result = nextTable.UnmapMemory(mem);
1287 return result;
1288}
1289
1290XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglPinSystemMemory(XGL_DEVICE device, const XGL_VOID* pSysMem, XGL_SIZE memSize, XGL_GPU_MEMORY* pMem)
1291{
1292 // TODO : Track this
1293 // Verify that memory is actually pinnable
1294 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
1295 return result;
1296}
1297
1298XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglRemapVirtualMemoryPages(XGL_DEVICE device, XGL_UINT rangeCount, const XGL_VIRTUAL_MEMORY_REMAP_RANGE* pRanges, XGL_UINT preWaitSemaphoreCount, const XGL_QUEUE_SEMAPHORE* pPreWaitSemaphores, XGL_UINT postSignalSemaphoreCount, const XGL_QUEUE_SEMAPHORE* pPostSignalSemaphores)
1299{
1300 // TODO : Track this
1301 XGL_RESULT result = nextTable.RemapVirtualMemoryPages(device, rangeCount, pRanges, preWaitSemaphoreCount, pPreWaitSemaphores, postSignalSemaphoreCount, pPostSignalSemaphores);
1302 return result;
1303}
1304
1305XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
1306{
1307 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
1308 pCurObj = gpuw;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07001309 pthread_once(&g_initOnce, initMemTracker);
Tobin Ehlis6663f492014-11-10 12:29:12 -07001310 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
1311 return result;
1312}
1313
1314XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1315{
1316 // TODO : Track this
1317 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
1318 return result;
1319}
1320
1321XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1322{
1323 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
1324 return result;
1325}
1326
1327XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
1328{
1329 // TODO : Track this
1330 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1331 return result;
1332}
1333
1334XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1335{
1336 // TODO : Track this
1337 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1338 return result;
1339}
1340
1341XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1342{
Tobin Ehlisa98df732014-11-27 07:52:04 -07001343 // First check if this is a CmdBuffer
1344 if (NULL != getGlobalCBNode((XGL_CMD_BUFFER)object)) {
1345 deleteGlobalCBNode((XGL_CMD_BUFFER)object);
1346 }
1347 // Now locate node in global list along with prev node
Tobin Ehlisa6c0e3c2014-11-25 12:27:38 -07001348 GLOBAL_OBJECT_NODE* pTrav = pGlobalObjectHead;
1349 GLOBAL_OBJECT_NODE* pPrev = pTrav;
Tobin Ehlisa6c0e3c2014-11-25 12:27:38 -07001350 while (pTrav) {
1351 if (object == pTrav->object)
1352 break;
1353 pPrev = pTrav;
1354 pTrav = pTrav->pNext;
1355 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001356 if (pTrav) {
1357 if (pTrav->pMemNode) {
Tobin Ehlisa98df732014-11-27 07:52:04 -07001358 // Wsi allocated Memory is tied to image object so clear the binding and free that memory automatically
1359 if (0 == pTrav->pMemNode->allocInfo.allocationSize) { // Wsi allocated memory has NULL allocInfo w/ 0 size
1360 XGL_GPU_MEMORY memToFree = pTrav->pMemNode->mem;
1361 clearObjectBinding(object);
1362 freeMemNode(memToFree);
1363 }
1364 else {
1365 char str[1024];
1366 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);
1367 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_DESTROY_OBJECT_ERROR, "MEM", str);
1368 // From the spec : If an object has previous memory binding, it is required to unbind memory from an API object before it is destroyed.
1369 clearObjectBinding(object);
1370 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001371 }
1372 if (pGlobalObjectHead == pTrav) // update HEAD if needed
1373 pGlobalObjectHead = pTrav->pNext;
Tobin Ehlisa6c0e3c2014-11-25 12:27:38 -07001374 // Delete the obj node from global list
1375 pPrev->pNext = pTrav->pNext;
Tobin Ehlis6663f492014-11-10 12:29:12 -07001376 free(pTrav);
1377 }
1378 XGL_RESULT result = nextTable.DestroyObject(object);
1379 return result;
1380}
1381
1382XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetObjectInfo(XGL_BASE_OBJECT object, XGL_OBJECT_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
1383{
1384 // TODO : What to track here?
1385 // Could potentially save returned mem requirements and validate values passed into BindObjectMemory for this object
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001386 // From spec : The only objects that are guaranteed to have no external memory requirements are devices, queues, command buffers, shaders and memory objects.
Tobin Ehlis6663f492014-11-10 12:29:12 -07001387 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1388 return result;
1389}
1390
1391XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindObjectMemory(XGL_OBJECT object, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset)
1392{
1393 XGL_RESULT result = nextTable.BindObjectMemory(object, mem, offset);
1394 // Track objects tied to memory
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001395 if (XGL_FALSE == updateObjectBinding(object, mem)) {
1396 char str[1024];
1397 sprintf(str, "Unable to set object %p binding to mem obj %p", (void*)object, (void*)mem);
1398 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1399 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001400 printObjList();
1401 printMemList();
1402 return result;
1403}
1404
1405XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1406{
1407 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1408 return result;
1409}
1410
1411XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1412{
1413 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1414 return result;
1415}
1416
1417XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitForFences(XGL_DEVICE device, XGL_UINT fenceCount, const XGL_FENCE* pFences, XGL_BOOL waitAll, XGL_UINT64 timeout)
1418{
1419 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1420 return result;
1421}
1422
1423XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1424{
1425 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1426 return result;
1427}
1428
1429XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1430{
1431 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1432 return result;
1433}
1434
1435XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1436{
1437 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1438 return result;
1439}
1440
1441XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1442{
1443 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
1444 return result;
1445}
1446
1447XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1448{
1449 XGL_RESULT result = nextTable.GetEventStatus(event);
1450 return result;
1451}
1452
1453XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1454{
1455 XGL_RESULT result = nextTable.SetEvent(event);
1456 return result;
1457}
1458
1459XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1460{
1461 XGL_RESULT result = nextTable.ResetEvent(event);
1462 return result;
1463}
1464
1465XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1466{
1467 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
1468 return result;
1469}
1470
1471XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetQueryPoolResults(XGL_QUERY_POOL queryPool, XGL_UINT startQuery, XGL_UINT queryCount, XGL_SIZE* pDataSize, XGL_VOID* pData)
1472{
1473 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1474 return result;
1475}
1476
1477XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFormatInfo(XGL_DEVICE device, XGL_FORMAT format, XGL_FORMAT_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
1478{
1479 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1480 return result;
1481}
1482
1483XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1484{
1485 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
1486 return result;
1487}
1488
1489XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetImageSubresourceInfo(XGL_IMAGE image, const XGL_IMAGE_SUBRESOURCE* pSubresource, XGL_SUBRESOURCE_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData)
1490{
1491 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1492 return result;
1493}
1494
1495XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1496{
1497 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
1498 return result;
1499}
1500
1501XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1502{
1503 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
1504 return result;
1505}
1506
1507XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1508{
1509 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
1510 return result;
1511}
1512
1513XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1514{
1515 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1516 return result;
1517}
1518
1519XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1520{
1521 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
1522 return result;
1523}
1524
1525XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1526{
1527 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
1528 return result;
1529}
1530
1531XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, XGL_SIZE* pDataSize, XGL_VOID* pData)
1532{
1533 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
1534 return result;
1535}
1536
1537XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglLoadPipeline(XGL_DEVICE device, XGL_SIZE dataSize, const XGL_VOID* pData, XGL_PIPELINE* pPipeline)
1538{
1539 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
1540 return result;
1541}
1542
1543XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
1544{
1545 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
1546 return result;
1547}
1548
1549XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
1550{
1551 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
1552 return result;
1553}
1554
1555XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDescriptorSet(XGL_DEVICE device, const XGL_DESCRIPTOR_SET_CREATE_INFO* pCreateInfo, XGL_DESCRIPTOR_SET* pDescriptorSet)
1556{
1557 XGL_RESULT result = nextTable.CreateDescriptorSet(device, pCreateInfo, pDescriptorSet);
1558 return result;
1559}
1560
1561XGL_LAYER_EXPORT XGL_VOID XGLAPI xglBeginDescriptorSetUpdate(XGL_DESCRIPTOR_SET descriptorSet)
1562{
1563 nextTable.BeginDescriptorSetUpdate(descriptorSet);
1564}
1565
1566XGL_LAYER_EXPORT XGL_VOID XGLAPI xglEndDescriptorSetUpdate(XGL_DESCRIPTOR_SET descriptorSet)
1567{
1568 nextTable.EndDescriptorSetUpdate(descriptorSet);
1569}
1570
1571XGL_LAYER_EXPORT XGL_VOID XGLAPI xglAttachSamplerDescriptors(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_SAMPLER* pSamplers)
1572{
1573 nextTable.AttachSamplerDescriptors(descriptorSet, startSlot, slotCount, pSamplers);
1574}
1575
1576XGL_LAYER_EXPORT XGL_VOID XGLAPI xglAttachImageViewDescriptors(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_IMAGE_VIEW_ATTACH_INFO* pImageViews)
1577{
1578 nextTable.AttachImageViewDescriptors(descriptorSet, startSlot, slotCount, pImageViews);
1579}
1580
1581XGL_LAYER_EXPORT XGL_VOID XGLAPI xglAttachMemoryViewDescriptors(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_MEMORY_VIEW_ATTACH_INFO* pMemViews)
1582{
1583 nextTable.AttachMemoryViewDescriptors(descriptorSet, startSlot, slotCount, pMemViews);
1584}
1585
1586XGL_LAYER_EXPORT XGL_VOID XGLAPI xglAttachNestedDescriptors(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_DESCRIPTOR_SET_ATTACH_INFO* pNestedDescriptorSets)
1587{
1588 nextTable.AttachNestedDescriptors(descriptorSet, startSlot, slotCount, pNestedDescriptorSets);
1589}
1590
1591XGL_LAYER_EXPORT XGL_VOID XGLAPI xglClearDescriptorSetSlots(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount)
1592{
1593 nextTable.ClearDescriptorSetSlots(descriptorSet, startSlot, slotCount);
1594}
1595
1596XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateViewportState(XGL_DEVICE device, const XGL_VIEWPORT_STATE_CREATE_INFO* pCreateInfo, XGL_VIEWPORT_STATE_OBJECT* pState)
1597{
1598 XGL_RESULT result = nextTable.CreateViewportState(device, pCreateInfo, pState);
1599 return result;
1600}
1601
1602XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRasterState(XGL_DEVICE device, const XGL_RASTER_STATE_CREATE_INFO* pCreateInfo, XGL_RASTER_STATE_OBJECT* pState)
1603{
1604 XGL_RESULT result = nextTable.CreateRasterState(device, pCreateInfo, pState);
1605 return result;
1606}
1607
1608XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateMsaaState(XGL_DEVICE device, const XGL_MSAA_STATE_CREATE_INFO* pCreateInfo, XGL_MSAA_STATE_OBJECT* pState)
1609{
1610 XGL_RESULT result = nextTable.CreateMsaaState(device, pCreateInfo, pState);
1611 return result;
1612}
1613
1614XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorBlendState(XGL_DEVICE device, const XGL_COLOR_BLEND_STATE_CREATE_INFO* pCreateInfo, XGL_COLOR_BLEND_STATE_OBJECT* pState)
1615{
1616 XGL_RESULT result = nextTable.CreateColorBlendState(device, pCreateInfo, pState);
1617 return result;
1618}
1619
1620XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilState(XGL_DEVICE device, const XGL_DEPTH_STENCIL_STATE_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_STATE_OBJECT* pState)
1621{
1622 XGL_RESULT result = nextTable.CreateDepthStencilState(device, pCreateInfo, pState);
1623 return result;
1624}
1625
1626XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
1627{
1628 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
1629 // At time of cmd buffer creation, create global cmd buffer node for the returned cmd buffer
1630 if (*pCmdBuffer)
1631 insertGlobalCB(*pCmdBuffer);
1632 printGlobalCB();
1633 return result;
1634}
1635
1636XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_FLAGS flags)
1637{
1638 // This implicitly resets the Cmd Buffer so clear memory references
1639 freeCBBindings(cmdBuffer);
1640 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, flags);
1641 return result;
1642}
1643
1644XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1645{
1646 // TODO : Anything to do here?
1647 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
1648 return result;
1649}
1650
1651XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1652{
1653 // Clear memory references as this point. Anything else to do here?
1654 freeCBBindings(cmdBuffer);
1655 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
1656 return result;
1657}
1658// TODO : For any xglCmdBind* calls that include an object which has mem bound to it,
1659// need to account for that mem now having binding to given cmdBuffer
1660XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
1661{
1662 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1663}
1664
1665XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindPipelineDelta(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE_DELTA delta)
1666{
1667 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
1668}
1669
1670XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_STATE_OBJECT state)
1671{
1672 nextTable.CmdBindStateObject(cmdBuffer, stateBindPoint, state);
1673}
1674
1675XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_UINT index, XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT slotOffset)
1676{
1677 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, index, descriptorSet, slotOffset);
1678}
1679
1680XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindDynamicMemoryView(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, const XGL_MEMORY_VIEW_ATTACH_INFO* pMemView)
1681{
1682 nextTable.CmdBindDynamicMemoryView(cmdBuffer, pipelineBindPoint, pMemView);
1683}
1684
1685XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindIndexData(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
1686{
1687 // Track this memory. What exactly is this call doing?
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001688 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1689 char str[1024];
1690 sprintf(str, "In xglCmdBindIndexData() call unable to update binding of mem %p to cmdBuffer %p", mem, cmdBuffer);
1691 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1692 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001693 nextTable.CmdBindIndexData(cmdBuffer, mem, offset, indexType);
1694}
1695
1696XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBindAttachments(XGL_CMD_BUFFER cmdBuffer, XGL_UINT colorAttachmentCount, const XGL_COLOR_ATTACHMENT_BIND_INFO* pColorAttachments, const XGL_DEPTH_STENCIL_BIND_INFO* pDepthStencilAttachment)
1697{
1698 nextTable.CmdBindAttachments(cmdBuffer, colorAttachmentCount, pColorAttachments, pDepthStencilAttachment);
1699}
1700
1701XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdPrepareMemoryRegions(XGL_CMD_BUFFER cmdBuffer, XGL_UINT transitionCount, const XGL_MEMORY_STATE_TRANSITION* pStateTransitions)
1702{
1703 // TODO : Track memory state transitions
1704 // Flag incorrect transitions when states don't match
1705 XGL_GPU_MEMORY mem = pStateTransitions->mem;
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001706 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1707 char str[1024];
1708 sprintf(str, "In xglCmdPrepareMemoryRegions() call unable to update binding of mem %p to cmdBuffer %p", mem, cmdBuffer);
1709 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1710 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001711 nextTable.CmdPrepareMemoryRegions(cmdBuffer, transitionCount, pStateTransitions);
1712}
1713
1714XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdPrepareImages(XGL_CMD_BUFFER cmdBuffer, XGL_UINT transitionCount, const XGL_IMAGE_STATE_TRANSITION* pStateTransitions)
1715{
1716 // TODO : This will have an image object that's bound to memory in the pStateTransitions struct
1717 // Need to pull object based on image and then pull mem mapping from that object
1718 XGL_GPU_MEMORY mem = getMemBindingFromObject((XGL_OBJECT)pStateTransitions->image);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001719 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1720 char str[1024];
1721 sprintf(str, "In xglCmdPrepareImages() call unable to update binding of mem %p to cmdBuffer %p", mem, cmdBuffer);
1722 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1723 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001724 nextTable.CmdPrepareImages(cmdBuffer, transitionCount, pStateTransitions);
1725}
1726
1727XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDraw(XGL_CMD_BUFFER cmdBuffer, XGL_UINT firstVertex, XGL_UINT vertexCount, XGL_UINT firstInstance, XGL_UINT instanceCount)
1728{
1729 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
1730}
1731
1732XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDrawIndexed(XGL_CMD_BUFFER cmdBuffer, XGL_UINT firstIndex, XGL_UINT indexCount, XGL_INT vertexOffset, XGL_UINT firstInstance, XGL_UINT instanceCount)
1733{
1734 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
1735}
1736
1737XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDrawIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset, XGL_UINT32 count, XGL_UINT32 stride)
1738{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001739 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1740 char str[1024];
1741 sprintf(str, "In xglCmdDrawIndirect() call unable to update binding of mem %p to cmdBuffer %p", mem, cmdBuffer);
1742 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1743 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001744 nextTable.CmdDrawIndirect(cmdBuffer, mem, offset, count, stride);
1745}
1746
1747XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDrawIndexedIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset, XGL_UINT32 count, XGL_UINT32 stride)
1748{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001749 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1750 char str[1024];
1751 sprintf(str, "In xglCmdDrawIndexedIndirect() call unable to update binding of mem %p to cmdBuffer %p", mem, cmdBuffer);
1752 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1753 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001754 nextTable.CmdDrawIndexedIndirect(cmdBuffer, mem, offset, count, stride);
1755}
1756
1757XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDispatch(XGL_CMD_BUFFER cmdBuffer, XGL_UINT x, XGL_UINT y, XGL_UINT z)
1758{
1759 nextTable.CmdDispatch(cmdBuffer, x, y, z);
1760}
1761
1762XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset)
1763{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001764 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1765 char str[1024];
1766 sprintf(str, "In xglCmdDispatchIndirect() call unable to update binding of mem %p to cmdBuffer %p", mem, cmdBuffer);
1767 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1768 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001769 nextTable.CmdDispatchIndirect(cmdBuffer, mem, offset);
1770}
1771
1772XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdCopyMemory(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY srcMem, XGL_GPU_MEMORY destMem, XGL_UINT regionCount, const XGL_MEMORY_COPY* pRegions)
1773{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001774 if (XGL_FALSE == updateCBBinding(cmdBuffer, srcMem)) {
1775 char str[1024];
1776 sprintf(str, "In xglCmdCopyMemory() call unable to update binding of srcMem %p to cmdBuffer %p", srcMem, cmdBuffer);
1777 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1778 }
1779 if (XGL_FALSE == updateCBBinding(cmdBuffer, destMem)) {
1780 char str[1024];
1781 sprintf(str, "In xglCmdCopyMemory() call unable to update binding of destMem %p to cmdBuffer %p", destMem, cmdBuffer);
1782 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1783 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001784 nextTable.CmdCopyMemory(cmdBuffer, srcMem, destMem, regionCount, pRegions);
1785}
1786
1787XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdCopyImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, XGL_UINT regionCount, const XGL_IMAGE_COPY* pRegions)
1788{
1789 // TODO : Each image will have mem mapping so track them
1790 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
1791}
1792
1793XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdCopyMemoryToImage(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY srcMem, XGL_IMAGE destImage, XGL_UINT regionCount, const XGL_MEMORY_IMAGE_COPY* pRegions)
1794{
1795 // TODO : Track this
1796 XGL_GPU_MEMORY mem = getMemBindingFromObject(destImage);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001797 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1798 char str[1024];
1799 sprintf(str, "In xglCmdCopyMemoryToImage() call unable to update binding of destImage mem %p to cmdBuffer %p", mem, cmdBuffer);
1800 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1801 }
1802 if (XGL_FALSE == updateCBBinding(cmdBuffer, srcMem)) {
1803 char str[1024];
1804 sprintf(str, "In xglCmdCopyMemoryToImage() call unable to update binding of srcMem %p to cmdBuffer %p", srcMem, cmdBuffer);
1805 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1806 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001807 nextTable.CmdCopyMemoryToImage(cmdBuffer, srcMem, destImage, regionCount, pRegions);
1808}
1809
1810XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdCopyImageToMemory(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_GPU_MEMORY destMem, XGL_UINT regionCount, const XGL_MEMORY_IMAGE_COPY* pRegions)
1811{
1812 // TODO : Track this
1813 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001814 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1815 char str[1024];
1816 sprintf(str, "In xglCmdCopyImageToMemory() call unable to update binding of srcImage mem %p to cmdBuffer %p", mem, cmdBuffer);
1817 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1818 }
1819 if (XGL_FALSE == updateCBBinding(cmdBuffer, destMem)) {
1820 char str[1024];
1821 sprintf(str, "In xglCmdCopyImageToMemory() call unable to update binding of destMem %p to cmdBuffer %p", destMem, cmdBuffer);
1822 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1823 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001824 nextTable.CmdCopyImageToMemory(cmdBuffer, srcImage, destMem, regionCount, pRegions);
1825}
1826
1827XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdCloneImageData(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE_STATE srcImageState, XGL_IMAGE destImage, XGL_IMAGE_STATE destImageState)
1828{
1829 // TODO : Each image will have mem mapping so track them
1830 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001831 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1832 char str[1024];
1833 sprintf(str, "In xglCmdCloneImageData() call unable to update binding of srcImage mem %p to cmdBuffer %p", mem, cmdBuffer);
1834 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1835 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001836 mem = getMemBindingFromObject(destImage);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001837 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1838 char str[1024];
1839 sprintf(str, "In xglCmdCloneImageData() call unable to update binding of destImage mem %p to cmdBuffer %p", mem, cmdBuffer);
1840 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1841 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001842 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageState, destImage, destImageState);
1843}
1844
1845XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdUpdateMemory(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY destMem, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const XGL_UINT32* pData)
1846{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001847 if (XGL_FALSE == updateCBBinding(cmdBuffer, destMem)) {
1848 char str[1024];
1849 sprintf(str, "In xglCmdUpdateMemory() call unable to update binding of destMem %p to cmdBuffer %p", destMem, cmdBuffer);
1850 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1851 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001852 nextTable.CmdUpdateMemory(cmdBuffer, destMem, destOffset, dataSize, pData);
1853}
1854
1855XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdFillMemory(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY destMem, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, XGL_UINT32 data)
1856{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001857 if (XGL_FALSE == updateCBBinding(cmdBuffer, destMem)) {
1858 char str[1024];
1859 sprintf(str, "In xglCmdFillMemory() call unable to update binding of destMem %p to cmdBuffer %p", destMem, cmdBuffer);
1860 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1861 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001862 nextTable.CmdFillMemory(cmdBuffer, destMem, destOffset, fillSize, data);
1863}
1864
1865XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdClearColorImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const XGL_FLOAT color[4], XGL_UINT rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
1866{
1867 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001868 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1869 char str[1024];
1870 sprintf(str, "In xglCmdClearColorImage() call unable to update binding of image mem %p to cmdBuffer %p", mem, cmdBuffer);
1871 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1872 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001873 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
1874}
1875
1876XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdClearColorImageRaw(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const XGL_UINT32 color[4], XGL_UINT rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
1877{
1878 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001879 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1880 char str[1024];
1881 sprintf(str, "In xglCmdClearColorImageRaw() call unable to update binding of image mem %p to cmdBuffer %p", mem, cmdBuffer);
1882 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1883 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001884 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
1885}
1886
1887XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdClearDepthStencil(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, XGL_FLOAT depth, XGL_UINT32 stencil, XGL_UINT rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
1888{
1889 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001890 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1891 char str[1024];
1892 sprintf(str, "In xglCmdClearDepthStencil() call unable to update binding of image mem %p to cmdBuffer %p", mem, cmdBuffer);
1893 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1894 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001895 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
1896}
1897
1898XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdResolveImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, XGL_UINT rectCount, const XGL_IMAGE_RESOLVE* pRects)
1899{
1900 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001901 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1902 char str[1024];
1903 sprintf(str, "In xglCmdResolveImage() call unable to update binding of srcImage mem %p to cmdBuffer %p", mem, cmdBuffer);
1904 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1905 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001906 mem = getMemBindingFromObject(destImage);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001907 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1908 char str[1024];
1909 sprintf(str, "In xglCmdResolveImage() call unable to update binding of destImage mem %p to cmdBuffer %p", mem, cmdBuffer);
1910 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1911 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001912 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
1913}
1914
1915XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
1916{
1917 nextTable.CmdSetEvent(cmdBuffer, event);
1918}
1919
1920XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
1921{
1922 nextTable.CmdResetEvent(cmdBuffer, event);
1923}
1924
1925XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdMemoryAtomic(XGL_CMD_BUFFER cmdBuffer, XGL_GPU_MEMORY destMem, XGL_GPU_SIZE destOffset, XGL_UINT64 srcData, XGL_ATOMIC_OP atomicOp)
1926{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001927 if (XGL_FALSE == updateCBBinding(cmdBuffer, destMem)) {
1928 char str[1024];
1929 sprintf(str, "In xglCmdMemoryAtomic() call unable to update binding of destMem %p to cmdBuffer %p", destMem, cmdBuffer);
1930 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1931 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001932 nextTable.CmdMemoryAtomic(cmdBuffer, destMem, destOffset, srcData, atomicOp);
1933}
1934
1935XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdBeginQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, XGL_UINT slot, XGL_FLAGS flags)
1936{
1937 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001938 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1939 char str[1024];
1940 sprintf(str, "In xglCmdBeginQuery() call unable to update binding of queryPool mem %p to cmdBuffer %p", mem, cmdBuffer);
1941 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1942 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001943 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
1944}
1945
1946XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, XGL_UINT slot)
1947{
1948 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001949 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1950 char str[1024];
1951 sprintf(str, "In xglCmdEndQuery() call unable to update binding of queryPool mem %p to cmdBuffer %p", mem, cmdBuffer);
1952 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1953 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001954 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
1955}
1956
1957XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdResetQueryPool(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, XGL_UINT startQuery, XGL_UINT queryCount)
1958{
1959 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001960 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1961 char str[1024];
1962 sprintf(str, "In xglCmdResetQueryPool() call unable to update binding of queryPool mem %p to cmdBuffer %p", mem, cmdBuffer);
1963 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1964 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001965 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
1966}
1967
1968XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdWriteTimestamp(XGL_CMD_BUFFER cmdBuffer, XGL_TIMESTAMP_TYPE timestampType, XGL_GPU_MEMORY destMem, XGL_GPU_SIZE destOffset)
1969{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001970 if (XGL_FALSE == updateCBBinding(cmdBuffer, destMem)) {
1971 char str[1024];
1972 sprintf(str, "In xglCmdWriteTimestamp() call unable to update binding of destMem %p to cmdBuffer %p", destMem, cmdBuffer);
1973 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1974 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001975 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destMem, destOffset);
1976}
1977
1978XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdInitAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_UINT startCounter, XGL_UINT counterCount, const XGL_UINT32* pData)
1979{
1980 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
1981}
1982
1983XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdLoadAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_UINT startCounter, XGL_UINT counterCount, XGL_GPU_MEMORY srcMem, XGL_GPU_SIZE srcOffset)
1984{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001985 if (XGL_FALSE == updateCBBinding(cmdBuffer, srcMem)) {
1986 char str[1024];
1987 sprintf(str, "In xglCmdLoadAtomicCounters() call unable to update binding of srcMem %p to cmdBuffer %p", srcMem, cmdBuffer);
1988 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1989 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07001990 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcMem, srcOffset);
1991}
1992
1993XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdSaveAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_UINT startCounter, XGL_UINT counterCount, XGL_GPU_MEMORY destMem, XGL_GPU_SIZE destOffset)
1994{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07001995 if (XGL_FALSE == updateCBBinding(cmdBuffer, destMem)) {
1996 char str[1024];
1997 sprintf(str, "In xglCmdSaveAtomicCounters() call unable to update binding of destMem %p to cmdBuffer %p", destMem, cmdBuffer);
1998 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1999 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002000 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destMem, destOffset);
2001}
2002
2003XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
2004{
2005 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
2006 return result;
2007}
2008
2009XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData)
2010{
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002011 // This layer intercepts callbacks
2012 XGL_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
2013 if (!pNewDbgFuncNode)
2014 return XGL_ERROR_OUT_OF_MEMORY;
2015 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
2016 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07002017 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
2018 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis6663f492014-11-10 12:29:12 -07002019 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
2020 return result;
2021}
2022
2023XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
2024{
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07002025 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002026 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
2027 while (pTrav) {
2028 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
2029 pPrev->pNext = pTrav->pNext;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07002030 if (g_pDbgFunctionHead == pTrav)
2031 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002032 free(pTrav);
2033 break;
2034 }
2035 pPrev = pTrav;
2036 pTrav = pTrav->pNext;
2037 }
Tobin Ehlis6663f492014-11-10 12:29:12 -07002038 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
2039 return result;
2040}
2041
2042XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, XGL_INT msgCode, XGL_DBG_MSG_FILTER filter)
2043{
2044 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
2045 return result;
2046}
2047
2048XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, XGL_SIZE tagSize, const XGL_VOID* pTag)
2049{
2050 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
2051 return result;
2052}
2053
2054XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData)
2055{
2056 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
2057 return result;
2058}
2059
2060XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetDeviceOption(XGL_DEVICE device, XGL_DBG_DEVICE_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData)
2061{
2062 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
2063 return result;
2064}
2065
2066XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const XGL_CHAR* pMarker)
2067{
2068 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
2069}
2070
2071XGL_LAYER_EXPORT XGL_VOID XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
2072{
2073 nextTable.CmdDbgMarkerEnd(cmdBuffer);
2074}
2075
2076XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
2077{
2078 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis6663f492014-11-10 12:29:12 -07002079 pCurObj = gpuw;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07002080 pthread_once(&g_initOnce, initMemTracker);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002081 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002082 return result;
2083}
2084
Tobin Ehlis61f36c92014-11-11 08:00:58 -07002085XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11GetMSC(XGL_DEVICE device, xcb_window_t window, xcb_randr_crtc_t crtc, XGL_UINT64* pMsc)
Tobin Ehlis6663f492014-11-10 12:29:12 -07002086{
Tobin Ehlis61f36c92014-11-11 08:00:58 -07002087 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002088 return result;
2089}
2090
2091XGL_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)
2092{
2093 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
Tobin Ehliscd9223b2014-11-19 16:19:28 -07002094 // First insert the new Mem Object and then bind it to created image
2095 insertGlobalMemObj(*pMem, NULL);
2096 if (XGL_FALSE == updateObjectBinding(*pImage, *pMem)) {
2097 char str[1024];
2098 sprintf(str, "In xglWsiX11CreatePresentableImage(), unable to set image %p binding to mem obj %p", (void*)*pImage, (void*)*pMem);
2099 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pImage, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
2100 }
2101 printObjList();
2102 printMemList();
Tobin Ehlis6663f492014-11-10 12:29:12 -07002103 return result;
2104}
2105
2106XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
2107{
2108 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
2109 return result;
2110}
2111
2112XGL_LAYER_EXPORT XGL_VOID* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const XGL_CHAR* funcName)
2113{
2114 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
2115 if (gpu == NULL)
2116 return NULL;
2117 pCurObj = gpuw;
Jon Ashburn7d7b3cf2014-12-22 13:24:15 -07002118 pthread_once(&g_initOnce, initMemTracker);
Tobin Ehlis6663f492014-11-10 12:29:12 -07002119
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002120 if (!strncmp("xglGetProcAddr", funcName, sizeof("xglGetProcAddr")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002121 return xglGetProcAddr;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002122 else if (!strncmp("xglInitAndEnumerateGpus", funcName, sizeof("xglInitAndEnumerateGpus")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002123 return nextTable.InitAndEnumerateGpus;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002124 else if (!strncmp("xglGetGpuInfo", funcName, sizeof("xglGetGpuInfo")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002125 return xglGetGpuInfo;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002126 else if (!strncmp("xglCreateDevice", funcName, sizeof("xglCreateDevice")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002127 return xglCreateDevice;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002128 else if (!strncmp("xglDestroyDevice", funcName, sizeof("xglDestroyDevice")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002129 return xglDestroyDevice;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002130 else if (!strncmp("xglGetExtensionSupport", funcName, sizeof("xglGetExtensionSupport")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002131 return xglGetExtensionSupport;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002132 else if (!strncmp("xglEnumerateLayers", funcName, sizeof("xglEnumerateLayers")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002133 return xglEnumerateLayers;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002134 else if (!strncmp("xglGetDeviceQueue", funcName, sizeof("xglGetDeviceQueue")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002135 return xglGetDeviceQueue;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002136 else if (!strncmp("xglQueueSubmit", funcName, sizeof("xglQueueSubmit")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002137 return xglQueueSubmit;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002138 else if (!strncmp("xglQueueSetGlobalMemReferences", funcName, sizeof("xglQueueSetGlobalMemReferences")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002139 return xglQueueSetGlobalMemReferences;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002140 else if (!strncmp("xglQueueWaitIdle", funcName, sizeof("xglQueueWaitIdle")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002141 return xglQueueWaitIdle;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002142 else if (!strncmp("xglDeviceWaitIdle", funcName, sizeof("xglDeviceWaitIdle")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002143 return xglDeviceWaitIdle;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002144 else if (!strncmp("xglGetMemoryHeapCount", funcName, sizeof("xglGetMemoryHeapCount")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002145 return xglGetMemoryHeapCount;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002146 else if (!strncmp("xglGetMemoryHeapInfo", funcName, sizeof("xglGetMemoryHeapInfo")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002147 return xglGetMemoryHeapInfo;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002148 else if (!strncmp("xglAllocMemory", funcName, sizeof("xglAllocMemory")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002149 return xglAllocMemory;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002150 else if (!strncmp("xglFreeMemory", funcName, sizeof("xglFreeMemory")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002151 return xglFreeMemory;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002152 else if (!strncmp("xglSetMemoryPriority", funcName, sizeof("xglSetMemoryPriority")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002153 return xglSetMemoryPriority;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002154 else if (!strncmp("xglMapMemory", funcName, sizeof("xglMapMemory")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002155 return xglMapMemory;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002156 else if (!strncmp("xglUnmapMemory", funcName, sizeof("xglUnmapMemory")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002157 return xglUnmapMemory;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002158 else if (!strncmp("xglPinSystemMemory", funcName, sizeof("xglPinSystemMemory")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002159 return xglPinSystemMemory;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002160 else if (!strncmp("xglRemapVirtualMemoryPages", funcName, sizeof("xglRemapVirtualMemoryPages")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002161 return xglRemapVirtualMemoryPages;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002162 else if (!strncmp("xglGetMultiGpuCompatibility", funcName, sizeof("xglGetMultiGpuCompatibility")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002163 return xglGetMultiGpuCompatibility;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002164 else if (!strncmp("xglOpenSharedMemory", funcName, sizeof("xglOpenSharedMemory")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002165 return xglOpenSharedMemory;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002166 else if (!strncmp("xglOpenSharedQueueSemaphore", funcName, sizeof("xglOpenSharedQueueSemaphore")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002167 return xglOpenSharedQueueSemaphore;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002168 else if (!strncmp("xglOpenPeerMemory", funcName, sizeof("xglOpenPeerMemory")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002169 return xglOpenPeerMemory;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002170 else if (!strncmp("xglOpenPeerImage", funcName, sizeof("xglOpenPeerImage")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002171 return xglOpenPeerImage;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002172 else if (!strncmp("xglDestroyObject", funcName, sizeof("xglDestroyObject")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002173 return xglDestroyObject;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002174 else if (!strncmp("xglGetObjectInfo", funcName, sizeof("xglGetObjectInfo")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002175 return xglGetObjectInfo;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002176 else if (!strncmp("xglBindObjectMemory", funcName, sizeof("xglBindObjectMemory")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002177 return xglBindObjectMemory;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002178 else if (!strncmp("xglCreateFence", funcName, sizeof("xglCreateFence")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002179 return xglCreateFence;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002180 else if (!strncmp("xglGetFenceStatus", funcName, sizeof("xglGetFenceStatus")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002181 return xglGetFenceStatus;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002182 else if (!strncmp("xglWaitForFences", funcName, sizeof("xglWaitForFences")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002183 return xglWaitForFences;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002184 else if (!strncmp("xglCreateQueueSemaphore", funcName, sizeof("xglCreateQueueSemaphore")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002185 return xglCreateQueueSemaphore;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002186 else if (!strncmp("xglSignalQueueSemaphore", funcName, sizeof("xglSignalQueueSemaphore")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002187 return xglSignalQueueSemaphore;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002188 else if (!strncmp("xglWaitQueueSemaphore", funcName, sizeof("xglWaitQueueSemaphore")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002189 return xglWaitQueueSemaphore;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002190 else if (!strncmp("xglCreateEvent", funcName, sizeof("xglCreateEvent")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002191 return xglCreateEvent;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002192 else if (!strncmp("xglGetEventStatus", funcName, sizeof("xglGetEventStatus")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002193 return xglGetEventStatus;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002194 else if (!strncmp("xglSetEvent", funcName, sizeof("xglSetEvent")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002195 return xglSetEvent;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002196 else if (!strncmp("xglResetEvent", funcName, sizeof("xglResetEvent")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002197 return xglResetEvent;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002198 else if (!strncmp("xglCreateQueryPool", funcName, sizeof("xglCreateQueryPool")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002199 return xglCreateQueryPool;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002200 else if (!strncmp("xglGetQueryPoolResults", funcName, sizeof("xglGetQueryPoolResults")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002201 return xglGetQueryPoolResults;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002202 else if (!strncmp("xglGetFormatInfo", funcName, sizeof("xglGetFormatInfo")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002203 return xglGetFormatInfo;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002204 else if (!strncmp("xglCreateImage", funcName, sizeof("xglCreateImage")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002205 return xglCreateImage;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002206 else if (!strncmp("xglGetImageSubresourceInfo", funcName, sizeof("xglGetImageSubresourceInfo")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002207 return xglGetImageSubresourceInfo;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002208 else if (!strncmp("xglCreateImageView", funcName, sizeof("xglCreateImageView")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002209 return xglCreateImageView;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002210 else if (!strncmp("xglCreateColorAttachmentView", funcName, sizeof("xglCreateColorAttachmentView")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002211 return xglCreateColorAttachmentView;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002212 else if (!strncmp("xglCreateDepthStencilView", funcName, sizeof("xglCreateDepthStencilView")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002213 return xglCreateDepthStencilView;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002214 else if (!strncmp("xglCreateShader", funcName, sizeof("xglCreateShader")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002215 return xglCreateShader;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002216 else if (!strncmp("xglCreateGraphicsPipeline", funcName, sizeof("xglCreateGraphicsPipeline")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002217 return xglCreateGraphicsPipeline;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002218 else if (!strncmp("xglCreateComputePipeline", funcName, sizeof("xglCreateComputePipeline")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002219 return xglCreateComputePipeline;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002220 else if (!strncmp("xglStorePipeline", funcName, sizeof("xglStorePipeline")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002221 return xglStorePipeline;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002222 else if (!strncmp("xglLoadPipeline", funcName, sizeof("xglLoadPipeline")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002223 return xglLoadPipeline;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002224 else if (!strncmp("xglCreatePipelineDelta", funcName, sizeof("xglCreatePipelineDelta")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002225 return xglCreatePipelineDelta;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002226 else if (!strncmp("xglCreateSampler", funcName, sizeof("xglCreateSampler")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002227 return xglCreateSampler;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002228 else if (!strncmp("xglCreateDescriptorSet", funcName, sizeof("xglCreateDescriptorSet")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002229 return xglCreateDescriptorSet;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002230 else if (!strncmp("xglBeginDescriptorSetUpdate", funcName, sizeof("xglBeginDescriptorSetUpdate")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002231 return xglBeginDescriptorSetUpdate;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002232 else if (!strncmp("xglEndDescriptorSetUpdate", funcName, sizeof("xglEndDescriptorSetUpdate")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002233 return xglEndDescriptorSetUpdate;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002234 else if (!strncmp("xglAttachSamplerDescriptors", funcName, sizeof("xglAttachSamplerDescriptors")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002235 return xglAttachSamplerDescriptors;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002236 else if (!strncmp("xglAttachImageViewDescriptors", funcName, sizeof("xglAttachImageViewDescriptors")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002237 return xglAttachImageViewDescriptors;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002238 else if (!strncmp("xglAttachMemoryViewDescriptors", funcName, sizeof("xglAttachMemoryViewDescriptors")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002239 return xglAttachMemoryViewDescriptors;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002240 else if (!strncmp("xglAttachNestedDescriptors", funcName, sizeof("xglAttachNestedDescriptors")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002241 return xglAttachNestedDescriptors;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002242 else if (!strncmp("xglClearDescriptorSetSlots", funcName, sizeof("xglClearDescriptorSetSlots")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002243 return xglClearDescriptorSetSlots;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002244 else if (!strncmp("xglCreateViewportState", funcName, sizeof("xglCreateViewportState")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002245 return xglCreateViewportState;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002246 else if (!strncmp("xglCreateRasterState", funcName, sizeof("xglCreateRasterState")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002247 return xglCreateRasterState;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002248 else if (!strncmp("xglCreateMsaaState", funcName, sizeof("xglCreateMsaaState")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002249 return xglCreateMsaaState;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002250 else if (!strncmp("xglCreateColorBlendState", funcName, sizeof("xglCreateColorBlendState")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002251 return xglCreateColorBlendState;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002252 else if (!strncmp("xglCreateDepthStencilState", funcName, sizeof("xglCreateDepthStencilState")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002253 return xglCreateDepthStencilState;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002254 else if (!strncmp("xglCreateCommandBuffer", funcName, sizeof("xglCreateCommandBuffer")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002255 return xglCreateCommandBuffer;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002256 else if (!strncmp("xglBeginCommandBuffer", funcName, sizeof("xglBeginCommandBuffer")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002257 return xglBeginCommandBuffer;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002258 else if (!strncmp("xglEndCommandBuffer", funcName, sizeof("xglEndCommandBuffer")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002259 return xglEndCommandBuffer;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002260 else if (!strncmp("xglResetCommandBuffer", funcName, sizeof("xglResetCommandBuffer")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002261 return xglResetCommandBuffer;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002262 else if (!strncmp("xglCmdBindPipeline", funcName, sizeof("xglCmdBindPipeline")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002263 return xglCmdBindPipeline;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002264 else if (!strncmp("xglCmdBindPipelineDelta", funcName, sizeof("xglCmdBindPipelineDelta")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002265 return xglCmdBindPipelineDelta;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002266 else if (!strncmp("xglCmdBindStateObject", funcName, sizeof("xglCmdBindStateObject")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002267 return xglCmdBindStateObject;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002268 else if (!strncmp("xglCmdBindDescriptorSet", funcName, sizeof("xglCmdBindDescriptorSet")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002269 return xglCmdBindDescriptorSet;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002270 else if (!strncmp("xglCmdBindDynamicMemoryView", funcName, sizeof("xglCmdBindDynamicMemoryView")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002271 return xglCmdBindDynamicMemoryView;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002272 else if (!strncmp("xglCmdBindIndexData", funcName, sizeof("xglCmdBindIndexData")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002273 return xglCmdBindIndexData;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002274 else if (!strncmp("xglCmdBindAttachments", funcName, sizeof("xglCmdBindAttachments")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002275 return xglCmdBindAttachments;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002276 else if (!strncmp("xglCmdPrepareMemoryRegions", funcName, sizeof("xglCmdPrepareMemoryRegions")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002277 return xglCmdPrepareMemoryRegions;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002278 else if (!strncmp("xglCmdPrepareImages", funcName, sizeof("xglCmdPrepareImages")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002279 return xglCmdPrepareImages;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002280 else if (!strncmp("xglCmdDraw", funcName, sizeof("xglCmdDraw")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002281 return xglCmdDraw;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002282 else if (!strncmp("xglCmdDrawIndexed", funcName, sizeof("xglCmdDrawIndexed")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002283 return xglCmdDrawIndexed;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002284 else if (!strncmp("xglCmdDrawIndirect", funcName, sizeof("xglCmdDrawIndirect")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002285 return xglCmdDrawIndirect;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002286 else if (!strncmp("xglCmdDrawIndexedIndirect", funcName, sizeof("xglCmdDrawIndexedIndirect")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002287 return xglCmdDrawIndexedIndirect;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002288 else if (!strncmp("xglCmdDispatch", funcName, sizeof("xglCmdDispatch")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002289 return xglCmdDispatch;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002290 else if (!strncmp("xglCmdDispatchIndirect", funcName, sizeof("xglCmdDispatchIndirect")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002291 return xglCmdDispatchIndirect;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002292 else if (!strncmp("xglCmdCopyMemory", funcName, sizeof("xglCmdCopyMemory")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002293 return xglCmdCopyMemory;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002294 else if (!strncmp("xglCmdCopyImage", funcName, sizeof("xglCmdCopyImage")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002295 return xglCmdCopyImage;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002296 else if (!strncmp("xglCmdCopyMemoryToImage", funcName, sizeof("xglCmdCopyMemoryToImage")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002297 return xglCmdCopyMemoryToImage;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002298 else if (!strncmp("xglCmdCopyImageToMemory", funcName, sizeof("xglCmdCopyImageToMemory")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002299 return xglCmdCopyImageToMemory;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002300 else if (!strncmp("xglCmdCloneImageData", funcName, sizeof("xglCmdCloneImageData")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002301 return xglCmdCloneImageData;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002302 else if (!strncmp("xglCmdUpdateMemory", funcName, sizeof("xglCmdUpdateMemory")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002303 return xglCmdUpdateMemory;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002304 else if (!strncmp("xglCmdFillMemory", funcName, sizeof("xglCmdFillMemory")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002305 return xglCmdFillMemory;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002306 else if (!strncmp("xglCmdClearColorImage", funcName, sizeof("xglCmdClearColorImage")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002307 return xglCmdClearColorImage;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002308 else if (!strncmp("xglCmdClearColorImageRaw", funcName, sizeof("xglCmdClearColorImageRaw")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002309 return xglCmdClearColorImageRaw;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002310 else if (!strncmp("xglCmdClearDepthStencil", funcName, sizeof("xglCmdClearDepthStencil")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002311 return xglCmdClearDepthStencil;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002312 else if (!strncmp("xglCmdResolveImage", funcName, sizeof("xglCmdResolveImage")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002313 return xglCmdResolveImage;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002314 else if (!strncmp("xglCmdSetEvent", funcName, sizeof("xglCmdSetEvent")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002315 return xglCmdSetEvent;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002316 else if (!strncmp("xglCmdResetEvent", funcName, sizeof("xglCmdResetEvent")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002317 return xglCmdResetEvent;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002318 else if (!strncmp("xglCmdMemoryAtomic", funcName, sizeof("xglCmdMemoryAtomic")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002319 return xglCmdMemoryAtomic;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002320 else if (!strncmp("xglCmdBeginQuery", funcName, sizeof("xglCmdBeginQuery")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002321 return xglCmdBeginQuery;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002322 else if (!strncmp("xglCmdEndQuery", funcName, sizeof("xglCmdEndQuery")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002323 return xglCmdEndQuery;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002324 else if (!strncmp("xglCmdResetQueryPool", funcName, sizeof("xglCmdResetQueryPool")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002325 return xglCmdResetQueryPool;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002326 else if (!strncmp("xglCmdWriteTimestamp", funcName, sizeof("xglCmdWriteTimestamp")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002327 return xglCmdWriteTimestamp;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002328 else if (!strncmp("xglCmdInitAtomicCounters", funcName, sizeof("xglCmdInitAtomicCounters")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002329 return xglCmdInitAtomicCounters;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002330 else if (!strncmp("xglCmdLoadAtomicCounters", funcName, sizeof("xglCmdLoadAtomicCounters")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002331 return xglCmdLoadAtomicCounters;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002332 else if (!strncmp("xglCmdSaveAtomicCounters", funcName, sizeof("xglCmdSaveAtomicCounters")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002333 return xglCmdSaveAtomicCounters;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002334 else if (!strncmp("xglDbgSetValidationLevel", funcName, sizeof("xglDbgSetValidationLevel")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002335 return xglDbgSetValidationLevel;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002336 else if (!strncmp("xglDbgRegisterMsgCallback", funcName, sizeof("xglDbgRegisterMsgCallback")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002337 return xglDbgRegisterMsgCallback;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002338 else if (!strncmp("xglDbgUnregisterMsgCallback", funcName, sizeof("xglDbgUnregisterMsgCallback")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002339 return xglDbgUnregisterMsgCallback;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002340 else if (!strncmp("xglDbgSetMessageFilter", funcName, sizeof("xglDbgSetMessageFilter")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002341 return xglDbgSetMessageFilter;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002342 else if (!strncmp("xglDbgSetObjectTag", funcName, sizeof("xglDbgSetObjectTag")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002343 return xglDbgSetObjectTag;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002344 else if (!strncmp("xglDbgSetGlobalOption", funcName, sizeof("xglDbgSetGlobalOption")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002345 return xglDbgSetGlobalOption;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002346 else if (!strncmp("xglDbgSetDeviceOption", funcName, sizeof("xglDbgSetDeviceOption")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002347 return xglDbgSetDeviceOption;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002348 else if (!strncmp("xglCmdDbgMarkerBegin", funcName, sizeof("xglCmdDbgMarkerBegin")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002349 return xglCmdDbgMarkerBegin;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002350 else if (!strncmp("xglCmdDbgMarkerEnd", funcName, sizeof("xglCmdDbgMarkerEnd")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002351 return xglCmdDbgMarkerEnd;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002352 else if (!strncmp("xglWsiX11AssociateConnection", funcName, sizeof("xglWsiX11AssociateConnection")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002353 return xglWsiX11AssociateConnection;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002354 else if (!strncmp("xglWsiX11GetMSC", funcName, sizeof("xglWsiX11GetMSC")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002355 return xglWsiX11GetMSC;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002356 else if (!strncmp("xglWsiX11CreatePresentableImage", funcName, sizeof("xglWsiX11CreatePresentableImage")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002357 return xglWsiX11CreatePresentableImage;
Chia-I Wuf1a5a742014-12-27 15:16:07 +08002358 else if (!strncmp("xglWsiX11QueuePresent", funcName, sizeof("xglWsiX11QueuePresent")))
Tobin Ehlis6663f492014-11-10 12:29:12 -07002359 return xglWsiX11QueuePresent;
2360 else {
2361 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
2362 if (gpuw->pGPA == NULL)
2363 return NULL;
2364 return gpuw->pGPA(gpuw->nextObject, funcName);
2365 }
2366}