summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Barbieri <luca@luca-barbieri.com>2010-09-04 21:22:02 +0200
committerLuca Barbieri <luca@luca-barbieri.com>2010-09-04 22:45:21 +0200
commit2e6c65722a98066e51d587365fc82f47c0af1158 (patch)
tree8ae0621320ee2b625a63a2db3550bf1f3131ea36
parent90d3291595f0ea197d850aeac42333e35654ab58 (diff)
nvfx: fix some subrectangle copies
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".
-rw-r--r--src/gallium/drivers/nvfx/nv04_2d.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/gallium/drivers/nvfx/nv04_2d.c b/src/gallium/drivers/nvfx/nv04_2d.c
index ef07e542c21..bc6012f013d 100644
--- a/src/gallium/drivers/nvfx/nv04_2d.c
+++ b/src/gallium/drivers/nvfx/nv04_2d.c
@@ -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;