[Mesa-dev] [PATCH 2/2] gbm: Add flags to enable creation of rotated scanout buffers (v4)

Vivek Kasireddy vivek.kasireddy at intel.com
Fri Nov 6 19:05:50 PST 2015


For certain platforms that support rotated scanout buffers, currently,
there is no way to create them with the GBM DRI interface. These flags
will instruct the DRI driver to create the buffer by setting
additional requirements such as tiling mode.

v2: Reserve a bit per angle. (Ville and Michel)

v3:
- Combine all GBM_BO_USE_SCANOUT_ROTATION_* flags into
  GBM_BO_USE_SCANOUT_ANY macro (Michel)
- Pull the code that updates dri_use based on the rotation flag
  into a separate function.

v4:
- Added a brief comment to explain the rotation orientation.
- Augmented the helper function gbm_to_dri_flag() introduced in v3
  to handle GBM_BO_USE_CURSOR and GBM_BO_USE_LINEAR as well. (Michel)

Cc: Michel Danzer <michel at daenzer.net>
Cc: Ville Syrjala <ville.syrjala at linux.intel.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy at intel.com>
---
 src/gbm/backends/dri/gbm_dri.c | 35 +++++++++++++++++++++++------------
 src/gbm/main/gbm.h             | 15 +++++++++++++++
 2 files changed, 38 insertions(+), 12 deletions(-)

diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
index 57cdeac..6616d37 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -124,6 +124,24 @@ image_get_buffers(__DRIdrawable *driDrawable,
 }
 
 static void
+gbm_to_dri_flag(uint32_t usage,
+                unsigned *dri_use)
+{
+   if (usage & GBM_BO_USE_SCANOUT)
+      *dri_use |= __DRI_IMAGE_USE_SCANOUT;
+   if (usage & GBM_BO_USE_SCANOUT_ROTATION_90)
+      *dri_use |= __DRI_IMAGE_USE_SCANOUT_ROTATION_90;
+   if (usage & GBM_BO_USE_SCANOUT_ROTATION_180)
+      *dri_use |= __DRI_IMAGE_USE_SCANOUT_ROTATION_180;
+   if (usage & GBM_BO_USE_SCANOUT_ROTATION_270)
+      *dri_use |= __DRI_IMAGE_USE_SCANOUT_ROTATION_270;
+   if (usage & GBM_BO_USE_CURSOR)
+      *dri_use |= __DRI_IMAGE_USE_CURSOR;
+   if (usage & GBM_BO_USE_LINEAR)
+      *dri_use |= __DRI_IMAGE_USE_LINEAR;
+}
+
+static void
 swrast_get_drawable_info(__DRIdrawable *driDrawable,
                          int           *x,
                          int           *y,
@@ -539,7 +557,7 @@ gbm_dri_is_format_supported(struct gbm_device *gbm,
       break;
    case GBM_BO_FORMAT_ARGB8888:
    case GBM_FORMAT_ARGB8888:
-      if (usage & GBM_BO_USE_SCANOUT)
+      if (usage & GBM_BO_USE_SCANOUT_ANY)
          return 0;
       break;
    default:
@@ -746,10 +764,8 @@ gbm_dri_bo_import(struct gbm_device *gbm,
 
    bo->image = image;
 
-   if (usage & GBM_BO_USE_SCANOUT)
-      dri_use |= __DRI_IMAGE_USE_SCANOUT;
-   if (usage & GBM_BO_USE_CURSOR)
-      dri_use |= __DRI_IMAGE_USE_CURSOR;
+   gbm_to_dri_flag(usage, &dri_use);
+
    if (dri->image->base.version >= 2 &&
        !dri->image->validateUsage(bo->image, dri_use)) {
       errno = EINVAL;
@@ -786,7 +802,7 @@ create_dumb(struct gbm_device *gbm,
 
    is_cursor = (usage & GBM_BO_USE_CURSOR) != 0 &&
       format == GBM_FORMAT_ARGB8888;
-   is_scanout = (usage & GBM_BO_USE_SCANOUT) != 0 &&
+   is_scanout = (usage & GBM_BO_USE_SCANOUT_ANY) != 0 &&
       format == GBM_FORMAT_XRGB8888;
    if (!is_cursor && !is_scanout) {
       errno = EINVAL;
@@ -878,12 +894,7 @@ gbm_dri_bo_create(struct gbm_device *gbm,
       goto failed;
    }
 
-   if (usage & GBM_BO_USE_SCANOUT)
-      dri_use |= __DRI_IMAGE_USE_SCANOUT;
-   if (usage & GBM_BO_USE_CURSOR)
-      dri_use |= __DRI_IMAGE_USE_CURSOR;
-   if (usage & GBM_BO_USE_LINEAR)
-      dri_use |= __DRI_IMAGE_USE_LINEAR;
+   gbm_to_dri_flag(usage, &dri_use);
 
    /* Gallium drivers requires shared in order to get the handle/stride */
    dri_use |= __DRI_IMAGE_USE_SHARE;
diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
index 8db2153..667fcf7 100644
--- a/src/gbm/main/gbm.h
+++ b/src/gbm/main/gbm.h
@@ -214,8 +214,23 @@ enum gbm_bo_flags {
     * Buffer is linear, i.e. not tiled.
     */
    GBM_BO_USE_LINEAR = (1 << 4),
+   /**
+    * Buffer would be rotated and some platforms have additional tiling
+    * requirements for rotated scanout buffers.
+    * And, setting a rotation angle of 90 or 270 would result in the
+    * scanout buffer being rotated in a clounter clockwise manner. This
+    * is the expected behavior for ensuring XRandR compliance.
+    */
+   GBM_BO_USE_SCANOUT_ROTATION_90 = (1 << 5),
+   GBM_BO_USE_SCANOUT_ROTATION_180 = (1 << 6),
+   GBM_BO_USE_SCANOUT_ROTATION_270 = (1 << 7),
 };
 
+#define GBM_BO_USE_SCANOUT_ANY (GBM_BO_USE_SCANOUT |              \
+                                GBM_BO_USE_SCANOUT_ROTATION_90 |  \
+                                GBM_BO_USE_SCANOUT_ROTATION_180 | \
+                                GBM_BO_USE_SCANOUT_ROTATION_270)
+
 int
 gbm_device_get_fd(struct gbm_device *gbm);
 
-- 
2.4.3



More information about the mesa-dev mailing list