lima: move resolve into lima_submit
authorQiang Yu <yuq825@gmail.com>
Tue, 4 Feb 2020 10:24:37 +0000 (18:24 +0800)
committerMarge Bot <eric+marge@anholt.net>
Mon, 17 Feb 2020 02:54:15 +0000 (02:54 +0000)
resolve is preserved across draws.

Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3755>

src/gallium/drivers/lima/lima_context.c
src/gallium/drivers/lima/lima_context.h
src/gallium/drivers/lima/lima_draw.c
src/gallium/drivers/lima/lima_submit.c
src/gallium/drivers/lima/lima_submit.h

index ffa656c6b3f82252f90d13de658bfc5f6dc57264..3093c9b6f0a788749a0575fe581b63925cda18d2 100644 (file)
@@ -108,12 +108,17 @@ lima_invalidate_resource(struct pipe_context *pctx, struct pipe_resource *prsc)
 {
    struct lima_context *ctx = lima_context(pctx);
 
+   struct hash_entry *entry = _mesa_hash_table_search(ctx->write_submits, prsc);
+   if (!entry)
+      return;
+
+   struct lima_submit *submit = entry->data;
    if (ctx->framebuffer.base.zsbuf && (ctx->framebuffer.base.zsbuf->texture == prsc))
-      ctx->resolve &= ~(PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL);
+      submit->resolve &= ~(PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL);
 
    if (ctx->framebuffer.base.nr_cbufs &&
        (ctx->framebuffer.base.cbufs[0]->texture == prsc))
-      ctx->resolve &= ~PIPE_CLEAR_COLOR0;
+      submit->resolve &= ~PIPE_CLEAR_COLOR0;
 }
 
 static void
index 20a143c173b2333cf7550c076db2a5eb3c4fbbf2..35717d22d0f4a760c6330f701c5999eca607f7b9 100644 (file)
@@ -185,8 +185,6 @@ struct lima_context {
       LIMA_CONTEXT_DIRTY_TEXTURES     = (1 << 14),
    } dirty;
 
-   unsigned resolve;
-
    struct u_upload_mgr *uploader;
    struct blitter_context *blitter;
 
index 4afa47ebe8b243be26cf38f086201827b967de67..ae0220bf9ff2644249b304cd9492863fd4493e42 100644 (file)
@@ -67,7 +67,7 @@ lima_update_submit_wb(struct lima_context *ctx, unsigned buffers)
 
    /* add to submit when the buffer is dirty and resolve is clear (not added before) */
    if (fb->base.nr_cbufs && (buffers & PIPE_CLEAR_COLOR0) &&
-       !(ctx->resolve & PIPE_CLEAR_COLOR0)) {
+       !(submit->resolve & PIPE_CLEAR_COLOR0)) {
       struct lima_resource *res = lima_resource(fb->base.cbufs[0]->texture);
       lima_flush_submit_accessing_bo(ctx, res->bo, true);
       _mesa_hash_table_insert(ctx->write_submits, &res->base, submit);
@@ -76,14 +76,14 @@ lima_update_submit_wb(struct lima_context *ctx, unsigned buffers)
 
    /* add to submit when the buffer is dirty and resolve is clear (not added before) */
    if (fb->base.zsbuf && (buffers & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) &&
-       !(ctx->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) {
+       !(submit->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) {
       struct lima_resource *res = lima_resource(fb->base.zsbuf->texture);
       lima_flush_submit_accessing_bo(ctx, res->bo, true);
       _mesa_hash_table_insert(ctx->write_submits, &res->base, submit);
       lima_submit_add_bo(submit, LIMA_PIPE_PP, res->bo, LIMA_SUBMIT_BO_WRITE);
    }
 
-   ctx->resolve |= buffers;
+   submit->resolve |= buffers;
 }
 
 static void
index 33bb6b27364d2e8f66721ab441bda2c64a036182..15f4e01bc9e4bf0115a2b9d8b1a1cea19a4d6f1e 100644 (file)
@@ -82,9 +82,9 @@ lima_submit_free(struct lima_submit *submit)
 
    _mesa_hash_table_remove_key(ctx->submits, &submit->key);
 
-   if (submit->key.cbuf && (ctx->resolve & PIPE_CLEAR_COLOR0))
+   if (submit->key.cbuf && (submit->resolve & PIPE_CLEAR_COLOR0))
       _mesa_hash_table_remove_key(ctx->write_submits, submit->key.cbuf->texture);
-   if (submit->key.zsbuf && (ctx->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)))
+   if (submit->key.zsbuf && (submit->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)))
       _mesa_hash_table_remove_key(ctx->write_submits, submit->key.zsbuf->texture);
 
    pipe_surface_reference(&submit->key.cbuf, NULL);
