cogl/gl-framebuffer: Check Y-flipped-ness instead of framebuffer type

In a few places coordinates were flipped if driven framebuffer was or
wasn't a CoglOffscreen. Change this to use the existing Y-flipped-ness
class vfunc.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1514>
This commit is contained in:
Jonas Ådahl 2020-10-20 11:57:34 +02:00 committed by Robert Mader
parent 102aa59ce3
commit 6b5d7f45cb
3 changed files with 17 additions and 15 deletions

View File

@ -310,4 +310,14 @@ cogl_framebuffer_get_journal (CoglFramebuffer *framebuffer);
CoglFramebufferDriver * CoglFramebufferDriver *
cogl_framebuffer_get_driver (CoglFramebuffer *framebuffer); cogl_framebuffer_get_driver (CoglFramebuffer *framebuffer);
/**
* cogl_framebuffer_is_y_flipped:
* @framebuffer: a #CoglFramebuffer
*
* Returns %TRUE if the Y coordinate 0 means the bottom of the framebuffer, and
* %FALSE if the Y coordinate means the top.
*/
gboolean
cogl_framebuffer_is_y_flipped (CoglFramebuffer *framebuffer);
#endif /* __COGL_FRAMEBUFFER_PRIVATE_H */ #endif /* __COGL_FRAMEBUFFER_PRIVATE_H */

View File

@ -1577,7 +1577,7 @@ cogl_framebuffer_read_pixels (CoglFramebuffer *framebuffer,
return ret; return ret;
} }
static gboolean gboolean
cogl_framebuffer_is_y_flipped (CoglFramebuffer *framebuffer) cogl_framebuffer_is_y_flipped (CoglFramebuffer *framebuffer)
{ {
return COGL_FRAMEBUFFER_GET_CLASS (framebuffer)->is_y_flipped (framebuffer); return COGL_FRAMEBUFFER_GET_CLASS (framebuffer)->is_y_flipped (framebuffer);

View File

@ -77,9 +77,8 @@ cogl_gl_framebuffer_flush_viewport_state (CoglGlFramebuffer *gl_framebuffer)
/* Convert the Cogl viewport y offset to an OpenGL viewport y offset /* Convert the Cogl viewport y offset to an OpenGL viewport y offset
* NB: OpenGL defines its window and viewport origins to be bottom * NB: OpenGL defines its window and viewport origins to be bottom
* left, while Cogl defines them to be top left. * left, while Cogl defines them to be top left.
* NB: We render upside down to offscreen framebuffers so we don't */
* need to convert the y offset in this case. */ if (cogl_framebuffer_is_y_flipped (framebuffer))
if (COGL_IS_OFFSCREEN (framebuffer))
gl_viewport_y = viewport_y; gl_viewport_y = viewport_y;
else else
gl_viewport_y = gl_viewport_y =
@ -441,12 +440,9 @@ cogl_gl_framebuffer_read_pixels_into_bitmap (CoglFramebufferDriver *driver,
COGL_FRAMEBUFFER_STATE_BIND); COGL_FRAMEBUFFER_STATE_BIND);
/* The y coordinate should be given in OpenGL's coordinate system /* The y coordinate should be given in OpenGL's coordinate system
* so 0 is the bottom row * so 0 is the bottom row.
*
* NB: all offscreen rendering is done upside down so no conversion
* is necissary in this case.
*/ */
if (!COGL_IS_OFFSCREEN (framebuffer)) if (!cogl_framebuffer_is_y_flipped (framebuffer))
y = framebuffer_height - y - height; y = framebuffer_height - y - height;
required_format = ctx->driver_vtable->pixel_format_to_gl (ctx, required_format = ctx->driver_vtable->pixel_format_to_gl (ctx,
@ -455,11 +451,9 @@ cogl_gl_framebuffer_read_pixels_into_bitmap (CoglFramebufferDriver *driver,
&gl_format, &gl_format,
&gl_type); &gl_type);
/* NB: All offscreen rendering is done upside down so there is no need
* to flip in this case... */
if (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_MESA_PACK_INVERT) && if (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_MESA_PACK_INVERT) &&
(source & COGL_READ_PIXELS_NO_FLIP) == 0 && (source & COGL_READ_PIXELS_NO_FLIP) == 0 &&
!COGL_IS_OFFSCREEN (framebuffer)) !cogl_framebuffer_is_y_flipped (framebuffer))
{ {
if (ctx->driver == COGL_DRIVER_GLES2) if (ctx->driver == COGL_DRIVER_GLES2)
gl_pack_enum = GL_PACK_REVERSE_ROW_ORDER_ANGLE; gl_pack_enum = GL_PACK_REVERSE_ROW_ORDER_ANGLE;
@ -614,9 +608,7 @@ cogl_gl_framebuffer_read_pixels_into_bitmap (CoglFramebufferDriver *driver,
goto EXIT; goto EXIT;
} }
/* NB: All offscreen rendering is done upside down so there is no need if (!cogl_framebuffer_is_y_flipped (framebuffer) &&
* to flip in this case... */
if (!COGL_IS_OFFSCREEN (framebuffer) &&
(source & COGL_READ_PIXELS_NO_FLIP) == 0 && (source & COGL_READ_PIXELS_NO_FLIP) == 0 &&
!pack_invert_set) !pack_invert_set)
{ {