+ dri->image->destroyImage(bo->image);
+ goto failed;
+ }
+
+ bo->base.base.count = count;
+ memcpy(bo->base.base.modifiers, modifiers, count *
sizeof(*modifiers));
+
dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HANDLE,
&bo->base.base.handle.s32);
dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE,
@@ -1100,7 +1118,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;
@@ -1114,6 +1133,15 @@ gbm_dri_surface_create(struct gbm_device *gbm,
surf->base.format = format;
surf->base.flags = flags;
+ surf->base.modifiers = calloc(count, sizeof(*modifiers));
+ if (count && !surf->base.modifiers) {
+ return NULL;
+ }
+
+ surf->base.count = count;
+ memcpy(surf->base.modifiers, modifiers, count * sizeof(*modifiers));
+
return &surf->base;
}
@@ -1122,6 +1150,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 295f6894eb..64da03b0da 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,17 @@ 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, uint32_t flags,
+ const uint64_t *modifiers, const
unsigned int count)
+{
+ return gbm->surface_create(gbm, width, height, format, flags,
+ modifiers, count);
}
/**
diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
index b089359b01..6390e60d04 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, uint32_t flags,
+ 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 ac6078361a..cd437df021 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);
@@ -103,6 +107,10 @@ struct gbm_bo {
uint32_t height;
uint32_t stride;
uint32_t format;
+ struct {
+ uint64_t *modifiers;
+ unsigned int count;
+ };
union gbm_bo_handle handle;
void *user_data;
void (*destroy_user_data)(struct gbm_bo *, void *);
@@ -114,6 +122,10 @@ struct gbm_surface {
uint32_t height;
uint32_t format;
uint32_t flags;
+ struct {
+ uint64_t *modifiers;
+ unsigned count;
+ };
};
struct gbm_backend {
--
2.11.0
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev