aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2020-11-02 19:53:23 +0000
committerGitHub <noreply@github.com>2020-11-02 16:53:23 -0300
commite1da7df2075f45ac3d19538f7781115978282100 (patch)
treed46ae3ffedd2886adba64f1044b699f99b13f795 /Ryujinx.Graphics.OpenGL
parent11a7c99764ed4e6c575c877c69ca627645702a42 (diff)
Support res scale on images, correctly blacklist for SUST, move logic out of backend. (#1657)
* Support res scale on images, correctly blacklist for SUST, move logic out of backend. * Fix Typo
Diffstat (limited to 'Ryujinx.Graphics.OpenGL')
-rw-r--r--Ryujinx.Graphics.OpenGL/Pipeline.cs50
1 files changed, 7 insertions, 43 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Pipeline.cs b/Ryujinx.Graphics.OpenGL/Pipeline.cs
index 6277fe16..06cf5ef4 100644
--- a/Ryujinx.Graphics.OpenGL/Pipeline.cs
+++ b/Ryujinx.Graphics.OpenGL/Pipeline.cs
@@ -32,12 +32,10 @@ namespace Ryujinx.Graphics.OpenGL
private int _boundReadFramebuffer;
private int[] _fpIsBgra = new int[8];
- private float[] _fpRenderScale = new float[33];
- private float[] _cpRenderScale = new float[32];
+ private float[] _fpRenderScale = new float[65];
+ private float[] _cpRenderScale = new float[64];
private TextureBase _unit0Texture;
- private TextureBase _rtColor0Texture;
- private TextureBase _rtDepthTexture;
private FrontFaceDirection _frontFace;
private ClipOrigin _clipOrigin;
@@ -847,9 +845,6 @@ namespace Ryujinx.Graphics.OpenGL
{
EnsureFramebuffer();
- _rtColor0Texture = (TextureBase)colors[0];
- _rtDepthTexture = (TextureBase)depthStencil;
-
for (int index = 0; index < colors.Length; index++)
{
TextureView color = (TextureView)colors[index];
@@ -963,39 +958,6 @@ namespace Ryujinx.Graphics.OpenGL
{
((TextureBase)texture).Bind(unit);
}
-
- // Update scale factor for bound textures.
-
- switch (stage)
- {
- case ShaderStage.Fragment:
- if (_program.FragmentRenderScaleUniform != -1)
- {
- // Only update and send sampled texture scales if the shader uses them.
- bool interpolate = false;
- float scale = texture.ScaleFactor;
-
- if (scale != 1)
- {
- TextureBase activeTarget = _rtColor0Texture ?? _rtDepthTexture;
-
- if (activeTarget != null && activeTarget.Width / (float)texture.Width == activeTarget.Height / (float)texture.Height)
- {
- // If the texture's size is a multiple of the sampler size,
- // enable interpolation using gl_FragCoord.
- // (helps "invent" new integer values between scaled pixels)
- interpolate = true;
- }
- }
-
- _fpRenderScale[index + 1] = interpolate ? -scale : scale;
- }
- break;
-
- case ShaderStage.Compute:
- _cpRenderScale[index] = texture.ScaleFactor;
- break;
- }
}
}
@@ -1232,7 +1194,7 @@ namespace Ryujinx.Graphics.OpenGL
}
}
- public void UpdateRenderScale(ShaderStage stage, int textureCount)
+ public void UpdateRenderScale(ShaderStage stage, float[] scales, int textureCount, int imageCount)
{
if (_program != null)
{
@@ -1241,14 +1203,16 @@ namespace Ryujinx.Graphics.OpenGL
case ShaderStage.Fragment:
if (_program.FragmentRenderScaleUniform != -1)
{
- GL.Uniform1(_program.FragmentRenderScaleUniform, textureCount + 1, _fpRenderScale);
+ Array.Copy(scales, 0, _fpRenderScale, 1, textureCount + imageCount);
+ GL.Uniform1(_program.FragmentRenderScaleUniform, 1 + textureCount + imageCount, _fpRenderScale);
}
break;
case ShaderStage.Compute:
if (_program.ComputeRenderScaleUniform != -1)
{
- GL.Uniform1(_program.ComputeRenderScaleUniform, textureCount, _cpRenderScale);
+ Array.Copy(scales, 0, _cpRenderScale, 0, textureCount + imageCount);
+ GL.Uniform1(_program.ComputeRenderScaleUniform, textureCount + imageCount, _cpRenderScale);
}
break;
}