r300: better fix for glCopyTexSubImage
authorMaciej Cencora <m.cencora@gmail.com>
Tue, 15 Dec 2009 22:57:05 +0000 (23:57 +0100)
committerMaciej Cencora <m.cencora@gmail.com>
Sat, 19 Dec 2009 13:43:08 +0000 (14:43 +0100)
src/mesa/drivers/dri/r300/r300_blit.c
src/mesa/drivers/dri/r300/r300_texcopy.c

index ca6dd3bcf8e4d6ea231d54bf68cd7b99044b6417..d03fbfa07d65044d792b3ec3bbc4134f2c892cc2 100644 (file)
@@ -162,7 +162,7 @@ static void r300_emit_tx_setup(struct r300_context *r300,
                      R300_TX_SIZE_TXPITCH_EN);
 
     OUT_BATCH_REGVAL(R300_TX_FORMAT_0, r300TranslateTexFormat(mesa_format));
-    OUT_BATCH_REGVAL(R300_TX_FORMAT2_0, pitch/_mesa_get_format_bytes(mesa_format) - 1);
+    OUT_BATCH_REGVAL(R300_TX_FORMAT2_0, pitch - 1);
     OUT_BATCH_REGSEQ(R300_TX_OFFSET_0, 1);
     OUT_BATCH_RELOC(0, bo, offset, RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
 
@@ -339,7 +339,7 @@ static void emit_pvs_setup(struct r300_context *r300,
     END_BATCH();
 }
 
-static void emit_vap_setup(struct r300_context *r300, unsigned width, unsigned height)
+static void emit_vap_setup(struct r300_context *r300)
 {
     BATCH_LOCALS(&r300->radeon);
 
@@ -389,12 +389,14 @@ static GLboolean validate_buffers(struct r300_context *r300,
     return GL_TRUE;
 }
 
-static void emit_draw_packet(struct r300_context *r300, float width, float height)
+static void emit_draw_packet(struct r300_context *r300,
+                             float src_width, float src_height,
+                             float dst_width, float dst_height)
 {
-    float verts[] = {   0.0,    0.0, 0.0, 1.0,
-                        0.0, height, 0.0, 0.0,
-                      width, height, 1.0, 0.0,
-                      width,    0.0, 1.0, 1.0 };
+    float verts[] = { 0.0, 0.0, 0.0, 1.0,
+                      0.0, dst_height, 0.0, 1.0 - dst_height/src_height,
+                      dst_width, dst_height, dst_width/src_width, 1.0 - dst_height/src_height,
+                      dst_width, 0.0, dst_width/src_width, 1.0 };
 
     BATCH_LOCALS(&r300->radeon);
 
@@ -473,18 +475,22 @@ GLboolean r300_blit(struct r300_context *r300,
                     unsigned dst_width,
                     unsigned dst_height)
 {
+    /* Need to clamp the destination size to make sure
+     * we don't write outside of the buffer
+     */
+    dst_width = MIN2(dst_width, src_width);
+    dst_height = MIN2(src_height, dst_height);
+
     if (src_bo == dst_bo) {
         return GL_FALSE;
     }
 
     if (0) {
-        fprintf(stderr, "src: width %d, height %d, pitch %d vs %d, format %s\n",
+        fprintf(stderr, "src: width %d, height %d, pitch %d, format %s\n",
                 src_width, src_height, src_pitch,
-                _mesa_format_row_stride(src_mesaformat, src_width),
                 _mesa_get_format_name(src_mesaformat));
         fprintf(stderr, "dst: width %d, height %d, pitch %d, format %s\n",
-                dst_width, dst_height,
-                _mesa_format_row_stride(dst_mesaformat, dst_width),
+                dst_width, dst_height, dst_pitch,
                 _mesa_get_format_name(dst_mesaformat));
     }
 
@@ -506,11 +512,11 @@ 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_vap_setup(r300);
 
     emit_cb_setup(r300, dst_bo, dst_offset, dst_mesaformat, dst_pitch, dst_width, dst_height);
 
-    emit_draw_packet(r300, dst_width, dst_height);
+    emit_draw_packet(r300, src_width, src_height, dst_width, dst_height);
 
     r300EmitCacheFlush(r300);
 
index 7702a1d67dfa057391f98ae2f585590df8447ec7..893c8586f7ed93923e592c80ed9ab38a7f37ba89 100644 (file)
@@ -77,14 +77,14 @@ do_copy_texsubimage(GLcontext *ctx,
         fprintf(stderr, "%s: copying to face %d, level %d\n",
                 __FUNCTION__, _mesa_tex_target_to_face(target), level);
         fprintf(stderr, "to: x %d, y %d, offset %d\n", dstx, dsty, (uint32_t) dst_offset);
-        fprintf(stderr, "from (%dx%d) width %d, height %d, offset %d, pitch %d, width %d\n",
-                x, y, width, height, (uint32_t) src_offset, rrb->pitch, rrb->pitch/rrb->cpp);
+        fprintf(stderr, "from (%dx%d) width %d, height %d, offset %d, pitch %d\n",
+                x, y, rrb->base.Width, rrb->base.Height, (uint32_t) src_offset, rrb->pitch/rrb->cpp);
         fprintf(stderr, "src size %d, dst size %d\n", rrb->bo->size, timg->mt->bo->size);
 
     }
 
     /* blit from src buffer to texture */
-    return r300_blit(r300, rrb->bo, src_offset, rrb->base.Format, rrb->pitch,
+    return r300_blit(r300, rrb->bo, src_offset, rrb->base.Format, rrb->pitch/rrb->cpp,
                      rrb->base.Width, rrb->base.Height, timg->mt->bo ? timg->mt->bo : timg->bo, dst_offset,
                      timg->base.TexFormat, timg->base.Width, width, height);
 }