mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
softpipe: use shadow_compare4() to compare texcoord to four texture samples
This commit is contained in:
parent
005ee9f4e0
commit
efe9faf061
1 changed files with 78 additions and 12 deletions
|
|
@ -705,6 +705,9 @@ get_texel(const struct tgsi_sampler *tgsi_sampler,
|
|||
* Compare texcoord 'p' (aka R) against texture value 'rgba[0]'
|
||||
* When we sampled the depth texture, the depth value was put into all
|
||||
* RGBA channels. We look at the red channel here.
|
||||
* \param rgba quad of (depth) texel values
|
||||
* \param p texture 'P' components for four pixels in quad
|
||||
* \param j which pixel in the quad to test [0..3]
|
||||
*/
|
||||
static INLINE void
|
||||
shadow_compare(const struct pipe_sampler_state *sampler,
|
||||
|
|
@ -750,6 +753,78 @@ shadow_compare(const struct pipe_sampler_state *sampler,
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* As above, but do four z/texture comparisons.
|
||||
*/
|
||||
static INLINE void
|
||||
shadow_compare4(const struct pipe_sampler_state *sampler,
|
||||
float rgba[NUM_CHANNELS][QUAD_SIZE],
|
||||
const float p[QUAD_SIZE])
|
||||
{
|
||||
int j, k0, k1, k2, k3;
|
||||
float val;
|
||||
|
||||
/* compare four texcoords vs. four texture samples */
|
||||
switch (sampler->compare_func) {
|
||||
case PIPE_FUNC_LESS:
|
||||
k0 = p[0] < rgba[0][0];
|
||||
k1 = p[1] < rgba[0][1];
|
||||
k2 = p[2] < rgba[0][2];
|
||||
k3 = p[3] < rgba[0][3];
|
||||
break;
|
||||
case PIPE_FUNC_LEQUAL:
|
||||
k0 = p[0] <= rgba[0][0];
|
||||
k1 = p[1] <= rgba[0][1];
|
||||
k2 = p[2] <= rgba[0][2];
|
||||
k3 = p[3] <= rgba[0][3];
|
||||
break;
|
||||
case PIPE_FUNC_GREATER:
|
||||
k0 = p[0] > rgba[0][0];
|
||||
k1 = p[1] > rgba[0][1];
|
||||
k2 = p[2] > rgba[0][2];
|
||||
k3 = p[3] > rgba[0][3];
|
||||
break;
|
||||
case PIPE_FUNC_GEQUAL:
|
||||
k0 = p[0] >= rgba[0][0];
|
||||
k1 = p[1] >= rgba[0][1];
|
||||
k2 = p[2] >= rgba[0][2];
|
||||
k3 = p[3] >= rgba[0][3];
|
||||
break;
|
||||
case PIPE_FUNC_EQUAL:
|
||||
k0 = p[0] == rgba[0][0];
|
||||
k1 = p[1] == rgba[0][1];
|
||||
k2 = p[2] == rgba[0][2];
|
||||
k3 = p[3] == rgba[0][3];
|
||||
break;
|
||||
case PIPE_FUNC_NOTEQUAL:
|
||||
k0 = p[0] != rgba[0][0];
|
||||
k1 = p[1] != rgba[0][1];
|
||||
k2 = p[2] != rgba[0][2];
|
||||
k3 = p[3] != rgba[0][3];
|
||||
break;
|
||||
case PIPE_FUNC_ALWAYS:
|
||||
k0 = k1 = k2 = k3 = 1;
|
||||
break;
|
||||
case PIPE_FUNC_NEVER:
|
||||
k0 = k1 = k2 = k3 = 0;
|
||||
break;
|
||||
default:
|
||||
k0 = k1 = k2 = k3 = 0;
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
/* convert four pass/fail values to an intensity in [0,1] */
|
||||
val = 0.25F * (k0 + k1 + k2 + k3);
|
||||
|
||||
/* XXX returning result for default GL_DEPTH_TEXTURE_MODE = GL_LUMINANCE */
|
||||
for (j = 0; j < 4; j++) {
|
||||
rgba[0][j] = rgba[1][j] = rgba[2][j] = val;
|
||||
rgba[3][j] = 1.0F;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Common code for sampling 1D/2D/cube textures.
|
||||
* Could probably extend for 3D...
|
||||
|
|
@ -832,10 +907,7 @@ sp_get_samples_2d_common(const struct tgsi_sampler *tgsi_sampler,
|
|||
get_texel(tgsi_sampler, faces[j], level0, x0[j], y1[j], 0, tx, 2);
|
||||
get_texel(tgsi_sampler, faces[j], level0, x1[j], y1[j], 0, tx, 3);
|
||||
if (sampler->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) {
|
||||
shadow_compare(sampler, tx, p, 0);
|
||||
shadow_compare(sampler, tx, p, 1);
|
||||
shadow_compare(sampler, tx, p, 2);
|
||||
shadow_compare(sampler, tx, p, 3);
|
||||
shadow_compare4(sampler, tx, p);
|
||||
}
|
||||
|
||||
/* interpolate R, G, B, A */
|
||||
|
|
@ -857,10 +929,7 @@ sp_get_samples_2d_common(const struct tgsi_sampler *tgsi_sampler,
|
|||
get_texel(tgsi_sampler, faces[j], level1, x0[j], y1[j], 0, tx, 2);
|
||||
get_texel(tgsi_sampler, faces[j], level1, x1[j], y1[j], 0, tx, 3);
|
||||
if (sampler->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE){
|
||||
shadow_compare(sampler, tx, p, 0);
|
||||
shadow_compare(sampler, tx, p, 1);
|
||||
shadow_compare(sampler, tx, p, 2);
|
||||
shadow_compare(sampler, tx, p, 3);
|
||||
shadow_compare4(sampler, tx, p);
|
||||
}
|
||||
|
||||
/* interpolate R, G, B, A */
|
||||
|
|
@ -1119,10 +1188,7 @@ sp_get_samples_rect(const struct tgsi_sampler *tgsi_sampler,
|
|||
get_texel(tgsi_sampler, face, level0, x0[j], y1[j], 0, tx, 2);
|
||||
get_texel(tgsi_sampler, face, level0, x1[j], y1[j], 0, tx, 3);
|
||||
if (sampler->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) {
|
||||
shadow_compare(sampler, tx, p, 0);
|
||||
shadow_compare(sampler, tx, p, 1);
|
||||
shadow_compare(sampler, tx, p, 2);
|
||||
shadow_compare(sampler, tx, p, 3);
|
||||
shadow_compare4(sampler, tx, p);
|
||||
}
|
||||
for (c = 0; c < 4; c++) {
|
||||
rgba[c][j] = lerp_2d(xw[j], yw[j],
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue