blob: df2cdd73061db06b713c71e67f3491281b6505d7 [file] [log] [blame]
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001/*
2 * XGL
3 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28#include <assert.h>
Ian Elliott81ac44c2015-01-13 17:52:38 -070029#include "loader_platform.h"
Chia-I Wu0f65b1e2015-01-04 23:11:43 +080030#include "xgl_dispatch_table_helper.h"
Chia-I Wu706533e2015-01-05 13:18:57 +080031#include "xgl_generic_intercept_proc_helper.h"
Tobin Ehlis791a49c2014-11-10 12:29:12 -070032#include "xgl_struct_string_helper.h"
Tobin Ehlis62086412014-11-19 16:19:28 -070033#include "mem_tracker.h"
Jon Ashburnf57ea372014-12-22 13:24:15 -070034#include "layers_config.h"
Ian Elliott20f06872015-02-12 17:08:34 -070035// The following is #included again to catch certain OS-specific functions
36// being used:
37#include "loader_platform.h"
Jon Ashburn5a7be202015-02-16 08:46:53 -070038#include "layers_msg.h"
Tobin Ehlis791a49c2014-11-10 12:29:12 -070039
40static XGL_LAYER_DISPATCH_TABLE nextTable;
41static XGL_BASE_LAYER_OBJECT *pCurObj;
Ian Elliott81ac44c2015-01-13 17:52:38 -070042static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce);
Jon Ashburnf57ea372014-12-22 13:24:15 -070043
Jon Ashburnf57ea372014-12-22 13:24:15 -070044
Tobin Ehlis2836a7d2015-01-08 15:22:32 -070045#define MAX_BINDING 0xFFFFFFFF
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060046static uint32_t lastVtxBinding = MAX_BINDING;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -070047
Tobin Ehlis791a49c2014-11-10 12:29:12 -070048static GLOBAL_CB_NODE* pGlobalCBHead = NULL;
49static GLOBAL_MEM_OBJ_NODE* pGlobalMemObjHead = NULL;
50static GLOBAL_OBJECT_NODE* pGlobalObjectHead = NULL;
51static XGL_DEVICE globalDevice = NULL;
Tobin Ehlis62086412014-11-19 16:19:28 -070052static uint64_t numCBNodes = 0;
53static uint64_t numMemObjNodes = 0;
54static uint64_t numObjectNodes = 0;
Mark Lobodzinski15427102015-02-18 16:38:17 -060055
Tobin Ehlis791a49c2014-11-10 12:29:12 -070056// Check list for data and if it's not included insert new node
57// into HEAD of list pointed to by pHEAD & update pHEAD
Tobin Ehlis62086412014-11-19 16:19:28 -070058// Increment 'insert' if new node was inserted
Tobin Ehlis791a49c2014-11-10 12:29:12 -070059// return XGL_SUCCESS if no errors occur
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060060static XGL_RESULT insertMiniNode(MINI_NODE** pHEAD, const XGL_BASE_OBJECT data, uint32_t* insert)
Tobin Ehlis791a49c2014-11-10 12:29:12 -070061{
62 MINI_NODE* pTrav = *pHEAD;
63 while (pTrav && (pTrav->data != data)) {
64 pTrav = pTrav->pNext;
65 }
66 if (!pTrav) { // Add node to front of LL
67 pTrav = (MINI_NODE*)malloc(sizeof(MINI_NODE));
68 if (!pTrav)
69 return XGL_ERROR_OUT_OF_MEMORY;
70 memset(pTrav, 0, sizeof(MINI_NODE));
71 if (*pHEAD)
72 pTrav->pNext = *pHEAD;
73 *pHEAD = pTrav;
74 *insert += 1;
75 //pMemTrav->refCount++;
Tobin Ehlis62086412014-11-19 16:19:28 -070076 //sprintf(str, "MEM INFO : Incremented refCount for mem obj %p to %u", (void*)mem, pMemTrav->refCount);
Tobin Ehlis791a49c2014-11-10 12:29:12 -070077 }
78 if (pTrav->data) { // This is just FYI
79 assert(data == pTrav->data);
Tobin Ehlis62086412014-11-19 16:19:28 -070080 char str[1024];
81 sprintf(str, "Data %p is already in data LL w/ HEAD at %p", data, *pHEAD);
82 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, data, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -070083 }
84 pTrav->data = data;
85 return XGL_SUCCESS;
86}
87
88// Add new CB node for this cb at end of global CB LL
89static void insertGlobalCB(const XGL_CMD_BUFFER cb)
90{
91 GLOBAL_CB_NODE* pTrav = pGlobalCBHead;
92 if (!pTrav) {
93 pTrav = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE));
94 pGlobalCBHead = pTrav;
95 }
96 else {
97 while (NULL != pTrav->pNextGlobalCBNode)
98 pTrav = pTrav->pNextGlobalCBNode;
99 pTrav->pNextGlobalCBNode = (GLOBAL_CB_NODE*)malloc(sizeof(GLOBAL_CB_NODE));
100 pTrav = pTrav->pNextGlobalCBNode;
101 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700102 if (!pTrav) {
103 char str[1024];
104 sprintf(str, "Malloc failed to alloc node for Cmd Buffer %p", (void*)cb);
105 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
106 }
107 else {
108 numCBNodes++;
109 memset(pTrav, 0, sizeof(GLOBAL_CB_NODE));
110 pTrav->cmdBuffer = cb;
111 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700112}
113
114// Return ptr to node in global LL containing cb, or NULL if not found
115static GLOBAL_CB_NODE* getGlobalCBNode(const XGL_CMD_BUFFER cb)
116{
117 GLOBAL_CB_NODE* pTrav = pGlobalCBHead;
118 while (pTrav && (pTrav->cmdBuffer != cb))
119 pTrav = pTrav->pNextGlobalCBNode;
120 return pTrav;
121}
122// Set fence for given cb in global cb node
Mark Lobodzinski821b57f2015-02-25 18:11:05 -0600123static bool32_t setCBFence(const XGL_CMD_BUFFER cb, const XGL_FENCE fence, bool32_t localFlag)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700124{
125 GLOBAL_CB_NODE* pTrav = getGlobalCBNode(cb);
126 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700127 char str[1024];
128 sprintf(str, "Unable to find node for CB %p in order to set fence to %p", (void*)cb, (void*)fence);
129 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700130 return XGL_FALSE;
131 }
132 pTrav->fence = fence;
Mark Lobodzinski821b57f2015-02-25 18:11:05 -0600133 pTrav->localFlag = localFlag;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700134 return XGL_TRUE;
135}
136
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600137static bool32_t validateCBMemRef(const XGL_CMD_BUFFER cb, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700138{
139 GLOBAL_CB_NODE* pTrav = getGlobalCBNode(cb);
140 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700141 char str[1024];
142 sprintf(str, "Unable to find node for CB %p in order to check memory references", (void*)cb);
143 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700144 return XGL_FALSE;
145 }
146 // Validate that all actual references are accounted for in pMemRefs
147 MINI_NODE* pMemNode = pTrav->pMemObjList;
148 uint32_t i;
149 uint8_t found = 0;
150 uint64_t foundCount = 0;
151 while (pMemNode) {
152 // TODO : Improve this algorithm
153 for (i = 0; i < memRefCount; i++) {
154 if (pMemNode->mem == pMemRefs[i].mem) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700155 char str[1024];
156 sprintf(str, "Found Mem Obj %p binding to CB %p", pMemNode->mem, cb);
157 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700158 found = 1;
159 foundCount++;
Tobin Ehlisa747e682014-11-25 14:47:20 -0700160 break;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700161 }
162 }
163 if (!found) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700164 char str[1024];
165 sprintf(str, "Memory reference list for Command Buffer %p is missing ref to mem obj %p", cb, pMemNode->mem);
166 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_CB_MISSING_MEM_REF, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700167 return XGL_FALSE;
168 }
169 found = 0;
170 pMemNode = pMemNode->pNext;
171 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700172 char str[1024];
173 sprintf(str, "Verified all %lu memory dependencies for CB %p are included in pMemRefs list", foundCount, cb);
174 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700175 // TODO : Could report mem refs in pMemRefs that AREN'T in mem LL, that would be primarily informational
176 // Currently just noting that there is a difference
Tobin Ehlis62086412014-11-19 16:19:28 -0700177 if (foundCount != memRefCount) {
178 sprintf(str, "Note that %u mem refs included in pMemRefs list, but only %lu appear to be required", memRefCount, foundCount);
179 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
180 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700181 return XGL_TRUE;
182}
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700183// Return ptr to node in global LL containing mem, or NULL if not found
184static GLOBAL_MEM_OBJ_NODE* getGlobalMemNode(const XGL_GPU_MEMORY mem)
185{
186 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
187 while (pTrav && (pTrav->mem != mem))
188 pTrav = pTrav->pNextGlobalNode;
189 return pTrav;
190}
191
Mark Lobodzinski15427102015-02-18 16:38:17 -0600192static void insertGlobalMemObj(const XGL_GPU_MEMORY mem, const XGL_MEMORY_ALLOC_INFO* pAllocInfo)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700193{
194 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
195 if (!pTrav) {
196 pTrav = (GLOBAL_MEM_OBJ_NODE*)malloc(sizeof(GLOBAL_MEM_OBJ_NODE));
197 pGlobalMemObjHead = pTrav;
198 }
199 else {
200 while (NULL != pTrav->pNextGlobalNode)
201 pTrav = pTrav->pNextGlobalNode;
202 pTrav->pNextGlobalNode = (GLOBAL_MEM_OBJ_NODE*)malloc(sizeof(GLOBAL_MEM_OBJ_NODE));
203 pTrav = pTrav->pNextGlobalNode;
204 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700205 if (!pTrav) {
206 char str[1024];
207 sprintf(str, "Malloc failed to alloc node for Mem Object %p", (void*)mem);
208 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
209 }
210 else {
211 numMemObjNodes++;
212 memset(pTrav, 0, sizeof(GLOBAL_MEM_OBJ_NODE));
Mark Lobodzinski15427102015-02-18 16:38:17 -0600213 if (pAllocInfo) { // MEM alloc created by xglWsiX11CreatePresentableImage() doesn't have alloc info struct
Tobin Ehlis62086412014-11-19 16:19:28 -0700214 memcpy(&pTrav->allocInfo, pAllocInfo, sizeof(XGL_MEMORY_ALLOC_INFO));
Mark Lobodzinski15427102015-02-18 16:38:17 -0600215 // TODO: Update for real hardware, actually process allocation info structures
216 pTrav->allocInfo.pNext = NULL;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700217 }
Mark Lobodzinski15427102015-02-18 16:38:17 -0600218 pTrav->mem = mem;
Tobin Ehlis62086412014-11-19 16:19:28 -0700219 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700220}
221
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700222// Find Global CB Node and add mem binding to mini LL
223// Find Global Mem Obj Node and add CB binding to mini LL
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600224static bool32_t updateCBBinding(const XGL_CMD_BUFFER cb, const XGL_GPU_MEMORY mem)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700225{
226 // First update CB binding in MemObj mini CB list
227 GLOBAL_MEM_OBJ_NODE* pMemTrav = getGlobalMemNode(mem);
228 if (!pMemTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700229 char str[1024];
230 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);
231 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700232 return XGL_FALSE;
233 }
234
235 XGL_RESULT result = insertMiniNode(&pMemTrav->pCmdBufferBindings, cb, &pMemTrav->refCount);
Ian Elliott81ac44c2015-01-13 17:52:38 -0700236 if (XGL_SUCCESS != result) {
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700237 return result;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700238 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700239
240 // Now update Global CB's Mini Mem binding list
241 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cb);
242 if (!pCBTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700243 char str[1024];
244 sprintf(str, "Trying to bind mem obj %p to CB %p but no Node for that CB. Was it CB incorrectly destroyed?", mem, cb);
245 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700246 return XGL_FALSE;
247 }
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600248 uint32_t dontCare;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700249 result = insertMiniNode(&pCBTrav->pMemObjList, mem, &dontCare);
250 if (XGL_SUCCESS != result)
251 return result;
252
253 return XGL_TRUE;
254}
255// Clear the CB Binding for mem
256static void clearCBBinding(const XGL_CMD_BUFFER cb, const XGL_GPU_MEMORY mem)
257{
258 GLOBAL_MEM_OBJ_NODE* pTrav = getGlobalMemNode(mem);
259 MINI_NODE* pMiniCB = pTrav->pCmdBufferBindings;
260 MINI_NODE* pPrev = pMiniCB;
261 while (pMiniCB && (cb != pMiniCB->cmdBuffer)) {
262 pPrev = pMiniCB;
263 pMiniCB = pMiniCB->pNext;
264 }
265 if (!pMiniCB) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700266 char str[1024];
267 sprintf(str, "Trying to clear CB binding but CB %p not in binding list for mem obj %p", cb, mem);
268 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700269 }
270 else { // remove node from list & decrement refCount
271 pPrev->pNext = pMiniCB->pNext;
272 if (pMiniCB == pTrav->pCmdBufferBindings)
273 pTrav->pCmdBufferBindings = NULL;
274 free(pMiniCB);
275 pTrav->refCount--;
276 }
277}
278// Free bindings related to CB
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600279static bool32_t freeCBBindings(const XGL_CMD_BUFFER cb)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700280{
281 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cb);
282 if (!pCBTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700283 char str[1024];
284 sprintf(str, "Unable to find global CB node %p for deletion", cb);
285 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700286 return XGL_FALSE;
287 }
Mark Lobodzinski821b57f2015-02-25 18:11:05 -0600288 if ((pCBTrav->fence != NULL) && (pCBTrav->localFlag == XGL_TRUE)) {
289 nextTable.DestroyObject(pCBTrav->fence);
290 pCBTrav->fence = NULL;
291 pCBTrav->localFlag = XGL_FALSE;
292 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700293 MINI_NODE* pMemTrav = pCBTrav->pMemObjList;
294 MINI_NODE* pDeleteMe = NULL;
295 // We traverse LL in order and free nodes as they're cleared
296 while (pMemTrav) {
297 pDeleteMe = pMemTrav;
298 if (pMemTrav->mem)
299 clearCBBinding(cb, pMemTrav->mem);
300 pMemTrav = pMemTrav->pNext;
301 free(pDeleteMe);
302 }
303 pCBTrav->pMemObjList = NULL;
304 return XGL_TRUE;
305}
306// Delete Global CB Node from list along with all of it's mini mem obj node
307// and also clear Global mem references to CB
308// TODO : When should this be called? There's no Destroy of CBs that I see
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600309static bool32_t deleteGlobalCBNode(const XGL_CMD_BUFFER cb)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700310{
Ian Elliott81ac44c2015-01-13 17:52:38 -0700311 if (XGL_FALSE == freeCBBindings(cb)) {
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700312 return XGL_FALSE;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700313 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700314 // Delete the Global CB node
315 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cb);
316 pCBTrav = pGlobalCBHead;
317 GLOBAL_CB_NODE* pPrev = pCBTrav;
318 while (pCBTrav && (cb != pCBTrav->cmdBuffer)) {
319 pPrev = pCBTrav;
320 pCBTrav = pCBTrav->pNextGlobalCBNode;
321 }
322 assert(cb); // We found node at start of function so it should still be here
323 pPrev->pNextGlobalCBNode = pCBTrav->pNextGlobalCBNode;
324 if (pCBTrav == pGlobalCBHead)
325 pGlobalCBHead = pCBTrav->pNextGlobalCBNode;
326 free(pCBTrav);
327 return XGL_TRUE;
328}
329// Delete the entire CB list
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600330static bool32_t deleteGlobalCBList()
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700331{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600332 bool32_t result = XGL_TRUE;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700333 GLOBAL_CB_NODE* pCBTrav = pGlobalCBHead;
334 while (pCBTrav) {
Tobin Ehlisa747e682014-11-25 14:47:20 -0700335 XGL_CMD_BUFFER cbToDelete = pCBTrav->cmdBuffer;
336 pCBTrav = pCBTrav->pNextGlobalCBNode;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600337 bool32_t tmpResult = deleteGlobalCBNode(cbToDelete);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700338 // If any result is FALSE, final result should be FALSE
339 if ((XGL_FALSE == tmpResult) || (XGL_FALSE == result))
340 result = XGL_FALSE;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700341 }
342 return result;
343}
344
345// For given MemObj node, report Obj & CB bindings
346static void reportMemReferences(const GLOBAL_MEM_OBJ_NODE* pMemObjTrav)
347{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600348 uint32_t refCount = 0; // Count found references
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700349 MINI_NODE* pObjTrav = pMemObjTrav->pObjBindings;
350 MINI_NODE* pCBTrav = pMemObjTrav->pCmdBufferBindings;
351 while (pCBTrav) {
352 refCount++;
Tobin Ehlis62086412014-11-19 16:19:28 -0700353 char str[1024];
354 sprintf(str, "Command Buffer %p has reference to mem obj %p", pCBTrav->cmdBuffer, pMemObjTrav->mem);
355 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCBTrav->cmdBuffer, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700356 pCBTrav = pCBTrav->pNext;
357 }
358 while (pObjTrav) {
359 refCount++;
Tobin Ehlis62086412014-11-19 16:19:28 -0700360 char str[1024];
361 sprintf(str, "XGL Object %p has reference to mem obj %p", pObjTrav->object, pMemObjTrav->mem);
362 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pObjTrav->object, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700363 pObjTrav = pObjTrav->pNext;
364 }
365 if (refCount != pMemObjTrav->refCount) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700366 char str[1024];
367 sprintf(str, "Refcount of %u for Mem Obj %p does't match reported refs of %u", pMemObjTrav->refCount, pMemObjTrav->mem, refCount);
368 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pObjTrav->object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700369 }
370}
371
372static void deleteGlobalMemNode(XGL_GPU_MEMORY mem)
373{
374 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
375 GLOBAL_MEM_OBJ_NODE* pPrev = pTrav;
376 while (pTrav && (pTrav->mem != mem)) {
377 pPrev = pTrav;
378 pTrav = pTrav->pNextGlobalNode;
379 }
380 if (pTrav) {
381 pPrev->pNextGlobalNode = pTrav->pNextGlobalNode;
382 if (pGlobalMemObjHead == pTrav)
383 pGlobalMemObjHead = pTrav->pNextGlobalNode;
384 free(pTrav);
385 }
386 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700387 char str[1024];
388 sprintf(str, "Could not find global mem obj node for %p to delete!", mem);
389 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700390 }
391}
392// Check if fence for given CB is completed
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600393static bool32_t checkCBCompleted(const XGL_CMD_BUFFER cb)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700394{
395 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cb);
396 if (!pCBTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700397 char str[1024];
398 sprintf(str, "Unable to find global CB node %p to check for completion", cb);
399 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700400 return XGL_FALSE;
401 }
402 if (!pCBTrav->fence) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700403 char str[1024];
404 sprintf(str, "No fence found for CB %p to check for completion", cb);
405 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_CB_MISSING_FENCE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700406 return XGL_FALSE;
407 }
408 if (XGL_SUCCESS != nextTable.GetFenceStatus(pCBTrav->fence)) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700409 char str[1024];
410 sprintf(str, "Fence %p for CB %p has not completed", pCBTrav->fence, cb);
411 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700412 return XGL_FALSE;
413 }
414 return XGL_TRUE;
415}
416
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600417static bool32_t freeMemNode(XGL_GPU_MEMORY mem)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700418{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600419 bool32_t result = XGL_TRUE;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700420 // Parse global list to find node w/ mem
421 GLOBAL_MEM_OBJ_NODE* pTrav = getGlobalMemNode(mem);
422 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700423 char str[1024];
424 sprintf(str, "Couldn't find mem node object for %p\n Was %p never allocated or previously freed?", (void*)mem, (void*)mem);
425 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700426 return XGL_FALSE;
427 }
428 else {
Mark Lobodzinskidaa1d432015-02-18 18:06:24 -0600429 if (pTrav->allocInfo.allocationSize == 0) {
430 char str[1024];
431 sprintf(str, "Attempting to free memory associated with a Presentable Image, %p, this should not be explicitly freed\n", (void*)mem);
432 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
433 return XGL_FALSE;
434 }
435 // Clear any CB bindings for completed CBs
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700436 // TODO : Is there a better place to do this?
437 MINI_NODE* pMiniCB = pTrav->pCmdBufferBindings;
438 while (pMiniCB) {
439 XGL_CMD_BUFFER curCB = pMiniCB->cmdBuffer;
440 pMiniCB = pMiniCB->pNext;
441 if (XGL_TRUE == checkCBCompleted(curCB)) {
442 freeCBBindings(curCB);
443 }
444 }
445 // Now verify that no references to this mem obj remain
446 if (0 != pTrav->refCount) {
447 // If references remain, report the error and can search down CB LL to find references
448 result = XGL_FALSE;
Tobin Ehlis62086412014-11-19 16:19:28 -0700449 char str[1024];
450 sprintf(str, "Freeing mem obj %p while it still has references", (void*)mem);
451 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREED_MEM_REF, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700452 reportMemReferences(pTrav);
453 }
454 // Delete global node
455 deleteGlobalMemNode(mem);
456 }
457 return result;
458}
459
460// Return object node for 'object' or return NULL if no node exists
461static GLOBAL_OBJECT_NODE* getGlobalObjectNode(const XGL_OBJECT object)
462{
463 GLOBAL_OBJECT_NODE* pTrav = pGlobalObjectHead;
464 while (pTrav && (object != pTrav->object)) {
465 pTrav = pTrav->pNext;
466 }
467 return pTrav;
468}
469
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700470static GLOBAL_OBJECT_NODE* insertGlobalObjectNode(XGL_OBJECT object, XGL_STRUCTURE_TYPE sType, const void *pCreateInfo, const int struct_size, char *name_prefix)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700471{
472 GLOBAL_OBJECT_NODE* pTrav = pGlobalObjectHead;
473 if (!pTrav) {
474 pTrav = (GLOBAL_OBJECT_NODE*)malloc(sizeof(GLOBAL_OBJECT_NODE));
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700475 memset(pTrav, 0, sizeof(GLOBAL_OBJECT_NODE));
476 pGlobalObjectHead = pTrav;
477 }
478 else {
479 GLOBAL_OBJECT_NODE* pPrev = pTrav;
480 while (pTrav) {
481 pPrev = pTrav;
482 pTrav = pTrav->pNext;
483 }
484 pTrav = (GLOBAL_OBJECT_NODE*)malloc(sizeof(GLOBAL_OBJECT_NODE));
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700485 memset(pTrav, 0, sizeof(GLOBAL_OBJECT_NODE));
486 pPrev->pNext = pTrav;
487 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700488 if (!pTrav) {
489 char str[1024];
490 sprintf(str, "Malloc failed to alloc node for XGL Object %p", (void*)object);
491 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
492 return NULL;
493 }
494 else {
495 numObjectNodes++;
496 pTrav->object = object;
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700497 pTrav->ref_count = 1;
498 pTrav->sType = sType;
499 memcpy(&pTrav->create_info, pCreateInfo, struct_size);
500 sprintf(pTrav->object_name, "%s_%p", name_prefix, object);
Tobin Ehlis62086412014-11-19 16:19:28 -0700501 return pTrav;
502 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700503}
504
505// Remove object binding performs 3 tasks:
506// 1. Remove object node from Global Mem Obj mini LL of obj bindings & free it
507// 2. Decrement refCount for Global Mem Obj
508// 3. Clear Global Mem Obj ptr from Global Object Node
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600509static bool32_t clearObjectBinding(XGL_OBJECT object)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700510{
511 GLOBAL_OBJECT_NODE* pGlobalObjTrav = getGlobalObjectNode(object);
512 if (!pGlobalObjTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700513 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -0600514 sprintf(str, "Attempting to clear mem binding for object %p: devices, queues, command buffers, shaders and memory objects do not have external memory requirements and it is unneccessary to call bind/unbindObjectMemory on them.", object);
515 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_OBJECT, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700516 return XGL_FALSE;
517 }
518 if (!pGlobalObjTrav->pMemNode) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700519 char str[1024];
520 sprintf(str, "Attempting to clear mem binding on obj %p but it has no binding.", (void*)object);
521 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEM_OBJ_CLEAR_EMPTY_BINDINGS, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700522 return XGL_FALSE;
523 }
524 MINI_NODE* pObjTrav = pGlobalObjTrav->pMemNode->pObjBindings;
525 MINI_NODE* pPrevObj = pObjTrav;
526 while (pObjTrav) {
527 if (object == pObjTrav->object) {
528 pPrevObj->pNext = pObjTrav->pNext;
529 // check if HEAD needs to be updated
530 if (pGlobalObjTrav->pMemNode->pObjBindings == pObjTrav)
531 pGlobalObjTrav->pMemNode->pObjBindings = pObjTrav->pNext;
532 free(pObjTrav);
533 pGlobalObjTrav->pMemNode->refCount--;
534 pGlobalObjTrav->pMemNode = NULL;
535 return XGL_TRUE;
536 }
537 pPrevObj = pObjTrav;
538 pObjTrav = pObjTrav->pNext;
539 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700540 char str[1024];
541 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);
542 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700543 return XGL_FALSE;
544}
545
546// For NULL mem case, clear any previous binding Else...
547// Make sure given object is in global object LL
Tobin Ehlis62086412014-11-19 16:19:28 -0700548// IF a previous binding existed, clear it
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700549// Add link from global object node to global memory node
550// Add mini-object node & reference off of global obj node
551// Return XGL_TRUE if addition is successful, XGL_FALSE otherwise
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600552static bool32_t updateObjectBinding(XGL_OBJECT object, XGL_GPU_MEMORY mem)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700553{
554 // Handle NULL case separately, just clear previous binding & decrement reference
555 if (mem == XGL_NULL_HANDLE) {
556 clearObjectBinding(object);
557 return XGL_TRUE;
558 }
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700559 char str[1024];
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700560 GLOBAL_OBJECT_NODE* pGlobalObjTrav = getGlobalObjectNode(object);
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700561 assert(pGlobalObjTrav);
562 if (!pGlobalObjTrav) {
563 sprintf(str, "Attempting to update Binding of Obj(%p) that's not in global list()", (void*)object);
564 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
565 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700566 // non-null case so should have real mem obj
567 GLOBAL_MEM_OBJ_NODE* pTrav = getGlobalMemNode(mem);
568 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700569 sprintf(str, "While trying to bind mem for obj %p, couldn't find node for mem obj %p", (void*)object, (void*)mem);
570 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700571 return XGL_FALSE;
572 }
573 XGL_RESULT result = insertMiniNode(&pTrav->pObjBindings, object, &pTrav->refCount);
574 if (XGL_SUCCESS != result)
575 return result;
576
Tobin Ehlis62086412014-11-19 16:19:28 -0700577 if (pGlobalObjTrav->pMemNode) {
578 clearObjectBinding(object); // Need to clear the previous object binding before setting new binding
Tobin Ehlis62086412014-11-19 16:19:28 -0700579 sprintf(str, "Updating memory binding for object %p from mem obj %p to %p", object, pGlobalObjTrav->pMemNode->mem, mem);
580 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_NONE, "MEM", str);
581 }
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700582 // For image objects, make sure default memory state is correctly set
Tobin Ehlis2836a7d2015-01-08 15:22:32 -0700583 // TODO : What's the best/correct way to handle this?
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700584 if (XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO == pGlobalObjTrav->sType) {
585 if (pGlobalObjTrav->create_info.image_create_info.usage & (XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT)) {
Mark Lobodzinski15427102015-02-18 16:38:17 -0600586 // TODO:: More memory state transition stuff.
Tobin Ehlis6aa77422015-01-07 17:49:29 -0700587 }
588 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700589 pGlobalObjTrav->pMemNode = pTrav;
590 return XGL_TRUE;
591}
592// Print details of global Obj tracking list
593static void printObjList()
594{
595 GLOBAL_OBJECT_NODE* pGlobalObjTrav = pGlobalObjectHead;
596 if (!pGlobalObjTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700597 char str[1024];
598 sprintf(str, "Global Object list is empty :(\n");
599 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700600 }
601 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700602 char str[1024];
603 sprintf(str, "Details of Global Object list w/ HEAD at %p", (void*)pGlobalObjTrav);
604 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700605 while (pGlobalObjTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700606 sprintf(str, " GlobObjNode %p has object %p, pNext %p, pMemNode %p", pGlobalObjTrav, pGlobalObjTrav->object, pGlobalObjTrav->pNext, pGlobalObjTrav->pMemNode);
607 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pGlobalObjTrav->object, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700608 pGlobalObjTrav = pGlobalObjTrav->pNext;
609 }
610 }
611}
612// For given Object, get 'mem' obj that it's bound to or NULL if no binding
613static XGL_GPU_MEMORY getMemBindingFromObject(const XGL_OBJECT object)
614{
615 XGL_GPU_MEMORY mem = NULL;
616 GLOBAL_OBJECT_NODE* pObjNode = getGlobalObjectNode(object);
617 if (pObjNode) {
618 if (pObjNode->pMemNode) {
619 mem = pObjNode->pMemNode->mem;
620 }
621 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700622 char str[1024];
623 sprintf(str, "Trying to get mem binding for object %p but object has no mem binding", (void*)object);
624 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MISSING_MEM_BINDINGS, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700625 printObjList();
626 }
627 }
628 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700629 char str[1024];
630 sprintf(str, "Trying to get mem binding for object %p but no such object in global list", (void*)object);
631 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_INVALID_OBJECT, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700632 printObjList();
633 }
634 return mem;
635}
636// Print details of global Mem Obj list
637static void printMemList()
638{
639 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
Tobin Ehlis62086412014-11-19 16:19:28 -0700640 // Just printing each msg individually for now, may want to package these into single large print
641 char str[1024];
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700642 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700643 sprintf(str, "MEM INFO : Global Memory Object list is empty :(\n");
644 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700645 }
646 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700647 sprintf(str, "MEM INFO : Details of Global Memory Object list w/ HEAD at %p", (void*)pTrav);
648 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700649 while (pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700650 sprintf(str, " ===MemObj Node at %p===", (void*)pTrav);
651 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
652 sprintf(str, " Mem object: %p", (void*)pTrav->mem);
653 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
654 sprintf(str, " Ref Count: %u", pTrav->refCount);
655 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
656 sprintf(str, " pNext Mem Obj Node: %p", (void*)pTrav->pNextGlobalNode);
657 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
658 if (0 != pTrav->allocInfo.allocationSize)
659 sprintf(str, " Mem Alloc info:\n%s", xgl_print_xgl_memory_alloc_info(&pTrav->allocInfo, "{MEM}INFO : "));
660 else
661 sprintf(str, " Mem Alloc info is NULL (alloc done by xglWsiX11CreatePresentableImage())");
662 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700663 MINI_NODE* pObjTrav = pTrav->pObjBindings;
Tobin Ehlis62086412014-11-19 16:19:28 -0700664 if (!pObjTrav) {
665 sprintf(str, " No XGL Object bindings");
666 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
667 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700668 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700669 sprintf(str, " XGL OBJECT Binding list w/ HEAD at %p:", pObjTrav);
670 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700671 while (pObjTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700672 sprintf(str, " OBJ_NODE(%p): XGL OBJECT %p, pNext %p", pObjTrav, pObjTrav->object, pObjTrav->pNext);
673 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700674 pObjTrav = pObjTrav->pNext;
675 }
676 }
677 MINI_NODE* pCBTrav = pTrav->pCmdBufferBindings;
Tobin Ehlis62086412014-11-19 16:19:28 -0700678 if (!pCBTrav) {
679 sprintf(str, " No Command Buffer bindings");
680 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
681 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700682 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700683 sprintf(str, " XGL Command Buffer (CB) binding list w/ HEAD at %p:", pCBTrav);
684 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700685 while (pCBTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700686 sprintf(str, " CB_NODE(%p): XGL CB %p, pNext %p", pCBTrav, pCBTrav->cmdBuffer, pCBTrav->pNext);
687 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700688 pCBTrav = pCBTrav->pNext;
689 }
690 }
691 pTrav = pTrav->pNextGlobalNode;
692 }
693 }
694}
695
696static void printGlobalCB()
697{
Tobin Ehlis62086412014-11-19 16:19:28 -0700698 char str[1024] = {0};
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700699 GLOBAL_CB_NODE* pTrav = pGlobalCBHead;
700 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700701 sprintf(str, "Global Command Buffer (CB) list is empty :(\n");
702 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700703 }
704 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700705 sprintf(str, "Details of Global CB list w/ HEAD at %p:", (void*)pTrav);
706 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700707 while (pTrav) {
Tobin Ehlisa747e682014-11-25 14:47:20 -0700708 sprintf(str, " Global CB Node (%p) w/ pNextGlobalCBNode (%p) has CB %p, fence %p, and pMemObjList %p", (void*)pTrav, (void*)pTrav->pNextGlobalCBNode, (void*)pTrav->cmdBuffer, (void*)pTrav->fence, (void*)pTrav->pMemObjList);
Tobin Ehlis62086412014-11-19 16:19:28 -0700709 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700710 MINI_NODE* pMemObjTrav = pTrav->pMemObjList;
711 while (pMemObjTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700712 sprintf(str, " MEM_NODE(%p): Mem obj %p, pNext %p", (void*)pMemObjTrav, (void*)pMemObjTrav->mem, (void*)pMemObjTrav->pNext);
713 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700714 pMemObjTrav = pMemObjTrav->pNext;
715 }
716 pTrav = pTrav->pNextGlobalCBNode;
717 }
718 }
719}
720
721static XGL_FENCE createLocalFence()
722{
723 XGL_FENCE_CREATE_INFO fci;
724 fci.sType = XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO;
725 fci.pNext = NULL;
726 fci.flags = 0;
727 XGL_FENCE fence;
728 nextTable.CreateFence(globalDevice, &fci, &fence);
729 return fence;
730}
731
Mark Lobodzinski15427102015-02-18 16:38:17 -0600732static void initMemTracker(void)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700733{
Jon Ashburnf57ea372014-12-22 13:24:15 -0700734 const char *strOpt;
735 // initialize MemTracker options
Mark Lobodzinski1ee9f3a2015-02-25 15:14:06 -0600736 g_reportingLevel = getLayerOptionEnum("MemTrackerReportLevel", g_reportingLevel);
737 g_debugAction = getLayerOptionEnum("MemTrackerDebugAction", g_debugAction);
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -0700738
Jon Ashburnf57ea372014-12-22 13:24:15 -0700739 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
740 {
741 strOpt = getLayerOption("MemTrackerLogFilename");
742 if (strOpt)
743 {
744 g_logFile = fopen(strOpt, "w");
Jon Ashburnf57ea372014-12-22 13:24:15 -0700745 }
746 if (g_logFile == NULL)
747 g_logFile = stdout;
748 }
749
750 // initialize Layer dispatch table
751 // TODO handle multiple GPUs
Mark Lobodzinski953a1692015-01-09 15:12:03 -0600752 xglGetProcAddrType fpNextGPA;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700753 fpNextGPA = pCurObj->pGPA;
754 assert(fpNextGPA);
755
Chia-I Wu0f65b1e2015-01-04 23:11:43 +0800756 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
757
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600758 xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr");
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700759 nextTable.GetProcAddr = fpGetProcAddr;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700760}
761
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700762XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateInstance(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_INSTANCE* pInstance)
763{
764 XGL_RESULT result = nextTable.CreateInstance(pAppInfo, pAllocCb, pInstance);
765 return result;
766}
767
768XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyInstance(XGL_INSTANCE instance)
769{
770 XGL_RESULT result = nextTable.DestroyInstance(instance);
771 return result;
772}
773
774XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateGpus(XGL_INSTANCE instance, uint32_t maxGpus, uint32_t* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
775{
776 XGL_RESULT result = nextTable.EnumerateGpus(instance, maxGpus, pGpuCount, pGpus);
777 return result;
778}
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700779
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600780XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetGpuInfo(XGL_PHYSICAL_GPU gpu, XGL_PHYSICAL_GPU_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700781{
782 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
783 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700784 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700785 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
786 return result;
787}
788
789XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
790{
791 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
792 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700793 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700794 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
795 // Save off device in case we need it to create Fences
796 globalDevice = *pDevice;
797 return result;
798}
799
800XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
801{
Tobin Ehlis62086412014-11-19 16:19:28 -0700802 char str[1024];
803 sprintf(str, "Printing List details prior to xglDestroyDevice()");
804 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, device, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700805 printMemList();
806 printGlobalCB();
807 printObjList();
Tobin Ehlis62086412014-11-19 16:19:28 -0700808 if (XGL_FALSE == deleteGlobalCBList()) {
809 sprintf(str, "Issue deleting global CB list in xglDestroyDevice()");
810 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, device, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
811 }
Tobin Ehlis22d03232014-11-25 18:01:12 -0700812 // Report any memory leaks
813 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
814 while (pTrav) {
Mark Lobodzinskidaa1d432015-02-18 18:06:24 -0600815 if (pTrav->allocInfo.allocationSize != 0) {
816 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);
817 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, pTrav->mem, 0, MEMTRACK_MEMORY_LEAK, "MEM", str);
818 }
Tobin Ehlis22d03232014-11-25 18:01:12 -0700819 pTrav = pTrav->pNextGlobalNode;
820 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700821 XGL_RESULT result = nextTable.DestroyDevice(device);
822 return result;
823}
824
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600825XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const char* pExtName)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700826{
827 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
828 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700829 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700830 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
831 return result;
832}
833
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600834XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, size_t maxLayerCount, size_t maxStringSize, size_t* pOutLayerCount, char* const* pOutLayers, void* pReserved)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700835{
Jon Ashburn451c16f2014-11-25 11:08:42 -0700836 if (gpu != NULL)
837 {
838 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
839 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700840 loader_platform_thread_once(&g_initOnce, initMemTracker);
Mark Lobodzinski953a1692015-01-09 15:12:03 -0600841 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -0700842 return result;
843 } else
844 {
845 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
846 return XGL_ERROR_INVALID_POINTER;
847 // This layer compatible with all GPUs
848 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +0800849 strncpy((char *) pOutLayers[0], "MemTracker", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -0700850 return XGL_SUCCESS;
851 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700852}
853
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600854XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetDeviceQueue(XGL_DEVICE device, XGL_QUEUE_TYPE queueType, uint32_t queueIndex, XGL_QUEUE* pQueue)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700855{
856 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
857 return result;
858}
859
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600860XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSubmit(XGL_QUEUE queue, uint32_t cmdBufferCount, const XGL_CMD_BUFFER* pCmdBuffers, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs, XGL_FENCE fence)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700861{
Mark Lobodzinski821b57f2015-02-25 18:11:05 -0600862 bool32_t localFlag = XGL_FALSE;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700863 // TODO : Need to track fence and clear mem references when fence clears
864 XGL_FENCE localFence = fence;
865 if (XGL_NULL_HANDLE == fence) { // allocate our own fence to track cmd buffer
866 localFence = createLocalFence();
Mark Lobodzinski821b57f2015-02-25 18:11:05 -0600867 localFlag = XGL_TRUE;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700868 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700869 char str[1024];
870 sprintf(str, "In xglQueueSubmit(), checking %u cmdBuffers with %u memRefs", cmdBufferCount, memRefCount);
871 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, queue, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700872 printMemList();
873 printGlobalCB();
874 for (uint32_t i = 0; i < cmdBufferCount; i++) {
Mark Lobodzinski821b57f2015-02-25 18:11:05 -0600875 setCBFence(pCmdBuffers[i], localFence, localFlag);
Tobin Ehlis62086412014-11-19 16:19:28 -0700876 sprintf(str, "Verifying mem refs for CB %p", pCmdBuffers[i]);
877 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700878 if (XGL_FALSE == validateCBMemRef(pCmdBuffers[i], memRefCount, pMemRefs)) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700879 sprintf(str, "Unable to verify memory references for CB %p", (void*)pCmdBuffers[i]);
880 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_CB_MISSING_MEM_REF, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700881 }
882 }
883 printGlobalCB();
884 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, localFence);
885 return result;
886}
887
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600888XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700889{
890 // TODO : Use global mem references as part of list checked on QueueSubmit above
891 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
892 return result;
893}
894
895XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
896{
897 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
898 return result;
899}
900
901XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
902{
903 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
904 return result;
905}
906
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700907XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
908{
909 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
910 // TODO : Track allocations and overall size here
Mark Lobodzinski15427102015-02-18 16:38:17 -0600911 insertGlobalMemObj(*pMem, pAllocInfo);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700912 printMemList();
913 return result;
914}
915
916XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
917{
Tobin Ehlisa747e682014-11-25 14:47:20 -0700918 /* From spec : A memory object is freed by calling xglFreeMemory() when it is no longer needed. Before
919 * freeing a memory object, an application must ensure the memory object is unbound from
920 * all API objects referencing it and that it is not referenced by any queued command buffers
921 */
Tobin Ehlis62086412014-11-19 16:19:28 -0700922 if (XGL_FALSE == freeMemNode(mem)) {
923 char str[1024];
924 sprintf(str, "Issue while freeing mem obj %p", (void*)mem);
925 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREE_MEM_ERROR, "MEM", str);
926 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700927 printMemList();
928 printObjList();
929 printGlobalCB();
930 XGL_RESULT result = nextTable.FreeMemory(mem);
931 return result;
932}
933
934XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
935{
936 // TODO : Update tracking for this alloc
937 // Make sure memory is not pinned, which can't have priority set
938 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
939 return result;
940}
941
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600942XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, void** ppData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700943{
944 // TODO : Track when memory is mapped
Mark Lobodzinski06f60b82015-02-25 12:16:04 -0600945 GLOBAL_MEM_OBJ_NODE *pMemObj = getGlobalMemNode(mem);
946 if ((pMemObj->allocInfo.memProps & XGL_MEMORY_PROPERTY_CPU_VISIBLE_BIT) == 0) {
947 char str[1024];
948 sprintf(str, "Mapping Memory (%p) without XGL_MEMORY_PROPERTY_CPU_VISIBLE_BIT set", (void*)mem);
949 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_STATE, "MEM", str);
950 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700951 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
952 return result;
953}
954
955XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
956{
957 // TODO : Track as memory gets unmapped, do we want to check what changed following map?
958 // Make sure that memory was ever mapped to begin with
959 XGL_RESULT result = nextTable.UnmapMemory(mem);
960 return result;
961}
962
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600963XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglPinSystemMemory(XGL_DEVICE device, const void* pSysMem, size_t memSize, XGL_GPU_MEMORY* pMem)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700964{
965 // TODO : Track this
966 // Verify that memory is actually pinnable
967 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
968 return result;
969}
970
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700971XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
972{
973 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
974 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700975 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700976 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
977 return result;
978}
979
980XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
981{
982 // TODO : Track this
983 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
984 return result;
985}
986
987XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
988{
989 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
990 return result;
991}
992
993XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
994{
995 // TODO : Track this
996 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
997 return result;
998}
999
1000XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1001{
1002 // TODO : Track this
1003 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1004 return result;
1005}
1006
1007XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1008{
Tobin Ehlise6884ef2014-11-27 07:52:04 -07001009 // First check if this is a CmdBuffer
1010 if (NULL != getGlobalCBNode((XGL_CMD_BUFFER)object)) {
1011 deleteGlobalCBNode((XGL_CMD_BUFFER)object);
1012 }
1013 // Now locate node in global list along with prev node
Tobin Ehlis580c1b32014-11-25 12:27:38 -07001014 GLOBAL_OBJECT_NODE* pTrav = pGlobalObjectHead;
1015 GLOBAL_OBJECT_NODE* pPrev = pTrav;
Tobin Ehlis580c1b32014-11-25 12:27:38 -07001016 while (pTrav) {
1017 if (object == pTrav->object)
1018 break;
1019 pPrev = pTrav;
1020 pTrav = pTrav->pNext;
1021 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001022 if (pTrav) {
1023 if (pTrav->pMemNode) {
Tobin Ehlise6884ef2014-11-27 07:52:04 -07001024 // Wsi allocated Memory is tied to image object so clear the binding and free that memory automatically
1025 if (0 == pTrav->pMemNode->allocInfo.allocationSize) { // Wsi allocated memory has NULL allocInfo w/ 0 size
1026 XGL_GPU_MEMORY memToFree = pTrav->pMemNode->mem;
1027 clearObjectBinding(object);
1028 freeMemNode(memToFree);
1029 }
1030 else {
1031 char str[1024];
1032 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);
1033 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_DESTROY_OBJECT_ERROR, "MEM", str);
1034 // From the spec : If an object has previous memory binding, it is required to unbind memory from an API object before it is destroyed.
1035 clearObjectBinding(object);
1036 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001037 }
1038 if (pGlobalObjectHead == pTrav) // update HEAD if needed
1039 pGlobalObjectHead = pTrav->pNext;
Tobin Ehlis580c1b32014-11-25 12:27:38 -07001040 // Delete the obj node from global list
1041 pPrev->pNext = pTrav->pNext;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001042 free(pTrav);
1043 }
1044 XGL_RESULT result = nextTable.DestroyObject(object);
1045 return result;
1046}
1047
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001048XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetObjectInfo(XGL_BASE_OBJECT object, XGL_OBJECT_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001049{
1050 // TODO : What to track here?
1051 // Could potentially save returned mem requirements and validate values passed into BindObjectMemory for this object
Tobin Ehlis62086412014-11-19 16:19:28 -07001052 // From spec : The only objects that are guaranteed to have no external memory requirements are devices, queues, command buffers, shaders and memory objects.
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001053 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1054 return result;
1055}
1056
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001057XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindObjectMemory(XGL_OBJECT object, uint32_t allocationIdx, XGL_GPU_MEMORY mem, XGL_GPU_SIZE offset)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001058{
Jon Ashburned62b412015-01-15 10:39:19 -07001059 XGL_RESULT result = nextTable.BindObjectMemory(object, allocationIdx, mem, offset);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001060 // Track objects tied to memory
Tobin Ehlis62086412014-11-19 16:19:28 -07001061 if (XGL_FALSE == updateObjectBinding(object, mem)) {
1062 char str[1024];
1063 sprintf(str, "Unable to set object %p binding to mem obj %p", (void*)object, (void*)mem);
1064 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1065 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001066 printObjList();
1067 printMemList();
1068 return result;
1069}
1070
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001071XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindObjectMemoryRange(XGL_OBJECT object, uint32_t allocationIdx, XGL_GPU_SIZE rangeOffset, XGL_GPU_SIZE rangeSize, XGL_GPU_MEMORY mem, XGL_GPU_SIZE memOffset)
1072{
1073 XGL_RESULT result = nextTable.BindObjectMemoryRange(object, allocationIdx, rangeOffset, rangeSize, mem, memOffset);
1074 return result;
1075}
1076
1077XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBindImageMemoryRange(XGL_IMAGE image, uint32_t allocationIdx, const XGL_IMAGE_MEMORY_BIND_INFO* bindInfo, XGL_GPU_MEMORY mem, XGL_GPU_SIZE memOffset)
1078{
1079 XGL_RESULT result = nextTable.BindImageMemoryRange(image, allocationIdx, bindInfo, mem, memOffset);
1080 return result;
1081}
1082
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001083XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1084{
1085 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1086 return result;
1087}
1088
1089XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1090{
1091 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1092 return result;
1093}
1094
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001095XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitForFences(XGL_DEVICE device, uint32_t fenceCount, const XGL_FENCE* pFences, bool32_t waitAll, uint64_t timeout)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001096{
1097 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1098 return result;
1099}
1100
1101XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1102{
1103 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1104 return result;
1105}
1106
1107XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1108{
1109 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1110 return result;
1111}
1112
1113XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1114{
1115 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1116 return result;
1117}
1118
1119XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1120{
1121 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
Mark Lobodzinski15427102015-02-18 16:38:17 -06001122 if (XGL_SUCCESS == result) {
1123 insertGlobalObjectNode(*pEvent, pCreateInfo->sType, pCreateInfo, sizeof(XGL_EVENT_CREATE_INFO), "event");
1124 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001125 return result;
1126}
1127
1128XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1129{
1130 XGL_RESULT result = nextTable.GetEventStatus(event);
1131 return result;
1132}
1133
1134XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1135{
1136 XGL_RESULT result = nextTable.SetEvent(event);
1137 return result;
1138}
1139
1140XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1141{
1142 XGL_RESULT result = nextTable.ResetEvent(event);
1143 return result;
1144}
1145
1146XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1147{
1148 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
Mark Lobodzinski15427102015-02-18 16:38:17 -06001149 if (XGL_SUCCESS == result) {
1150 insertGlobalObjectNode(*pQueryPool, pCreateInfo->sType, pCreateInfo, sizeof(XGL_QUERY_POOL_CREATE_INFO), "query_pool");
1151 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001152 return result;
1153}
1154
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001155XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetQueryPoolResults(XGL_QUERY_POOL queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001156{
1157 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1158 return result;
1159}
1160
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001161XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFormatInfo(XGL_DEVICE device, XGL_FORMAT format, XGL_FORMAT_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001162{
1163 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1164 return result;
1165}
1166
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001167XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
1168{
1169 XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
Mark Lobodzinski15427102015-02-18 16:38:17 -06001170 if (XGL_SUCCESS == result) {
1171 insertGlobalObjectNode(*pBuffer, pCreateInfo->sType, pCreateInfo, sizeof(XGL_BUFFER_CREATE_INFO), "buffer");
1172 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001173 return result;
1174}
1175
1176XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
1177{
1178 XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
Mark Lobodzinski15427102015-02-18 16:38:17 -06001179 if (result == XGL_SUCCESS) {
1180 insertGlobalObjectNode(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_BUFFER_VIEW_CREATE_INFO), "buffer_view");
1181 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001182 return result;
1183}
1184
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001185XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1186{
1187 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001188 if (XGL_SUCCESS == result) {
1189 insertGlobalObjectNode(*pImage, pCreateInfo->sType, pCreateInfo, sizeof(XGL_IMAGE_CREATE_INFO), "image");
1190 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001191 return result;
1192}
1193
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001194XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearColor(XGL_IMAGE image, const float color[4])
1195{
1196 XGL_RESULT result = nextTable.SetFastClearColor(image, color);
1197 return result;
1198}
1199
1200XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearDepth(XGL_IMAGE image, float depth)
1201{
1202 XGL_RESULT result = nextTable.SetFastClearDepth(image, depth);
1203 return result;
1204}
1205
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001206XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetImageSubresourceInfo(XGL_IMAGE image, const XGL_IMAGE_SUBRESOURCE* pSubresource, XGL_SUBRESOURCE_INFO_TYPE infoType, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001207{
1208 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1209 return result;
1210}
1211
1212XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1213{
1214 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001215 if (result == XGL_SUCCESS) {
1216 insertGlobalObjectNode(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO), "image_view");
1217 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001218 return result;
1219}
1220
1221XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1222{
1223 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001224 if (result == XGL_SUCCESS) {
1225 insertGlobalObjectNode(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO), "color_attachment_view");
1226 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001227 return result;
1228}
1229
1230XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1231{
1232 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001233 if (result == XGL_SUCCESS) {
1234 insertGlobalObjectNode(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DEPTH_STENCIL_VIEW_CREATE_INFO), "ds_view");
1235 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001236 return result;
1237}
1238
1239XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1240{
1241 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1242 return result;
1243}
1244
1245XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1246{
1247 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001248 if (result == XGL_SUCCESS) {
1249 insertGlobalObjectNode(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO), "graphics_pipeline");
1250 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001251 return result;
1252}
1253
1254XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1255{
1256 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001257 if (result == XGL_SUCCESS) {
1258 insertGlobalObjectNode(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO), "compute_pipeline");
1259 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001260 return result;
1261}
1262
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001263XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001264{
1265 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
1266 return result;
1267}
1268
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001269XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglLoadPipeline(XGL_DEVICE device, size_t dataSize, const void* pData, XGL_PIPELINE* pPipeline)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001270{
1271 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
1272 return result;
1273}
1274
1275XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
1276{
1277 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
1278 return result;
1279}
1280
1281XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
1282{
1283 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001284 if (result == XGL_SUCCESS) {
1285 insertGlobalObjectNode(*pSampler, pCreateInfo->sType, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO), "sampler");
1286 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001287 return result;
1288}
1289
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001290XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDescriptorSetLayout(XGL_DEVICE device, XGL_FLAGS stageFlags, const uint32_t* pSetBindPoints, XGL_DESCRIPTOR_SET_LAYOUT priorSetLayout, const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pSetLayoutInfoList, XGL_DESCRIPTOR_SET_LAYOUT* pSetLayout)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001291{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001292 XGL_RESULT result = nextTable.CreateDescriptorSetLayout(device, stageFlags, pSetBindPoints, priorSetLayout, pSetLayoutInfoList, pSetLayout);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001293 return result;
1294}
1295
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001296XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001297{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001298 XGL_RESULT result = nextTable.BeginDescriptorRegionUpdate(device, updateMode);
1299 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001300}
1301
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001302XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(XGL_DEVICE device, XGL_CMD_BUFFER cmd)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001303{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001304 XGL_RESULT result = nextTable.EndDescriptorRegionUpdate(device, cmd);
1305 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001306}
1307
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001308XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDescriptorRegion(XGL_DEVICE device, XGL_DESCRIPTOR_REGION_USAGE regionUsage, uint32_t maxSets, const XGL_DESCRIPTOR_REGION_CREATE_INFO* pCreateInfo, XGL_DESCRIPTOR_REGION* pDescriptorRegion)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001309{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001310 XGL_RESULT result = nextTable.CreateDescriptorRegion(device, regionUsage, maxSets, pCreateInfo, pDescriptorRegion);
1311 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001312}
1313
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001314XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglClearDescriptorRegion(XGL_DESCRIPTOR_REGION descriptorRegion)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001315{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001316 XGL_RESULT result = nextTable.ClearDescriptorRegion(descriptorRegion);
1317 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001318}
1319
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001320XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, XGL_DESCRIPTOR_SET_USAGE setUsage, uint32_t count, const XGL_DESCRIPTOR_SET_LAYOUT* pSetLayouts, XGL_DESCRIPTOR_SET* pDescriptorSets, uint32_t* pCount)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001321{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001322 XGL_RESULT result = nextTable.AllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
1323 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001324}
1325
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001326XGL_LAYER_EXPORT void XGLAPI xglClearDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, uint32_t count, const XGL_DESCRIPTOR_SET* pDescriptorSets)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001327{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001328 nextTable.ClearDescriptorSets(descriptorRegion, count, pDescriptorSets);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001329}
1330
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001331XGL_LAYER_EXPORT void XGLAPI xglUpdateDescriptors(XGL_DESCRIPTOR_SET descriptorSet, const void* pUpdateChain)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001332{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001333 nextTable.UpdateDescriptors(descriptorSet, pUpdateChain);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001334}
1335
Mark Lobodzinski15427102015-02-18 16:38:17 -06001336XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicViewportState(XGL_DEVICE device, const XGL_DYNAMIC_VP_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_VP_STATE_OBJECT* pState)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001337{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001338 XGL_RESULT result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001339 if (result == XGL_SUCCESS) {
Mark Lobodzinski15427102015-02-18 16:38:17 -06001340 insertGlobalObjectNode(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO), "viewport_state");
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001341 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001342 return result;
1343}
1344
Mark Lobodzinski15427102015-02-18 16:38:17 -06001345XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicRasterState(XGL_DEVICE device, const XGL_DYNAMIC_RS_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_RS_STATE_OBJECT* pState)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001346{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001347 XGL_RESULT result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001348 if (result == XGL_SUCCESS) {
Mark Lobodzinski15427102015-02-18 16:38:17 -06001349 insertGlobalObjectNode(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO), "raster_state");
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001350 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001351 return result;
1352}
1353
Mark Lobodzinski15427102015-02-18 16:38:17 -06001354XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicColorBlendState(XGL_DEVICE device, const XGL_DYNAMIC_CB_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_CB_STATE_OBJECT* pState)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001355{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001356 XGL_RESULT result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001357 if (result == XGL_SUCCESS) {
Mark Lobodzinski15427102015-02-18 16:38:17 -06001358 insertGlobalObjectNode(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO), "cb_state");
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001359 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001360 return result;
1361}
1362
Mark Lobodzinski15427102015-02-18 16:38:17 -06001363XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDynamicDepthStencilState(XGL_DEVICE device, const XGL_DYNAMIC_DS_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_DS_STATE_OBJECT* pState)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001364{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001365 XGL_RESULT result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001366 if (result == XGL_SUCCESS) {
Mark Lobodzinski15427102015-02-18 16:38:17 -06001367 insertGlobalObjectNode(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO), "ds_state");
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001368 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001369 return result;
1370}
1371
1372XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
1373{
1374 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
1375 // At time of cmd buffer creation, create global cmd buffer node for the returned cmd buffer
1376 if (*pCmdBuffer)
1377 insertGlobalCB(*pCmdBuffer);
1378 printGlobalCB();
1379 return result;
1380}
1381
Jon Ashburn57ba18d2014-12-31 17:11:49 -07001382XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001383{
1384 // This implicitly resets the Cmd Buffer so clear memory references
Jon Ashburn57ba18d2014-12-31 17:11:49 -07001385 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001386 freeCBBindings(cmdBuffer);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001387 return result;
1388}
1389
1390XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1391{
1392 // TODO : Anything to do here?
1393 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
1394 return result;
1395}
1396
1397XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1398{
1399 // Clear memory references as this point. Anything else to do here?
1400 freeCBBindings(cmdBuffer);
1401 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
1402 return result;
1403}
1404// TODO : For any xglCmdBind* calls that include an object which has mem bound to it,
1405// need to account for that mem now having binding to given cmdBuffer
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001406XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001407{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001408#if 0
1409 // TODO : If memory bound to pipeline, then need to tie that mem to cmdBuffer
1410 if (getPipeline(pipeline)) {
1411 GLOBAL_CB_NODE *pCBTrav = getGlobalCBNode(cmdBuffer);
1412 if (pCBTrav) {
1413 pCBTrav->pipelines[pipelineBindPoint] = pipeline;
1414 } else {
1415 char str[1024];
1416 sprintf(str, "Attempt to bind Pipeline %p to non-existant command buffer %p!", (void*)pipeline, cmdBuffer);
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001417 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, (char *) "DS", (char *) str);
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001418 }
1419 }
1420 else {
1421 char str[1024];
1422 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001423 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, MEMTRACK_INVALID_OBJECT, (char *) "DS", (char *) str);
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001424 }
1425#endif
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001426 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1427}
1428
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001429XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipelineDelta(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE_DELTA delta)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001430{
1431 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
1432}
1433
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001434XGL_LAYER_EXPORT void XGLAPI xglCmdBindDynamicStateObject(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001435{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001436 GLOBAL_OBJECT_NODE *pNode;
1437 GLOBAL_CB_NODE *pCmdBuf = getGlobalCBNode(cmdBuffer);
1438 if (!pCmdBuf) {
1439 char str[1024];
1440 sprintf(str, "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
1441 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, "DD", str);
1442 }
1443 pNode = getGlobalObjectNode(state);
1444 if (!pNode) {
1445 char str[1024];
1446 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
1447 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, state, 0, MEMTRACK_INVALID_OBJECT, "DD", str);
1448 }
1449 pCmdBuf->pDynamicState[stateBindPoint] = pNode;
Mark Lobodzinski15427102015-02-18 16:38:17 -06001450 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001451}
1452
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001453XGL_LAYER_EXPORT void XGLAPI xglCmdBindDescriptorSet(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_DESCRIPTOR_SET descriptorSet, const uint32_t* pUserData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001454{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001455 // TODO : Somewhere need to verify that all textures referenced by shaders in DS are in some type of *SHADER_READ* state
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001456 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001457}
1458
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001459XGL_LAYER_EXPORT void XGLAPI xglCmdBindVertexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t binding)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001460{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001461 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
1462 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Chia-I Wufb5062e2015-01-05 13:42:56 +08001463 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001464 sprintf(str, "In xglCmdBindVertexBuffer() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Chia-I Wufb5062e2015-01-05 13:42:56 +08001465 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1466 }
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001467 // Now update CB's vertex binding list
1468 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cmdBuffer);
1469 if (!pCBTrav) {
1470 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001471 sprintf(str, "Trying to BindVertexuffer obj %p to CB %p but no Node for that CB. Was CB incorrectly destroyed?", buffer, cmdBuffer);
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001472 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, "MEM", str);
1473 } else {
1474 MEMORY_BINDING *pBindInfo;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001475 uint32_t dontCare;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001476 XGL_RESULT result;
1477 pBindInfo = malloc(sizeof(MEMORY_BINDING));
1478 pBindInfo->offset = offset;
1479 pBindInfo->binding = binding;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001480 pBindInfo->buffer = buffer;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001481 result = insertMiniNode(&pCBTrav->pVertexBufList, pBindInfo, &dontCare);
1482 if (result) {
1483 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001484 sprintf(str, "In xglCmdBindVertexBuffer and ran out of memory to track binding. CmdBuffer: %p, buffer %p", cmdBuffer, buffer);
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001485 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
1486 }
1487 }
1488 lastVtxBinding = binding;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001489 nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
Chia-I Wufb5062e2015-01-05 13:42:56 +08001490}
1491
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001492XGL_LAYER_EXPORT void XGLAPI xglCmdBindIndexBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001493{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001494 // Track this buffer. What exactly is this call doing?
Mark Lobodzinski15427102015-02-18 16:38:17 -06001495 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
1496 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001497 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001498 sprintf(str, "In xglCmdBindIndexData() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001499 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1500 }
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001501 // Now update CB's index binding list
1502 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cmdBuffer);
1503 if (!pCBTrav) {
1504 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001505 sprintf(str, "Trying to BindIndexData buffer obj %p to CB %p but no Node for that CB. Was CB incorrectly destroyed?", buffer, cmdBuffer);
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001506 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_MEM_OBJ, (char *) "MEM", (char *) str);
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001507 } else {
1508 MEMORY_BINDING *pBindInfo;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001509 uint32_t dontCare;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001510 XGL_RESULT result;
1511 pBindInfo = malloc(sizeof(MEMORY_BINDING));
1512 pBindInfo->indexType = indexType;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001513 pBindInfo->buffer = buffer;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001514 pBindInfo->offset = offset;
1515 pBindInfo->binding = 0;
1516 result = insertMiniNode(&pCBTrav->pIndexBufList, pBindInfo, &dontCare);
1517 if (result) {
1518 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001519 sprintf(str, "In xglCmdBindIndexData and ran out of memory to track binding. CmdBuffer: %p, buffer %p", cmdBuffer, buffer);
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001520 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
1521 }
1522 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001523
1524 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001525}
1526
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001527
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001528
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001529XGL_LAYER_EXPORT void XGLAPI xglCmdDraw(XGL_CMD_BUFFER cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001530{
1531 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
1532}
1533
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001534XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndexed(XGL_CMD_BUFFER cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001535{
1536 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
1537}
1538
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001539XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t count, uint32_t stride)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001540{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001541 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
1542 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001543 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001544 sprintf(str, "In xglCmdDrawIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001545 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1546 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001547 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001548}
1549
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001550XGL_LAYER_EXPORT void XGLAPI xglCmdDrawIndexedIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, uint32_t count, uint32_t stride)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001551{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001552 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
1553 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001554 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001555 sprintf(str, "In xglCmdDrawIndexedIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001556 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1557 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001558 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001559}
1560
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001561XGL_LAYER_EXPORT void XGLAPI xglCmdDispatch(XGL_CMD_BUFFER cmdBuffer, uint32_t x, uint32_t y, uint32_t z)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001562{
1563 nextTable.CmdDispatch(cmdBuffer, x, y, z);
1564}
1565
Mark Lobodzinski15427102015-02-18 16:38:17 -06001566XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001567{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001568 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001569 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1570 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001571 sprintf(str, "In xglCmdDispatchIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001572 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1573 }
Mark Lobodzinski15427102015-02-18 16:38:17 -06001574 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001575}
1576
Mark Lobodzinski15427102015-02-18 16:38:17 -06001577XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER srcBuffer, XGL_BUFFER destBuffer, uint32_t regionCount, const XGL_BUFFER_COPY* pRegions)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001578{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001579 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcBuffer);
1580 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001581 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001582 sprintf(str, "In xglCmdCopyBuffer() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001583 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1584 }
Mark Lobodzinski15427102015-02-18 16:38:17 -06001585 mem = getMemBindingFromObject(destBuffer);
1586 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001587 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001588 sprintf(str, "In xglCmdCopyBuffer() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001589 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1590 }
Mark Lobodzinski15427102015-02-18 16:38:17 -06001591 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001592}
1593
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001594XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, uint32_t regionCount, const XGL_IMAGE_COPY* pRegions)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001595{
1596 // TODO : Each image will have mem mapping so track them
1597 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
1598}
1599
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001600XGL_LAYER_EXPORT void XGLAPI xglCmdCopyBufferToImage(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER srcBuffer, XGL_IMAGE destImage, uint32_t regionCount, const XGL_BUFFER_IMAGE_COPY* pRegions)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001601{
1602 // TODO : Track this
1603 XGL_GPU_MEMORY mem = getMemBindingFromObject(destImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001604 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1605 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001606 sprintf(str, "In xglCmdCopyMemoryToImage() call unable to update binding of destImage buffer %p to cmdBuffer %p", destImage, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001607 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1608 }
Mark Lobodzinski15427102015-02-18 16:38:17 -06001609
1610 mem = getMemBindingFromObject(srcBuffer);
1611 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001612 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001613 sprintf(str, "In xglCmdCopyMemoryToImage() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001614 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1615 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001616 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, regionCount, pRegions);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001617}
1618
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001619XGL_LAYER_EXPORT void XGLAPI xglCmdCopyImageToBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_BUFFER destBuffer, uint32_t regionCount, const XGL_BUFFER_IMAGE_COPY* pRegions)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001620{
1621 // TODO : Track this
1622 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001623 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1624 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001625 sprintf(str, "In xglCmdCopyImageToMemory() call unable to update binding of srcImage buffer %p to cmdBuffer %p", srcImage, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001626 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1627 }
Mark Lobodzinski15427102015-02-18 16:38:17 -06001628 mem = getMemBindingFromObject(destBuffer);
1629 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001630 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001631 sprintf(str, "In xglCmdCopyImageToMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001632 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1633 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001634 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, destBuffer, regionCount, pRegions);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001635}
1636
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001637XGL_LAYER_EXPORT void XGLAPI xglCmdCloneImageData(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE_LAYOUT srcImageLayout, XGL_IMAGE destImage, XGL_IMAGE_LAYOUT destImageLayout)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001638{
1639 // TODO : Each image will have mem mapping so track them
1640 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001641 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1642 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001643 sprintf(str, "In xglCmdCloneImageData() call unable to update binding of srcImage buffer %p to cmdBuffer %p", srcImage, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001644 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1645 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001646 mem = getMemBindingFromObject(destImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001647 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1648 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001649 sprintf(str, "In xglCmdCloneImageData() call unable to update binding of destImage buffer %p to cmdBuffer %p", destImage, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001650 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1651 }
Mike Stroyan55658c22014-12-04 11:08:39 +00001652 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001653}
1654
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001655XGL_LAYER_EXPORT void XGLAPI xglCmdUpdateBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE dataSize, const uint32_t* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001656{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001657 XGL_GPU_MEMORY mem = getMemBindingFromObject(destBuffer);
1658 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001659 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001660 sprintf(str, "In xglCmdUpdateMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001661 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1662 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001663 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001664}
1665
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001666XGL_LAYER_EXPORT void XGLAPI xglCmdFillBuffer(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset, XGL_GPU_SIZE fillSize, uint32_t data)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001667{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001668 XGL_GPU_MEMORY mem = getMemBindingFromObject(destBuffer);
1669 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001670 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001671 sprintf(str, "In xglCmdFillMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001672 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1673 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001674 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001675}
1676
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001677XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const float color[4], uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001678{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001679 // TODO : Verify memory is in XGL_IMAGE_STATE_CLEAR state
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001680 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehlis62086412014-11-19 16:19:28 -07001681 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1682 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001683 sprintf(str, "In xglCmdClearColorImage() call unable to update binding of image buffer %p to cmdBuffer %p", image, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001684 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1685 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001686 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
1687}
1688
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001689XGL_LAYER_EXPORT void XGLAPI xglCmdClearColorImageRaw(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, const uint32_t color[4], uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001690{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001691 // TODO : Verify memory is in XGL_IMAGE_STATE_CLEAR state
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001692 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehlis62086412014-11-19 16:19:28 -07001693 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1694 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001695 sprintf(str, "In xglCmdClearColorImageRaw() call unable to update binding of image buffer %p to cmdBuffer %p", image, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001696 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1697 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001698 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
1699}
1700
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001701XGL_LAYER_EXPORT void XGLAPI xglCmdClearDepthStencil(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE image, float depth, uint32_t stencil, uint32_t rangeCount, const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001702{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001703 // TODO : Verify memory is in XGL_IMAGE_STATE_CLEAR state
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001704 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehlis62086412014-11-19 16:19:28 -07001705 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1706 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001707 sprintf(str, "In xglCmdClearDepthStencil() call unable to update binding of image buffer %p to cmdBuffer %p", image, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001708 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1709 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001710 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
1711}
1712
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001713XGL_LAYER_EXPORT void XGLAPI xglCmdResolveImage(XGL_CMD_BUFFER cmdBuffer, XGL_IMAGE srcImage, XGL_IMAGE destImage, uint32_t rectCount, const XGL_IMAGE_RESOLVE* pRects)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001714{
1715 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001716 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1717 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001718 sprintf(str, "In xglCmdResolveImage() call unable to update binding of srcImage buffer %p to cmdBuffer %p", srcImage, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001719 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1720 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001721 mem = getMemBindingFromObject(destImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001722 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1723 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001724 sprintf(str, "In xglCmdResolveImage() call unable to update binding of destImage buffer %p to cmdBuffer %p", destImage, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001725 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1726 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001727 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
1728}
1729
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001730XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_SET_EVENT pipeEvent)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001731{
Mike Stroyan55658c22014-12-04 11:08:39 +00001732 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001733}
1734
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001735XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001736{
1737 nextTable.CmdResetEvent(cmdBuffer, event);
1738}
1739
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001740XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo)
Mike Stroyan55658c22014-12-04 11:08:39 +00001741{
1742 nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo);
1743}
1744
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001745XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier)
Mike Stroyan55658c22014-12-04 11:08:39 +00001746{
1747 nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier);
1748}
1749
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001750XGL_LAYER_EXPORT void XGLAPI xglCmdBeginQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot, XGL_FLAGS flags)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001751{
1752 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehlis62086412014-11-19 16:19:28 -07001753 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1754 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001755 sprintf(str, "In xglCmdBeginQuery() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001756 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1757 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001758 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
1759}
1760
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001761XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001762{
1763 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehlis62086412014-11-19 16:19:28 -07001764 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1765 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001766 sprintf(str, "In xglCmdEndQuery() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001767 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1768 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001769 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
1770}
1771
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001772XGL_LAYER_EXPORT void XGLAPI xglCmdResetQueryPool(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t startQuery, uint32_t queryCount)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001773{
1774 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehlis62086412014-11-19 16:19:28 -07001775 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1776 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001777 sprintf(str, "In xglCmdResetQueryPool() call unable to update binding of queryPool buffer %p to cmdBuffer %p", queryPool, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001778 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1779 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001780 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
1781}
1782
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001783XGL_LAYER_EXPORT void XGLAPI xglCmdWriteTimestamp(XGL_CMD_BUFFER cmdBuffer, XGL_TIMESTAMP_TYPE timestampType, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001784{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001785 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001786}
1787
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001788XGL_LAYER_EXPORT void XGLAPI xglCmdInitAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, const uint32_t* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001789{
1790 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
1791}
1792
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001793XGL_LAYER_EXPORT void XGLAPI xglCmdLoadAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, XGL_BUFFER srcBuffer, XGL_GPU_SIZE srcOffset)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001794{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001795 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001796}
1797
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001798XGL_LAYER_EXPORT void XGLAPI xglCmdSaveAtomicCounters(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001799{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001800 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
1801}
1802
1803XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFramebuffer(XGL_DEVICE device, const XGL_FRAMEBUFFER_CREATE_INFO* pCreateInfo, XGL_FRAMEBUFFER* pFramebuffer)
1804{
1805 XGL_RESULT result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
1806 return result;
1807}
1808
1809XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRenderPass(XGL_DEVICE device, const XGL_RENDER_PASS_CREATE_INFO* pCreateInfo, XGL_RENDER_PASS* pRenderPass)
1810{
1811 XGL_RESULT result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
1812 return result;
1813}
1814
1815XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
1816{
1817 nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
1818}
1819
1820XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
1821{
1822 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001823}
1824
1825XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
1826{
1827 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
1828 return result;
1829}
1830
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001831XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001832{
Tobin Ehlis62086412014-11-19 16:19:28 -07001833 // This layer intercepts callbacks
1834 XGL_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
1835 if (!pNewDbgFuncNode)
1836 return XGL_ERROR_OUT_OF_MEMORY;
1837 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
1838 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburnf57ea372014-12-22 13:24:15 -07001839 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
1840 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001841 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
1842 return result;
1843}
1844
1845XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
1846{
Jon Ashburnf57ea372014-12-22 13:24:15 -07001847 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlis62086412014-11-19 16:19:28 -07001848 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
1849 while (pTrav) {
1850 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
1851 pPrev->pNext = pTrav->pNext;
Jon Ashburnf57ea372014-12-22 13:24:15 -07001852 if (g_pDbgFunctionHead == pTrav)
1853 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlis62086412014-11-19 16:19:28 -07001854 free(pTrav);
1855 break;
1856 }
1857 pPrev = pTrav;
1858 pTrav = pTrav->pNext;
1859 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001860 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
1861 return result;
1862}
1863
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001864XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, int32_t msgCode, XGL_DBG_MSG_FILTER filter)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001865{
1866 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
1867 return result;
1868}
1869
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001870XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, size_t tagSize, const void* pTag)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001871{
1872 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
1873 return result;
1874}
1875
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001876XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001877{
1878 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
1879 return result;
1880}
1881
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001882XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetDeviceOption(XGL_DEVICE device, XGL_DBG_DEVICE_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001883{
1884 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
1885 return result;
1886}
1887
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001888XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001889{
1890 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
1891}
1892
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001893XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001894{
1895 nextTable.CmdDbgMarkerEnd(cmdBuffer);
1896}
1897
Ian Elliott81ac44c2015-01-13 17:52:38 -07001898#if defined(_WIN32)
1899// FIXME: NEED WINDOWS EQUIVALENT
1900#else // WIN32
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001901XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
1902{
1903 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001904 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001905 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001906 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001907 return result;
1908}
1909
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001910XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11GetMSC(XGL_DEVICE device, xcb_window_t window, xcb_randr_crtc_t crtc, uint64_t* pMsc)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001911{
Tobin Ehlis4a5d7e22014-11-11 08:00:58 -07001912 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001913 return result;
1914}
1915
1916XGL_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)
1917{
1918 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001919 if (XGL_SUCCESS == result) {
1920 // Add image object, then insert the new Mem Object and then bind it to created image
1921 insertGlobalObjectNode(*pImage, _XGL_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, sizeof(XGL_WSI_X11_PRESENTABLE_IMAGE_CREATE_INFO), "wsi_x11_image");
Mark Lobodzinski15427102015-02-18 16:38:17 -06001922 insertGlobalMemObj(*pMem, NULL);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001923 if (XGL_FALSE == updateObjectBinding(*pImage, *pMem)) {
1924 char str[1024];
1925 sprintf(str, "In xglWsiX11CreatePresentableImage(), unable to set image %p binding to mem obj %p", (void*)*pImage, (void*)*pMem);
1926 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pImage, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1927 }
Tobin Ehlis62086412014-11-19 16:19:28 -07001928 }
1929 printObjList();
1930 printMemList();
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001931 return result;
1932}
1933
1934XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
1935{
1936 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
1937 return result;
1938}
Ian Elliott81ac44c2015-01-13 17:52:38 -07001939#endif // WIN32
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001940
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001941XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001942{
1943 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08001944 void *addr;
1945
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001946 if (gpu == NULL)
1947 return NULL;
1948 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001949 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001950
Chia-I Wu706533e2015-01-05 13:18:57 +08001951 addr = layer_intercept_proc(funcName);
1952 if (addr)
1953 return addr;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001954 else {
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001955 if (gpuw->pGPA == NULL)
1956 return NULL;
1957 return gpuw->pGPA(gpuw->nextObject, funcName);
1958 }
1959}