softpipe: implement TXF support via get_texel callback
This just calls the texel fetch functions directly bypassing the sampling, notes: 1: loops inside switch should be more optimal. 2: borders can be sampled though only up to border depth, outside that its undefined. Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -2606,6 +2606,74 @@ sample_get_dims(struct tgsi_sampler *tgsi_sampler, int level,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* this function is only used for unfiltered texel gets
|
||||||
|
via the TGSI TXF opcode. */
|
||||||
|
static void
|
||||||
|
sample_get_texels(struct tgsi_sampler *tgsi_sampler,
|
||||||
|
const int v_i[QUAD_SIZE],
|
||||||
|
const int v_j[QUAD_SIZE],
|
||||||
|
const int v_k[QUAD_SIZE],
|
||||||
|
const int lod[QUAD_SIZE],
|
||||||
|
float rgba[NUM_CHANNELS][QUAD_SIZE])
|
||||||
|
{
|
||||||
|
const struct sp_sampler_variant *samp = sp_sampler_variant(tgsi_sampler);
|
||||||
|
union tex_tile_address addr;
|
||||||
|
const struct pipe_resource *texture = samp->view->texture;
|
||||||
|
int j, c;
|
||||||
|
float *tx;
|
||||||
|
|
||||||
|
addr.value = 0;
|
||||||
|
/* TODO write a better test for LOD */
|
||||||
|
addr.bits.level = lod[0];
|
||||||
|
|
||||||
|
switch(texture->target) {
|
||||||
|
case PIPE_TEXTURE_1D:
|
||||||
|
for (j = 0; j < QUAD_SIZE; j++) {
|
||||||
|
tx = get_texel_2d(samp, addr, v_i[j], 0);
|
||||||
|
for (c = 0; c < 4; c++) {
|
||||||
|
rgba[c][j] = tx[c];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PIPE_TEXTURE_1D_ARRAY:
|
||||||
|
for (j = 0; j < QUAD_SIZE; j++) {
|
||||||
|
tx = get_texel_1d_array(samp, addr, v_i[j], v_j[j]);
|
||||||
|
for (c = 0; c < 4; c++) {
|
||||||
|
rgba[c][j] = tx[c];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PIPE_TEXTURE_2D:
|
||||||
|
case PIPE_TEXTURE_RECT:
|
||||||
|
for (j = 0; j < QUAD_SIZE; j++) {
|
||||||
|
tx = get_texel_2d(samp, addr, v_i[j], v_j[j]);
|
||||||
|
for (c = 0; c < 4; c++) {
|
||||||
|
rgba[c][j] = tx[c];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PIPE_TEXTURE_2D_ARRAY:
|
||||||
|
for (j = 0; j < QUAD_SIZE; j++) {
|
||||||
|
tx = get_texel_2d_array(samp, addr, v_i[j], v_j[j], v_k[j]);
|
||||||
|
for (c = 0; c < 4; c++) {
|
||||||
|
rgba[c][j] = tx[c];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PIPE_TEXTURE_3D:
|
||||||
|
for (j = 0; j < QUAD_SIZE; j++) {
|
||||||
|
tx = get_texel_3d(samp, addr, v_i[j], v_j[j], v_k[j]);
|
||||||
|
for (c = 0; c < 4; c++) {
|
||||||
|
rgba[c][j] = tx[c];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PIPE_TEXTURE_CUBE: /* TXF can't work on CUBE according to spec */
|
||||||
|
default:
|
||||||
|
assert(!"Unknown or CUBE texture type in TXF processing\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Create a sampler variant for a given set of non-orthogonal state.
|
* Create a sampler variant for a given set of non-orthogonal state.
|
||||||
*/
|
*/
|
||||||
@@ -2732,5 +2800,6 @@ sp_create_sampler_variant( const struct pipe_sampler_state *sampler,
|
|||||||
}
|
}
|
||||||
|
|
||||||
samp->base.get_dims = sample_get_dims;
|
samp->base.get_dims = sample_get_dims;
|
||||||
|
samp->base.get_texel = sample_get_texels;
|
||||||
return samp;
|
return samp;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user