summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2013-09-12 15:09:01 -0600
committerBrian Paul <brianp@vmware.com>2013-10-03 14:05:26 -0600
commit8280b29d7c9fa472e2e7e10e5f920e04075186e2 (patch)
tree2e045a2e9dfc1c9ee1a109793fa7402a4c55c6b1
parent0de99d52b7953a90da69cc33dfaf2f15467a0d2b (diff)
radeon: implement pipe_context::bind_sampler_states()
-rw-r--r--src/gallium/drivers/r300/r300_state.c26
-rw-r--r--src/gallium/drivers/r600/r600_state_common.c1
-rw-r--r--src/gallium/drivers/radeonsi/si_state.c22
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;