loader: use generated dispatch table ops
authorChia-I Wu <olv@lunarg.com>
Sun, 4 Jan 2015 03:12:47 +0000 (11:12 +0800)
committerCourtney Goeltzenleuchter <courtney@LunarG.com>
Thu, 5 Feb 2015 00:58:04 +0000 (17:58 -0700)
This also fixes several typos in xglGetProcAddr(), such as in

    else if (!strncmp("xglCreateFence", pName, sizeof ("xgllCreateFence")))
        return disp_table->CreateFence;

They are generally harmless though.

.gitignore
loader/CMakeLists.txt
loader/loader.c

index fbe7584..ce64764 100644 (file)
@@ -9,6 +9,7 @@ XGLConfig.h
 icd/common/libicd.a
 icd/intel/intel_gpa.c
 loader/dispatch.c
+loader/table_ops.h
 tests/xgl_image_tests
 tests/xgl_render_tests
 tests/xglbase
index cebc5d9..1877ffb 100644 (file)
@@ -2,10 +2,15 @@ add_custom_command(OUTPUT dispatch.c
        COMMAND ${PROJECT_SOURCE_DIR}/xgl-generate.py loader-entrypoints > dispatch.c
        DEPENDS ${PROJECT_SOURCE_DIR}/xgl-generate.py ${PROJECT_SOURCE_DIR}/xgl.py)
 
+add_custom_command(OUTPUT table_ops.h
+       COMMAND ${PROJECT_SOURCE_DIR}/xgl-generate.py dispatch-table-ops loader > table_ops.h
+       DEPENDS ${PROJECT_SOURCE_DIR}/xgl-generate.py ${PROJECT_SOURCE_DIR}/xgl.py)
+
 include_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}
+       ${CMAKE_CURRENT_BINARY_DIR}
 )
 
-add_library(XGL SHARED loader.c dispatch.c)
+add_library(XGL SHARED loader.c dispatch.c table_ops.h)
 set_target_properties(XGL PROPERTIES SOVERSION 0)
 target_link_libraries(XGL -ldl -lpthread)
index e9ec0fb..c658279 100644 (file)
@@ -39,6 +39,7 @@
 #include <dlfcn.h>
 #include <pthread.h>
 #include <assert.h>
