diff --git a/src/asahi/lib/cmdbuf.xml b/src/asahi/lib/cmdbuf.xml index 4f7e65c819291..e8b2b89b18e42 100644 --- a/src/asahi/lib/cmdbuf.xml +++ b/src/asahi/lib/cmdbuf.xml @@ -631,12 +631,12 @@ - - - - - - + + + + + + diff --git a/src/asahi/lib/decode.c b/src/asahi/lib/decode.c index af0517867b29b..5acd1c892f2e7 100644 --- a/src/asahi/lib/decode.c +++ b/src/asahi/lib/decode.c @@ -493,15 +493,15 @@ agxdecode_cmdstream(unsigned cmdbuf_handle, unsigned map_handle, bool verbose) agxdecode_pipeline, verbose); } - assert((clearzs.depth_clear_pipeline_unk & 0xF) == 0x4); - if (clearzs.depth_clear_pipeline) { - agxdecode_stateful(clearzs.depth_clear_pipeline, - "Depth clear pipeline", agxdecode_pipeline, verbose); + assert((clearzs.partial_reload_pipeline_unk & 0xF) == 0x4); + if (clearzs.partial_reload_pipeline) { + agxdecode_stateful(clearzs.partial_reload_pipeline, + "Partial reload pipeline", agxdecode_pipeline, verbose); } - if (clearzs.depth_store_pipeline) { - agxdecode_stateful(clearzs.depth_store_pipeline, - "Depth store pipeline", agxdecode_pipeline, verbose); + if (clearzs.partial_store_pipeline) { + agxdecode_stateful(clearzs.partial_store_pipeline, + "Partial store pipeline", agxdecode_pipeline, verbose); } agxdecode_map_read_write(); diff --git a/src/gallium/drivers/asahi/agx_pipe.c b/src/gallium/drivers/asahi/agx_pipe.c index 7de453b223b83..c64bf396f8576 100644 --- a/src/gallium/drivers/asahi/agx_pipe.c +++ b/src/gallium/drivers/asahi/agx_pipe.c @@ -434,32 +434,34 @@ agx_flush(struct pipe_context *pctx, memcpy(ctx->batch->encoder_current, stop, sizeof(stop)); /* Emit the commandbuffer */ - uint64_t pipeline_clear = 0; + uint64_t pipeline_clear = 0, pipeline_reload = 0; bool clear_pipeline_textures = false; struct agx_device *dev = agx_device(pctx->screen); - if ((ctx->batch->clear & PIPE_CLEAR_COLOR0) || !ctx->batch->cbufs[0]) { - uint16_t clear_colour[4] = { - _mesa_float_to_half(ctx->batch->clear_color[0]), - _mesa_float_to_half(ctx->batch->clear_color[1]), - _mesa_float_to_half(ctx->batch->clear_color[2]), - _mesa_float_to_half(ctx->batch->clear_color[3]) - }; + uint16_t clear_colour[4] = { + _mesa_float_to_half(ctx->batch->clear_color[0]), + _mesa_float_to_half(ctx->batch->clear_color[1]), + _mesa_float_to_half(ctx->batch->clear_color[2]), + _mesa_float_to_half(ctx->batch->clear_color[3]) + }; + pipeline_clear = agx_build_clear_pipeline(ctx, + dev->internal.clear, + agx_pool_upload(&ctx->batch->pool, clear_colour, sizeof(clear_colour))); - pipeline_clear = agx_build_clear_pipeline(ctx, - dev->internal.clear, - agx_pool_upload(&ctx->batch->pool, clear_colour, sizeof(clear_colour))); - } else { + if (ctx->batch->cbufs[0]) { enum pipe_format fmt = ctx->batch->cbufs[0]->format; enum agx_format internal = agx_pixel_format[fmt].internal; uint32_t shader = dev->reload.format[internal]; - pipeline_clear = agx_build_reload_pipeline(ctx, shader, + pipeline_reload = agx_build_reload_pipeline(ctx, shader, ctx->batch->cbufs[0]); + } + if (ctx->batch->cbufs[0] && !(ctx->batch->clear & PIPE_CLEAR_COLOR0)) { clear_pipeline_textures = true; + pipeline_clear = pipeline_reload; } uint64_t pipeline_store = 0; @@ -472,10 +474,6 @@ agx_flush(struct pipe_context *pctx, } /* Pipelines must 64 aligned */ - struct agx_ptr pipeline_null = - agx_pool_alloc_aligned(&ctx->batch->pipeline_pool, 64, 64); - memset(pipeline_null.cpu, 0, 64); - for (unsigned i = 0; i < ctx->batch->nr_cbufs; ++i) { struct agx_resource *rt = agx_resource(ctx->batch->cbufs[i]->texture); BITSET_SET(rt->data_valid, 0); @@ -554,8 +552,8 @@ agx_flush(struct pipe_context *pctx, encoder_id, ctx->batch->scissor.bo->ptr.gpu, ctx->batch->depth_bias.bo->ptr.gpu, - pipeline_null.gpu, pipeline_clear, + pipeline_reload, pipeline_store, clear_pipeline_textures, ctx->batch->clear_depth, diff --git a/src/gallium/drivers/asahi/magic.c b/src/gallium/drivers/asahi/magic.c index 05f93bd09bbcb..7e0066941ef68 100644 --- a/src/gallium/drivers/asahi/magic.c +++ b/src/gallium/drivers/asahi/magic.c @@ -163,8 +163,8 @@ demo_cmdbuf(uint64_t *buf, size_t size, uint64_t encoder_id, uint64_t scissor_ptr, uint64_t depth_bias_ptr, - uint32_t pipeline_null, uint32_t pipeline_clear, + uint32_t pipeline_load, uint32_t pipeline_store, bool clear_pipeline_textures, double clear_depth, @@ -185,6 +185,8 @@ demo_cmdbuf(uint64_t *buf, size_t size, agx_pack(map + 160, IOGPU_INTERNAL_PIPELINES, cfg) { cfg.clear_pipeline_bind = 0xffff8002 | (clear_pipeline_textures ? 0x210 : 0); cfg.clear_pipeline = pipeline_clear; + + /* store pipeline used when entire frame completes */ cfg.store_pipeline_bind = 0x12; cfg.store_pipeline = pipeline_store; cfg.scissor_array = scissor_ptr; @@ -230,11 +232,11 @@ demo_cmdbuf(uint64_t *buf, size_t size, cfg.depth_clear_value = fui(clear_depth); cfg.stencil_clear_value = clear_stencil; - cfg.depth_clear_pipeline_bind = 0xffff8002 | (clear_pipeline_textures ? 0x210 : 0); - cfg.depth_clear_pipeline = pipeline_null; + cfg.partial_reload_pipeline_bind = 0xffff8212; + cfg.partial_reload_pipeline = pipeline_load; - cfg.depth_store_pipeline_bind = 0x12; - cfg.depth_store_pipeline = pipeline_store; + cfg.partial_store_pipeline_bind = 0x12; + cfg.partial_store_pipeline = pipeline_store; } agx_pack(map + 356, IOGPU_MISC, cfg) { diff --git a/src/gallium/drivers/asahi/magic.h b/src/gallium/drivers/asahi/magic.h index a90595b809368..1fd3184f6877e 100644 --- a/src/gallium/drivers/asahi/magic.h +++ b/src/gallium/drivers/asahi/magic.h @@ -32,8 +32,8 @@ demo_cmdbuf(uint64_t *buf, size_t size, uint64_t encoder_id, uint64_t scissor_ptr, uint64_t depth_bias_ptr, - uint32_t pipeline_null, uint32_t pipeline_clear, + uint32_t pipeline_load, uint32_t pipeline_store, bool clear_pipeline_textures, double clear_depth,