Avoid clearing alpha channel by handle when presenting (#2323)
* Avoid clearning alpha channel by handle when presenting Previous code was binding then blitting while the framebuffer was bound and then clearing the alpha channel by its handle. This ended up triggering a bug since AMD driver 21.4.1 ending up clearing the whole framebuffer as a result. New code fix this weird logic by applying the clear on the bound framebuffer. Close #2236. * Address rip's comments * Fix AMD being broken once again
This commit is contained in:
parent
79b3243f54
commit
7527c5b906
2 changed files with 9 additions and 13 deletions
|
@ -1232,7 +1232,7 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RestoreComponentMask(int index)
|
public void RestoreComponentMask(int index)
|
||||||
{
|
{
|
||||||
// If the bound render target is bgra, swap the red and blue masks.
|
// If the bound render target is bgra, swap the red and blue masks.
|
||||||
uint redMask = _fpIsBgra[index] == 0 ? 1u : 4u;
|
uint redMask = _fpIsBgra[index] == 0 ? 1u : 4u;
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
using OpenTK.Graphics;
|
|
||||||
using OpenTK.Graphics.OpenGL;
|
using OpenTK.Graphics.OpenGL;
|
||||||
using Ryujinx.Graphics.GAL;
|
using Ryujinx.Graphics.GAL;
|
||||||
using Ryujinx.Graphics.OpenGL.Image;
|
using Ryujinx.Graphics.OpenGL.Image;
|
||||||
|
@ -39,12 +38,8 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
|
|
||||||
private void CopyTextureToFrameBufferRGB(int drawFramebuffer, int readFramebuffer, TextureView view, ImageCrop crop)
|
private void CopyTextureToFrameBufferRGB(int drawFramebuffer, int readFramebuffer, TextureView view, ImageCrop crop)
|
||||||
{
|
{
|
||||||
bool[] oldFramebufferColorWritemask = new bool[4];
|
|
||||||
|
|
||||||
(int oldDrawFramebufferHandle, int oldReadFramebufferHandle) = ((Pipeline)_renderer.Pipeline).GetBoundFramebuffers();
|
(int oldDrawFramebufferHandle, int oldReadFramebufferHandle) = ((Pipeline)_renderer.Pipeline).GetBoundFramebuffers();
|
||||||
|
|
||||||
GL.GetBoolean(GetIndexedPName.ColorWritemask, drawFramebuffer, oldFramebufferColorWritemask);
|
|
||||||
|
|
||||||
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, drawFramebuffer);
|
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, drawFramebuffer);
|
||||||
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, readFramebuffer);
|
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, readFramebuffer);
|
||||||
|
|
||||||
|
@ -124,13 +119,14 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
BlitFramebufferFilter.Linear);
|
BlitFramebufferFilter.Linear);
|
||||||
|
|
||||||
// Remove Alpha channel
|
// Remove Alpha channel
|
||||||
GL.ColorMask(drawFramebuffer, false, false, false, true);
|
GL.ColorMask(false, false, false, true);
|
||||||
GL.ClearBuffer(ClearBuffer.Color, drawFramebuffer, new float[] { 0.0f, 0.0f, 0.0f, 1.0f });
|
GL.ClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
GL.ColorMask(drawFramebuffer,
|
GL.Clear(ClearBufferMask.ColorBufferBit);
|
||||||
oldFramebufferColorWritemask[0],
|
|
||||||
oldFramebufferColorWritemask[1],
|
for (int i = 0; i < Constants.MaxRenderTargets; i++)
|
||||||
oldFramebufferColorWritemask[2],
|
{
|
||||||
oldFramebufferColorWritemask[3]);
|
((Pipeline)_renderer.Pipeline).RestoreComponentMask(i);
|
||||||
|
}
|
||||||
|
|
||||||
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, oldReadFramebufferHandle);
|
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, oldReadFramebufferHandle);
|
||||||
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, oldDrawFramebufferHandle);
|
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, oldDrawFramebufferHandle);
|
||||||
|
|
Reference in a new issue