softpipe: Implement sampler view swizzling.

This commit is contained in:
Michal Krol 2010-03-02 12:03:24 +01:00
parent 5587097b53
commit f59f28093e
3 changed files with 30 additions and 14 deletions

View file

@ -166,10 +166,9 @@ softpipe_set_sampler_views(struct pipe_context *pipe,
for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
struct pipe_sampler_view *view = i < num ? views[i] : NULL;
struct pipe_texture *texture = view ? view->texture : NULL;
pipe_sampler_view_reference(&softpipe->sampler_views[i], view);
sp_tex_tile_cache_set_texture(softpipe->tex_cache[i], texture);
sp_tex_tile_cache_set_sampler_view(softpipe->tex_cache[i], view);
}
softpipe->num_sampler_views = num;
@ -198,10 +197,9 @@ softpipe_set_vertex_sampler_views(struct pipe_context *pipe,
for (i = 0; i < PIPE_MAX_VERTEX_SAMPLERS; i++) {
struct pipe_sampler_view *view = i < num ? views[i] : NULL;
struct pipe_texture *texture = view ? view->texture : NULL;
pipe_sampler_view_reference(&softpipe->vertex_sampler_views[i], view);
sp_tex_tile_cache_set_texture(softpipe->vertex_tex_cache[i], texture);
sp_tex_tile_cache_set_sampler_view(softpipe->vertex_tex_cache[i], view);
}
softpipe->num_vertex_sampler_views = num;

View file

@ -119,12 +119,13 @@ sp_tex_tile_cache_validate_texture(struct softpipe_tex_tile_cache *tc)
}
/**
* Specify the texture to cache.
* Specify the sampler view to cache.
*/
void
sp_tex_tile_cache_set_texture(struct softpipe_tex_tile_cache *tc,
struct pipe_texture *texture)
sp_tex_tile_cache_set_sampler_view(struct softpipe_tex_tile_cache *tc,
struct pipe_sampler_view *view)
{
struct pipe_texture *texture = view ? view->texture : NULL;
uint i;
assert(!tc->transfer);
@ -144,6 +145,13 @@ sp_tex_tile_cache_set_texture(struct softpipe_tex_tile_cache *tc,
tc->tex_trans = NULL;
}
if (view) {
tc->swizzle_r = view->swizzle_r;
tc->swizzle_g = view->swizzle_g;
tc->swizzle_b = view->swizzle_b;
tc->swizzle_a = view->swizzle_a;
}
/* mark as entries as invalid/empty */
/* XXX we should try to avoid this when the teximage hasn't changed */
for (i = 0; i < NUM_ENTRIES; i++) {
@ -257,11 +265,16 @@ sp_find_cached_tile_tex(struct softpipe_tex_tile_cache *tc,
}
/* get tile from the transfer (view into texture) */
pipe_get_tile_rgba(tc->tex_trans,
addr.bits.x * TILE_SIZE,
addr.bits.y * TILE_SIZE,
TILE_SIZE, TILE_SIZE,
(float *) tile->data.color);
pipe_get_tile_swizzle(tc->tex_trans,
addr.bits.x * TILE_SIZE,
addr.bits.y * TILE_SIZE,
TILE_SIZE,
TILE_SIZE,
tc->swizzle_r,
tc->swizzle_g,
tc->swizzle_b,
tc->swizzle_a,
(float *) tile->data.color);
tile->addr = addr;
}

View file

@ -83,6 +83,11 @@ struct softpipe_tex_tile_cache
void *tex_trans_map;
int tex_face, tex_level, tex_z;
unsigned swizzle_r;
unsigned swizzle_g;
unsigned swizzle_b;
unsigned swizzle_a;
struct softpipe_tex_cached_tile *last_tile; /**< most recently retrieved tile */
};
@ -101,8 +106,8 @@ extern void
sp_tex_tile_cache_unmap_transfers(struct softpipe_tex_tile_cache *tc);
extern void
sp_tex_tile_cache_set_texture(struct softpipe_tex_tile_cache *tc,
struct pipe_texture *texture);
sp_tex_tile_cache_set_sampler_view(struct softpipe_tex_tile_cache *tc,
struct pipe_sampler_view *view);
void
sp_tex_tile_cache_validate_texture(struct softpipe_tex_tile_cache *tc);