summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar Kevin Hartman2014-08-29 22:23:12 -0700
committerGravatar Tony Wasserka2014-11-18 13:06:05 +0100
commit221a9b023d8c9ca55c093823e9efd6d13d0a54a2 (patch)
tree57a26a0e11416b366688d00c4a2c9216fa0cde78 /src/video_core
parentAdd a GUI logging channel. (diff)
downloadyuzu-221a9b023d8c9ca55c093823e9efd6d13d0a54a2.tar.gz
yuzu-221a9b023d8c9ca55c093823e9efd6d13d0a54a2.tar.xz
yuzu-221a9b023d8c9ca55c093823e9efd6d13d0a54a2.zip
Viewport scaling and display density independence
The view is scaled to be as large as possible, without changing the aspect, within the bounds of the window. On "retina" displays, or other displays where window units != pixels, the view should no longer draw incorrectly.
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp36
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.h15
2 files changed, 50 insertions, 1 deletions
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index 8483f79be..3757482db 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -191,7 +191,8 @@ void RendererOpenGL::DrawSingleScreenRotated(const TextureInfo& texture, float x
191 * Draws the emulated screens to the emulator window. 191 * Draws the emulated screens to the emulator window.
192 */ 192 */
193void RendererOpenGL::DrawScreens() { 193void RendererOpenGL::DrawScreens() {
194 glViewport(0, 0, resolution_width, resolution_height); 194 UpdateViewportExtent();
195 glViewport(viewport_extent.x, viewport_extent.y, viewport_extent.width, viewport_extent.height);
195 glClear(GL_COLOR_BUFFER_BIT); 196 glClear(GL_COLOR_BUFFER_BIT);
196 197
197 glUseProgram(program_id); 198 glUseProgram(program_id);
@@ -228,6 +229,39 @@ void RendererOpenGL::SetWindow(EmuWindow* window) {
228 render_window = window; 229 render_window = window;
229} 230}
230 231
232void RendererOpenGL::UpdateViewportExtent() {
233 int width_in_pixels;
234 int height_in_pixels;
235
236 render_window->GetFramebufferSize(&width_in_pixels, &height_in_pixels);
237
238 // No update needed if framebuffer size hasn't changed
239 if (width_in_pixels == framebuffer_size.width && height_in_pixels == framebuffer_size.height) {
240 return;
241 }
242
243 framebuffer_size.width = width_in_pixels;
244 framebuffer_size.height = height_in_pixels;
245
246 float window_aspect_ratio = static_cast<float>(height_in_pixels) / width_in_pixels;
247 float emulation_aspect_ratio = static_cast<float>(resolution_height) / resolution_width;
248
249 if (window_aspect_ratio > emulation_aspect_ratio) {
250 // If the window is more narrow than the emulation content, borders are applied on the
251 // top and bottom of the window.
252 viewport_extent.width = width_in_pixels;
253 viewport_extent.height = emulation_aspect_ratio * viewport_extent.width;
254 viewport_extent.x = 0;
255 viewport_extent.y = (height_in_pixels - viewport_extent.height) / 2;
256 } else {
257 // Otherwise, borders are applied on the left and right sides of the window.
258 viewport_extent.height = height_in_pixels;
259 viewport_extent.width = (1 / emulation_aspect_ratio) * viewport_extent.height;
260 viewport_extent.x = (width_in_pixels - viewport_extent.width) / 2;
261 viewport_extent.y = 0;
262 }
263}
264
231/// Initialize the renderer 265/// Initialize the renderer
232void RendererOpenGL::Init() { 266void RendererOpenGL::Init() {
233 render_window->MakeCurrent(); 267 render_window->MakeCurrent();
diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h
index eed201a95..d440e2bc7 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.h
+++ b/src/video_core/renderer_opengl/renderer_opengl.h
@@ -52,12 +52,27 @@ private:
52 static void LoadFBToActiveGLTexture(const GPU::Regs::FramebufferConfig& framebuffer, 52 static void LoadFBToActiveGLTexture(const GPU::Regs::FramebufferConfig& framebuffer,
53 const TextureInfo& texture); 53 const TextureInfo& texture);
54 54
55 /// Updates the viewport rectangle
56 void UpdateViewportExtent();
57
55 EmuWindow* render_window; ///< Handle to render window 58 EmuWindow* render_window; ///< Handle to render window
56 u32 last_mode; ///< Last render mode 59 u32 last_mode; ///< Last render mode
57 60
58 int resolution_width; ///< Current resolution width 61 int resolution_width; ///< Current resolution width
59 int resolution_height; ///< Current resolution height 62 int resolution_height; ///< Current resolution height
60 63
64 struct {
65 int width;
66 int height;
67 } framebuffer_size; ///< Current framebuffer size
68
69 struct {
70 int x;
71 int y;
72 int width;
73 int height;
74 } viewport_extent; ///< Current viewport rectangle
75
61 // OpenGL object IDs 76 // OpenGL object IDs
62 GLuint vertex_array_handle; 77 GLuint vertex_array_handle;
63 GLuint vertex_buffer_handle; 78 GLuint vertex_buffer_handle;