X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_glsl_to_tgsi_private.cpp;h=f259442cc37c033e52696a6f45ba0ed318aa1db8;hb=040b07c7feebac90858f7426c2c20784642d0ca5;hp=b664fa7ec3ffe2c6456c52d41b754fdd1ee8ca45;hpb=8602c6a32666c1cb1b4f20d2d6efa5a925726d39;p=mesa.git diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi_private.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi_private.cpp index b664fa7ec3f..f259442cc37 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi_private.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi_private.cpp @@ -24,8 +24,9 @@ */ #include "st_glsl_to_tgsi_private.h" -#include -#include +#include "tgsi/tgsi_info.h" +#include "mesa/program/prog_instruction.h" +#include "mesa/program/prog_print.h" static int swizzle_for_type(const glsl_type *type, int component = 0) { @@ -115,7 +116,7 @@ st_src_reg::st_src_reg(gl_register_file file, int index, enum glsl_base_type typ this->is_double_vertex_input = false; } -st_src_reg::st_src_reg() +void st_src_reg::reset() { this->type = GLSL_TYPE_ERROR; this->file = PROGRAM_UNDEFINED; @@ -132,6 +133,11 @@ st_src_reg::st_src_reg() this->is_double_vertex_input = false; } +st_src_reg::st_src_reg() +{ + reset(); +} + st_src_reg::st_src_reg(const st_src_reg ®) { *this = reg; @@ -179,6 +185,80 @@ st_src_reg st_src_reg::get_abs() return reg; } +bool operator == (const st_src_reg& lhs, const st_src_reg& rhs) +{ + bool result; + + if (lhs.type != rhs.type || + lhs.file != rhs.file || + lhs.index != rhs.index || + lhs.swizzle != rhs.swizzle || + lhs.index2D != rhs.index2D || + lhs.has_index2 != rhs.has_index2 || + lhs.array_id != rhs.array_id || + lhs.negate != rhs.negate || + lhs.abs != rhs.abs || + lhs.double_reg2 != rhs.double_reg2 || + lhs.is_double_vertex_input != rhs.is_double_vertex_input) + return false; + + if (lhs.reladdr) { + if (!rhs.reladdr) + return false; + result = (*lhs.reladdr == *rhs.reladdr); + } else { + result = !rhs.reladdr; + } + + if (lhs.reladdr2) { + if (!rhs.reladdr2) + return false; + result &= (*lhs.reladdr2 == *rhs.reladdr2); + } else { + result &= !rhs.reladdr2; + } + + return result; +} + +static const char swz_txt[] = "xyzw"; + +std::ostream& operator << (std::ostream& os, const st_src_reg& reg) +{ + if (reg.negate) + os << "-"; + if (reg.abs) + os << "|"; + + os << _mesa_register_file_name(reg.file); + + if (reg.file == PROGRAM_ARRAY) { + os << "(" << reg.array_id << ")"; + } + if (reg.has_index2) { + os << "["; + if (reg.reladdr2) { + os << *reg.reladdr2; + } + os << "+" << reg.index2D << "]"; + } + os << "["; + if (reg.reladdr) { + os << *reg.reladdr; + } + os << reg.index << "]."; + for (int i = 0; i < 4; ++i) { + int swz = GET_SWZ(reg.swizzle, i); + if (swz < 4) + os << swz_txt[swz]; + else + os << "_"; + } + if (reg.abs) + os << "|"; + return os; +} + st_dst_reg::st_dst_reg(st_src_reg reg) { this->type = reg.type; @@ -250,3 +330,94 @@ void st_dst_reg::operator=(const st_dst_reg ®) this->has_index2 = reg.has_index2; this->array_id = reg.array_id; } + +bool operator == (const st_dst_reg& lhs, const st_dst_reg& rhs) +{ + bool result; + + if (lhs.type != rhs.type || + lhs.file != rhs.file || + lhs.index != rhs.index || + lhs.writemask != rhs.writemask || + lhs.index2D != rhs.index2D || + lhs.has_index2 != rhs.has_index2 || + lhs.array_id != rhs.array_id) + return false; + + if (lhs.reladdr) { + if (!rhs.reladdr) + return false; + result = (*lhs.reladdr == *rhs.reladdr); + } else { + result = !rhs.reladdr; + } + + if (lhs.reladdr2) { + if (!rhs.reladdr2) + return false; + result &= (*lhs.reladdr2 == *rhs.reladdr2); + } else { + result &= !rhs.reladdr2; + } + + return result; +} + +std::ostream& operator << (std::ostream& os, const st_dst_reg& reg) +{ + os << _mesa_register_file_name(reg.file); + if (reg.file == PROGRAM_ARRAY) { + os << "(" << reg.array_id << ")"; + } + if (reg.has_index2) { + os << "["; + if (reg.reladdr2) { + os << *reg.reladdr2; + } + os << "+" << reg.index2D << "]"; + } + os << "["; + if (reg.reladdr) { + os << *reg.reladdr; + } + os << reg.index << "]."; + for (int i = 0; i < 4; ++i) { + if (1 << i & reg.writemask) + os << swz_txt[i]; + else + os << "_"; + } + + return os; +} + +void glsl_to_tgsi_instruction::print(std::ostream& os) const +{ + os << tgsi_get_opcode_name(info->opcode) << " "; + + bool has_operators = false; + for (unsigned j = 0; j < num_inst_dst_regs(this); j++) { + has_operators = true; + if (j > 0) + os << ", "; + os << dst[j]; + } + + if (has_operators) + os << " := "; + + for (unsigned j = 0; j < num_inst_src_regs(this); j++) { + if (j > 0) + os << ", "; + os << src[j]; + } + + if (tex_offset_num_offset > 0) { + os << ", TEXOFS: "; + for (unsigned j = 0; j < tex_offset_num_offset; j++) { + if (j > 0) + os << ", "; + os << tex_offsets[j]; + } + } +}