|
|
1a3082 |
From 6c6c6ad5412f5bb13592630d7cb3b7aed25d159b Mon Sep 17 00:00:00 2001
|
|
|
1a3082 |
From: Pekka Paalanen <pekka.paalanen@collabora.com>
|
|
|
1a3082 |
Date: Mon, 6 May 2019 14:09:16 +0300
|
|
|
1a3082 |
Subject: [PATCH 04/12] cogl: Relax formats on glBlitFramebuffer
|
|
|
1a3082 |
|
|
|
1a3082 |
Depends on: "cogl: Replace ANGLE with GLES3 and NV framebuffer_blit"
|
|
|
1a3082 |
|
|
|
1a3082 |
As a possible ANGLE implementation is not longer limiting the pixel format
|
|
|
1a3082 |
matching, lift the requirement of having the same pixel format.
|
|
|
1a3082 |
|
|
|
1a3082 |
We still cannot do a premult <-> non-premult conversion during a blit, so guard
|
|
|
1a3082 |
against that.
|
|
|
1a3082 |
|
|
|
1a3082 |
This will be useful in follow-up work to copy from onscreen primary GPU
|
|
|
1a3082 |
framebuffer to an offscreen secondary GPU framebuffer if the formats do not
|
|
|
1a3082 |
match exactly.
|
|
|
1a3082 |
|
|
|
1a3082 |
https://gitlab.gnome.org/GNOME/mutter/merge_requests/615
|
|
|
1a3082 |
|
|
|
1a3082 |
(cherry picked from commit 6df34eb4b7c65210f4066f7eb9bd462278b7279b)
|
|
|
1a3082 |
---
|
|
|
1a3082 |
cogl/cogl/cogl-blit.c | 10 ++++++----
|
|
|
1a3082 |
cogl/cogl/cogl-framebuffer-private.h | 8 ++++++--
|
|
|
1a3082 |
cogl/cogl/cogl-framebuffer.c | 6 ++++--
|
|
|
1a3082 |
3 files changed, 16 insertions(+), 8 deletions(-)
|
|
|
1a3082 |
|
|
|
1a3082 |
diff --git a/cogl/cogl/cogl-blit.c b/cogl/cogl/cogl-blit.c
|
|
|
1a3082 |
index 74f404f3d..a61eb66d2 100644
|
|
|
1a3082 |
--- a/cogl/cogl/cogl-blit.c
|
|
|
1a3082 |
+++ b/cogl/cogl/cogl-blit.c
|
|
|
1a3082 |
@@ -4,6 +4,7 @@
|
|
|
1a3082 |
* A Low Level GPU Graphics and Utilities API
|
|
|
1a3082 |
*
|
|
|
1a3082 |
* Copyright (C) 2011 Intel Corporation.
|
|
|
1a3082 |
+ * Copyright (C) 2019 DisplayLink (UK) Ltd.
|
|
|
1a3082 |
*
|
|
|
1a3082 |
* Permission is hereby granted, free of charge, to any person
|
|
|
1a3082 |
* obtaining a copy of this software and associated documentation
|
|
|
1a3082 |
@@ -152,10 +153,11 @@ _cogl_blit_framebuffer_begin (CoglBlitData *data)
|
|
|
1a3082 |
CoglFramebuffer *dst_fb, *src_fb;
|
|
|
1a3082 |
CoglError *ignore_error = NULL;
|
|
|
1a3082 |
|
|
|
1a3082 |
- /* We can only blit between FBOs if both textures are the same
|
|
|
1a3082 |
- format and the blit framebuffer extension is supported */
|
|
|
1a3082 |
- if ((_cogl_texture_get_format (data->src_tex) & ~COGL_A_BIT) !=
|
|
|
1a3082 |
- (_cogl_texture_get_format (data->dst_tex) & ~COGL_A_BIT) ||
|
|
|
1a3082 |
+ /* We can only blit between FBOs if both textures have the same
|
|
|
1a3082 |
+ premult convention and the blit framebuffer extension is
|
|
|
1a3082 |
+ supported. */
|
|
|
1a3082 |
+ if ((_cogl_texture_get_format (data->src_tex) & COGL_PREMULT_BIT) !=
|
|
|
1a3082 |
+ (_cogl_texture_get_format (data->dst_tex) & COGL_PREMULT_BIT) ||
|
|
|
1a3082 |
!_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_OFFSCREEN_BLIT))
|
|
|
1a3082 |
return FALSE;
|
|
|
1a3082 |
|
|
|
1a3082 |
diff --git a/cogl/cogl/cogl-framebuffer-private.h b/cogl/cogl/cogl-framebuffer-private.h
|
|
|
1a3082 |
index 3aab852c4..b06fbaee1 100644
|
|
|
1a3082 |
--- a/cogl/cogl/cogl-framebuffer-private.h
|
|
|
1a3082 |
+++ b/cogl/cogl/cogl-framebuffer-private.h
|
|
|
1a3082 |
@@ -381,8 +381,12 @@ _cogl_push_framebuffers (CoglFramebuffer *draw_buffer,
|
|
|
1a3082 |
* This blits a region of the color buffer of the source buffer
|
|
|
1a3082 |
* to the destination buffer. This function should only be
|
|
|
1a3082 |
* called if the COGL_PRIVATE_FEATURE_OFFSCREEN_BLIT feature is
|
|
|
1a3082 |
- * advertised. The two buffers must both be offscreen and have the
|
|
|
1a3082 |
- * same format.
|
|
|
1a3082 |
+ * advertised. The two buffers must both be offscreen.
|
|
|
1a3082 |
+ *
|
|
|
1a3082 |
+ * The two buffers must have the same value types (e.g. floating-point,
|
|
|
1a3082 |
+ * unsigned int, signed int, or fixed-point), but color formats do not
|
|
|
1a3082 |
+ * need to match. This limitation comes from OpenGL ES 3.0 definition
|
|
|
1a3082 |
+ * of glBlitFramebuffer.
|
|
|
1a3082 |
*
|
|
|
1a3082 |
* Note that this function differs a lot from the glBlitFramebuffer
|
|
|
1a3082 |
* function provided by the GL_EXT_framebuffer_blit extension. Notably
|
|
|
1a3082 |
diff --git a/cogl/cogl/cogl-framebuffer.c b/cogl/cogl/cogl-framebuffer.c
|
|
|
1a3082 |
index bd8a7fa42..0bc225945 100644
|
|
|
1a3082 |
--- a/cogl/cogl/cogl-framebuffer.c
|
|
|
1a3082 |
+++ b/cogl/cogl/cogl-framebuffer.c
|
|
|
1a3082 |
@@ -4,6 +4,7 @@
|
|
|
1a3082 |
* A Low Level GPU Graphics and Utilities API
|
|
|
1a3082 |
*
|
|
|
1a3082 |
* Copyright (C) 2007,2008,2009,2012 Intel Corporation.
|
|
|
1a3082 |
+ * Copyright (C) 2019 DisplayLink (UK) Ltd.
|
|
|
1a3082 |
*
|
|
|
1a3082 |
* Permission is hereby granted, free of charge, to any person
|
|
|
1a3082 |
* obtaining a copy of this software and associated documentation
|
|
|
1a3082 |
@@ -1468,8 +1469,9 @@ _cogl_blit_framebuffer (CoglFramebuffer *src,
|
|
|
1a3082 |
support this */
|
|
|
1a3082 |
_COGL_RETURN_IF_FAIL (cogl_is_offscreen (src));
|
|
|
1a3082 |
_COGL_RETURN_IF_FAIL (cogl_is_offscreen (dest));
|
|
|
1a3082 |
- /* The buffers must be the same format */
|
|
|
1a3082 |
- _COGL_RETURN_IF_FAIL (src->internal_format == dest->internal_format);
|
|
|
1a3082 |
+ /* The buffers must use the same premult convention */
|
|
|
1a3082 |
+ _COGL_RETURN_IF_FAIL ((src->internal_format & COGL_PREMULT_BIT) ==
|
|
|
1a3082 |
+ (dest->internal_format & COGL_PREMULT_BIT));
|
|
|
1a3082 |
|
|
|
1a3082 |
/* Make sure the current framebuffers are bound. We explicitly avoid
|
|
|
1a3082 |
flushing the clip state so we can bind our own empty state */
|
|
|
1a3082 |
--
|
|
|
1a3082 |
2.21.0
|
|
|
1a3082 |
|