r600g/sb: fix allocation of indirectly addressed input arrays
Some inputs may be preloaded into predefined GPRs, so we can't reallocate arrays with such inputs. Fixes issues with webgl demo: http://oos.moxiecode.com/js_webgl/snake/ Signed-off-by: Vadim Girlin <vadimgirlin@gmail.com>
This commit is contained in:
@@ -345,13 +345,17 @@ void coalescer::init_reg_bitset(sb_bitset &bs, val_set &vs) {
|
||||
for (val_set::iterator I = vs.begin(sh), E = vs.end(sh); I != E; ++I) {
|
||||
value *v = *I;
|
||||
|
||||
if (!v->is_sgpr())
|
||||
if (!v->is_any_gpr())
|
||||
continue;
|
||||
|
||||
if (v->gpr) {
|
||||
if (v->gpr >= bs.size())
|
||||
bs.resize(v->gpr + 64);
|
||||
bs.set(v->gpr, 1);
|
||||
unsigned gpr = v->get_final_gpr();
|
||||
if (!gpr)
|
||||
continue;
|
||||
|
||||
if (gpr) {
|
||||
if (gpr >= bs.size())
|
||||
bs.resize(gpr + 64);
|
||||
bs.set(gpr, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -244,6 +244,12 @@ void ra_init::alloc_arrays() {
|
||||
cerr << "\n";
|
||||
);
|
||||
|
||||
// skip preallocated arrays (e.g. with preloaded inputs)
|
||||
if (a->gpr) {
|
||||
RA_DUMP( cerr << " FIXED at " << a->gpr << "\n"; );
|
||||
continue;
|
||||
}
|
||||
|
||||
bool dead = a->is_dead();
|
||||
|
||||
if (dead) {
|
||||
|
@@ -61,7 +61,7 @@ bool shader::assign_slot(alu_node* n, alu_node *slots[5]) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void shader::add_gpr_values(vvec& vec, unsigned gpr, unsigned comp_mask,
|
||||
void shader::add_pinned_gpr_values(vvec& vec, unsigned gpr, unsigned comp_mask,
|
||||
bool src) {
|
||||
unsigned chan = 0;
|
||||
while (comp_mask) {
|
||||
@@ -72,6 +72,11 @@ void shader::add_gpr_values(vvec& vec, unsigned gpr, unsigned comp_mask,
|
||||
v->gpr = v->pin_gpr = v->select;
|
||||
v->fix();
|
||||
}
|
||||
if (v->array && !v->array->gpr) {
|
||||
// if pinned value can be accessed with indirect addressing
|
||||
// pin the entire array to its original location
|
||||
v->array->gpr = v->array->base_gpr;
|
||||
}
|
||||
vec.push_back(v);
|
||||
}
|
||||
comp_mask >>= 1;
|
||||
@@ -199,7 +204,7 @@ void shader::add_input(unsigned gpr, bool preloaded, unsigned comp_mask) {
|
||||
i.comp_mask = comp_mask;
|
||||
|
||||
if (preloaded) {
|
||||
add_gpr_values(root->dst, gpr, comp_mask, true);
|
||||
add_pinned_gpr_values(root->dst, gpr, comp_mask, true);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -217,9 +222,9 @@ void shader::init_call_fs(cf_node* cf) {
|
||||
for(inputs_vec::const_iterator I = inputs.begin(),
|
||||
E = inputs.end(); I != E; ++I, ++gpr) {
|
||||
if (!I->preloaded)
|
||||
add_gpr_values(cf->dst, gpr, I->comp_mask, false);
|
||||
add_pinned_gpr_values(cf->dst, gpr, I->comp_mask, false);
|
||||
else
|
||||
add_gpr_values(cf->src, gpr, I->comp_mask, true);
|
||||
add_pinned_gpr_values(cf->src, gpr, I->comp_mask, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -315,7 +315,7 @@ public:
|
||||
value* get_value_version(value* v, unsigned ver);
|
||||
|
||||
void init();
|
||||
void add_gpr_values(vvec& vec, unsigned gpr, unsigned comp_mask, bool src);
|
||||
void add_pinned_gpr_values(vvec& vec, unsigned gpr, unsigned comp_mask, bool src);
|
||||
|
||||
void dump_ir();
|
||||
|
||||
|
Reference in New Issue
Block a user