summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2011-08-25 14:54:27 +0100
committerDave Airlie <[email protected]>2011-08-25 16:54:20 +0100
commit62ad6e66a5c11fa58e51a6251f97a12a759773ec (patch)
tree719ebe7362d6141eee9d870cf2eea5fd969a49a5 /src/gallium/drivers
parentd562f97bef99e051842ae0cec8f5ac46a10a73c4 (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')
-rw-r--r--src/gallium/drivers/softpipe/sp_tex_sample.c69
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;
}