diff options
| author | Merry <MerryMage@users.noreply.github.com> | 2018-02-20 10:52:35 +0000 |
|---|---|---|
| committer | gdkchan <gab.dark.100@gmail.com> | 2018-02-20 07:52:35 -0300 |
| commit | dff28df84eafec61de1eb460e8c17cb1651f8983 (patch) | |
| tree | 99bd5528268a352c5bb04c0e4f441b523daa676e | |
| parent | 1039797c30ffc2b9f091d3dc813c2494320acba8 (diff) | |
Resize display to window size (#27)
| -rw-r--r-- | Ryujinx/Ui/GLScreen.cs | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/Ryujinx/Ui/GLScreen.cs b/Ryujinx/Ui/GLScreen.cs index 0f03d4a0..8101648e 100644 --- a/Ryujinx/Ui/GLScreen.cs +++ b/Ryujinx/Ui/GLScreen.cs @@ -137,6 +137,8 @@ namespace Ryujinx precision highp float; +uniform vec2 window_size; + layout(location = 0) in vec3 in_position; layout(location = 1) in vec4 in_color; layout(location = 2) in vec2 in_tex_coord; @@ -144,10 +146,20 @@ layout(location = 2) in vec2 in_tex_coord; out vec4 color; out vec2 tex_coord; +// Have a fixed aspect ratio, fit the image within the available space. +vec3 get_scale_ratio() { + vec2 native_size = vec2(1280, 720); + vec2 ratio = vec2( + (window_size.y * native_size.x) / (native_size.y * window_size.x), + (window_size.x * native_size.y) / (native_size.x * window_size.y) + ); + return vec3(min(ratio, vec2(1, 1)), 1); +} + void main(void) { color = in_color; tex_coord = in_tex_coord; - gl_Position = vec4((in_position + vec3(-960, 270, 0)) / vec3(1920, 270, 1), 1); + gl_Position = vec4(in_position * get_scale_ratio(), 1); }"; private string FragShaderSource = @" @@ -168,6 +180,8 @@ void main(void) { private int VtxShaderHandle, FragShaderHandle, PrgShaderHandle; + + private int WindowSizeUniformLocation; private int VaoHandle; private int VboHandle; @@ -216,10 +230,10 @@ void main(void) { uint[] Buffer = new uint[] { - 0xc4700000, 0x80000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, - 0x45340000, 0x80000000, 0x00000000, 0xffffffff, 0x00000000, 0x3f800000, 0x00000000, - 0xc4700000, 0xc4070000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x3f800000, - 0x45340000, 0xc4070000, 0x00000000, 0xffffffff, 0x00000000, 0x3f800000, 0x3f800000 + 0xbf800000, 0x3f800000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, + 0x3f800000, 0x3f800000, 0x00000000, 0xffffffff, 0x00000000, 0x3f800000, 0x00000000, + 0xbf800000, 0xbf800000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x3f800000, + 0x3f800000, 0xbf800000, 0x00000000, 0xffffffff, 0x00000000, 0x3f800000, 0x3f800000 }; IntPtr Length = new IntPtr(Buffer.Length * 4); @@ -269,8 +283,10 @@ void main(void) { GL.UseProgram(PrgShaderHandle); int TexLocation = GL.GetUniformLocation(PrgShaderHandle, "tex"); - GL.Uniform1(TexLocation, 0); + + WindowSizeUniformLocation = GL.GetUniformLocation(PrgShaderHandle, "window_size"); + GL.Uniform2(WindowSizeUniformLocation, new Vector2(1280.0f, 720.0f)); } protected override void OnUpdateFrame(FrameEventArgs e) @@ -335,7 +351,7 @@ void main(void) { protected override void OnRenderFrame(FrameEventArgs e) { - GL.Viewport(0, 0, 1280, 720); + GL.Viewport(0, 0, Width, Height); Title = $"Ryujinx Screen - (Vsync: {VSync} - FPS: {1f / e.Time:0})"; @@ -352,6 +368,12 @@ void main(void) { SwapBuffers(); } + protected override void OnResize(EventArgs e) + { + GL.UseProgram(PrgShaderHandle); + GL.Uniform2(WindowSizeUniformLocation, new Vector2(Width, Height)); + } + void RenderFb() { GL.ActiveTexture(TextureUnit.Texture0); |
