blob: 08dae3689952e62fa8909e6587e01207f61814b5 [file] [log] [blame]
From 9277e452081670674dd9fabb909971da3b00c7f4 Mon Sep 17 00:00:00 2001
From: David Stevens <stevensd@chromium.org>
Date: Thu, 26 Nov 2020 13:15:55 +0900
Subject: [PATCH 10/11] frontend/dri: plumb loader image cleanup callback
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: David Stevens <stevensd@chromium.org>
Reviewed-by: Tapani Pรคlli <tapani.palli@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7805>
---
src/gallium/state_trackers/dri/dri2.c | 3 +++
src/gallium/state_trackers/dri/dri_helpers.c | 13 +++++++++++++
src/gallium/state_trackers/dri/dri_screen.h | 2 ++
3 files changed, 18 insertions(+)
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
index 8b4402a74aa..b9f0bd35b47 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -801,6 +801,7 @@ dri2_create_image_from_winsys(__DRIscreen *_screen,
img->layer = 0;
img->use = 0;
img->loader_private = loaderPrivate;
+ img->sPriv = _screen;
return img;
}
@@ -1012,6 +1013,7 @@ dri2_create_image_common(__DRIscreen *_screen,
img->use = use;
img->loader_private = loaderPrivate;
+ img->sPriv = _screen;
return img;
}
@@ -1260,6 +1262,7 @@ dri2_dup_image(__DRIimage *image, void *loaderPrivate)
/* This should be 0 for sub images, but dup is also used for base images. */
img->dri_components = image->dri_components;
img->loader_private = loaderPrivate;
+ img->sPriv = image->sPriv;
return img;
}
diff --git a/src/gallium/state_trackers/dri/dri_helpers.c b/src/gallium/state_trackers/dri/dri_helpers.c
index 90a8a392fad..615fc70c1e1 100644
--- a/src/gallium/state_trackers/dri/dri_helpers.c
+++ b/src/gallium/state_trackers/dri/dri_helpers.c
@@ -296,6 +296,7 @@ dri2_create_image_from_renderbuffer2(__DRIcontext *context,
img->dri_format = driGLFormatToImageFormat(rb->Format);
img->loader_private = loaderPrivate;
+ img->sPriv = context->driScreenPriv;
pipe_resource_reference(&img->texture, tex);
@@ -315,6 +316,17 @@ dri2_create_image_from_renderbuffer(__DRIcontext *context,
void
dri2_destroy_image(__DRIimage *img)
{
+ const __DRIimageLoaderExtension *imgLoader = img->sPriv->image.loader;
+ const __DRIdri2LoaderExtension *dri2Loader = img->sPriv->dri2.loader;
+
+ if (imgLoader && imgLoader->base.version >= 4 &&
+ imgLoader->destroyLoaderImageState) {
+ imgLoader->destroyLoaderImageState(img->loader_private);
+ } else if (dri2Loader && dri2Loader->base.version >= 5 &&
+ dri2Loader->destroyLoaderImageState) {
+ dri2Loader->destroyLoaderImageState(img->loader_private);
+ }
+
pipe_resource_reference(&img->texture, NULL);
FREE(img);
}
@@ -373,6 +385,7 @@ dri2_create_from_texture(__DRIcontext *context, int target, unsigned texture,
img->dri_format = driGLFormatToImageFormat(obj->Image[face][level]->TexFormat);
img->loader_private = loaderPrivate;
+ img->sPriv = context->driScreenPriv;
pipe_resource_reference(&img->texture, tex);
diff --git a/src/gallium/state_trackers/dri/dri_screen.h b/src/gallium/state_trackers/dri/dri_screen.h
index 1586439bba3..be8a5141237 100644
--- a/src/gallium/state_trackers/dri/dri_screen.h
+++ b/src/gallium/state_trackers/dri/dri_screen.h
@@ -118,6 +118,8 @@ struct __DRIimageRec {
enum __DRIChromaSiting horizontal_siting;
enum __DRIChromaSiting vertical_siting;
+ /* DRI loader screen */
+ __DRIscreen *sPriv;
};
static inline boolean
--
2.29.2.684.gfbc64c5ab5-goog