From a6e9893f99c1f9df45568876f2bc5ba79f2b083c Mon Sep 17 00:00:00 2001
From: Jakob Bornecrantz <wallbraker@gmail.com>
Date: Sun, 7 Jan 2024 14:50:11 +0000
Subject: [PATCH] c/main: Refactor arguments to comp_target::create_images

---
 src/xrt/compositor/main/comp_renderer.c       | 21 +++++---
 src/xrt/compositor/main/comp_target.h         | 49 ++++++++++---------
 .../compositor/main/comp_target_swapchain.c   | 41 ++++++----------
 src/xrt/compositor/main/comp_window_peek.c    | 34 ++++++-------
 4 files changed, 72 insertions(+), 73 deletions(-)

diff --git a/src/xrt/compositor/main/comp_renderer.c b/src/xrt/compositor/main/comp_renderer.c
index 8507c3421..d3d7f1359 100644
--- a/src/xrt/compositor/main/comp_renderer.c
+++ b/src/xrt/compositor/main/comp_renderer.c
@@ -529,14 +529,19 @@ renderer_ensure_images_and_renderings(struct comp_renderer *r, bool force_recrea
 		image_usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
 	}
 
-	comp_target_create_images(           //
-	    r->c->target,                    //
-	    r->c->settings.preferred.width,  //
-	    r->c->settings.preferred.height, //
-	    r->settings->color_format,       //
-	    r->settings->color_space,        //
-	    image_usage,                     //
-	    r->settings->present_mode);      //
+	struct comp_target_create_images_info info = {
+	    .extent =
+	        {
+	            .width = r->c->settings.preferred.width,
+	            .height = r->c->settings.preferred.height,
+	        },
+	    .format = r->settings->color_format,
+	    .image_usage = image_usage,
+	    .color_space = r->settings->color_space,
+	    .present_mode = r->settings->present_mode,
+	};
+
+	comp_target_create_images(r->c->target, &info);
 
 	bool pre_rotate = false;
 	if (r->c->target->surface_transform & VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR ||
diff --git a/src/xrt/compositor/main/comp_target.h b/src/xrt/compositor/main/comp_target.h
index 54197abfd..88916e325 100644
--- a/src/xrt/compositor/main/comp_target.h
+++ b/src/xrt/compositor/main/comp_target.h
@@ -64,6 +64,30 @@ struct comp_target_image
 	VkImageView view;
 };
 
+/*!
+ * Information given in when creating the swapchain images,
+ * argument to @ref comp_target_create_images.
+ *
+ * @ingroup comp_main
+ */
+struct comp_target_create_images_info
+{
+	//! Image usage for the images, must be followed.
+	VkImageUsageFlags image_usage;
+
+	//! Preferred format for the images, can be ignored by the target.
+	VkFormat format;
+
+	//! Preferred extent, can be ignored by the target.
+	VkExtent2D extent;
+
+	//! Preferred color space, can be ignored by the target.
+	VkColorSpaceKHR color_space;
+
+	// Preferred present_mode, can be ignored by the target.
+	VkPresentModeKHR present_mode;
+};
+
 /*!
  * Collection of semaphores needed for a target.
  *
@@ -157,13 +181,7 @@ struct comp_target
 	 *
 	 * @pre @ref check_ready returns true
 	 */
-	void (*create_images)(struct comp_target *ct,
-	                      uint32_t preferred_width,
-	                      uint32_t preferred_height,
-	                      VkFormat preferred_color_format,
-	                      VkColorSpaceKHR preferred_color_space,
-	                      VkImageUsageFlags image_usage,
-	                      VkPresentModeKHR present_mode);
+	void (*create_images)(struct comp_target *ct, const struct comp_target_create_images_info *create_info);
 
 	/*!
 	 * Has this target successfully had images created?
@@ -326,24 +344,11 @@ comp_target_check_ready(struct comp_target *ct)
  * @ingroup comp_main
  */
 static inline void
-comp_target_create_images(struct comp_target *ct,
-                          uint32_t preferred_width,
-                          uint32_t preferred_height,
-                          VkFormat preferred_color_format,
-                          VkColorSpaceKHR preferred_color_space,
-                          VkImageUsageFlags image_usage,
-                          VkPresentModeKHR present_mode)
+comp_target_create_images(struct comp_target *ct, const struct comp_target_create_images_info *create_info)
 {
 	COMP_TRACE_MARKER();
 
-	ct->create_images(          //
-	    ct,                     //
-	    preferred_width,        //
-	    preferred_height,       //
-	    preferred_color_format, //
-	    preferred_color_space,  //
-	    image_usage,            //
-	    present_mode);          //
+	ct->create_images(ct, create_info);
 }
 
 /*!
diff --git a/src/xrt/compositor/main/comp_target_swapchain.c b/src/xrt/compositor/main/comp_target_swapchain.c
index 55951cea4..1f2b16c3e 100644
--- a/src/xrt/compositor/main/comp_target_swapchain.c
+++ b/src/xrt/compositor/main/comp_target_swapchain.c
@@ -145,10 +145,7 @@ err:
 }
 
 static VkExtent2D
-select_extent(struct comp_target_swapchain *cts,
-              VkSurfaceCapabilitiesKHR caps,
-              uint32_t preferred_width,
-              uint32_t preferred_height)
+select_extent(struct comp_target_swapchain *cts, VkSurfaceCapabilitiesKHR caps, VkExtent2D preferred)
 {
 	/*
 	 * A sub-class wants us to use these extents over the ones the
@@ -156,29 +153,29 @@ select_extent(struct comp_target_swapchain *cts,
 	 * upporting this size so we better respect those wishes.
 	 */
 	if (cts->override.compositor_extent) {
-		preferred_width = cts->override.extent.width;
-		preferred_height = cts->override.extent.height;
+		preferred.width = cts->override.extent.width;
+		preferred.height = cts->override.extent.height;
 	}
 
 	// If width (and height) equals the special value 0xFFFFFFFF,
 	// the size of the surface will be set by the swapchain
 	if (caps.currentExtent.width == (uint32_t)-1) {
-		assert(preferred_width > 0 && preferred_height > 0);
+		assert(preferred.width > 0 && preferred.height > 0);
 
 		VkExtent2D extent = {
-		    .width = preferred_width,
-		    .height = preferred_height,
+		    .width = preferred.width,
+		    .height = preferred.height,
 		};
 		return extent;
 	}
 