+#include "table_ops.h"
 #include "loader.h"
 
 struct loader_layers {
@@ -460,129 +461,10 @@ static void layer_lib_scan(const char * libInPaths)
 
 static void loader_init_dispatch_table(XGL_LAYER_DISPATCH_TABLE *tab, GetProcAddrType fpGPA, XGL_PHYSICAL_GPU gpu)
 {
-    tab->GetProcAddr = fpGPA;
-    tab->InitAndEnumerateGpus = fpGPA(gpu, "xglInitAndEnumerateGpus");
-    tab->GetGpuInfo = fpGPA(gpu, "xglGetGpuInfo");
-    tab->CreateDevice = fpGPA(gpu, "xglCreateDevice");
-    tab->DestroyDevice = fpGPA(gpu, "xglDestroyDevice");
-    tab->GetExtensionSupport = fpGPA(gpu, "xglGetExtensionSupport");
-    tab->EnumerateLayers = fpGPA(gpu, "xglEnumerateLayers");
+    loader_initialize_dispatch_table(tab, fpGPA, gpu);
+
     if (tab->EnumerateLayers == NULL)
         tab->EnumerateLayers = xglEnumerateLayers;
-    tab->GetDeviceQueue = fpGPA(gpu, "xglGetDeviceQueue");
-    tab->QueueSubmit = fpGPA(gpu, "xglQueueSubmit");
-    tab->QueueSetGlobalMemReferences = fpGPA(gpu, "xglQueueSetGlobalMemReferences");
-    tab->QueueWaitIdle = fpGPA(gpu, "xglQueueWaitIdle");
-    tab->DeviceWaitIdle = fpGPA(gpu, "xglDeviceWaitIdle");
-    tab->GetMemoryHeapCount = fpGPA(gpu, "xglGetMemoryHeapCount");
-    tab->GetMemoryHeapInfo = fpGPA(gpu, "xglGetMemoryHeapInfo");
-    tab->AllocMemory = fpGPA(gpu, "xglAllocMemory");
-    tab->FreeMemory = fpGPA(gpu, "xglFreeMemory");
-    tab->SetMemoryPriority = fpGPA(gpu, "xglSetMemoryPriority");
-    tab->MapMemory = fpGPA(gpu, "xglMapMemory");
-    tab->UnmapMemory = fpGPA(gpu, "xglUnmapMemory");
-    tab->PinSystemMemory = fpGPA(gpu, "xglPinSystemMemory");
-    tab->RemapVirtualMemoryPages = fpGPA(gpu, "xglRemapVirtualMemoryPages");
-    tab->GetMultiGpuCompatibility = fpGPA(gpu, "xglGetMultiGpuCompatibility");
-    tab->OpenSharedMemory = fpGPA(gpu, "xglOpenSharedMemory");
-    tab->OpenSharedQueueSemaphore = fpGPA(gpu, "xglOpenSharedQueueSemaphore");
-    tab->OpenPeerMemory = fpGPA(gpu, "xglOpenPeerMemory");
-    tab->OpenPeerImage = fpGPA(gpu, "xglOpenPeerImage");
-    tab->DestroyObject = fpGPA(gpu, "xglDestroyObject");
-    tab->GetObjectInfo = fpGPA(gpu, "xglGetObjectInfo");
-    tab->BindObjectMemory = fpGPA(gpu, "xglBindObjectMemory");
-    tab->CreateFence = fpGPA(gpu, "xglCreateFence");
-    tab->GetFenceStatus = fpGPA(gpu, "xglGetFenceStatus");
-    tab->WaitForFences = fpGPA(gpu, "xglWaitForFences");
-    tab->CreateQueueSemaphore = fpGPA(gpu, "xglCreateQueueSemaphore");
-    tab->SignalQueueSemaphore = fpGPA(gpu, "xglSignalQueueSemaphore");
-    tab->WaitQueueSemaphore = fpGPA(gpu, "xglWaitQueueSemaphore");
-    tab->CreateEvent = fpGPA(gpu, "xglCreateEvent");
-    tab->GetEventStatus = fpGPA(gpu, "xglGetEventStatus");
-    tab->SetEvent = fpGPA(gpu, "xglSetEvent");
-    tab->ResetEvent = fpGPA(gpu, "xglResetEvent");
-    tab->CreateQueryPool = fpGPA(gpu, "xglCreateQueryPool");
-    tab->GetQueryPoolResults = fpGPA(gpu, "xglGetQueryPoolResults");
-    tab->GetFormatInfo = fpGPA(gpu, "xglGetFormatInfo");
-    tab->CreateImage = fpGPA(gpu, "xglCreateImage");
-    tab->GetImageSubresourceInfo = fpGPA(gpu, "xglGetImageSubresourceInfo");
-    tab->CreateImageView = fpGPA(gpu, "xglCreateImageView");
-    tab->CreateColorAttachmentView = fpGPA(gpu, "xglCreateColorAttachmentView");
-    tab->CreateDepthStencilView = fpGPA(gpu, "xglCreateDepthStencilView");
-    tab->CreateShader = fpGPA(gpu, "xglCreateShader");
-    tab->CreateGraphicsPipeline = fpGPA(gpu, "xglCreateGraphicsPipeline");
-    tab->CreateComputePipeline = fpGPA(gpu, "xglCreateComputePipeline");
-    tab->StorePipeline = fpGPA(gpu, "xglStorePipeline");
-    tab->LoadPipeline = fpGPA(gpu, "xglLoadPipeline");
-    tab->CreatePipelineDelta = fpGPA(gpu, "xglCreatePipelineDelta");
-    tab->CreateSampler = fpGPA(gpu, "xglCreateSampler");
-    tab->CreateDescriptorSet = fpGPA(gpu, "xglCreateDescriptorSet");
-    tab->BeginDescriptorSetUpdate = fpGPA(gpu, "xglBeginDescriptorSetUpdate");
-    tab->EndDescriptorSetUpdate = fpGPA(gpu, "xglEndDescriptorSetUpdate");
-    tab->AttachSamplerDescriptors = fpGPA(gpu, "xglAttachSamplerDescriptors");
-    tab->AttachImageViewDescriptors = fpGPA(gpu, "xglAttachImageViewDescriptors");
-    tab->AttachMemoryViewDescriptors = fpGPA(gpu, "xglAttachMemoryViewDescriptors");
-    tab->AttachNestedDescriptors = fpGPA(gpu, "xglAttachNestedDescriptors");
-    tab->ClearDescriptorSetSlots = fpGPA(gpu, "xglClearDescriptorSetSlots");
-    tab->CreateViewportState = fpGPA(gpu, "xglCreateViewportState");
-    tab->CreateRasterState = fpGPA(gpu, "xglCreateRasterState");
-    tab->CreateMsaaState = fpGPA(gpu, "xglCreateMsaaState");
-    tab->CreateColorBlendState = fpGPA(gpu, "xglCreateColorBlendState");
-    tab->CreateDepthStencilState = fpGPA(gpu, "xglCreateDepthStencilState");
-    tab->CreateCommandBuffer = fpGPA(gpu, "xglCreateCommandBuffer");
-    tab->BeginCommandBuffer = fpGPA(gpu, "xglBeginCommandBuffer");
-    tab->EndCommandBuffer = fpGPA(gpu, "xglEndCommandBuffer");
-    tab->ResetCommandBuffer = fpGPA(gpu, "xglResetCommandBuffer");
-    tab->CmdBindPipeline = fpGPA(gpu, "xglCmdBindPipeline");
-    tab->CmdBindPipelineDelta = fpGPA(gpu, "xglCmdBindPipelineDelta");
-    tab->CmdBindStateObject = fpGPA(gpu, "xglCmdBindStateObject");
-    tab->CmdBindDescriptorSet = fpGPA(gpu, "xglCmdBindDescriptorSet");
-    tab->CmdBindDynamicMemoryView = fpGPA(gpu, "xglCmdBindDynamicMemoryView");
-    tab->CmdBindVertexData = fpGPA(gpu, "xglCmdBindVertexData");
-    tab->CmdBindIndexData = fpGPA(gpu, "xglCmdBindIndexData");
-    tab->CmdBindAttachments = fpGPA(gpu, "xglCmdBindAttachments");
-    tab->CmdPrepareMemoryRegions = fpGPA(gpu, "xglCmdPrepareMemoryRegions");
-    tab->CmdPrepareImages = fpGPA(gpu, "xglCmdPrepareImages");
-    tab->CmdDraw = fpGPA(gpu, "xglCmdDraw");
-    tab->CmdDrawIndexed = fpGPA(gpu, "xglCmdDrawIndexed");
-    tab->CmdDrawIndirect = fpGPA(gpu, "xglCmdDrawIndirect");
-    tab->CmdDrawIndexedIndirect = fpGPA(gpu, "xglCmdDrawIndexedIndirect");
-    tab->CmdDispatch = fpGPA(gpu, "xglCmdDispatch");
-    tab->CmdDispatchIndirect = fpGPA(gpu, "xglCmdDispatchIndirect");
-    tab->CmdCopyMemory = fpGPA(gpu, "xglCmdCopyMemory");
-    tab->CmdCopyImage = fpGPA(gpu, "xglCmdCopyImage");
-    tab->CmdCopyMemoryToImage = fpGPA(gpu, "xglCmdCopyMemoryToImage");
-    tab->CmdCopyImageToMemory = fpGPA(gpu, "xglCmdCopyImageToMemory");
-    tab->CmdCloneImageData = fpGPA(gpu, "xglCmdCloneImageData");
-    tab->CmdUpdateMemory = fpGPA(gpu, "xglCmdUpdateMemory");
-    tab->CmdFillMemory = fpGPA(gpu, "xglCmdFillMemory");
-    tab->CmdClearColorImage = fpGPA(gpu, "xglCmdClearColorImage");
-    tab->CmdClearColorImageRaw = fpGPA(gpu, "xglCmdClearColorImageRaw");
-    tab->CmdClearDepthStencil = fpGPA(gpu, "xglCmdClearDepthStencil");
-    tab->CmdResolveImage = fpGPA(gpu, "xglCmdResolveImage");
-    tab->CmdSetEvent = fpGPA(gpu, "xglCmdSetEvent");
-    tab->CmdResetEvent = fpGPA(gpu, "xglCmdResetEvent");
-    tab->CmdMemoryAtomic = fpGPA(gpu, "xglCmdMemoryAtomic");
-    tab->CmdBeginQuery = fpGPA(gpu, "xglCmdBeginQuery");
-    tab->CmdEndQuery = fpGPA(gpu, "xglCmdEndQuery");
-    tab->CmdResetQueryPool = fpGPA(gpu, "xglCmdResetQueryPool");
-    tab->CmdWriteTimestamp = fpGPA(gpu, "xglCmdWriteTimestamp");
-    tab->CmdInitAtomicCounters = fpGPA(gpu, "xglCmdInitAtomicCounters");
-    tab->CmdLoadAtomicCounters = fpGPA(gpu, "xglCmdLoadAtomicCounters");
-    tab->CmdSaveAtomicCounters = fpGPA(gpu, "xglCmdSaveAtomicCounters");
-    tab->DbgSetValidationLevel = fpGPA(gpu, "xglDbgSetValidationLevel");
-    tab->DbgRegisterMsgCallback = fpGPA(gpu, "xglDbgRegisterMsgCallback");
-    tab->DbgUnregisterMsgCallback = fpGPA(gpu, "xglDbgUnregisterMsgCallback");
-    tab->DbgSetMessageFilter = fpGPA(gpu, "xglDbgSetMessageFilter");
-    tab->DbgSetObjectTag = fpGPA(gpu, "xglDbgSetObjectTag");
-    tab->DbgSetGlobalOption = fpGPA(gpu, "xglDbgSetGlobalOption");
-    tab->DbgSetDeviceOption = fpGPA(gpu, "xglDbgSetDeviceOption");
-    tab->CmdDbgMarkerBegin = fpGPA(gpu, "xglCmdDbgMarkerBegin");
-    tab->CmdDbgMarkerEnd = fpGPA(gpu, "xglCmdDbgMarkerEnd");
-    tab->WsiX11AssociateConnection = fpGPA(gpu, "xglWsiX11AssociateConnection");
-    tab->WsiX11GetMSC = fpGPA(gpu, "xglWsiX11GetMSC");
-    tab->WsiX11CreatePresentableImage = fpGPA(gpu, "xglWsiX11CreatePresentableImage");
-    tab->WsiX11QueuePresent = fpGPA(gpu, "xglWsiX11QueuePresent");
 }
 
 static struct loader_icd * loader_get_icd(const XGL_BASE_LAYER_OBJECT *gpu, XGL_UINT *gpu_index)
@@ -871,252 +753,14 @@ LOADER_EXPORT XGL_VOID * XGLAPI xglGetProcAddr(XGL_PHYSICAL_GPU gpu, const XGL_C
         return NULL;
     XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) gpu;
     XGL_LAYER_DISPATCH_TABLE * disp_table = * (XGL_LAYER_DISPATCH_TABLE **) gpuw->baseObject;
+    void *addr;
 
     if (disp_table == NULL)
         return NULL;
 
-    if (!strncmp("xglGetProcAddr", pName, sizeof("xglGetProcAddr")))
-        return disp_table->GetProcAddr;
-    else if (!strncmp("xglInitAndEnumerateGpus", pName, sizeof("xglInitAndEnumerateGpus")))
-        return disp_table->InitAndEnumerateGpus;
-    else if (!strncmp("xglGetGpuInfo", pName, sizeof ("xglGetGpuInfo")))
-        return disp_table->GetGpuInfo;
-    else if (!strncmp("xglCreateDevice", pName, sizeof ("xglCreateDevice")))
-        return disp_table->CreateDevice;
-    else if (!strncmp("xglDestroyDevice", pName, sizeof ("xglDestroyDevice")))
-        return disp_table->DestroyDevice;
-    else if (!strncmp("xglGetExtensionSupport", pName, sizeof ("xglGetExtensionSupport")))
-        return disp_table->GetExtensionSupport;
-    else if (!strncmp("xglEnumerateLayers", pName, sizeof ("xglEnumerateLayers")))
-        return disp_table->EnumerateLayers;
-    else if (!strncmp("xglGetDeviceQueue", pName, sizeof ("xglGetDeviceQueue")))
-        return disp_table->GetDeviceQueue;
-    else if (!strncmp("xglQueueSubmit", pName, sizeof ("xglQueueSubmit")))
-        return disp_table->QueueSubmit;
-    else if (!strncmp("xglQueueSetGlobalMemReferences", pName, sizeof ("xglQueueSetGlobalMemReferences")))
-        return disp_table->QueueSetGlobalMemReferences;
-    else if (!strncmp("xglQueueWaitIdle", pName, sizeof ("xglQueueWaitIdle")))
-        return disp_table->QueueWaitIdle;
-    else if (!strncmp("xglDeviceWaitIdle", pName, sizeof ("xglDeviceWaitIdle")))
-        return disp_table->DeviceWaitIdle;
-    else if (!strncmp("xglGetMemoryHeapCount", pName, sizeof ("xglGetMemoryHeapCount")))
-        return disp_table->GetMemoryHeapCount;
-    else if (!strncmp("xglGetMemoryHeapInfo", pName, sizeof ("xglGetMemoryHeapInfo")))
-        return disp_table->GetMemoryHeapInfo;
-    else if (!strncmp("xglAllocMemory", pName, sizeof ("xglAllocMemory")))
-        return disp_table->AllocMemory;
-    else if (!strncmp("xglFreeMemory", pName, sizeof ("xglFreeMemory")))
-        return disp_table->FreeMemory;
-    else if (!strncmp("xglSetMemoryPriority", pName, sizeof ("xglSetMemoryPriority")))
-        return disp_table->SetMemoryPriority;
-    else if (!strncmp("xglMapMemory", pName, sizeof ("xglMapMemory")))
-        return disp_table->MapMemory;
-    else if (!strncmp("xglUnmapMemory", pName, sizeof ("xglUnmapMemory")))
-        return disp_table->UnmapMemory;
-    else if (!strncmp("xglPinSystemMemory", pName, sizeof ("xglPinSystemMemory")))
-        return disp_table->PinSystemMemory;
-    else if (!strncmp("xglRemapVirtualMemoryPages", pName, sizeof ("xglRemapVirtualMemoryPages")))
-        return disp_table->RemapVirtualMemoryPages;
-    else if (!strncmp("xglGetMultiGpuCompatibility", pName, sizeof ("xglGetMultiGpuCompatibility")))
-        return disp_table->GetMultiGpuCompatibility;
-    else if (!strncmp("xglOpenSharedMemory", pName, sizeof ("xglOpenSharedMemory")))
-        return disp_table->OpenSharedMemory;
-    else if (!strncmp("xglOpenSharedQueueSemaphore", pName, sizeof ("xglOpenSharedQueueSemaphore")))
-        return disp_table->OpenSharedQueueSemaphore;
-    else if (!strncmp("xglOpenPeerMemory", pName, sizeof ("xglOpenPeerMemory")))
-        return disp_table->OpenPeerMemory;
-    else if (!strncmp("xglOpenPeerImage", pName, sizeof ("xglOpenPeerImage")))
-        return disp_table->OpenPeerImage;
-    else if (!strncmp("xglDestroyObject", pName, sizeof ("xglDestroyObject")))
-        return disp_table->DestroyObject;
-    else if (!strncmp("xglGetObjectInfo", pName, sizeof ("xglGetObjectInfo")))
-        return disp_table->GetObjectInfo;
-    else if (!strncmp("xglBindObjectMemory", pName, sizeof ("xglBindObjectMemory")))
-        return disp_table->BindObjectMemory;
-    else if (!strncmp("xglCreateFence", pName, sizeof ("xgllCreateFence")))
-        return disp_table->CreateFence;
-    else if (!strncmp("xglGetFenceStatus", pName, sizeof ("xglGetFenceStatus")))
-        return disp_table->GetFenceStatus;
-    else if (!strncmp("xglWaitForFences", pName, sizeof ("xglWaitForFences")))
-        return disp_table->WaitForFences;
-    else if (!strncmp("xglCreateQueueSemaphore", pName, sizeof ("xgllCreateQueueSemaphore")))
-        return disp_table->CreateQueueSemaphore;
-    else if (!strncmp("xglSignalQueueSemaphore", pName, sizeof ("xglSignalQueueSemaphore")))
-        return disp_table->SignalQueueSemaphore;
-    else if (!strncmp("xglWaitQueueSemaphore", pName, sizeof ("xglWaitQueueSemaphore")))
-        return disp_table->WaitQueueSemaphore;
-    else if (!strncmp("xglCreateEvent", pName, sizeof ("xgllCreateEvent")))
-        return disp_table->CreateEvent;
-    else if (!strncmp("xglGetEventStatus", pName, sizeof ("xglGetEventStatus")))
-        return disp_table->GetEventStatus;
-    else if (!strncmp("xglSetEvent", pName, sizeof ("xglSetEvent")))
-        return disp_table->SetEvent;
-    else if (!strncmp("xglResetEvent", pName, sizeof ("xgllResetEvent")))
-        return disp_table->ResetEvent;
-    else if (!strncmp("xglCreateQueryPool", pName, sizeof ("xglCreateQueryPool")))
-        return disp_table->CreateQueryPool;
-    else if (!strncmp("xglGetQueryPoolResults", pName, sizeof ("xglGetQueryPoolResults")))
-        return disp_table->GetQueryPoolResults;
-    else if (!strncmp("xglGetFormatInfo", pName, sizeof ("xglGetFormatInfo")))
-        return disp_table->GetFormatInfo;
-    else if (!strncmp("xglCreateImage", pName, sizeof ("xglCreateImage")))
-        return disp_table->CreateImage;
-    else if (!strncmp("xglGetImageSubresourceInfo", pName, sizeof ("xglGetImageSubresourceInfo")))
-        return disp_table->GetImageSubresourceInfo;
-    else if (!strncmp("xglCreateImageView", pName, sizeof ("xglCreateImageView")))
-        return disp_table->CreateImageView;
-    else if (!strncmp("xglCreateColorAttachmentView", pName, sizeof ("xglCreateColorAttachmentView")))
-        return disp_table->CreateColorAttachmentView;
-    else if (!strncmp("xglCreateDepthStencilView", pName, sizeof ("xglCreateDepthStencilView")))
-        return disp_table->CreateDepthStencilView;
-    else if (!strncmp("xglCreateShader", pName, sizeof ("xglCreateShader")))
-        return disp_table->CreateShader;
-    else if (!strncmp("xglCreateGraphicsPipeline", pName, sizeof ("xglCreateGraphicsPipeline")))
-        return disp_table->CreateGraphicsPipeline;
-    else if (!strncmp("xglCreateComputePipeline", pName, sizeof ("xglCreateComputePipeline")))
-        return disp_table->CreateComputePipeline;
-    else if (!strncmp("xglStorePipeline", pName, sizeof ("xglStorePipeline")))
-        return disp_table->StorePipeline;
-    else if (!strncmp("xglLoadPipeline", pName, sizeof ("xglLoadPipeline")))
-        return disp_table->LoadPipeline;
-    else if (!strncmp("xglCreatePipelineDelta", pName, sizeof ("xglCreatePipelineDelta")))
-        return disp_table->CreatePipelineDelta;
-    else if (!strncmp("xglCreateSampler", pName, sizeof ("xglCreateSampler")))
-        return disp_table->CreateSampler;
-    else if (!strncmp("xglCreateDescriptorSet", pName, sizeof ("xglCreateDescriptorSet")))
-        return disp_table->CreateDescriptorSet;
-    else if (!strncmp("xglBeginDescriptorSetUpdate", pName, sizeof ("xglBeginDescriptorSetUpdate")))
-        return disp_table->BeginDescriptorSetUpdate;
-    else if (!strncmp("xglEndDescriptorSetUpdate", pName, sizeof ("xglEndDescriptorSetUpdate")))
-        return disp_table->EndDescriptorSetUpdate;
-    else if (!strncmp("xglAttachSamplerDescriptors", pName, sizeof ("xglAttachSamplerDescriptors")))
-        return disp_table->AttachSamplerDescriptors;
-    else if (!strncmp("xglAttachImageViewDescriptors", pName, sizeof ("xglAttachImageViewDescriptors")))
-        return disp_table->AttachImageViewDescriptors;
-    else if (!strncmp("xglAttachMemoryViewDescriptors", pName, sizeof ("xglAttachMemoryViewDescriptors")))
-        return disp_table->AttachMemoryViewDescriptors;
-    else if (!strncmp("xglAttachNestedDescriptors", pName, sizeof ("xglAttachNestedDescriptors")))
-        return disp_table->AttachNestedDescriptors;
-    else if (!strncmp("xglClearDescriptorSetSlots", pName, sizeof ("xglClearDescriptorSetSlots")))
-        return disp_table->ClearDescriptorSetSlots;
-    else if (!strncmp("xglCreateViewportState", pName, sizeof ("xglCreateViewportState")))
-        return disp_table->CreateViewportState;
-    else if (!strncmp("xglCreateRasterState", pName, sizeof ("xglCreateRasterState")))
-        return disp_table->CreateRasterState;
-    else if (!strncmp("xglCreateMsaaState", pName, sizeof ("xglCreateMsaaState")))
-        return disp_table->CreateMsaaState;
-    else if (!strncmp("xglCreateColorBlendState", pName, sizeof ("xglCreateColorBlendState")))
-        return disp_table->CreateColorBlendState;
-    else if (!strncmp("xglCreateDepthStencilState", pName, sizeof ("xglCreateDepthStencilState")))
-        return disp_table->CreateDepthStencilState;
-    else if (!strncmp("xglCreateCommandBuffer", pName, sizeof ("xglCreateCommandBuffer")))
-        return disp_table->CreateCommandBuffer;
-    else if (!strncmp("xglBeginCommandBuffer", pName, sizeof ("xglBeginCommandBuffer")))
-        return disp_table->BeginCommandBuffer;
-    else if (!strncmp("xglEndCommandBuffer", pName, sizeof ("xglEndCommandBuffer")))
-        return disp_table->EndCommandBuffer;
-    else if (!strncmp("xglResetCommandBuffer", pName, sizeof ("xglResetCommandBuffer")))
-        return disp_table->ResetCommandBuffer;
-    else if (!strncmp("xglCmdBindPipeline", pName, sizeof ("xglCmdBindPipeline")))
-        return disp_table->CmdBindPipeline;
-    else if (!strncmp("xglCmdBindPipelineDelta", pName, sizeof ("xglCmdBindPipelineDelta")))
-        return disp_table->CmdBindPipelineDelta;
-    else if (!strncmp("xglCmdBindStateObject", pName, sizeof ("xglCmdBindStateObject")))
-        return disp_table->CmdBindStateObject;
-    else if (!strncmp("xglCmdBindDescriptorSet", pName, sizeof ("xglCmdBindDescriptorSet")))
-        return disp_table->CmdBindDescriptorSet;
-    else if (!strncmp("xglCmdBindDynamicMemoryView", pName, sizeof ("xglCmdBindDynamicMemoryView")))
-        return disp_table->CmdBindDynamicMemoryView;
-    else if (!strncmp("xglCmdBindVertexData", pName, sizeof ("xglCmdBindVertexData")))
-        return disp_table->CmdBindVertexData;
-    else if (!strncmp("xglCmdBindIndexData", pName, sizeof ("xglCmdBindIndexData")))
-        return disp_table->CmdBindIndexData;
-    else if (!strncmp("xglCmdBindAttachments", pName, sizeof ("xglCmdBindAttachments")))
-        return disp_table->CmdBindAttachments;
-    else if (!strncmp("xglCmdPrepareMemoryRegions", pName, sizeof ("xglCmdPrepareMemoryRegions")))
-        return disp_table->CmdPrepareMemoryRegions;
-    else if (!strncmp("xglCmdPrepareImages", pName, sizeof ("xglCmdPrepareImages")))
-        return disp_table->CmdPrepareImages;
-    else if (!strncmp("xglCmdDraw", pName, sizeof ("xglCmdDraw")))
-        return disp_table->CmdDraw;
-    else if (!strncmp("xglCmdDrawIndexed", pName, sizeof ("xglCmdDrawIndexed")))
-        return disp_table->CmdDrawIndexed;
-    else if (!strncmp("xglCmdDrawIndirect", pName, sizeof ("xglCmdDrawIndirect")))
-        return disp_table->CmdDrawIndirect;
-    else if (!strncmp("xglCmdDrawIndexedIndirect", pName, sizeof ("xglCmdDrawIndexedIndirect")))
-        return disp_table->CmdDrawIndexedIndirect;
-    else if (!strncmp("xglCmdDispatch", pName, sizeof ("xglCmdDispatch")))
-        return disp_table->CmdDispatch;
-    else if (!strncmp("xglCmdDispatchIndirect", pName, sizeof ("xglCmdDispatchIndirect")))
-        return disp_table->CmdDispatchIndirect;
-    else if (!strncmp("xglCmdCopyMemory", pName, sizeof ("xglCmdCopyMemory")))
-        return disp_table->CmdCopyMemory;
-    else if (!strncmp("xglCmdCopyImage", pName, sizeof ("xglCmdCopyImage")))
-        return disp_table->CmdCopyImage;
-    else if (!strncmp("xglCmdCopyMemoryToImage", pName, sizeof ("xglCmdCopyMemoryToImage")))
-        return disp_table->CmdCopyMemoryToImage;
-    else if (!strncmp("xglCmdCopyImageToMemory", pName, sizeof ("xglCmdCopyImageToMemory")))
-        return disp_table->CmdCopyImageToMemory;
-    else if (!strncmp("xglCmdCloneImageData", pName, sizeof ("xglCmdCloneImageData")))
-        return disp_table->CmdCloneImageData;
-    else if (!strncmp("xglCmdUpdateMemory", pName, sizeof ("xglCmdUpdateMemory")))
-        return disp_table->CmdUpdateMemory;
-    else if (!strncmp("xglCmdFillMemory", pName, sizeof ("xglCmdFillMemory")))
-        return disp_table->CmdFillMemory;
-    else if (!strncmp("xglCmdClearColorImage", pName, sizeof ("xglCmdClearColorImage")))
-        return disp_table->CmdClearColorImage;
-    else if (!strncmp("xglCmdClearColorImageRaw", pName, sizeof ("xglCmdClearColorImageRaw")))
-        return disp_table->CmdClearColorImageRaw;
-    else if (!strncmp("xglCmdClearDepthStencil", pName, sizeof ("xglCmdClearDepthStencil")))
-        return disp_table->CmdClearDepthStencil;
-    else if (!strncmp("xglCmdResolveImage", pName, sizeof ("xglCmdResolveImage")))
-        return disp_table->CmdResolveImage;
-    else if (!strncmp("xglCmdSetEvent", pName, sizeof ("xglCmdSetEvent")))
-        return disp_table->CmdSetEvent;
-    else if (!strncmp("xglCmdResetEvent", pName, sizeof ("xglCmdResetEvent")))
-        return disp_table->CmdResetEvent;
-    else if (!strncmp("xglCmdMemoryAtomic", pName, sizeof ("xglCmdMemoryAtomic")))
-        return disp_table->CmdMemoryAtomic;
-    else if (!strncmp("xglCmdBeginQuery", pName, sizeof ("xglCmdBeginQuery")))
-        return disp_table->CmdBeginQuery;
-    else if (!strncmp("xglCmdEndQuery", pName, sizeof ("xglCmdEndQuery")))
-        return disp_table->CmdEndQuery;
-    else if (!strncmp("xglCmdResetQueryPool", pName, sizeof ("xglCmdResetQueryPool")))
-        return disp_table->CmdResetQueryPool;
-    else if (!strncmp("xglCmdWriteTimestamp", pName, sizeof ("xglCmdWriteTimestamp")))
-        return disp_table->CmdWriteTimestamp;
-    else if (!strncmp("xglCmdInitAtomicCounters", pName, sizeof ("xglCmdInitAtomicCounters")))
-        return disp_table->CmdInitAtomicCounters;
-    else if (!strncmp("xglCmdLoadAtomicCounters", pName, sizeof ("xglCmdLoadAtomicCounters")))
-        return disp_table->CmdLoadAtomicCounters;
-    else if (!strncmp("xglCmdSaveAtomicCounters", pName, sizeof ("xglCmdSaveAtomicCounters")))
-        return disp_table->CmdSaveAtomicCounters;
-    else if (!strncmp("xglDbgSetValidationLevel", pName, sizeof ("xglDbgSetValidationLevel")))
-        return disp_table->DbgSetValidationLevel;
-    else if (!strncmp("xglDbgRegisterMsgCallback", pName, sizeof ("xglDbgRegisterMsgCallback")))
-        return disp_table->DbgRegisterMsgCallback;
-    else if (!strncmp("xglDbgUnregisterMsgCallback", pName, sizeof ("xglDbgUnregisterMsgCallback")))
-        return disp_table->DbgUnregisterMsgCallback;
-    else if (!strncmp("xglDbgSetMessageFilter", pName, sizeof ("xglDbgSetMessageFilter")))
-        return disp_table->DbgSetMessageFilter;
-    else if (!strncmp("xglDbgSetObjectTag", pName, sizeof ("xglDbgSetObjectTag")))
-        return disp_table->DbgSetObjectTag;
-    else if (!strncmp("xglDbgSetGlobalOption", pName, sizeof ("xglDbgSetGlobalOption")))
-        return disp_table->DbgSetGlobalOption;
-    else if (!strncmp("xglDbgSetDeviceOption", pName, sizeof ("xglDbgSetDeviceOption")))
-        return disp_table->DbgSetDeviceOption;
-    else if (!strncmp("xglCmdDbgMarkerBegin", pName, sizeof ("xglCmdDbgMarkerBegin")))
-        return disp_table->CmdDbgMarkerBegin;
-    else if (!strncmp("xglCmdDbgMarkerEnd", pName, sizeof ("xglCmdDbgMarkerEnd")))
-        return disp_table->CmdDbgMarkerEnd;
-    else if (!strncmp("xglWsiX11AssociateConnection", pName, sizeof("xglWsiX11AssociateConnection")))
-        return disp_table->WsiX11AssociateConnection;
-    else if (!strncmp("xglWsiX11GetMSC", pName, sizeof("xglWsiX11GetMSC")))
-        return disp_table->WsiX11GetMSC;
-    else if (!strncmp("xglWsiX11CreatePresentableImage", pName, sizeof("xglWsiX11CreatePresentableImage")))
-        return disp_table->WsiX11CreatePresentableImage;
-    else if (!strncmp("xglWsiX11QueuePresent", pName, sizeof("xglWsiX11QueuePresent")))
-        return disp_table->WsiX11QueuePresent;
+    addr = loader_lookup_dispatch_table(disp_table, pName);
+    if (addr)
+        return addr;
     else  {
         if (disp_table->GetProcAddr == NULL)
             return NULL;