std::string ShaderInstance::print () { std::stringstream out; out << "Shader " << shadername() << "\n"; out << " symbols:\n"; for (size_t i = 0; i < m_instsymbols.size(); ++i) { const Symbol &s (*symbol(i)); s.print (out); } #if 0 out << " int consts:\n "; for (size_t i = 0; i < m_iconsts.size(); ++i) out << m_iconsts[i] << ' '; out << "\n"; out << " float consts:\n "; for (size_t i = 0; i < m_fconsts.size(); ++i) out << m_fconsts[i] << ' '; out << "\n"; out << " string consts:\n "; for (size_t i = 0; i < m_sconsts.size(); ++i) out << "\"" << Strutil::escape_chars(m_sconsts[i]) << "\" "; out << "\n"; #endif out << " code:\n"; for (size_t i = 0; i < m_instops.size(); ++i) { const Opcode &op (m_instops[i]); if (i == (size_t)maincodebegin()) out << "(main)\n"; out << " " << i << ": " << op.opname(); bool allconst = true; for (int a = 0; a < op.nargs(); ++a) { const Symbol *s (argsymbol(op.firstarg()+a)); out << " " << s->name(); if (s->symtype() == SymTypeConst) { out << " ("; s->print_vals(out); out << ")"; } if (op.argread(a)) allconst &= s->is_constant(); } for (size_t j = 0; j < Opcode::max_jumps; ++j) if (op.jump(j) >= 0) out << " " << op.jump(j); // out << " rw " << Strutil::format("%x",op.argread_bits()) // << ' ' << op.argwrite_bits(); if (op.argtakesderivs_all()) out << " %derivs(" << op.argtakesderivs_all() << ") "; if (allconst) out << " CONST"; std::string filename = op.sourcefile().string(); size_t slash = filename.find_last_of ("/"); if (slash != std::string::npos) filename.erase (0, slash+1); out << " (" << filename << ":" << op.sourceline() << ")"; out << "\n"; } return out.str (); }
std::string ShaderInstance::print (const ShaderGroup &group) { std::stringstream out; out << "Shader " << shadername() << "\n"; out << " symbols:\n"; for (size_t i = 0; i < m_instsymbols.size(); ++i) { const Symbol &s (*symbol(i)); s.print (out, 256); } #if 0 out << " int consts:\n "; for (size_t i = 0; i < m_iconsts.size(); ++i) out << m_iconsts[i] << ' '; out << "\n"; out << " float consts:\n "; for (size_t i = 0; i < m_fconsts.size(); ++i) out << m_fconsts[i] << ' '; out << "\n"; out << " string consts:\n "; for (size_t i = 0; i < m_sconsts.size(); ++i) out << "\"" << Strutil::escape_chars(m_sconsts[i]) << "\" "; out << "\n"; #endif out << " code:\n"; for (size_t i = 0; i < m_instops.size(); ++i) { const Opcode &op (m_instops[i]); if (i == (size_t)maincodebegin()) out << "(main)\n"; out << " " << i << ": " << op.opname(); bool allconst = true; for (int a = 0; a < op.nargs(); ++a) { const Symbol *s (argsymbol(op.firstarg()+a)); out << " " << s->name(); if (s->symtype() == SymTypeConst) { out << " ("; s->print_vals(out,16); out << ")"; } if (op.argread(a)) allconst &= s->is_constant(); } for (size_t j = 0; j < Opcode::max_jumps; ++j) if (op.jump(j) >= 0) out << " " << op.jump(j); // out << " rw " << Strutil::format("%x",op.argread_bits()) // << ' ' << op.argwrite_bits(); if (op.argtakesderivs_all()) out << " %derivs(" << op.argtakesderivs_all() << ") "; if (allconst) out << " CONST"; std::string filename = op.sourcefile().string(); size_t slash = filename.find_last_of ("/"); if (slash != std::string::npos) filename.erase (0, slash+1); if (filename.length()) out << " (" << filename << ":" << op.sourceline() << ")"; out << "\n"; } if (nconnections()) { out << " connections upstream:\n"; for (int i = 0, e = nconnections(); i < e; ++i) { const Connection &c (connection(i)); out << " " << c.dst.type.c_str() << ' ' << symbol(c.dst.param)->name(); if (c.dst.arrayindex >= 0) out << '[' << c.dst.arrayindex << ']'; out << " upconnected from layer " << c.srclayer << ' '; const ShaderInstance *up = group[c.srclayer]; out << "(" << up->layername() << ") "; out << " " << c.src.type.c_str() << ' ' << up->symbol(c.src.param)->name(); if (c.src.arrayindex >= 0) out << '[' << c.src.arrayindex << ']'; out << "\n"; } } return out.str (); }