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"))