[vlc-devel] [PATCH 13/17] vulkan: remove surface from vlc_vk_t

Alexandre Janniaux ajanni at videolabs.io
Mon Apr 12 13:32:29 UTC 2021


---
 modules/video_output/vulkan/display.c      | 9 +++++----
 modules/video_output/vulkan/instance.c     | 2 --
 modules/video_output/vulkan/instance.h     | 3 +--
 modules/video_output/vulkan/platform.h     | 8 +++++++-
 modules/video_output/vulkan/platform_xcb.c | 6 +++---
 5 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/modules/video_output/vulkan/display.c b/modules/video_output/vulkan/display.c
index 4aaaad5f29..81f562e0fb 100644
--- a/modules/video_output/vulkan/display.c
+++ b/modules/video_output/vulkan/display.c
@@ -50,6 +50,8 @@ struct vout_display_sys_t
     const struct pl_swapchain *swapchain;
     struct pl_renderer *renderer;
 
+    VkSurfaceKHR surface;
+
     // Pool of textures for the subpictures
     struct pl_overlay *overlays;
     const struct pl_tex **overlay_tex;
@@ -122,15 +124,14 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
         goto error;
 
     // Create the platform-specific surface object
-    if (sys->vk->ops->create_surface(sys->vk, sys->instance->instance)
-            != VLC_SUCCESS)
+    if (vlc_vk_CreateSurface(sys->vk, sys->instance->instance, &sys->surface) != VLC_SUCCESS)
         goto error;
 
     // Create vulkan device
     char *device_name = var_InheritString(sys->vk, "vk-device");
     sys->vulkan = pl_vulkan_create(sys->ctx, &(struct pl_vulkan_params) {
         .instance = sys->instance->instance,
-        .surface = sys->vk->surface,
+        .surface = sys->surface,
         .device_name = device_name,
         .allow_software = var_InheritBool(vd, "allow-sw"),
         .async_transfer = var_InheritBool(vd, "async-xfer"),
@@ -143,7 +144,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
 
     // Create swapchain for this surface
     struct pl_vulkan_swapchain_params swap_params = {
-        .surface = sys->vk->surface,
+        .surface = sys->surface,
         .present_mode = var_InheritInteger(vd, "present-mode"),
         .swapchain_depth = var_InheritInteger(vd, "queue-depth"),
     };
diff --git a/modules/video_output/vulkan/instance.c b/modules/video_output/vulkan/instance.c
index 9ad331893e..eb9afb730c 100644
--- a/modules/video_output/vulkan/instance.c
+++ b/modules/video_output/vulkan/instance.c
@@ -58,10 +58,8 @@ vlc_vk_t *vlc_vk_Create(struct vout_window_t *wnd, const char *name)
     if (unlikely(vk == NULL))
         return NULL;
 
-    vk->surface = (VkSurfaceKHR) NULL;
     vk->platform_ext = NULL;
     vk->ops = NULL;
-
     vk->window = wnd;
 
     vk->module = vlc_module_load(wnd, "vulkan platform", name, false,
diff --git a/modules/video_output/vulkan/instance.h b/modules/video_output/vulkan/instance.h
index 976205b6b0..29650398c7 100644
--- a/modules/video_output/vulkan/instance.h
+++ b/modules/video_output/vulkan/instance.h
@@ -35,7 +35,7 @@ struct vlc_vk_t;
 struct vlc_vk_operations
 {
     void (*close)(struct vlc_vk_t *);
-    int (*create_surface)(struct vlc_vk_t *, VkInstance);
+    int (*create_surface)(struct vlc_vk_t *, VkInstance, VkSurfaceKHR *);
 };
 
 
@@ -49,7 +49,6 @@ typedef struct vlc_vk_t
     void *platform_sys;
     const char *platform_ext;
 
-    VkSurfaceKHR surface;
     struct vout_window_t *window;
 
     const struct vlc_vk_operations *ops;
diff --git a/modules/video_output/vulkan/platform.h b/modules/video_output/vulkan/platform.h
index ddd314a789..8c0045959f 100644
--- a/modules/video_output/vulkan/platform.h
+++ b/modules/video_output/vulkan/platform.h
@@ -31,6 +31,12 @@ void vlc_vk_ClosePlatform(vlc_vk_t *);
 extern const char * const vlc_vk_PlatformExt;
 
 // Create a vulkan surface to vk->surface
-int vlc_vk_CreateSurface(vlc_vk_t *, VkInstance);
+void vlc_vk_ClosePlatform(vlc_vk_t *vk);
+
+// Create a vulkan surface to vk->surface
+inline int vlc_vk_CreateSurface(vlc_vk_t * vk, VkInstance instance, VkSurfaceKHR *surface_out)
+{
+    return vk->ops->create_surface(vk, instance, surface_out);
+}
 
 #endif // VLC_VULKAN_PLATFORM_H
diff --git a/modules/video_output/vulkan/platform_xcb.c b/modules/video_output/vulkan/platform_xcb.c
index 72efbe9ef7..003267bf7e 100644
--- a/modules/video_output/vulkan/platform_xcb.c
+++ b/modules/video_output/vulkan/platform_xcb.c
@@ -30,7 +30,7 @@
 #include "platform.h"
 
 static void ClosePlatform(vlc_vk_t *vk);
-static int CreateSurface(vlc_vk_t *vk, VkInstance instance);
+static int CreateSurface(vlc_vk_t *vk, VkInstance instance, VkSurfaceKHR *surface_out);
 
 static const struct vlc_vk_operations platform_ops =
 {
@@ -66,7 +66,7 @@ static void ClosePlatform(vlc_vk_t *vk)
     xcb_disconnect(conn);
 }
 
-static int CreateSurface(vlc_vk_t *vk, VkInstance vkinst)
+static int CreateSurface(vlc_vk_t *vk, VkInstance vkinst, VkSurfaceKHR *surface_out)
 {
     xcb_connection_t *conn = vk->platform_sys;
 
@@ -76,7 +76,7 @@ static int CreateSurface(vlc_vk_t *vk, VkInstance vkinst)
          .connection = conn,
     };
 
-    VkResult res = vkCreateXcbSurfaceKHR(vkinst, &xinfo, NULL, &vk->surface);
+    VkResult res = vkCreateXcbSurfaceKHR(vkinst, &xinfo, NULL, surface_out);
     if (res != VK_SUCCESS) {
         msg_Err(vk, "Failed creating XCB surface");
         return VLC_EGENERIC;
-- 
2.31.1



More information about the vlc-devel mailing list