For certain platforms that support rotated scanout buffers, currently,
there is no way to create them with the GBM DRI interface. This flag
will instruct the DRI driver to create the buffer by setting
additional requirements.

Cc: Kristian Hogsberg <k...@bitplanet.net>
Signed-off-by: Vivek Kasireddy <vivek.kasire...@intel.com>
---
 include/GL/internal/dri_interface.h | 1 +
 src/gbm/backends/dri/gbm_dri.c      | 9 +++++++--
 src/gbm/main/gbm.h                  | 5 +++++
 3 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/include/GL/internal/dri_interface.h 
b/include/GL/internal/dri_interface.h
index a0f155a..2271217 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -1091,6 +1091,7 @@ struct __DRIdri2ExtensionRec {
 #define __DRI_IMAGE_USE_SCANOUT                0x0002
 #define __DRI_IMAGE_USE_CURSOR         0x0004 /* Depricated */
 #define __DRI_IMAGE_USE_LINEAR         0x0008
+#define __DRI_IMAGE_USE_SCANOUT_ROTATED_90_270         0x0010
 
 
 /**
diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
index 57cdeac..cde63de 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -539,7 +539,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 | GBM_BO_USE_SCANOUT_ROTATED_90_270))
          return 0;
       break;
    default:
@@ -748,6 +748,8 @@ gbm_dri_bo_import(struct gbm_device *gbm,
 
    if (usage & GBM_BO_USE_SCANOUT)
       dri_use |= __DRI_IMAGE_USE_SCANOUT;
+   if (usage & GBM_BO_USE_SCANOUT_ROTATED_90_270)
+      dri_use |= __DRI_IMAGE_USE_SCANOUT_ROTATED_90_270;
    if (usage & GBM_BO_USE_CURSOR)
       dri_use |= __DRI_IMAGE_USE_CURSOR;
    if (dri->image->base.version >= 2 &&
@@ -786,7 +788,8 @@ 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 |
+      GBM_BO_USE_SCANOUT_ROTATED_90_270)) != 0 &&
       format == GBM_FORMAT_XRGB8888;
    if (!is_cursor && !is_scanout) {
       errno = EINVAL;
@@ -880,6 +883,8 @@ gbm_dri_bo_create(struct gbm_device *gbm,
 
    if (usage & GBM_BO_USE_SCANOUT)
       dri_use |= __DRI_IMAGE_USE_SCANOUT;
+   if (usage & GBM_BO_USE_SCANOUT_ROTATED_90_270)
+      dri_use |= __DRI_IMAGE_USE_SCANOUT_ROTATED_90_270;
    if (usage & GBM_BO_USE_CURSOR)
       dri_use |= __DRI_IMAGE_USE_CURSOR;
    if (usage & GBM_BO_USE_LINEAR)
diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
index 2708e50..2ef7bd8 100644
--- a/src/gbm/main/gbm.h
+++ b/src/gbm/main/gbm.h
@@ -213,6 +213,11 @@ 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 90/270 rotated buffers.
+    */
+   GBM_BO_USE_SCANOUT_ROTATED_90_270 = (1 << 5),
 };
 
 int
-- 
2.4.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to