panfrost: Set rt_count
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 18 Jul 2019 19:43:39 +0000 (12:43 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 18 Jul 2019 22:25:40 +0000 (15:25 -0700)
This doesn't quite work yet, but it illustrates how MRT is implemented
in the MFBD: rt_count is set appropriately based on the number of render
targets, while additional render target descriptors are appended on with
an index variable in them (not quite decoded since there's some aspects
we don't understand there, but conceptually this should be right).

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

index 68d74224d071ad25dbc1664cdb332a6c328e4103..26e7fca1d2f542c919cbb7d9b03138e1f3162022 100644 (file)
@@ -165,8 +165,7 @@ panfrost_emit_mfbd(struct panfrost_context *ctx, unsigned vertex_count)
 
                 .unk1 = 0x1080,
 
-                /* TODO: MRT */
-                .rt_count_1 = MALI_POSITIVE(1),
+                .rt_count_1 = MALI_POSITIVE(ctx->pipe_framebuffer.nr_cbufs),
                 .rt_count_2 = 4,
 
                 .unknown2 = 0x1f,
index bbaa9f29414467b7a5a42fbe4a33926f1539644c..3039ab96ab153e549a781f5b55dddf54ac393483 100644 (file)
@@ -394,17 +394,18 @@ panfrost_mfbd_fragment(struct panfrost_context *ctx, bool has_draws)
         struct bifrost_fb_extra fbx = {};
         struct bifrost_render_target rts[4] = {};
 
-        /* XXX: MRT case */
-        fb.rt_count_2 = 1;
+        /* We always upload at least one dummy GL_NONE render target */
+
+        unsigned rt_descriptors =
+                MAX2(ctx->pipe_framebuffer.nr_cbufs, 1);
+
+        fb.rt_count_1 = MALI_POSITIVE(rt_descriptors);
+        fb.rt_count_2 = rt_descriptors;
         fb.mfbd_flags = 0x100;
 
         /* TODO: MRT clear */
         panfrost_mfbd_clear(job, &fb, &fbx, rts, fb.rt_count_2);
 
-        /* We always upload at least one dummy GL_NONE render target */
-
-        unsigned rt_descriptors =
-                MAX2(ctx->pipe_framebuffer.nr_cbufs, 1);
 
         /* Upload either the render target or a dummy GL_NONE target */
 
@@ -430,6 +431,9 @@ panfrost_mfbd_fragment(struct panfrost_context *ctx, bool has_draws)
                         rts[cb].framebuffer = 0;
                         rts[cb].framebuffer_stride = 0;
                 }
+
+                /* TODO: Break out the field */
+                rts[cb].format.unk1 |= (cb * 0x400);
         }
 
         if (ctx->pipe_framebuffer.zsbuf) {