sp: Implement separate vertex sampler state.
This commit is contained in:
parent
ee86b1b58d
commit
8a619e62bf
|
@ -107,6 +107,11 @@ softpipe_destroy( struct pipe_context *pipe )
|
||||||
pipe_texture_reference(&softpipe->texture[i], NULL);
|
pipe_texture_reference(&softpipe->texture[i], NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < PIPE_MAX_VERTEX_SAMPLERS; i++) {
|
||||||
|
sp_destroy_tex_tile_cache(softpipe->vertex_tex_cache[i]);
|
||||||
|
pipe_texture_reference(&softpipe->vertex_textures[i], NULL);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < Elements(softpipe->constants); i++) {
|
for (i = 0; i < Elements(softpipe->constants); i++) {
|
||||||
if (softpipe->constants[i].buffer) {
|
if (softpipe->constants[i].buffer) {
|
||||||
pipe_buffer_reference(&softpipe->constants[i].buffer, NULL);
|
pipe_buffer_reference(&softpipe->constants[i].buffer, NULL);
|
||||||
|
@ -153,6 +158,11 @@ softpipe_is_texture_referenced( struct pipe_context *pipe,
|
||||||
softpipe->tex_cache[i]->texture == texture)
|
softpipe->tex_cache[i]->texture == texture)
|
||||||
return PIPE_REFERENCED_FOR_READ;
|
return PIPE_REFERENCED_FOR_READ;
|
||||||
}
|
}
|
||||||
|
for (i = 0; i < PIPE_MAX_VERTEX_SAMPLERS; i++) {
|
||||||
|
if (softpipe->vertex_tex_cache[i] &&
|
||||||
|
softpipe->vertex_tex_cache[i]->texture == texture)
|
||||||
|
return PIPE_REFERENCED_FOR_READ;
|
||||||
|
}
|
||||||
|
|
||||||
return PIPE_UNREFERENCED;
|
return PIPE_UNREFERENCED;
|
||||||
}
|
}
|
||||||
|
@ -192,7 +202,8 @@ softpipe_create( struct pipe_screen *screen )
|
||||||
softpipe->pipe.delete_blend_state = softpipe_delete_blend_state;
|
softpipe->pipe.delete_blend_state = softpipe_delete_blend_state;
|
||||||
|
|
||||||
softpipe->pipe.create_sampler_state = softpipe_create_sampler_state;
|
softpipe->pipe.create_sampler_state = softpipe_create_sampler_state;
|
||||||
softpipe->pipe.bind_sampler_states = softpipe_bind_sampler_states;
|
softpipe->pipe.bind_fragment_sampler_states = softpipe_bind_sampler_states;
|
||||||
|
softpipe->pipe.bind_vertex_sampler_states = softpipe_bind_vertex_sampler_states;
|
||||||
softpipe->pipe.delete_sampler_state = softpipe_delete_sampler_state;
|
softpipe->pipe.delete_sampler_state = softpipe_delete_sampler_state;
|
||||||
|
|
||||||
softpipe->pipe.create_depth_stencil_alpha_state = softpipe_create_depth_stencil_state;
|
softpipe->pipe.create_depth_stencil_alpha_state = softpipe_create_depth_stencil_state;
|
||||||
|
@ -217,7 +228,8 @@ softpipe_create( struct pipe_screen *screen )
|
||||||
softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state;
|
softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state;
|
||||||
softpipe->pipe.set_polygon_stipple = softpipe_set_polygon_stipple;
|
softpipe->pipe.set_polygon_stipple = softpipe_set_polygon_stipple;
|
||||||
softpipe->pipe.set_scissor_state = softpipe_set_scissor_state;
|
softpipe->pipe.set_scissor_state = softpipe_set_scissor_state;
|
||||||
softpipe->pipe.set_sampler_textures = softpipe_set_sampler_textures;
|
softpipe->pipe.set_fragment_sampler_textures = softpipe_set_sampler_textures;
|
||||||
|
softpipe->pipe.set_vertex_sampler_textures = softpipe_set_vertex_sampler_textures;
|
||||||
softpipe->pipe.set_viewport_state = softpipe_set_viewport_state;
|
softpipe->pipe.set_viewport_state = softpipe_set_viewport_state;
|
||||||
|
|
||||||
softpipe->pipe.set_vertex_buffers = softpipe_set_vertex_buffers;
|
softpipe->pipe.set_vertex_buffers = softpipe_set_vertex_buffers;
|
||||||
|
@ -247,7 +259,9 @@ softpipe_create( struct pipe_screen *screen )
|
||||||
|
|
||||||
for (i = 0; i < PIPE_MAX_SAMPLERS; i++)
|
for (i = 0; i < PIPE_MAX_SAMPLERS; i++)
|
||||||
softpipe->tex_cache[i] = sp_create_tex_tile_cache( screen );
|
softpipe->tex_cache[i] = sp_create_tex_tile_cache( screen );
|
||||||
|
for (i = 0; i < PIPE_MAX_VERTEX_SAMPLERS; i++) {
|
||||||
|
softpipe->vertex_tex_cache[i] = sp_create_tex_tile_cache(screen);
|
||||||
|
}
|
||||||
|
|
||||||
/* setup quad rendering stages */
|
/* setup quad rendering stages */
|
||||||
softpipe->quad.shade = sp_quad_shade_stage(softpipe);
|
softpipe->quad.shade = sp_quad_shade_stage(softpipe);
|
||||||
|
@ -263,7 +277,7 @@ softpipe_create( struct pipe_screen *screen )
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
draw_texture_samplers(softpipe->draw,
|
draw_texture_samplers(softpipe->draw,
|
||||||
PIPE_MAX_SAMPLERS,
|
PIPE_MAX_VERTEX_SAMPLERS,
|
||||||
(struct tgsi_sampler **)
|
(struct tgsi_sampler **)
|
||||||
softpipe->tgsi.vert_samplers_list);
|
softpipe->tgsi.vert_samplers_list);
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ struct softpipe_context {
|
||||||
/** Constant state objects */
|
/** Constant state objects */
|
||||||
struct pipe_blend_state *blend;
|
struct pipe_blend_state *blend;
|
||||||
struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS];
|
struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS];
|
||||||
|
struct pipe_sampler_state *vertex_samplers[PIPE_MAX_VERTEX_SAMPLERS];
|
||||||
struct pipe_depth_stencil_alpha_state *depth_stencil;
|
struct pipe_depth_stencil_alpha_state *depth_stencil;
|
||||||
struct pipe_rasterizer_state *rasterizer;
|
struct pipe_rasterizer_state *rasterizer;
|
||||||
struct sp_fragment_shader *fs;
|
struct sp_fragment_shader *fs;
|
||||||
|
@ -66,12 +67,15 @@ struct softpipe_context {
|
||||||
struct pipe_poly_stipple poly_stipple;
|
struct pipe_poly_stipple poly_stipple;
|
||||||
struct pipe_scissor_state scissor;
|
struct pipe_scissor_state scissor;
|
||||||
struct pipe_texture *texture[PIPE_MAX_SAMPLERS];
|
struct pipe_texture *texture[PIPE_MAX_SAMPLERS];
|
||||||
|
struct pipe_texture *vertex_textures[PIPE_MAX_VERTEX_SAMPLERS];
|
||||||
struct pipe_viewport_state viewport;
|
struct pipe_viewport_state viewport;
|
||||||
struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
|
struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
|
||||||
struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];
|
struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];
|
||||||
|
|
||||||
unsigned num_samplers;
|
unsigned num_samplers;
|
||||||
unsigned num_textures;
|
unsigned num_textures;
|
||||||
|
unsigned num_vertex_samplers;
|
||||||
|
unsigned num_vertex_textures;
|
||||||
unsigned num_vertex_elements;
|
unsigned num_vertex_elements;
|
||||||
unsigned num_vertex_buffers;
|
unsigned num_vertex_buffers;
|
||||||
|
|
||||||
|
@ -121,7 +125,7 @@ struct softpipe_context {
|
||||||
|
|
||||||
/** TGSI exec things */
|
/** TGSI exec things */
|
||||||
struct {
|
struct {
|
||||||
struct sp_sampler_varient *vert_samplers_list[PIPE_MAX_SAMPLERS];
|
struct sp_sampler_varient *vert_samplers_list[PIPE_MAX_VERTEX_SAMPLERS];
|
||||||
struct sp_sampler_varient *frag_samplers_list[PIPE_MAX_SAMPLERS];
|
struct sp_sampler_varient *frag_samplers_list[PIPE_MAX_SAMPLERS];
|
||||||
} tgsi;
|
} tgsi;
|
||||||
|
|
||||||
|
@ -139,6 +143,7 @@ struct softpipe_context {
|
||||||
|
|
||||||
unsigned tex_timestamp;
|
unsigned tex_timestamp;
|
||||||
struct softpipe_tex_tile_cache *tex_cache[PIPE_MAX_SAMPLERS];
|
struct softpipe_tex_tile_cache *tex_cache[PIPE_MAX_SAMPLERS];
|
||||||
|
struct softpipe_tex_tile_cache *vertex_tex_cache[PIPE_MAX_VERTEX_SAMPLERS];
|
||||||
|
|
||||||
unsigned use_sse : 1;
|
unsigned use_sse : 1;
|
||||||
unsigned dump_fs : 1;
|
unsigned dump_fs : 1;
|
||||||
|
|
|
@ -55,6 +55,9 @@ softpipe_flush( struct pipe_context *pipe,
|
||||||
for (i = 0; i < softpipe->num_textures; i++) {
|
for (i = 0; i < softpipe->num_textures; i++) {
|
||||||
sp_flush_tex_tile_cache(softpipe->tex_cache[i]);
|
sp_flush_tex_tile_cache(softpipe->tex_cache[i]);
|
||||||
}
|
}
|
||||||
|
for (i = 0; i < softpipe->num_vertex_textures; i++) {
|
||||||
|
sp_flush_tex_tile_cache(softpipe->vertex_tex_cache[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & PIPE_FLUSH_SWAPBUFFERS) {
|
if (flags & PIPE_FLUSH_SWAPBUFFERS) {
|
||||||
|
|
|
@ -58,7 +58,9 @@ softpipe_get_param(struct pipe_screen *screen, int param)
|
||||||
case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
|
case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
|
||||||
return PIPE_MAX_SAMPLERS;
|
return PIPE_MAX_SAMPLERS;
|
||||||
case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
|
case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
|
||||||
return PIPE_MAX_SAMPLERS;
|
return PIPE_MAX_VERTEX_SAMPLERS;
|
||||||
|
case PIPE_CAP_MAX_COMBINED_SAMPLERS:
|
||||||
|
return PIPE_MAX_SAMPLERS + PIPE_MAX_VERTEX_SAMPLERS;
|
||||||
case PIPE_CAP_NPOT_TEXTURES:
|
case PIPE_CAP_NPOT_TEXTURES:
|
||||||
return 1;
|
return 1;
|
||||||
case PIPE_CAP_TWO_SIDED_STENCIL:
|
case PIPE_CAP_TWO_SIDED_STENCIL:
|
||||||
|
|
|
@ -104,6 +104,10 @@ void *
|
||||||
softpipe_create_sampler_state(struct pipe_context *,
|
softpipe_create_sampler_state(struct pipe_context *,
|
||||||
const struct pipe_sampler_state *);
|
const struct pipe_sampler_state *);
|
||||||
void softpipe_bind_sampler_states(struct pipe_context *, unsigned, void **);
|
void softpipe_bind_sampler_states(struct pipe_context *, unsigned, void **);
|
||||||
|
void
|
||||||
|
softpipe_bind_vertex_sampler_states(struct pipe_context *,
|
||||||
|
unsigned num_samplers,
|
||||||
|
void **samplers);
|
||||||
void softpipe_delete_sampler_state(struct pipe_context *, void *);
|
void softpipe_delete_sampler_state(struct pipe_context *, void *);
|
||||||
|
|
||||||
void *
|
void *
|
||||||
|
@ -150,6 +154,11 @@ void softpipe_set_sampler_textures( struct pipe_context *,
|
||||||
unsigned num,
|
unsigned num,
|
||||||
struct pipe_texture ** );
|
struct pipe_texture ** );
|
||||||
|
|
||||||
|
void
|
||||||
|
softpipe_set_vertex_sampler_textures(struct pipe_context *,
|
||||||
|
unsigned num_textures,
|
||||||
|
struct pipe_texture **);
|
||||||
|
|
||||||
void softpipe_set_viewport_state( struct pipe_context *,
|
void softpipe_set_viewport_state( struct pipe_context *,
|
||||||
const struct pipe_viewport_state * );
|
const struct pipe_viewport_state * );
|
||||||
|
|
||||||
|
|
|
@ -213,6 +213,19 @@ update_tgsi_samplers( struct softpipe_context *softpipe )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < PIPE_MAX_VERTEX_SAMPLERS; i++) {
|
||||||
|
struct softpipe_tex_tile_cache *tc = softpipe->vertex_tex_cache[i];
|
||||||
|
|
||||||
|
if (tc->texture) {
|
||||||
|
struct softpipe_texture *spt = softpipe_texture(tc->texture);
|
||||||
|
|
||||||
|
if (spt->timestamp != tc->timestamp) {
|
||||||
|
sp_tex_tile_cache_validate_texture(tc);
|
||||||
|
tc->timestamp = spt->timestamp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,34 @@ softpipe_bind_sampler_states(struct pipe_context *pipe,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
softpipe_bind_vertex_sampler_states(struct pipe_context *pipe,
|
||||||
|
unsigned num_samplers,
|
||||||
|
void **samplers)
|
||||||
|
{
|
||||||
|
struct softpipe_context *softpipe = softpipe_context(pipe);
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
assert(num_samplers <= PIPE_MAX_VERTEX_SAMPLERS);
|
||||||
|
|
||||||
|
/* Check for no-op */
|
||||||
|
if (num_samplers == softpipe->num_vertex_samplers &&
|
||||||
|
!memcmp(softpipe->vertex_samplers, samplers, num_samplers * sizeof(void *)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
draw_flush(softpipe->draw);
|
||||||
|
|
||||||
|
for (i = 0; i < num_samplers; ++i)
|
||||||
|
softpipe->vertex_samplers[i] = samplers[i];
|
||||||
|
for (i = num_samplers; i < PIPE_MAX_VERTEX_SAMPLERS; ++i)
|
||||||
|
softpipe->vertex_samplers[i] = NULL;
|
||||||
|
|
||||||
|
softpipe->num_vertex_samplers = num_samplers;
|
||||||
|
|
||||||
|
softpipe->dirty |= SP_NEW_SAMPLER;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
softpipe_set_sampler_textures(struct pipe_context *pipe,
|
softpipe_set_sampler_textures(struct pipe_context *pipe,
|
||||||
unsigned num, struct pipe_texture **texture)
|
unsigned num, struct pipe_texture **texture)
|
||||||
|
@ -122,6 +150,37 @@ softpipe_set_sampler_textures(struct pipe_context *pipe,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
softpipe_set_vertex_sampler_textures(struct pipe_context *pipe,
|
||||||
|
unsigned num_textures,
|
||||||
|
struct pipe_texture **textures)
|
||||||
|
{
|
||||||
|
struct softpipe_context *softpipe = softpipe_context(pipe);
|
||||||
|
uint i;
|
||||||
|
|
||||||
|
assert(num_textures <= PIPE_MAX_VERTEX_SAMPLERS);
|
||||||
|
|
||||||
|
/* Check for no-op */
|
||||||
|
if (num_textures == softpipe->num_vertex_textures &&
|
||||||
|
!memcmp(softpipe->vertex_textures, textures, num_textures * sizeof(struct pipe_texture *))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
draw_flush(softpipe->draw);
|
||||||
|
|
||||||
|
for (i = 0; i < PIPE_MAX_VERTEX_SAMPLERS; i++) {
|
||||||
|
struct pipe_texture *tex = i < num_textures ? textures[i] : NULL;
|
||||||
|
|
||||||
|
pipe_texture_reference(&softpipe->vertex_textures[i], tex);
|
||||||
|
sp_tex_tile_cache_set_texture(softpipe->vertex_tex_cache[i], tex);
|
||||||
|
}
|
||||||
|
|
||||||
|
softpipe->num_vertex_textures = num_textures;
|
||||||
|
|
||||||
|
softpipe->dirty |= SP_NEW_TEXTURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find/create an sp_sampler_varient object for sampling the given texture,
|
* Find/create an sp_sampler_varient object for sampling the given texture,
|
||||||
* sampler and tex unit.
|
* sampler and tex unit.
|
||||||
|
@ -185,16 +244,16 @@ softpipe_reset_sampler_varients(struct softpipe_context *softpipe)
|
||||||
* fragment programs.
|
* fragment programs.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i <= softpipe->vs->max_sampler; i++) {
|
for (i = 0; i <= softpipe->vs->max_sampler; i++) {
|
||||||
if (softpipe->sampler[i]) {
|
if (softpipe->vertex_samplers[i]) {
|
||||||
softpipe->tgsi.vert_samplers_list[i] =
|
softpipe->tgsi.vert_samplers_list[i] =
|
||||||
get_sampler_varient( i,
|
get_sampler_varient( i,
|
||||||
sp_sampler(softpipe->sampler[i]),
|
sp_sampler(softpipe->vertex_samplers[i]),
|
||||||
softpipe->texture[i],
|
softpipe->vertex_textures[i],
|
||||||
TGSI_PROCESSOR_VERTEX );
|
TGSI_PROCESSOR_VERTEX );
|
||||||
|
|
||||||
sp_sampler_varient_bind_texture( softpipe->tgsi.vert_samplers_list[i],
|
sp_sampler_varient_bind_texture( softpipe->tgsi.vert_samplers_list[i],
|
||||||
softpipe->tex_cache[i],
|
softpipe->vertex_tex_cache[i],
|
||||||
softpipe->texture[i] );
|
softpipe->vertex_textures[i] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue