From: Maciej Cencora Date: Sun, 13 Dec 2009 15:12:11 +0000 (+0100) Subject: r300: fix glCopyTexSubImage X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9d8501bf2742519cc958c5f32122e196b64f8278;p=mesa.git r300: fix glCopyTexSubImage Need to properly setup colorbuffer when dst pitch != dst width. --- diff --git a/src/mesa/drivers/dri/r300/r300_blit.c b/src/mesa/drivers/dri/r300/r300_blit.c index 10e1b3c9124..ff678bac454 100644 --- a/src/mesa/drivers/dri/r300/r300_blit.c +++ b/src/mesa/drivers/dri/r300/r300_blit.c @@ -428,6 +428,7 @@ static void emit_cb_setup(struct r300_context *r300, struct radeon_bo *bo, intptr_t offset, gl_format mesa_format, + unsigned pitch, unsigned width, unsigned height) { @@ -448,7 +449,7 @@ static void emit_cb_setup(struct r300_context *r300, r300_emit_cb_setup(r300, bo, offset, mesa_format, _mesa_get_format_bytes(mesa_format), - _mesa_format_row_stride(mesa_format, width)); + _mesa_format_row_stride(mesa_format, pitch)); BEGIN_BATCH_NO_AUTOSTATE(5); OUT_BATCH_REGSEQ(R300_SC_SCISSORS_TL, 2); @@ -468,18 +469,14 @@ GLboolean r300_blit(struct r300_context *r300, struct radeon_bo *dst_bo, intptr_t dst_offset, gl_format dst_mesaformat, + unsigned dst_pitch, unsigned dst_width, unsigned dst_height) { - //assert(src_width == dst_width); - //assert(src_height == dst_height); - if (src_bo == dst_bo) { return GL_FALSE; } - //return GL_FALSE; - if (0) { fprintf(stderr, "src: width %d, height %d, pitch %d vs %d, format %s\n", src_width, src_height, src_pitch, @@ -511,14 +508,13 @@ GLboolean r300_blit(struct r300_context *r300, emit_pvs_setup(r300, r300->blit.vp_code.body.d, 2); emit_vap_setup(r300, dst_width, dst_height); - emit_cb_setup(r300, dst_bo, dst_offset, dst_mesaformat, dst_width, dst_height); + emit_cb_setup(r300, dst_bo, dst_offset, dst_mesaformat, dst_pitch, dst_width, dst_height); emit_draw_packet(r300, dst_width, dst_height); r300EmitCacheFlush(r300); radeonFlush(r300->radeon.glCtx); - //r300ResetHwState(r300); return GL_TRUE; } \ No newline at end of file diff --git a/src/mesa/drivers/dri/r300/r300_blit.h b/src/mesa/drivers/dri/r300/r300_blit.h index 29c5aa95149..28ffd4ea421 100644 --- a/src/mesa/drivers/dri/r300/r300_blit.h +++ b/src/mesa/drivers/dri/r300/r300_blit.h @@ -40,6 +40,7 @@ GLboolean r300_blit(struct r300_context *r300, struct radeon_bo *dst_bo, intptr_t dst_offset, gl_format dst_mesaformat, + unsigned dst_pitch, unsigned dst_width, unsigned dst_height); diff --git a/src/mesa/drivers/dri/r300/r300_texcopy.c b/src/mesa/drivers/dri/r300/r300_texcopy.c index 5e3a724d4e6..7702a1d67df 100644 --- a/src/mesa/drivers/dri/r300/r300_texcopy.c +++ b/src/mesa/drivers/dri/r300/r300_texcopy.c @@ -63,7 +63,6 @@ do_copy_texsubimage(GLcontext *ctx, assert(timg->mt->bo); assert(timg->base.Width >= dstx + width); assert(timg->base.Height >= dsty + height); - //assert(tobj->mt == timg->mt); intptr_t src_offset = rrb->draw_offset + x * rrb->cpp + y * rrb->pitch; intptr_t dst_offset = radeon_miptree_image_offset(timg->mt, _mesa_tex_target_to_face(target), level); @@ -87,7 +86,7 @@ do_copy_texsubimage(GLcontext *ctx, /* blit from src buffer to texture */ return r300_blit(r300, rrb->bo, src_offset, rrb->base.Format, rrb->pitch, rrb->base.Width, rrb->base.Height, timg->mt->bo ? timg->mt->bo : timg->bo, dst_offset, - timg->base.TexFormat, width, height); + timg->base.TexFormat, timg->base.Width, width, height); } static void