From 7a06c026ad24b74048f6d125383faf25deb1dfbb Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Thu, 20 Sep 2007 10:07:10 -0400 Subject: [PATCH] Fix failover state binding and convert the sampler to use the new state constant state object semantics. --- src/mesa/pipe/cso_cache/cso_cache.h | 5 +++ src/mesa/pipe/failover/fo_context.h | 12 +++--- src/mesa/pipe/failover/fo_state.c | 72 ++++++++++++++++++++++--------- src/mesa/pipe/failover/fo_state_emit.c | 2 +- src/mesa/pipe/i915simple/i915_state.c | 15 +++---- src/mesa/pipe/p_context.h | 13 +++--- src/mesa/pipe/softpipe/sp_state.h | 9 ++-- src/mesa/pipe/softpipe/sp_state_sampler.c | 18 +++----- src/mesa/state_tracker/st_atom_sampler.c | 10 ++--- src/mesa/state_tracker/st_cache.c | 22 +++++----- src/mesa/state_tracker/st_cache.h | 2 +- src/mesa/state_tracker/st_cb_drawpixels.c | 7 +-- src/mesa/state_tracker/st_context.h | 2 +- 13 files changed, 105 insertions(+), 84 deletions(-) diff --git a/src/mesa/pipe/cso_cache/cso_cache.h b/src/mesa/pipe/cso_cache/cso_cache.h index 291759d..2acb58c 100644 --- a/src/mesa/pipe/cso_cache/cso_cache.h +++ b/src/mesa/pipe/cso_cache/cso_cache.h @@ -73,6 +73,11 @@ struct cso_vertex_shader { void *data; }; +struct cso_sampler { + struct pipe_sampler_state state; + void *data; +}; + enum cso_cache_type { CSO_BLEND, CSO_SAMPLER, diff --git a/src/mesa/pipe/failover/fo_context.h b/src/mesa/pipe/failover/fo_context.h index 7371ad4..8a2fbe2 100644 --- a/src/mesa/pipe/failover/fo_context.h +++ b/src/mesa/pipe/failover/fo_context.h @@ -70,12 +70,12 @@ struct failover_context { /* The most recent drawing state as set by the driver: */ - const struct fo_state *blend; - const struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS]; - const struct fo_state *depth_stencil; - const struct fo_state *rasterizer; - const struct fo_state *fragment_shader; - const struct fo_state *vertex_shader; + const struct fo_state *blend; + const struct fo_state *sampler[PIPE_MAX_SAMPLERS]; + const struct fo_state *depth_stencil; + const struct fo_state *rasterizer; + const struct fo_state *fragment_shader; + const struct fo_state *vertex_shader; struct pipe_alpha_test_state alpha_test; struct pipe_blend_color blend_color; diff --git a/src/mesa/pipe/failover/fo_state.c b/src/mesa/pipe/failover/fo_state.c index 3379f45..ce3f0ca 100644 --- a/src/mesa/pipe/failover/fo_state.c +++ b/src/mesa/pipe/failover/fo_state.c @@ -75,10 +75,10 @@ failover_bind_blend_state( struct pipe_context *pipe, void *blend ) { struct failover_context *failover = failover_context(pipe); - - failover->blend = (struct fo_state *)blend; + struct fo_state *state = (struct fo_state *)blend; + failover->blend = state; failover->dirty |= FO_NEW_BLEND; - failover->hw->bind_blend_state( failover->hw, blend ); + failover->hw->bind_blend_state( failover->hw, state->hw_state ); } static void @@ -146,10 +146,10 @@ failover_bind_depth_stencil_state(struct pipe_context *pipe, void *depth_stencil) { struct failover_context *failover = failover_context(pipe); - - failover->depth_stencil = (struct fo_state *)depth_stencil; + struct fo_state *state = (struct fo_state *)depth_stencil; + failover->depth_stencil = state; failover->dirty |= FO_NEW_DEPTH_STENCIL; - failover->hw->bind_depth_stencil_state( failover->hw, depth_stencil ); + failover->hw->bind_depth_stencil_state(failover->hw, state->hw_state); } static void @@ -192,14 +192,13 @@ failover_create_fs_state(struct pipe_context *pipe, } static void -failover_bind_fs_state(struct pipe_context *pipe, - void *fs) +failover_bind_fs_state(struct pipe_context *pipe, void *fs) { struct failover_context *failover = failover_context(pipe); - - failover->fragment_shader = (struct fo_state *)fs; + struct fo_state *state = (struct fo_state*)fs; + failover->fragment_shader = state; failover->dirty |= FO_NEW_FRAGMENT_SHADER; - failover->hw->bind_fs_state(failover->hw, (struct pipe_shader_state *)fs); + failover->hw->bind_fs_state(failover->hw, state->hw_state); } static void @@ -235,9 +234,10 @@ failover_bind_vs_state(struct pipe_context *pipe, { struct failover_context *failover = failover_context(pipe); - failover->vertex_shader = (struct fo_state*)vs; + struct fo_state *state = (struct fo_state*)vs; + failover->vertex_shader = state; failover->dirty |= FO_NEW_VERTEX_SHADER; - failover->hw->bind_vs_state(failover->hw, vs); + failover->hw->bind_vs_state(failover->hw, state->hw_state); } static void @@ -284,9 +284,10 @@ failover_bind_rasterizer_state(struct pipe_context *pipe, { struct failover_context *failover = failover_context(pipe); - failover->rasterizer = (struct fo_state *)raster; + struct fo_state *state = (struct fo_state*)raster; + failover->rasterizer = state; failover->dirty |= FO_NEW_RASTERIZER; - failover->hw->bind_rasterizer_state( failover->hw, raster ); + failover->hw->bind_rasterizer_state(failover->hw, state->hw_state); } static void @@ -315,17 +316,44 @@ failover_set_scissor_state( struct pipe_context *pipe, failover->hw->set_scissor_state( failover->hw, scissor ); } + +static void * +failover_create_sampler_state(struct pipe_context *pipe, + const struct pipe_sampler_state *templ) +{ + struct fo_state *state = malloc(sizeof(struct fo_state)); + struct failover_context *failover = failover_context(pipe); + + state->sw_state = failover->sw->create_sampler_state(pipe, templ); + state->hw_state = failover->hw->create_sampler_state(pipe, templ); + + return state; +} + static void failover_bind_sampler_state(struct pipe_context *pipe, - unsigned unit, - const struct pipe_sampler_state *sampler) + unsigned unit, void *sampler) { struct failover_context *failover = failover_context(pipe); - - failover->sampler[unit] = sampler; + struct fo_state *state = (struct fo_state*)sampler; + failover->sampler[unit] = state; failover->dirty |= FO_NEW_SAMPLER; failover->dirty_sampler |= (1<hw->bind_sampler_state( failover->hw, unit, sampler ); + failover->hw->bind_sampler_state(failover->hw, unit, + state->hw_state); +} + +static void +failover_delete_sampler_state(struct pipe_context *pipe, void *sampler) +{ + struct fo_state *state = (struct fo_state*)sampler; + struct failover_context *failover = failover_context(pipe); + + failover->sw->delete_sampler_state(pipe, state->sw_state); + failover->hw->delete_sampler_state(pipe, state->hw_state); + state->sw_state = 0; + state->hw_state = 0; + free(state); } @@ -389,7 +417,9 @@ failover_init_state_functions( struct failover_context *failover ) failover->pipe.create_blend_state = failover_create_blend_state; failover->pipe.bind_blend_state = failover_bind_blend_state; failover->pipe.delete_blend_state = failover_delete_blend_state; - failover->pipe.bind_sampler_state = failover_bind_sampler_state; + failover->pipe.create_sampler_state = failover_create_sampler_state; + failover->pipe.bind_sampler_state = failover_bind_sampler_state; + failover->pipe.delete_sampler_state = failover_delete_sampler_state; failover->pipe.create_depth_stencil_state = failover_create_depth_stencil_state; failover->pipe.bind_depth_stencil_state = failover_bind_depth_stencil_state; failover->pipe.delete_depth_stencil_state = failover_delete_depth_stencil_state; diff --git a/src/mesa/pipe/failover/fo_state_emit.c b/src/mesa/pipe/failover/fo_state_emit.c index da12b4e..c0ea681 100644 --- a/src/mesa/pipe/failover/fo_state_emit.c +++ b/src/mesa/pipe/failover/fo_state_emit.c @@ -103,7 +103,7 @@ failover_state_emit( struct failover_context *failover ) for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { if (failover->dirty_sampler & (1<sw->bind_sampler_state( failover->sw, i, - failover->sampler[i] ); + failover->sampler[i]->sw_state ); } } } diff --git a/src/mesa/pipe/i915simple/i915_state.c b/src/mesa/pipe/i915simple/i915_state.c index be549ed..0fb41e1 100644 --- a/src/mesa/pipe/i915simple/i915_state.c +++ b/src/mesa/pipe/i915simple/i915_state.c @@ -142,32 +142,27 @@ static void i915_set_blend_color( struct pipe_context *pipe, i915->dirty |= I915_NEW_BLEND; } -static const struct pipe_sampler_state * +static void * i915_create_sampler_state(struct pipe_context *pipe, const struct pipe_sampler_state *sampler) { - struct pipe_sampler_state *new_sampler = malloc(sizeof(struct pipe_sampler_state)); - memcpy(new_sampler, sampler, sizeof(struct pipe_sampler_state)); - - return new_sampler; + return 0; } static void i915_bind_sampler_state(struct pipe_context *pipe, - unsigned unit, - const struct pipe_sampler_state *sampler) + unsigned unit, void *sampler) { struct i915_context *i915 = i915_context(pipe); assert(unit < PIPE_MAX_SAMPLERS); - i915->sampler[unit] = sampler; + i915->sampler[unit] = (const struct pipe_sampler_state *)sampler; i915->dirty |= I915_NEW_SAMPLER; } static void i915_delete_sampler_state(struct pipe_context *pipe, - const struct pipe_sampler_state *sampler) + void *sampler) { - free((struct pipe_sampler_state*)sampler); } diff --git a/src/mesa/pipe/p_context.h b/src/mesa/pipe/p_context.h index 84aca20..07ee019 100644 --- a/src/mesa/pipe/p_context.h +++ b/src/mesa/pipe/p_context.h @@ -91,14 +91,11 @@ struct pipe_context { void (*bind_blend_state)(struct pipe_context *, void *); void (*delete_blend_state)(struct pipe_context *, void *); - const struct pipe_sampler_state * (*create_sampler_state)( - struct pipe_context *, - const struct pipe_sampler_state *); - void (*bind_sampler_state)(struct pipe_context *, - unsigned unit, - const struct pipe_sampler_state *); - void (*delete_sampler_state)(struct pipe_context *, - const struct pipe_sampler_state *); + void * (*create_sampler_state)(struct pipe_context *, + const struct pipe_sampler_state *); + void (*bind_sampler_state)(struct pipe_context *, unsigned unit, + void *); + void (*delete_sampler_state)(struct pipe_context *, void *); void *(*create_rasterizer_state)(struct pipe_context *, const struct pipe_rasterizer_state *); diff --git a/src/mesa/pipe/softpipe/sp_state.h b/src/mesa/pipe/softpipe/sp_state.h index 08dfe20..62323c4 100644 --- a/src/mesa/pipe/softpipe/sp_state.h +++ b/src/mesa/pipe/softpipe/sp_state.h @@ -41,14 +41,11 @@ void softpipe_bind_blend_state(struct pipe_context *, void softpipe_delete_blend_state(struct pipe_context *, void *); -const struct pipe_sampler_state * +void * softpipe_create_sampler_state(struct pipe_context *, const struct pipe_sampler_state *); -void softpipe_bind_sampler_state(struct pipe_context *, - unsigned, - const struct pipe_sampler_state *); -void softpipe_delete_sampler_state(struct pipe_context *, - const struct pipe_sampler_state *); +void softpipe_bind_sampler_state(struct pipe_context *, unsigned, void *); +void softpipe_delete_sampler_state(struct pipe_context *, void *); void * softpipe_create_depth_stencil_state(struct pipe_context *, diff --git a/src/mesa/pipe/softpipe/sp_state_sampler.c b/src/mesa/pipe/softpipe/sp_state_sampler.c index 09898eb..ad98375 100644 --- a/src/mesa/pipe/softpipe/sp_state_sampler.c +++ b/src/mesa/pipe/softpipe/sp_state_sampler.c @@ -32,27 +32,21 @@ #include "sp_context.h" #include "sp_state.h" - - -const struct pipe_sampler_state * +void * softpipe_create_sampler_state(struct pipe_context *pipe, const struct pipe_sampler_state *sampler) { - struct pipe_sampler_state *new_sampler = malloc(sizeof(struct pipe_sampler_state)); - memcpy(new_sampler, sampler, sizeof(struct pipe_sampler_state)); - - return new_sampler; + return 0; } void softpipe_bind_sampler_state(struct pipe_context *pipe, - unsigned unit, - const struct pipe_sampler_state *sampler) + unsigned unit, void *sampler) { struct softpipe_context *softpipe = softpipe_context(pipe); assert(unit < PIPE_MAX_SAMPLERS); - softpipe->sampler[unit] = sampler; + softpipe->sampler[unit] = (struct pipe_sampler_state *)sampler; softpipe->dirty |= SP_NEW_SAMPLER; } @@ -60,9 +54,9 @@ softpipe_bind_sampler_state(struct pipe_context *pipe, void softpipe_delete_sampler_state(struct pipe_context *pipe, - const struct pipe_sampler_state *sampler) + void *sampler) { - free((struct pipe_sampler_state*)sampler); + /* do nothing */ } diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c index 994d369..23ccd55 100644 --- a/src/mesa/state_tracker/st_atom_sampler.c +++ b/src/mesa/state_tracker/st_atom_sampler.c @@ -123,6 +123,7 @@ update_samplers(struct st_context *st) const struct gl_texture_object *texobj = st->ctx->Texture.Unit[u]._Current; struct pipe_sampler_state sampler; + const struct cso_sampler *cso; memset(&sampler, 0, sizeof(sampler)); @@ -143,13 +144,12 @@ update_samplers(struct st_context *st) /* XXX more sampler state here */ } - const struct pipe_sampler_state *cached_sampler = - st_cached_sampler_state(st, &sampler); + cso = st_cached_sampler_state(st, &sampler); - if (cached_sampler != st->state.sampler[u]) { + if (cso != st->state.sampler[u]) { /* state has changed */ - st->state.sampler[u] = cached_sampler; - st->pipe->bind_sampler_state(st->pipe, u, cached_sampler); + st->state.sampler[u] = cso; + st->pipe->bind_sampler_state(st->pipe, u, cso->data); } } } diff --git a/src/mesa/state_tracker/st_cache.c b/src/mesa/state_tracker/st_cache.c index c1ec130..007a231 100644 --- a/src/mesa/state_tracker/st_cache.c +++ b/src/mesa/state_tracker/st_cache.c @@ -61,21 +61,23 @@ const struct cso_blend * st_cached_blend_state(struct st_context *st, return ((struct cso_blend *)cso_hash_iter_data(iter)); } -struct pipe_sampler_state * st_cached_sampler_state( - struct st_context *st, - const struct pipe_sampler_state *sampler) +const struct cso_sampler * +st_cached_sampler_state(struct st_context *st, + const struct pipe_sampler_state *templ) { - unsigned hash_key = cso_construct_key((void*)sampler, sizeof(struct pipe_sampler_state)); + unsigned hash_key = cso_construct_key((void*)templ, sizeof(struct pipe_sampler_state)); struct cso_hash_iter iter = cso_find_state_template(st->cache, hash_key, CSO_SAMPLER, - (void*)sampler); + (void*)templ); if (cso_hash_iter_is_null(iter)) { - const struct pipe_sampler_state *created_state = st->pipe->create_sampler_state( - st->pipe, sampler); - iter = cso_insert_state(st->cache, hash_key, CSO_SAMPLER, - (void*)created_state); + struct cso_sampler *cso = malloc(sizeof(struct cso_sampler)); + memcpy(&cso->state, templ, sizeof(struct pipe_sampler_state)); + cso->data = st->pipe->create_sampler_state(st->pipe, templ); + if (!cso->data) + cso->data = &cso->state; + iter = cso_insert_state(st->cache, hash_key, CSO_SAMPLER, cso); } - return (struct pipe_sampler_state*)(cso_hash_iter_data(iter)); + return (struct cso_sampler*)(cso_hash_iter_data(iter)); } const struct cso_depth_stencil * diff --git a/src/mesa/state_tracker/st_cache.h b/src/mesa/state_tracker/st_cache.h index 167d9ec..483af6f 100644 --- a/src/mesa/state_tracker/st_cache.h +++ b/src/mesa/state_tracker/st_cache.h @@ -43,7 +43,7 @@ const struct cso_blend * st_cached_blend_state(struct st_context *st, const struct pipe_blend_state *blend); -struct pipe_sampler_state * +const struct cso_sampler * st_cached_sampler_state(struct st_context *st, const struct pipe_sampler_state *sampler); diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c index 95810b7..d814e34 100644 --- a/src/mesa/state_tracker/st_cb_drawpixels.c +++ b/src/mesa/state_tracker/st_cb_drawpixels.c @@ -345,6 +345,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z, /* texture sampling state: */ { struct pipe_sampler_state sampler; + const struct cso_sampler *cso; memset(&sampler, 0, sizeof(sampler)); sampler.wrap_s = PIPE_TEX_WRAP_REPEAT; sampler.wrap_t = PIPE_TEX_WRAP_REPEAT; @@ -352,8 +353,8 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z, sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST; sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST; - const struct pipe_sampler_state *state = st_cached_sampler_state(ctx->st, &sampler); - pipe->bind_sampler_state(pipe, unit, state); + cso = st_cached_sampler_state(ctx->st, &sampler); + pipe->bind_sampler_state(pipe, unit, cso->data); } /* viewport state: viewport matching window dims */ @@ -396,7 +397,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z, pipe->bind_fs_state(pipe, ctx->st->state.fs->data); pipe->bind_vs_state(pipe, ctx->st->state.vs->data); pipe->set_texture_state(pipe, unit, ctx->st->state.texture[unit]); - pipe->bind_sampler_state(pipe, unit, ctx->st->state.sampler[unit]); + pipe->bind_sampler_state(pipe, unit, ctx->st->state.sampler[unit]->data); pipe->set_viewport_state(pipe, &ctx->st->state.viewport); free_mipmap_tree(pipe, mt); diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index b82cf24..8a57227 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -76,7 +76,7 @@ struct st_context */ struct { const struct cso_blend *blend; - const struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS]; + const struct cso_sampler *sampler[PIPE_MAX_SAMPLERS]; const struct cso_depth_stencil *depth_stencil; const struct cso_rasterizer *rasterizer; const struct cso_fragment_shader *fs; -- 2.7.4