Fix arrayed shadow sampler array slice/depth comparison ordering, as well as invalid GLSL LOD selection.

This commit is contained in:
heapo 2018-12-16 09:34:24 -08:00
parent 84823a3036
commit a6daed74f5

View File

@ -1591,23 +1591,21 @@ private:
process_mode == Tegra::Shader::TextureProcessMode::LL || process_mode == Tegra::Shader::TextureProcessMode::LL ||
process_mode == Tegra::Shader::TextureProcessMode::LLA; process_mode == Tegra::Shader::TextureProcessMode::LLA;
// LOD selection (either via bias or explicit textureLod) not supported in GL for
// sampler2DArrayShadow and samplerCubeArrayShadow.
const bool gl_lod_supported = !( const bool gl_lod_supported = !(
(texture_type == Tegra::Shader::TextureType::Texture2D && is_array && depth_compare) || (texture_type == Tegra::Shader::TextureType::Texture2D && is_array && depth_compare) ||
(texture_type == Tegra::Shader::TextureType::TextureCube && !is_array && (texture_type == Tegra::Shader::TextureType::TextureCube && is_array && depth_compare));
depth_compare));
const std::string read_method = lod_needed && gl_lod_supported ? "textureLod(" : "texture("; const std::string read_method = lod_needed && gl_lod_supported ? "textureLod(" : "texture(";
std::string texture = read_method + sampler + ", coord"; std::string texture = read_method + sampler + ", coord";
if (process_mode != Tegra::Shader::TextureProcessMode::None) { UNIMPLEMENTED_IF(process_mode != Tegra::Shader::TextureProcessMode::None &&
!gl_lod_supported);
if (process_mode != Tegra::Shader::TextureProcessMode::None && gl_lod_supported) {
if (process_mode == Tegra::Shader::TextureProcessMode::LZ) { if (process_mode == Tegra::Shader::TextureProcessMode::LZ) {
if (gl_lod_supported) { texture += ", 0.0";
texture += ", 0";
} else {
// Lod 0 is emulated by a big negative bias
// in scenarios that are not supported by glsl
texture += ", -1000";
}
} else { } else {
// If present, lod or bias are always stored in the register indexed by the // If present, lod or bias are always stored in the register indexed by the
// gpr20 // gpr20
@ -1645,15 +1643,15 @@ private:
if (depth_compare && !is_array && texture_type == Tegra::Shader::TextureType::Texture1D) { if (depth_compare && !is_array && texture_type == Tegra::Shader::TextureType::Texture1D) {
coord += ",0.0"; coord += ",0.0";
} }
if (is_array) {
coord += ',' + regs.GetRegisterAsInteger(array_register);
}
if (depth_compare) { if (depth_compare) {
// Depth is always stored in the register signaled by gpr20 // Depth is always stored in the register signaled by gpr20
// or in the next register if lod or bias are used // or in the next register if lod or bias are used
const u64 depth_register = instr.gpr20.Value() + (lod_bias_enabled ? 1 : 0); const u64 depth_register = instr.gpr20.Value() + (lod_bias_enabled ? 1 : 0);
coord += ',' + regs.GetRegisterAsFloat(depth_register); coord += ',' + regs.GetRegisterAsFloat(depth_register);
} }
if (is_array) {
coord += ',' + regs.GetRegisterAsInteger(array_register);
}
coord += ");"; coord += ");";
return std::make_pair( return std::make_pair(
coord, GetTextureCode(instr, texture_type, process_mode, depth_compare, is_array, 0)); coord, GetTextureCode(instr, texture_type, process_mode, depth_compare, is_array, 0));
@ -1686,15 +1684,15 @@ private:
} }
} }
if (is_array) {
coord += ',' + regs.GetRegisterAsInteger(array_register);
}
if (depth_compare) { if (depth_compare) {
// Depth is always stored in the register signaled by gpr20 // Depth is always stored in the register signaled by gpr20
// or in the next register if lod or bias are used // or in the next register if lod or bias are used
const u64 depth_register = instr.gpr20.Value() + (lod_bias_enabled ? 1 : 0); const u64 depth_register = instr.gpr20.Value() + (lod_bias_enabled ? 1 : 0);
coord += ',' + regs.GetRegisterAsFloat(depth_register); coord += ',' + regs.GetRegisterAsFloat(depth_register);
} }
if (is_array) {
coord += ',' + regs.GetRegisterAsInteger(array_register);
}
coord += ");"; coord += ");";
return std::make_pair(coord, return std::make_pair(coord,