|
|
@@ -191,7 +191,8 @@ void RendererOpenGL::DrawSingleScreenRotated(const TextureInfo& texture, float x
|
|
|
* Draws the emulated screens to the emulator window.
|
|
|
*/
|
|
|
void RendererOpenGL::DrawScreens() {
|
|
|
- glViewport(0, 0, resolution_width, resolution_height);
|
|
|
+ UpdateViewportExtent();
|
|
|
+ glViewport(viewport_extent.x, viewport_extent.y, viewport_extent.width, viewport_extent.height);
|
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
|
|
glUseProgram(program_id);
|
|
|
@@ -228,6 +229,39 @@ void RendererOpenGL::SetWindow(EmuWindow* window) {
|
|
|
render_window = window;
|
|
|
}
|
|
|
|
|
|
+void RendererOpenGL::UpdateViewportExtent() {
|
|
|
+ int width_in_pixels;
|
|
|
+ int height_in_pixels;
|
|
|
+
|
|
|
+ render_window->GetFramebufferSize(&width_in_pixels, &height_in_pixels);
|
|
|
+
|
|
|
+ // No update needed if framebuffer size hasn't changed
|
|
|
+ if (width_in_pixels == framebuffer_size.width && height_in_pixels == framebuffer_size.height) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ framebuffer_size.width = width_in_pixels;
|
|
|
+ framebuffer_size.height = height_in_pixels;
|
|
|
+
|
|
|
+ float window_aspect_ratio = static_cast<float>(height_in_pixels) / width_in_pixels;
|
|
|
+ float emulation_aspect_ratio = static_cast<float>(resolution_height) / resolution_width;
|
|
|
+
|
|
|
+ if (window_aspect_ratio > emulation_aspect_ratio) {
|
|
|
+ // If the window is more narrow than the emulation content, borders are applied on the
|
|
|
+ // top and bottom of the window.
|
|
|
+ viewport_extent.width = width_in_pixels;
|
|
|
+ viewport_extent.height = emulation_aspect_ratio * viewport_extent.width;
|
|
|
+ viewport_extent.x = 0;
|
|
|
+ viewport_extent.y = (height_in_pixels - viewport_extent.height) / 2;
|
|
|
+ } else {
|
|
|
+ // Otherwise, borders are applied on the left and right sides of the window.
|
|
|
+ viewport_extent.height = height_in_pixels;
|
|
|
+ viewport_extent.width = (1 / emulation_aspect_ratio) * viewport_extent.height;
|
|
|
+ viewport_extent.x = (width_in_pixels - viewport_extent.width) / 2;
|
|
|
+ viewport_extent.y = 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/// Initialize the renderer
|
|
|
void RendererOpenGL::Init() {
|
|
|
render_window->MakeCurrent();
|