Also add this call to xglbase (init.cpp) test.
XGL_PHYSICAL_GPU gpu,
const XGL_CHAR* pExtName);
+// Layer discovery function
+XGL_RESULT XGLAPI xglEnumerateLayers(
+ XGL_PHYSICAL_GPU gpu,
+ XGL_SIZE maxLayerCount,
+ XGL_SIZE maxStringSize,
+ XGL_CHAR* const* pOutLayers,
+ XGL_SIZE* pOutLayerCount);
+
// Queue functions
XGL_RESULT XGLAPI xglGetDeviceQueue(
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 *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);
CreateDeviceType CreateDevice;
DestroyDeviceType DestroyDevice;
GetExtensionSupportType GetExtensionSupport;
+ EnumerateLayersType EnumerateLayers;
GetDeviceQueueType GetDeviceQueue;
QueueSubmitType QueueSubmit;
QueueSetGlobalMemReferencesType QueueSetGlobalMemReferences;
// ------------------------------------------------------------------------------------------------
// API functions
-XGL_RESULT xglEnumerateLayers(
- XGL_PHYSICAL_GPU gpu,
- XGL_SIZE maxLayerCount,
- XGL_CHAR* const* pOutLayers,
- XGL_SIZE* pOutLayerCount);
myTable.CreateDevice = fpGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (const XGL_CHAR *) "xglCreateDevice");
myTable.DestroyDevice = fpGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (const XGL_CHAR *) "xglDestroyDevice");
myTable.GetExtensionSupport = fpGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (const XGL_CHAR *) "xglGetExtensionSupport");
+ myTable.EnumerateLayers = fpGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (const XGL_CHAR *) "xglEnumerateLayers");
myTable.GetDeviceQueue = fpGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (const XGL_CHAR *) "xglGetDeviceQueue");
myTable.QueueSubmit = fpGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (const XGL_CHAR *) "xglQueueSubmit");
myTable.QueueSetGlobalMemReferences = fpGPA((XGL_PHYSICAL_GPU) pCurObj->nextObject, (const XGL_CHAR *) "xglQueueSetGlobalMemReferences");
return myTable.DestroyDevice;
else if (!strncmp("xglGetExtensionSupport", (const char *) pName, sizeof ("xglGetExtensionSupport")))
return myTable.GetExtensionSupport;
+ else if (!strncmp("xglEnumerateLayers", (const char *) pName, sizeof ("xglEnumerateLayers")))
+ return myTable.EnumerateLayers;
else if (!strncmp("xglGetDeviceQueue", (const char *) pName, sizeof ("xglGetDeviceQueue")))
return myTable.GetDeviceQueue;
else if (!strncmp("xglQueueSubmit", (const char *) pName, sizeof ("xglQueueSubmit")))
tab->CreateDevice = fpGPA(gpu, (const XGL_CHAR *) "xglCreateDevice");
tab->DestroyDevice = fpGPA(gpu, (const XGL_CHAR *) "xglDestroyDevice");
tab->GetExtensionSupport = fpGPA(gpu, (const XGL_CHAR *) "xglGetExtensionSupport");
+ tab->EnumerateLayers = fpGPA(gpu, (const XGL_CHAR *) "xglEnumerateLayers");
+ if (tab->EnumerateLayers == NULL)
+ tab->EnumerateLayers = xglEnumerateLayers;
tab->GetDeviceQueue = fpGPA(gpu, (const XGL_CHAR *) "xglGetDeviceQueue");
tab->QueueSubmit = fpGPA(gpu, (const XGL_CHAR *) "xglQueueSubmit");
tab->QueueSetGlobalMemReferences = fpGPA(gpu, (const XGL_CHAR *) "xglQueueSetGlobalMemReferences");
return disp_table->DestroyDevice;
else if (!strncmp("xglGetExtensionSupport", (const char *) pName, sizeof ("xglGetExtensionSupport")))
return disp_table->GetExtensionSupport;
+ else if (!strncmp("xglEnumerateLayers", (const char *) pName, sizeof ("xglEnumerateLayers")))
+ return disp_table->EnumerateLayers;
else if (!strncmp("xglGetDeviceQueue", (const char *) pName, sizeof ("xglGetDeviceQueue")))
return disp_table->GetDeviceQueue;
else if (!strncmp("xglQueueSubmit", (const char *) pName, sizeof ("xglQueueSubmit")))
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)
+{
+ XGL_SIZE count = loader.layer_count;
+ // TODO handle layers per GPU, multiple icds
+
+ if (pOutLayerCount == NULL)
+ return XGL_ERROR_INVALID_POINTER;
+
+ if (maxLayerCount < loader.layer_count)
+ count = maxLayerCount;
+ *pOutLayerCount = count;
+
+ if (pOutLayers == NULL)
+ return XGL_SUCCESS;
+ for (XGL_SIZE i = 0; i < count; i++) {
+ strncpy((char *) (pOutLayers[i]), loader.layer_libs[i].lib_name, maxStringSize);
+ if (maxStringSize > 0)
+ pOutLayers[i][maxStringSize - 1] = '\0';
+ }
+ return XGL_SUCCESS;
+}
+
LOADER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData)
{
const struct loader_icd *icd = loader.icds;
(Param("XGL_PHYSICAL_GPU", "gpu"),
Param("const XGL_CHAR*", "pExtName"))),
+ Proto("XGL_RESULT", "EnumerateLayers",
+ (Param("XGL_PHYSICAL_GPU", "gpu"),
+ Param("XGL_SIZE", "maxLayerCount"),
+ Param("XGL_SIZE", "maxStringSize"),
+ Param("XGL_CHAR* const*", "pOutLayers"),
+ Param("XGL_SIZE *", "pOutLayerCount"))),
+
Proto("XGL_RESULT", "GetDeviceQueue",
(Param("XGL_DEVICE", "device"),
Param("XGL_QUEUE_TYPE", "queueType"),
"CreateDevice",
"DestroyDevice",
"GetExtensionSupport",
+ "EnumerateLayers",
"GetDeviceQueue",
"QueueSubmit",
"QueueSetGlobalMemReferences",
return name not in (
"GetProcAddr",
"InitAndEnumerateGpus",
+ "EnumerateLayers",
"DbgRegisterMsgCallback",
"DbgUnregisterMsgCallback",
"DbgSetGlobalOption")