Somewhat better ClearBuffers implementation

This commit is contained in:
gdkchan 2018-06-28 00:11:49 -03:00
parent e6eeb6f09f
commit 22f138628b
3 changed files with 16 additions and 19 deletions

View file

@ -2,7 +2,7 @@ namespace Ryujinx.Graphics.Gal
{ {
public interface IGalRasterizer public interface IGalRasterizer
{ {
void ClearBuffers(int RtIndex, GalClearBufferFlags Flags); void ClearBuffers(GalClearBufferFlags Flags);
bool IsVboCached(long Key, long DataSize); bool IsVboCached(long Key, long DataSize);

View file

@ -70,18 +70,15 @@ namespace Ryujinx.Graphics.Gal.OpenGL
IndexBuffer = new IbInfo(); 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. GL.ColorMask(
if (Flags.HasFlag(GalClearBufferFlags.ColorRed) && Flags.HasFlag(GalClearBufferFlags.ColorRed),
Flags.HasFlag(GalClearBufferFlags.ColorGreen) && Flags.HasFlag(GalClearBufferFlags.ColorGreen),
Flags.HasFlag(GalClearBufferFlags.ColorBlue) && Flags.HasFlag(GalClearBufferFlags.ColorBlue),
Flags.HasFlag(GalClearBufferFlags.ColorAlpha)) Flags.HasFlag(GalClearBufferFlags.ColorAlpha));
{
Mask = ClearBufferMask.ColorBufferBit;
}
if (Flags.HasFlag(GalClearBufferFlags.Depth)) if (Flags.HasFlag(GalClearBufferFlags.Depth))
{ {
@ -94,6 +91,8 @@ namespace Ryujinx.Graphics.Gal.OpenGL
} }
GL.Clear(Mask); GL.Clear(Mask);
GL.ColorMask(true, true, true, true);
} }
public bool IsVboCached(long Key, long DataSize) public bool IsVboCached(long Key, long DataSize)

View file

@ -94,30 +94,28 @@ namespace Ryujinx.HLE.Gpu.Engines
int FbIndex = (Arg0 >> 6) & 0xf; int FbIndex = (Arg0 >> 6) & 0xf;
int Layer = (Arg0 >> 10) & 0x3ff;
GalClearBufferFlags Flags = (GalClearBufferFlags)(Arg0 & 0x3f); 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) private void SetFrameBuffer(NvGpuVmm Vmm, int FbIndex)
{ {
long VA = MakeInt64From2xInt32(NvGpuEngine3dReg.FrameBufferNAddress + FbIndex * 0x10); 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 Width = ReadRegister(NvGpuEngine3dReg.FrameBufferNWidth + FbIndex * 0x10);
int Height = ReadRegister(NvGpuEngine3dReg.FrameBufferNHeight + FbIndex * 0x10); int Height = ReadRegister(NvGpuEngine3dReg.FrameBufferNHeight + FbIndex * 0x10);
//Note: Using the Width/Height results seems to give incorrect results. //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. //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.Create(Key, 1280, 720);
Gpu.Renderer.FrameBuffer.Bind(PA); Gpu.Renderer.FrameBuffer.Bind(Key);
} }
private long[] UploadShaders(NvGpuVmm Vmm) private long[] UploadShaders(NvGpuVmm Vmm)