[Mesa-dev] [RFC v2 23/23] RFC: vulkan/wsi: Add support for DRI3 v1.1

2017-08-30 Thread Louis-Francis Ratté-Boulianne
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 | 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

2017-07-14 Thread Emil Velikov
On 14 July 2017 at 05:59, Louis-Francis Ratté-Boulianne
 wrote:
> 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

2017-07-13 Thread Louis-Francis Ratté-Boulianne
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,
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) {
+