[Mesa-dev] [RFC v2 23/23] RFC: vulkan/wsi: Add support for DRI3 v1.1
From: Daniel StoneAdds support for multiple planes and buffer modifiers. --- src/intel/vulkan/anv_wsi.c | 7 ++- src/vulkan/wsi/wsi_common_x11.c | 118 2 files changed, 112 insertions(+), 13 deletions(-) diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c index 88e2d7abc5..b3d04aade1 100644 --- a/src/intel/vulkan/anv_wsi.c +++ b/src/intel/vulkan/anv_wsi.c @@ -201,8 +201,11 @@ anv_wsi_image_create(VkDevice device_h, for (i = 0; i < num_modifiers; i++) { enum isl_tiling t; enum isl_aux_usage a; - if (isl_tiling_from_drm_format_mod(modifiers[i], , )) + if (modifiers[i] != DRM_FORMAT_MOD_LINEAR && + isl_tiling_from_drm_format_mod(modifiers[i], , )) { vk_tiling = VK_IMAGE_TILING_OPTIMAL; +break; + } } VkResult result; @@ -231,7 +234,7 @@ anv_wsi_image_create(VkDevice device_h, .pNext = &(VkExportImageDmaBufInfoMESAX) { .sType = VK_STRUCTURE_TYPE_EXPORT_IMAGE_DMA_BUF_INFO_MESAX, - .drmFormatModifierCount = ARRAY_SIZE(modifiers), + .drmFormatModifierCount = num_modifiers, .pDrmFormatModifiers = modifiers, }}}, NULL, diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index f12583db13..de5a8091d7 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "util/hash_table.h" #include "vk_util.h" @@ -43,6 +44,10 @@ #include "wsi_common_x11.h" #include "wsi_common_queue.h" +#ifndef DRM_FORMAT_MOD_INVALID +#define DRM_FORMAT_MOD_INVALID (1ULL<<56)-1 +#endif + #define typed_memcpy(dest, src, count) ({ \ STATIC_ASSERT(sizeof(*src) == sizeof(*dest)); \ memcpy((dest), (src), (count) * sizeof(*(src))); \ @@ -50,6 +55,7 @@ struct wsi_x11_connection { bool has_dri3; + bool has_dri3_v1_1; bool has_present; bool is_proprietary_x11; }; @@ -164,6 +170,16 @@ wsi_x11_connection_create(const VkAllocationCallbacks *alloc, } wsi_conn->has_dri3 = dri3_reply->present != 0; + if (wsi_conn->has_dri3) { + xcb_dri3_query_version_cookie_t ver_cookie; + xcb_dri3_query_version_reply_t *ver_reply; + + ver_cookie = xcb_dri3_query_version(conn, 1, 1); + ver_reply = xcb_dri3_query_version_reply(conn, ver_cookie, NULL); + wsi_conn->has_dri3_v1_1 = ver_reply->major_version > 1 || +ver_reply->minor_version >= 1; + } + wsi_conn->has_present = pres_reply->present != 0; wsi_conn->is_proprietary_x11 = false; if (amd_reply && amd_reply->present) @@ -628,6 +644,8 @@ struct x11_image { struct x11_swapchain { struct wsi_swapchainbase; + bool has_dri3_v1_1; + xcb_connection_t * conn; xcb_window_t window; xcb_gc_t gc; @@ -966,7 +984,7 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, uint32_t bpp = 32; int fd; uint32_t size; - uint64_t modifier; + uint64_t modifier = DRM_FORMAT_MOD_INVALID; result = chain->base.image_fns->create_wsi_image(device_h, pCreateInfo, @@ -1009,15 +1027,36 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, image->pixmap = xcb_generate_id(chain->conn); - cookie = - xcb_dri3_pixmap_from_buffer_checked(chain->conn, - image->pixmap, - chain->window, - size, - pCreateInfo->imageExtent.width, - pCreateInfo->imageExtent.height, - row_pitch, - chain->depth, bpp, fd); +#if XCB_DRI3_MAJOR_VERSION > 1 || XCB_DRI3_MINOR_VERSION >= 1 + if (chain->has_dri3_v1_1 && modifier != DRM_FORMAT_MOD_INVALID) { + cookie = + xcb_dri3_pixmap_from_buffers_checked(chain->conn, + image->pixmap, + chain->window, + 1, /* XXX: multi-plane */ + pCreateInfo->imageExtent.width, + pCreateInfo->imageExtent.height, + row_pitch, offset, + 0, 0, + 0, 0, + 0, 0, + chain->depth, bpp, + modifier >> 32, +
Re: [Mesa-dev] [RFC v2 23/23] RFC: vulkan/wsi: Add support for DRI3 v1.1
On 14 July 2017 at 05:59, Louis-Francis Ratté-Bouliannewrote: > From: Daniel Stone > > Adds support for multiple planes and buffer modifiers. > --- > src/intel/vulkan/anv_wsi.c | 7 +- > src/vulkan/wsi/wsi_common_x11.c | 137 > > 2 files changed, 131 insertions(+), 13 deletions(-) > > diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c > index 53ad7d153e..ca5611666e 100644 > --- a/src/intel/vulkan/anv_wsi.c > +++ b/src/intel/vulkan/anv_wsi.c > @@ -201,8 +201,11 @@ anv_wsi_image_create(VkDevice device_h, > for (i = 0; i < num_modifiers; i++) { >enum isl_tiling t; >enum isl_aux_usage a; > - if (isl_tiling_from_drm_format_mod(modifiers[i], , )) > + if (modifiers[i] != DRM_FORMAT_MOD_LINEAR && > + isl_tiling_from_drm_format_mod(modifiers[i], , )) { > vk_tiling = VK_IMAGE_TILING_OPTIMAL; > +break; > + } > } > > VkResult result; > @@ -231,7 +234,7 @@ anv_wsi_image_create(VkDevice device_h, > .pNext = >&(VkExportImageDmaBufInfoMESAX) { > .sType = VK_STRUCTURE_TYPE_EXPORT_IMAGE_DMA_BUF_INFO_MESAX, > - .drmFormatModifierCount = ARRAY_SIZE(modifiers), > + .drmFormatModifierCount = num_modifiers, > .pDrmFormatModifiers = modifiers, >}}}, >NULL, I think these hunks belong to earlier patch(es). -Emil ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [RFC v2 23/23] RFC: vulkan/wsi: Add support for DRI3 v1.1
From: Daniel StoneAdds support for multiple planes and buffer modifiers. --- src/intel/vulkan/anv_wsi.c | 7 +- src/vulkan/wsi/wsi_common_x11.c | 137 2 files changed, 131 insertions(+), 13 deletions(-) diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c index 53ad7d153e..ca5611666e 100644 --- a/src/intel/vulkan/anv_wsi.c +++ b/src/intel/vulkan/anv_wsi.c @@ -201,8 +201,11 @@ anv_wsi_image_create(VkDevice device_h, for (i = 0; i < num_modifiers; i++) { enum isl_tiling t; enum isl_aux_usage a; - if (isl_tiling_from_drm_format_mod(modifiers[i], , )) + if (modifiers[i] != DRM_FORMAT_MOD_LINEAR && + isl_tiling_from_drm_format_mod(modifiers[i], , )) { vk_tiling = VK_IMAGE_TILING_OPTIMAL; +break; + } } VkResult result; @@ -231,7 +234,7 @@ anv_wsi_image_create(VkDevice device_h, .pNext = &(VkExportImageDmaBufInfoMESAX) { .sType = VK_STRUCTURE_TYPE_EXPORT_IMAGE_DMA_BUF_INFO_MESAX, - .drmFormatModifierCount = ARRAY_SIZE(modifiers), + .drmFormatModifierCount = num_modifiers, .pDrmFormatModifiers = modifiers, }}}, NULL, diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index f12583db13..a8201a1601 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "util/hash_table.h" #include "vk_util.h" @@ -43,6 +44,10 @@ #include "wsi_common_x11.h" #include "wsi_common_queue.h" +#ifndef DRM_FORMAT_MOD_INVALID +#define DRM_FORMAT_MOD_INVALID (1ULL<<56)-1 +#endif + #define typed_memcpy(dest, src, count) ({ \ STATIC_ASSERT(sizeof(*src) == sizeof(*dest)); \ memcpy((dest), (src), (count) * sizeof(*(src))); \ @@ -50,6 +55,7 @@ struct wsi_x11_connection { bool has_dri3; + bool has_dri3_v1_1; bool has_present; bool is_proprietary_x11; }; @@ -164,6 +170,16 @@ wsi_x11_connection_create(const VkAllocationCallbacks *alloc, } wsi_conn->has_dri3 = dri3_reply->present != 0; + if (wsi_conn->has_dri3) { + xcb_dri3_query_version_cookie_t ver_cookie; + xcb_dri3_query_version_reply_t *ver_reply; + + ver_cookie = xcb_dri3_query_version(conn, 1, 1); + ver_reply = xcb_dri3_query_version_reply(conn, ver_cookie, NULL); + wsi_conn->has_dri3_v1_1 = ver_reply->major_version > 1 || +ver_reply->minor_version >= 1; + } + wsi_conn->has_present = pres_reply->present != 0; wsi_conn->is_proprietary_x11 = false; if (amd_reply && amd_reply->present) @@ -247,6 +263,22 @@ static const VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_FIFO_KHR, }; +static uint32_t +vk_format_to_fourcc(VkFormat vk_format, VkCompositeAlphaFlagsKHR vk_alpha) +{ + bool is_alpha = (vk_alpha == VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR); + + /* XXX: Real lookup table. */ + switch (vk_format) { + case VK_FORMAT_B8G8R8A8_UNORM: + case VK_FORMAT_B8G8R8A8_SRGB: + return is_alpha ? DRM_FORMAT_ARGB : DRM_FORMAT_XRGB; + break; + default: + unreachable("unknown format in vk_format_to_fourcc"); + } +} + static xcb_screen_t * get_screen_for_root(xcb_connection_t *conn, xcb_window_t root) { @@ -628,6 +660,8 @@ struct x11_image { struct x11_swapchain { struct wsi_swapchainbase; + bool has_dri3_v1_1; + xcb_connection_t * conn; xcb_window_t window; xcb_gc_t gc; @@ -966,7 +1000,9 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, uint32_t bpp = 32; int fd; uint32_t size; - uint64_t modifier; + uint32_t fourcc = vk_format_to_fourcc(pCreateInfo->imageFormat, + pCreateInfo->compositeAlpha); + uint64_t modifier = DRM_FORMAT_MOD_INVALID; result = chain->base.image_fns->create_wsi_image(device_h, pCreateInfo, @@ -1009,15 +1045,36 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, image->pixmap = xcb_generate_id(chain->conn); - cookie = - xcb_dri3_pixmap_from_buffer_checked(chain->conn, - image->pixmap, - chain->window, - size, - pCreateInfo->imageExtent.width, - pCreateInfo->imageExtent.height, - row_pitch, - chain->depth, bpp, fd); +#if XCB_DRI3_MAJOR_VERSION > 1 || XCB_DRI3_MINOR_VERSION >= 1 + if (chain->has_dri3_v1_1 && modifier != DRM_FORMAT_MOD_INVALID) { +