r600g/sb: add MEM_RING support
authorDave Airlie <airlied@redhat.com>
Tue, 24 Dec 2013 04:56:25 +0000 (04:56 +0000)
committerDave Airlie <airlied@redhat.com>
Wed, 5 Feb 2014 00:49:37 +0000 (10:49 +1000)
Although we don't use SB on geom shaders, the VS copy shader will use it
so we might as well implement MEM_RING support in sb.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
src/gallium/drivers/r600/sb/sb_bc_dump.cpp
src/gallium/drivers/r600/sb/sb_bc_finalize.cpp
src/gallium/drivers/r600/sb/sb_bc_parser.cpp
src/gallium/drivers/r600/sb/sb_dump.cpp

index f79dff16ee3fee32b4b4916187487896215d6241..1551e6d74f7757ede29f8e40f45ebc25367a4f8d 100644 (file)
@@ -150,6 +150,9 @@ void bc_dump::dump(cf_node& n) {
                if ((n.bc.op_ptr->flags & CF_RAT) && (n.bc.type & 1)) {
                        s << ", @R" << n.bc.index_gpr << ".xyz";
                }
+               if ((n.bc.op_ptr->flags & CF_MEM) && (n.bc.type & 1)) {
+                       s << ", @R" << n.bc.index_gpr << ".x";
+               }
 
                s << "  ES:" << n.bc.elem_size;
 
index d96548322593358f933dc89605380f4f19f6729d..54717f98a159f6865458c01eea0149be7e1cd739 100644 (file)
@@ -695,7 +695,7 @@ void bc_finalizer::finalize_cf(cf_node* c) {
                c->bc.rw_gpr = reg >= 0 ? reg : 0;
                c->bc.comp_mask = mask;
 
-               if ((flags & CF_RAT) && (c->bc.type & 1)) {
+               if (((flags & CF_RAT) || (!(flags & CF_STRM))) && (c->bc.type & 1)) {
 
                        reg = -1;
 
index 24c4854225dbbf6268cddbfd19961d785bb1d39b..7181e27acf07797e4811b87ed120b37bd339cbda 100644 (file)
@@ -209,7 +209,7 @@ int bc_parser::decode_cf(unsigned &i, bool &eop) {
                if (cf->bc.rw_rel)
                        gpr_reladdr = true;
                assert(!cf->bc.rw_rel);
-       } else if (flags & (CF_STRM | CF_RAT)) {
+       } else if (flags & CF_MEM) {
                if (cf->bc.rw_rel)
                        gpr_reladdr = true;
                assert(!cf->bc.rw_rel);
@@ -683,7 +683,7 @@ int bc_parser::prepare_ir() {
                        } while (1);
 
                        c->bc.end_of_program = eop;
-               } else if (flags & (CF_STRM | CF_RAT)) {
+               } else if (flags & CF_MEM) {
 
                        unsigned burst_count = c->bc.burst_count;
                        unsigned eop = c->bc.end_of_program;
@@ -701,7 +701,7 @@ int bc_parser::prepare_ir() {
                                                                sh->get_gpr_value(true, c->bc.rw_gpr, s, false);
                                }
 
-                               if ((flags & CF_RAT) && (c->bc.type & 1)) { // indexed write
+                               if (((flags & CF_RAT) || (!(flags & CF_STRM))) && (c->bc.type & 1)) { // indexed write
                                        c->src.resize(8);
                                        for(int s = 0; s < 3; ++s) {
                                                c->src[4 + s] =
index 7e317abe7a7f5d73da0813b756d2eb18fa7944ea..b2130a48fa61a04b06cce6f5d87b348eada943a1 100644 (file)
@@ -349,7 +349,7 @@ void dump::dump_op(node &n, const char *name) {
                        static const char *exp_type[] = {"PIXEL", "POS  ", "PARAM"};
                        sblog << "  " << exp_type[c->bc.type] << " " << c->bc.array_base;
                        has_dst = false;
-               } else if (c->bc.op_ptr->flags & CF_STRM) {
+               } else if (c->bc.op_ptr->flags & (CF_MEM)) {
                        static const char *exp_type[] = {"WRITE", "WRITE_IND", "WRITE_ACK",
                                        "WRITE_IND_ACK"};
                        sblog << "  " << exp_type[c->bc.type] << " " << c->bc.array_base