panfrost: Note "MFBD preload disable" bit
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 14 Aug 2019 23:01:38 +0000 (16:01 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 14 Aug 2019 23:39:57 +0000 (16:39 -0700)
It's a chicken bit, as far as I can tell. Buck buck.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/pan_mfbd.c
src/panfrost/include/panfrost-job.h
src/panfrost/pandecode/decode.c

index 3039ab96ab153e549a781f5b55dddf54ac393483..1f504294bda804b4102a660a80b99a0e308882a7 100644 (file)
@@ -73,7 +73,7 @@ panfrost_mfbd_format(struct pipe_surface *surf)
                 .unk3 = 0x4,
                 .flags = 0x8,
                 .swizzle = panfrost_translate_swizzle_4(swizzle),
-                .unk4 = 0x8
+                .no_preload = true
         };
 
         if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
@@ -424,7 +424,7 @@ panfrost_mfbd_fragment(struct panfrost_context *ctx, bool has_draws)
                 } else {
                         struct mali_rt_format null_rt = {
                                 .unk1 = 0x4000000,
-                                .unk4 = 0x8
+                                .no_preload = true
                         };
 
                         rts[cb].format = null_rt;
index 98d77e718fcbd998967a33b73600377a2e082229..51e9e78b8bd9db3c2f91f560b6544938c7f76d33 100644 (file)
@@ -1482,7 +1482,16 @@ struct mali_rt_format {
 
         unsigned swizzle : 12;
 
-        unsigned unk4 : 4;
+        unsigned zero : 3;
+
+        /* Disables MFBD preload. When this bit is set, the render target will
+         * be cleared every frame. When this bit is clear, the hardware will
+         * automatically wallpaper the render target back from main memory.
+         * Unfortunately, MFBD preload is very broken on Midgard, so in
+         * practice, this is a chicken bit that should always be set.
+         * Discovered by accident, as all good chicken bits are. */
+
+        unsigned no_preload : 1;
 } __attribute__((packed));
 
 struct bifrost_render_target {
index 771383ce86689a355d45b9ed0d9e6bde43c177fb..75fa19712370a5219b8ec1f25c40e625ca727d42 100644 (file)
@@ -652,7 +652,10 @@ pandecode_rt_format(struct mali_rt_format format)
 
         pandecode_swizzle(format.swizzle);
 
-        pandecode_prop("unk4 = 0x%" PRIx32, format.unk4);
+        pandecode_prop("no_preload = 0x%" PRIx32, format.no_preload);
+
+        if (format.zero)
+                pandecode_prop("zero = 0x%" PRIx32, format.zero);
 
         pandecode_indent--;
         pandecode_log("},\n");