|
@@ -1567,6 +1567,57 @@ private:
|
|
|
WriteTexsInstruction(instr, coord, texture);
|
|
WriteTexsInstruction(instr, coord, texture);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
+ case OpCode::Id::TLD4: {
|
|
|
|
|
+ ASSERT(instr.tld4.texture_type == Tegra::Shader::TextureType::Texture2D);
|
|
|
|
|
+ ASSERT(instr.tld4.array == 0);
|
|
|
|
|
+ std::string coord{};
|
|
|
|
|
+
|
|
|
|
|
+ switch (instr.tld4.texture_type) {
|
|
|
|
|
+ case Tegra::Shader::TextureType::Texture2D: {
|
|
|
|
|
+ std::string x = regs.GetRegisterAsFloat(instr.gpr8);
|
|
|
|
|
+ std::string y = regs.GetRegisterAsFloat(instr.gpr8.Value() + 1);
|
|
|
|
|
+ coord = "vec2 coords = vec2(" + x + ", " + y + ");";
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ default:
|
|
|
|
|
+ UNIMPLEMENTED();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const std::string sampler =
|
|
|
|
|
+ GetSampler(instr.sampler, instr.tld4.texture_type, instr.tld4.array);
|
|
|
|
|
+ // Add an extra scope and declare the texture coords inside to prevent
|
|
|
|
|
+ // overwriting them in case they are used as outputs of the texs instruction.
|
|
|
|
|
+ shader.AddLine("{");
|
|
|
|
|
+ ++shader.scope;
|
|
|
|
|
+ shader.AddLine(coord);
|
|
|
|
|
+ const std::string texture = "textureGather(" + sampler + ", coords, " +
|
|
|
|
|
+ std::to_string(instr.tld4.component) + ')';
|
|
|
|
|
+
|
|
|
|
|
+ size_t dest_elem{};
|
|
|
|
|
+ for (size_t elem = 0; elem < 4; ++elem) {
|
|
|
|
|
+ if (!instr.tex.IsComponentEnabled(elem)) {
|
|
|
|
|
+ // Skip disabled components
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ regs.SetRegisterToFloat(instr.gpr0, elem, texture, 1, 4, false, dest_elem);
|
|
|
|
|
+ ++dest_elem;
|
|
|
|
|
+ }
|
|
|
|
|
+ --shader.scope;
|
|
|
|
|
+ shader.AddLine("}");
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case OpCode::Id::TLD4S: {
|
|
|
|
|
+ const std::string op_a = regs.GetRegisterAsFloat(instr.gpr8);
|
|
|
|
|
+ const std::string op_b = regs.GetRegisterAsFloat(instr.gpr20);
|
|
|
|
|
+ // TODO(Subv): Figure out how the sampler type is encoded in the TLD4S instruction.
|
|
|
|
|
+ const std::string sampler =
|
|
|
|
|
+ GetSampler(instr.sampler, Tegra::Shader::TextureType::Texture2D, false);
|
|
|
|
|
+ const std::string coord = "vec2 coords = vec2(" + op_a + ", " + op_b + ");";
|
|
|
|
|
+ const std::string texture = "textureGather(" + sampler + ", coords, " +
|
|
|
|
|
+ std::to_string(instr.tld4s.component) + ')';
|
|
|
|
|
+ WriteTexsInstruction(instr, coord, texture);
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
default: {
|
|
default: {
|
|
|
LOG_CRITICAL(HW_GPU, "Unhandled memory instruction: {}", opcode->GetName());
|
|
LOG_CRITICAL(HW_GPU, "Unhandled memory instruction: {}", opcode->GetName());
|
|
|
UNREACHABLE();
|
|
UNREACHABLE();
|