90 lines
3.6 KiB
Diff
90 lines
3.6 KiB
Diff
|
diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c
|
||
|
index 8747ef4aa8a..3b34e32cd21 100644
|
||
|
--- a/src/gallium/drivers/iris/iris_resource.c
|
||
|
+++ b/src/gallium/drivers/iris/iris_resource.c
|
||
|
@@ -1125,6 +1125,20 @@ iris_flush_resource(struct pipe_context *ctx, struct pipe_resource *resource)
|
||
|
0, INTEL_REMAINING_LAYERS,
|
||
|
mod ? mod->aux_usage : ISL_AUX_USAGE_NONE,
|
||
|
mod ? mod->supports_clear_color : false);
|
||
|
+
|
||
|
+ if (!res->mod_info && res->aux.usage != ISL_AUX_USAGE_NONE) {
|
||
|
+ /* flush_resource may be used to prepare an image for sharing external
|
||
|
+ * to the driver (e.g. via eglCreateImage). To account for this, make
|
||
|
+ * sure to get rid of any compression that a consumer wouldn't know how
|
||
|
+ * to handle.
|
||
|
+ */
|
||
|
+ for (int i = 0; i < IRIS_BATCH_COUNT; i++) {
|
||
|
+ if (iris_batch_references(&ice->batches[i], res->bo))
|
||
|
+ iris_batch_flush(&ice->batches[i]);
|
||
|
+ }
|
||
|
+
|
||
|
+ iris_resource_disable_aux(res);
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
diff --git a/src/gallium/frontends/dri/dri_helpers.c b/src/gallium/frontends/dri/dri_helpers.c
|
||
|
index 01a1fb3d96c..5e87df35a55 100644
|
||
|
--- a/src/gallium/frontends/dri/dri_helpers.c
|
||
|
+++ b/src/gallium/frontends/dri/dri_helpers.c
|
||
|
@@ -258,7 +258,9 @@ dri2_create_image_from_renderbuffer2(__DRIcontext *context,
|
||
|
int renderbuffer, void *loaderPrivate,
|
||
|
unsigned *error)
|
||
|
{
|
||
|
- struct gl_context *ctx = ((struct st_context *)dri_context(context)->st)->ctx;
|
||
|
+ struct st_context *st_ctx = (struct st_context *)dri_context(context)->st;
|
||
|
+ struct gl_context *ctx = st_ctx->ctx;
|
||
|
+ struct pipe_context *p_ctx = st_ctx->pipe;
|
||
|
struct gl_renderbuffer *rb;
|
||
|
struct pipe_resource *tex;
|
||
|
__DRIimage *img;
|
||
|
@@ -299,6 +301,13 @@ dri2_create_image_from_renderbuffer2(__DRIcontext *context,
|
||
|
|
||
|
pipe_resource_reference(&img->texture, tex);
|
||
|
|
||
|
+ /* If the resource supports EGL_MESA_image_dma_buf_export, make sure that
|
||
|
+ * it's in a shareable state. Do this now while we still have the access to
|
||
|
+ * the context.
|
||
|
+ */
|
||
|
+ if (dri2_get_mapping_by_format(img->dri_format))
|
||
|
+ p_ctx->flush_resource(p_ctx, tex);
|
||
|
+
|
||
|
*error = __DRI_IMAGE_ERROR_SUCCESS;
|
||
|
return img;
|
||
|
}
|
||
|
@@ -326,7 +335,9 @@ dri2_create_from_texture(__DRIcontext *context, int target, unsigned texture,
|
||
|
void *loaderPrivate)
|
||
|
{
|
||
|
__DRIimage *img;
|
||
|
- struct gl_context *ctx = ((struct st_context *)dri_context(context)->st)->ctx;
|
||
|
+ struct st_context *st_ctx = (struct st_context *)dri_context(context)->st;
|
||
|
+ struct gl_context *ctx = st_ctx->ctx;
|
||
|
+ struct pipe_context *p_ctx = st_ctx->pipe;
|
||
|
struct gl_texture_object *obj;
|
||
|
struct pipe_resource *tex;
|
||
|
GLuint face = 0;
|
||
|
@@ -376,6 +387,13 @@ dri2_create_from_texture(__DRIcontext *context, int target, unsigned texture,
|
||
|
|
||
|
pipe_resource_reference(&img->texture, tex);
|
||
|
|
||
|
+ /* If the resource supports EGL_MESA_image_dma_buf_export, make sure that
|
||
|
+ * it's in a shareable state. Do this now while we still have the access to
|
||
|
+ * the context.
|
||
|
+ */
|
||
|
+ if (dri2_get_mapping_by_format(img->dri_format))
|
||
|
+ p_ctx->flush_resource(p_ctx, tex);
|
||
|
+
|
||
|
*error = __DRI_IMAGE_ERROR_SUCCESS;
|
||
|
return img;
|
||
|
}
|
||
|
@@ -547,6 +565,9 @@ dri2_get_mapping_by_fourcc(int fourcc)
|
||
|
const struct dri2_format_mapping *
|
||
|
dri2_get_mapping_by_format(int format)
|
||
|
{
|
||
|
+ if (format == __DRI_IMAGE_FORMAT_NONE)
|
||
|
+ return NULL;
|
||
|
+
|
||
|
for (unsigned i = 0; i < ARRAY_SIZE(dri2_format_table); i++) {
|
||
|
if (dri2_format_table[i].dri_format == format)
|
||
|
return &dri2_format_table[i];
|