X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Famd%2Fvulkan%2Fradv_wsi.c;h=927650480a6f24d1f5392f7a5f895be0c9c1c196;hb=72ab499c9f9fbfa27645168b688ad03ad5d51242;hp=e159b6436e0e1e39a20cd6b13804d7abe1878ca7;hpb=393aa3f6c929fdbcaa599597e28a3206aa09dcc2;p=mesa.git diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c index e159b6436e0..927650480a6 100644 --- a/src/amd/vulkan/radv_wsi.c +++ b/src/amd/vulkan/radv_wsi.c @@ -29,66 +29,26 @@ #include "vk_util.h" #include "util/macros.h" -#define WSI_CB(x) .x = radv_##x -MAYBE_UNUSED static const struct wsi_callbacks wsi_cbs = { - WSI_CB(GetPhysicalDeviceFormatProperties), -}; - static PFN_vkVoidFunction radv_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName) { - return radv_lookup_entrypoint(pName); -} - -static uint32_t -radv_wsi_queue_get_family_index(VkQueue _queue) -{ - RADV_FROM_HANDLE(radv_queue, queue, _queue); - return queue->queue_family_index; + return radv_lookup_entrypoint_unchecked(pName); } VkResult radv_init_wsi(struct radv_physical_device *physical_device) { - VkResult result; - - wsi_device_init(&physical_device->wsi_device, - radv_physical_device_to_handle(physical_device), - radv_wsi_proc_addr); - - physical_device->wsi_device.queue_get_family_index = - radv_wsi_queue_get_family_index; - -#ifdef VK_USE_PLATFORM_XCB_KHR - result = wsi_x11_init_wsi(&physical_device->wsi_device, &physical_device->instance->alloc); - if (result != VK_SUCCESS) - return result; -#endif - -#ifdef VK_USE_PLATFORM_WAYLAND_KHR - result = wsi_wl_init_wsi(&physical_device->wsi_device, &physical_device->instance->alloc, - radv_physical_device_to_handle(physical_device), - &wsi_cbs); - if (result != VK_SUCCESS) { -#ifdef VK_USE_PLATFORM_XCB_KHR - wsi_x11_finish_wsi(&physical_device->wsi_device, &physical_device->instance->alloc); -#endif - return result; - } -#endif - - return VK_SUCCESS; + return wsi_device_init(&physical_device->wsi_device, + radv_physical_device_to_handle(physical_device), + radv_wsi_proc_addr, + &physical_device->instance->alloc); } void radv_finish_wsi(struct radv_physical_device *physical_device) { -#ifdef VK_USE_PLATFORM_WAYLAND_KHR - wsi_wl_finish_wsi(&physical_device->wsi_device, &physical_device->instance->alloc); -#endif -#ifdef VK_USE_PLATFORM_XCB_KHR - wsi_x11_finish_wsi(&physical_device->wsi_device, &physical_device->instance->alloc); -#endif + wsi_device_finish(&physical_device->wsi_device, + &physical_device->instance->alloc); } void radv_DestroySurfaceKHR( @@ -105,56 +65,83 @@ void radv_DestroySurfaceKHR( VkResult radv_GetPhysicalDeviceSurfaceSupportKHR( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, - VkSurfaceKHR _surface, + VkSurfaceKHR surface, VkBool32* pSupported) { RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice); - ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface); - struct wsi_interface *iface = device->wsi_device.wsi[surface->platform]; - return iface->get_support(surface, &device->wsi_device, - &device->instance->alloc, - queueFamilyIndex, device->local_fd, true, pSupported); + return wsi_common_get_surface_support(&device->wsi_device, + device->local_fd, + queueFamilyIndex, + surface, + &device->instance->alloc, + pSupported); } VkResult radv_GetPhysicalDeviceSurfaceCapabilitiesKHR( VkPhysicalDevice physicalDevice, - VkSurfaceKHR _surface, + VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities) { RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice); - ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface); - struct wsi_interface *iface = device->wsi_device.wsi[surface->platform]; - return iface->get_capabilities(surface, pSurfaceCapabilities); + return wsi_common_get_surface_capabilities(&device->wsi_device, + surface, + pSurfaceCapabilities); +} + +VkResult radv_GetPhysicalDeviceSurfaceCapabilities2KHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, + VkSurfaceCapabilities2KHR* pSurfaceCapabilities) +{ + RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice); + + return wsi_common_get_surface_capabilities2(&device->wsi_device, + pSurfaceInfo, + pSurfaceCapabilities); } VkResult radv_GetPhysicalDeviceSurfaceFormatsKHR( VkPhysicalDevice physicalDevice, - VkSurfaceKHR _surface, + VkSurfaceKHR surface, uint32_t* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats) { RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice); - ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface); - struct wsi_interface *iface = device->wsi_device.wsi[surface->platform]; - return iface->get_formats(surface, &device->wsi_device, pSurfaceFormatCount, - pSurfaceFormats); + return wsi_common_get_surface_formats(&device->wsi_device, + surface, + pSurfaceFormatCount, + pSurfaceFormats); +} + +VkResult radv_GetPhysicalDeviceSurfaceFormats2KHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, + uint32_t* pSurfaceFormatCount, + VkSurfaceFormat2KHR* pSurfaceFormats) +{ + RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice); + + return wsi_common_get_surface_formats2(&device->wsi_device, + pSurfaceInfo, + pSurfaceFormatCount, + pSurfaceFormats); } VkResult radv_GetPhysicalDeviceSurfacePresentModesKHR( VkPhysicalDevice physicalDevice, - VkSurfaceKHR _surface, + VkSurfaceKHR surface, uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes) { RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice); - ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface); - struct wsi_interface *iface = device->wsi_device.wsi[surface->platform]; - return iface->get_present_modes(surface, pPresentModeCount, - pPresentModes); + return wsi_common_get_surface_present_modes(&device->wsi_device, + surface, + pPresentModeCount, + pPresentModes); } VkResult radv_CreateSwapchainKHR( @@ -164,60 +151,34 @@ VkResult radv_CreateSwapchainKHR( VkSwapchainKHR* pSwapchain) { RADV_FROM_HANDLE(radv_device, device, _device); - ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pCreateInfo->surface); - struct wsi_interface *iface = - device->physical_device->wsi_device.wsi[surface->platform]; - struct wsi_swapchain *swapchain; const VkAllocationCallbacks *alloc; if (pAllocator) alloc = pAllocator; else alloc = &device->alloc; - VkResult result = iface->create_swapchain(surface, _device, - &device->physical_device->wsi_device, - device->physical_device->local_fd, - pCreateInfo, - alloc, - &swapchain); - if (result != VK_SUCCESS) - return result; - - if (pAllocator) - swapchain->alloc = *pAllocator; - else - swapchain->alloc = device->alloc; - - for (unsigned i = 0; i < ARRAY_SIZE(swapchain->fences); i++) - swapchain->fences[i] = VK_NULL_HANDLE; - - *pSwapchain = wsi_swapchain_to_handle(swapchain); - return VK_SUCCESS; + return wsi_common_create_swapchain(&device->physical_device->wsi_device, + radv_device_to_handle(device), + device->physical_device->local_fd, + pCreateInfo, + alloc, + pSwapchain); } void radv_DestroySwapchainKHR( VkDevice _device, - VkSwapchainKHR _swapchain, + VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) { RADV_FROM_HANDLE(radv_device, device, _device); - RADV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain); const VkAllocationCallbacks *alloc; - if (!_swapchain) - return; - if (pAllocator) alloc = pAllocator; else alloc = &device->alloc; - for (unsigned i = 0; i < ARRAY_SIZE(swapchain->fences); i++) { - if (swapchain->fences[i] != VK_NULL_HANDLE) - radv_DestroyFence(_device, swapchain->fences[i], pAllocator); - } - - swapchain->destroy(swapchain, alloc); + wsi_common_destroy_swapchain(_device, swapchain, alloc); } VkResult radv_GetSwapchainImagesKHR( @@ -232,22 +193,32 @@ VkResult radv_GetSwapchainImagesKHR( } VkResult radv_AcquireNextImageKHR( - VkDevice device, - VkSwapchainKHR _swapchain, + VkDevice _device, + VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence _fence, uint32_t* pImageIndex) { - RADV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain); + RADV_FROM_HANDLE(radv_device, device, _device); + struct radv_physical_device *pdevice = device->physical_device; RADV_FROM_HANDLE(radv_fence, fence, _fence); - VkResult result = swapchain->acquire_next_image(swapchain, timeout, semaphore, - pImageIndex); + VkResult result = wsi_common_acquire_next_image(&pdevice->wsi_device, + _device, + swapchain, + timeout, + semaphore, + pImageIndex); if (fence && (result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR)) { fence->submitted = true; fence->signalled = true; + if (fence->temp_syncobj) { + device->ws->signal_syncobj(device->ws, fence->temp_syncobj); + } else if (fence->syncobj) { + device->ws->signal_syncobj(device->ws, fence->syncobj); + } } return result; } @@ -263,3 +234,26 @@ VkResult radv_QueuePresentKHR( queue->queue_family_index, pPresentInfo); } + + +VkResult radv_GetDeviceGroupPresentCapabilitiesKHR( + VkDevice device, + VkDeviceGroupPresentCapabilitiesKHR* pCapabilities) +{ + memset(pCapabilities->presentMask, 0, + sizeof(pCapabilities->presentMask)); + pCapabilities->presentMask[0] = 0x1; + pCapabilities->modes = VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR; + + return VK_SUCCESS; +} + +VkResult radv_GetDeviceGroupSurfacePresentModesKHR( + VkDevice device, + VkSurfaceKHR surface, + VkDeviceGroupPresentModeFlagsKHR* pModes) +{ + *pModes = VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR; + + return VK_SUCCESS; +}