softpipe: per-unit sampler varients
authorBrian Paul <brianp@vmware.com>
Fri, 21 Aug 2009 18:11:44 +0000 (12:11 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 21 Aug 2009 18:44:04 +0000 (12:44 -0600)
Can't share sampler varients across multiple tex units because the texture
pointer is in the sampler varient.  That prevents different textures per unit.

Fixes progs/demos/multiarb, progs/glsl/samplers, etc.

src/gallium/drivers/softpipe/sp_state_sampler.c
src/gallium/drivers/softpipe/sp_tex_sample.c
src/gallium/drivers/softpipe/sp_tex_sample.h

index 714e63804871f46d52a832798c633482c13abf86..53210812f40f0a99338b9abd6975cc5368426ec7 100644 (file)
@@ -123,9 +123,19 @@ softpipe_set_sampler_textures(struct pipe_context *pipe,
 }
 
 
-
+/**
+ * Find/create an sp_sampler_varient object for sampling the given texture,
+ * sampler and tex unit.
+ *
+ * Note that the tex unit is significant.  We can't re-use a sampler
+ * varient for multiple texture units because the sampler varient contains
+ * the texture object pointer.  If the texture object pointer were stored
+ * somewhere outside the sampler varient, we could re-use samplers for
+ * multiple texture units.
+ */
 static struct sp_sampler_varient *
-get_sampler_varient( struct sp_sampler *sampler,
+get_sampler_varient( unsigned unit,
+                     struct sp_sampler *sampler,
                      struct pipe_texture *texture,
                      unsigned processor )
 {
@@ -133,9 +143,13 @@ get_sampler_varient( struct sp_sampler *sampler,
    struct sp_sampler_varient *v = NULL;
    union sp_sampler_key key;
 
+   /* if this fails, widen the key.unit field and update this assertion */
+   assert(PIPE_MAX_SAMPLERS <= 16);
+
    key.bits.target = sp_texture->base.target;
    key.bits.is_pot = sp_texture->pot;
    key.bits.processor = processor;
+   key.bits.unit = unit;
    key.bits.pad = 0;
 
    if (sampler->current && 
@@ -174,7 +188,8 @@ softpipe_reset_sampler_varients(struct softpipe_context *softpipe)
    for (i = 0; i <= softpipe->vs->max_sampler; i++) {
       if (softpipe->sampler[i]) {
          softpipe->tgsi.vert_samplers_list[i] = 
-            get_sampler_varient( sp_sampler(softpipe->sampler[i]),
+            get_sampler_varient( i,
+                                 sp_sampler(softpipe->sampler[i]),
                                  softpipe->texture[i],
                                  TGSI_PROCESSOR_VERTEX );
 
@@ -187,7 +202,8 @@ softpipe_reset_sampler_varients(struct softpipe_context *softpipe)
    for (i = 0; i <= softpipe->fs->info.file_max[TGSI_FILE_SAMPLER]; i++) {
       if (softpipe->sampler[i]) {
          softpipe->tgsi.frag_samplers_list[i] =
-            get_sampler_varient( sp_sampler(softpipe->sampler[i]),
+            get_sampler_varient( i,
+                                 sp_sampler(softpipe->sampler[i]),
                                  softpipe->texture[i],
                                  TGSI_PROCESSOR_FRAGMENT );
 
index f3710037082edf16e057fecaffa54f4b8b1b5e54..8f3dc12d0fa8a0e4dc02258cce40cc4f25a8f66d 100644 (file)
@@ -1545,6 +1545,9 @@ static filter_func get_img_filter( const union sp_sampler_key key,
 }
 
 
+/**
+ * Bind the given texture object and texture cache to the sampler varient.
+ */
 void
 sp_sampler_varient_bind_texture( struct sp_sampler_varient *samp,
                                  struct softpipe_tile_cache *tex_cache,
index 26f80eb88a89471c7dd7da02fe6f8b95fa711470..f6cd57ec0ac8073843ff0758e9fde405c6859899 100644 (file)
@@ -62,7 +62,8 @@ union sp_sampler_key {
       unsigned target:3;
       unsigned is_pot:1;
       unsigned processor:2;
-      unsigned pad:26;
+      unsigned unit:4;
+      unsigned pad:22;
    } bits;
    unsigned value;
 };