diff options
author | gdkchan <gab.dark.100@gmail.com> | 2022-02-16 19:15:39 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-16 23:15:39 +0100 |
commit | 3bd357045f7581ee10d6c86ed8049bcebe35eda0 (patch) | |
tree | aa2d243843f2d31d3afa690f26352713ddac4349 /Ryujinx.Graphics.OpenGL/Program.cs | |
parent | ab5d77c0c4925955180dc51e9f289187ce6f2901 (diff) |
Do not allow render targets not explicitly written by the fragment shader to be modified (#3063)1.1.31
* Do not allow render targets not explicitly written by the fragment shader to be modified
* Shader cache version bump
* Remove blank lines
* Avoid redundant color mask updates
* HostShaderCacheEntry can be null
* Avoid more redundant glColorMask calls
* nit: Mask -> Masks
* Fix currentComponentMask
* More efficient way to update _currentComponentMasks
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Program.cs')
-rw-r--r-- | Ryujinx.Graphics.OpenGL/Program.cs | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Program.cs b/Ryujinx.Graphics.OpenGL/Program.cs index 95902990..838162cc 100644 --- a/Ryujinx.Graphics.OpenGL/Program.cs +++ b/Ryujinx.Graphics.OpenGL/Program.cs @@ -1,11 +1,8 @@ using OpenTK.Graphics.OpenGL; using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; -using Ryujinx.Graphics.Shader.CodeGen.Glsl; using System; using System.Buffers.Binary; -using System.Collections.Generic; -using System.Linq; namespace Ryujinx.Graphics.OpenGL { @@ -29,7 +26,10 @@ namespace Ryujinx.Graphics.OpenGL private ProgramLinkStatus _status = ProgramLinkStatus.Incomplete; private IShader[] _shaders; - public Program(IShader[] shaders) + public bool HasFragmentShader; + public int FragmentOutputMap { get; } + + public Program(IShader[] shaders, int fragmentOutputMap) { Handle = GL.CreateProgram(); @@ -37,17 +37,23 @@ namespace Ryujinx.Graphics.OpenGL for (int index = 0; index < shaders.Length; index++) { - int shaderHandle = ((Shader)shaders[index]).Handle; + Shader shader = (Shader)shaders[index]; - GL.AttachShader(Handle, shaderHandle); + if (shader.IsFragment) + { + HasFragmentShader = true; + } + + GL.AttachShader(Handle, shader.Handle); } GL.LinkProgram(Handle); _shaders = shaders; + FragmentOutputMap = fragmentOutputMap; } - public Program(ReadOnlySpan<byte> code) + public Program(ReadOnlySpan<byte> code, bool hasFragmentShader, int fragmentOutputMap) { BinaryFormat binaryFormat = (BinaryFormat)BinaryPrimitives.ReadInt32LittleEndian(code.Slice(code.Length - 4, 4)); @@ -60,6 +66,9 @@ namespace Ryujinx.Graphics.OpenGL GL.ProgramBinary(Handle, binaryFormat, (IntPtr)ptr, code.Length - 4); } } + + HasFragmentShader = hasFragmentShader; + FragmentOutputMap = fragmentOutputMap; } public void Bind() |