Implemented TXQ dimension query type, used by SMO.
This commit is contained in:
parent
82a313a14c
commit
073a21ac0b
|
@ -244,6 +244,16 @@ enum class TextureType : u64 {
|
||||||
TextureCube = 3,
|
TextureCube = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class TextureQueryType : u64 {
|
||||||
|
Dimension = 1,
|
||||||
|
TextureType = 2,
|
||||||
|
SamplePosition = 5,
|
||||||
|
Filter = 16,
|
||||||
|
LevelOfDetail = 18,
|
||||||
|
Wrap = 20,
|
||||||
|
BorderColor = 22,
|
||||||
|
};
|
||||||
|
|
||||||
enum class IpaInterpMode : u64 { Linear = 0, Perspective = 1, Flat = 2, Sc = 3 };
|
enum class IpaInterpMode : u64 { Linear = 0, Perspective = 1, Flat = 2, Sc = 3 };
|
||||||
enum class IpaSampleMode : u64 { Default = 0, Centroid = 1, Offset = 2 };
|
enum class IpaSampleMode : u64 { Default = 0, Centroid = 1, Offset = 2 };
|
||||||
|
|
||||||
|
@ -518,6 +528,11 @@ union Instruction {
|
||||||
}
|
}
|
||||||
} tex;
|
} tex;
|
||||||
|
|
||||||
|
union {
|
||||||
|
BitField<22, 6, TextureQueryType> query_type;
|
||||||
|
BitField<31, 4, u64> component_mask;
|
||||||
|
} txq;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
BitField<28, 1, u64> array;
|
BitField<28, 1, u64> array;
|
||||||
BitField<29, 2, TextureType> texture_type;
|
BitField<29, 2, TextureType> texture_type;
|
||||||
|
|
|
@ -1920,6 +1920,26 @@ private:
|
||||||
WriteTexsInstruction(instr, coord, texture);
|
WriteTexsInstruction(instr, coord, texture);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case OpCode::Id::TXQ: {
|
||||||
|
// TODO: the new commits on the texture refactor, change the way samplers work.
|
||||||
|
// Sadly, not all texture instructions specify the type of texture their sampler
|
||||||
|
// uses. This must be fixed at a later instance.
|
||||||
|
const std::string sampler =
|
||||||
|
GetSampler(instr.sampler, Tegra::Shader::TextureType::Texture2D, false);
|
||||||
|
switch (instr.txq.query_type) {
|
||||||
|
case Tegra::Shader::TextureQueryType::Dimension: {
|
||||||
|
const std::string texture = "textureQueryLevels(" + sampler + ')';
|
||||||
|
regs.SetRegisterToInteger(instr.gpr0, true, 0, texture, 1, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
LOG_CRITICAL(HW_GPU, "Unhandled texture query type: {}",
|
||||||
|
static_cast<u32>(instr.txq.query_type.Value()));
|
||||||
|
UNREACHABLE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: {
|
default: {
|
||||||
LOG_CRITICAL(HW_GPU, "Unhandled memory instruction: {}", opcode->GetName());
|
LOG_CRITICAL(HW_GPU, "Unhandled memory instruction: {}", opcode->GetName());
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
|
|
Reference in New Issue