From 328cc00d39808191529fa359cc21fb935c9acc89 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 24 Mar 2020 11:58:29 -0400 Subject: [PATCH] iris: handle PIPE_CAP_CLEAR_SCISSORED this allows passing scissored clear calls through the driver where it can be handled by a repclear shader fix kwg/mesa#61 Reviewed-by: Kristian H. Kristensen Reviewed-by: Kenneth Graunke Part-of: --- src/gallium/drivers/iris/iris_clear.c | 28 +++++++++++++++----------- src/gallium/drivers/iris/iris_screen.c | 1 + 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/gallium/drivers/iris/iris_clear.c b/src/gallium/drivers/iris/iris_clear.c index 4c3adfdc39f..7e905019bbd 100644 --- a/src/gallium/drivers/iris/iris_clear.c +++ b/src/gallium/drivers/iris/iris_clear.c @@ -646,15 +646,23 @@ iris_clear(struct pipe_context *ctx, assert(buffers != 0); + struct pipe_box box = { + .width = cso_fb->width, + .height = cso_fb->height, + }; + + if (scissor_state) { + box.x = scissor_state->minx; + box.y = scissor_state->miny; + box.width = MIN2(box.width, scissor_state->maxx - scissor_state->minx); + box.height = MIN2(box.height, scissor_state->maxy - scissor_state->miny); + } + if (buffers & PIPE_CLEAR_DEPTHSTENCIL) { struct pipe_surface *psurf = cso_fb->zsbuf; - struct pipe_box box = { - .width = cso_fb->width, - .height = cso_fb->height, - .depth = psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1, - .z = psurf->u.tex.first_layer, - }; + box.depth = psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1; + box.z = psurf->u.tex.first_layer, clear_depth_stencil(ice, psurf->texture, psurf->u.tex.level, &box, true, buffers & PIPE_CLEAR_DEPTH, buffers & PIPE_CLEAR_STENCIL, @@ -669,12 +677,8 @@ iris_clear(struct pipe_context *ctx, if (buffers & (PIPE_CLEAR_COLOR0 << i)) { struct pipe_surface *psurf = cso_fb->cbufs[i]; struct iris_surface *isurf = (void *) psurf; - struct pipe_box box = { - .width = cso_fb->width, - .height = cso_fb->height, - .depth = psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1, - .z = psurf->u.tex.first_layer, - }; + box.depth = psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1, + box.z = psurf->u.tex.first_layer, clear_color(ice, psurf->texture, psurf->u.tex.level, &box, true, isurf->view.format, isurf->view.swizzle, diff --git a/src/gallium/drivers/iris/iris_screen.c b/src/gallium/drivers/iris/iris_screen.c index 10fdcbd6702..7351b1d0027 100644 --- a/src/gallium/drivers/iris/iris_screen.c +++ b/src/gallium/drivers/iris/iris_screen.c @@ -179,6 +179,7 @@ iris_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_TGSI_BALLOT: case PIPE_CAP_MULTISAMPLE_Z_RESOLVE: case PIPE_CAP_CLEAR_TEXTURE: + case PIPE_CAP_CLEAR_SCISSORED: case PIPE_CAP_TGSI_VOTE: case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: case PIPE_CAP_TEXTURE_GATHER_SM5: -- 2.30.2