r600/sfn: Fix splitting constants that come from different kcache banks.
authorGert Wollny <gert.wollny@collabora.com>
Sat, 16 May 2020 18:39:45 +0000 (20:39 +0200)
committerMarge Bot <eric+marge@anholt.net>
Tue, 19 May 2020 07:52:14 +0000 (07:52 +0000)
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5085>

src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp

index 35da6d4ef4d8a5e0500416a47638df56c163df24..e63fa973c178d50be25a06bbcf8b47209c31135e 100644 (file)
@@ -191,13 +191,13 @@ void EmitAluInstruction::split_constants(const nir_alu_instr& instr)
        return;
 
     int nconst = 0;
-    std::array<PValue,4> c;
+    std::array<const UniformValue *,4> c;
     std::array<int,4> idx;
     for (unsigned i = 0; i < op_info->num_inputs; ++i) {
        PValue src = from_nir(instr.src[i], 0);
        assert(src);
        if (src->type() == Value::kconst) {
-          c[nconst] = src;
+          c[nconst] = static_cast<const UniformValue *>(src.get());
 
           idx[nconst++] = i;
        }
@@ -206,11 +206,12 @@ void EmitAluInstruction::split_constants(const nir_alu_instr& instr)
        return;
 
     unsigned sel = c[0]->sel();
+    unsigned kcache =  c[0]->kcache_bank();
     sfn_log << SfnLog::reg << "split " << nconst << " constants, sel[0] = " << sel; ;
 
     for (int i = 1; i < nconst; ++i) {
        sfn_log << "sel[" << i << "] = " <<  c[i]->sel() << "\n";
-       if (c[i]->sel() != sel) {
+       if (c[i]->sel() != sel || c[i]->kcache_bank() != kcache) {
           load_uniform(instr.src[idx[i]]);
        }
     }