On Thursday, 2018-10-18 10:13:39 -0500, Jason Ekstrand wrote: > This lets us avoid passing the DRM fd around all over the place and gets > us closer to layer utopia.
Yay! Reviewed-by: Eric Engestrom <[email protected]> > --- > src/amd/vulkan/radv_wsi.c | 3 -- > src/amd/vulkan/radv_wsi_x11.c | 4 +-- > src/intel/vulkan/anv_wsi.c | 4 +-- > src/intel/vulkan/anv_wsi_x11.c | 4 +-- > src/vulkan/wsi/wsi_common.c | 45 +++++++++++++++++++++++++---- > src/vulkan/wsi/wsi_common.h | 5 ++-- > src/vulkan/wsi/wsi_common_display.c | 22 +------------- > src/vulkan/wsi/wsi_common_private.h | 6 ++-- > src/vulkan/wsi/wsi_common_wayland.c | 3 -- > src/vulkan/wsi/wsi_common_x11.c | 34 +++++++--------------- > src/vulkan/wsi/wsi_common_x11.h | 1 - > 11 files changed, 61 insertions(+), 70 deletions(-) > > diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c > index 43103a4ef85..346fb43d675 100644 > --- a/src/amd/vulkan/radv_wsi.c > +++ b/src/amd/vulkan/radv_wsi.c > @@ -72,7 +72,6 @@ VkResult radv_GetPhysicalDeviceSurfaceSupportKHR( > RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice); > > return wsi_common_get_surface_support(&device->wsi_device, > - device->local_fd, > queueFamilyIndex, > surface, > pSupported); > @@ -171,7 +170,6 @@ VkResult radv_CreateSwapchainKHR( > > return wsi_common_create_swapchain(&device->physical_device->wsi_device, > radv_device_to_handle(device), > - device->physical_device->local_fd, > pCreateInfo, > alloc, > pSwapchain); > @@ -294,7 +292,6 @@ VkResult radv_GetPhysicalDevicePresentRectanglesKHR( > RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice); > > return wsi_common_get_present_rectangles(&device->wsi_device, > - device->local_fd, > surface, > pRectCount, pRects); > } > diff --git a/src/amd/vulkan/radv_wsi_x11.c b/src/amd/vulkan/radv_wsi_x11.c > index 9ef02ccc435..f3ebc791e2d 100644 > --- a/src/amd/vulkan/radv_wsi_x11.c > +++ b/src/amd/vulkan/radv_wsi_x11.c > @@ -45,7 +45,7 @@ VkBool32 radv_GetPhysicalDeviceXcbPresentationSupportKHR( > return wsi_get_physical_device_xcb_presentation_support( > &device->wsi_device, > queueFamilyIndex, > - device->local_fd, true, > + true, > connection, visual_id); > } > > @@ -60,7 +60,7 @@ VkBool32 radv_GetPhysicalDeviceXlibPresentationSupportKHR( > return wsi_get_physical_device_xcb_presentation_support( > &device->wsi_device, > queueFamilyIndex, > - device->local_fd, true, > + true, > XGetXCBConnection(dpy), visualID); > } > > diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c > index 5d672c211c4..024bc1c245d 100644 > --- a/src/intel/vulkan/anv_wsi.c > +++ b/src/intel/vulkan/anv_wsi.c > @@ -89,7 +89,6 @@ VkResult anv_GetPhysicalDeviceSurfaceSupportKHR( > ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice); > > return wsi_common_get_surface_support(&device->wsi_device, > - device->local_fd, > queueFamilyIndex, > surface, > pSupported); > @@ -183,7 +182,7 @@ VkResult anv_CreateSwapchainKHR( > else > alloc = &device->alloc; > > - return wsi_common_create_swapchain(wsi_device, _device, device->fd, > + return wsi_common_create_swapchain(wsi_device, _device, > pCreateInfo, alloc, pSwapchain); > } > > @@ -303,7 +302,6 @@ VkResult anv_GetPhysicalDevicePresentRectanglesKHR( > ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice); > > return wsi_common_get_present_rectangles(&device->wsi_device, > - device->local_fd, > surface, > pRectCount, pRects); > } > diff --git a/src/intel/vulkan/anv_wsi_x11.c b/src/intel/vulkan/anv_wsi_x11.c > index 45c43f6f17f..bfa76e88e79 100644 > --- a/src/intel/vulkan/anv_wsi_x11.c > +++ b/src/intel/vulkan/anv_wsi_x11.c > @@ -41,7 +41,7 @@ VkBool32 anv_GetPhysicalDeviceXcbPresentationSupportKHR( > return wsi_get_physical_device_xcb_presentation_support( > &device->wsi_device, > queueFamilyIndex, > - device->local_fd, false, > + false, > connection, visual_id); > } > > @@ -56,7 +56,7 @@ VkBool32 anv_GetPhysicalDeviceXlibPresentationSupportKHR( > return wsi_get_physical_device_xcb_presentation_support( > &device->wsi_device, > queueFamilyIndex, > - device->local_fd, false, > + false, > XGetXCBConnection(dpy), visualID); > } > > diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c > index ad4b8c9075e..51d8655a5a9 100644 > --- a/src/vulkan/wsi/wsi_common.c > +++ b/src/vulkan/wsi/wsi_common.c > @@ -27,6 +27,7 @@ > #include "vk_util.h" > > #include <unistd.h> > +#include <xf86drm.h> > > VkResult > wsi_device_init(struct wsi_device *wsi, > @@ -44,10 +45,19 @@ wsi_device_init(struct wsi_device *wsi, > > #define WSI_GET_CB(func) \ > PFN_vk##func func = (PFN_vk##func)proc_addr(pdevice, "vk" #func) > + WSI_GET_CB(GetPhysicalDeviceProperties2); > WSI_GET_CB(GetPhysicalDeviceMemoryProperties); > WSI_GET_CB(GetPhysicalDeviceQueueFamilyProperties); > #undef WSI_GET_CB > > + wsi->pci_bus_info.sType = > + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT; > + VkPhysicalDeviceProperties2 pdp2 = { > + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, > + .pNext = &wsi->pci_bus_info, > + }; > + GetPhysicalDeviceProperties2(pdevice, &pdp2); > + > GetPhysicalDeviceMemoryProperties(pdevice, &wsi->memory_props); > GetPhysicalDeviceQueueFamilyProperties(pdevice, &wsi->queue_family_count, > NULL); > > @@ -121,6 +131,32 @@ wsi_device_finish(struct wsi_device *wsi, > #endif > } > > +bool > +wsi_device_matches_drm_fd(const struct wsi_device *wsi, int drm_fd) > +{ > + drmDevicePtr fd_device; > + int ret = drmGetDevice(drm_fd, &fd_device); > + if (ret) > + return false; > + > + bool match = false; > + switch (fd_device->bustype) { > + case DRM_BUS_PCI: > + match = wsi->pci_bus_info.pciDomain == fd_device->businfo.pci->domain > && > + wsi->pci_bus_info.pciBus == fd_device->businfo.pci->bus && > + wsi->pci_bus_info.pciDevice == fd_device->businfo.pci->dev && > + wsi->pci_bus_info.pciFunction == fd_device->businfo.pci->func; > + break; > + > + default: > + break; > + } > + > + drmFreeDevice(&fd_device); > + > + return match; > +} > + > VkResult > wsi_swapchain_init(const struct wsi_device *wsi, > struct wsi_swapchain *chain, > @@ -675,7 +711,6 @@ wsi_destroy_image(const struct wsi_swapchain *chain, > > VkResult > wsi_common_get_surface_support(struct wsi_device *wsi_device, > - int local_fd, > uint32_t queueFamilyIndex, > VkSurfaceKHR _surface, > VkBool32* pSupported) > @@ -684,7 +719,7 @@ wsi_common_get_surface_support(struct wsi_device > *wsi_device, > struct wsi_interface *iface = wsi_device->wsi[surface->platform]; > > return iface->get_support(surface, wsi_device, > - queueFamilyIndex, local_fd, pSupported); > + queueFamilyIndex, pSupported); > } > > VkResult > @@ -805,7 +840,6 @@ wsi_common_get_surface_present_modes(struct wsi_device > *wsi_device, > > VkResult > wsi_common_get_present_rectangles(struct wsi_device *wsi_device, > - int local_fd, > VkSurfaceKHR _surface, > uint32_t* pRectCount, > VkRect2D* pRects) > @@ -813,14 +847,13 @@ wsi_common_get_present_rectangles(struct wsi_device > *wsi_device, > ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface); > struct wsi_interface *iface = wsi_device->wsi[surface->platform]; > > - return iface->get_present_rectangles(surface, wsi_device, local_fd, > + return iface->get_present_rectangles(surface, wsi_device, > pRectCount, pRects); > } > > VkResult > wsi_common_create_swapchain(struct wsi_device *wsi, > VkDevice device, > - int fd, > const VkSwapchainCreateInfoKHR *pCreateInfo, > const VkAllocationCallbacks *pAllocator, > VkSwapchainKHR *pSwapchain) > @@ -829,7 +862,7 @@ wsi_common_create_swapchain(struct wsi_device *wsi, > struct wsi_interface *iface = wsi->wsi[surface->platform]; > struct wsi_swapchain *swapchain; > > - VkResult result = iface->create_swapchain(surface, device, wsi, fd, > + VkResult result = iface->create_swapchain(surface, device, wsi, > pCreateInfo, pAllocator, > &swapchain); > if (result != VK_SUCCESS) > diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h > index 5b69c573d9e..f6ca013c2a8 100644 > --- a/src/vulkan/wsi/wsi_common.h > +++ b/src/vulkan/wsi/wsi_common.h > @@ -97,6 +97,8 @@ struct wsi_device { > VkPhysicalDeviceMemoryProperties memory_props; > uint32_t queue_family_count; > > + VkPhysicalDevicePCIBusInfoPropertiesEXT pci_bus_info; > + > bool supports_modifiers; > uint64_t (*image_get_modifier)(VkImage image); > > @@ -166,7 +168,6 @@ ICD_DEFINE_NONDISP_HANDLE_CASTS(VkIcdSurfaceBase, > VkSurfaceKHR) > > VkResult > wsi_common_get_surface_support(struct wsi_device *wsi_device, > - int local_fd, > uint32_t queueFamilyIndex, > VkSurfaceKHR surface, > VkBool32* pSupported); > @@ -201,7 +202,6 @@ wsi_common_get_surface_present_modes(struct wsi_device > *wsi_device, > > VkResult > wsi_common_get_present_rectangles(struct wsi_device *wsi, > - int local_fd, > VkSurfaceKHR surface, > uint32_t* pRectCount, > VkRect2D* pRects); > @@ -226,7 +226,6 @@ wsi_common_acquire_next_image2(const struct wsi_device > *wsi, > VkResult > wsi_common_create_swapchain(struct wsi_device *wsi, > VkDevice device, > - int fd, > const VkSwapchainCreateInfoKHR *pCreateInfo, > const VkAllocationCallbacks *pAllocator, > VkSwapchainKHR *pSwapchain); > diff --git a/src/vulkan/wsi/wsi_common_display.c > b/src/vulkan/wsi/wsi_common_display.c > index 2315717ef8e..fd0d30ad80c 100644 > --- a/src/vulkan/wsi/wsi_common_display.c > +++ b/src/vulkan/wsi/wsi_common_display.c > @@ -803,7 +803,6 @@ static VkResult > wsi_display_surface_get_support(VkIcdSurfaceBase *surface, > struct wsi_device *wsi_device, > uint32_t queueFamilyIndex, > - int local_fd, > VkBool32* pSupported) > { > *pSupported = VK_TRUE; > @@ -934,27 +933,9 @@ wsi_display_surface_get_present_modes(VkIcdSurfaceBase > *surface, > return vk_outarray_status(&conn); > } > > -static bool > -fds_are_same_gpu(int fd1, int fd2) > -{ > - if (fd1 == -1 || fd2 == -1) > - return false; > - > - char *fd1_dev = drmGetRenderDeviceNameFromFd(fd1); > - char *fd2_dev = drmGetRenderDeviceNameFromFd(fd2); > - > - int ret = strcmp(fd1_dev, fd2_dev); > - > - free(fd1_dev); > - free(fd2_dev); > - > - return ret == 0; > -} > - > static VkResult > wsi_display_surface_get_present_rectangles(VkIcdSurfaceBase *surface_base, > struct wsi_device *wsi_device, > - int local_fd, > uint32_t* pRectCount, > VkRect2D* pRects) > { > @@ -962,7 +943,7 @@ > wsi_display_surface_get_present_rectangles(VkIcdSurfaceBase *surface_base, > wsi_display_mode *mode = > wsi_display_mode_from_handle(surface->displayMode); > VK_OUTARRAY_MAKE(out, pRects, pRectCount); > > - if (fds_are_same_gpu(local_fd, mode->connector->wsi->fd)) { > + if (wsi_device_matches_drm_fd(wsi_device, mode->connector->wsi->fd)) { > vk_outarray_append(&out, rect) { > *rect = (VkRect2D) { > .offset = { 0, 0 }, > @@ -1730,7 +1711,6 @@ wsi_display_surface_create_swapchain( > VkIcdSurfaceBase *icd_surface, > VkDevice device, > struct wsi_device *wsi_device, > - int local_fd, > const VkSwapchainCreateInfoKHR *create_info, > const VkAllocationCallbacks *allocator, > struct wsi_swapchain **swapchain_out) > diff --git a/src/vulkan/wsi/wsi_common_private.h > b/src/vulkan/wsi/wsi_common_private.h > index d8290b69331..50a78acacb0 100644 > --- a/src/vulkan/wsi/wsi_common_private.h > +++ b/src/vulkan/wsi/wsi_common_private.h > @@ -69,6 +69,9 @@ struct wsi_swapchain { > const VkPresentRegionKHR *damage); > }; > > +bool > +wsi_device_matches_drm_fd(const struct wsi_device *wsi, int drm_fd); > + > VkResult > wsi_swapchain_init(const struct wsi_device *wsi, > struct wsi_swapchain *chain, > @@ -101,7 +104,6 @@ struct wsi_interface { > VkResult (*get_support)(VkIcdSurfaceBase *surface, > struct wsi_device *wsi_device, > uint32_t queueFamilyIndex, > - int local_fd, > VkBool32* pSupported); > VkResult (*get_capabilities2)(VkIcdSurfaceBase *surface, > const void *info_next, > @@ -120,13 +122,11 @@ struct wsi_interface { > VkPresentModeKHR* pPresentModes); > VkResult (*get_present_rectangles)(VkIcdSurfaceBase *surface, > struct wsi_device *wsi_device, > - int local_fd, > uint32_t* pRectCount, > VkRect2D* pRects); > VkResult (*create_swapchain)(VkIcdSurfaceBase *surface, > VkDevice device, > struct wsi_device *wsi_device, > - int local_fd, > const VkSwapchainCreateInfoKHR* pCreateInfo, > const VkAllocationCallbacks* pAllocator, > struct wsi_swapchain **swapchain); > diff --git a/src/vulkan/wsi/wsi_common_wayland.c > b/src/vulkan/wsi/wsi_common_wayland.c > index dccb530dae3..e9cc22ec603 100644 > --- a/src/vulkan/wsi/wsi_common_wayland.c > +++ b/src/vulkan/wsi/wsi_common_wayland.c > @@ -465,7 +465,6 @@ static VkResult > wsi_wl_surface_get_support(VkIcdSurfaceBase *surface, > struct wsi_device *wsi_device, > uint32_t queueFamilyIndex, > - int local_fd, > VkBool32* pSupported) > { > *pSupported = true; > @@ -604,7 +603,6 @@ wsi_wl_surface_get_present_modes(VkIcdSurfaceBase > *surface, > static VkResult > wsi_wl_surface_get_present_rectangles(VkIcdSurfaceBase *surface, > struct wsi_device *wsi_device, > - int local_fd, > uint32_t* pRectCount, > VkRect2D* pRects) > { > @@ -908,7 +906,6 @@ static VkResult > wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, > VkDevice device, > struct wsi_device *wsi_device, > - int local_fd, > const VkSwapchainCreateInfoKHR* pCreateInfo, > const VkAllocationCallbacks* pAllocator, > struct wsi_swapchain **swapchain_out) > diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c > index 8c621ddf568..16a544ec775 100644 > --- a/src/vulkan/wsi/wsi_common_x11.c > +++ b/src/vulkan/wsi/wsi_common_x11.c > @@ -99,29 +99,22 @@ wsi_dri3_open(xcb_connection_t *conn, > } > > static bool > -wsi_x11_check_dri3_compatible(xcb_connection_t *conn, int local_fd) > +wsi_x11_check_dri3_compatible(const struct wsi_device *wsi_dev, > + xcb_connection_t *conn) > { > xcb_screen_iterator_t screen_iter = > xcb_setup_roots_iterator(xcb_get_setup(conn)); > xcb_screen_t *screen = screen_iter.data; > > int dri3_fd = wsi_dri3_open(conn, screen->root, None); > - if (dri3_fd != -1) { > - char *local_dev = drmGetRenderDeviceNameFromFd(local_fd); > - char *dri3_dev = drmGetRenderDeviceNameFromFd(dri3_fd); > - int ret; > - > - close(dri3_fd); > + if (dri3_fd == -1) > + return true; > > - ret = strcmp(local_dev, dri3_dev); > + bool match = wsi_device_matches_drm_fd(wsi_dev, dri3_fd); > > - free(local_dev); > - free(dri3_dev); > + close(dri3_fd); > > - if (ret != 0) > - return false; > - } > - return true; > + return match; > } > > static struct wsi_x11_connection * > @@ -382,7 +375,6 @@ visual_has_alpha(xcb_visualtype_t *visual, unsigned depth) > VkBool32 wsi_get_physical_device_xcb_presentation_support( > struct wsi_device *wsi_device, > uint32_t queueFamilyIndex, > - int fd, > bool can_handle_different_gpu, > xcb_connection_t* connection, > xcb_visualid_t visual_id) > @@ -397,7 +389,7 @@ VkBool32 wsi_get_physical_device_xcb_presentation_support( > return false; > > if (!can_handle_different_gpu) > - if (!wsi_x11_check_dri3_compatible(connection, fd)) > + if (!wsi_x11_check_dri3_compatible(wsi_device, connection)) > return false; > > unsigned visual_depth; > @@ -432,7 +424,6 @@ static VkResult > x11_surface_get_support(VkIcdSurfaceBase *icd_surface, > struct wsi_device *wsi_device, > uint32_t queueFamilyIndex, > - int local_fd, > VkBool32* pSupported) > { > xcb_connection_t *conn = x11_surface_get_connection(icd_surface); > @@ -601,7 +592,6 @@ x11_surface_get_present_modes(VkIcdSurfaceBase *surface, > > static bool > x11_surface_is_local_to_gpu(struct wsi_device *wsi_dev, > - int local_fd, > xcb_connection_t *conn) > { > struct wsi_x11_connection *wsi_conn = > @@ -613,7 +603,7 @@ x11_surface_is_local_to_gpu(struct wsi_device *wsi_dev, > if (!wsi_x11_check_for_dri3(wsi_conn)) > return false; > > - if (!wsi_x11_check_dri3_compatible(conn, local_fd)) > + if (!wsi_x11_check_dri3_compatible(wsi_dev, conn)) > return false; > > return true; > @@ -622,7 +612,6 @@ x11_surface_is_local_to_gpu(struct wsi_device *wsi_dev, > static VkResult > x11_surface_get_present_rectangles(VkIcdSurfaceBase *icd_surface, > struct wsi_device *wsi_device, > - int local_fd, > uint32_t* pRectCount, > VkRect2D* pRects) > { > @@ -630,7 +619,7 @@ x11_surface_get_present_rectangles(VkIcdSurfaceBase > *icd_surface, > xcb_window_t window = x11_surface_get_window(icd_surface); > VK_OUTARRAY_MAKE(out, pRects, pRectCount); > > - if (x11_surface_is_local_to_gpu(wsi_device, local_fd, conn)) { > + if (x11_surface_is_local_to_gpu(wsi_device, conn)) { > vk_outarray_append(&out, rect) { > xcb_generic_error_t *err = NULL; > xcb_get_geometry_cookie_t geom_cookie = xcb_get_geometry(conn, > window); > @@ -1321,7 +1310,6 @@ static VkResult > x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, > VkDevice device, > struct wsi_device *wsi_device, > - int local_fd, > const VkSwapchainCreateInfoKHR *pCreateInfo, > const VkAllocationCallbacks* pAllocator, > struct wsi_swapchain **swapchain_out) > @@ -1388,7 +1376,7 @@ x11_surface_create_swapchain(VkIcdSurfaceBase > *icd_surface, > else > chain->last_present_mode = XCB_PRESENT_COMPLETE_MODE_COPY; > > - if (!wsi_x11_check_dri3_compatible(conn, local_fd)) > + if (!wsi_x11_check_dri3_compatible(wsi_device, conn)) > chain->base.use_prime_blit = true; > > chain->event_id = xcb_generate_id(chain->conn); > diff --git a/src/vulkan/wsi/wsi_common_x11.h b/src/vulkan/wsi/wsi_common_x11.h > index e9b3ecfb2e0..99b1bcdc6fd 100644 > --- a/src/vulkan/wsi/wsi_common_x11.h > +++ b/src/vulkan/wsi/wsi_common_x11.h > @@ -28,7 +28,6 @@ > VkBool32 wsi_get_physical_device_xcb_presentation_support( > struct wsi_device *wsi_device, > uint32_t queueFamilyIndex, > - int local_fd, > bool can_handle_different_gpu, > xcb_connection_t* connection, > xcb_visualid_t visual_id); > -- > 2.19.1 > > _______________________________________________ > mesa-dev mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
