gbm: mark surface buffers as explicit flushed

Some drivers are able to optimize buffer usage when it is known that
external visibility of buffer changes only needs to be guaranteed
after well defined transition points, like eglSwapBuffers.

Add a BO flag to specify this behavior and set it with GBM surfaces.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Acked-by: Daniel Stone <daniels@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30077>
This commit is contained in:
Lucas Stach
2024-07-08 19:18:53 +02:00
committed by Marge Bot
parent 3786f5c27a
commit c49a71c03c
2 changed files with 13 additions and 3 deletions

View File

@@ -895,8 +895,14 @@ gbm_dri_bo_create(struct gbm_device *gbm,
dri_use |= __DRI_IMAGE_USE_LINEAR;
if (usage & GBM_BO_USE_PROTECTED)
dri_use |= __DRI_IMAGE_USE_PROTECTED;
if (usage & GBM_BO_USE_FRONT_RENDERING)
if (usage & GBM_BO_USE_FRONT_RENDERING) {
assert (!(usage & GBM_BO_EXPLICIT_FLUSH));
dri_use |= __DRI_IMAGE_USE_FRONT_RENDERING;
}
if (usage & GBM_BO_EXPLICIT_FLUSH) {
assert (!(usage & GBM_BO_USE_FRONT_RENDERING));
dri_use |= __DRI_IMAGE_USE_BACKBUFFER;
}
/* Gallium drivers requires shared in order to get the handle/stride */
dri_use |= __DRI_IMAGE_USE_SHARE;
@@ -1100,7 +1106,7 @@ gbm_dri_surface_create(struct gbm_device *gbm,
surf->base.v0.width = width;
surf->base.v0.height = height;
surf->base.v0.format = core->v0.format_canonicalize(format);
surf->base.v0.flags = flags;
surf->base.v0.flags = flags | GBM_BO_EXPLICIT_FLUSH;
if (!modifiers) {
assert(!count);
return &surf->base;

View File

@@ -330,7 +330,11 @@ enum gbm_bo_flags {
*/
GBM_BO_FIXED_COMPRESSION_12BPC = (13 << 7),
/* next available value is (1 << 11) */
/**
* This buffer will be used with an API with well defined transition points
* between context internal usage and external visibility.
*/
GBM_BO_EXPLICIT_FLUSH = (1 << 11),
};
#define GBM_BO_FIXED_COMPRESSION_MASK (((1 << 11) - 1) & ~((1 << 7) - 1))