Corrects the format for the temp texture used in for the case where source framebuffer is an integer texture when blitframebuffer_texture() cannot be used. Note: Does NOT correct the underling blits, rather only corrects the format of the temporary texture to be an integer format.
--- src/mesa/drivers/common/meta.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index f12bcaa..b446053 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -356,6 +356,34 @@ static void meta_glsl_clear_cleanup(struct clear_state *clear); static void meta_glsl_generate_mipmap_cleanup(struct gen_mipmap_state *mipmap); static void meta_decompress_cleanup(struct decompress_state *decompress); static void meta_drawpix_cleanup(struct drawpix_state *drawpix); +static GLenum meta_integer_suffixed_format(GLenum base_format); + +/** + * returns the base_format value suffixed with _INTEGER + */ +static GLenum +meta_integer_suffixed_format(GLenum base_format) +{ + switch(base_format) { + case GL_RED: + return GL_RED_INTEGER; + case GL_RG: + return GL_RG_INTEGER; + case GL_RGB: + return GL_RGB_INTEGER; + case GL_RGBA: + return GL_RGBA_INTEGER; + case GL_ALPHA: + return GL_ALPHA_INTEGER_EXT; + case GL_LUMINANCE: + return GL_LUMINANCE_INTEGER_EXT; + case GL_LUMINANCE_ALPHA: + return GL_LUMINANCE_ALPHA_INTEGER_EXT; + default: + return base_format; + } +} + static GLuint compile_shader_with_debug(struct gl_context *ctx, GLenum target, const GLcharARB *source) @@ -1902,15 +1930,23 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx, const struct gl_renderbuffer *colorReadRb = readFb->_ColorReadBuffer; const GLenum rb_base_format = _mesa_base_tex_format(ctx, colorReadRb->InternalFormat); + const GLenum rb_datatype = + _mesa_get_format_datatype(colorReadRb->Format); + const GLenum rb_format = (rb_datatype==GL_INT + || rb_datatype==GL_UNSIGNED_INT) ? + meta_integer_suffixed_format(rb_base_format): + rb_base_format; + + - /* Using the exact source rectangle to create the texture does incorrect + /* Using the exact source rectangle to create the texture does incorrect * linear filtering along the edges. So, allocate the texture extended along * edges by one pixel in x, y directions. */ - newTex = alloc_texture(tex, srcW + 2, srcH + 2, rb_base_format); + newTex = alloc_texture(tex, srcW + 2, srcH + 2, colorReadRb->InternalFormat); setup_copypix_texture(ctx, tex, newTex, srcX - 1, srcY - 1, srcW + 2, srcH + 2, - rb_base_format, filter); + rb_format, filter); /* texcoords (after texture allocation!) */ { verts[0].s = 1.0F; -- 1.8.1.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev