diff --git a/src/r600_exa.c b/src/r600_exa.c index 18831f7..988ec7e 100644 --- a/src/r600_exa.c +++ b/src/r600_exa.c @@ -1279,18 +1279,53 @@ static Bool R600TextureSetup(PicturePtr pPict, PixmapPtr pPix, set_tex_sampler (pScrn, accel_state->ib, &tex_samp); if (pPict->transform != 0) { + int tw = w; + int th = h; accel_state->is_transform[unit] = TRUE; accel_state->transform[unit] = pPict->transform; vs_alu_consts[0] = xFixedToFloat(pPict->transform->matrix[0][0]); vs_alu_consts[1] = xFixedToFloat(pPict->transform->matrix[0][1]); vs_alu_consts[2] = xFixedToFloat(pPict->transform->matrix[0][2]); - vs_alu_consts[3] = 1.0 / w; + //vs_alu_consts[3] = 1.0 / w; vs_alu_consts[4] = xFixedToFloat(pPict->transform->matrix[1][0]); vs_alu_consts[5] = xFixedToFloat(pPict->transform->matrix[1][1]); vs_alu_consts[6] = xFixedToFloat(pPict->transform->matrix[1][2]); - vs_alu_consts[7] = 1.0 / h; + //vs_alu_consts[7] = 1.0 / h; + + /* right */ + if ((vs_alu_consts[0] == 0) && + (vs_alu_consts[1] == 1) && + (vs_alu_consts[2] == 0) && + (vs_alu_consts[4] == -1) && + (vs_alu_consts[5] == 0) && + (vs_alu_consts[6] != 0)) + th++; + + /* left */ + if ((vs_alu_consts[0] == 0) && + (vs_alu_consts[1] == -1) && + (vs_alu_consts[2] != 0) && + (vs_alu_consts[4] == 1) && + (vs_alu_consts[5] == 0) && + (vs_alu_consts[6] == 0)) + tw++; + + /* inverted */ + if ((vs_alu_consts[0] == -1) && + (vs_alu_consts[1] == 0) && + (vs_alu_consts[2] != 0) && + (vs_alu_consts[4] == 0) && + (vs_alu_consts[5] == -1) && + (vs_alu_consts[6] != 0)) { + th++; + tw++; + } + + vs_alu_consts[3] = 1.0 / tw; + vs_alu_consts[7] = 1.0 / th; + } else { accel_state->is_transform[unit] = FALSE;