#include "sb_bc.h"
#include "sb_shader.h"
-
#include "sb_pass.h"
namespace r600_sb {
-using std::cerr;
-
-shader::shader(sb_context &sctx, shader_target t, unsigned id, bool dump)
+shader::shader(sb_context &sctx, shader_target t, unsigned id)
: ctx(sctx), next_temp_value_index(temp_regid_offset),
prep_regs_count(), pred_sels(),
regions(), inputs(), undef(), val_pool(sizeof(value)),
- pool(), all_nodes(), src_stats(), opt_stats(), errors(), enable_dump(dump),
+ pool(), all_nodes(), src_stats(), opt_stats(), errors(),
optimized(), id(id),
coal(*this), bbs(),
target(t), vt(ex), ex(*this), root(),
compute_interferences(),
- has_alu_predication(), uses_gradients(), ngpr(), nstack() {}
+ has_alu_predication(), uses_gradients(), safe_math(), ngpr(), nstack() {}
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) {
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;
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);
}
}
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);
}
}
for (node_vec::iterator I = all_nodes.begin(), E = all_nodes.end();
I != E; ++I)
(*I)->~node();
+
+ for (gpr_array_vec::iterator I = gpr_arrays.begin(), E = gpr_arrays.end();
+ I != E; ++I) {
+ delete *I;
+ }
}
void shader::dump_ir() {
gpr_array *a = new gpr_array(
sel_chan(gpr_start, chan), gpr_count);
- SB_DUMP_PASS( cerr << "add_gpr_array: @" << a->base_gpr
+ SB_DUMP_PASS( sblog << "add_gpr_array: @" << a->base_gpr
<< " [" << a->array_size << "]\n";
);
std::string shader::get_full_target_name() {
std::string s = get_shader_target_name();
s += "/";
- s += get_hw_chip_name();
+ s += ctx.get_hw_chip_name();
s += "/";
- s += get_hw_class_name();
+ s += ctx.get_hw_class_name();
return s;
}
-const char* shader::get_hw_class_name() {
- switch (ctx.hw_class) {
-#define TRANSLATE_HW_CLASS(c) case HW_CLASS_##c: return #c
- TRANSLATE_HW_CLASS(R600);
- TRANSLATE_HW_CLASS(R700);
- TRANSLATE_HW_CLASS(EVERGREEN);
- TRANSLATE_HW_CLASS(CAYMAN);
-#undef TRANSLATE_HW_CLASS
- default:
- return "INVALID_CHIP_CLASS";
- }
-}
-
-const char* shader::get_hw_chip_name() {
- switch (ctx.hw_chip) {
-#define TRANSLATE_CHIP(c) case HW_CHIP_##c: return #c
- TRANSLATE_CHIP(R600);
- TRANSLATE_CHIP(RV610);
- TRANSLATE_CHIP(RV630);
- TRANSLATE_CHIP(RV670);
- TRANSLATE_CHIP(RV620);
- TRANSLATE_CHIP(RV635);
- TRANSLATE_CHIP(RS780);
- TRANSLATE_CHIP(RS880);
- TRANSLATE_CHIP(RV770);
- TRANSLATE_CHIP(RV730);
- TRANSLATE_CHIP(RV710);
- TRANSLATE_CHIP(RV740);
- TRANSLATE_CHIP(CEDAR);
- TRANSLATE_CHIP(REDWOOD);
- TRANSLATE_CHIP(JUNIPER);
- TRANSLATE_CHIP(CYPRESS);
- TRANSLATE_CHIP(HEMLOCK);
- TRANSLATE_CHIP(PALM);
- TRANSLATE_CHIP(SUMO);
- TRANSLATE_CHIP(SUMO2);
- TRANSLATE_CHIP(BARTS);
- TRANSLATE_CHIP(TURKS);
- TRANSLATE_CHIP(CAICOS);
- TRANSLATE_CHIP(CAYMAN);
-#undef TRANSLATE_CHIP
-
- default:
- assert(!"unknown chip");
- return "INVALID_CHIP";
- }
-}
-
const char* shader::get_shader_target_name() {
switch (target) {
case TARGET_VS: return "VS";
cf += s.cf;
}
-void shader_stats::dump(std::ostream& o) {
- o << "dw:" << ndw << ", gpr:" << ngpr << ", stk:" << nstack
+void shader_stats::dump() {
+ sblog << "dw:" << ndw << ", gpr:" << ngpr << ", stk:" << nstack
<< ", alu groups:" << alu_groups << ", alu clauses: " << alu_clauses
<< ", alu:" << alu << ", fetch:" << fetch
<< ", fetch clauses:" << fetch_clauses
<< ", cf:" << cf;
if (shaders > 1)
- o << ", shaders:" << shaders;
+ sblog << ", shaders:" << shaders;
- o << "\n";
+ sblog << "\n";
}
-static void print_diff(std::ostream &o, unsigned d1, unsigned d2) {
+static void print_diff(unsigned d1, unsigned d2) {
if (d1)
- o << ((int)d2 - (int)d1) * 100 / (int)d1 << "%";
+ sblog << ((int)d2 - (int)d1) * 100 / (int)d1 << "%";
else if (d2)
- o << "N/A";
+ sblog << "N/A";
else
- o << "0%";
-}
-
-void shader_stats::dump_diff(std::ostream& o, shader_stats& s) {
- o << "dw:"; print_diff(o, ndw, s.ndw);
- o << ", gpr:" ; print_diff(o, ngpr, s.ngpr);
- o << ", stk:" ; print_diff(o, nstack, s.nstack);
- o << ", alu groups:" ; print_diff(o, alu_groups, s.alu_groups);
- o << ", alu clauses: " ; print_diff(o, alu_clauses, s.alu_clauses);
- o << ", alu:" ; print_diff(o, alu, s.alu);
- o << ", fetch:" ; print_diff(o, fetch, s.fetch);
- o << ", fetch clauses:" ; print_diff(o, fetch_clauses, s.fetch_clauses);
- o << ", cf:" ; print_diff(o, cf, s.cf);
- o << "\n";
+ sblog << "0%";
+}
+
+void shader_stats::dump_diff(shader_stats& s) {
+ sblog << "dw:"; print_diff(ndw, s.ndw);
+ sblog << ", gpr:" ; print_diff(ngpr, s.ngpr);
+ sblog << ", stk:" ; print_diff(nstack, s.nstack);
+ sblog << ", alu groups:" ; print_diff(alu_groups, s.alu_groups);
+ sblog << ", alu clauses: " ; print_diff(alu_clauses, s.alu_clauses);
+ sblog << ", alu:" ; print_diff(alu, s.alu);
+ sblog << ", fetch:" ; print_diff(fetch, s.fetch);
+ sblog << ", fetch clauses:" ; print_diff(fetch_clauses, s.fetch_clauses);
+ sblog << ", cf:" ; print_diff(cf, s.cf);
+ sblog << "\n";
}
} // namespace r600_sb