Merge pull request #1909 from heapo/shadow_sampling_fixes
Fix arrayed texture LOD selection and depth comparison ordering
This commit is contained in:
		| @@ -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, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei