aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2020-03-25 12:47:20 +1000
committerMarge Bot <[email protected]>2020-05-06 06:20:38 +0000
commit94c4577331490693a887916323dee843b69bd141 (patch)
tree8f53291170e8cbcff002a46c35b61fb854829062
parent7898978377cfee74d69180d73118dc6b8b2d3579 (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.c32
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;