diff options
| author | Lenny Komow <lenny@lunarg.com> | 2017-06-01 13:32:28 -0600 |
|---|---|---|
| committer | Lenny Komow <lenny@lunarg.com> | 2017-06-02 16:34:34 -0600 |
| commit | ccb58fd80322e8488b6e1b31673cb73821d83d03 (patch) | |
| tree | e50de7f1c04ecc65effd79b59755f8ebd13622cf /loader | |
| parent | 6914e6d300960ca34f2b327b20262953649696e3 (diff) | |
| download | usermoji-ccb58fd80322e8488b6e1b31673cb73821d83d03.tar.xz | |
loader: Add emulation for EXT inst extensions
Change-Id: I481ff8a2ae0ec5a82773fddd2b59c750126adc11
Diffstat (limited to 'loader')
| -rw-r--r-- | loader/extension_manual.c | 144 | ||||
| -rw-r--r-- | loader/extension_manual.h | 24 |
2 files changed, 168 insertions, 0 deletions
diff --git a/loader/extension_manual.c b/loader/extension_manual.c index c08a92a1..f4ad56bd 100644 --- a/loader/extension_manual.c +++ b/loader/extension_manual.c @@ -37,6 +37,8 @@ VkResult setupLoaderTrampPhysDevGroups(VkInstance instance); VkResult setupLoaderTermPhysDevGroups(struct loader_instance *inst); +// ---- VK_KHX_device_group extension trampoline/terminators + VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDeviceGroupsKHX( VkInstance instance, uint32_t *pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX *pPhysicalDeviceGroupProperties) { @@ -126,6 +128,8 @@ out: return res; } +// ---- VK_NV_external_memory_capabilities extension trampoline/terminators + VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV( VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, @@ -653,6 +657,146 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceFormats2KHR(Vk } } +// ---- VK_EXT_display_surface_counter extension trampoline/terminators + +VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, + VkSurfaceCapabilities2EXT *pSurfaceCapabilities) { + const VkLayerInstanceDispatchTable *disp; + VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice); + disp = loader_get_instance_layer_dispatch(physicalDevice); + return disp->GetPhysicalDeviceSurfaceCapabilities2EXT(unwrapped_phys_dev, surface, pSurfaceCapabilities); +} + +VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceCapabilities2EXT( + VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilities2EXT *pSurfaceCapabilities) { + struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice; + struct loader_icd_term *icd_term = phys_dev_term->this_icd_term; + + VkIcdSurface *icd_surface = (VkIcdSurface *)(surface); + uint8_t icd_index = phys_dev_term->icd_index; + + // Unwrap the surface if needed + VkSurfaceKHR unwrapped_surface = surface; + if (icd_surface->real_icd_surfaces != NULL && (void *)icd_surface->real_icd_surfaces[icd_index] != NULL) { + unwrapped_surface = icd_surface->real_icd_surfaces[icd_index]; + } + + if (icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilities2EXT != NULL) { + // Pass the call to the driver + return icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilities2EXT(phys_dev_term->phys_dev, unwrapped_surface, + pSurfaceCapabilities); + } else { + // Emulate the call + loader_log(icd_term->this_instance, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, + "vkGetPhysicalDeviceSurfaceCapabilities2EXT: Emulating call in ICD \"%s\" using " + "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", + icd_term->scanned_icd->lib_name); + + VkSurfaceCapabilitiesKHR surface_caps; + VkResult res = + icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev_term->phys_dev, unwrapped_surface, &surface_caps); + pSurfaceCapabilities->minImageCount = surface_caps.minImageCount; + pSurfaceCapabilities->maxImageCount = surface_caps.maxImageCount; + pSurfaceCapabilities->currentExtent = surface_caps.currentExtent; + pSurfaceCapabilities->minImageExtent = surface_caps.minImageExtent; + pSurfaceCapabilities->maxImageExtent = surface_caps.maxImageExtent; + pSurfaceCapabilities->maxImageArrayLayers = surface_caps.maxImageArrayLayers; + pSurfaceCapabilities->supportedTransforms = surface_caps.supportedTransforms; + pSurfaceCapabilities->currentTransform = surface_caps.currentTransform; + pSurfaceCapabilities->supportedCompositeAlpha = surface_caps.supportedCompositeAlpha; + pSurfaceCapabilities->supportedUsageFlags = surface_caps.supportedUsageFlags; + pSurfaceCapabilities->supportedSurfaceCounters = 0; + + if (pSurfaceCapabilities->pNext != NULL) { + loader_log(icd_term->this_instance, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, + "vkGetPhysicalDeviceSurfaceCapabilities2EXT: Emulation found unrecognized structure type in " + "pSurfaceCapabilities->pNext - this struct will be ignored"); + } + + return res; + } +} + +// ---- VK_EXT_direct_mode_display extension trampoline/terminators + +VKAPI_ATTR VkResult VKAPI_CALL ReleaseDisplayEXT(VkPhysicalDevice physicalDevice, VkDisplayKHR display) { + const VkLayerInstanceDispatchTable *disp; + VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice); + disp = loader_get_instance_layer_dispatch(physicalDevice); + return disp->ReleaseDisplayEXT(unwrapped_phys_dev, display); +} + +VKAPI_ATTR VkResult VKAPI_CALL terminator_ReleaseDisplayEXT(VkPhysicalDevice physicalDevice, VkDisplayKHR display) { + struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice; + struct loader_icd_term *icd_term = phys_dev_term->this_icd_term; + + if (icd_term->dispatch.ReleaseDisplayEXT == NULL) { + loader_log(icd_term->this_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, + "ICD \"%s\" associated with VkPhysicalDevice does not support vkReleaseDisplayEXT - Consequently, the call is " + "invalid because it should not be possible to acquire a display on this device", + icd_term->scanned_icd->lib_name); + } + return icd_term->dispatch.ReleaseDisplayEXT(phys_dev_term->phys_dev, display); +} + +// ---- VK_EXT_acquire_xlib_display extension trampoline/terminators + +#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT +VKAPI_ATTR VkResult VKAPI_CALL AcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, VkDisplayKHR display) { + const VkLayerInstanceDispatchTable *disp; + VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice); + disp = loader_get_instance_layer_dispatch(physicalDevice); + return disp->AcquireXlibDisplayEXT(unwrapped_phys_dev, dpy, display); +} + +VKAPI_ATTR VkResult VKAPI_CALL terminator_AcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, + VkDisplayKHR display) { + struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice; + struct loader_icd_term *icd_term = phys_dev_term->this_icd_term; + + if (icd_term->dispatch.AcquireXlibDisplayEXT != NULL) { + // Pass the call to the driver + return icd_term->dispatch.AcquireXlibDisplayEXT(phys_dev_term->phys_dev, dpy, display); + } else { + // Emulate the call + loader_log(icd_term->this_instance, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, + "vkAcquireXLibDisplayEXT: Emulating call in ICD \"%s\" by returning error", icd_term->scanned_icd->lib_name); + + // Fail for the unsupported command + return VK_ERROR_INITIALIZATION_FAILED; + } +} + +VKAPI_ATTR VkResult VKAPI_CALL GetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, RROutput rrOutput, + VkDisplayKHR *pDisplay) { + const VkLayerInstanceDispatchTable *disp; + VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice); + disp = loader_get_instance_layer_dispatch(physicalDevice); + return disp->GetRandROutputDisplayEXT(unwrapped_phys_dev, dpy, rrOutput, pDisplay); +} + +VKAPI_ATTR VkResult VKAPI_CALL terminator_GetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, RROutput rrOutput, + VkDisplayKHR *pDisplay) { + struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice; + struct loader_icd_term *icd_term = phys_dev_term->this_icd_term; + + if (icd_term->dispatch.GetRandROutputDisplayEXT != NULL) { + // Pass the call to the driver + return icd_term->dispatch.GetRandROutputDisplayEXT(phys_dev_term->phys_dev, dpy, rrOutput, pDisplay); + } else { + // Emulate the call + loader_log(icd_term->this_instance, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, + "vkGetRandROutputDisplayEXT: Emulating call in ICD \"%s\" by returning null display", + icd_term->scanned_icd->lib_name); + + // Return a null handle to indicate this can't be done + *pDisplay = VK_NULL_HANDLE; + return VK_SUCCESS; + } +} + +#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT + // ---- Helper functions VkResult setupLoaderTrampPhysDevGroups(VkInstance instance) { diff --git a/loader/extension_manual.h b/loader/extension_manual.h index 36ad6374..9f9b85f4 100644 --- a/loader/extension_manual.h +++ b/loader/extension_manual.h @@ -110,3 +110,27 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceFormats2KHR(Vk const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats); + +VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, + VkSurfaceCapabilities2EXT* pSurfaceCapabilities); + +VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice, + VkSurfaceKHR surface, + VkSurfaceCapabilities2EXT* pSurfaceCapabilities); + +VKAPI_ATTR VkResult VKAPI_CALL ReleaseDisplayEXT(VkPhysicalDevice physicalDevice, VkDisplayKHR display); + +VKAPI_ATTR VkResult VKAPI_CALL terminator_ReleaseDisplayEXT(VkPhysicalDevice physicalDevice, VkDisplayKHR display); + +#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT +VKAPI_ATTR VkResult VKAPI_CALL AcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice, Display* dpy, VkDisplayKHR display); + +VKAPI_ATTR VkResult VKAPI_CALL terminator_AcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice, Display* dpy, + VkDisplayKHR display); + +VKAPI_ATTR VkResult VKAPI_CALL GetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice, Display* dpy, RROutput rrOutput, + VkDisplayKHR* pDisplay); + +VKAPI_ATTR VkResult VKAPI_CALL terminator_GetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice, Display* dpy, RROutput rrOutput, + VkDisplayKHR* pDisplay); +#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT |
