mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-27 09:12:46 +01:00
Shader/I2F: Implemented the negate I2F_C instruction variant.
This commit is contained in:
parent
40ecdda19e
commit
38592a3b5e
1 changed files with 23 additions and 7 deletions
|
@ -367,20 +367,23 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generates code representing a uniform (C buffer) register, interpreted as the input type.
|
/// Generates code representing a uniform (C buffer) register, interpreted as the input type.
|
||||||
std::string GetUniform(u64 index, u64 offset, GLSLRegister::Type type) {
|
std::string GetUniform(u64 index, u64 offset, GLSLRegister::Type type,
|
||||||
|
Register::Size size = Register::Size::Word) {
|
||||||
declr_const_buffers[index].MarkAsUsed(index, offset, stage);
|
declr_const_buffers[index].MarkAsUsed(index, offset, stage);
|
||||||
std::string value = 'c' + std::to_string(index) + '[' + std::to_string(offset / 4) + "][" +
|
std::string value = 'c' + std::to_string(index) + '[' + std::to_string(offset / 4) + "][" +
|
||||||
std::to_string(offset % 4) + ']';
|
std::to_string(offset % 4) + ']';
|
||||||
|
|
||||||
if (type == GLSLRegister::Type::Float) {
|
if (type == GLSLRegister::Type::Float) {
|
||||||
return value;
|
// Do nothing, default
|
||||||
} else if (type == GLSLRegister::Type::Integer) {
|
} else if (type == GLSLRegister::Type::Integer) {
|
||||||
return "floatBitsToInt(" + value + ')';
|
value = "floatBitsToInt(" + value + ')';
|
||||||
} else if (type == GLSLRegister::Type::UnsignedInteger) {
|
} else if (type == GLSLRegister::Type::UnsignedInteger) {
|
||||||
return "floatBitsToUint(" + value + ')';
|
value = "floatBitsToUint(" + value + ')';
|
||||||
} else {
|
} else {
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ConvertIntegerSize(value, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string GetUniformIndirect(u64 cbuf_index, s64 offset, const std::string& index_str,
|
std::string GetUniformIndirect(u64 cbuf_index, s64 offset, const std::string& index_str,
|
||||||
|
@ -1251,11 +1254,24 @@ private:
|
||||||
1, instr.alu.saturate_d, 0, instr.conversion.dest_size);
|
1, instr.alu.saturate_d, 0, instr.conversion.dest_size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OpCode::Id::I2F_R: {
|
case OpCode::Id::I2F_R:
|
||||||
|
case OpCode::Id::I2F_C: {
|
||||||
ASSERT_MSG(instr.conversion.dest_size == Register::Size::Word, "Unimplemented");
|
ASSERT_MSG(instr.conversion.dest_size == Register::Size::Word, "Unimplemented");
|
||||||
ASSERT_MSG(!instr.conversion.selector, "Unimplemented");
|
ASSERT_MSG(!instr.conversion.selector, "Unimplemented");
|
||||||
std::string op_a = regs.GetRegisterAsInteger(
|
|
||||||
instr.gpr20, 0, instr.conversion.is_input_signed, instr.conversion.src_size);
|
std::string op_a{};
|
||||||
|
|
||||||
|
if (instr.is_b_gpr) {
|
||||||
|
op_a =
|
||||||
|
regs.GetRegisterAsInteger(instr.gpr20, 0, instr.conversion.is_input_signed,
|
||||||
|
instr.conversion.src_size);
|
||||||
|
} else {
|
||||||
|
op_a = regs.GetUniform(instr.cbuf34.index, instr.cbuf34.offset,
|
||||||
|
instr.conversion.is_input_signed
|
||||||
|
? GLSLRegister::Type::Integer
|
||||||
|
: GLSLRegister::Type::UnsignedInteger,
|
||||||
|
instr.conversion.src_size);
|
||||||
|
}
|
||||||
|
|
||||||
if (instr.conversion.abs_a) {
|
if (instr.conversion.abs_a) {
|
||||||
op_a = "abs(" + op_a + ')';
|
op_a = "abs(" + op_a + ')';
|
||||||
|
|
Loading…
Reference in a new issue