radeon: implement pipe_context::bind_sampler_states()
authorBrian Paul <brianp@vmware.com>
Thu, 12 Sep 2013 21:09:01 +0000 (15:09 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 3 Oct 2013 20:05:26 +0000 (14:05 -0600)
src/gallium/drivers/r300/r300_state.c
src/gallium/drivers/r600/r600_state_common.c
src/gallium/drivers/radeonsi/si_state.c

index 249ee8beed4c0807a364036209e75af6a3505d5f..e10ea164f9f83f7b9e3035e4d149feca591a316d 100644 (file)
@@ -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;
index 7371bd611c4186dcfa9a933ce85ebc31f354a8ed..b2688489bf97fa2a30b8d5d0ab4e47f639370e9b 100644 (file)
@@ -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;
index 1d5f4b7afa3c69be408f2797083f64bd05409451..2079ffca6bf8cbf67f68bb45cb9502571e572e12 100644 (file)
@@ -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;