summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichal Srb <[email protected]>2018-11-23 17:03:53 +0100
committerEmil Velikov <[email protected]>2018-12-05 13:16:09 +0000
commit63c0916ada7eed7eddc0453dfbfed3cc7f42ca85 (patch)
tree361c3b4388d0bb33f41db19428e0608dde29d499 /src
parentc0ac038c97b89a8266375339c297b17b3700dfb0 (diff)
drisw: Use separate drisw_loader_funcs for shm
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 <[email protected]> Reviewed-by: Emil Velikov <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/state_trackers/dri/drisw.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/gallium/state_trackers/dri/drisw.c b/src/gallium/state_trackers/dri/drisw.c
index 886f94dc02c..5a0d2e1354d 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);