Constant slot pairing... maybe.
This commit is contained in:
parent
341a493bf9
commit
35513ceea0
|
@ -163,9 +163,32 @@ std::string GL4ShaderTranslator::TranslatePixelShader(
|
||||||
return output_.to_string();
|
return output_.to_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GL4ShaderTranslator::AppendSrcReg(const instr_alu_t& op, int i) {
|
||||||
|
switch (i) {
|
||||||
|
case 1: {
|
||||||
|
int const_slot = 0;
|
||||||
|
AppendSrcReg(op, op.src1_reg, op.src1_sel, op.src1_swiz,
|
||||||
|
op.src1_reg_negate, const_slot);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2: {
|
||||||
|
int const_slot = op.src1_sel ? 1 : 0;
|
||||||
|
AppendSrcReg(op, op.src2_reg, op.src2_sel, op.src2_swiz,
|
||||||
|
op.src2_reg_negate, const_slot);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3: {
|
||||||
|
int const_slot = (op.src1_sel || op.src2_sel) ? 1 : 0;
|
||||||
|
AppendSrcReg(op, op.src3_reg, op.src3_sel, op.src3_swiz,
|
||||||
|
op.src3_reg_negate, const_slot);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GL4ShaderTranslator::AppendSrcReg(const instr_alu_t& op, uint32_t num,
|
void GL4ShaderTranslator::AppendSrcReg(const instr_alu_t& op, uint32_t num,
|
||||||
uint32_t type, uint32_t swiz,
|
uint32_t type, uint32_t swiz,
|
||||||
uint32_t negate) {
|
uint32_t negate, int const_slot) {
|
||||||
if (negate) {
|
if (negate) {
|
||||||
Append("-");
|
Append("-");
|
||||||
}
|
}
|
||||||
|
@ -184,8 +207,8 @@ void GL4ShaderTranslator::AppendSrcReg(const instr_alu_t& op, uint32_t num,
|
||||||
Append("abs(");
|
Append("abs(");
|
||||||
}
|
}
|
||||||
Append("state.float_consts[");
|
Append("state.float_consts[");
|
||||||
assert_true(op.const_1_rel_abs == 0);
|
if ((const_slot == 0 && op.const_0_rel_abs) ||
|
||||||
if (op.const_0_rel_abs) {
|
(const_slot == 1 && op.const_1_rel_abs)) {
|
||||||
if (op.relative_addr) {
|
if (op.relative_addr) {
|
||||||
assert_true(num < 256);
|
assert_true(num < 256);
|
||||||
Append("a0 + %u", is_pixel_shader() ? num + 256 : num);
|
Append("a0 + %u", is_pixel_shader() ? num + 256 : num);
|
||||||
|
@ -309,20 +332,7 @@ void GL4ShaderTranslator::BeginAppendVectorOp(const ucode::instr_alu_t& op) {
|
||||||
|
|
||||||
void GL4ShaderTranslator::AppendVectorOpSrcReg(const ucode::instr_alu_t& op,
|
void GL4ShaderTranslator::AppendVectorOpSrcReg(const ucode::instr_alu_t& op,
|
||||||
int i) {
|
int i) {
|
||||||
switch (i) {
|
AppendSrcReg(op, i);
|
||||||
case 1:
|
|
||||||
AppendSrcReg(op, op.src1_reg, op.src1_sel, op.src1_swiz,
|
|
||||||
op.src1_reg_negate);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
AppendSrcReg(op, op.src2_reg, op.src2_sel, op.src2_swiz,
|
|
||||||
op.src2_reg_negate);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
AppendSrcReg(op, op.src3_reg, op.src3_sel, op.src3_swiz,
|
|
||||||
op.src3_reg_negate);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GL4ShaderTranslator::EndAppendVectorOp(const ucode::instr_alu_t& op,
|
void GL4ShaderTranslator::EndAppendVectorOp(const ucode::instr_alu_t& op,
|
||||||
|
@ -398,20 +408,7 @@ void GL4ShaderTranslator::BeginAppendScalarOp(const ucode::instr_alu_t& op) {
|
||||||
|
|
||||||
void GL4ShaderTranslator::AppendScalarOpSrcReg(const ucode::instr_alu_t& op,
|
void GL4ShaderTranslator::AppendScalarOpSrcReg(const ucode::instr_alu_t& op,
|
||||||
int i) {
|
int i) {
|
||||||
switch (i) {
|
AppendSrcReg(op, i);
|
||||||
case 1:
|
|
||||||
AppendSrcReg(op, op.src1_reg, op.src1_sel, op.src1_swiz,
|
|
||||||
op.src1_reg_negate);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
AppendSrcReg(op, op.src2_reg, op.src2_sel, op.src2_swiz,
|
|
||||||
op.src2_reg_negate);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
AppendSrcReg(op, op.src3_reg, op.src3_sel, op.src3_swiz,
|
|
||||||
op.src3_reg_negate);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GL4ShaderTranslator::EndAppendScalarOp(const ucode::instr_alu_t& op,
|
void GL4ShaderTranslator::EndAppendScalarOp(const ucode::instr_alu_t& op,
|
||||||
|
@ -794,8 +791,7 @@ bool GL4ShaderTranslator::TranslateALU_ADDs(const instr_alu_t& alu) {
|
||||||
|
|
||||||
bool GL4ShaderTranslator::TranslateALU_ADD_PREVs(const instr_alu_t& alu) {
|
bool GL4ShaderTranslator::TranslateALU_ADD_PREVs(const instr_alu_t& alu) {
|
||||||
BeginAppendScalarOp(alu);
|
BeginAppendScalarOp(alu);
|
||||||
AppendSrcReg(alu, alu.src3_reg, alu.src3_sel, alu.src3_swiz,
|
AppendSrcReg(alu, 3);
|
||||||
alu.src3_reg_negate);
|
|
||||||
Append(".x + ps");
|
Append(".x + ps");
|
||||||
EndAppendScalarOp(alu);
|
EndAppendScalarOp(alu);
|
||||||
return true;
|
return true;
|
||||||
|
@ -813,8 +809,7 @@ bool GL4ShaderTranslator::TranslateALU_MULs(const instr_alu_t& alu) {
|
||||||
|
|
||||||
bool GL4ShaderTranslator::TranslateALU_MUL_PREVs(const instr_alu_t& alu) {
|
bool GL4ShaderTranslator::TranslateALU_MUL_PREVs(const instr_alu_t& alu) {
|
||||||
BeginAppendScalarOp(alu);
|
BeginAppendScalarOp(alu);
|
||||||
AppendSrcReg(alu, alu.src3_reg, alu.src3_sel, alu.src3_swiz,
|
AppendSrcReg(alu, 3);
|
||||||
alu.src3_reg_negate);
|
|
||||||
Append(".x * ps");
|
Append(".x * ps");
|
||||||
EndAppendScalarOp(alu);
|
EndAppendScalarOp(alu);
|
||||||
return true;
|
return true;
|
||||||
|
@ -1112,9 +1107,11 @@ bool GL4ShaderTranslator::TranslateALU_MUL_CONST_0(const instr_alu_t& alu) {
|
||||||
uint32_t swiz_b = (src3_swiz & 0x3);
|
uint32_t swiz_b = (src3_swiz & 0x3);
|
||||||
uint32_t reg2 =
|
uint32_t reg2 =
|
||||||
(alu.scalar_opc & 1) | (alu.src3_swiz & 0x3C) | (alu.src3_sel << 1);
|
(alu.scalar_opc & 1) | (alu.src3_swiz & 0x3C) | (alu.src3_sel << 1);
|
||||||
AppendSrcReg(alu, alu.src3_reg, 0, 0, alu.src3_reg_negate);
|
// TODO(benvanik): const slot?
|
||||||
|
int const_slot = (alu.src1_sel || alu.src2_sel) ? 1 : 0;
|
||||||
|
AppendSrcReg(alu, alu.src3_reg, 0, 0, alu.src3_reg_negate, 0);
|
||||||
Append(".%c * ", chan_names[swiz_a]);
|
Append(".%c * ", chan_names[swiz_a]);
|
||||||
AppendSrcReg(alu, reg2, 1, 0, alu.src3_reg_negate);
|
AppendSrcReg(alu, reg2, 1, 0, alu.src3_reg_negate, const_slot);
|
||||||
Append(".%c", chan_names[swiz_b]);
|
Append(".%c", chan_names[swiz_b]);
|
||||||
EndAppendScalarOp(alu);
|
EndAppendScalarOp(alu);
|
||||||
return true;
|
return true;
|
||||||
|
@ -1130,9 +1127,11 @@ bool GL4ShaderTranslator::TranslateALU_ADD_CONST_0(const instr_alu_t& alu) {
|
||||||
uint32_t swiz_b = (src3_swiz & 0x3);
|
uint32_t swiz_b = (src3_swiz & 0x3);
|
||||||
uint32_t reg2 =
|
uint32_t reg2 =
|
||||||
(alu.scalar_opc & 1) | (alu.src3_swiz & 0x3C) | (alu.src3_sel << 1);
|
(alu.scalar_opc & 1) | (alu.src3_swiz & 0x3C) | (alu.src3_sel << 1);
|
||||||
AppendSrcReg(alu, alu.src3_reg, 0, 0, alu.src3_reg_negate);
|
// TODO(benvanik): const slot?
|
||||||
|
int const_slot = (alu.src1_sel || alu.src2_sel) ? 1 : 0;
|
||||||
|
AppendSrcReg(alu, alu.src3_reg, 0, 0, alu.src3_reg_negate, 0);
|
||||||
Append(".%c + ", chan_names[swiz_a]);
|
Append(".%c + ", chan_names[swiz_a]);
|
||||||
AppendSrcReg(alu, reg2, 1, 0, alu.src3_reg_negate);
|
AppendSrcReg(alu, reg2, 1, 0, alu.src3_reg_negate, const_slot);
|
||||||
Append(".%c", chan_names[swiz_b]);
|
Append(".%c", chan_names[swiz_b]);
|
||||||
EndAppendScalarOp(alu);
|
EndAppendScalarOp(alu);
|
||||||
return true;
|
return true;
|
||||||
|
@ -1148,9 +1147,11 @@ bool GL4ShaderTranslator::TranslateALU_SUB_CONST_0(const instr_alu_t& alu) {
|
||||||
uint32_t swiz_b = (src3_swiz & 0x3);
|
uint32_t swiz_b = (src3_swiz & 0x3);
|
||||||
uint32_t reg2 =
|
uint32_t reg2 =
|
||||||
(alu.scalar_opc & 1) | (alu.src3_swiz & 0x3C) | (alu.src3_sel << 1);
|
(alu.scalar_opc & 1) | (alu.src3_swiz & 0x3C) | (alu.src3_sel << 1);
|
||||||
AppendSrcReg(alu, alu.src3_reg, 0, 0, alu.src3_reg_negate);
|
// TODO(benvanik): const slot?
|
||||||
|
int const_slot = (alu.src1_sel || alu.src2_sel) ? 1 : 0;
|
||||||
|
AppendSrcReg(alu, alu.src3_reg, 0, 0, alu.src3_reg_negate, 0);
|
||||||
Append(".%c - ", chan_names[swiz_a]);
|
Append(".%c - ", chan_names[swiz_a]);
|
||||||
AppendSrcReg(alu, reg2, 1, 0, alu.src3_reg_negate);
|
AppendSrcReg(alu, reg2, 1, 0, alu.src3_reg_negate, const_slot);
|
||||||
Append(".%c", chan_names[swiz_b]);
|
Append(".%c", chan_names[swiz_b]);
|
||||||
EndAppendScalarOp(alu);
|
EndAppendScalarOp(alu);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -55,8 +55,9 @@ class GL4ShaderTranslator {
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AppendSrcReg(const ucode::instr_alu_t& op, int i);
|
||||||
void AppendSrcReg(const ucode::instr_alu_t& op, uint32_t num, uint32_t type,
|
void AppendSrcReg(const ucode::instr_alu_t& op, uint32_t num, uint32_t type,
|
||||||
uint32_t swiz, uint32_t negate);
|
uint32_t swiz, uint32_t negate, int const_slot);
|
||||||
void PrintSrcReg(uint32_t num, uint32_t type, uint32_t swiz, uint32_t negate,
|
void PrintSrcReg(uint32_t num, uint32_t type, uint32_t swiz, uint32_t negate,
|
||||||
uint32_t abs);
|
uint32_t abs);
|
||||||
void PrintVectorDstReg(const ucode::instr_alu_t& alu);
|
void PrintVectorDstReg(const ucode::instr_alu_t& alu);
|
||||||
|
|
Loading…
Reference in New Issue