blob: a0903cd9bf630a9b30e9a30bcec1adad8c13c813 [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);
Mark Lobodzinski32790592015-02-26 18:33:10 -0600658 if (0 != pTrav->allocInfo.allocationSize) {
659 char* pAllocInfoMsg = xgl_print_xgl_memory_alloc_info(&pTrav->allocInfo, "{MEM}INFO : ");
660 sprintf(str, " Mem Alloc info:\n%s", pAllocInfoMsg);
661 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
662 free(pAllocInfoMsg);
663 } else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700664 sprintf(str, " Mem Alloc info is NULL (alloc done by xglWsiX11CreatePresentableImage())");
Mark Lobodzinski32790592015-02-26 18:33:10 -0600665 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
666 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700667 MINI_NODE* pObjTrav = pTrav->pObjBindings;
Tobin Ehlis62086412014-11-19 16:19:28 -0700668 if (!pObjTrav) {
669 sprintf(str, " No XGL Object bindings");
670 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
671 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700672 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700673 sprintf(str, " XGL OBJECT Binding list w/ HEAD at %p:", pObjTrav);
674 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700675 while (pObjTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700676 sprintf(str, " OBJ_NODE(%p): XGL OBJECT %p, pNext %p", pObjTrav, pObjTrav->object, pObjTrav->pNext);
677 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700678 pObjTrav = pObjTrav->pNext;
679 }
680 }
681 MINI_NODE* pCBTrav = pTrav->pCmdBufferBindings;
Tobin Ehlis62086412014-11-19 16:19:28 -0700682 if (!pCBTrav) {
683 sprintf(str, " No Command Buffer bindings");
684 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
685 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700686 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700687 sprintf(str, " XGL Command Buffer (CB) binding list w/ HEAD at %p:", pCBTrav);
688 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700689 while (pCBTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700690 sprintf(str, " CB_NODE(%p): XGL CB %p, pNext %p", pCBTrav, pCBTrav->cmdBuffer, pCBTrav->pNext);
691 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700692 pCBTrav = pCBTrav->pNext;
693 }
694 }
695 pTrav = pTrav->pNextGlobalNode;
696 }
697 }
698}
699
700static void printGlobalCB()
701{
Tobin Ehlis62086412014-11-19 16:19:28 -0700702 char str[1024] = {0};
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700703 GLOBAL_CB_NODE* pTrav = pGlobalCBHead;
704 if (!pTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700705 sprintf(str, "Global Command Buffer (CB) list is empty :(\n");
706 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700707 }
708 else {
Tobin Ehlis62086412014-11-19 16:19:28 -0700709 sprintf(str, "Details of Global CB list w/ HEAD at %p:", (void*)pTrav);
710 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700711 while (pTrav) {
Tobin Ehlisa747e682014-11-25 14:47:20 -0700712 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 -0700713 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700714 MINI_NODE* pMemObjTrav = pTrav->pMemObjList;
715 while (pMemObjTrav) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700716 sprintf(str, " MEM_NODE(%p): Mem obj %p, pNext %p", (void*)pMemObjTrav, (void*)pMemObjTrav->mem, (void*)pMemObjTrav->pNext);
717 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, NULL, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700718 pMemObjTrav = pMemObjTrav->pNext;
719 }
720 pTrav = pTrav->pNextGlobalCBNode;
721 }
722 }
723}
724
725static XGL_FENCE createLocalFence()
726{
727 XGL_FENCE_CREATE_INFO fci;
728 fci.sType = XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO;
729 fci.pNext = NULL;
730 fci.flags = 0;
731 XGL_FENCE fence;
732 nextTable.CreateFence(globalDevice, &fci, &fence);
733 return fence;
734}
735
Mark Lobodzinski15427102015-02-18 16:38:17 -0600736static void initMemTracker(void)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700737{
Jon Ashburnf57ea372014-12-22 13:24:15 -0700738 const char *strOpt;
739 // initialize MemTracker options
Mark Lobodzinski1ee9f3a2015-02-25 15:14:06 -0600740 g_reportingLevel = getLayerOptionEnum("MemTrackerReportLevel", g_reportingLevel);
741 g_debugAction = getLayerOptionEnum("MemTrackerDebugAction", g_debugAction);
Tobin Ehlis5b7acaa2015-01-08 14:26:53 -0700742
Jon Ashburnf57ea372014-12-22 13:24:15 -0700743 if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)
744 {
745 strOpt = getLayerOption("MemTrackerLogFilename");
746 if (strOpt)
747 {
748 g_logFile = fopen(strOpt, "w");
Jon Ashburnf57ea372014-12-22 13:24:15 -0700749 }
750 if (g_logFile == NULL)
751 g_logFile = stdout;
752 }
753
754 // initialize Layer dispatch table
755 // TODO handle multiple GPUs
Mark Lobodzinski953a1692015-01-09 15:12:03 -0600756 xglGetProcAddrType fpNextGPA;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700757 fpNextGPA = pCurObj->pGPA;
758 assert(fpNextGPA);
759
Chia-I Wu0f65b1e2015-01-04 23:11:43 +0800760 layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);
761
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600762 xglGetProcAddrType fpGetProcAddr = fpNextGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (char *) "xglGetProcAddr");
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700763 nextTable.GetProcAddr = fpGetProcAddr;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700764}
765
Tobin Ehlis84c521c2015-01-19 08:42:29 -0700766XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateInstance(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_INSTANCE* pInstance)
767{
768 XGL_RESULT result = nextTable.CreateInstance(pAppInfo, pAllocCb, pInstance);
769 return result;
770}
771
772XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyInstance(XGL_INSTANCE instance)
773{
774 XGL_RESULT result = nextTable.DestroyInstance(instance);
775 return result;
776}
777
778XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateGpus(XGL_INSTANCE instance, uint32_t maxGpus, uint32_t* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
779{
780 XGL_RESULT result = nextTable.EnumerateGpus(instance, maxGpus, pGpuCount, pGpus);
781 return result;
782}
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700783
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600784XGL_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 -0700785{
786 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
787 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700788 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700789 XGL_RESULT result = nextTable.GetGpuInfo((XGL_PHYSICAL_GPU)gpuw->nextObject, infoType, pDataSize, pData);
790 return result;
791}
792
793XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDevice(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice)
794{
795 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
796 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700797 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700798 XGL_RESULT result = nextTable.CreateDevice((XGL_PHYSICAL_GPU)gpuw->nextObject, pCreateInfo, pDevice);
799 // Save off device in case we need it to create Fences
800 globalDevice = *pDevice;
801 return result;
802}
803
804XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyDevice(XGL_DEVICE device)
805{
Tobin Ehlis62086412014-11-19 16:19:28 -0700806 char str[1024];
807 sprintf(str, "Printing List details prior to xglDestroyDevice()");
808 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, device, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700809 printMemList();
810 printGlobalCB();
811 printObjList();
Tobin Ehlis62086412014-11-19 16:19:28 -0700812 if (XGL_FALSE == deleteGlobalCBList()) {
813 sprintf(str, "Issue deleting global CB list in xglDestroyDevice()");
814 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, device, 0, MEMTRACK_INTERNAL_ERROR, "MEM", str);
815 }
Tobin Ehlis22d03232014-11-25 18:01:12 -0700816 // Report any memory leaks
817 GLOBAL_MEM_OBJ_NODE* pTrav = pGlobalMemObjHead;
818 while (pTrav) {
Mark Lobodzinskidaa1d432015-02-18 18:06:24 -0600819 if (pTrav->allocInfo.allocationSize != 0) {
820 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);
821 layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, pTrav->mem, 0, MEMTRACK_MEMORY_LEAK, "MEM", str);
822 }
Tobin Ehlis22d03232014-11-25 18:01:12 -0700823 pTrav = pTrav->pNextGlobalNode;
824 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700825 XGL_RESULT result = nextTable.DestroyDevice(device);
826 return result;
827}
828
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600829XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetExtensionSupport(XGL_PHYSICAL_GPU gpu, const char* pExtName)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700830{
831 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
832 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700833 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700834 XGL_RESULT result = nextTable.GetExtensionSupport((XGL_PHYSICAL_GPU)gpuw->nextObject, pExtName);
835 return result;
836}
837
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600838XGL_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 -0700839{
Jon Ashburn451c16f2014-11-25 11:08:42 -0700840 if (gpu != NULL)
841 {
842 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
843 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700844 loader_platform_thread_once(&g_initOnce, initMemTracker);
Mark Lobodzinski953a1692015-01-09 15:12:03 -0600845 XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayerCount, pOutLayers, pReserved);
Jon Ashburn451c16f2014-11-25 11:08:42 -0700846 return result;
847 } else
848 {
849 if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL)
850 return XGL_ERROR_INVALID_POINTER;
851 // This layer compatible with all GPUs
852 *pOutLayerCount = 1;
Chia-I Wua837c522014-12-16 10:47:33 +0800853 strncpy((char *) pOutLayers[0], "MemTracker", maxStringSize);
Jon Ashburn451c16f2014-11-25 11:08:42 -0700854 return XGL_SUCCESS;
855 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700856}
857
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600858XGL_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 -0700859{
860 XGL_RESULT result = nextTable.GetDeviceQueue(device, queueType, queueIndex, pQueue);
861 return result;
862}
863
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600864XGL_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 -0700865{
Mark Lobodzinski821b57f2015-02-25 18:11:05 -0600866 bool32_t localFlag = XGL_FALSE;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700867 // TODO : Need to track fence and clear mem references when fence clears
868 XGL_FENCE localFence = fence;
869 if (XGL_NULL_HANDLE == fence) { // allocate our own fence to track cmd buffer
870 localFence = createLocalFence();
Mark Lobodzinski821b57f2015-02-25 18:11:05 -0600871 localFlag = XGL_TRUE;
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700872 }
Tobin Ehlis62086412014-11-19 16:19:28 -0700873 char str[1024];
874 sprintf(str, "In xglQueueSubmit(), checking %u cmdBuffers with %u memRefs", cmdBufferCount, memRefCount);
875 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, queue, 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700876 printMemList();
877 printGlobalCB();
878 for (uint32_t i = 0; i < cmdBufferCount; i++) {
Mark Lobodzinski821b57f2015-02-25 18:11:05 -0600879 setCBFence(pCmdBuffers[i], localFence, localFlag);
Tobin Ehlis62086412014-11-19 16:19:28 -0700880 sprintf(str, "Verifying mem refs for CB %p", pCmdBuffers[i]);
881 layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_NONE, "MEM", str);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700882 if (XGL_FALSE == validateCBMemRef(pCmdBuffers[i], memRefCount, pMemRefs)) {
Tobin Ehlis62086412014-11-19 16:19:28 -0700883 sprintf(str, "Unable to verify memory references for CB %p", (void*)pCmdBuffers[i]);
884 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 -0700885 }
886 }
887 printGlobalCB();
888 XGL_RESULT result = nextTable.QueueSubmit(queue, cmdBufferCount, pCmdBuffers, memRefCount, pMemRefs, localFence);
889 return result;
890}
891
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600892XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSetGlobalMemReferences(XGL_QUEUE queue, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700893{
894 // TODO : Use global mem references as part of list checked on QueueSubmit above
895 XGL_RESULT result = nextTable.QueueSetGlobalMemReferences(queue, memRefCount, pMemRefs);
896 return result;
897}
898
899XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueWaitIdle(XGL_QUEUE queue)
900{
901 XGL_RESULT result = nextTable.QueueWaitIdle(queue);
902 return result;
903}
904
905XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDeviceWaitIdle(XGL_DEVICE device)
906{
907 XGL_RESULT result = nextTable.DeviceWaitIdle(device);
908 return result;
909}
910
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700911XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglAllocMemory(XGL_DEVICE device, const XGL_MEMORY_ALLOC_INFO* pAllocInfo, XGL_GPU_MEMORY* pMem)
912{
913 XGL_RESULT result = nextTable.AllocMemory(device, pAllocInfo, pMem);
914 // TODO : Track allocations and overall size here
Mark Lobodzinski15427102015-02-18 16:38:17 -0600915 insertGlobalMemObj(*pMem, pAllocInfo);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700916 printMemList();
917 return result;
918}
919
920XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglFreeMemory(XGL_GPU_MEMORY mem)
921{
Tobin Ehlisa747e682014-11-25 14:47:20 -0700922 /* From spec : A memory object is freed by calling xglFreeMemory() when it is no longer needed. Before
923 * freeing a memory object, an application must ensure the memory object is unbound from
924 * all API objects referencing it and that it is not referenced by any queued command buffers
925 */
Tobin Ehlis62086412014-11-19 16:19:28 -0700926 if (XGL_FALSE == freeMemNode(mem)) {
927 char str[1024];
928 sprintf(str, "Issue while freeing mem obj %p", (void*)mem);
929 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_FREE_MEM_ERROR, "MEM", str);
930 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700931 printMemList();
932 printObjList();
933 printGlobalCB();
934 XGL_RESULT result = nextTable.FreeMemory(mem);
935 return result;
936}
937
938XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetMemoryPriority(XGL_GPU_MEMORY mem, XGL_MEMORY_PRIORITY priority)
939{
940 // TODO : Update tracking for this alloc
941 // Make sure memory is not pinned, which can't have priority set
942 XGL_RESULT result = nextTable.SetMemoryPriority(mem, priority);
943 return result;
944}
945
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600946XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglMapMemory(XGL_GPU_MEMORY mem, XGL_FLAGS flags, void** ppData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700947{
948 // TODO : Track when memory is mapped
Mark Lobodzinski06f60b82015-02-25 12:16:04 -0600949 GLOBAL_MEM_OBJ_NODE *pMemObj = getGlobalMemNode(mem);
950 if ((pMemObj->allocInfo.memProps & XGL_MEMORY_PROPERTY_CPU_VISIBLE_BIT) == 0) {
951 char str[1024];
952 sprintf(str, "Mapping Memory (%p) without XGL_MEMORY_PROPERTY_CPU_VISIBLE_BIT set", (void*)mem);
953 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_STATE, "MEM", str);
954 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700955 XGL_RESULT result = nextTable.MapMemory(mem, flags, ppData);
956 return result;
957}
958
959XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglUnmapMemory(XGL_GPU_MEMORY mem)
960{
961 // TODO : Track as memory gets unmapped, do we want to check what changed following map?
962 // Make sure that memory was ever mapped to begin with
963 XGL_RESULT result = nextTable.UnmapMemory(mem);
964 return result;
965}
966
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600967XGL_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 -0700968{
969 // TODO : Track this
970 // Verify that memory is actually pinnable
971 XGL_RESULT result = nextTable.PinSystemMemory(device, pSysMem, memSize, pMem);
972 return result;
973}
974
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700975XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetMultiGpuCompatibility(XGL_PHYSICAL_GPU gpu0, XGL_PHYSICAL_GPU gpu1, XGL_GPU_COMPATIBILITY_INFO* pInfo)
976{
977 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu0;
978 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -0700979 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -0700980 XGL_RESULT result = nextTable.GetMultiGpuCompatibility((XGL_PHYSICAL_GPU)gpuw->nextObject, gpu1, pInfo);
981 return result;
982}
983
984XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedMemory(XGL_DEVICE device, const XGL_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
985{
986 // TODO : Track this
987 XGL_RESULT result = nextTable.OpenSharedMemory(device, pOpenInfo, pMem);
988 return result;
989}
990
991XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenSharedQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_OPEN_INFO* pOpenInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
992{
993 XGL_RESULT result = nextTable.OpenSharedQueueSemaphore(device, pOpenInfo, pSemaphore);
994 return result;
995}
996
997XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerMemory(XGL_DEVICE device, const XGL_PEER_MEMORY_OPEN_INFO* pOpenInfo, XGL_GPU_MEMORY* pMem)
998{
999 // TODO : Track this
1000 XGL_RESULT result = nextTable.OpenPeerMemory(device, pOpenInfo, pMem);
1001 return result;
1002}
1003
1004XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglOpenPeerImage(XGL_DEVICE device, const XGL_PEER_IMAGE_OPEN_INFO* pOpenInfo, XGL_IMAGE* pImage, XGL_GPU_MEMORY* pMem)
1005{
1006 // TODO : Track this
1007 XGL_RESULT result = nextTable.OpenPeerImage(device, pOpenInfo, pImage, pMem);
1008 return result;
1009}
1010
1011XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDestroyObject(XGL_OBJECT object)
1012{
Tobin Ehlise6884ef2014-11-27 07:52:04 -07001013 // First check if this is a CmdBuffer
1014 if (NULL != getGlobalCBNode((XGL_CMD_BUFFER)object)) {
1015 deleteGlobalCBNode((XGL_CMD_BUFFER)object);
1016 }
1017 // Now locate node in global list along with prev node
Tobin Ehlis580c1b32014-11-25 12:27:38 -07001018 GLOBAL_OBJECT_NODE* pTrav = pGlobalObjectHead;
1019 GLOBAL_OBJECT_NODE* pPrev = pTrav;
Tobin Ehlis580c1b32014-11-25 12:27:38 -07001020 while (pTrav) {
1021 if (object == pTrav->object)
1022 break;
1023 pPrev = pTrav;
1024 pTrav = pTrav->pNext;
1025 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001026 if (pTrav) {
1027 if (pTrav->pMemNode) {
Tobin Ehlise6884ef2014-11-27 07:52:04 -07001028 // Wsi allocated Memory is tied to image object so clear the binding and free that memory automatically
1029 if (0 == pTrav->pMemNode->allocInfo.allocationSize) { // Wsi allocated memory has NULL allocInfo w/ 0 size
1030 XGL_GPU_MEMORY memToFree = pTrav->pMemNode->mem;
1031 clearObjectBinding(object);
1032 freeMemNode(memToFree);
1033 }
1034 else {
1035 char str[1024];
1036 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);
1037 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_DESTROY_OBJECT_ERROR, "MEM", str);
1038 // From the spec : If an object has previous memory binding, it is required to unbind memory from an API object before it is destroyed.
1039 clearObjectBinding(object);
1040 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001041 }
1042 if (pGlobalObjectHead == pTrav) // update HEAD if needed
1043 pGlobalObjectHead = pTrav->pNext;
Tobin Ehlis580c1b32014-11-25 12:27:38 -07001044 // Delete the obj node from global list
1045 pPrev->pNext = pTrav->pNext;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001046 free(pTrav);
1047 }
1048 XGL_RESULT result = nextTable.DestroyObject(object);
1049 return result;
1050}
1051
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001052XGL_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 -07001053{
1054 // TODO : What to track here?
1055 // Could potentially save returned mem requirements and validate values passed into BindObjectMemory for this object
Tobin Ehlis62086412014-11-19 16:19:28 -07001056 // 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 -07001057 XGL_RESULT result = nextTable.GetObjectInfo(object, infoType, pDataSize, pData);
1058 return result;
1059}
1060
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001061XGL_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 -07001062{
Jon Ashburned62b412015-01-15 10:39:19 -07001063 XGL_RESULT result = nextTable.BindObjectMemory(object, allocationIdx, mem, offset);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001064 // Track objects tied to memory
Tobin Ehlis62086412014-11-19 16:19:28 -07001065 if (XGL_FALSE == updateObjectBinding(object, mem)) {
1066 char str[1024];
1067 sprintf(str, "Unable to set object %p binding to mem obj %p", (void*)object, (void*)mem);
1068 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, object, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1069 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001070 printObjList();
1071 printMemList();
1072 return result;
1073}
1074
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001075XGL_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)
1076{
1077 XGL_RESULT result = nextTable.BindObjectMemoryRange(object, allocationIdx, rangeOffset, rangeSize, mem, memOffset);
1078 return result;
1079}
1080
1081XGL_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)
1082{
1083 XGL_RESULT result = nextTable.BindImageMemoryRange(image, allocationIdx, bindInfo, mem, memOffset);
1084 return result;
1085}
1086
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001087XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFence(XGL_DEVICE device, const XGL_FENCE_CREATE_INFO* pCreateInfo, XGL_FENCE* pFence)
1088{
1089 XGL_RESULT result = nextTable.CreateFence(device, pCreateInfo, pFence);
1090 return result;
1091}
1092
1093XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
1094{
1095 XGL_RESULT result = nextTable.GetFenceStatus(fence);
1096 return result;
1097}
1098
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001099XGL_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 -07001100{
1101 XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1102 return result;
1103}
1104
1105XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueueSemaphore(XGL_DEVICE device, const XGL_QUEUE_SEMAPHORE_CREATE_INFO* pCreateInfo, XGL_QUEUE_SEMAPHORE* pSemaphore)
1106{
1107 XGL_RESULT result = nextTable.CreateQueueSemaphore(device, pCreateInfo, pSemaphore);
1108 return result;
1109}
1110
1111XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSignalQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1112{
1113 XGL_RESULT result = nextTable.SignalQueueSemaphore(queue, semaphore);
1114 return result;
1115}
1116
1117XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitQueueSemaphore(XGL_QUEUE queue, XGL_QUEUE_SEMAPHORE semaphore)
1118{
1119 XGL_RESULT result = nextTable.WaitQueueSemaphore(queue, semaphore);
1120 return result;
1121}
1122
1123XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateEvent(XGL_DEVICE device, const XGL_EVENT_CREATE_INFO* pCreateInfo, XGL_EVENT* pEvent)
1124{
1125 XGL_RESULT result = nextTable.CreateEvent(device, pCreateInfo, pEvent);
Mark Lobodzinski15427102015-02-18 16:38:17 -06001126 if (XGL_SUCCESS == result) {
1127 insertGlobalObjectNode(*pEvent, pCreateInfo->sType, pCreateInfo, sizeof(XGL_EVENT_CREATE_INFO), "event");
1128 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001129 return result;
1130}
1131
1132XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetEventStatus(XGL_EVENT event)
1133{
1134 XGL_RESULT result = nextTable.GetEventStatus(event);
1135 return result;
1136}
1137
1138XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetEvent(XGL_EVENT event)
1139{
1140 XGL_RESULT result = nextTable.SetEvent(event);
1141 return result;
1142}
1143
1144XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetEvent(XGL_EVENT event)
1145{
1146 XGL_RESULT result = nextTable.ResetEvent(event);
1147 return result;
1148}
1149
1150XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateQueryPool(XGL_DEVICE device, const XGL_QUERY_POOL_CREATE_INFO* pCreateInfo, XGL_QUERY_POOL* pQueryPool)
1151{
1152 XGL_RESULT result = nextTable.CreateQueryPool(device, pCreateInfo, pQueryPool);
Mark Lobodzinski15427102015-02-18 16:38:17 -06001153 if (XGL_SUCCESS == result) {
1154 insertGlobalObjectNode(*pQueryPool, pCreateInfo->sType, pCreateInfo, sizeof(XGL_QUERY_POOL_CREATE_INFO), "query_pool");
1155 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001156 return result;
1157}
1158
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001159XGL_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 -07001160{
1161 XGL_RESULT result = nextTable.GetQueryPoolResults(queryPool, startQuery, queryCount, pDataSize, pData);
1162 return result;
1163}
1164
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001165XGL_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 -07001166{
1167 XGL_RESULT result = nextTable.GetFormatInfo(device, format, infoType, pDataSize, pData);
1168 return result;
1169}
1170
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001171XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBuffer(XGL_DEVICE device, const XGL_BUFFER_CREATE_INFO* pCreateInfo, XGL_BUFFER* pBuffer)
1172{
1173 XGL_RESULT result = nextTable.CreateBuffer(device, pCreateInfo, pBuffer);
Mark Lobodzinski15427102015-02-18 16:38:17 -06001174 if (XGL_SUCCESS == result) {
1175 insertGlobalObjectNode(*pBuffer, pCreateInfo->sType, pCreateInfo, sizeof(XGL_BUFFER_CREATE_INFO), "buffer");
1176 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001177 return result;
1178}
1179
1180XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateBufferView(XGL_DEVICE device, const XGL_BUFFER_VIEW_CREATE_INFO* pCreateInfo, XGL_BUFFER_VIEW* pView)
1181{
1182 XGL_RESULT result = nextTable.CreateBufferView(device, pCreateInfo, pView);
Mark Lobodzinski15427102015-02-18 16:38:17 -06001183 if (result == XGL_SUCCESS) {
1184 insertGlobalObjectNode(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_BUFFER_VIEW_CREATE_INFO), "buffer_view");
1185 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001186 return result;
1187}
1188
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001189XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImage(XGL_DEVICE device, const XGL_IMAGE_CREATE_INFO* pCreateInfo, XGL_IMAGE* pImage)
1190{
1191 XGL_RESULT result = nextTable.CreateImage(device, pCreateInfo, pImage);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001192 if (XGL_SUCCESS == result) {
1193 insertGlobalObjectNode(*pImage, pCreateInfo->sType, pCreateInfo, sizeof(XGL_IMAGE_CREATE_INFO), "image");
1194 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001195 return result;
1196}
1197
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001198XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearColor(XGL_IMAGE image, const float color[4])
1199{
1200 XGL_RESULT result = nextTable.SetFastClearColor(image, color);
1201 return result;
1202}
1203
1204XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglSetFastClearDepth(XGL_IMAGE image, float depth)
1205{
1206 XGL_RESULT result = nextTable.SetFastClearDepth(image, depth);
1207 return result;
1208}
1209
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001210XGL_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 -07001211{
1212 XGL_RESULT result = nextTable.GetImageSubresourceInfo(image, pSubresource, infoType, pDataSize, pData);
1213 return result;
1214}
1215
1216XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateImageView(XGL_DEVICE device, const XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo, XGL_IMAGE_VIEW* pView)
1217{
1218 XGL_RESULT result = nextTable.CreateImageView(device, pCreateInfo, pView);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001219 if (result == XGL_SUCCESS) {
1220 insertGlobalObjectNode(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_IMAGE_VIEW_CREATE_INFO), "image_view");
1221 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001222 return result;
1223}
1224
1225XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateColorAttachmentView(XGL_DEVICE device, const XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO* pCreateInfo, XGL_COLOR_ATTACHMENT_VIEW* pView)
1226{
1227 XGL_RESULT result = nextTable.CreateColorAttachmentView(device, pCreateInfo, pView);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001228 if (result == XGL_SUCCESS) {
1229 insertGlobalObjectNode(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO), "color_attachment_view");
1230 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001231 return result;
1232}
1233
1234XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateDepthStencilView(XGL_DEVICE device, const XGL_DEPTH_STENCIL_VIEW_CREATE_INFO* pCreateInfo, XGL_DEPTH_STENCIL_VIEW* pView)
1235{
1236 XGL_RESULT result = nextTable.CreateDepthStencilView(device, pCreateInfo, pView);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001237 if (result == XGL_SUCCESS) {
1238 insertGlobalObjectNode(*pView, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DEPTH_STENCIL_VIEW_CREATE_INFO), "ds_view");
1239 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001240 return result;
1241}
1242
1243XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateShader(XGL_DEVICE device, const XGL_SHADER_CREATE_INFO* pCreateInfo, XGL_SHADER* pShader)
1244{
1245 XGL_RESULT result = nextTable.CreateShader(device, pCreateInfo, pShader);
1246 return result;
1247}
1248
1249XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateGraphicsPipeline(XGL_DEVICE device, const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1250{
1251 XGL_RESULT result = nextTable.CreateGraphicsPipeline(device, pCreateInfo, pPipeline);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001252 if (result == XGL_SUCCESS) {
1253 insertGlobalObjectNode(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO), "graphics_pipeline");
1254 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001255 return result;
1256}
1257
1258XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateComputePipeline(XGL_DEVICE device, const XGL_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, XGL_PIPELINE* pPipeline)
1259{
1260 XGL_RESULT result = nextTable.CreateComputePipeline(device, pCreateInfo, pPipeline);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001261 if (result == XGL_SUCCESS) {
1262 insertGlobalObjectNode(*pPipeline, pCreateInfo->sType, pCreateInfo, sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO), "compute_pipeline");
1263 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001264 return result;
1265}
1266
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001267XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglStorePipeline(XGL_PIPELINE pipeline, size_t* pDataSize, void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001268{
1269 XGL_RESULT result = nextTable.StorePipeline(pipeline, pDataSize, pData);
1270 return result;
1271}
1272
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001273XGL_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 -07001274{
1275 XGL_RESULT result = nextTable.LoadPipeline(device, dataSize, pData, pPipeline);
1276 return result;
1277}
1278
1279XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreatePipelineDelta(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta)
1280{
1281 XGL_RESULT result = nextTable.CreatePipelineDelta(device, p1, p2, delta);
1282 return result;
1283}
1284
1285XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateSampler(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler)
1286{
1287 XGL_RESULT result = nextTable.CreateSampler(device, pCreateInfo, pSampler);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001288 if (result == XGL_SUCCESS) {
1289 insertGlobalObjectNode(*pSampler, pCreateInfo->sType, pCreateInfo, sizeof(XGL_SAMPLER_CREATE_INFO), "sampler");
1290 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001291 return result;
1292}
1293
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001294XGL_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 -07001295{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001296 XGL_RESULT result = nextTable.CreateDescriptorSetLayout(device, stageFlags, pSetBindPoints, priorSetLayout, pSetLayoutInfoList, pSetLayout);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001297 return result;
1298}
1299
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001300XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001301{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001302 XGL_RESULT result = nextTable.BeginDescriptorRegionUpdate(device, updateMode);
1303 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001304}
1305
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001306XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(XGL_DEVICE device, XGL_CMD_BUFFER cmd)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001307{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001308 XGL_RESULT result = nextTable.EndDescriptorRegionUpdate(device, cmd);
1309 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001310}
1311
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001312XGL_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 -07001313{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001314 XGL_RESULT result = nextTable.CreateDescriptorRegion(device, regionUsage, maxSets, pCreateInfo, pDescriptorRegion);
1315 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001316}
1317
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001318XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglClearDescriptorRegion(XGL_DESCRIPTOR_REGION descriptorRegion)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001319{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001320 XGL_RESULT result = nextTable.ClearDescriptorRegion(descriptorRegion);
1321 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001322}
1323
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001324XGL_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 -07001325{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001326 XGL_RESULT result = nextTable.AllocDescriptorSets(descriptorRegion, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
1327 return result;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001328}
1329
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001330XGL_LAYER_EXPORT void XGLAPI xglClearDescriptorSets(XGL_DESCRIPTOR_REGION descriptorRegion, uint32_t count, const XGL_DESCRIPTOR_SET* pDescriptorSets)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001331{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001332 nextTable.ClearDescriptorSets(descriptorRegion, count, pDescriptorSets);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001333}
1334
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001335XGL_LAYER_EXPORT void XGLAPI xglUpdateDescriptors(XGL_DESCRIPTOR_SET descriptorSet, const void* pUpdateChain)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001336{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001337 nextTable.UpdateDescriptors(descriptorSet, pUpdateChain);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001338}
1339
Mark Lobodzinski15427102015-02-18 16:38:17 -06001340XGL_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 -07001341{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001342 XGL_RESULT result = nextTable.CreateDynamicViewportState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001343 if (result == XGL_SUCCESS) {
Mark Lobodzinski15427102015-02-18 16:38:17 -06001344 insertGlobalObjectNode(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DYNAMIC_VP_STATE_CREATE_INFO), "viewport_state");
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001345 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001346 return result;
1347}
1348
Mark Lobodzinski15427102015-02-18 16:38:17 -06001349XGL_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 -07001350{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001351 XGL_RESULT result = nextTable.CreateDynamicRasterState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001352 if (result == XGL_SUCCESS) {
Mark Lobodzinski15427102015-02-18 16:38:17 -06001353 insertGlobalObjectNode(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DYNAMIC_RS_STATE_CREATE_INFO), "raster_state");
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001354 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001355 return result;
1356}
1357
Mark Lobodzinski15427102015-02-18 16:38:17 -06001358XGL_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 -07001359{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001360 XGL_RESULT result = nextTable.CreateDynamicColorBlendState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001361 if (result == XGL_SUCCESS) {
Mark Lobodzinski15427102015-02-18 16:38:17 -06001362 insertGlobalObjectNode(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DYNAMIC_CB_STATE_CREATE_INFO), "cb_state");
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001363 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001364 return result;
1365}
1366
Mark Lobodzinski15427102015-02-18 16:38:17 -06001367XGL_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 -07001368{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001369 XGL_RESULT result = nextTable.CreateDynamicDepthStencilState(device, pCreateInfo, pState);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001370 if (result == XGL_SUCCESS) {
Mark Lobodzinski15427102015-02-18 16:38:17 -06001371 insertGlobalObjectNode(*pState, pCreateInfo->sType, pCreateInfo, sizeof(XGL_DYNAMIC_DS_STATE_CREATE_INFO), "ds_state");
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001372 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001373 return result;
1374}
1375
1376XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateCommandBuffer(XGL_DEVICE device, const XGL_CMD_BUFFER_CREATE_INFO* pCreateInfo, XGL_CMD_BUFFER* pCmdBuffer)
1377{
1378 XGL_RESULT result = nextTable.CreateCommandBuffer(device, pCreateInfo, pCmdBuffer);
1379 // At time of cmd buffer creation, create global cmd buffer node for the returned cmd buffer
1380 if (*pCmdBuffer)
1381 insertGlobalCB(*pCmdBuffer);
1382 printGlobalCB();
1383 return result;
1384}
1385
Jon Ashburn57ba18d2014-12-31 17:11:49 -07001386XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglBeginCommandBuffer(XGL_CMD_BUFFER cmdBuffer, const XGL_CMD_BUFFER_BEGIN_INFO* pBeginInfo)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001387{
1388 // This implicitly resets the Cmd Buffer so clear memory references
Jon Ashburn57ba18d2014-12-31 17:11:49 -07001389 XGL_RESULT result = nextTable.BeginCommandBuffer(cmdBuffer, pBeginInfo);
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001390 freeCBBindings(cmdBuffer);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001391 return result;
1392}
1393
1394XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEndCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1395{
1396 // TODO : Anything to do here?
1397 XGL_RESULT result = nextTable.EndCommandBuffer(cmdBuffer);
1398 return result;
1399}
1400
1401XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetCommandBuffer(XGL_CMD_BUFFER cmdBuffer)
1402{
1403 // Clear memory references as this point. Anything else to do here?
1404 freeCBBindings(cmdBuffer);
1405 XGL_RESULT result = nextTable.ResetCommandBuffer(cmdBuffer);
1406 return result;
1407}
1408// TODO : For any xglCmdBind* calls that include an object which has mem bound to it,
1409// need to account for that mem now having binding to given cmdBuffer
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001410XGL_LAYER_EXPORT void XGLAPI xglCmdBindPipeline(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001411{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001412#if 0
1413 // TODO : If memory bound to pipeline, then need to tie that mem to cmdBuffer
1414 if (getPipeline(pipeline)) {
1415 GLOBAL_CB_NODE *pCBTrav = getGlobalCBNode(cmdBuffer);
1416 if (pCBTrav) {
1417 pCBTrav->pipelines[pipelineBindPoint] = pipeline;
1418 } else {
1419 char str[1024];
1420 sprintf(str, "Attempt to bind Pipeline %p to non-existant command buffer %p!", (void*)pipeline, cmdBuffer);
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001421 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 -07001422 }
1423 }
1424 else {
1425 char str[1024];
1426 sprintf(str, "Attempt to bind Pipeline %p that doesn't exist!", (void*)pipeline);
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001427 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 -07001428 }
1429#endif
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001430 nextTable.CmdBindPipeline(cmdBuffer, pipelineBindPoint, pipeline);
1431}
1432
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001433XGL_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 -07001434{
1435 nextTable.CmdBindPipelineDelta(cmdBuffer, pipelineBindPoint, delta);
1436}
1437
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001438XGL_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 -07001439{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001440 GLOBAL_OBJECT_NODE *pNode;
1441 GLOBAL_CB_NODE *pCmdBuf = getGlobalCBNode(cmdBuffer);
1442 if (!pCmdBuf) {
1443 char str[1024];
1444 sprintf(str, "Unable to find command buffer object %p, was it ever created?", (void*)cmdBuffer);
1445 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, "DD", str);
1446 }
1447 pNode = getGlobalObjectNode(state);
1448 if (!pNode) {
1449 char str[1024];
1450 sprintf(str, "Unable to find dynamic state object %p, was it ever created?", (void*)state);
1451 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, state, 0, MEMTRACK_INVALID_OBJECT, "DD", str);
1452 }
1453 pCmdBuf->pDynamicState[stateBindPoint] = pNode;
Mark Lobodzinski15427102015-02-18 16:38:17 -06001454 nextTable.CmdBindDynamicStateObject(cmdBuffer, stateBindPoint, state);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001455}
1456
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001457XGL_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 -07001458{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001459 // 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 -07001460 nextTable.CmdBindDescriptorSet(cmdBuffer, pipelineBindPoint, descriptorSet, pUserData);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001461}
1462
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001463XGL_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 -07001464{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001465 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
1466 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Chia-I Wufb5062e2015-01-05 13:42:56 +08001467 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001468 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 +08001469 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1470 }
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001471 // Now update CB's vertex binding list
1472 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cmdBuffer);
1473 if (!pCBTrav) {
1474 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001475 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 -07001476 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_INVALID_CB, "MEM", str);
1477 } else {
1478 MEMORY_BINDING *pBindInfo;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001479 uint32_t dontCare;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001480 XGL_RESULT result;
1481 pBindInfo = malloc(sizeof(MEMORY_BINDING));
1482 pBindInfo->offset = offset;
1483 pBindInfo->binding = binding;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001484 pBindInfo->buffer = buffer;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001485 result = insertMiniNode(&pCBTrav->pVertexBufList, pBindInfo, &dontCare);
1486 if (result) {
1487 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001488 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 -07001489 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
1490 }
1491 }
1492 lastVtxBinding = binding;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001493 nextTable.CmdBindVertexBuffer(cmdBuffer, buffer, offset, binding);
Chia-I Wufb5062e2015-01-05 13:42:56 +08001494}
1495
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001496XGL_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 -07001497{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001498 // Track this buffer. What exactly is this call doing?
Mark Lobodzinski15427102015-02-18 16:38:17 -06001499 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
1500 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001501 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001502 sprintf(str, "In xglCmdBindIndexData() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001503 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1504 }
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001505 // Now update CB's index binding list
1506 GLOBAL_CB_NODE* pCBTrav = getGlobalCBNode(cmdBuffer);
1507 if (!pCBTrav) {
1508 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001509 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 -06001510 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 -07001511 } else {
1512 MEMORY_BINDING *pBindInfo;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001513 uint32_t dontCare;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001514 XGL_RESULT result;
1515 pBindInfo = malloc(sizeof(MEMORY_BINDING));
1516 pBindInfo->indexType = indexType;
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001517 pBindInfo->buffer = buffer;
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001518 pBindInfo->offset = offset;
1519 pBindInfo->binding = 0;
1520 result = insertMiniNode(&pCBTrav->pIndexBufList, pBindInfo, &dontCare);
1521 if (result) {
1522 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001523 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 -07001524 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_OUT_OF_MEMORY_ERROR, "MEM", str);
1525 }
1526 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001527
1528 nextTable.CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001529}
1530
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001531
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001532
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001533XGL_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 -07001534{
1535 nextTable.CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
1536}
1537
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001538XGL_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 -07001539{
1540 nextTable.CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
1541}
1542
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001543XGL_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 -07001544{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001545 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
1546 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001547 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001548 sprintf(str, "In xglCmdDrawIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001549 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1550 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001551 nextTable.CmdDrawIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001552}
1553
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001554XGL_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 -07001555{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001556 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
1557 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001558 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001559 sprintf(str, "In xglCmdDrawIndexedIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001560 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1561 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001562 nextTable.CmdDrawIndexedIndirect(cmdBuffer, buffer, offset, count, stride);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001563}
1564
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001565XGL_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 -07001566{
1567 nextTable.CmdDispatch(cmdBuffer, x, y, z);
1568}
1569
Mark Lobodzinski15427102015-02-18 16:38:17 -06001570XGL_LAYER_EXPORT void XGLAPI xglCmdDispatchIndirect(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001571{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001572 XGL_GPU_MEMORY mem = getMemBindingFromObject(buffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001573 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1574 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001575 sprintf(str, "In xglCmdDispatchIndirect() call unable to update binding of buffer %p to cmdBuffer %p", buffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001576 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1577 }
Mark Lobodzinski15427102015-02-18 16:38:17 -06001578 nextTable.CmdDispatchIndirect(cmdBuffer, buffer, offset);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001579}
1580
Mark Lobodzinski15427102015-02-18 16:38:17 -06001581XGL_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 -07001582{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001583 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcBuffer);
1584 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001585 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001586 sprintf(str, "In xglCmdCopyBuffer() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001587 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1588 }
Mark Lobodzinski15427102015-02-18 16:38:17 -06001589 mem = getMemBindingFromObject(destBuffer);
1590 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001591 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001592 sprintf(str, "In xglCmdCopyBuffer() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001593 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1594 }
Mark Lobodzinski15427102015-02-18 16:38:17 -06001595 nextTable.CmdCopyBuffer(cmdBuffer, srcBuffer, destBuffer, regionCount, pRegions);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001596}
1597
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001598XGL_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 -07001599{
1600 // TODO : Each image will have mem mapping so track them
1601 nextTable.CmdCopyImage(cmdBuffer, srcImage, destImage, regionCount, pRegions);
1602}
1603
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001604XGL_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 -07001605{
1606 // TODO : Track this
1607 XGL_GPU_MEMORY mem = getMemBindingFromObject(destImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001608 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1609 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001610 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 -07001611 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1612 }
Mark Lobodzinski15427102015-02-18 16:38:17 -06001613
1614 mem = getMemBindingFromObject(srcBuffer);
1615 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001616 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001617 sprintf(str, "In xglCmdCopyMemoryToImage() call unable to update binding of srcBuffer %p to cmdBuffer %p", srcBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001618 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1619 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001620 nextTable.CmdCopyBufferToImage(cmdBuffer, srcBuffer, destImage, regionCount, pRegions);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001621}
1622
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001623XGL_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 -07001624{
1625 // TODO : Track this
1626 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001627 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1628 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001629 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 -07001630 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1631 }
Mark Lobodzinski15427102015-02-18 16:38:17 -06001632 mem = getMemBindingFromObject(destBuffer);
1633 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001634 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001635 sprintf(str, "In xglCmdCopyImageToMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001636 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1637 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001638 nextTable.CmdCopyImageToBuffer(cmdBuffer, srcImage, destBuffer, regionCount, pRegions);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001639}
1640
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001641XGL_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 -07001642{
1643 // TODO : Each image will have mem mapping so track them
1644 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001645 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1646 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001647 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 -07001648 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1649 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001650 mem = getMemBindingFromObject(destImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001651 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1652 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001653 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 -07001654 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1655 }
Mike Stroyan55658c22014-12-04 11:08:39 +00001656 nextTable.CmdCloneImageData(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001657}
1658
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001659XGL_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 -07001660{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001661 XGL_GPU_MEMORY mem = getMemBindingFromObject(destBuffer);
1662 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001663 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001664 sprintf(str, "In xglCmdUpdateMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001665 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1666 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001667 nextTable.CmdUpdateBuffer(cmdBuffer, destBuffer, destOffset, dataSize, pData);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001668}
1669
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001670XGL_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 -07001671{
Mark Lobodzinski15427102015-02-18 16:38:17 -06001672 XGL_GPU_MEMORY mem = getMemBindingFromObject(destBuffer);
1673 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
Tobin Ehlis62086412014-11-19 16:19:28 -07001674 char str[1024];
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001675 sprintf(str, "In xglCmdFillMemory() call unable to update binding of destBuffer %p to cmdBuffer %p", destBuffer, cmdBuffer);
Tobin Ehlis62086412014-11-19 16:19:28 -07001676 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1677 }
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001678 nextTable.CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001679}
1680
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001681XGL_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 -07001682{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001683 // TODO : Verify memory is in XGL_IMAGE_STATE_CLEAR state
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001684 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehlis62086412014-11-19 16:19:28 -07001685 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1686 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001687 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 -07001688 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1689 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001690 nextTable.CmdClearColorImage(cmdBuffer, image, color, rangeCount, pRanges);
1691}
1692
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001693XGL_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 -07001694{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001695 // TODO : Verify memory is in XGL_IMAGE_STATE_CLEAR state
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001696 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehlis62086412014-11-19 16:19:28 -07001697 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1698 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001699 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 -07001700 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1701 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001702 nextTable.CmdClearColorImageRaw(cmdBuffer, image, color, rangeCount, pRanges);
1703}
1704
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001705XGL_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 -07001706{
Tobin Ehlis2836a7d2015-01-08 15:22:32 -07001707 // TODO : Verify memory is in XGL_IMAGE_STATE_CLEAR state
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001708 XGL_GPU_MEMORY mem = getMemBindingFromObject(image);
Tobin Ehlis62086412014-11-19 16:19:28 -07001709 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1710 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001711 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 -07001712 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1713 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001714 nextTable.CmdClearDepthStencil(cmdBuffer, image, depth, stencil, rangeCount, pRanges);
1715}
1716
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001717XGL_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 -07001718{
1719 XGL_GPU_MEMORY mem = getMemBindingFromObject(srcImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001720 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1721 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001722 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 -07001723 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1724 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001725 mem = getMemBindingFromObject(destImage);
Tobin Ehlis62086412014-11-19 16:19:28 -07001726 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1727 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001728 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 -07001729 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1730 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001731 nextTable.CmdResolveImage(cmdBuffer, srcImage, destImage, rectCount, pRects);
1732}
1733
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001734XGL_LAYER_EXPORT void XGLAPI xglCmdSetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event, XGL_SET_EVENT pipeEvent)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001735{
Mike Stroyan55658c22014-12-04 11:08:39 +00001736 nextTable.CmdSetEvent(cmdBuffer, event, pipeEvent);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001737}
1738
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001739XGL_LAYER_EXPORT void XGLAPI xglCmdResetEvent(XGL_CMD_BUFFER cmdBuffer, XGL_EVENT event)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001740{
1741 nextTable.CmdResetEvent(cmdBuffer, event);
1742}
1743
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001744XGL_LAYER_EXPORT void XGLAPI xglCmdWaitEvents(XGL_CMD_BUFFER cmdBuffer, const XGL_EVENT_WAIT_INFO* pWaitInfo)
Mike Stroyan55658c22014-12-04 11:08:39 +00001745{
1746 nextTable.CmdWaitEvents(cmdBuffer, pWaitInfo);
1747}
1748
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001749XGL_LAYER_EXPORT void XGLAPI xglCmdPipelineBarrier(XGL_CMD_BUFFER cmdBuffer, const XGL_PIPELINE_BARRIER* pBarrier)
Mike Stroyan55658c22014-12-04 11:08:39 +00001750{
1751 nextTable.CmdPipelineBarrier(cmdBuffer, pBarrier);
1752}
1753
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001754XGL_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 -07001755{
1756 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehlis62086412014-11-19 16:19:28 -07001757 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1758 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001759 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 -07001760 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1761 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001762 nextTable.CmdBeginQuery(cmdBuffer, queryPool, slot, flags);
1763}
1764
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001765XGL_LAYER_EXPORT void XGLAPI xglCmdEndQuery(XGL_CMD_BUFFER cmdBuffer, XGL_QUERY_POOL queryPool, uint32_t slot)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001766{
1767 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehlis62086412014-11-19 16:19:28 -07001768 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1769 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001770 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 -07001771 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1772 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001773 nextTable.CmdEndQuery(cmdBuffer, queryPool, slot);
1774}
1775
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001776XGL_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 -07001777{
1778 XGL_GPU_MEMORY mem = getMemBindingFromObject(queryPool);
Tobin Ehlis62086412014-11-19 16:19:28 -07001779 if (XGL_FALSE == updateCBBinding(cmdBuffer, mem)) {
1780 char str[1024];
Mark Lobodzinski15427102015-02-18 16:38:17 -06001781 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 -07001782 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1783 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001784 nextTable.CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
1785}
1786
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001787XGL_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 -07001788{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001789 nextTable.CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001790}
1791
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001792XGL_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 -07001793{
1794 nextTable.CmdInitAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, pData);
1795}
1796
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001797XGL_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 -07001798{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001799 nextTable.CmdLoadAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, srcBuffer, srcOffset);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001800}
1801
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001802XGL_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 -07001803{
Tobin Ehlis84c521c2015-01-19 08:42:29 -07001804 nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
1805}
1806
1807XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateFramebuffer(XGL_DEVICE device, const XGL_FRAMEBUFFER_CREATE_INFO* pCreateInfo, XGL_FRAMEBUFFER* pFramebuffer)
1808{
1809 XGL_RESULT result = nextTable.CreateFramebuffer(device, pCreateInfo, pFramebuffer);
1810 return result;
1811}
1812
1813XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglCreateRenderPass(XGL_DEVICE device, const XGL_RENDER_PASS_CREATE_INFO* pCreateInfo, XGL_RENDER_PASS* pRenderPass)
1814{
1815 XGL_RESULT result = nextTable.CreateRenderPass(device, pCreateInfo, pRenderPass);
1816 return result;
1817}
1818
1819XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
1820{
1821 nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
1822}
1823
1824XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
1825{
1826 nextTable.CmdEndRenderPass(cmdBuffer, renderPass);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001827}
1828
1829XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetValidationLevel(XGL_DEVICE device, XGL_VALIDATION_LEVEL validationLevel)
1830{
1831 XGL_RESULT result = nextTable.DbgSetValidationLevel(device, validationLevel);
1832 return result;
1833}
1834
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001835XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, void* pUserData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001836{
Tobin Ehlis62086412014-11-19 16:19:28 -07001837 // This layer intercepts callbacks
1838 XGL_LAYER_DBG_FUNCTION_NODE *pNewDbgFuncNode = (XGL_LAYER_DBG_FUNCTION_NODE*)malloc(sizeof(XGL_LAYER_DBG_FUNCTION_NODE));
1839 if (!pNewDbgFuncNode)
1840 return XGL_ERROR_OUT_OF_MEMORY;
1841 pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback;
1842 pNewDbgFuncNode->pUserData = pUserData;
Jon Ashburnf57ea372014-12-22 13:24:15 -07001843 pNewDbgFuncNode->pNext = g_pDbgFunctionHead;
1844 g_pDbgFunctionHead = pNewDbgFuncNode;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001845 XGL_RESULT result = nextTable.DbgRegisterMsgCallback(pfnMsgCallback, pUserData);
1846 return result;
1847}
1848
1849XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
1850{
Jon Ashburnf57ea372014-12-22 13:24:15 -07001851 XGL_LAYER_DBG_FUNCTION_NODE *pTrav = g_pDbgFunctionHead;
Tobin Ehlis62086412014-11-19 16:19:28 -07001852 XGL_LAYER_DBG_FUNCTION_NODE *pPrev = pTrav;
1853 while (pTrav) {
1854 if (pTrav->pfnMsgCallback == pfnMsgCallback) {
1855 pPrev->pNext = pTrav->pNext;
Jon Ashburnf57ea372014-12-22 13:24:15 -07001856 if (g_pDbgFunctionHead == pTrav)
1857 g_pDbgFunctionHead = pTrav->pNext;
Tobin Ehlis62086412014-11-19 16:19:28 -07001858 free(pTrav);
1859 break;
1860 }
1861 pPrev = pTrav;
1862 pTrav = pTrav->pNext;
1863 }
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001864 XGL_RESULT result = nextTable.DbgUnregisterMsgCallback(pfnMsgCallback);
1865 return result;
1866}
1867
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001868XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetMessageFilter(XGL_DEVICE device, int32_t msgCode, XGL_DBG_MSG_FILTER filter)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001869{
1870 XGL_RESULT result = nextTable.DbgSetMessageFilter(device, msgCode, filter);
1871 return result;
1872}
1873
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001874XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetObjectTag(XGL_BASE_OBJECT object, size_t tagSize, const void* pTag)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001875{
1876 XGL_RESULT result = nextTable.DbgSetObjectTag(object, tagSize, pTag);
1877 return result;
1878}
1879
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001880XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, size_t dataSize, const void* pData)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001881{
1882 XGL_RESULT result = nextTable.DbgSetGlobalOption(dbgOption, dataSize, pData);
1883 return result;
1884}
1885
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001886XGL_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 -07001887{
1888 XGL_RESULT result = nextTable.DbgSetDeviceOption(device, dbgOption, dataSize, pData);
1889 return result;
1890}
1891
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001892XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerBegin(XGL_CMD_BUFFER cmdBuffer, const char* pMarker)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001893{
1894 nextTable.CmdDbgMarkerBegin(cmdBuffer, pMarker);
1895}
1896
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001897XGL_LAYER_EXPORT void XGLAPI xglCmdDbgMarkerEnd(XGL_CMD_BUFFER cmdBuffer)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001898{
1899 nextTable.CmdDbgMarkerEnd(cmdBuffer);
1900}
1901
Ian Elliott81ac44c2015-01-13 17:52:38 -07001902#if defined(_WIN32)
1903// FIXME: NEED WINDOWS EQUIVALENT
1904#else // WIN32
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001905XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11AssociateConnection(XGL_PHYSICAL_GPU gpu, const XGL_WSI_X11_CONNECTION_INFO* pConnectionInfo)
1906{
1907 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001908 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001909 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001910 XGL_RESULT result = nextTable.WsiX11AssociateConnection((XGL_PHYSICAL_GPU)gpuw->nextObject, pConnectionInfo);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001911 return result;
1912}
1913
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001914XGL_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 -07001915{
Tobin Ehlis4a5d7e22014-11-11 08:00:58 -07001916 XGL_RESULT result = nextTable.WsiX11GetMSC(device, window, crtc, pMsc);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001917 return result;
1918}
1919
1920XGL_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)
1921{
1922 XGL_RESULT result = nextTable.WsiX11CreatePresentableImage(device, pCreateInfo, pImage, pMem);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001923 if (XGL_SUCCESS == result) {
1924 // Add image object, then insert the new Mem Object and then bind it to created image
1925 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 -06001926 insertGlobalMemObj(*pMem, NULL);
Tobin Ehlis6aa77422015-01-07 17:49:29 -07001927 if (XGL_FALSE == updateObjectBinding(*pImage, *pMem)) {
1928 char str[1024];
1929 sprintf(str, "In xglWsiX11CreatePresentableImage(), unable to set image %p binding to mem obj %p", (void*)*pImage, (void*)*pMem);
1930 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, *pImage, 0, MEMTRACK_MEMORY_BINDING_ERROR, "MEM", str);
1931 }
Tobin Ehlis62086412014-11-19 16:19:28 -07001932 }
1933 printObjList();
1934 printMemList();
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001935 return result;
1936}
1937
1938XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWsiX11QueuePresent(XGL_QUEUE queue, const XGL_WSI_X11_PRESENT_INFO* pPresentInfo, XGL_FENCE fence)
1939{
1940 XGL_RESULT result = nextTable.WsiX11QueuePresent(queue, pPresentInfo, fence);
1941 return result;
1942}
Ian Elliott81ac44c2015-01-13 17:52:38 -07001943#endif // WIN32
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001944
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001945XGL_LAYER_EXPORT void* XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const char* funcName)
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001946{
1947 XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
Chia-I Wu706533e2015-01-05 13:18:57 +08001948 void *addr;
1949
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001950 if (gpu == NULL)
1951 return NULL;
1952 pCurObj = gpuw;
Ian Elliott81ac44c2015-01-13 17:52:38 -07001953 loader_platform_thread_once(&g_initOnce, initMemTracker);
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001954
Chia-I Wu706533e2015-01-05 13:18:57 +08001955 addr = layer_intercept_proc(funcName);
1956 if (addr)
1957 return addr;
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001958 else {
Tobin Ehlis791a49c2014-11-10 12:29:12 -07001959 if (gpuw->pGPA == NULL)
1960 return NULL;
1961 return gpuw->pGPA(gpuw->nextObject, funcName);
1962 }
1963}