diff options
author | Dave Airlie <[email protected]> | 2020-03-25 12:47:20 +1000 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-05-06 06:20:38 +0000 |
commit | 94c4577331490693a887916323dee843b69bd141 (patch) | |
tree | 8f53291170e8cbcff002a46c35b61fb854829062 | |
parent | 7898978377cfee74d69180d73118dc6b8b2d3579 (diff) |
drisw: add multisample support to sw dri layer.
This allocates the msaa resources like the dri2 layer
and adds the flushes
Reviewed-by: Roland Scheidegger <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4122>
-rw-r--r-- | src/gallium/state_trackers/dri/drisw.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/gallium/state_trackers/dri/drisw.c b/src/gallium/state_trackers/dri/drisw.c index 1c0f56e042d..4afa69f891d 100644 --- a/src/gallium/state_trackers/dri/drisw.c +++ b/src/gallium/state_trackers/dri/drisw.c @@ -254,6 +254,13 @@ drisw_swap_buffers(__DRIdrawable *dPriv) ctx->st->flush(ctx->st, ST_FLUSH_FRONT, NULL, NULL, NULL); + if (drawable->stvis.samples > 1) { + /* Resolve the back buffer. */ + dri_pipe_blit(ctx->st->pipe, + drawable->textures[ST_ATTACHMENT_BACK_LEFT], + drawable->msaa_textures[ST_ATTACHMENT_BACK_LEFT]); + } + drisw_copy_to_front(dPriv, ptex); } } @@ -292,6 +299,12 @@ drisw_flush_frontbuffer(struct dri_context *ctx, if (!ctx) return; + if (drawable->stvis.samples > 1) { + /* Resolve the front buffer. */ + dri_pipe_blit(ctx->st->pipe, + drawable->textures[ST_ATTACHMENT_FRONT_LEFT], + drawable->msaa_textures[ST_ATTACHMENT_FRONT_LEFT]); + } ptex = drawable->textures[statt]; if (ptex) { @@ -327,8 +340,10 @@ drisw_allocate_textures(struct dri_context *stctx, /* remove outdated textures */ if (resized) { - for (i = 0; i < ST_ATTACHMENT_COUNT; i++) + for (i = 0; i < ST_ATTACHMENT_COUNT; i++) { pipe_resource_reference(&drawable->textures[i], NULL); + pipe_resource_reference(&drawable->msaa_textures[i], NULL); + } } memset(&templ, 0, sizeof(templ)); @@ -358,6 +373,8 @@ drisw_allocate_textures(struct dri_context *stctx, templ.format = format; templ.bind = bind; + templ.nr_samples = 0; + templ.nr_storage_samples = 0; if (statts[i] == ST_ATTACHMENT_FRONT_LEFT && screen->base.screen->resource_create_front && @@ -367,6 +384,19 @@ drisw_allocate_textures(struct dri_context *stctx, } else drawable->textures[statts[i]] = screen->base.screen->resource_create(screen->base.screen, &templ); + + if (drawable->stvis.samples > 1) { + templ.bind = templ.bind & + ~(PIPE_BIND_SCANOUT | PIPE_BIND_SHARED | PIPE_BIND_DISPLAY_TARGET); + templ.nr_samples = drawable->stvis.samples; + templ.nr_storage_samples = drawable->stvis.samples; + drawable->msaa_textures[statts[i]] = + screen->base.screen->resource_create(screen->base.screen, &templ); + + dri_pipe_blit(stctx->st->pipe, + drawable->msaa_textures[statts[i]], + drawable->textures[statts[i]]); + } } drawable->old_w = width; |