radeon: make texture logging more useful
[mesa.git] / src / gallium / drivers / r600 / sb / sb_bc_parser.cpp
index 9f3ecc51cd9c907836124542a59de1577a01b150..67e6c3a582df4535bf48e82fb4d417168cae007e 100644 (file)
@@ -45,8 +45,6 @@ extern "C" {
 
 namespace r600_sb {
 
-using std::cerr;
-
 int bc_parser::decode() {
 
        dw = bc->bytecode;
@@ -72,6 +70,8 @@ int bc_parser::decode() {
        }
 
        sh = new shader(ctx, t, bc->debug_id);
+       sh->safe_math = sb_context::safe_math || (t == TARGET_COMPUTE);
+
        int r = decode_shader();
 
        delete dec;
@@ -111,7 +111,12 @@ int bc_parser::prepare() {
 int bc_parser::parse_decls() {
 
        if (!pshader) {
-               sh->add_gpr_array(0, pshader->bc.ngpr, 0x0F);
+               if (gpr_reladdr)
+                       sh->add_gpr_array(0, bc->ngpr, 0x0F);
+
+               // compute shaders have some values preloaded in R0, R1
+               sh->add_input(0 /* GPR */, true /* preloaded */, 0x0F /* mask */);
+               sh->add_input(1 /* GPR */, true /* preloaded */, 0x0F /* mask */);
                return 0;
        }
 
@@ -194,8 +199,12 @@ int bc_parser::decode_cf(unsigned &i, bool &eop) {
                if ((r = decode_fetch_clause(cf)))
                        return r;;
        } else if (flags & CF_EXP) {
+               if (cf->bc.rw_rel)
+                       gpr_reladdr = true;
                assert(!cf->bc.rw_rel);
        } else if (flags & (CF_STRM | CF_RAT)) {
+               if (cf->bc.rw_rel)
+                       gpr_reladdr = true;
                assert(!cf->bc.rw_rel);
        } else if (flags & CF_BRANCH) {
                if (cf->bc.addr > max_cf)
@@ -259,8 +268,13 @@ int bc_parser::decode_alu_group(cf_node* cf, unsigned &i, unsigned &gcnt) {
        for (node_iterator I = g->begin(), E = g->end(); I != E; ++I) {
                n = static_cast<alu_node*>(*I);
 
+               if (n->bc.dst_rel)
+                       gpr_reladdr = true;
+
                for (int k = 0; k < n->bc.op_ptr->src_count; ++k) {
                        bc_alu_src &src = n->bc.src[k];
+                       if (src.rel)
+                               gpr_reladdr = true;
                        if (src.sel == ALU_SRC_LITERAL) {
                                literal_mask |= (1 << src.chan);
                                src.value.u = dw[i + src.chan];
@@ -371,6 +385,11 @@ int bc_parser::prepare_alu_group(cf_node* cf, alu_group_node *g) {
                        } else if (src.sel == ALU_SRC_PS || src.sel == ALU_SRC_PV) {
                                unsigned pgroup = !cgroup, prev_slot = src.sel == ALU_SRC_PS ?
                                                SLOT_TRANS : src.chan;
+
+                               // XXX shouldn't happen but llvm backend uses PS on cayman
+                               if (prev_slot == SLOT_TRANS && ctx.is_cayman())
+                                       prev_slot = SLOT_X;
+
                                alu_node *prev_alu = slots[pgroup][prev_slot];
 
                                assert(prev_alu);
@@ -485,6 +504,8 @@ int bc_parser::decode_fetch_clause(cf_node* cf) {
                cf->push_back(n);
                if ((r = dec->decode_fetch(i, n->bc)))
                        return r;
+               if (n->bc.src_rel || n->bc.dst_rel)
+                       gpr_reladdr = true;
 
        }
        return 0;
@@ -728,22 +749,22 @@ int bc_parser::prepare_if(cf_node* c) {
        cf_node *c_else = NULL, *end = cf_map[c->bc.addr];
 
        BCP_DUMP(
-               cerr << "parsing JUMP @" << c->bc.id;
-               cerr << "\n";
+               sblog << "parsing JUMP @" << c->bc.id;
+               sblog << "\n";
        );
 
        if (end->bc.op == CF_OP_ELSE) {
                BCP_DUMP(
-                       cerr << "  found ELSE : ";
+                       sblog << "  found ELSE : ";
                        dump::dump_op(end);
-                       cerr << "\n";
+                       sblog << "\n";
                );
 
                c_else = end;
                end = cf_map[c_else->bc.addr];
        } else {
                BCP_DUMP(
-                       cerr << "  no else\n";
+                       sblog << "  no else\n";
                );
 
                c_else = end;