return pTrav;
}
// Set fence for given cb in global cb node
-static bool32_t setCBFence(const XGL_CMD_BUFFER cb, const XGL_FENCE fence)
+static bool32_t setCBFence(const XGL_CMD_BUFFER cb, const XGL_FENCE fence, bool32_t localFlag)
{
GLOBAL_CB_NODE* pTrav = getGlobalCBNode(cb);
if (!pTrav) {
return XGL_FALSE;
}
pTrav->fence = fence;
+ pTrav->localFlag = localFlag;
return XGL_TRUE;
}
layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cb, 0, MEMTRACK_INVALID_CB, "MEM", str);
return XGL_FALSE;
}
+ if ((pCBTrav->fence != NULL) && (pCBTrav->localFlag == XGL_TRUE)) {
+ nextTable.DestroyObject(pCBTrav->fence);
+ pCBTrav->fence = NULL;
+ pCBTrav->localFlag = XGL_FALSE;
+ }
MINI_NODE* pMemTrav = pCBTrav->pMemObjList;
MINI_NODE* pDeleteMe = NULL;
// We traverse LL in order and free nodes as they're cleared
XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglQueueSubmit(XGL_QUEUE queue, uint32_t cmdBufferCount, const XGL_CMD_BUFFER* pCmdBuffers, uint32_t memRefCount, const XGL_MEMORY_REF* pMemRefs, XGL_FENCE fence)
{
+ bool32_t localFlag = XGL_FALSE;
// TODO : Need to track fence and clear mem references when fence clears
XGL_FENCE localFence = fence;
if (XGL_NULL_HANDLE == fence) { // allocate our own fence to track cmd buffer
localFence = createLocalFence();
+ localFlag = XGL_TRUE;
}
char str[1024];
sprintf(str, "In xglQueueSubmit(), checking %u cmdBuffers with %u memRefs", cmdBufferCount, memRefCount);
printMemList();
printGlobalCB();
for (uint32_t i = 0; i < cmdBufferCount; i++) {
- setCBFence(pCmdBuffers[i], localFence);
+ setCBFence(pCmdBuffers[i], localFence, localFlag);
sprintf(str, "Verifying mem refs for CB %p", pCmdBuffers[i]);
layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, pCmdBuffers[i], 0, MEMTRACK_NONE, "MEM", str);
if (XGL_FALSE == validateCBMemRef(pCmdBuffers[i], memRefCount, pMemRefs)) {