diff options
author | Stéphane Marchesin <[email protected]> | 2012-01-18 13:03:56 -0800 |
---|---|---|
committer | Stéphane Marchesin <[email protected]> | 2012-01-18 13:22:27 -0800 |
commit | 81da773f841aa69debc473537750c475e6261e37 (patch) | |
tree | 207942b975a65a0222085478bd1c0230622fb25a /src/gallium/state_trackers/dri | |
parent | 8a472427559ea33186c71dfbab8254651fec3077 (diff) |
st/dri: Remove useless flush front.
In the following scenario:
- CreateContext C1
- MakeCurrent C1
- DestroyContext C1 (does not actually destroy the first context, postponed
until the next MakeCurrent)
- CreateContext C2
- MakeCurrent C2
MakeCurrent will call flush on a half destroyed context, leading to crashes.
Since the other paths (destroy and makecurrent) already flush the context,
there is no need to flush here, so we remove this useless flush front call.
This fixes GPU crashes with Chrome and gallium drivers.
Diffstat (limited to 'src/gallium/state_trackers/dri')
-rw-r--r-- | src/gallium/state_trackers/dri/common/dri_context.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/gallium/state_trackers/dri/common/dri_context.c b/src/gallium/state_trackers/dri/common/dri_context.c index b47d8d92c7e..52c8f4a254b 100644 --- a/src/gallium/state_trackers/dri/common/dri_context.c +++ b/src/gallium/state_trackers/dri/common/dri_context.c @@ -166,7 +166,7 @@ dri_destroy_context(__DRIcontext * cPriv) FREE(ctx->optionCache.values); /* No particular reason to wait for command completion before - * destroying a context, but it is probably worthwhile flushing it + * destroying a context, but we flush the context here * to avoid having to add code elsewhere to cope with flushing a * partially destroyed context. */ @@ -188,7 +188,11 @@ dri_unbind_context(__DRIcontext * cPriv) if (--ctx->bind_count == 0) { if (ctx->st == ctx->stapi->get_current(ctx->stapi)) { - ctx->st->flush(ctx->st, ST_FLUSH_FRONT, NULL); + /* For conformance, unbind is supposed to flush the context. + * However, if we do it here we might end up flushing a partially + * destroyed context. Instead, we flush in dri_make_current and + * in dri_destroy_context which should cover all the cases. + */ stapi->make_current(stapi, NULL, NULL, NULL); } } @@ -207,6 +211,7 @@ dri_make_current(__DRIcontext * cPriv, struct dri_drawable *read = dri_drawable(driReadPriv); struct st_context_iface *old_st = ctx->stapi->get_current(ctx->stapi); + /* Flush the old context here so we don't have to flush on unbind() */ if (old_st && old_st != ctx->st) old_st->flush(old_st, ST_FLUSH_FRONT, NULL); |