diff options
author | Thomas Hellstrom <[email protected]> | 2014-04-08 16:48:51 -0400 |
---|---|---|
committer | Thomas Hellstrom <[email protected]> | 2014-04-17 09:56:28 +0200 |
commit | 09cd376353f534611323da9bedb9b88242b6e4fa (patch) | |
tree | 818dd0de0144377afbb84286309f56d578e177c2 /src/gallium/state_trackers | |
parent | a45ae814d1985bb9e72ba8f5cb73e070d22bd5b6 (diff) |
st/xa: Cache render target surface
Otherwise it will trick the gallium driver into thinking that the render
target has actually changed (due to different pipe_surface pointing to
same underlying pipe_resource). This is really badness for tiling GPUs
like adreno.
This also appears to fix a rendering error with Motif on vmwgfx.
Why that is is still under investigation.
Based on an idea by Rob Clark.
Cc: "10.0 10.1" <[email protected]>
Signed-off-by: Thomas Hellstrom <[email protected]>
Reviewed-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/xa/xa_context.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/gallium/state_trackers/xa/xa_context.c b/src/gallium/state_trackers/xa/xa_context.c index 867999a911b..37de45b8864 100644 --- a/src/gallium/state_trackers/xa/xa_context.c +++ b/src/gallium/state_trackers/xa/xa_context.c @@ -78,6 +78,8 @@ xa_context_destroy(struct xa_context *r) } xa_ctx_sampler_views_destroy(r); + if (r->srf) + pipe_surface_reference(&r->srf, NULL); if (r->cso) { cso_release_all(r->cso); @@ -185,8 +187,15 @@ xa_ctx_srf_create(struct xa_context *ctx, struct xa_surface *dst) struct pipe_screen *screen = ctx->pipe->screen; struct pipe_surface srf_templ; - if (ctx->srf) - return -XA_ERR_INVAL; + /* + * Cache surfaces unless we change render target + */ + if (ctx->srf) { + if (ctx->srf->texture == dst->tex) + return XA_ERR_NONE; + + pipe_surface_reference(&ctx->srf, NULL); + } if (!screen->is_format_supported(screen, dst->tex->format, PIPE_TEXTURE_2D, 0, @@ -204,7 +213,10 @@ xa_ctx_srf_create(struct xa_context *ctx, struct xa_surface *dst) void xa_ctx_srf_destroy(struct xa_context *ctx) { - pipe_surface_reference(&ctx->srf, NULL); + /* + * Cache surfaces unless we change render target. + * Final destruction on context destroy. + */ } XA_EXPORT int |