mirror of
https://git.h3cjp.net/H3cJP/citra.git
synced 2024-11-28 06:52:47 +00:00
Fix arrayed shadow sampler array slice/depth comparison ordering, as well as invalid GLSL LOD selection.
This commit is contained in:
parent
84823a3036
commit
a6daed74f5
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue