The series looks good. I'll commit this in a few days if there are no concerns.
I expect non-DRI window system backends and DDX state trackers to break with r600g because of missing flush_resource calls, but that's expected and can be fixed later if we find out those gallium components are important to our users. Marek On Wed, Sep 11, 2013 at 1:41 AM, Grigori Goronzy <g...@chown.ath.cx> wrote: > From: Marek Olšák <mar...@gmail.com> > > r600g needs explicit flushing before DRI2 buffers are presented on the screen. > > v2: add (stub) implementations for all drivers, fix frontbuffer flushing > v3: fix galahad > --- > src/gallium/docs/source/context.rst | 13 +++++++++++++ > src/gallium/drivers/freedreno/freedreno_resource.c | 6 ++++++ > src/gallium/drivers/galahad/glhd_context.c | 13 +++++++++++++ > src/gallium/drivers/i915/i915_surface.c | 6 ++++++ > src/gallium/drivers/identity/id_context.c | 11 +++++++++++ > src/gallium/drivers/ilo/ilo_blit.c | 6 ++++++ > src/gallium/drivers/llvmpipe/lp_surface.c | 7 +++++++ > src/gallium/drivers/noop/noop_pipe.c | 8 ++++++++ > src/gallium/drivers/nv30/nv30_miptree.c | 6 ++++++ > src/gallium/drivers/nv30/nv30_resource.c | 1 + > src/gallium/drivers/nv30/nv30_resource.h | 4 ++++ > src/gallium/drivers/nv50/nv50_surface.c | 7 +++++++ > src/gallium/drivers/nvc0/nvc0_surface.c | 7 +++++++ > src/gallium/drivers/r300/r300_blit.c | 6 ++++++ > src/gallium/drivers/r600/r600_blit.c | 6 ++++++ > src/gallium/drivers/radeonsi/r600_blit.c | 6 ++++++ > src/gallium/drivers/rbug/rbug_context.c | 15 +++++++++++++++ > src/gallium/drivers/softpipe/sp_surface.c | 7 +++++++ > src/gallium/drivers/svga/svga_pipe_blit.c | 8 ++++++++ > src/gallium/drivers/trace/tr_context.c | 21 > +++++++++++++++++++++ > src/gallium/include/pipe/p_context.h | 13 +++++++++++++ > .../state_trackers/dri/common/dri_drawable.c | 4 ++++ > src/gallium/state_trackers/dri/drm/dri2.c | 10 +++++++--- > 23 files changed, 188 insertions(+), 3 deletions(-) > > diff --git a/src/gallium/docs/source/context.rst > b/src/gallium/docs/source/context.rst > index 95f6b22..d5b4d77 100644 > --- a/src/gallium/docs/source/context.rst > +++ b/src/gallium/docs/source/context.rst > @@ -423,6 +423,19 @@ Flushing > ``flush`` > > > +``flush_resource`` > + > +Flush the resource cache, so that the resource can be used > +by an external client. Possible usage: > +- flushing a resource before presenting it on the screen > +- flushing a resource if some other process or device wants to use it > +This shouldn't be used to flush caches if the resource is only managed > +by a single pipe_screen and is not shared with another process. > +(i.e. you shouldn't use it to flush caches explicitly if you want to e.g. > +use the resource for texturing) > + > + > + > Resource Busy Queries > ^^^^^^^^^^^^^^^^^^^^^ > > diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c > b/src/gallium/drivers/freedreno/freedreno_resource.c > index 3e051ea..3a7e31c 100644 > --- a/src/gallium/drivers/freedreno/freedreno_resource.c > +++ b/src/gallium/drivers/freedreno/freedreno_resource.c > @@ -337,6 +337,11 @@ render_blit(struct pipe_context *pctx, struct > pipe_blit_info *info) > return true; > } > > +static void > +fd_flush_resource(struct pipe_context *ctx, struct pipe_resource *resource) > +{ > +} > + > void > fd_resource_screen_init(struct pipe_screen *pscreen) > { > @@ -357,4 +362,5 @@ fd_resource_context_init(struct pipe_context *pctx) > pctx->surface_destroy = fd_surface_destroy; > pctx->resource_copy_region = fd_resource_copy_region; > pctx->blit = fd_blit; > + pctx->flush_resource = fd_flush_resource; > } > diff --git a/src/gallium/drivers/galahad/glhd_context.c > b/src/gallium/drivers/galahad/glhd_context.c > index ee9de05..3df22ce 100644 > --- a/src/gallium/drivers/galahad/glhd_context.c > +++ b/src/gallium/drivers/galahad/glhd_context.c > @@ -783,6 +783,18 @@ galahad_context_blit(struct pipe_context *_pipe, > } > > static void > +galahad_context_flush_resource(struct pipe_context *_pipe, > + struct pipe_resource *_res) > +{ > + struct galahad_context *glhd_pipe = galahad_context(_pipe); > + struct galahad_resource *glhd_resource_res = galahad_resource(_res); > + struct pipe_context *pipe = glhd_pipe->pipe; > + struct pipe_resource *res = glhd_resource_res->resource; > + > + pipe->flush_resource(pipe, res); > +} > + > +static void > galahad_context_clear(struct pipe_context *_pipe, > unsigned buffers, > const union pipe_color_union *color, > @@ -1096,6 +1108,7 @@ galahad_context_create(struct pipe_screen *_screen, > struct pipe_context *pipe) > GLHD_PIPE_INIT(set_stream_output_targets); > GLHD_PIPE_INIT(resource_copy_region); > GLHD_PIPE_INIT(blit); > + GLHD_PIPE_INIT(flush_resource); > GLHD_PIPE_INIT(clear); > GLHD_PIPE_INIT(clear_render_target); > GLHD_PIPE_INIT(clear_depth_stencil); > diff --git a/src/gallium/drivers/i915/i915_surface.c > b/src/gallium/drivers/i915/i915_surface.c > index b8eef89..48d4857 100644 > --- a/src/gallium/drivers/i915/i915_surface.c > +++ b/src/gallium/drivers/i915/i915_surface.c > @@ -240,6 +240,11 @@ i915_blit(struct pipe_context *pipe, const struct > pipe_blit_info *blit_info) > } > > static void > +i915_flush_resource(struct pipe_context *ctx, struct pipe_resource *resource) > +{ > +} > + > +static void > i915_clear_render_target_blitter(struct pipe_context *pipe, > struct pipe_surface *dst, > const union pipe_color_union *color, > @@ -359,6 +364,7 @@ i915_init_surface_functions(struct i915_context *i915) > i915->base.clear_depth_stencil = i915_clear_depth_stencil_render; > } > i915->base.blit = i915_blit; > + i915->base.flush_resource = i915_flush_resource; > i915->base.create_surface = i915_create_surface; > i915->base.surface_destroy = i915_surface_destroy; > } > diff --git a/src/gallium/drivers/identity/id_context.c > b/src/gallium/drivers/identity/id_context.c > index 6b342eb..6cb7bdf 100644 > --- a/src/gallium/drivers/identity/id_context.c > +++ b/src/gallium/drivers/identity/id_context.c > @@ -649,6 +649,16 @@ identity_blit(struct pipe_context *_pipe, > } > > static void > +identity_flush_resource(struct pipe_context *_pipe, > + struct pipe_resource *resource) > +{ > + struct identity_context *id_pipe = identity_context(_pipe); > + struct pipe_context *pipe = id_pipe->pipe; > + > + pipe->flush_resource(pipe, resource); > +} > + > +static void > identity_clear(struct pipe_context *_pipe, > unsigned buffers, > const union pipe_color_union *color, > @@ -936,6 +946,7 @@ identity_context_create(struct pipe_screen *_screen, > struct pipe_context *pipe) > id_pipe->base.transfer_flush_region = > identity_context_transfer_flush_region; > id_pipe->base.transfer_inline_write = > identity_context_transfer_inline_write; > id_pipe->base.blit = identity_blit; > + id_pipe->base.flush_resource = identity_flush_resource; > > id_pipe->pipe = pipe; > > diff --git a/src/gallium/drivers/ilo/ilo_blit.c > b/src/gallium/drivers/ilo/ilo_blit.c > index ff8e586..6922249 100644 > --- a/src/gallium/drivers/ilo/ilo_blit.c > +++ b/src/gallium/drivers/ilo/ilo_blit.c > @@ -128,6 +128,11 @@ ilo_blit(struct pipe_context *pipe, const struct > pipe_blit_info *info) > ilo_blitter_pipe_blit(ilo->blitter, info); > } > > +static void > +ilo_flush_resource(struct pipe_context *ctx, struct pipe_resource *resource) > +{ > +} > + > /** > * Initialize blit-related functions. > */ > @@ -136,6 +141,7 @@ ilo_init_blit_functions(struct ilo_context *ilo) > { > ilo->base.resource_copy_region = ilo_resource_copy_region; > ilo->base.blit = ilo_blit; > + ilo->base.flush_resource = ilo_flush_resource; > > ilo->base.clear = ilo_clear; > ilo->base.clear_render_target = ilo_clear_render_target; > diff --git a/src/gallium/drivers/llvmpipe/lp_surface.c > b/src/gallium/drivers/llvmpipe/lp_surface.c > index c1eeaf5..f033c46 100644 > --- a/src/gallium/drivers/llvmpipe/lp_surface.c > +++ b/src/gallium/drivers/llvmpipe/lp_surface.c > @@ -233,6 +233,12 @@ static void lp_blit(struct pipe_context *pipe, > } > > > +static void > +lp_flush_resource(struct pipe_context *ctx, struct pipe_resource *resource) > +{ > +} > + > + > static struct pipe_surface * > llvmpipe_create_surface(struct pipe_context *pipe, > struct pipe_resource *pt, > @@ -334,4 +340,5 @@ llvmpipe_init_surface_functions(struct llvmpipe_context > *lp) > /* These two are not actually functions dealing with surfaces */ > lp->pipe.resource_copy_region = lp_resource_copy; > lp->pipe.blit = lp_blit; > + lp->pipe.flush_resource = lp_flush_resource; > } > diff --git a/src/gallium/drivers/noop/noop_pipe.c > b/src/gallium/drivers/noop/noop_pipe.c > index ac837b1..889e95e 100644 > --- a/src/gallium/drivers/noop/noop_pipe.c > +++ b/src/gallium/drivers/noop/noop_pipe.c > @@ -238,6 +238,13 @@ static void noop_blit(struct pipe_context *ctx, > } > > > +static void > +noop_flush_resource(struct pipe_context *ctx, > + struct pipe_resource *resource) > +{ > +} > + > + > /* > * context > */ > @@ -267,6 +274,7 @@ static struct pipe_context *noop_create_context(struct > pipe_screen *screen, void > ctx->clear_depth_stencil = noop_clear_depth_stencil; > ctx->resource_copy_region = noop_resource_copy_region; > ctx->blit = noop_blit; > + ctx->flush_resource = noop_flush_resource; > ctx->create_query = noop_create_query; > ctx->destroy_query = noop_destroy_query; > ctx->begin_query = noop_begin_query; > diff --git a/src/gallium/drivers/nv30/nv30_miptree.c > b/src/gallium/drivers/nv30/nv30_miptree.c > index c038d70..3d1bb54 100644 > --- a/src/gallium/drivers/nv30/nv30_miptree.c > +++ b/src/gallium/drivers/nv30/nv30_miptree.c > @@ -217,6 +217,12 @@ nv30_blit(struct pipe_context *pipe, > util_blitter_blit(nv30->blitter, &info); > } > > +void > +nv30_flush_resource(struct pipe_context *pipe, > + struct pipe_resource *resource) > +{ > +} > + > static void * > nv30_miptree_transfer_map(struct pipe_context *pipe, struct pipe_resource > *pt, > unsigned level, unsigned usage, > diff --git a/src/gallium/drivers/nv30/nv30_resource.c > b/src/gallium/drivers/nv30/nv30_resource.c > index 64a437a..1f87ed1 100644 > --- a/src/gallium/drivers/nv30/nv30_resource.c > +++ b/src/gallium/drivers/nv30/nv30_resource.c > @@ -74,4 +74,5 @@ nv30_resource_init(struct pipe_context *pipe) > pipe->surface_destroy = nv30_miptree_surface_del; > pipe->resource_copy_region = nv30_resource_copy_region; > pipe->blit = nv30_blit; > + pipe->flush_resource = nv30_flush_resource; > } > diff --git a/src/gallium/drivers/nv30/nv30_resource.h > b/src/gallium/drivers/nv30/nv30_resource.h > index fdf62c7..c22ff97 100644 > --- a/src/gallium/drivers/nv30/nv30_resource.h > +++ b/src/gallium/drivers/nv30/nv30_resource.h > @@ -72,4 +72,8 @@ void > nv30_blit(struct pipe_context *pipe, > const struct pipe_blit_info *blit_info); > > +void > +nv30_flush_resource(struct pipe_context *pipe, > + struct pipe_resource *resource); > + > #endif > diff --git a/src/gallium/drivers/nv50/nv50_surface.c > b/src/gallium/drivers/nv50/nv50_surface.c > index 30dab0b..8bb9d65 100644 > --- a/src/gallium/drivers/nv50/nv50_surface.c > +++ b/src/gallium/drivers/nv50/nv50_surface.c > @@ -1288,6 +1288,12 @@ nv50_blit(struct pipe_context *pipe, const struct > pipe_blit_info *info) > nv50_blit_3d(nv50, info); > } > > +static void > +nv50_flush_resource(struct pipe_context *ctx, > + struct pipe_resource *resource) > +{ > +} > + > boolean > nv50_blitter_create(struct nv50_screen *screen) > { > @@ -1348,6 +1354,7 @@ nv50_init_surface_functions(struct nv50_context *nv50) > > pipe->resource_copy_region = nv50_resource_copy_region; > pipe->blit = nv50_blit; > + pipe->flush_resource = nv50_flush_resource; > pipe->clear_render_target = nv50_clear_render_target; > pipe->clear_depth_stencil = nv50_clear_depth_stencil; > } > diff --git a/src/gallium/drivers/nvc0/nvc0_surface.c > b/src/gallium/drivers/nvc0/nvc0_surface.c > index 4ef1a44..3ccb941 100644 > --- a/src/gallium/drivers/nvc0/nvc0_surface.c > +++ b/src/gallium/drivers/nvc0/nvc0_surface.c > @@ -1192,6 +1192,12 @@ nvc0_blit(struct pipe_context *pipe, const struct > pipe_blit_info *info) > NOUVEAU_DRV_STAT(&nvc0->screen->base, tex_blit_count, 1); > } > > +static void > +nvc0_flush_resource(struct pipe_context *ctx, > + struct pipe_resource *resource) > +{ > +} > + > boolean > nvc0_blitter_create(struct nvc0_screen *screen) > { > @@ -1260,6 +1266,7 @@ nvc0_init_surface_functions(struct nvc0_context *nvc0) > > pipe->resource_copy_region = nvc0_resource_copy_region; > pipe->blit = nvc0_blit; > + pipe->flush_resource = nvc0_flush_resource; > pipe->clear_render_target = nvc0_clear_render_target; > pipe->clear_depth_stencil = nvc0_clear_depth_stencil; > } > diff --git a/src/gallium/drivers/r300/r300_blit.c > b/src/gallium/drivers/r300/r300_blit.c > index 7802594..4ec68ae 100644 > --- a/src/gallium/drivers/r300/r300_blit.c > +++ b/src/gallium/drivers/r300/r300_blit.c > @@ -853,6 +853,11 @@ static void r300_blit(struct pipe_context *pipe, > r300_blitter_end(r300); > } > > +static void r300_flush_resource(struct pipe_context *ctx, > + struct pipe_resource *resource) > +{ > +} > + > void r300_init_blit_functions(struct r300_context *r300) > { > r300->context.clear = r300_clear; > @@ -860,4 +865,5 @@ void r300_init_blit_functions(struct r300_context *r300) > r300->context.clear_depth_stencil = r300_clear_depth_stencil; > r300->context.resource_copy_region = r300_resource_copy_region; > r300->context.blit = r300_blit; > + r300->context.flush_resource = r300_flush_resource; > } > diff --git a/src/gallium/drivers/r600/r600_blit.c > b/src/gallium/drivers/r600/r600_blit.c > index 60dda28..f87ce4c 100644 > --- a/src/gallium/drivers/r600/r600_blit.c > +++ b/src/gallium/drivers/r600/r600_blit.c > @@ -900,6 +900,11 @@ static void r600_blit(struct pipe_context *ctx, > r600_blitter_end(ctx); > } > > +static void r600_flush_resource(struct pipe_context *ctx, > + struct pipe_resource *resource) > +{ > +} > + > void r600_init_blit_functions(struct r600_context *rctx) > { > rctx->b.b.clear = r600_clear; > @@ -907,4 +912,5 @@ void r600_init_blit_functions(struct r600_context *rctx) > rctx->b.b.clear_depth_stencil = r600_clear_depth_stencil; > rctx->b.b.resource_copy_region = r600_resource_copy_region; > rctx->b.b.blit = r600_blit; > + rctx->b.b.flush_resource = r600_flush_resource; > } > diff --git a/src/gallium/drivers/radeonsi/r600_blit.c > b/src/gallium/drivers/radeonsi/r600_blit.c > index 20c1767..7a53310 100644 > --- a/src/gallium/drivers/radeonsi/r600_blit.c > +++ b/src/gallium/drivers/radeonsi/r600_blit.c > @@ -720,6 +720,11 @@ static void si_blit(struct pipe_context *ctx, > r600_blitter_end(ctx); > } > > +static void si_flush_resource(struct pipe_context *ctx, > + struct pipe_resource *resource) > +{ > +} > + > void si_init_blit_functions(struct r600_context *rctx) > { > rctx->b.b.clear = r600_clear; > @@ -727,4 +732,5 @@ void si_init_blit_functions(struct r600_context *rctx) > rctx->b.b.clear_depth_stencil = r600_clear_depth_stencil; > rctx->b.b.resource_copy_region = r600_resource_copy_region; > rctx->b.b.blit = si_blit; > + rctx->b.b.flush_resource = si_flush_resource; > } > diff --git a/src/gallium/drivers/rbug/rbug_context.c > b/src/gallium/drivers/rbug/rbug_context.c > index 7214197..a103dfb 100644 > --- a/src/gallium/drivers/rbug/rbug_context.c > +++ b/src/gallium/drivers/rbug/rbug_context.c > @@ -873,6 +873,20 @@ rbug_resource_copy_region(struct pipe_context *_pipe, > } > > static void > +rbug_flush_resource(struct pipe_context *_pipe, > + struct pipe_resource *_res) > +{ > + struct rbug_context *rb_pipe = rbug_context(_pipe); > + struct rbug_resource *rb_resource_res = rbug_resource(_res); > + struct pipe_context *pipe = rb_pipe->pipe; > + struct pipe_resource *res = rb_resource_res->resource; > + > + pipe_mutex_lock(rb_pipe->call_mutex); > + pipe->flush_resource(pipe, res); > + pipe_mutex_unlock(rb_pipe->call_mutex); > +} > + > +static void > rbug_clear(struct pipe_context *_pipe, > unsigned buffers, > const union pipe_color_union *color, > @@ -1181,6 +1195,7 @@ rbug_context_create(struct pipe_screen *_screen, struct > pipe_context *pipe) > rb_pipe->base.set_index_buffer = rbug_set_index_buffer; > rb_pipe->base.set_sample_mask = rbug_set_sample_mask; > rb_pipe->base.resource_copy_region = rbug_resource_copy_region; > + rb_pipe->base.flush_resource = rbug_flush_resource; > rb_pipe->base.clear = rbug_clear; > rb_pipe->base.clear_render_target = rbug_clear_render_target; > rb_pipe->base.clear_depth_stencil = rbug_clear_depth_stencil; > diff --git a/src/gallium/drivers/softpipe/sp_surface.c > b/src/gallium/drivers/softpipe/sp_surface.c > index 9e1523f..41f512d 100644 > --- a/src/gallium/drivers/softpipe/sp_surface.c > +++ b/src/gallium/drivers/softpipe/sp_surface.c > @@ -84,6 +84,12 @@ static void sp_blit(struct pipe_context *pipe, > } > > static void > +sp_flush_resource(struct pipe_context *pipe, > + struct pipe_resource *resource) > +{ > +} > + > +static void > softpipe_clear_render_target(struct pipe_context *pipe, > struct pipe_surface *dst, > const union pipe_color_union *color, > @@ -127,4 +133,5 @@ sp_init_surface_functions(struct softpipe_context *sp) > sp->pipe.clear_render_target = softpipe_clear_render_target; > sp->pipe.clear_depth_stencil = softpipe_clear_depth_stencil; > sp->pipe.blit = sp_blit; > + sp->pipe.flush_resource = sp_flush_resource; > } > diff --git a/src/gallium/drivers/svga/svga_pipe_blit.c > b/src/gallium/drivers/svga/svga_pipe_blit.c > index 05930d0..ff1017c 100644 > --- a/src/gallium/drivers/svga/svga_pipe_blit.c > +++ b/src/gallium/drivers/svga/svga_pipe_blit.c > @@ -211,9 +211,17 @@ static void svga_blit(struct pipe_context *pipe, > } > > > +static void > +svga_flush_resource(struct pipe_context *pipe, > + struct pipe_resource *resource) > +{ > +} > + > + > void > svga_init_blit_functions(struct svga_context *svga) > { > svga->pipe.resource_copy_region = svga_surface_copy; > svga->pipe.blit = svga_blit; > + svga->pipe.flush_resource = svga_flush_resource; > } > diff --git a/src/gallium/drivers/trace/tr_context.c > b/src/gallium/drivers/trace/tr_context.c > index 26df371..fdd5a7a 100644 > --- a/src/gallium/drivers/trace/tr_context.c > +++ b/src/gallium/drivers/trace/tr_context.c > @@ -1206,6 +1206,26 @@ trace_context_blit(struct pipe_context *_pipe, > } > > > +static void > +trace_context_flush_resource(struct pipe_context *_pipe, > + struct pipe_resource *resource) > +{ > + struct trace_context *tr_ctx = trace_context(_pipe); > + struct pipe_context *pipe = tr_ctx->pipe; > + > + resource = trace_resource_unwrap(tr_ctx, resource); > + > + trace_dump_call_begin("pipe_context", "flush_resource"); > + > + trace_dump_arg(ptr, pipe); > + trace_dump_arg(ptr, resource); > + > + pipe->flush_resource(pipe, resource); > + > + trace_dump_call_end(); > +} > + > + > static INLINE void > trace_context_clear(struct pipe_context *_pipe, > unsigned buffers, > @@ -1604,6 +1624,7 @@ trace_context_create(struct trace_screen *tr_scr, > TR_CTX_INIT(set_stream_output_targets); > TR_CTX_INIT(resource_copy_region); > TR_CTX_INIT(blit); > + TR_CTX_INIT(flush_resource); > TR_CTX_INIT(clear); > TR_CTX_INIT(clear_render_target); > TR_CTX_INIT(clear_depth_stencil); > diff --git a/src/gallium/include/pipe/p_context.h > b/src/gallium/include/pipe/p_context.h > index 69352f7..7d09ce4 100644 > --- a/src/gallium/include/pipe/p_context.h > +++ b/src/gallium/include/pipe/p_context.h > @@ -537,6 +537,19 @@ struct pipe_context { > unsigned sample_count, > unsigned sample_index, > float *out_value); > + > + /** > + * Flush the resource cache, so that the resource can be used > + * by an external client. Possible usage: > + * - flushing a resource before presenting it on the screen > + * - flushing a resource if some other process or device wants to use it > + * This shouldn't be used to flush caches if the resource is only managed > + * by a single pipe_screen and is not shared with another process. > + * (i.e. you shouldn't use it to flush caches explicitly if you want to > e.g. > + * use the resource for texturing) > + */ > + void (*flush_resource)(struct pipe_context *ctx, > + struct pipe_resource *resource); > }; > > > diff --git a/src/gallium/state_trackers/dri/common/dri_drawable.c > b/src/gallium/state_trackers/dri/common/dri_drawable.c > index 18d8d89..6e5794d 100644 > --- a/src/gallium/state_trackers/dri/common/dri_drawable.c > +++ b/src/gallium/state_trackers/dri/common/dri_drawable.c > @@ -435,6 +435,8 @@ dri_flush(__DRIcontext *cPriv, > /* Flush the drawable. */ > if ((flags & __DRI2_FLUSH_DRAWABLE) && > drawable->textures[ST_ATTACHMENT_BACK_LEFT]) { > + struct pipe_context *pipe = ctx->st->pipe; > + > if (drawable->stvis.samples > 1 && > reason == __DRI2_THROTTLE_SWAPBUFFER) { > /* Resolve the MSAA back buffer. */ > @@ -455,6 +457,8 @@ dri_flush(__DRIcontext *cPriv, > if (ctx->hud) { > hud_draw(ctx->hud, drawable->textures[ST_ATTACHMENT_BACK_LEFT]); > } > + > + pipe->flush_resource(pipe, > drawable->textures[ST_ATTACHMENT_BACK_LEFT]); > } > > flush_flags = 0; > diff --git a/src/gallium/state_trackers/dri/drm/dri2.c > b/src/gallium/state_trackers/dri/drm/dri2.c > index e4477d6..e884524 100644 > --- a/src/gallium/state_trackers/dri/drm/dri2.c > +++ b/src/gallium/state_trackers/dri/drm/dri2.c > @@ -490,20 +490,24 @@ dri2_flush_frontbuffer(struct dri_context *ctx, > { > __DRIdrawable *dri_drawable = drawable->dPriv; > struct __DRIdri2LoaderExtensionRec *loader = drawable->sPriv->dri2.loader; > + struct pipe_context *pipe = ctx->st->pipe; > > if (statt != ST_ATTACHMENT_FRONT_LEFT) > return; > > if (drawable->stvis.samples > 1) { > - struct pipe_context *pipe = ctx->st->pipe; > - > /* Resolve the front buffer. */ > dri_pipe_blit(ctx->st->pipe, > drawable->textures[ST_ATTACHMENT_FRONT_LEFT], > drawable->msaa_textures[ST_ATTACHMENT_FRONT_LEFT]); > - pipe->flush(pipe, NULL, 0); > } > > + if (drawable->textures[ST_ATTACHMENT_FRONT_LEFT]) { > + pipe->flush_resource(pipe, > drawable->textures[ST_ATTACHMENT_FRONT_LEFT]); > + } > + > + pipe->flush(pipe, NULL, 0); > + > if (loader->flushFrontBuffer) { > loader->flushFrontBuffer(dri_drawable, dri_drawable->loaderPrivate); > } > -- > 1.8.1.2 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev