layers: Updated Object Tracker to support callbacks and extensions
diff --git a/layers/object_track.h b/layers/object_track.h
new file mode 100644
index 0000000..d541b7c
--- /dev/null
+++ b/layers/object_track.h
@@ -0,0 +1,122 @@
+/*
+ * XGL
+ *
+ * Copyright (C) 2014 LunarG, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "xglLayer.h"
+
+// Object type enum
+typedef enum _XGL_OBJECT_TYPE
+{
+    XGL_OBJECT_TYPE_DEVICE                     = 0,
+    XGL_OBJECT_TYPE_GPU_MEMORY                 = 1,
+    XGL_OBJECT_TYPE_FENCE                      = 2,
+    XGL_OBJECT_TYPE_QUEUE_SEMAPHORE            = 4,
+    XGL_OBJECT_TYPE_QUEUE                      = 5,
+    XGL_OBJECT_TYPE_EVENT                      = 6,
+    XGL_OBJECT_TYPE_QUERY_POOL                 = 7,
+    XGL_OBJECT_TYPE_IMAGE                      = 8,
+    XGL_OBJECT_TYPE_IMAGE_VIEW                 = 9,
+    XGL_OBJECT_TYPE_COLOR_ATTACHMENT_VIEW      = 10,
+    XGL_OBJECT_TYPE_DEPTH_STENCIL_VIEW         = 11,
+    XGL_OBJECT_TYPE_SHADER                     = 12,
+    XGL_OBJECT_TYPE_PIPELINE                   = 13,
+    XGL_OBJECT_TYPE_PIPELINE_DELTA             = 14,
+    XGL_OBJECT_TYPE_SAMPLER                    = 15,
+    XGL_OBJECT_TYPE_DESCRIPTOR_SET             = 16,
+    XGL_OBJECT_TYPE_VIEWPORT_STATE             = 17,
+    XGL_OBJECT_TYPE_RASTER_STATE               = 18,
+    XGL_OBJECT_TYPE_MSAA_STATE                 = 19,
+    XGL_OBJECT_TYPE_COLOR_BLEND_STATE          = 20,
+    XGL_OBJECT_TYPE_DEPTH_STENCIL_STATE        = 21,
+    XGL_OBJECT_TYPE_CMD_BUFFER                 = 22,
+    XGL_OBJECT_TYPE_PHYSICAL_GPU               = 23,
+    XGL_OBJECT_TYPE_UNKNOWN                    = 24,
+    XGL_OBJECT_TYPE_BEGIN_RANGE                = XGL_OBJECT_TYPE_DEVICE,
+    XGL_OBJECT_TYPE_END_RANGE                  = XGL_OBJECT_TYPE_UNKNOWN,
+    XGL_NUM_OBJECT_TYPE                        = (XGL_OBJECT_TYPE_END_RANGE - XGL_OBJECT_TYPE_BEGIN_RANGE + 1),
+    XGL_OBJECT_TYPE_ANY                        = (XGL_NUM_OBJECT_TYPE + 1), // Allow global object list to be queried/retrieved
+    XGL_MAX_ENUM(_XGL_OBJECT_TYPE)
+} XGL_OBJECT_TYPE;
+
+static const char* string_XGL_OBJECT_TYPE(XGL_OBJECT_TYPE type) {
+    switch (type)
+    {
+        case XGL_OBJECT_TYPE_DEVICE:
+            return "DEVICE";
+        case XGL_OBJECT_TYPE_GPU_MEMORY:
+            return "GPU_MEMORY";
+        case XGL_OBJECT_TYPE_FENCE:
+            return "FENCE";
+        case XGL_OBJECT_TYPE_QUEUE:
+            return "QUEUE";
+        case XGL_OBJECT_TYPE_QUEUE_SEMAPHORE:
+            return "QUEUE_SEMAPHORE";
+        case XGL_OBJECT_TYPE_EVENT:
+            return "EVENT";
+        case XGL_OBJECT_TYPE_QUERY_POOL:
+            return "QUERY_POOL";
+        case XGL_OBJECT_TYPE_IMAGE:
+            return "TYPE_IMAGE";
+        case XGL_OBJECT_TYPE_IMAGE_VIEW:
+            return "IMAGE_VIEW";
+        case XGL_OBJECT_TYPE_COLOR_ATTACHMENT_VIEW:
+            return "COLOR_ATTACHMENT_VIEW";
+        case XGL_OBJECT_TYPE_DEPTH_STENCIL_VIEW:
+            return "DEPTH_STENCIL_VIEW";
+        case XGL_OBJECT_TYPE_SHADER:
+            return "SHADER";
+        case XGL_OBJECT_TYPE_PIPELINE:
+            return "PIPELINE";
+        case XGL_OBJECT_TYPE_PIPELINE_DELTA:
+            return "PIPELINE_DELTA";
+        case XGL_OBJECT_TYPE_SAMPLER:
+            return "SAMPLER";
+        case XGL_OBJECT_TYPE_DESCRIPTOR_SET:
+            return "DESCRIPTOR_SET";
+        case XGL_OBJECT_TYPE_VIEWPORT_STATE:
+            return "VIEWPORT_STATE";
+        case XGL_OBJECT_TYPE_RASTER_STATE:
+            return "RASTER_STATE";
+        case XGL_OBJECT_TYPE_MSAA_STATE:
+            return "MSAA_STATE";
+        case XGL_OBJECT_TYPE_COLOR_BLEND_STATE:
+            return "COLOR_BLEND_STATE";
+        case XGL_OBJECT_TYPE_DEPTH_STENCIL_STATE:
+            return "DEPTH_STENCIL_STATE";
+        case XGL_OBJECT_TYPE_CMD_BUFFER:
+            return "CMD_BUFFER";
+        case XGL_OBJECT_TYPE_PHYSICAL_GPU:
+            return "PHYSICAL_GPU";
+        default:
+            return "UNKNOWN";
+    }
+}
+
+typedef struct _OBJTRACK_NODE {
+    XGL_VOID        *pObj;
+    XGL_OBJECT_TYPE objType;
+    XGL_UINT64      numUses;
+} OBJTRACK_NODE;
+// prototype for extension functions
+XGL_UINT64 objTrackGetObjectCount(XGL_OBJECT_TYPE type);
+XGL_RESULT objTrackGetObjects(XGL_OBJECT_TYPE type, XGL_UINT64 objCount, OBJTRACK_NODE* pObjNodeArray);