[Mesa-dev] [PATCH 1/3] dri: Add an image creation with modifiers
Ben Widawsky
ben at bwidawsk.net
Mon Mar 13 21:29:00 UTC 2017
On 17-03-09 18:38:15, Jason Ekstrand wrote:
>On Thu, Mar 9, 2017 at 5:48 PM, Ben Widawsky <ben at bwidawsk.net> wrote:
>
>> Modifiers will be obtains or guessed by the client and passed in during
>>
>
>"obtained"
>
>
Got it.
>> image creation/import.
>>
>> This requires bumping the DRIimage version.
>>
>> As of this patch, the modifiers aren't plumbed all the way down, this
>> patch simply makes sure the interface level stuff is correct.
>>
>> v2: Don't allow usage + modifiers
>>
>> v3: Make NAND actually NAND. Bug introduced in v2. (Jason)
>>
>> Cc: Kristian Høgsberg <krh at bitplanet.net>
>> Cc: Jason Ekstrand <jason at jlekstrand.net>
>> Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
>> Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com> (v1)
>> Acked-by: Daniel Stone <daniels at collabora.com>
>> ---
>> include/GL/internal/dri_interface.h | 27 ++++++++++++++++++++++++++-
>> src/gallium/state_trackers/dri/dri2.c | 1 +
>> src/mesa/drivers/dri/i965/intel_screen.c | 32
>> +++++++++++++++++++++++++++++++-
>> 3 files changed, 58 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/GL/internal/dri_interface.h
>> b/include/GL/internal/dri_interface.h
>> index 598d111f33..53fac6fc3c 100644
>> --- a/include/GL/internal/dri_interface.h
>> +++ b/include/GL/internal/dri_interface.h
>> @@ -1136,7 +1136,7 @@ struct __DRIdri2ExtensionRec {
>> * extensions.
>> */
>> #define __DRI_IMAGE "DRI_IMAGE"
>> -#define __DRI_IMAGE_VERSION 13
>> +#define __DRI_IMAGE_VERSION 14
>>
>> /**
>> * These formats correspond to the similarly named MESA_FORMAT_*
>> @@ -1257,6 +1257,8 @@ struct __DRIdri2ExtensionRec {
>> #define __DRI_IMAGE_ATTRIB_NUM_PLANES 0x2009 /* available in versions
>> 11 */
>>
>> #define __DRI_IMAGE_ATTRIB_OFFSET 0x200A /* available in versions 13 */
>> +#define __DRI_IMAGE_ATTRIB_MODIFIER_LOWER 0x200B /* available in
>> versions 14 */
>> +#define __DRI_IMAGE_ATTRIB_MODIFIER_UPPER 0x200C /* available in
>> versions 14 */
>>
>> enum __DRIYUVColorSpace {
>> __DRI_YUV_COLOR_SPACE_UNDEFINED = 0,
>> @@ -1468,6 +1470,29 @@ struct __DRIimageExtensionRec {
>> */
>> void (*unmapImage)(__DRIcontext *context, __DRIimage *image, void
>> *data);
>>
>> +
>> + /**
>> + * Creates an image with implementation's favorite modifiers.
>> + *
>> + * This acts like createImage except there is a list of modifiers
>> passed in
>> + * which the implementation may selectively use to create the
>> DRIimage. The
>> + * result should be the implementation selects one modifier (perhaps
>> it would
>> + * hold on to a few and later pick).
>> + *
>> + * The created image should be destroyed with destroyImage().
>> + *
>> + * Returns the new DRIimage. The chosen modifier can be obtained later
>> on
>> + * and passed back to things like the kernel's AddFB2 interface.
>> + *
>> + * \sa __DRIimageRec::createImage
>> + *
>> + * \since 14
>> + */
>> + __DRIimage *(*createImageWithModifiers)(__DRIscreen *screen,
>> + int width, int height, int
>> format,
>> + const uint64_t *modifiers,
>> + const unsigned int
>> modifier_count,
>> + void *loaderPrivate);
>> };
>>
>>
>> diff --git a/src/gallium/state_trackers/dri/dri2.c
>> b/src/gallium/state_trackers/dri/dri2.c
>> index b50e096443..12e466c6f1 100644
>> --- a/src/gallium/state_trackers/dri/dri2.c
>> +++ b/src/gallium/state_trackers/dri/dri2.c
>> @@ -1413,6 +1413,7 @@ static __DRIimageExtension dri2ImageExtension = {
>> .getCapabilities = dri2_get_capabilities,
>> .mapImage = dri2_map_image,
>> .unmapImage = dri2_unmap_image,
>> + .createImageWithModifiers = NULL,
>> };
>>
>>
>> diff --git a/src/mesa/drivers/dri/i965/intel_screen.c
>> b/src/mesa/drivers/dri/i965/intel_screen.c
>> index 21786eb54a..3452572874 100644
>> --- a/src/mesa/drivers/dri/i965/intel_screen.c
>> +++ b/src/mesa/drivers/dri/i965/intel_screen.c
>> @@ -510,9 +510,11 @@ intel_destroy_image(__DRIimage *image)
>> }
>>
>> static __DRIimage *
>> -intel_create_image(__DRIscreen *dri_screen,
>> +__intel_create_image(__DRIscreen *dri_screen,
>> int width, int height, int format,
>> unsigned int use,
>> + const uint64_t *modifiers,
>> + unsigned count,
>> void *loaderPrivate)
>> {
>> __DRIimage *image;
>> @@ -521,6 +523,12 @@ intel_create_image(__DRIscreen *dri_screen,
>> int cpp;
>> unsigned long pitch;
>>
>> + /* Callers of this may specify a modifier, or a dri usage, but not
>> both. The
>> + * newer modifier interface deprecates the older usage flags newer
>> modifier
>> + * interface deprecates the older usage flags.
>> + */
>> + assert(!(use && count));
>> +
>> tiling = I915_TILING_X;
>> if (use & __DRI_IMAGE_USE_CURSOR) {
>> if (width != 64 || height != 64)
>> @@ -550,6 +558,27 @@ intel_create_image(__DRIscreen *dri_screen,
>> return image;
>> }
>>
>> +static __DRIimage *
>> +intel_create_image(__DRIscreen *dri_screen,
>> + int width, int height, int format,
>> + unsigned int use,
>> + void *loaderPrivate)
>> +{
>> + return __intel_create_image(dri_screen, width, height, format, use,
>> NULL, 0,
>> + loaderPrivate);
>> +}
>> +
>> +static __DRIimage *
>> +intel_create_image_with_modifiers(__DRIscreen *dri_screen,
>> + int width, int height, int format,
>> + const uint64_t *modifiers,
>> + const unsigned count,
>> + void *loaderPrivate)
>> +{
>> + return __intel_create_image(dri_screen, width, height, format, 0,
>> NULL, 0,
>>
>
>Did you want to pass the modifiers through? Maybe that's in another patch.
>
>
Yes. Later patch.
>> + loaderPrivate);
>> +}
>> +
>> static GLboolean
>> intel_query_image(__DRIimage *image, int attrib, int *value)
>> {
>> @@ -840,6 +869,7 @@ static const __DRIimageExtension intelImageExtension =
>> {
>> .getCapabilities = NULL,
>> .mapImage = NULL,
>> .unmapImage = NULL,
>> + .createImageWithModifiers = intel_create_image_with_
>> modifiers,
>> };
>>
>> static int
>> --
>> 2.12.0
>>
>>
More information about the mesa-dev
mailing list