Somewhat better ClearBuffers implementation
This commit is contained in:
parent
e6eeb6f09f
commit
22f138628b
3 changed files with 16 additions and 19 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue