mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 13:10:10 +01:00
softpipe: Implement sampler view swizzling.
This commit is contained in:
parent
5587097b53
commit
f59f28093e
3 changed files with 30 additions and 14 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue