summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorAnuj Phogat <[email protected]>2015-05-12 05:46:04 -0700
committerAnuj Phogat <[email protected]>2015-07-24 10:48:58 -0700
commitaa40546b2de4cd572af02d31fd5c7d4045505ea2 (patch)
tree742f636d3db6389567e20747a33d13783f47d799 /src/mesa
parentbe405ee334ec758a2609d8780221f4f1a1ed3343 (diff)
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: <[email protected]> Signed-off-by: Anuj Phogat <[email protected]> Reviewed-by: Iago Toral Quiroga <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/common/meta_tex_subimage.c36
1 files changed, 34 insertions, 2 deletions
diff --git a/src/mesa/drivers/common/meta_tex_subimage.c b/src/mesa/drivers/common/meta_tex_subimage.c
index 038d5259b3f..8c0a50984d2 100644
--- a/src/mesa/drivers/common/meta_tex_subimage.c
+++ b/src/mesa/drivers/common/meta_tex_subimage.c
@@ -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"
@@ -279,8 +280,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))
@@ -381,6 +383,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);
@@ -393,6 +416,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;