diff --git a/src/amd/vulkan/radv_wsi_display.c b/src/amd/vulkan/radv_wsi_display.c index 78893cea673..61f255a8628 100644 --- a/src/amd/vulkan/radv_wsi_display.c +++ b/src/amd/vulkan/radv_wsi_display.c @@ -287,7 +287,8 @@ radv_RegisterDeviceEventEXT(VkDevice _device, &device->physical_device->wsi_device, device_event_info, allocator, - &fence->permanent.fence_wsi); + &fence->permanent.fence_wsi, + -1); if (ret == VK_SUCCESS) *_fence = radv_fence_to_handle(fence); else @@ -319,7 +320,8 @@ radv_RegisterDisplayEventEXT(VkDevice _device, display, display_event_info, allocator, - &(fence->permanent.fence_wsi)); + &fence->permanent.fence_wsi, + -1); if (ret == VK_SUCCESS) *_fence = radv_fence_to_handle(fence); diff --git a/src/freedreno/vulkan/tu_wsi_display.c b/src/freedreno/vulkan/tu_wsi_display.c index 9a9696d93cc..65c383bb8fa 100644 --- a/src/freedreno/vulkan/tu_wsi_display.c +++ b/src/freedreno/vulkan/tu_wsi_display.c @@ -281,7 +281,8 @@ tu_RegisterDeviceEventEXT(VkDevice _device, &device->physical_device->wsi_device, device_event_info, allocator, - &fence->fence_wsi); + &fence->fence_wsi, + -1); if (ret == VK_SUCCESS) *_fence = tu_fence_to_handle(fence); else @@ -313,7 +314,8 @@ tu_RegisterDisplayEventEXT(VkDevice _device, display, display_event_info, allocator, - &fence->fence_wsi); + &fence->fence_wsi, + -1); if (ret == VK_SUCCESS) *_fence = tu_fence_to_handle(fence); diff --git a/src/intel/vulkan/anv_wsi_display.c b/src/intel/vulkan/anv_wsi_display.c index 62db692a9a8..256f15c4396 100644 --- a/src/intel/vulkan/anv_wsi_display.c +++ b/src/intel/vulkan/anv_wsi_display.c @@ -266,7 +266,8 @@ anv_RegisterDeviceEventEXT(VkDevice _device, &device->physical->wsi_device, device_event_info, allocator, - &fence->permanent.fence_wsi); + &fence->permanent.fence_wsi, + -1); if (ret == VK_SUCCESS) *_fence = anv_fence_to_handle(fence); else @@ -294,7 +295,7 @@ anv_RegisterDisplayEventEXT(VkDevice _device, ret = wsi_register_display_event( _device, &device->physical->wsi_device, - display, display_event_info, allocator, &(fence->permanent.fence_wsi)); + display, display_event_info, allocator, &fence->permanent.fence_wsi, -1); if (ret == VK_SUCCESS) *_fence = anv_fence_to_handle(fence); diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index b05d7cc479d..3a304e36537 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -137,6 +137,7 @@ struct wsi_display_fence { struct wsi_fence base; bool event_received; bool destroyed; + uint32_t syncobj; /* syncobj to signal on event */ uint64_t sequence; }; @@ -1527,6 +1528,14 @@ wsi_display_fence_check_free(struct wsi_display_fence *fence) static void wsi_display_fence_event_handler(struct wsi_display_fence *fence) { + struct wsi_display *wsi = + (struct wsi_display *) fence->base.wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; + + if (fence->syncobj) { + (void) drmSyncobjSignal(wsi->fd, &fence->syncobj, 1); + (void) drmSyncobjDestroy(wsi->fd, fence->syncobj); + } + fence->event_received = true; wsi_display_fence_check_free(fence); } @@ -1545,7 +1554,8 @@ static struct wsi_display_fence * wsi_display_fence_alloc(VkDevice device, const struct wsi_device *wsi_device, VkDisplayKHR display, - const VkAllocationCallbacks *allocator) + const VkAllocationCallbacks *allocator, + int sync_fd) { struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; @@ -1556,6 +1566,14 @@ wsi_display_fence_alloc(VkDevice device, if (!fence) return NULL; + if (sync_fd >= 0) { + int ret = drmSyncobjFDToHandle(wsi->fd, sync_fd, &fence->syncobj); + if (ret) { + vk_free2(wsi->alloc, allocator, fence); + return NULL; + } + } + fence->base.device = device; fence->base.display = display; fence->base.wsi_device = wsi_device; @@ -2499,7 +2517,8 @@ wsi_register_device_event(VkDevice device, struct wsi_device *wsi_device, const VkDeviceEventInfoEXT *device_event_info, const VkAllocationCallbacks *allocator, - struct wsi_fence **fence_p) + struct wsi_fence **fence_p, + int sync_fd) { return VK_ERROR_FEATURE_NOT_PRESENT; } @@ -2510,7 +2529,8 @@ wsi_register_display_event(VkDevice device, VkDisplayKHR display, const VkDisplayEventInfoEXT *display_event_info, const VkAllocationCallbacks *allocator, - struct wsi_fence **fence_p) + struct wsi_fence **fence_p, + int sync_fd) { struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; @@ -2520,7 +2540,7 @@ wsi_register_display_event(VkDevice device, switch (display_event_info->displayEvent) { case VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT: - fence = wsi_display_fence_alloc(device, wsi_device, display, allocator); + fence = wsi_display_fence_alloc(device, wsi_device, display, allocator, sync_fd); if (!fence) return VK_ERROR_OUT_OF_HOST_MEMORY; @@ -2528,10 +2548,16 @@ wsi_register_display_event(VkDevice device, ret = wsi_register_vblank_event(fence, wsi_device, display, DRM_CRTC_SEQUENCE_RELATIVE, 1, NULL); - if (ret == VK_SUCCESS) - *fence_p = &fence->base; - else if (fence != NULL) + if (ret == VK_SUCCESS) { + if (fence_p) + *fence_p = &fence->base; + else + fence->base.destroy(&fence->base); + } else if (fence != NULL) { + if (fence->syncobj) + drmSyncobjDestroy(wsi->fd, fence->syncobj); vk_free2(wsi->alloc, allocator, fence); + } break; default: diff --git a/src/vulkan/wsi/wsi_common_display.h b/src/vulkan/wsi/wsi_common_display.h index be0bd4e06fb..fb045982cf8 100644 --- a/src/vulkan/wsi/wsi_common_display.h +++ b/src/vulkan/wsi/wsi_common_display.h @@ -143,7 +143,8 @@ wsi_register_device_event(VkDevice device, struct wsi_device *wsi_device, const VkDeviceEventInfoEXT *device_event_info, const VkAllocationCallbacks *allocator, - struct wsi_fence **fence); + struct wsi_fence **fence, + int sync_fd); VkResult wsi_register_display_event(VkDevice device, @@ -151,7 +152,8 @@ wsi_register_display_event(VkDevice device, VkDisplayKHR display, const VkDisplayEventInfoEXT *display_event_info, const VkAllocationCallbacks *allocator, - struct wsi_fence **fence); + struct wsi_fence **fence, + int sync_fd); VkResult wsi_get_swapchain_counter(VkDevice device,