mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-25 16:40:30 +01:00
meta: Fix reading luminance texture as rgba in _mesa_meta_pbo_GetTexSubImage()
After recent addition of pbo testing in piglit test getteximage-luminance,
it fails on i965. This patch makes a sub test pass.
This patch adds a clear color operation to meta pbo path, which I think is
better than falling back to software path.
V2: Fix color mask for GL_LUMINANCE_ALPHA
Cc: <mesa-stable@lists.freedesktop.org>
Signed-off-by: Anuj Phogat <anuj.phogat@gmail.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
(cherry picked from commit aa40546b2d)
This commit is contained in:
parent
def2d2e018
commit
f167d9b46c
1 changed files with 34 additions and 2 deletions
|
|
@ -28,6 +28,7 @@
|
|||
#include "blend.h"
|
||||
#include "bufferobj.h"
|
||||
#include "buffers.h"
|
||||
#include "clear.h"
|
||||
#include "fbobject.h"
|
||||
#include "glformats.h"
|
||||
#include "glheader.h"
|
||||
|
|
@ -278,8 +279,9 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims,
|
|||
int full_height, image_height;
|
||||
struct gl_texture_image *pbo_tex_image;
|
||||
struct gl_renderbuffer *rb = NULL;
|
||||
GLenum status;
|
||||
bool success = false;
|
||||
GLenum status, src_base_format;
|
||||
bool success = false, clear_channels_to_zero = false;
|
||||
float save_clear_color[4];
|
||||
int z;
|
||||
|
||||
if (!_mesa_is_bufferobj(packing->BufferObj))
|
||||
|
|
@ -380,6 +382,27 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims,
|
|||
GL_COLOR_BUFFER_BIT, GL_NEAREST))
|
||||
goto fail;
|
||||
|
||||
src_base_format = tex_image ?
|
||||
tex_image->_BaseFormat :
|
||||
ctx->ReadBuffer->_ColorReadBuffer->_BaseFormat;
|
||||
|
||||
/* Depending on the base formats involved we might need to rebase some
|
||||
* values. For example if we download from a Luminance format to RGBA
|
||||
* format, we want G=0 and B=0.
|
||||
*/
|
||||
clear_channels_to_zero =
|
||||
_mesa_need_luminance_to_rgb_conversion(src_base_format,
|
||||
pbo_tex_image->_BaseFormat);
|
||||
|
||||
if (clear_channels_to_zero) {
|
||||
memcpy(save_clear_color, ctx->Color.ClearColor.f, 4 * sizeof(float));
|
||||
/* Clear the Green, Blue channels. */
|
||||
_mesa_ColorMask(GL_FALSE, GL_TRUE, GL_TRUE,
|
||||
src_base_format != GL_LUMINANCE_ALPHA);
|
||||
_mesa_ClearColor(0.0, 0.0, 0.0, 1.0);
|
||||
_mesa_Clear(GL_COLOR_BUFFER_BIT);
|
||||
}
|
||||
|
||||
for (z = 1; z < depth; z++) {
|
||||
_mesa_meta_bind_fbo_image(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
||||
tex_image, zoffset + z);
|
||||
|
|
@ -392,6 +415,15 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims,
|
|||
0, z * image_height,
|
||||
width, z * image_height + height,
|
||||
GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||
if (clear_channels_to_zero)
|
||||
_mesa_Clear(GL_COLOR_BUFFER_BIT);
|
||||
}
|
||||
|
||||
/* Unmask the color channels and restore the saved clear color values. */
|
||||
if (clear_channels_to_zero) {
|
||||
_mesa_ColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
_mesa_ClearColor(save_clear_color[0], save_clear_color[1],
|
||||
save_clear_color[2], save_clear_color[3]);
|
||||
}
|
||||
|
||||
success = true;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue