[Mesa-dev] [RFC v3 11/23] vulkan/wsi: Add multiple planes to wsi_image_base

Louis-Francis Ratté-Boulianne lfrb at collabora.com
Thu Sep 28 07:54:51 UTC 2017


From: Daniel Stone <daniels at collabora.com>

Not currently used.

Signed-off-by: Daniel Stone <daniels at collabora.com>
---
 src/amd/vulkan/radv_wsi.c           | 13 +++++++------
 src/intel/vulkan/anv_wsi.c          |  9 +++++----
 src/vulkan/wsi/wsi_common.h         |  9 +++++----
 src/vulkan/wsi/wsi_common_wayland.c | 11 +++++++----
 src/vulkan/wsi/wsi_common_x11.c     | 12 ++++++++----
 5 files changed, 32 insertions(+), 22 deletions(-)

diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c
index 9a490e1e76..135808461f 100644
--- a/src/amd/vulkan/radv_wsi.c
+++ b/src/amd/vulkan/radv_wsi.c
@@ -212,22 +212,23 @@ radv_wsi_image_create(VkDevice device_h,
 		RADV_FROM_HANDLE(radv_device_memory, memory, memory_h);
 		if (!radv_get_memory_fd(device, memory, &fd))
 			goto fail_alloc_memory;
-		wsi_image->fd = fd;
+		wsi_image->fds[0] = fd;
 	} else {
-		wsi_image->fd = -1;
+		wsi_image->fds[0] = -1;
 	}
 
 	surface = &image->surface;
 
 	wsi_image->image = image_h;
 	wsi_image->memory = memory_h;
-	wsi_image->size = image->size;
-	wsi_image->offset = image->offset;
+	wsi_image->num_planes = 1;
+	wsi_image->sizes[0] = image->size;
+	wsi_image->offsets[0] = image->offset;
 	if (device->physical_device->rad_info.chip_class >= GFX9)
-		wsi_image->row_pitch =
+		wsi_image->row_pitches[0] =
 			surface->u.gfx9.surf_pitch * surface->bpe;
 	else
-		wsi_image->row_pitch =
+		wsi_image->row_pitches[0] =
 			surface->u.legacy.level[0].nblk_x * surface->bpe;
 
 	return VK_SUCCESS;
diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c
index a1b12e5f72..4454930d45 100644
--- a/src/intel/vulkan/anv_wsi.c
+++ b/src/intel/vulkan/anv_wsi.c
@@ -265,10 +265,11 @@ anv_wsi_image_create(VkDevice device_h,
 
    wsi_image->image = image_h;
    wsi_image->memory = memory_h;
-   wsi_image->fd = fd;
-   wsi_image->size = image->size;
-   wsi_image->offset = image->offset;
-   wsi_image->row_pitch = surface->isl.row_pitch;
+   wsi_image->num_planes = 1;
+   wsi_image->fds[0] = fd;
+   wsi_image->sizes[0] = image->size;
+   wsi_image->offsets[0] = image->offset;
+   wsi_image->row_pitches[0] = surface->isl.row_pitch;
    return VK_SUCCESS;
 fail_alloc_memory:
    anv_FreeMemory(device_h, memory_h, pAllocator);
diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
index 1103703b0e..b6c5a438b1 100644
--- a/src/vulkan/wsi/wsi_common.h
+++ b/src/vulkan/wsi/wsi_common.h
@@ -33,10 +33,11 @@
 struct wsi_image_base {
    VkImage image;
    VkDeviceMemory memory;
-   uint32_t size;
-   uint32_t offset;
-   uint32_t row_pitch;
-   int fd;
+   int num_planes;
+   uint32_t sizes[4];
+   uint32_t offsets[4];
+   uint32_t row_pitches[4];
+   int fds[4];
 };
 
 struct wsi_device;
diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
index 36cc4d0821..a76e29d26e 100644
--- a/src/vulkan/wsi/wsi_common_wayland.c
+++ b/src/vulkan/wsi/wsi_common_wayland.c
@@ -736,15 +736,18 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain,
    if (result != VK_SUCCESS)
       return result;
 
+   /* Without passing modifiers, we can't have multi-plane RGB images. */
+   assert(image->base.num_planes == 1);
+
    image->buffer = wl_drm_create_prime_buffer(chain->drm_wrapper,
-                                              image->base.fd, /* name */
+                                              image->base.fds[0], /* name */
                                               chain->extent.width,
                                               chain->extent.height,
                                               chain->drm_format,
-                                              image->base.offset,
-                                              image->base.row_pitch,
+                                              image->base.offsets[0],
+                                              image->base.row_pitches[0],
                                               0, 0, 0, 0 /* unused */);
-   close(image->base.fd);
+   close(image->base.fds[0]);
 
    if (!image->buffer)
       goto fail_image;
diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
index 997255913c..f9954d6e37 100644
--- a/src/vulkan/wsi/wsi_common_x11.c
+++ b/src/vulkan/wsi/wsi_common_x11.c
@@ -987,18 +987,22 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain,
 
    struct wsi_image_base *image_ws =
       chain->base.needs_linear_copy ? &image->linear_base : &image->base;
+
+   /* Without passing modifiers, we can't have multi-plane RGB images. */
+   assert(image_ws->num_planes == 1);
+
    cookie =
       xcb_dri3_pixmap_from_buffer_checked(chain->conn,
                                           image->pixmap,
                                           chain->window,
-                                          image_ws->size,
+                                          image_ws->sizes[0],
                                           pCreateInfo->imageExtent.width,
                                           pCreateInfo->imageExtent.height,
-                                          image_ws->row_pitch,
+                                          image_ws->row_pitches[0],
                                           chain->depth, bpp,
-                                          image_ws->fd);
+                                          image_ws->fds[0]);
    xcb_discard_reply(chain->conn, cookie.sequence);
-   image_ws->fd = -1; /* XCB has now taken ownership of the FD */
+   image_ws->fds[0] = -1; /* XCB has now taken ownership of the FD */
 
    int fence_fd = xshmfence_alloc_shm();
    if (fence_fd < 0)
-- 
2.13.0



More information about the mesa-dev mailing list