v3d: implement per-sample tlb color reads
authorIago Toral Quiroga <itoral@igalia.com>
Tue, 16 Jul 2019 08:58:12 +0000 (10:58 +0200)
committerIago Toral Quiroga <itoral@igalia.com>
Thu, 18 Jul 2019 06:59:35 +0000 (08:59 +0200)
Reviewed-by: Eric Anholt <eric@anholt.net>
src/broadcom/compiler/nir_to_vir.c

index 45e34c70a49ac37dd28297829eb063e42be7d3b1..256f6a016759add651da23ca9660a661966fd24a 100644 (file)
@@ -1652,7 +1652,7 @@ vir_emit_tlb_color_read(struct v3d_compile *c, nir_intrinsic_instr *instr)
         assert(rt < V3D_MAX_DRAW_BUFFERS);
 
         int sample_index = nir_intrinsic_base(instr) ;
-        assert(sample_index == 0); /* XXX: multisample */
+        assert(sample_index < V3D_MAX_SAMPLES);
 
         int component = nir_intrinsic_component(instr);
         assert(component < 4);
@@ -1678,10 +1678,10 @@ vir_emit_tlb_color_read(struct v3d_compile *c, nir_intrinsic_instr *instr)
                 c->emitted_tlb_load = true;
         }
 
-        struct qreg *color_reads =
+        struct qreg *color_reads_for_sample =
                 &c->color_reads[(rt * V3D_MAX_SAMPLES + sample_index) * 4];
 
-        if (color_reads[component].file == QFILE_NULL) {
+        if (color_reads_for_sample[component].file == QFILE_NULL) {
                 enum pipe_format rt_format = c->fs_key->color_fmt[rt].format;
                 int num_components =
                         util_format_get_nr_components(rt_format);
@@ -1699,8 +1699,11 @@ vir_emit_tlb_color_read(struct v3d_compile *c, nir_intrinsic_instr *instr)
                 bool is_32b_tlb_format = is_int_format ||
                                          (c->fs_key->f32_color_rb & (1 << rt));
 
+                int num_samples = c->fs_key->msaa ? V3D_MAX_SAMPLES : 1;
+
                 uint32_t conf = 0xffffff00;
-                conf |= TLB_SAMPLE_MODE_PER_PIXEL; /* XXX: multisample */
+                conf |= c->fs_key->msaa ? TLB_SAMPLE_MODE_PER_SAMPLE :
+                                          TLB_SAMPLE_MODE_PER_PIXEL;
                 conf |= (7 - rt) << TLB_RENDER_TARGET_SHIFT;
 
                 if (is_32b_tlb_format) {
@@ -1720,47 +1723,57 @@ vir_emit_tlb_color_read(struct v3d_compile *c, nir_intrinsic_instr *instr)
                                 conf |= TLB_VEC_SIZE_2_F16;
                 }
 
-                struct qreg r, g, b, a;
-                if (is_32b_tlb_format) {
-                        r = conf != 0xffffffff ? vir_TLBU_COLOR_READ(c, conf) :
-                                                 vir_TLB_COLOR_READ(c);
+
+                for (int i = 0; i < num_samples; i++) {
+                        struct qreg r, g, b, a;
+                        if (is_32b_tlb_format) {
+                                r = conf != 0xffffffff && i == 0?
+                                        vir_TLBU_COLOR_READ(c, conf) :
+                                        vir_TLB_COLOR_READ(c);
+                                if (num_components >= 2)
+                                        g = vir_TLB_COLOR_READ(c);
+                                if (num_components >= 3)
+                                        b = vir_TLB_COLOR_READ(c);
+                                if (num_components >= 4)
+                                        a = vir_TLB_COLOR_READ(c);
+                        } else {
+                                struct qreg rg = conf != 0xffffffff && i == 0 ?
+                                        vir_TLBU_COLOR_READ(c, conf) :
+                                        vir_TLB_COLOR_READ(c);
+                                r = vir_FMOV(c, rg);
+                                vir_set_unpack(c->defs[r.index], 0,
+                                               V3D_QPU_UNPACK_L);
+                                g = vir_FMOV(c, rg);
+                                vir_set_unpack(c->defs[g.index], 0,
+                                               V3D_QPU_UNPACK_H);
+
+                                if (num_components > 2) {
+                                    struct qreg ba = vir_TLB_COLOR_READ(c);
+                                    b = vir_FMOV(c, ba);
+                                    vir_set_unpack(c->defs[b.index], 0,
+                                                   V3D_QPU_UNPACK_L);
+                                    a = vir_FMOV(c, ba);
+                                    vir_set_unpack(c->defs[a.index], 0,
+                                                   V3D_QPU_UNPACK_H);
+                                }
+                        }
+
+                        struct qreg *color_reads =
+                                &c->color_reads[(rt * V3D_MAX_SAMPLES + i) * 4];
+
+                        color_reads[0] = swap_rb ? b : r;
                         if (num_components >= 2)
-                                g = vir_TLB_COLOR_READ(c);
+                                color_reads[1] = g;
                         if (num_components >= 3)
-                                b = vir_TLB_COLOR_READ(c);
+                                color_reads[2] = swap_rb ? r : b;
                         if (num_components >= 4)
-                                a = vir_TLB_COLOR_READ(c);
-                } else {
-                        struct qreg rg = conf != 0xffffffff ?
-                                vir_TLBU_COLOR_READ(c, conf) :
-                                vir_TLB_COLOR_READ(c);
-                        r = vir_FMOV(c, rg);
-                        vir_set_unpack(c->defs[r.index], 0, V3D_QPU_UNPACK_L);
-                        g = vir_FMOV(c, rg);
-                        vir_set_unpack(c->defs[g.index], 0, V3D_QPU_UNPACK_H);
-
-                        if (num_components > 2) {
-                            struct qreg ba = vir_TLB_COLOR_READ(c);
-                            b = vir_FMOV(c, ba);
-                            vir_set_unpack(c->defs[b.index], 0,
-                                           V3D_QPU_UNPACK_L);
-                            a = vir_FMOV(c, ba);
-                            vir_set_unpack(c->defs[a.index], 0,
-                                           V3D_QPU_UNPACK_H);
-                        }
+                                color_reads[3] = a;
                 }
-
-                color_reads[0] = swap_rb ? b : r;
-                if (num_components >= 2)
-                        color_reads[1] = g;
-                if (num_components >= 3)
-                        color_reads[2] = swap_rb ? r : b;
-                if (num_components >= 4)
-                        color_reads[3] = a;
         }
 
-        assert(color_reads[component].file != QFILE_NULL);
-        ntq_store_dest(c, &instr->dest, 0, vir_MOV(c, color_reads[component]));
+        assert(color_reads_for_sample[component].file != QFILE_NULL);
+        ntq_store_dest(c, &instr->dest, 0,
+                       vir_MOV(c, color_reads_for_sample[component]));
 }
 
 static void