panfrost: Add checksum fields to SFBD descriptor
authorTomeu Vizoso <tomeu.vizoso@collabora.com>
Fri, 12 Jul 2019 10:38:50 +0000 (12:38 +0200)
committerTomeu Vizoso <tomeu.vizoso@collabora.com>
Wed, 6 Nov 2019 15:17:13 +0000 (16:17 +0100)
During tests on T720, these fields were discovered.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/pan_sfbd.c
src/panfrost/include/panfrost-job.h
src/panfrost/pandecode/decode.c

index b5e18f07045ee5efb7fec70c61406a9a7bae59a0..882c9990a309db7571ec87a065b31a1bca2ca371 100644 (file)
@@ -147,5 +147,17 @@ panfrost_sfbd_fragment(struct panfrost_batch *batch, bool has_draws)
         if (batch->requirements & PAN_REQ_MSAA)
                 fb.format |= MALI_FRAMEBUFFER_MSAA_A | MALI_FRAMEBUFFER_MSAA_B;
 
+        struct pipe_surface *surf = batch->key.cbufs[0];
+        struct panfrost_resource *rsrc = pan_resource(surf->texture);
+        struct panfrost_bo *bo = rsrc->bo;
+
+        if (rsrc->checksummed) {
+                unsigned level = surf->u.tex.level;
+                struct panfrost_slice *slice = &rsrc->slices[level];
+
+                fb.checksum_stride = slice->checksum_stride;
+                fb.checksum = bo->gpu + slice->checksum_offset;
+        }
+
         return panfrost_upload_transient(batch, &fb, sizeof(fb)) | MALI_SFBD;
 }
index 286c663e41e762ad169e18bf30de3150fcee5e49..dba8d3306b087e9c3f4ea029c472ef8e08ffdccd 100644 (file)
@@ -1447,7 +1447,10 @@ struct mali_single_framebuffer {
         u16 width;
         u16 height;
 
-        u32 zero3[8];
+        u32 zero3[4];
+        mali_ptr checksum;
+        u32 checksum_stride;
+        u32 zero5;
 
         /* By default, the framebuffer is upside down from OpenGL's
          * perspective. Set framebuffer to the end and negate the stride to
index a310582ebe853526930a8957f0dc7c1ff1623645..4d3d04248d0a839a021d21e26640e1db1aaaa4e7 100644 (file)
@@ -660,6 +660,11 @@ pandecode_sfbd(uint64_t gpu_va, int job_no, bool is_fragment)
         pandecode_prop("width = MALI_POSITIVE(%" PRId16 ")", info.width);
         pandecode_prop("height = MALI_POSITIVE(%" PRId16 ")", info.height);
 
+        MEMORY_PROP(s, checksum);
+
+        if (s->checksum_stride)
+                pandecode_prop("checksum_stride = %d", s->checksum_stride);
+
         MEMORY_PROP(s, framebuffer);
         pandecode_prop("stride = %d", s->stride);
 
@@ -709,6 +714,7 @@ pandecode_sfbd(uint64_t gpu_va, int job_no, bool is_fragment)
         pandecode_prop("zero1 = 0x%" PRIx64, s->zero1);
         pandecode_prop("zero2 = 0x%" PRIx32, s->zero2);
         pandecode_prop("zero4 = 0x%" PRIx32, s->zero4);
+        pandecode_prop("zero5 = 0x%" PRIx32, s->zero4);
 
         printf(".zero3 = {");