diff options
author | Dave Airlie <[email protected]> | 2011-08-25 14:54:27 +0100 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2011-08-25 16:54:20 +0100 |
commit | 62ad6e66a5c11fa58e51a6251f97a12a759773ec (patch) | |
tree | 719ebe7362d6141eee9d870cf2eea5fd969a49a5 /src/gallium/drivers/softpipe | |
parent | d562f97bef99e051842ae0cec8f5ac46a10a73c4 (diff) |
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 <[email protected]>
Diffstat (limited to 'src/gallium/drivers/softpipe')
-rw-r--r-- | src/gallium/drivers/softpipe/sp_tex_sample.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c index 2b03d844f53..76ec2f45126 100644 --- a/src/gallium/drivers/softpipe/sp_tex_sample.c +++ b/src/gallium/drivers/softpipe/sp_tex_sample.c @@ -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. */ @@ -2732,5 +2800,6 @@ sp_create_sampler_variant( const struct pipe_sampler_state *sampler, } samp->base.get_dims = sample_get_dims; + samp->base.get_texel = sample_get_texels; return samp; } |