-	if (caps.currentExtent.width != preferred_width || //
-	    caps.currentExtent.height != preferred_height) {
+	if (caps.currentExtent.width != preferred.width || //
+	    caps.currentExtent.height != preferred.height) {
 		COMP_DEBUG(cts->base.c, "Using swap chain extent dimensions %dx%d instead of requested %dx%d.",
 		           caps.currentExtent.width,  //
 		           caps.currentExtent.height, //
-		           preferred_width,           //
-		           preferred_height);         //
+		           preferred.width,           //
+		           preferred.height);         //
 	}
 
 	return caps.currentExtent;
@@ -641,13 +638,7 @@ target_init_semaphores(struct comp_target_swapchain *cts)
  */
 
 static void
-comp_target_swapchain_create_images(struct comp_target *ct,
-                                    uint32_t preferred_width,
-                                    uint32_t preferred_height,
-                                    VkFormat color_format,
-                                    VkColorSpaceKHR color_space,
-                                    VkImageUsageFlags image_usage,
-                                    VkPresentModeKHR present_mode)
+comp_target_swapchain_create_images(struct comp_target *ct, const struct comp_target_create_images_info *create_info)
 {
 	struct comp_target_swapchain *cts = (struct comp_target_swapchain *)ct;
 	struct vk_bundle *vk = get_vk(cts);
@@ -673,9 +664,9 @@ comp_target_swapchain_create_images(struct comp_target *ct,
 
 	cts->base.image_count = 0;
 	cts->swapchain.handle = VK_NULL_HANDLE;
-	cts->present_mode = present_mode;
-	cts->preferred.color_format = color_format;
-	cts->preferred.color_space = color_space;
+	cts->present_mode = create_info->present_mode;
+	cts->preferred.color_format = create_info->format;
+	cts->preferred.color_space = create_info->color_space;
 
 
 	/*
@@ -737,7 +728,7 @@ comp_target_swapchain_create_images(struct comp_target *ct,
 	 */
 
 	// Get the extents of the swapchain.
-	VkExtent2D extent = select_extent(cts, surface_caps, preferred_width, preferred_height);
+	VkExtent2D extent = select_extent(cts, surface_caps, create_info->extent);
 
 	if (surface_caps.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR ||
 	    surface_caps.currentTransform & VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR) {
@@ -785,7 +776,7 @@ comp_target_swapchain_create_images(struct comp_target *ct,
 	            .height = extent.height,
 	        },
 	    .imageArrayLayers = 1,
-	    .imageUsage = image_usage,
+	    .imageUsage = create_info->image_usage,
 	    .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE,
 	    .queueFamilyIndexCount = 0,
 	    .preTransform = surface_caps.currentTransform,
diff --git a/src/xrt/compositor/main/comp_window_peek.c b/src/xrt/compositor/main/comp_window_peek.c
index e5db2ca26..69716991b 100644
--- a/src/xrt/compositor/main/comp_window_peek.c
+++ b/src/xrt/compositor/main/comp_window_peek.c
@@ -50,6 +50,20 @@ get_vk(struct comp_window_peek *w)
 	return &w->c->base.vk;
 }
 
+static inline void
+create_images(struct comp_window_peek *w)
+{
+	struct comp_target_create_images_info info = {
+	    .extent = {w->width, w->height},
+	    .format = w->c->settings.color_format,
+	    .color_space = w->c->settings.color_space,
+	    .image_usage = PEEK_IMAGE_USAGE,
+	    .present_mode = VK_PRESENT_MODE_MAILBOX_KHR,
+	};
+
+	comp_target_create_images(&w->base.base, &info);
+}
+
 static void *
 window_peek_run_thread(void *ptr)
 {
@@ -204,16 +218,7 @@ comp_window_peek_create(struct comp_compositor *c)
 	 * Images
 	 */
 
-	/* TODO: present mode fallback to FIFO if MAILBOX is not available */
-	comp_target_create_images(        //
-	    &w->base.base,                //
-	    w->width,                     //
-	    w->height,                    //
-	    w->c->settings.color_format,  //
-	    w->c->settings.color_space,   //
-	    PEEK_IMAGE_USAGE,             //
-	    VK_PRESENT_MODE_MAILBOX_KHR); //
-
+	create_images(w);
 
 	/*
 	 * Thread
@@ -280,14 +285,7 @@ comp_window_peek_blit(struct comp_window_peek *w, VkImage src, int32_t width, in
 
 	if (w->width != w->base.base.width || w->height != w->base.base.height) {
 		COMP_DEBUG(w->c, "Resizing swapchain");
-		comp_target_create_images(        //
-		    &w->base.base,                //
-		    w->width,                     //
-		    w->height,                    //
-		    w->c->settings.color_format,  //
-		    w->c->settings.color_space,   //
-		    PEEK_IMAGE_USAGE,             //
-		    VK_PRESENT_MODE_MAILBOX_KHR); //
+		create_images(w);
 	}
 
 	while (!comp_target_check_ready(&w->base.base))