Updated header file to version 67 (xglResetFences)
Added changes to fence semantics for this revision.
tests: Create contructor with no args
intel: Added Tony's patch for ResetFences support in the ICD.
v2: reset fence in intel_fence_seq_seqno(). We need the reset to make
xglQueueWaitIdle() work (olv)
layers: Added ResetFences support to MemTracker
Add new entrypoint and fence semantics for fence status flags.
layers: Completed changed fence semantics for MemTracker
Completed the changes for xgl header revision 67, adding resetFences.
layers: Changes to support xglResetFences
v2: squashed into one commit (olv)
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index 83cff67..a6bc088 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -97,6 +97,32 @@
return pCBInfo;
}
+// Return object info for 'object' or return NULL if no info exists
+static MT_OBJ_INFO* getObjectInfo(const XGL_OBJECT object)
+{
+ MT_OBJ_INFO* pObjInfo = NULL;
+
+ if (objectMap.find(object) != objectMap.end()) {
+ pObjInfo = objectMap[object];
+ }
+ return pObjInfo;
+}
+
+static MT_OBJ_INFO* addObjectInfo(XGL_OBJECT object, XGL_STRUCTURE_TYPE sType, const void *pCreateInfo, const int struct_size, const char *name_prefix)
+{
+ MT_OBJ_INFO* pInfo = new MT_OBJ_INFO;
+ memset(pInfo, 0, sizeof(MT_OBJ_INFO));
+ memcpy(&pInfo->create_info, pCreateInfo, struct_size);
+ sprintf(pInfo->object_name, "%s_%p", name_prefix, object);
+
+ pInfo->object = object;
+ pInfo->ref_count = 1;
+ pInfo->sType = sType;
+ objectMap[object] = pInfo;
+
+ return pInfo;
+}
+
// Add a fence, creating one if necessary to our list of fences/fenceIds
static uint64_t addFenceInfo(XGL_FENCE fence, XGL_QUEUE queue)
{
@@ -110,8 +136,9 @@
XGL_FENCE_CREATE_INFO fci;
fci.sType = XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO;
fci.pNext = NULL;
- fci.flags = 0;
+ fci.flags = static_cast<XGL_FENCE_CREATE_FLAGS>(0);
nextTable.CreateFence(globalDevice, &fci, &pFenceInfo->fence);
+ addObjectInfo(pFenceInfo->fence, fci.sType, &fci, sizeof(XGL_FENCE_CREATE_INFO), "internalFence");
pFenceInfo->localFence = XGL_TRUE;
} else {
pFenceInfo->localFence = XGL_FALSE;
@@ -159,6 +186,11 @@
} else {
deleteFenceInfo((*ii).first);
}
+ // Update fence state in fenceCreateInfo structure
+ MT_OBJ_INFO* pObjectInfo = getObjectInfo(fence);
+ if (pObjectInfo != NULL) {
+ pObjectInfo->create_info.fence_create_info.flags = XGL_FENCE_CREATE_SIGNALED_BIT;
+ }
}
}
}
@@ -241,8 +273,8 @@
MT_QUEUE_INFO *pQueueInfo = queueMap[queue];
for (it = pQueueInfo->pMemRefList.begin(); it != pQueueInfo->pMemRefList.end(); ++it) {
if ((*it) == mem) {
- result = XGL_TRUE;
- break;
+ result = XGL_TRUE;
+ break;
}
}
return result;
@@ -261,7 +293,7 @@
char str[1024];
sprintf(str, "Unknown Queue %p specified in xglQueueSubmit", queue);
layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, queue, 0, MEMTRACK_INVALID_QUEUE, "MEM", str);
- }
+ }
else {
// Iterate through all CBs in pCmdBuffers
for (uint32_t i = 0; i < cmdBufferCount; i++) {
@@ -549,32 +581,6 @@
return result;
}
-// Return object info for 'object' or return NULL if no info exists
-static MT_OBJ_INFO* getObjectInfo(const XGL_OBJECT object)
-{
- MT_OBJ_INFO* pObjInfo = NULL;
-
- if (objectMap.find(object) != objectMap.end()) {
- pObjInfo = objectMap[object];
- }
- return pObjInfo;
-}
-
-static MT_OBJ_INFO* addObjectInfo(XGL_OBJECT object, XGL_STRUCTURE_TYPE sType, const void *pCreateInfo, const int struct_size, const char *name_prefix)
-{
- MT_OBJ_INFO* pInfo = new MT_OBJ_INFO;
- memset(pInfo, 0, sizeof(MT_OBJ_INFO));
- memcpy(&pInfo->create_info, pCreateInfo, struct_size);
- sprintf(pInfo->object_name, "%s_%p", name_prefix, object);
-
- pInfo->object = object;
- pInfo->ref_count = 1;
- pInfo->sType = sType;
- objectMap[object] = pInfo;
-
- return pInfo;
-}
-
// Remove object binding performs 3 tasks:
// 1. Remove ObjectInfo from MemObjInfo list container of obj bindings & free it
// 2. Decrement refCount for MemObjInfo
@@ -903,10 +909,10 @@
char str[1024];
sprintf(str, "Unknown Queue %p", queue);
layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, queue, 0, MEMTRACK_INVALID_QUEUE, "MEM", str);
- }
+ }
else {
if (checkMemRef(queue, mem) == XGL_TRUE) {
- // Alread in list, just warn
+ // Alread in list, just warn
char str[1024];
sprintf(str, "Request to add a memory reference (%p) to Queue %p -- ref is already present in the queue's reference list", mem, queue);
layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, mem, 0, MEMTRACK_INVALID_MEM_REF, "MEM", str);
@@ -927,13 +933,13 @@
XGL_RESULT result = nextTable.QueueRemoveMemReference(queue, mem);
if (result == XGL_SUCCESS) {
loader_platform_thread_lock_mutex(&globalLock);
-
+
MT_QUEUE_INFO *pQueueInfo = queueMap[queue];
if (pQueueInfo == NULL) {
char str[1024];
sprintf(str, "Unknown Queue %p", queue);
layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, queue, 0, MEMTRACK_INVALID_QUEUE, "MEM", str);
- }
+ }
else {
for (list<XGL_GPU_MEMORY>::iterator it = pQueueInfo->pMemRefList.begin(); it != pQueueInfo->pMemRefList.end(); ++it) {
if ((*it) == mem) {
@@ -1137,6 +1143,24 @@
return result;
}
+XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglResetFences(XGL_DEVICE device, uint32_t fenceCount, XGL_FENCE* pFences)
+{
+ XGL_RESULT result = nextTable.ResetFences(device, fenceCount, pFences);
+ if (XGL_SUCCESS == result) {
+ loader_platform_thread_lock_mutex(&globalLock);
+ // Reset fence state in fenceCreateInfo structure
+ for (uint32_t i = 0; i < fenceCount; i++) {
+ MT_OBJ_INFO* pObjectInfo = getObjectInfo(pFences[i]);
+ if (pObjectInfo != NULL) {
+ pObjectInfo->create_info.fence_create_info.flags =
+ static_cast<XGL_FENCE_CREATE_FLAGS>(pObjectInfo->create_info.fence_create_info.flags & ~XGL_FENCE_CREATE_SIGNALED_BIT);
+ }
+ }
+ loader_platform_thread_unlock_mutex(&globalLock);
+ }
+ return result;
+}
+
XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglGetFenceStatus(XGL_FENCE fence)
{
XGL_RESULT result = nextTable.GetFenceStatus(fence);
@@ -1150,6 +1174,18 @@
XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglWaitForFences(XGL_DEVICE device, uint32_t fenceCount, const XGL_FENCE* pFences, bool32_t waitAll, uint64_t timeout)
{
+ // Verify fence status of submitted fences
+ for(uint32_t i = 0; i < fenceCount; i++) {
+ MT_OBJ_INFO* pObjectInfo = getObjectInfo(pFences[i]);
+ if (pObjectInfo != NULL) {
+ if (pObjectInfo->create_info.fence_create_info.flags == XGL_FENCE_CREATE_SIGNALED_BIT) {
+ char str[1024];
+ sprintf(str, "xglWaitForFences specified signaled-state Fence %p. Fences must be reset before being submitted", pFences[i]);
+ layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pFences[i], 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", str);
+ }
+ }
+ }
+
XGL_RESULT result = nextTable.WaitForFences(device, fenceCount, pFences, waitAll, timeout);
loader_platform_thread_lock_mutex(&globalLock);
@@ -1896,6 +1932,8 @@
return (void*) xglCreateFence;
if (!strcmp(funcName, "xglGetFenceStatus"))
return (void*) xglGetFenceStatus;
+ if (!strcmp(funcName, "xglResetFences"))
+ return (void*) xglResetFences;
if (!strcmp(funcName, "xglWaitForFences"))
return (void*) xglWaitForFences;
if (!strcmp(funcName, "xglQueueWaitIdle"))