panfrost/mfbd: Include codes for float framebuffers
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 1 Jul 2019 16:44:40 +0000 (09:44 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 10 Jul 2019 13:12:03 +0000 (06:12 -0700)
We see the hardware doesn't actually support float framebuffers in the
native sense -- rather, it just allows higher bpp framebuffers and lets
a blend shader / additional clear_color fields sort out the formats.
This will be.. interesting.

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

index b435d20b7582da2d09d19f6866e5429be9c65d27..72f938713b181014d6e6fb68f6007ac85106e462 100644 (file)
@@ -81,14 +81,41 @@ panfrost_mfbd_format(struct pipe_surface *surf)
 
         /* Set flags for alternative formats */
 
+        bool float_16 =
+                surf->format == PIPE_FORMAT_R16_FLOAT;
+
+        bool float_32 =
+                surf->format == PIPE_FORMAT_R11G11B10_FLOAT ||
+                surf->format == PIPE_FORMAT_R32_FLOAT ||
+                surf->format == PIPE_FORMAT_R16G16_FLOAT;
+
+        bool float_64 =
+                surf->format == PIPE_FORMAT_R32G32_FLOAT ||
+                surf->format == PIPE_FORMAT_R16G16B16A16_FLOAT;
+
+        bool float_128 =
+                surf->format == PIPE_FORMAT_R32G32B32A32_FLOAT;
+
         if (surf->format == PIPE_FORMAT_B5G6R5_UNORM) {
                 fmt.unk1 = 0x14000000;
                 fmt.nr_channels = MALI_POSITIVE(2);
                 fmt.unk3 |= 0x1;
-        } else if (surf->format == PIPE_FORMAT_R11G11B10_FLOAT) {
+        } else if (float_32) {
                 fmt.unk1 = 0x88000000;
                 fmt.unk3 = 0x0;
                 fmt.nr_channels = MALI_POSITIVE(4);
+        } else if (float_16) {
+                fmt.unk1 = 0x84000000;
+                fmt.unk3 = 0x0;
+                fmt.nr_channels = MALI_POSITIVE(2);
+        } else if (float_64) {
+                fmt.unk1 = 0x8c000000;
+                fmt.unk3 = 0x1;
+                fmt.nr_channels = MALI_POSITIVE(2);
+        } else if (float_128) {
+                fmt.unk1 = 0x90000000;
+                fmt.unk3 = 0x1;
+                fmt.nr_channels = MALI_POSITIVE(4);
         }
 
         return fmt;