[Mesa-dev] [PATCH] [rfc] dri3: allow building against older xcb

Dave Airlie airlied at gmail.com
Sun Mar 11 23:26:36 UTC 2018


From: Dave Airlie <airlied at redhat.com>

I'm not sure everyone wants to be updating their dri3 in a forced
march setting, this allows a nicer approach, esp when you want
to build on distro that aren't brand new.

I'm sure there are plenty of ways this patch could be cleaner,
and I've also not built it against an updated dri3.
---
 configure.ac                             |  4 ++--
 src/egl/drivers/dri2/platform_x11_dri3.c |  4 ++++
 src/loader/loader_dri3_helper.c          | 22 ++++++++++++++++------
 src/loader/loader_dri3_helper.h          |  3 ++-
 4 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/configure.ac b/configure.ac
index 1553ce9..6a1f139 100644
--- a/configure.ac
+++ b/configure.ac
@@ -92,9 +92,9 @@ WAYLAND_REQUIRED=1.11
 WAYLAND_PROTOCOLS_REQUIRED=1.8
 XCB_REQUIRED=1.9.3
 XCBDRI2_REQUIRED=1.8
-XCBDRI3_REQUIRED=1.13
+XCBDRI3_REQUIRED=1.12
 XCBGLX_REQUIRED=1.8.1
-XCBPRESENT_REQUIRED=1.13
+XCBPRESENT_REQUIRED=1.12
 XDAMAGE_REQUIRED=1.1
 XSHMFENCE_REQUIRED=1.1
 XVMC_REQUIRED=1.0.6
diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c b/src/egl/drivers/dri2/platform_x11_dri3.c
index dce3356..efe030a 100644
--- a/src/egl/drivers/dri2/platform_x11_dri3.c
+++ b/src/egl/drivers/dri2/platform_x11_dri3.c
@@ -327,6 +327,7 @@ dri3_create_image_khr_pixmap_from_buffers(_EGLDisplay *disp, _EGLContext *ctx,
                                           EGLClientBuffer buffer,
                                           const EGLint *attr_list)
 {
+#if XCB_DRI3_MAJOR_VERSION == 1 && XCB_DRI3_MINOR_VERSION > 0
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
    struct dri2_egl_image *dri2_img;
    xcb_dri3_buffers_from_pixmap_cookie_t bp_cookie;
@@ -376,6 +377,9 @@ dri3_create_image_khr_pixmap_from_buffers(_EGLDisplay *disp, _EGLContext *ctx,
    }
 
    return &dri2_img->base;
+#else
+   return NULL;
+#endif
 }
 
 static _EGLImage *
diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
index 585f7ce..624ef1b 100644
--- a/src/loader/loader_dri3_helper.c
+++ b/src/loader/loader_dri3_helper.c
@@ -389,6 +389,7 @@ dri3_handle_present_event(struct loader_dri3_drawable *draw,
 	 /* If the server tells us that our allocation is suboptimal, we
           * reallocate once.
           */
+#ifdef XCB_PRESENT_COMPLETE_MODE_SUBOPTIMAL_COPY
          if (ce->mode == XCB_PRESENT_COMPLETE_MODE_SUBOPTIMAL_COPY &&
              draw->last_present_mode != ce->mode) {
             for (int b = 0; b < ARRAY_SIZE(draw->buffers); b++) {
@@ -396,7 +397,7 @@ dri3_handle_present_event(struct loader_dri3_drawable *draw,
                   draw->buffers[b]->reallocate = true;
             }
          }
-
+#endif
          draw->last_present_mode = ce->mode;
 
          if (draw->vtable->show_fps)
@@ -903,10 +904,10 @@ loader_dri3_swap_buffers_msc(struct loader_dri3_drawable *draw,
        */
       if (!loader_dri3_have_image_blit(draw) && draw->cur_blit_source != -1)
          options |= XCB_PRESENT_OPTION_COPY;
-
+#ifdef XCB_PRESENT_OPTION_SUBOPTIMAL
       if (draw->multiplanes_available)
          options |= XCB_PRESENT_OPTION_SUBOPTIMAL;
-
+#endif
       back->busy = 1;
       back->last_swap = draw->send_sbc;
       xcb_present_pixmap(draw->conn,
@@ -1053,6 +1054,7 @@ image_format_to_fourcc(int format)
    return 0;
 }
 
+#if XCB_DRI3_MAJOR_VERSION == 1 && XCB_DRI3_MINOR_VERSION > 0
 static bool
 has_supported_modifier(struct loader_dri3_drawable *draw, unsigned int format,
                        uint64_t *modifiers, uint32_t count)
@@ -1087,6 +1089,7 @@ has_supported_modifier(struct loader_dri3_drawable *draw, unsigned int format,
    free(supported_modifiers);
    return found;
 }
+#endif
 
 /** loader_dri3_alloc_render_buffer
  *
@@ -1132,6 +1135,7 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format,
       goto no_image;
 
    if (!draw->is_different_gpu) {
+#if XCB_DRI3_MAJOR_VERSION == 1 && XCB_DRI3_MINOR_VERSION > 0
       if (draw->multiplanes_available &&
           draw->ext->image->base.version >= 15 &&
           draw->ext->image->queryDmaBufModifiers &&
@@ -1195,7 +1199,7 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format,
                                                                     buffer);
          free(modifiers);
       }
-
+#endif
       if (!buffer->image)
          buffer->image = draw->ext->image->createImage(draw->dri_screen,
                                                        width, height,
@@ -1272,6 +1276,7 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format,
    pixmap = xcb_generate_id(draw->conn);
    if (draw->multiplanes_available &&
        buffer->modifier != DRM_FORMAT_MOD_INVALID) {
+ #if XCB_DRI3_MAJOR_VERSION == 1 && XCB_DRI3_MINOR_VERSION > 0
       xcb_dri3_pixmap_from_buffers(draw->conn,
                                    pixmap,
                                    draw->drawable,
@@ -1284,6 +1289,7 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format,
                                    depth, buffer->cpp * 8,
                                    buffer->modifier,
                                    buffer_fds);
+#endif
    } else {
       xcb_dri3_pixmap_from_buffer(draw->conn,
                                   pixmap,
@@ -1473,6 +1479,7 @@ loader_dri3_create_image(xcb_connection_t *c,
    return ret;
 }
 
+#if XCB_DRI3_MAJOR_VERSION == 1 && XCB_DRI3_MINOR_VERSION > 0
 __DRIimage *
 loader_dri3_create_image_from_buffers(xcb_connection_t *c,
                                       xcb_dri3_buffers_from_pixmap_reply_t *bp_reply,
@@ -1514,6 +1521,7 @@ loader_dri3_create_image_from_buffers(xcb_connection_t *c,
 
    return ret;
 }
+#endif
 
 /** dri3_get_pixmap_buffer
  *
@@ -1567,7 +1575,7 @@ dri3_get_pixmap_buffer(__DRIdrawable *driDrawable, unsigned int format,
                           (sync_fence = xcb_generate_id(draw->conn)),
                           false,
                           fence_fd);
-
+#if XCB_DRI3_MAJOR_VERSION == 1 && XCB_DRI3_MINOR_VERSION > 0
    if (draw->multiplanes_available &&
        draw->ext->image->base.version >= 15 &&
        draw->ext->image->createImageFromDmaBufs2) {
@@ -1586,7 +1594,9 @@ dri3_get_pixmap_buffer(__DRIdrawable *driDrawable, unsigned int format,
       width = bps_reply->width;
       height = bps_reply->height;
       free(bps_reply);
-   } else {
+   } else
+#endif
+   {
       xcb_dri3_buffer_from_pixmap_cookie_t bp_cookie;
       xcb_dri3_buffer_from_pixmap_reply_t *bp_reply;
 
diff --git a/src/loader/loader_dri3_helper.h b/src/loader/loader_dri3_helper.h
index de22c19..46f3d09 100644
--- a/src/loader/loader_dri3_helper.h
+++ b/src/loader/loader_dri3_helper.h
@@ -243,6 +243,7 @@ loader_dri3_create_image(xcb_connection_t *c,
                          const __DRIimageExtension *image,
                          void *loaderPrivate);
 
+#if XCB_DRI3_MAJOR_VERSION == 1 && XCB_DRI3_MINOR_VERSION > 0
 __DRIimage *
 loader_dri3_create_image_from_buffers(xcb_connection_t *c,
                                       xcb_dri3_buffers_from_pixmap_reply_t *bp_reply,
@@ -250,7 +251,7 @@ loader_dri3_create_image_from_buffers(xcb_connection_t *c,
                                       __DRIscreen *dri_screen,
                                       const __DRIimageExtension *image,
                                       void *loaderPrivate);
-
+#endif
 int
 loader_dri3_get_buffers(__DRIdrawable *driDrawable,
                         unsigned int format,
-- 
2.9.5



More information about the mesa-dev mailing list