@@ -242,7 +242,7 @@ lima_submit_get_damage(struct lima_submit *submit)
 {
    struct lima_context *ctx = submit->ctx;
 
-   if (!(ctx->framebuffer.base.nr_cbufs && (ctx->resolve & PIPE_CLEAR_COLOR0)))
+   if (!(ctx->framebuffer.base.nr_cbufs && (submit->resolve & PIPE_CLEAR_COLOR0)))
       return NULL;
 
    struct lima_surface *surf = lima_surface(ctx->framebuffer.base.cbufs[0]);
@@ -256,7 +256,7 @@ lima_fb_need_reload(struct lima_submit *submit)
    struct lima_context *ctx = submit->ctx;
 
    /* Depth buffer is always discarded */
-   if (!(ctx->framebuffer.base.nr_cbufs && (ctx->resolve & PIPE_CLEAR_COLOR0)))
+   if (!(ctx->framebuffer.base.nr_cbufs && (submit->resolve & PIPE_CLEAR_COLOR0)))
       return false;
 
    struct lima_surface *surf = lima_surface(ctx->framebuffer.base.cbufs[0]);
@@ -762,11 +762,11 @@ lima_pack_pp_frame_reg(struct lima_submit *submit, uint32_t *frame_reg,
    frame->blocking = (fb->shift_min << 28) | (fb->shift_h << 16) | fb->shift_w;
    frame->foureight = 0x8888;
 
-   if (fb->base.nr_cbufs && (ctx->resolve & PIPE_CLEAR_COLOR0))
+   if (fb->base.nr_cbufs && (submit->resolve & PIPE_CLEAR_COLOR0))
       lima_pack_wb_cbuf_reg(submit, wb_reg, wb_idx++);
 
    if (fb->base.zsbuf &&
-       (ctx->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)))
+       (submit->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)))
       lima_pack_wb_zsbuf_reg(submit, wb_reg, wb_idx++);
 }
 
@@ -916,7 +916,7 @@ lima_do_submit(struct lima_submit *submit)
 
    ctx->plb_index = (ctx->plb_index + 1) % lima_ctx_num_plb;
 
-   if (ctx->framebuffer.base.nr_cbufs && (ctx->resolve & PIPE_CLEAR_COLOR0)) {
+   if (ctx->framebuffer.base.nr_cbufs && (submit->resolve & PIPE_CLEAR_COLOR0)) {
       /* Set reload flag for next draw. It'll be unset if buffer is cleared */
       struct lima_surface *surf = lima_surface(ctx->framebuffer.base.cbufs[0]);
       surf->reload = true;
@@ -933,9 +933,6 @@ lima_do_submit(struct lima_submit *submit)
       ctx->submit = NULL;
 
    lima_submit_free(submit);
-
-   /* lima_submit_free still need this */
-   ctx->resolve = 0;
 }
 
 void
index 6fe18842cd67c52be4ffc0c5240580aa9926a294..5aafff8bf9a1126b7b067ddb8610bcda23274aec 100644 (file)
@@ -50,6 +50,8 @@ struct lima_submit {
    struct util_dynarray vs_cmd_array;
    struct util_dynarray plbu_cmd_array;
    struct util_dynarray plbu_cmd_head;
+
+   unsigned resolve;
 };
 
 struct lima_submit *lima_submit_get(struct lima_context *ctx);