aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-06-28 00:11:49 -0300
committergdkchan <gab.dark.100@gmail.com>2018-06-28 00:11:49 -0300
commit22f138628bd05419791d3b569ec558bbf322398d (patch)
tree1bfbafc07dd3269158279523a8a6bb9cfb76e1fa
parente6eeb6f09ff592f5b27e115d1817654de7568757 (diff)
Somewhat better ClearBuffers implementation
-rw-r--r--Ryujinx.Graphics/Gal/IGalRasterizer.cs2
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs19
-rw-r--r--Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs14
3 files changed, 16 insertions, 19 deletions
diff --git a/Ryujinx.Graphics/Gal/IGalRasterizer.cs b/Ryujinx.Graphics/Gal/IGalRasterizer.cs
index 1323372a..45f92f27 100644
--- a/Ryujinx.Graphics/Gal/IGalRasterizer.cs
+++ b/Ryujinx.Graphics/Gal/IGalRasterizer.cs
@@ -2,7 +2,7 @@ namespace Ryujinx.Graphics.Gal
{
public interface IGalRasterizer
{
- void ClearBuffers(int RtIndex, GalClearBufferFlags Flags);
+ void ClearBuffers(GalClearBufferFlags Flags);
bool IsVboCached(long Key, long DataSize);
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs
index 05250696..ebd1e8d1 100644
--- a/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs
+++ b/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs
@@ -70,18 +70,15 @@ namespace Ryujinx.Graphics.Gal.OpenGL
IndexBuffer = new IbInfo();
}
- public void ClearBuffers(int RtIndex, GalClearBufferFlags Flags)
+ public void ClearBuffers(GalClearBufferFlags Flags)
{
- ClearBufferMask Mask = 0;
+ ClearBufferMask Mask = ClearBufferMask.ColorBufferBit;
- //TODO: Use glColorMask to clear just the specified channels.
- if (Flags.HasFlag(GalClearBufferFlags.ColorRed) &&
- Flags.HasFlag(GalClearBufferFlags.ColorGreen) &&
- Flags.HasFlag(GalClearBufferFlags.ColorBlue) &&
- Flags.HasFlag(GalClearBufferFlags.ColorAlpha))
- {
- Mask = ClearBufferMask.ColorBufferBit;
- }
+ GL.ColorMask(
+ Flags.HasFlag(GalClearBufferFlags.ColorRed),
+ Flags.HasFlag(GalClearBufferFlags.ColorGreen),
+ Flags.HasFlag(GalClearBufferFlags.ColorBlue),
+ Flags.HasFlag(GalClearBufferFlags.ColorAlpha));
if (Flags.HasFlag(GalClearBufferFlags.Depth))
{
@@ -94,6 +91,8 @@ namespace Ryujinx.Graphics.Gal.OpenGL
}
GL.Clear(Mask);
+
+ GL.ColorMask(true, true, true, true);
}
public bool IsVboCached(long Key, long DataSize)
diff --git a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs
index 380082b3..56cb7688 100644
--- a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs
+++ b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs
@@ -94,30 +94,28 @@ namespace Ryujinx.HLE.Gpu.Engines
int FbIndex = (Arg0 >> 6) & 0xf;
- int Layer = (Arg0 >> 10) & 0x3ff;
-
GalClearBufferFlags Flags = (GalClearBufferFlags)(Arg0 & 0x3f);
- SetFrameBuffer(Vmm, 0);
+ SetFrameBuffer(Vmm, FbIndex);
- Gpu.Renderer.Rasterizer.ClearBuffers(Layer, Flags);
+ Gpu.Renderer.Rasterizer.ClearBuffers(Flags);
}
private void SetFrameBuffer(NvGpuVmm Vmm, int FbIndex)
{
long VA = MakeInt64From2xInt32(NvGpuEngine3dReg.FrameBufferNAddress + FbIndex * 0x10);
- long PA = Vmm.GetPhysicalAddress(VA);
+ long Key = Vmm.GetPhysicalAddress(VA);
- FrameBuffers.Add(PA);
+ FrameBuffers.Add(Key);
int Width = ReadRegister(NvGpuEngine3dReg.FrameBufferNWidth + FbIndex * 0x10);
int Height = ReadRegister(NvGpuEngine3dReg.FrameBufferNHeight + FbIndex * 0x10);
//Note: Using the Width/Height results seems to give incorrect results.
//Maybe the size of all frame buffers is hardcoded to screen size? This seems unlikely.
- Gpu.Renderer.FrameBuffer.Create(PA, 1280, 720);
- Gpu.Renderer.FrameBuffer.Bind(PA);
+ Gpu.Renderer.FrameBuffer.Create(Key, 1280, 720);
+ Gpu.Renderer.FrameBuffer.Bind(Key);
}
private long[] UploadShaders(NvGpuVmm Vmm)