|
|
|
@ -1786,15 +1786,47 @@ private: |
|
|
|
coord = "vec2 coords = vec2(" + x + ", " + y + ");"; |
|
|
|
texture_type = Tegra::Shader::TextureType::Texture2D; |
|
|
|
} |
|
|
|
// TODO: make sure coordinates are always indexed to gpr8 and gpr20 is always bias
|
|
|
|
// or lod.
|
|
|
|
const std::string op_c = regs.GetRegisterAsFloat(instr.gpr20); |
|
|
|
|
|
|
|
const std::string sampler = GetSampler(instr.sampler, texture_type, false); |
|
|
|
// 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 = "texture(" + sampler + ", coords)"; |
|
|
|
std::string texture; |
|
|
|
|
|
|
|
switch (instr.tex.process_mode) { |
|
|
|
case Tegra::Shader::TextureProcessMode::None: { |
|
|
|
texture = "texture(" + sampler + ", coords)"; |
|
|
|
break; |
|
|
|
} |
|
|
|
case Tegra::Shader::TextureProcessMode::LZ: { |
|
|
|
texture = "textureLod(" + sampler + ", coords, 0.0)"; |
|
|
|
break; |
|
|
|
} |
|
|
|
case Tegra::Shader::TextureProcessMode::LB: |
|
|
|
case Tegra::Shader::TextureProcessMode::LBA: { |
|
|
|
// TODO: Figure if A suffix changes the equation at all.
|
|
|
|
texture = "texture(" + sampler + ", coords, " + op_c + ')'; |
|
|
|
break; |
|
|
|
} |
|
|
|
case Tegra::Shader::TextureProcessMode::LL: |
|
|
|
case Tegra::Shader::TextureProcessMode::LLA: { |
|
|
|
// TODO: Figure if A suffix changes the equation at all.
|
|
|
|
texture = "textureLod(" + sampler + ", coords, " + op_c + ')'; |
|
|
|
break; |
|
|
|
} |
|
|
|
default: { |
|
|
|
texture = "texture(" + sampler + ", coords)"; |
|
|
|
LOG_CRITICAL(HW_GPU, "Unhandled texture process mode {}", |
|
|
|
static_cast<u32>(instr.tex.process_mode.Value())); |
|
|
|
UNREACHABLE(); |
|
|
|
} |
|
|
|
} |
|
|
|
size_t dest_elem{}; |
|
|
|
for (size_t elem = 0; elem < 4; ++elem) { |
|
|
|
if (!instr.tex.IsComponentEnabled(elem)) { |
|
|
|
|