diff options
author | Ben Widawsky <ben@bwidawsk.net> | 2016-11-04 11:31:15 -0700 |
---|---|---|
committer | Ben Widawsky <ben@bwidawsk.net> | 2017-03-13 10:37:38 -0700 |
commit | a6b47fdcb2a5daadc50af0ca9276756890462738 (patch) | |
tree | db7a7c4f317db94040217dfd1e89f5b6d747eac3 | |
parent | c108429c1f538118bf5afd5f54a66bd2f4bcab05 (diff) |
dri: Add an image creation with modifiers
Modifiers will be obtains or guessed by the client and passed in during
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@bitplanet.net>
Cc: Jason Ekstrand <jason@jekstrand.net>
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com> (v1)
Acked-by: Daniel Stone <daniels@collabora.com>
-rw-r--r-- | include/GL/internal/dri_interface.h | 27 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri2.c | 1 | ||||
-rw-r--r-- | 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 439400b3ae..7ed2d05f0c 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.c +++ b/src/mesa/drivers/dri/i965/intel_screen.c @@ -512,9 +512,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; @@ -523,6 +525,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) @@ -552,6 +560,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, + loaderPrivate); +} + static GLboolean intel_query_image(__DRIimage *image, int attrib, int *value) { @@ -844,6 +873,7 @@ static const __DRIimageExtension intelImageExtension = { .getCapabilities = NULL, .mapImage = NULL, .unmapImage = NULL, + .createImageWithModifiers = intel_create_image_with_modifiers, }; static int |