b3ed051f81
- Place khrplatform.h into new package Mesa-KHR-devel. It is now required by all devel packages that need it. (bsc#1117365) - Remove n_drisw-Do-not-use-drisw_put_image_shm.patch, add u_constify-struct-drisw_loader_funcs.patch and u_drisw-use-separate-drisw_loader_funcs-for-shm.patch. * Replace workaround with proper fix for crash in VLC and possibly other applications. (boo#1113533) OBS-URL: https://build.opensuse.org/request/show/652135 OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/Mesa?expand=0&rev=786
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
|
|
|