[Mesa-dev] [PATCH] gbm: Add a flag to enable creation of rotated scanout buffers (v2)
Ilia Mirkin
imirkin at alum.mit.edu
Wed Nov 4 22:45:39 PST 2015
On Thu, Nov 5, 2015 at 1:34 AM, Michel Dänzer <michel at daenzer.net> wrote:
> On 05.11.2015 11:32, Vivek Kasireddy wrote:
>> 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 such as tiling mode.
>>
>> v2: Reserve a bit per angle. (Ville and 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>
>> ---
>> include/GL/internal/dri_interface.h | 3 +++
>> src/gbm/backends/dri/gbm_dri.c | 19 +++++++++++++++++--
>> src/gbm/main/gbm.h | 7 +++++++
>> 3 files changed, 27 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
>> index 6bbd3fa..cd1bf62 100644
>> --- a/include/GL/internal/dri_interface.h
>> +++ b/include/GL/internal/dri_interface.h
>> @@ -1100,6 +1100,9 @@ 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_ROTATION_90 0x0010
>> +#define __DRI_IMAGE_USE_ROTATION_180 0x0020
>> +#define __DRI_IMAGE_USE_ROTATION_270 0x0040
>>
>>
>> /**
>
> I still think the dri_interface.h change should be a separate patch.
>
>
>> diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
>> index 57cdeac..a997946 100644
>> --- a/src/gbm/backends/dri/gbm_dri.c
>> +++ b/src/gbm/backends/dri/gbm_dri.c
>> @@ -539,7 +539,8 @@ 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_ROTATION_90 |
>> + GBM_BO_USE_ROTATION_180 | GBM_BO_USE_ROTATION_270))
>> return 0;
>> break;
>> default:
>
> If you stick to this approach (see below), I suggest adding a
> GBM_BO_USE_SCANOUT_ANY define which combines all
> GBM_BO_USE_SCANOUT(_ROTATION_*) values, to make these checks less
> cumbersome.
>
>
>> diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
>> index 8db2153..b200ca6 100644
>> --- a/src/gbm/main/gbm.h
>> +++ b/src/gbm/main/gbm.h
>> @@ -214,6 +214,13 @@ 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.
>> + */
>> + GBM_BO_USE_ROTATION_90 = (1 << 5),
>> + GBM_BO_USE_ROTATION_180 = (1 << 6),
>> + GBM_BO_USE_ROTATION_270 = (1 << 7),
>> };
>>
>> int
>>
>
> With this approach, these should be named GBM_BO_USE_SCANOUT_ROTATION_*
> to make it clearer that they are alternatives to GBM_BO_USE_SCANOUT.
>
> One issue with this approach is: What happens if several
> GBM_BO_USE_SCANOUT_ROTATION_* flags are set, and the hardware has
> conflicting requirements for different rotation angles?
Might make sense to make GBM_BO_USE_ROTATION be a 2-bit field... 0 =
SCANOUT, 1 = 90, 2 = 180, 3 = 270? that way conflicting flags can
never happen.
Just a drive-by comment...
-ilia
More information about the mesa-dev
mailing list