nvfx: fix some subrectangle copies
authorLuca Barbieri <luca@luca-barbieri.com>
Sat, 4 Sep 2010 19:22:02 +0000 (21:22 +0200)
committerLuca Barbieri <luca@luca-barbieri.com>
Sat, 4 Sep 2010 20:45:21 +0000 (22:45 +0200)
Actually, we may want to get rid of the x/y coordinates for linear
surfaces, and realign the origin from scratch if necessary, instead
of doing this "on-demand realignment".

src/gallium/drivers/nvfx/nv04_2d.c

index ef07e542c2190aaa4b48a1f7c8d504f3fe371a50..bc6012f013d110c3eeab37e0b587efbcd61dd93e 100644 (file)
@@ -365,19 +365,21 @@ nv04_region_do_align_offset(struct nv04_region* rgn, unsigned w, unsigned h, int
 {
        if(rgn->pitch > 0)
        {
-               int delta;
-
                assert(!(rgn->offset & ((1 << rgn->bpps) - 1))); // fatal!
-               delta = rgn->offset & ((1 << shift) - 1);
 
                if(h <= 1)
                {
-                       rgn->x += delta >> rgn->bpps;
+                       int delta;
+                       rgn->offset += rgn->y * rgn->pitch + (rgn->x << rgn->bpps);
+                       delta = rgn->offset & ((1 << shift) - 1);
+                       rgn->y = 0;
+                       rgn->x = delta >> rgn->bpps;
                        rgn->offset -= delta;
                        rgn->pitch = align((rgn->x + w) << rgn->bpps, 1 << shift);
                }
                else
                {
+                       int delta = rgn->offset & ((1 << shift) - 1);
                        int newxo = (rgn->x << rgn->bpps) + delta;
                        int dy = newxo / rgn->pitch;
                        newxo -= dy * rgn->pitch;