Module: Mesa
Branch: master
Commit: 6d138b5f925c07f254e6b35362a157e43f964d5c
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=6d138b5f925c07f254e6b35362a157e43f964d5c

Author: Mike Blumenkrantz <[email protected]>
Date:   Wed Nov  4 09:08:14 2020 -0500

zink: refactor clears a little to track a bitfield of enabled clears on the 
context

this makes the state of 'are there clears pending?' more accessible

Reviewed-by: Dave Airlie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9726>

---

 src/gallium/drivers/zink/zink_clear.c   | 39 +++++++++++++++++++++------------
 src/gallium/drivers/zink/zink_clear.h   | 11 +++-------
 src/gallium/drivers/zink/zink_context.c | 10 ++++-----
 src/gallium/drivers/zink/zink_context.h |  9 ++++++++
 4 files changed, 42 insertions(+), 27 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_clear.c 
b/src/gallium/drivers/zink/zink_clear.c
index eec976758cb..01cd0d1fcc6 100644
--- a/src/gallium/drivers/zink/zink_clear.c
+++ b/src/gallium/drivers/zink/zink_clear.c
@@ -213,7 +213,7 @@ zink_clear(struct pipe_context *pctx,
             struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[i];
             struct zink_framebuffer_clear_data *clear = get_clear_data(ctx, 
fb_clear, needs_rp ? scissor_state : NULL);
 
-            fb_clear->enabled = true;
+            ctx->clears_enabled |= PIPE_CLEAR_COLOR0 << i;
             clear->conditional = ctx->render_condition_active;
             clear->has_scissor = needs_rp;
             if (scissor_state && needs_rp)
@@ -228,7 +228,7 @@ zink_clear(struct pipe_context *pctx,
    if (buffers & PIPE_CLEAR_DEPTHSTENCIL && fb->zsbuf) {
       struct zink_framebuffer_clear *fb_clear = 
&ctx->fb_clears[PIPE_MAX_COLOR_BUFS];
       struct zink_framebuffer_clear_data *clear = get_clear_data(ctx, 
fb_clear, needs_rp ? scissor_state : NULL);
-      fb_clear->enabled = true;
+      ctx->clears_enabled |= PIPE_CLEAR_DEPTHSTENCIL;
       clear->conditional = ctx->render_condition_active;
       clear->has_scissor = needs_rp;
       if (scissor_state && needs_rp)
@@ -286,6 +286,7 @@ zink_clear_framebuffer(struct zink_context *ctx, unsigned 
clear_buffers)
          clear_buffers &= ~(PIPE_CLEAR_COLOR0 << i);
          to_clear |= (PIPE_CLEAR_COLOR0 << i);
       }
+      clear_buffers &= ~PIPE_CLEAR_COLOR;
       if (clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) {
          struct zink_framebuffer_clear *fb_clear = 
&ctx->fb_clears[PIPE_MAX_COLOR_BUFS];
          if (color_clear) {
@@ -336,7 +337,7 @@ out:
       to_clear = 0;
    }
    for (int i = 0; i < ARRAY_SIZE(ctx->fb_clears); i++)
-       zink_fb_clear_reset(&ctx->fb_clears[i]);
+       zink_fb_clear_reset(ctx, i);
 }
 
 static struct pipe_surface *
@@ -448,7 +449,7 @@ fb_clears_apply_internal(struct zink_context *ctx, struct 
pipe_resource *pres, i
 {
    struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[i];
 
-   if (!fb_clear->enabled)
+   if (!zink_fb_clear_enabled(ctx, i))
       return;
    if (zink_resource(pres)->aspect == VK_IMAGE_ASPECT_COLOR_BIT) {
       assert(!zink_batch_g(ctx)->in_rp);
@@ -465,7 +466,7 @@ fb_clears_apply_internal(struct zink_context *ctx, struct 
pipe_resource *pres, i
                                 psurf->u.tex.level, psurf->u.tex.first_layer,
                                 psurf->u.tex.last_layer - 
psurf->u.tex.first_layer + 1);
       }
-      zink_fb_clear_reset(&ctx->fb_clears[i]);
+      zink_fb_clear_reset(ctx, i);
       return;
    } else {
       assert(!zink_batch_g(ctx)->in_rp);
@@ -485,7 +486,17 @@ fb_clears_apply_internal(struct zink_context *ctx, struct 
pipe_resource *pres, i
                              psurf->u.tex.last_layer - 
psurf->u.tex.first_layer + 1);
       }
    }
-   zink_fb_clear_reset(fb_clear);
+   zink_fb_clear_reset(ctx, i);
+}
+
+void
+zink_fb_clear_reset(struct zink_context *ctx, unsigned i)
+{
+   util_dynarray_fini(&ctx->fb_clears[i].clears);
+   if (i == PIPE_MAX_COLOR_BUFS)
+      ctx->clears_enabled &= ~PIPE_CLEAR_DEPTHSTENCIL;
+   else
+      ctx->clears_enabled &= ~(PIPE_CLEAR_COLOR0 << i);
 }
 
 void
@@ -511,16 +522,16 @@ zink_fb_clears_discard(struct zink_context *ctx, struct 
pipe_resource *pres)
    if (zink_resource(pres)->aspect == VK_IMAGE_ASPECT_COLOR_BIT) {
       for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) {
          if (ctx->fb_state.cbufs[i] && ctx->fb_state.cbufs[i]->texture == 
pres) {
-            if (ctx->fb_clears[i].enabled) {
-               zink_fb_clear_reset(&ctx->fb_clears[i]);
+            if (zink_fb_clear_enabled(ctx, i)) {
+               zink_fb_clear_reset(ctx, i);
                return;
             }
          }
       }
    } else {
-      if (ctx->fb_clears[PIPE_MAX_COLOR_BUFS].enabled && ctx->fb_state.zsbuf 
&& ctx->fb_state.zsbuf->texture == pres) {
+      if (zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS) && 
ctx->fb_state.zsbuf && ctx->fb_state.zsbuf->texture == pres) {
          int i = PIPE_MAX_COLOR_BUFS;
-         zink_fb_clear_reset(&ctx->fb_clears[i]);
+         zink_fb_clear_reset(ctx, i);
       }
    }
 }
