From 2afb020a8a38f1dfc3a1fa13063b3a311a8f0e74 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Mon, 30 Nov 2015 17:21:25 -0700 Subject: loader: Add initialization of loader dispatch table for wsi device extensions Since we had trampoline code for these, layers were getting skipped when called thru the trampoline code. --- loader/loader.c | 9 +++++++-- loader/table_ops.h | 11 ++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) (limited to 'loader') diff --git a/loader/loader.c b/loader/loader.c index df720c64..10473a67 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -959,12 +959,12 @@ static VkExtensionProperties *get_extension_property( } /* - * For global exenstions implemented within the loader (i.e. DEBUG_REPORT + * For global extensions implemented within the loader (i.e. DEBUG_REPORT * the extension must provide two entry points for the loader to use: * - "trampoline" entry point - this is the address returned by GetProcAddr * and will always do what's necessary to support a global call. * - "terminator" function - this function will be put at the end of the - * instance chain and will contain the necessary logica to call / process + * instance chain and will contain the necessary logic to call / process * the extension for the appropriate ICDs that are available. * There is no generic mechanism for including these functions, the references * must be placed into the appropriate loader entry points. @@ -3332,6 +3332,11 @@ VKAPI_ATTR VkResult VKAPI_CALL loader_CreateDevice( /* finally can call down the chain */ res = dev->loader_dispatch.core_dispatch.CreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice); + /* initialize WSI device extensions as part of core dispatch since loader has + * dedicated trampoline code for these*/ + loader_init_device_extension_dispatch_table(&dev->loader_dispatch, + dev->loader_dispatch.core_dispatch.GetDeviceProcAddr, + *pDevice); dev->loader_dispatch.core_dispatch.CreateDevice = icd->CreateDevice; return res; diff --git a/loader/table_ops.h b/loader/table_ops.h index 98eebe5a..ed9f8d6f 100644 --- a/loader/table_ops.h +++ b/loader/table_ops.h @@ -169,9 +169,14 @@ static inline void loader_init_device_dispatch_table(struct loader_dev_dispatch_ table->CmdNextSubpass = (PFN_vkCmdNextSubpass) gpa(dev, "vkCmdNextSubpass"); table->CmdEndRenderPass = (PFN_vkCmdEndRenderPass) gpa(dev, "vkCmdEndRenderPass"); table->CmdExecuteCommands = (PFN_vkCmdExecuteCommands) gpa(dev, "vkCmdExecuteCommands"); -//TODO move into it's own table -//TODO also consider dropping trampoline code for these device level extensions entirely -// then don't need loader to know about these at all but then not queryable via GIPA + +} + +static inline void loader_init_device_extension_dispatch_table(struct loader_dev_dispatch_table *dev_table, + PFN_vkGetDeviceProcAddr gpa, + VkDevice dev) +{ + VkLayerDispatchTable *table = &dev_table->core_dispatch; table->AcquireNextImageKHR = (PFN_vkAcquireNextImageKHR) gpa(dev, "vkAcquireNextImageKHR"); table->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR) gpa(dev, "vkCreateSwapchainKHR"); table->DestroySwapchainKHR = (PFN_vkDestroySwapchainKHR) gpa(dev, "vkDestroySwapchainKHR"); -- cgit v1.2.3