From 4080253b3b2981d6750948cf6dc351368065ad41 Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Mon, 30 May 2022 23:45:41 -0700 Subject: [PATCH] Fix framebuffer mapping for viewport and scissor --- impeller/geometry/matrix.h | 2 +- .../renderer/backend/gles/render_pass_gles.cc | 23 ++++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/impeller/geometry/matrix.h b/impeller/geometry/matrix.h index 0284507e58d8e..bea6a393d0941 100644 --- a/impeller/geometry/matrix.h +++ b/impeller/geometry/matrix.h @@ -27,7 +27,7 @@ namespace impeller { /// * Left-handed coordinate system. Positive rotation is /// clockwise about axis of rotation. /// * Lower left corner is -1.0, -1.0. -/// * Upper left corner is 1.0, 1.0. +/// * Upper right corner is 1.0, 1.0. /// * Visible z-space is from 0.0 to 1.0. /// * This is NOT the same as OpenGL! Be careful. /// * NDC origin is at (0.0, 0.0, 0.5). diff --git a/impeller/renderer/backend/gles/render_pass_gles.cc b/impeller/renderer/backend/gles/render_pass_gles.cc index a57e7407f5373..e1b400363977e 100644 --- a/impeller/renderer/backend/gles/render_pass_gles.cc +++ b/impeller/renderer/backend/gles/render_pass_gles.cc @@ -281,14 +281,20 @@ struct RenderPassData { gl.Disable(GL_DEPTH_TEST); } + // Both the viewport and scissor are specified in framebuffer coordinates. + // Impeller's framebuffer coordinate system is top left origin, but OpenGL's + // is bottom left origin, so we convert the coordinates here. + auto target_size = pass_data.color_attachment->GetSize(); + //-------------------------------------------------------------------------- /// Setup the viewport. /// const auto& viewport = command.viewport.value_or(pass_data.viewport); - gl.Viewport(viewport.rect.origin.x, // x - viewport.rect.origin.y, // y - viewport.rect.size.width, // width - viewport.rect.size.height // height + gl.Viewport(viewport.rect.origin.x, // x + target_size.height - viewport.rect.origin.y - + viewport.rect.size.height, // y + viewport.rect.size.width, // width + viewport.rect.size.height // height ); if (pass_data.depth_attachment) { gl.DepthRangef(viewport.depth_range.z_near, viewport.depth_range.z_far); @@ -300,10 +306,11 @@ struct RenderPassData { if (command.scissor.has_value()) { const auto& scissor = command.scissor.value(); gl.Enable(GL_SCISSOR_TEST); - gl.Scissor(scissor.origin.x, // x - scissor.origin.y, // y - scissor.size.width, // width - scissor.size.width // height + gl.Scissor( + scissor.origin.x, // x + target_size.height - scissor.origin.y - scissor.size.height, // y + scissor.size.width, // width + scissor.size.height // height ); } else { gl.Disable(GL_SCISSOR_TEST);