+ bo->image = dri->image->createImage(dri->screen, width, height,
+ dri_format, dri_use, bo);
+ } else {
+ bo->image =
+ dri->image->createImageWithModifiers(dri->screen,
+ width, height,
+ dri_format,
+ modifiers, count,
+ bo);
+ }
if (bo->image == NULL)
goto failed;
@@ -1165,7 +1182,8 @@ gbm_dri_bo_unmap(struct gbm_bo *_bo, void *map_data)
static struct gbm_surface *
gbm_dri_surface_create(struct gbm_device *gbm,
uint32_t width, uint32_t height,
- uint32_t format, uint32_t flags)
+ uint32_t format, uint32_t flags,
+ const uint64_t *modifiers, const unsigned count)
{
struct gbm_dri_surface *surf;
@@ -1179,6 +1197,15 @@ gbm_dri_surface_create(struct gbm_device *gbm,
surf->base.format = format;
surf->base.flags = flags;
+ surf->base.count = count;
+ memcpy(surf->base.modifiers, modifiers, count * sizeof(*modifiers));
+
return &surf->base;
}
@@ -1187,6 +1214,7 @@ gbm_dri_surface_destroy(struct gbm_surface *_surf)
{
struct gbm_dri_surface *surf = gbm_dri_surface(_surf);
+ free(surf->base.modifiers);
free(surf);
}
diff --git a/src/gbm/gbm-symbols-check b/src/gbm/gbm-symbols-check
index 7ff78ab400..c137c6cd93 100755
--- a/src/gbm/gbm-symbols-check
+++ b/src/gbm/gbm-symbols-check
@@ -8,6 +8,7 @@ gbm_device_is_format_supported
gbm_device_destroy
gbm_create_device
gbm_bo_create
+gbm_bo_create_with_modifiers
gbm_bo_import
gbm_bo_map
gbm_bo_unmap
@@ -27,6 +28,7 @@ gbm_bo_set_user_data
gbm_bo_get_user_data
gbm_bo_destroy
gbm_surface_create
+gbm_surface_create_with_modifiers
gbm_surface_needs_lock_front_buffer
gbm_surface_lock_front_buffer
gbm_surface_release_buffer
diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c
index afcca63da3..0fb62657ed 100644
--- a/src/gbm/main/gbm.c
+++ b/src/gbm/main/gbm.c
@@ -369,9 +369,23 @@ gbm_bo_create(struct gbm_device *gbm,
return NULL;
}
- return gbm->bo_create(gbm, width, height, format, usage);
+ return gbm->bo_create(gbm, width, height, format, usage, NULL, 0);
}
+GBM_EXPORT struct gbm_bo *
+gbm_bo_create_with_modifiers(struct gbm_device *gbm,
+ uint32_t width, uint32_t height,
+ uint32_t format,
+ const uint64_t *modifiers,
+ const unsigned int count)
+{
+ if (width == 0 || height == 0) {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ return gbm->bo_create(gbm, width, height, format, 0, modifiers,
count);
+}
/**
* Create a gbm buffer object from an foreign object
*
@@ -477,7 +491,18 @@ gbm_surface_create(struct gbm_device *gbm,
uint32_t width, uint32_t height,
uint32_t format, uint32_t flags)
{
- return gbm->surface_create(gbm, width, height, format, flags);
+ return gbm->surface_create(gbm, width, height, format, flags, NULL,
0);
+}
+
+GBM_EXPORT struct gbm_surface *
+gbm_surface_create_with_modifiers(struct gbm_device *gbm,
+ uint32_t width, uint32_t height,
+ uint32_t format,
+ const uint64_t *modifiers,
+ const unsigned int count)
+{
+ return gbm->surface_create(gbm, width, height, format, 0,
+ modifiers, count);
}
/**
diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
index e3e5d34d97..5f588dab58 100644
--- a/src/gbm/main/gbm.h
+++ b/src/gbm/main/gbm.h
@@ -243,6 +243,12 @@ gbm_bo_create(struct gbm_device *gbm,
uint32_t width, uint32_t height,
uint32_t format, uint32_t flags);
+struct gbm_bo *
+gbm_bo_create_with_modifiers(struct gbm_device *gbm,
+ uint32_t width, uint32_t height,
+ uint32_t format,
+ const uint64_t *modifiers,
+ const unsigned int count);
#define GBM_BO_IMPORT_WL_BUFFER 0x5501
#define GBM_BO_IMPORT_EGL_IMAGE 0x5502
#define GBM_BO_IMPORT_FD 0x5503
@@ -345,6 +351,12 @@ gbm_surface_create(struct gbm_device *gbm,
uint32_t width, uint32_t height,
uint32_t format, uint32_t flags);
+struct gbm_surface *
+gbm_surface_create_with_modifiers(struct gbm_device *gbm,
+ uint32_t width, uint32_t height,
+ uint32_t format,
+ const uint64_t *modifiers,
+ const unsigned int count);
int
gbm_surface_needs_lock_front_buffer(struct gbm_surface *surface);
diff --git a/src/gbm/main/gbmint.h b/src/gbm/main/gbmint.h
index a6541d91c5..d8c9f6e5d7 100644
--- a/src/gbm/main/gbmint.h
+++ b/src/gbm/main/gbmint.h
@@ -65,7 +65,9 @@ struct gbm_device {
struct gbm_bo *(*bo_create)(struct gbm_device *gbm,
uint32_t width, uint32_t height,
uint32_t format,
- uint32_t usage);
+ uint32_t usage,
+ const uint64_t *modifiers,
+ const unsigned int count);
struct gbm_bo *(*bo_import)(struct gbm_device *gbm, uint32_t type,
void *buffer, uint32_t usage);
void *(*bo_map)(struct gbm_bo *bo,
@@ -84,7 +86,9 @@ struct gbm_device {
struct gbm_surface *(*surface_create)(struct gbm_device *gbm,
uint32_t width, uint32_t height,
- uint32_t format, uint32_t
flags);
+ uint32_t format, uint32_t flags,
+ const uint64_t *modifiers,
+ const unsigned count);
struct gbm_bo *(*surface_lock_front_buffer)(struct gbm_surface
*surface);
void (*surface_release_buffer)(struct gbm_surface *surface,
struct gbm_bo *bo);
@@ -114,6 +118,10 @@ struct gbm_surface {
uint32_t height;
uint32_t format;
uint32_t flags;
+ struct {
+ uint64_t *modifiers;
+ unsigned count;
+ };
};
struct gbm_backend {
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c
b/src/mesa/drivers/dri/i965/intel_screen.c
index 3452572874..395a71b3b3 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -41,6 +41,10 @@
#include "utils.h"
#include "xmlpool.h"
+#ifndef DRM_FORMAT_MOD_INVALID
+#define DRM_FORMAT_MOD_INVALID ((1ULL<<56) - 1)
+#endif
+
static const __DRIconfigOptionsExtension brw_config_options = {
.base = { __DRI_CONFIG_OPTIONS, 1 },
.xml =
@@ -509,6 +513,14 @@ intel_destroy_image(__DRIimage *image)
free(image);
}
+static uint64_t
+select_best_modifier(struct gen_device_info *devinfo,
+ const uint64_t *modifiers,
+ const unsigned count)
+{
+ return DRM_FORMAT_MOD_INVALID;
+}
+
static __DRIimage *
__intel_create_image(__DRIscreen *dri_screen,
int width, int height, int format,
@@ -529,6 +541,12 @@ __intel_create_image(__DRIscreen *dri_screen,
*/
assert(!(use && count));
+ uint64_t modifier = select_best_modifier(&screen->devinfo,
modifiers, count);
+ assert(modifier == DRM_FORMAT_MOD_INVALID);
+
+ /* Historically, X-tiled was the default, and so lack of modifier
means
+ * X-tiled.
+ */
tiling = I915_TILING_X;
if (use & __DRI_IMAGE_USE_CURSOR) {
if (width != 64 || height != 64)
--
2.12.0