On 07/01/2025 13:58, Lynne wrote:
lavapipe indicates it supports external_semaphore_fd, but actually,
it does not support exporting such?

Ref: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12422
---
  libavutil/hwcontext_vulkan.c | 25 ++++++++++++++++++++++++-
  libavutil/vulkan_functions.h |  1 +
  2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index c5f4de5684..f11243482b 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -111,6 +111,7 @@ typedef struct VulkanDevicePriv {
      VkPhysicalDeviceProperties2 props;
      VkPhysicalDeviceMemoryProperties mprops;
      VkPhysicalDeviceExternalMemoryHostPropertiesEXT hprops;
+    VkExternalSemaphoreProperties ext_sem_props;
/* Enabled features */
      VulkanDeviceFeatures feats;
@@ -1715,6 +1716,7 @@ static int vulkan_device_init(AVHWDeviceContext *ctx)
      FFVulkanFunctions *vk = &p->vkctx.vkfn;
      VkQueueFamilyProperties2 *qf;
      VkQueueFamilyVideoPropertiesKHR *qf_vid;
+    VkPhysicalDeviceExternalSemaphoreInfo ext_sem_props_info;
      int graph_index, comp_index, tx_index, enc_index, dec_index;
/* Set device extension flags */
@@ -1760,6 +1762,23 @@ static int vulkan_device_init(AVHWDeviceContext *ctx)
          return AVERROR_EXTERNAL;
      }
+ ext_sem_props_info = (VkPhysicalDeviceExternalSemaphoreInfo) {
+        .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO,
+#ifdef _WIN32
+        .handleType = IsWindows8OrGreater()
+            ? VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT
+            : VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,
+#else
+        .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,
+#endif
+    };
+
+    p->ext_sem_props.sType = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES;
+
+    vk->GetPhysicalDeviceExternalSemaphoreProperties(hwctx->phys_dev,
+                                                     &ext_sem_props_info,
+                                                     &p->ext_sem_props);
+
      qf = av_malloc_array(qf_num, sizeof(VkQueueFamilyProperties2));
      if (!qf)
          return AVERROR(ENOMEM);
@@ -2419,6 +2438,7 @@ static int create_frame(AVHWFramesContext *hwfc, 
AVVkFrame **frame,
      VulkanDevicePriv *p = ctx->hwctx;
      AVVulkanDeviceContext *hwctx = &p->p;
      FFVulkanFunctions *vk = &p->vkctx.vkfn;
+    AVVkFrame *f;
VkExportSemaphoreCreateInfo ext_sem_info = {
          .sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
@@ -2447,7 +2467,10 @@ static int create_frame(AVHWFramesContext *hwfc, 
AVVkFrame **frame,
          .pNext = &sem_type_info,
      };
- AVVkFrame *f = av_vk_frame_alloc();
+    if (!(p->ext_sem_props.externalSemaphoreFeatures & 
VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT))
+        sem_type_info.pNext = NULL;
+
+    f = av_vk_frame_alloc();
      if (!f) {
          av_log(ctx, AV_LOG_ERROR, "Unable to allocate memory for 
AVVkFrame!\n");
          return AVERROR(ENOMEM);
diff --git a/libavutil/vulkan_functions.h b/libavutil/vulkan_functions.h
index eb6f6b01c3..9c6f2d2641 100644
--- a/libavutil/vulkan_functions.h
+++ b/libavutil/vulkan_functions.h
@@ -82,6 +82,7 @@ typedef uint64_t FFVulkanExtensions;
      MACRO(1, 0, FF_VK_EXT_NO_FLAG,              CreateDevice)                 
           \
      MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetPhysicalDeviceFeatures2)   
           \
      MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetPhysicalDeviceProperties)  
           \
+    MACRO(1, 0, FF_VK_EXT_NO_FLAG,              
GetPhysicalDeviceExternalSemaphoreProperties)          \
      MACRO(1, 0, FF_VK_EXT_VIDEO_QUEUE,          
GetPhysicalDeviceVideoCapabilitiesKHR)     \
      MACRO(1, 0, FF_VK_EXT_VIDEO_QUEUE,          
GetPhysicalDeviceVideoFormatPropertiesKHR) \
      MACRO(1, 0, FF_VK_EXT_NO_FLAG,              DeviceWaitIdle)               
           \

Pushed with a better title.

Attachment: OpenPGP_0xA2FEA5F03F034464.asc
Description: OpenPGP public key

Attachment: OpenPGP_signature.asc
Description: OpenPGP digital signature

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to