@@ -530,7 +541,7 @@ zink_clear_apply_conditionals(struct zink_context *ctx)
 {
    for (int i = 0; i < ARRAY_SIZE(ctx->fb_clears); i++) {
       struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[i];
-      if (!fb_clear->enabled)
+      if (!zink_fb_clear_enabled(ctx, i))
          continue;
       for (int j = 0; j < zink_fb_clear_count(fb_clear); j++) {
          struct zink_framebuffer_clear_data *clear = 
zink_fb_clear_element(fb_clear, j);
@@ -543,7 +554,7 @@ zink_clear_apply_conditionals(struct zink_context *ctx)
             if (surf)
                fb_clears_apply_internal(ctx, surf->texture, i);
             else
-               zink_fb_clear_reset(&ctx->fb_clears[i]);
+               zink_fb_clear_reset(ctx, i);
             break;
          }
       }
@@ -554,7 +565,7 @@ static void
 fb_clears_apply_or_discard_internal(struct zink_context *ctx, struct 
pipe_resource *pres, struct u_rect region, bool discard_only, bool invert, int 
i)
 {
    struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[i];
-   if (fb_clear->enabled) {
+   if (zink_fb_clear_enabled(ctx, i)) {
       if (zink_blit_region_fills(region, pres->width0, pres->height0)) {
          if (invert)
             fb_clears_apply_internal(ctx, pres, i);
@@ -591,7 +602,7 @@ zink_fb_clears_apply_or_discard(struct zink_context *ctx, 
struct pipe_resource *
          }
       }
    }  else {
-      if (ctx->fb_clears[PIPE_MAX_COLOR_BUFS].enabled && ctx->fb_state.zsbuf 
&& ctx->fb_state.zsbuf->texture == pres) {
+      if (zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS) && 
ctx->fb_state.zsbuf && ctx->fb_state.zsbuf->texture == pres) {
          fb_clears_apply_or_discard_internal(ctx, pres, region, discard_only, 
false, PIPE_MAX_COLOR_BUFS);
       }
    }
diff --git a/src/gallium/drivers/zink/zink_clear.h 
b/src/gallium/drivers/zink/zink_clear.h
index d024fcdd378..b32c03ba6c7 100644
--- a/src/gallium/drivers/zink/zink_clear.h
+++ b/src/gallium/drivers/zink/zink_clear.h
@@ -51,7 +51,6 @@ struct zink_framebuffer_clear_data {
 
 struct zink_framebuffer_clear {
    struct util_dynarray clears;
-   bool enabled;
 };
 
 void
@@ -85,15 +84,11 @@ zink_fb_clear_element(struct zink_framebuffer_clear 
*fb_clear, int idx)
 static inline unsigned
 zink_fb_clear_count(struct zink_framebuffer_clear *fb_clear)
 {
-   return util_dynarray_num_elements(&fb_clear->clears, struct 
zink_framebuffer_clear_data);
+   return fb_clear ? util_dynarray_num_elements(&fb_clear->clears, struct 
zink_framebuffer_clear_data) : 0;
 }
 
-static inline void
-zink_fb_clear_reset(struct zink_framebuffer_clear *fb_clear)
-{
-   util_dynarray_fini(&fb_clear->clears);
-   fb_clear->enabled = false;
-}
+void
+zink_fb_clear_reset(struct zink_context *ctx, unsigned idx);
 
 static inline bool
 zink_fb_clear_element_needs_explicit(struct zink_framebuffer_clear_data *clear)
diff --git a/src/gallium/drivers/zink/zink_context.c 
b/src/gallium/drivers/zink/zink_context.c
index 2fd687324b1..f12f4df7830 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -1129,7 +1129,7 @@ get_render_pass(struct zink_context *ctx)
          state.rts[i].format = zink_get_format(screen, surf->format);
          state.rts[i].samples = surf->texture->nr_samples > 0 ? 
surf->texture->nr_samples :
                                                        VK_SAMPLE_COUNT_1_BIT;
-         state.rts[i].clear_color = ctx->fb_clears[i].enabled && 
!zink_fb_clear_first_needs_explicit(&ctx->fb_clears[i]);
+         state.rts[i].clear_color = zink_fb_clear_enabled(ctx, i) && 
!zink_fb_clear_first_needs_explicit(&ctx->fb_clears[i]);
          clears |= !!state.rts[i].clear_color ? BITFIELD_BIT(i) : 0;
       } else {
          state.rts[i].format = VK_FORMAT_R8_UINT;
@@ -1144,10 +1144,10 @@ get_render_pass(struct zink_context *ctx)
       struct zink_framebuffer_clear *fb_clear = 
&ctx->fb_clears[PIPE_MAX_COLOR_BUFS];
       state.rts[fb->nr_cbufs].format = zsbuf->format;
       state.rts[fb->nr_cbufs].samples = zsbuf->base.nr_samples > 0 ? 
zsbuf->base.nr_samples : VK_SAMPLE_COUNT_1_BIT;
-      state.rts[fb->nr_cbufs].clear_color = fb_clear->enabled &&
+      state.rts[fb->nr_cbufs].clear_color = zink_fb_clear_enabled(ctx, 
PIPE_MAX_COLOR_BUFS) &&
                                             
!zink_fb_clear_first_needs_explicit(fb_clear) &&
                                             (zink_fb_clear_element(fb_clear, 
0)->zs.bits & PIPE_CLEAR_DEPTH);
-      state.rts[fb->nr_cbufs].clear_stencil = fb_clear->enabled &&
+      state.rts[fb->nr_cbufs].clear_stencil = zink_fb_clear_enabled(ctx, 
PIPE_MAX_COLOR_BUFS) &&
                                               
!zink_fb_clear_first_needs_explicit(fb_clear) &&
                                               (zink_fb_clear_element(fb_clear, 
0)->zs.bits & PIPE_CLEAR_STENCIL);
       clears |= state.rts[fb->nr_cbufs].clear_color || 
state.rts[fb->nr_cbufs].clear_stencil ? BITFIELD_BIT(fb->nr_cbufs) : 0;;
@@ -1269,7 +1269,7 @@ zink_begin_render_pass(struct zink_context *ctx, struct 
zink_batch *batch)
    uint32_t clear_validate = 0;
    for (int i = 0; i < fb_state->nr_cbufs; i++) {
       /* these are no-ops */
-      if (!fb_state->cbufs[i] || !ctx->fb_clears[i].enabled)
+      if (!fb_state->cbufs[i] || !zink_fb_clear_enabled(ctx, i))
          continue;
       /* these need actual clear calls inside the rp */
       struct zink_framebuffer_clear_data *clear = 
zink_fb_clear_element(&ctx->fb_clears[i], 0);
@@ -1285,7 +1285,7 @@ zink_begin_render_pass(struct zink_context *ctx, struct 
zink_batch *batch)
       clear_validate |= BITFIELD_BIT(i);
       assert(ctx->framebuffer->rp->state.clears);
    }
-   if (fb_state->zsbuf && ctx->fb_clears[PIPE_MAX_COLOR_BUFS].enabled) {
+   if (fb_state->zsbuf && zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS)) {
       struct zink_framebuffer_clear *fb_clear = 
&ctx->fb_clears[PIPE_MAX_COLOR_BUFS];
       struct zink_framebuffer_clear_data *clear = 
zink_fb_clear_element(fb_clear, 0);
       if (!zink_fb_clear_element_needs_explicit(clear)) {
diff --git a/src/gallium/drivers/zink/zink_context.h 
b/src/gallium/drivers/zink/zink_context.h
index 3a192bd6ff2..84f0dc38084 100644
--- a/src/gallium/drivers/zink/zink_context.h
+++ b/src/gallium/drivers/zink/zink_context.h
@@ -182,6 +182,7 @@ struct zink_context {
 
    struct zink_framebuffer *framebuffer;
    struct zink_framebuffer_clear fb_clears[PIPE_MAX_COLOR_BUFS + 1];
+   uint16_t clears_enabled;
 
    struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS];
 
@@ -229,6 +230,14 @@ zink_context(struct pipe_context *context)
    return (struct zink_context *)context;
 }
 
+static inline bool
+zink_fb_clear_enabled(const struct zink_context *ctx, unsigned idx)
+{
+   if (idx == PIPE_MAX_COLOR_BUFS)
+      return ctx->clears_enabled & PIPE_CLEAR_DEPTHSTENCIL;
+   return ctx->clears_enabled & (PIPE_CLEAR_COLOR0 << idx);
+}
+
 static inline struct zink_batch *
 zink_batch_queue(struct zink_context *ctx, enum zink_queue queue_type)
 {

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to