From: Michal Krol Date: Wed, 3 Feb 2010 14:30:17 +0000 (+0100) Subject: softpipe: Implement cylindrical wrapping for linear interpolator. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e04c8ecc61dfe05d0e17cbffd2f758b0861083bd;p=mesa.git softpipe: Implement cylindrical wrapping for linear interpolator. --- diff --git a/src/gallium/drivers/softpipe/sp_setup.c b/src/gallium/drivers/softpipe/sp_setup.c index bb1bff581cf..b7b52b15081 100644 --- a/src/gallium/drivers/softpipe/sp_setup.c +++ b/src/gallium/drivers/softpipe/sp_setup.c @@ -419,19 +419,38 @@ static void const_coeff( struct setup_context *setup, * Compute a0, dadx and dady for a linearly interpolated coefficient, * for a triangle. */ -static void tri_linear_coeff( struct setup_context *setup, - struct tgsi_interp_coef *coef, - uint vertSlot, uint i) +static void +tri_linear_coeff(struct setup_context *setup, + struct tgsi_interp_coef *coef, + uint vertSlot, + uint i, + uint cylindrical_wrap) { float botda = setup->vmid[vertSlot][i] - setup->vmin[vertSlot][i]; float majda = setup->vmax[vertSlot][i] - setup->vmin[vertSlot][i]; - float a = setup->ebot.dy * majda - botda * setup->emaj.dy; - float b = setup->emaj.dx * botda - majda * setup->ebot.dx; - float dadx = a * setup->oneoverarea; - float dady = b * setup->oneoverarea; + float a, b; + float dadx, dady; assert(i <= 3); + if (cylindrical_wrap) { + if (botda > 0.5f) { + botda -= 1.0f; + } else if (botda < -0.5f) { + botda += 1.0f; + } + if (majda > 0.5f) { + majda -= 1.0f; + } else if (majda < -0.5f) { + majda += 1.0f; + } + } + + a = setup->ebot.dy * majda - botda * setup->emaj.dy; + b = setup->emaj.dx * botda - majda * setup->ebot.dx; + dadx = a * setup->oneoverarea; + dady = b * setup->oneoverarea; + coef->dadx[i] = dadx; coef->dady[i] = dady; @@ -547,8 +566,8 @@ static void setup_tri_coefficients( struct setup_context *setup ) /* z and w are done by linear interpolation: */ - tri_linear_coeff(setup, &setup->posCoef, 0, 2); - tri_linear_coeff(setup, &setup->posCoef, 0, 3); + tri_linear_coeff(setup, &setup->posCoef, 0, 2, 0); + tri_linear_coeff(setup, &setup->posCoef, 0, 3, 0); /* setup interpolation for all the remaining attributes: */ @@ -562,8 +581,13 @@ static void setup_tri_coefficients( struct setup_context *setup ) const_coeff(setup, &setup->coef[fragSlot], vertSlot, j); break; case INTERP_LINEAR: - for (j = 0; j < NUM_CHANNELS; j++) - tri_linear_coeff(setup, &setup->coef[fragSlot], vertSlot, j); + for (j = 0; j < NUM_CHANNELS; j++) { + tri_linear_coeff(setup, + &setup->coef[fragSlot], + vertSlot, + j, + spfs->info.input_cylindrical_wrap[fragSlot] & (1 << j)); + } break; case INTERP_PERSPECTIVE: for (j = 0; j < NUM_CHANNELS; j++)