82 lines
2.8 KiB
Diff
82 lines
2.8 KiB
Diff
|
Git-commit: ed4e414267994331730f48cfa8d8bf6dce586969
|
||
|
Author: Michal Srb <msrb@suse.com>
|
||
|
Subject: drisw: Use separate drisw_loader_funcs for shm
|
||
|
Patch-Mainline: To be upstreamed
|
||
|
References: boo#1113533
|
||
|
|
||
|
The original code was modifying the global drisw_lf variable, which is bad
|
||
|
when there are multiple contexts in single process, each initialized with
|
||
|
different loader. One may support put_image_shm and the other not.
|
||
|
|
||
|
Since there are currently only two possible combinations, lets create two
|
||
|
global tables, one for each. Lets make them const, since we won't change them
|
||
|
and they can be shared.
|
||
|
|
||
|
This fixes crash in VLC. It used two GL contexts (each in different thread), one
|
||
|
was initialized by its Qt GUI, the other by its video output plugin. The first
|
||
|
one set the put_image_shm=drisw_put_image_shm, the second did not, but
|
||
|
since the same structure was used, the drisw_put_image_shm was used too. Then
|
||
|
it crashed because the second loader did not have putImageShm set.
|
||
|
|
||
|
Downstream bug:
|
||
|
https://bugzilla.opensuse.org/show_bug.cgi?id=1113533
|
||
|
|
||
|
v2: Added Fixes and described the VLC bug.
|
||
|
|
||
|
Fixes: 63c427fa71a ("drisw: use putImageShm if available")
|
||
|
Signed-off-by: Michal Srb <msrb@suse.com>
|
||
|
---
|
||
|
|
||
|
src/gallium/state_trackers/dri/drisw.c | 14 +++++++++++---
|
||
|
1 file changed, 11 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/src/gallium/state_trackers/dri/drisw.c b/src/gallium/state_trackers/dri/drisw.c
|
||
|
index 886f94dc02..5a0d2e1354 100644
|
||
|
--- a/src/gallium/state_trackers/dri/drisw.c
|
||
|
+++ b/src/gallium/state_trackers/dri/drisw.c
|
||
|
@@ -421,12 +421,19 @@ static const __DRIextension *drisw_screen_extensions[] = {
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
-static struct drisw_loader_funcs drisw_lf = {
|
||
|
+static const struct drisw_loader_funcs drisw_lf = {
|
||
|
.get_image = drisw_get_image,
|
||
|
.put_image = drisw_put_image,
|
||
|
.put_image2 = drisw_put_image2
|
||
|
};
|
||
|
|
||
|
+static const struct drisw_loader_funcs drisw_shm_lf = {
|
||
|
+ .get_image = drisw_get_image,
|
||
|
+ .put_image = drisw_put_image,
|
||
|
+ .put_image2 = drisw_put_image2,
|
||
|
+ .put_image_shm = drisw_put_image_shm
|
||
|
+};
|
||
|
+
|
||
|
static const __DRIconfig **
|
||
|
drisw_init_screen(__DRIscreen * sPriv)
|
||
|
{
|
||
|
@@ -434,6 +441,7 @@ drisw_init_screen(__DRIscreen * sPriv)
|
||
|
const __DRIconfig **configs;
|
||
|
struct dri_screen *screen;
|
||
|
struct pipe_screen *pscreen = NULL;
|
||
|
+ const struct drisw_loader_funcs *lf = &drisw_lf;
|
||
|
|
||
|
screen = CALLOC_STRUCT(dri_screen);
|
||
|
if (!screen)
|
||
|
@@ -448,10 +456,10 @@ drisw_init_screen(__DRIscreen * sPriv)
|
||
|
sPriv->extensions = drisw_screen_extensions;
|
||
|
if (loader->base.version >= 4) {
|
||
|
if (loader->putImageShm)
|
||
|
- drisw_lf.put_image_shm = drisw_put_image_shm;
|
||
|
+ lf = &drisw_shm_lf;
|
||
|
}
|
||
|
|
||
|
- if (pipe_loader_sw_probe_dri(&screen->dev, &drisw_lf)) {
|
||
|
+ if (pipe_loader_sw_probe_dri(&screen->dev, lf)) {
|
||
|
dri_init_options(screen);
|
||
|
|
||
|
pscreen = pipe_loader_create_screen(screen->dev);
|
||
|
--
|
||
|
2.16.4
|
||
|
|