asahi: Identify partial render pipeline
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Mon, 9 May 2022 01:03:31 +0000 (21:03 -0400)
committerAlyssa Rosenzweig <alyssa@rosenzweig.io>
Sun, 22 May 2022 21:09:04 +0000 (17:09 -0400)
Needed if a partial render is incurred from overflowing the parameter
buffer (too much geometry).

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16512>

src/asahi/lib/cmdbuf.xml
src/asahi/lib/decode.c
src/gallium/drivers/asahi/agx_pipe.c
src/gallium/drivers/asahi/magic.c
src/gallium/drivers/asahi/magic.h

index 4f7e65c..e8b2b89 100644 (file)
     <field name="Unk 4" start="7:0" size="32" type="hex" default="0xffffffff"/>
     <field name="Unk 5" start="8:0" size="32" type="hex" default="0xffffffff"/>
     <field name="Visibility result buffer" start="10:0" size="64" type="address"/>
-    <field name="Depth clear pipeline bind" start="20:0" size="32" type="hex"/>
-    <field name="Depth clear pipeline unk" start="22:0" size="4" default="4" type="hex"/>
-    <field name="Depth clear pipeline" start="22:4" size="28" type="address" modifier="shr(4)"/>
-    <field name="Depth store pipeline bind" start="28:0" size="32" type="hex"/>
-    <field name="Depth store pipeline unk" start="30:0" size="4" default="4" type="hex"/>
-    <field name="Depth store pipeline" start="30:4" size="28" type="address" modifier="shr(4)"/>
+    <field name="Partial reload pipeline bind" start="20:0" size="32" type="hex"/>
+    <field name="Partial reload pipeline unk" start="22:0" size="4" default="4" type="hex"/>
+    <field name="Partial reload pipeline" start="22:4" size="28" type="address" modifier="shr(4)"/>
+    <field name="Partial store pipeline bind" start="28:0" size="32" type="hex"/>
+    <field name="Partial store pipeline unk" start="30:0" size="4" default="4" type="hex"/>
+    <field name="Partial store pipeline" start="30:4" size="28" type="address" modifier="shr(4)"/>
   </struct>
 
   <struct name="IOGPU Misc" size="288">
index af05178..5acd1c8 100644 (file)
@@ -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();
index 7de453b..c64bf39 100644 (file)
@@ -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,
index 05f93bd..7e00669 100644 (file)
@@ -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) {
index a90595b..1fd3184 100644 (file)
@@ -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,