Add reserved parameter to xglEnumerateLayers for layer usage

This parameter can be used by layer for getting GPA and gpu info queries.
Also add xglEnumerateLayers() to Basic layer, to show example of only
supporting a particular GPU.
diff --git a/include/xgl.h b/include/xgl.h
index 2ceb566..efc972a 100644
--- a/include/xgl.h
+++ b/include/xgl.h
@@ -880,7 +880,7 @@
 // IMG CHANGE BEGIN - support for vertex input description
     XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO    = 34,
 // IMG CHANGE END
-    XGL_STRUCTURE_TYPE_LAYER_CREATE_INFO                   = 35,
+    XGL_STRUCTURE_TYPE_LAYER_CREATE_INFO                    = 35,
     XGL_MAX_ENUM(_XGL_STRUCTURE_TYPE)
 } XGL_STRUCTURE_TYPE;
 
@@ -1133,7 +1133,7 @@
     XGL_STRUCTURE_TYPE                      sType;                      // Should be XGL_STRUCTURE_TYPE_LAYER_CREATE_INFO
     XGL_VOID*                               pNext;                      // Pointer to next structure
     XGL_UINT                                layerCount;
-    const XGL_CHAR *const*                  ppActiveLayerNames;         // layer library name of form libXGLLayer<Name>.so
+    const XGL_CHAR *const*                  ppActiveLayerNames;         // layer name from the layer's xglEnumerateLayers())
 } XGL_LAYER_CREATE_INFO;
 
 typedef struct _XGL_PHYSICAL_GPU_QUEUE_PROPERTIES
@@ -1756,10 +1756,6 @@
 // ------------------------------------------------------------------------------------------------
 // API functions
 
-XGL_VOID * XGLAPI xglGetProcAddr(
-    XGL_PHYSICAL_GPU gpu,
-    const XGL_CHAR * pName);
-
 // GPU initialization
 
 XGL_RESULT XGLAPI xglInitAndEnumerateGpus(
@@ -1775,6 +1771,10 @@
     XGL_SIZE*                                   pDataSize,
     XGL_VOID*                                   pData);
 
+XGL_VOID * XGLAPI xglGetProcAddr(
+    XGL_PHYSICAL_GPU                            gpu,
+    const XGL_CHAR*                             pName);
+
 // Device functions
 
 XGL_RESULT XGLAPI xglCreateDevice(
@@ -1793,11 +1793,12 @@
 
 // Layer discovery function
 XGL_RESULT XGLAPI xglEnumerateLayers(
-    XGL_PHYSICAL_GPU gpu,
-    XGL_SIZE maxLayerCount,
-    XGL_SIZE maxStringSize,
-    XGL_CHAR* const* pOutLayers,
-    XGL_SIZE* pOutLayerCount);
+    XGL_PHYSICAL_GPU                            gpu,
+    XGL_SIZE                                    maxLayerCount,
+    XGL_SIZE                                    maxStringSize,
+    XGL_CHAR* const*                            pOutLayers,
+    XGL_SIZE*                                   pOutLayerCount,
+    XGL_VOID*                                   pReserved);
 
 // Queue functions
 
diff --git a/include/xglLayer.h b/include/xglLayer.h
index e369fc2..cf64633 100644
--- a/include/xglLayer.h
+++ b/include/xglLayer.h
@@ -15,13 +15,13 @@
 #  define XGL_LAYER_EXPORT
 #endif
 
-typedef XGL_VOID * (XGLAPI *GetProcAddrType)(XGL_PHYSICAL_GPU gpu, const XGL_CHAR * pName);
 typedef XGL_RESULT (XGLAPI *InitAndEnumerateGpusType)(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_UINT maxGpus, XGL_UINT* pGpuCount, XGL_PHYSICAL_GPU* pGpus);
 typedef XGL_RESULT (XGLAPI *GetGpuInfoType)(XGL_PHYSICAL_GPU gpu, XGL_PHYSICAL_GPU_INFO_TYPE infoType, XGL_SIZE* pDataSize, XGL_VOID* pData);
