vertex_shader: Implement SLT/SLTI instructions.
This commit is contained in:
parent
875bd29766
commit
4ac6c1a3b5
|
@ -120,10 +120,6 @@ static void ProcessShaderCode(VertexShaderState& state) {
|
||||||
case OpCode::Type::Arithmetic:
|
case OpCode::Type::Arithmetic:
|
||||||
{
|
{
|
||||||
bool is_inverted = 0 != (instr.opcode.Value().GetInfo().subtype & OpCode::Info::SrcInversed);
|
bool is_inverted = 0 != (instr.opcode.Value().GetInfo().subtype & OpCode::Info::SrcInversed);
|
||||||
// TODO: We don't really support this properly: For instance, the address register
|
|
||||||
// offset needs to be applied to SRC2 instead, etc.
|
|
||||||
// For now, we just abort in this situation.
|
|
||||||
ASSERT_MSG(!is_inverted, "Bad condition...");
|
|
||||||
|
|
||||||
const int address_offset = (instr.common.address_register_index == 0)
|
const int address_offset = (instr.common.address_register_index == 0)
|
||||||
? 0 : state.address_registers[instr.common.address_register_index - 1];
|
? 0 : state.address_registers[instr.common.address_register_index - 1];
|
||||||
|
@ -288,6 +284,16 @@ static void ProcessShaderCode(VertexShaderState& state) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case OpCode::Id::SLT:
|
||||||
|
case OpCode::Id::SLTI:
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
if (!swizzle.DestComponentEnabled(i))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
dest[i] = (src1[i] < src2[i]) ? float24::FromFloat32(1.0f) : float24::FromFloat32(0.0f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case OpCode::Id::CMP:
|
case OpCode::Id::CMP:
|
||||||
for (int i = 0; i < 2; ++i) {
|
for (int i = 0; i < 2; ++i) {
|
||||||
// TODO: Can you restrict to one compare via dest masking?
|
// TODO: Can you restrict to one compare via dest masking?
|
||||||
|
|
Loading…
Reference in New Issue