[GPU] Fix frame buffer being upside down in some cases
This commit is contained in:
@ -7,6 +7,22 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||
{
|
||||
class OGLFrameBuffer
|
||||
{
|
||||
private struct Rect
|
||||
{
|
||||
public int X { get; private set; }
|
||||
public int Y { get; private set; }
|
||||
public int Width { get; private set; }
|
||||
public int Height { get; private set; }
|
||||
|
||||
public Rect(int X, int Y, int Width, int Height)
|
||||
{
|
||||
this.X = X;
|
||||
this.Y = Y;
|
||||
this.Width = Width;
|
||||
this.Height = Height;
|
||||
}
|
||||
}
|
||||
|
||||
private class FrameBuffer
|
||||
{
|
||||
public int Width { get; set; }
|
||||
@ -38,6 +54,8 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||
|
||||
private ShaderProgram Shader;
|
||||
|
||||
private Rect Viewport;
|
||||
|
||||
private bool IsInitialized;
|
||||
|
||||
private int RawFbTexWidth;
|
||||
@ -178,6 +196,13 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||
GL.UseProgram(CurrentProgram);
|
||||
}
|
||||
|
||||
public void SetViewport(int X, int Y, int Width, int Height)
|
||||
{
|
||||
Viewport = new Rect(X, Y, Width, Height);
|
||||
|
||||
//TODO
|
||||
}
|
||||
|
||||
public void Render()
|
||||
{
|
||||
if (CurrTexHandle != 0)
|
||||
@ -196,6 +221,8 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||
|
||||
GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
|
||||
|
||||
GL.Viewport(0, 0, 1280, 720);
|
||||
|
||||
GL.Clear(
|
||||
ClearBufferMask.ColorBufferBit |
|
||||
ClearBufferMask.DepthBufferBit);
|
||||
@ -218,6 +245,15 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||
}
|
||||
}
|
||||
|
||||
private void SetViewport()
|
||||
{
|
||||
GL.Viewport(
|
||||
Viewport.X,
|
||||
Viewport.Y,
|
||||
Viewport.Width,
|
||||
Viewport.Height);
|
||||
}
|
||||
|
||||
private void EnsureInitialized()
|
||||
{
|
||||
if (!IsInitialized)
|
||||
|
@ -158,6 +158,15 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||
GL.Uniform1(Location, Value);
|
||||
}
|
||||
|
||||
public void SetUniform2F(string UniformName, float X, float Y)
|
||||
{
|
||||
BindProgram();
|
||||
|
||||
int Location = GL.GetUniformLocation(CurrentProgramHandle, UniformName);
|
||||
|
||||
GL.Uniform2(Location, X, Y);
|
||||
}
|
||||
|
||||
public void Bind(long Tag)
|
||||
{
|
||||
if (Stages.TryGetValue(Tag, out ShaderStage Stage))
|
||||
|
@ -141,6 +141,11 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||
ActionsQueue.Enqueue(() => FrameBuffer.SetTransform(Transform, Offs));
|
||||
}
|
||||
|
||||
public void SetViewport(int X, int Y, int Width, int Height)
|
||||
{
|
||||
ActionsQueue.Enqueue(() => FrameBuffer.SetViewport(X, Y, Width, Height));
|
||||
}
|
||||
|
||||
public void ClearBuffers(int RtIndex, GalClearBufferFlags Flags)
|
||||
{
|
||||
ActionsQueue.Enqueue(() => Rasterizer.ClearBuffers(RtIndex, Flags));
|
||||
@ -218,6 +223,16 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||
ActionsQueue.Enqueue(() => Shader.SetUniform1(UniformName, Value));
|
||||
}
|
||||
|
||||
public void SetUniform2F(string UniformName, float X, float Y)
|
||||
{
|
||||
if (UniformName == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(UniformName));
|
||||
}
|
||||
|
||||
ActionsQueue.Enqueue(() => Shader.SetUniform2F(UniformName, X, Y));
|
||||
}
|
||||
|
||||
public IEnumerable<ShaderDeclInfo> GetTextureUsage(long Tag)
|
||||
{
|
||||
return Shader.GetTextureUsage(Tag);
|
||||
|
Reference in New Issue
Block a user