diff options
-rw-r--r-- | src/gallium/drivers/r300/r300_state.c | 26 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_state_common.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state.c | 22 |
3 files changed, 49 insertions, 0 deletions
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index 249ee8beed4..e10ea164f9f 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -1541,6 +1541,31 @@ static void r300_bind_fragment_sampler_states(struct pipe_context* pipe, r300_mark_atom_dirty(r300, &r300->textures_state); } +static void r300_bind_sampler_states(struct pipe_context* pipe, + unsigned shader, + unsigned start, unsigned count, + void** states) +{ + struct r300_context* r300 = r300_context(pipe); + struct r300_textures_state* state = + (struct r300_textures_state*)r300->textures_state.state; + unsigned tex_units = r300->screen->caps.num_tex_units; + + assert(start == 0); + + if (shader != PIPE_SHADER_FRAGMENT) + return; + + if (count > tex_units) + return; + + memcpy(state->sampler_states, states, sizeof(void*) * count); + state->sampler_state_count = count; + + r300_mark_atom_dirty(r300, &r300->textures_state); +} + + static void r300_lacks_vertex_textures(struct pipe_context* pipe, unsigned count, void** states) @@ -2157,6 +2182,7 @@ void r300_init_state_functions(struct r300_context* r300) r300->context.delete_rasterizer_state = r300_delete_rs_state; r300->context.create_sampler_state = r300_create_sampler_state; + r300->context.bind_sampler_states = r300_bind_sampler_states; r300->context.bind_fragment_sampler_states = r300_bind_fragment_sampler_states; r300->context.bind_vertex_sampler_states = r300_lacks_vertex_textures; r300->context.delete_sampler_state = r300_delete_sampler_state; diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index 7371bd611c4..b2688489bf9 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -2085,6 +2085,7 @@ void r600_init_common_state_functions(struct r600_context *rctx) rctx->b.b.create_vertex_elements_state = r600_create_vertex_fetch_shader; rctx->b.b.bind_blend_state = r600_bind_blend_state; rctx->b.b.bind_depth_stencil_alpha_state = r600_bind_dsa_state; + rctx->b.b.bind_sampler_states = r600_bind_sampler_states; rctx->b.b.bind_fragment_sampler_states = r600_bind_ps_sampler_states; rctx->b.b.bind_fs_state = r600_bind_ps_state; rctx->b.b.bind_rasterizer_state = r600_bind_rs_state; diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 1d5f4b7afa3..2079ffca6bf 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -2772,6 +2772,27 @@ static void si_bind_ps_sampler_states(struct pipe_context *ctx, unsigned count, si_pm4_set_state(rctx, ps_sampler, pm4); } + +static void si_bind_sampler_states(struct pipe_context *ctx, unsigned shader, + unsigned start, unsigned count, + void **states) +{ + assert(start == 0); + + switch (shader) { + case PIPE_SHADER_VERTEX: + si_bind_vs_sampler_states(ctx, count, states); + break; + case PIPE_SHADER_FRAGMENT: + si_bind_ps_sampler_states(ctx, count, states); + break; + default: + ; + } +} + + + static void si_set_sample_mask(struct pipe_context *ctx, unsigned sample_mask) { struct r600_context *rctx = (struct r600_context *)ctx; @@ -3009,6 +3030,7 @@ void si_init_state_functions(struct r600_context *rctx) rctx->b.b.delete_fs_state = si_delete_ps_shader; rctx->b.b.create_sampler_state = si_create_sampler_state; + rctx->b.b.bind_sampler_states = si_bind_sampler_states; rctx->b.b.bind_vertex_sampler_states = si_bind_vs_sampler_states; rctx->b.b.bind_fragment_sampler_states = si_bind_ps_sampler_states; rctx->b.b.delete_sampler_state = si_delete_sampler_state; |