+typedef XGL_VOID * (XGLAPI *GetProcAddrType)(XGL_PHYSICAL_GPU gpu, const XGL_CHAR * pName);
 typedef XGL_RESULT (XGLAPI *CreateDeviceType)(XGL_PHYSICAL_GPU gpu, const XGL_DEVICE_CREATE_INFO* pCreateInfo, XGL_DEVICE* pDevice);
 typedef XGL_RESULT (XGLAPI *DestroyDeviceType)(XGL_DEVICE device);
 typedef XGL_RESULT (XGLAPI *GetExtensionSupportType)(XGL_PHYSICAL_GPU gpu, const XGL_CHAR* pExtName);
-typedef XGL_RESULT (XGLAPI *EnumerateLayersType)(XGL_PHYSICAL_GPU gpu, XGL_SIZE maxLayerCount, XGL_SIZE maxStringSize, XGL_CHAR* const* pOutLayers, XGL_SIZE* pOutLayerCount);
+typedef XGL_RESULT (XGLAPI *EnumerateLayersType)(XGL_PHYSICAL_GPU gpu, XGL_SIZE maxLayerCount, XGL_SIZE maxStringSize, XGL_CHAR* const* pOutLayers, XGL_SIZE* pOutLayerCount, XGL_VOID* pReserved);
 typedef XGL_RESULT (XGLAPI *GetDeviceQueueType)(XGL_DEVICE device, XGL_QUEUE_TYPE queueType, XGL_UINT queueIndex, XGL_QUEUE* pQueue);
 typedef XGL_RESULT (XGLAPI *QueueSubmitType)(XGL_QUEUE queue, XGL_UINT cmdBufferCount, const XGL_CMD_BUFFER* pCmdBuffers, XGL_UINT memRefCount, const XGL_MEMORY_REF* pMemRefs, XGL_FENCE fence);
 typedef XGL_RESULT (XGLAPI *QueueSetGlobalMemReferencesType)(XGL_QUEUE queue, XGL_UINT memRefCount, const XGL_MEMORY_REF* pMemRefs);
diff --git a/layers/basic_plugin.c b/layers/basic_plugin.c
index ac8362d..d29e72d 100644
--- a/layers/basic_plugin.c
+++ b/layers/basic_plugin.c
@@ -180,6 +180,39 @@
     return result;
 }
 
+XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, XGL_SIZE maxLayerCount, XGL_SIZE maxStringSize, XGL_CHAR* const* pOutLayers, XGL_SIZE * pOutLayerCount, XGL_VOID* pReserved)
+{
+    if (gpu != NULL)
+    {
+        XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
+        printf("At start of wrapped xglEnumerateLayers() call w/ gpu: %p\n", gpu);
+        pCurObj = gpuw;
+        pthread_once(&tabOnce, initLayerTable);
+        XGL_RESULT result = myTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayers, pOutLayerCount, pReserved);
+        return result;
+    } else
+    {
+        if (pOutLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL || pReserved == NULL)
+            return XGL_ERROR_INVALID_POINTER;
+
+        // Example of a layer that is only compatible with Intel's GPUs
+        XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT*) pReserved;
+        GetGpuInfoType fpGetGpuInfo;
+        XGL_PHYSICAL_GPU_PROPERTIES gpuProps;
+        XGL_SIZE dataSize = sizeof(XGL_PHYSICAL_GPU_PROPERTIES);
+        fpGetGpuInfo = gpuw->pGPA((XGL_PHYSICAL_GPU) gpuw->nextObject, (const XGL_CHAR *) "xglGetGpuInfo");
+        fpGetGpuInfo((XGL_PHYSICAL_GPU) gpuw->nextObject, XGL_INFO_TYPE_PHYSICAL_GPU_PROPERTIES, &dataSize, &gpuProps);
+        if (gpuProps.vendorId == 0x8086)
+        {
+            *pOutLayerCount = 1;
+            strncpy(pOutLayers[0], "Basic", maxStringSize);
+        } else
+        {
+            *pOutLayerCount = 0;
+        }
+        return XGL_SUCCESS;
+    }
+}
 XGL_LAYER_EXPORT XGL_VOID * XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const XGL_CHAR* pName) {
     XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
     if (gpu == NULL)
diff --git a/layers/draw_state.c b/layers/draw_state.c
index d5b8f19..4679850 100644
--- a/layers/draw_state.c
+++ b/layers/draw_state.c
@@ -927,14 +927,14 @@
     return result;
 }
 
-XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, XGL_SIZE maxLayerCount, XGL_SIZE maxStringSize, XGL_CHAR* const* pOutLayers, XGL_SIZE * pOutLayerCount)
+XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, XGL_SIZE maxLayerCount, XGL_SIZE maxStringSize, XGL_CHAR* const* pOutLayers, XGL_SIZE * pOutLayerCount, XGL_VOID* pReserved)
 {
     if (gpu != NULL)
     {
         XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
         pCurObj = gpuw;
         pthread_once(&tabOnce, initLayerTable);
-        XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayers, pOutLayerCount);
+        XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayers, pOutLayerCount, pReserved);
         return result;
     } else
     {
diff --git a/layers/mem_tracker.c b/layers/mem_tracker.c
index e4ebaae..0f31cb6 100644
--- a/layers/mem_tracker.c
+++ b/layers/mem_tracker.c
@@ -1092,14 +1092,14 @@
     return result;
 }
 
-XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, XGL_SIZE maxLayerCount, XGL_SIZE maxStringSize, XGL_CHAR* const* pOutLayers, XGL_SIZE * pOutLayerCount)
+XGL_LAYER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, XGL_SIZE maxLayerCount, XGL_SIZE maxStringSize, XGL_CHAR* const* pOutLayers, XGL_SIZE * pOutLayerCount, XGL_VOID* pReserved)
 {
         if (gpu != NULL)
     {
         XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
         pCurObj = gpuw;
         pthread_once(&tabOnce, initLayerTable);
-        XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayers, pOutLayerCount);
+        XGL_RESULT result = nextTable.EnumerateLayers((XGL_PHYSICAL_GPU)gpuw->nextObject, maxLayerCount, maxStringSize, pOutLayers, pOutLayerCount, pReserved);
         return result;
     } else
     {
diff --git a/loader/loader.c b/loader/loader.c
index be8e52b..f4f6d1a 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -658,7 +658,7 @@
         }
         else {
             XGL_SIZE cnt;
-            fpEnumerateLayers(NULL, 16, 256, layers, &cnt); //gpu would be icd->gpus + gpu_index
+            fpEnumerateLayers(NULL, 16, 256, layers, &cnt, (XGL_VOID *) icd->gpus + gpu_index);
             for (unsigned int i = 0; i < cnt; i++) {
                 if (!strcmp((char *) layers[i], layer_name)) {
                     dlclose(handle);
@@ -1176,7 +1176,7 @@
     return (count > 0) ? XGL_SUCCESS : res;
 }
 
-LOADER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, XGL_SIZE maxLayerCount, XGL_SIZE maxStringSize, XGL_CHAR* const* pOutLayers, XGL_SIZE* pOutLayerCount)
+LOADER_EXPORT XGL_RESULT XGLAPI xglEnumerateLayers(XGL_PHYSICAL_GPU gpu, XGL_SIZE maxLayerCount, XGL_SIZE maxStringSize, XGL_CHAR* const* pOutLayers, XGL_SIZE* pOutLayerCount, XGL_VOID* pReserved)
 {
     XGL_SIZE count = loader.scanned_layer_count;
     // TODO handle layers per GPU, multiple icds
diff --git a/tests/init.cpp b/tests/init.cpp
index edab764..a4b5842 100644
--- a/tests/init.cpp
+++ b/tests/init.cpp
@@ -129,7 +129,7 @@
 
     for (int i = 0; i < 16; i++)
         layers[i] = &layer_buf[i][0];
-    err = xglEnumerateLayers(objs[0], 16, 256, (XGL_CHAR * const *) layers, &layer_count);
+    err = xglEnumerateLayers(objs[0], 16, 256, (XGL_CHAR * const *) layers, &layer_count, NULL);
     ASSERT_XGL_SUCCESS(err);
     for (int i = 0; i < layer_count; i++) {
         printf("Enumerated layers: %s ", layers[i]);
diff --git a/xgl.py b/xgl.py
index 033d85f..fc8e912 100644
--- a/xgl.py
+++ b/xgl.py
@@ -121,7 +121,8 @@
          Param("XGL_SIZE", "maxLayerCount"),
          Param("XGL_SIZE", "maxStringSize"),
          Param("XGL_CHAR* const*", "pOutLayers"),
-         Param("XGL_SIZE *", "pOutLayerCount"))),
+         Param("XGL_SIZE *", "pOutLayerCount"),
+         Param("XGL_VOID *", "pReserved"))),
 
     Proto("XGL_RESULT", "GetDeviceQueue",
         (Param("XGL_DEVICE", "device"),