mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2025-10-19 01:58:00 +00:00
shader_decompiler: Remove FragCoord.w hack and change IPA implementation
Credits go to gdkchan and Ryujinx. The pull request used for this can be found here: https://github.com/Ryujinx/Ryujinx/pull/1082 yuzu was already using the header for interpolation, but it was missing the FragCoord.w multiplication described in the linked pull request. This commit finally removes the FragCoord.w == 1.0f hack from the shader decompiler. While we are at it, this commit renames some enumerations to match Nvidia's documentation (linked below) and fixes component declaration order in the shader program header (z and w were swapped). https://github.com/NVIDIA/open-gpu-doc/blob/master/Shader-Program-Header/Shader-Program-Header.html
This commit is contained in:
parent
44c1492086
commit
d66cae7bd5
4 changed files with 74 additions and 68 deletions
|
@ -35,7 +35,7 @@ namespace {
|
|||
using Sirit::Id;
|
||||
using Tegra::Engines::ShaderType;
|
||||
using Tegra::Shader::Attribute;
|
||||
using Tegra::Shader::AttributeUse;
|
||||
using Tegra::Shader::PixelImap;
|
||||
using Tegra::Shader::Register;
|
||||
using namespace VideoCommon::Shader;
|
||||
|
||||
|
@ -752,16 +752,16 @@ private:
|
|||
if (stage != ShaderType::Fragment) {
|
||||
continue;
|
||||
}
|
||||
switch (header.ps.GetAttributeUse(location)) {
|
||||
case AttributeUse::Constant:
|
||||
switch (header.ps.GetPixelImap(location)) {
|
||||
case PixelImap::Constant:
|
||||
Decorate(id, spv::Decoration::Flat);
|
||||
break;
|
||||
case AttributeUse::ScreenLinear:
|
||||
Decorate(id, spv::Decoration::NoPerspective);
|
||||
break;
|
||||
case AttributeUse::Perspective:
|
||||
case PixelImap::Perspective:
|
||||
// Default
|
||||
break;
|
||||
case PixelImap::ScreenLinear:
|
||||
Decorate(id, spv::Decoration::NoPerspective);
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE_MSG("Unused attribute being fetched");
|
||||
}
|
||||
|
@ -1145,9 +1145,6 @@ private:
|
|||
switch (attribute) {
|
||||
case Attribute::Index::Position: {
|
||||
if (stage == ShaderType::Fragment) {
|
||||
if (element == 3) {
|
||||
return {Constant(t_float, 1.0f), Type::Float};
|
||||
}
|
||||
return {OpLoad(t_float, AccessElement(t_in_float, frag_coord, element)),
|
||||
Type::Float};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue