panfrost: Decode pre/post frame DCDs
authorBoris Brezillon <boris.brezillon@collabora.com>
Wed, 7 Apr 2021 13:31:16 +0000 (15:31 +0200)
committerMarge Bot <eric+marge@anholt.net>
Tue, 13 Apr 2021 18:06:37 +0000 (18:06 +0000)
Bifrost FB descritptors can be attached 3 DCDs describing pre/post frame
operations (pre frames DCDs can be used to preload the tile buffers).
Decode them when mode != NEVER.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10033>

src/panfrost/lib/decode.c

index 2a4f7ef..ca61fbd 100644 (file)
@@ -271,6 +271,11 @@ pandecode_sample_locations(const void *fb, int job_no)
         }
 }
 
+static void
+pandecode_dcd(const struct MALI_DRAW *p,
+              int job_no, enum mali_job_type job_type,
+              char *suffix, bool is_bifrost, unsigned gpu_id);
+
 static struct pandecode_fbd
 pandecode_mfbd_bfr(uint64_t gpu_va, int job_no, bool is_fragment, bool is_bifrost, unsigned gpu_id)
 {
@@ -280,8 +285,31 @@ pandecode_mfbd_bfr(uint64_t gpu_va, int job_no, bool is_fragment, bool is_bifros
 
         struct pandecode_fbd info;
 
-        if (is_bifrost)
+        if (is_bifrost) {
                 pandecode_sample_locations(fb, job_no);
+                pan_section_unpack(fb, MULTI_TARGET_FRAMEBUFFER, BIFROST_PARAMETERS, bparams);
+                unsigned dcd_size = MALI_DRAW_LENGTH + MALI_DRAW_PADDING_LENGTH;
+                if (bparams.pre_frame_0 != MALI_PRE_POST_FRAME_SHADER_MODE_NEVER) {
+                        const void *PANDECODE_PTR_VAR(dcd, mem, bparams.frame_shader_dcds + (0 * dcd_size));
+                        pan_unpack(dcd, DRAW, draw);
+                        pandecode_log("Pre frame 0:\n");
+                        pandecode_dcd(&draw, job_no, MALI_JOB_TYPE_FRAGMENT, "", true, gpu_id);
+                }
+
+                if (bparams.pre_frame_1 != MALI_PRE_POST_FRAME_SHADER_MODE_NEVER) {
+                        const void *PANDECODE_PTR_VAR(dcd, mem, bparams.frame_shader_dcds + (1 * dcd_size));
+                        pan_unpack(dcd, DRAW, draw);
+                        pandecode_log("Pre frame 1:\n");
+                        pandecode_dcd(&draw, job_no, MALI_JOB_TYPE_FRAGMENT, "", true, gpu_id);
+                }
+
+                if (bparams.post_frame != MALI_PRE_POST_FRAME_SHADER_MODE_NEVER) {
+                        const void *PANDECODE_PTR_VAR(dcd, mem, bparams.frame_shader_dcds + (2 * dcd_size));
+                        pan_unpack(dcd, DRAW, draw);
+                        pandecode_log("Post frame:\n");
+                        pandecode_dcd(&draw, job_no, MALI_JOB_TYPE_FRAGMENT, "", true, gpu_id);
+                }
+        }
  
         pandecode_log("Multi-Target Framebuffer:\n");
         pandecode_indent++;
@@ -506,6 +534,7 @@ shader_type_for_job(unsigned type)
         switch (type) {
         case MALI_JOB_TYPE_VERTEX:  return "VERTEX";
         case MALI_JOB_TYPE_TILER:   return "FRAGMENT";
+        case MALI_JOB_TYPE_FRAGMENT: return "FRAGMENT";
         case MALI_JOB_TYPE_COMPUTE: return "COMPUTE";
         default: return "UNKNOWN";
         }
@@ -809,7 +838,7 @@ pandecode_dcd(const struct MALI_DRAW *p,
                 /* MRT blend fields are used whenever MFBD is used, with
                  * per-RT descriptors */
 
-                if (job_type == MALI_JOB_TYPE_TILER &&
+                if ((job_type == MALI_JOB_TYPE_TILER || job_type == MALI_JOB_TYPE_FRAGMENT) &&
                     (is_bifrost || p->fbd & MALI_FBD_TAG_IS_MFBD)) {
                         void* blend_base = ((void *) cl) + MALI_RENDERER_STATE_LENGTH;