[Mesa-dev] [PATCH] st/mesa: fix frontbuffer glReadPixels regressions
Roland Scheidegger
sroland at vmware.com
Wed Feb 24 01:20:12 UTC 2016
Am 24.02.2016 um 00:40 schrieb Brian Paul:
> The change "mesa/readpix: Don't clip in _mesa_readpixels()" caused a
> few piglit regressions. The failing tests use glReadPixels to read
> from the front color buffer. The problem is we were trying to read
> from a non-existant front color buffer. The front color buffer is
> created on demand in st/mesa. Since the missing buffer bounds were
> effectively 0 x 0 the glReadPixels was totally clipped and returned
> early.
>
> The fix involves creating the real front color buffer when we're about
> to try reading from it.
>
> Tested with llvmpipe and VMware driver on Linux, Windows.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94253
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94254
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94257
> Cc: mesa-stable at lists.freedesktop.org
> ---
> src/mesa/state_tracker/st_cb_fbo.c | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
> index 2a2eb09..e17ef66 100644
> --- a/src/mesa/state_tracker/st_cb_fbo.c
> +++ b/src/mesa/state_tracker/st_cb_fbo.c
> @@ -44,6 +44,7 @@
> #include "pipe/p_context.h"
> #include "pipe/p_defines.h"
> #include "pipe/p_screen.h"
> +#include "st_atom.h"
> #include "st_context.h"
> #include "st_cb_fbo.h"
> #include "st_cb_flush.h"
> @@ -711,9 +712,17 @@ st_ReadBuffer(struct gl_context *ctx, GLenum buffer)
>
> (void) buffer;
>
> - /* add the renderbuffer on demand */
> - if (fb->_ColorReadBufferIndex >= 0)
> + /* Check if we need to allocate a front color buffer.
> + * Front buffers are often allocated on demand (other color buffers are
> + * always allocated in advance).
> + */
> + if ((fb->_ColorReadBufferIndex == BUFFER_FRONT_LEFT ||
> + fb->_ColorReadBufferIndex == BUFFER_FRONT_RIGHT) &&
> + fb->Attachment[fb->_ColorReadBufferIndex].Type == GL_NONE) {
> + /* add the buffer */
> st_manager_add_color_renderbuffer(st, fb, fb->_ColorReadBufferIndex);
> + st_validate_state( st, ST_PIPELINE_RENDER );
extra whitespace?
> + }
> }
>
>
>
For the series:
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
More information about the mesa-dev
mailing list