[Mesa-dev] [PATCH] gallium: new, unified pipe_context::set_sampler_views() function

Marek Olšák maraeo at gmail.com
Tue Oct 8 05:19:14 PDT 2013


The changes in the Radeon drivers look good to me.

Marek

On Tue, Oct 8, 2013 at 2:23 AM, Brian Paul <brianp at vmware.com> wrote:
> The new function replaces four old functions: set_fragment/vertex/
> geometry/compute_sampler_views().
>
> Note: at this time, it's expected that the 'start' parameter will
> always be zero.
>
> ---
>
> This change touches quite a few files.  I've probably missed
> something in drivers or state trackers that I can't test.
> Please test if you're able.  Thanks.
> ---
>  src/gallium/auxiliary/cso_cache/cso_context.c     |   36 +++---------
>  src/gallium/auxiliary/draw/draw_pipe_aaline.c     |   37 ++++++------
>  src/gallium/auxiliary/draw/draw_pipe_pstipple.c   |   33 ++++++-----
>  src/gallium/auxiliary/util/u_blitter.c            |   12 ++--
>  src/gallium/auxiliary/vl/vl_compositor.c          |    4 +-
>  src/gallium/auxiliary/vl/vl_idct.c                |    6 +-
>  src/gallium/auxiliary/vl/vl_matrix_filter.c       |    3 +-
>  src/gallium/auxiliary/vl/vl_mc.c                  |    3 +-
>  src/gallium/auxiliary/vl/vl_median_filter.c       |    3 +-
>  src/gallium/auxiliary/vl/vl_mpeg12_decoder.c      |    4 +-
>  src/gallium/auxiliary/vl/vl_zscan.c               |    3 +-
>  src/gallium/docs/d3d11ddi.txt                     |    4 +-
>  src/gallium/docs/source/context.rst               |   14 ++---
>  src/gallium/drivers/freedreno/freedreno_texture.c |   22 +++++++-
>  src/gallium/drivers/galahad/glhd_context.c        |   57 ++-----------------
>  src/gallium/drivers/i915/i915_state.c             |   22 +++++++-
>  src/gallium/drivers/identity/id_context.c         |   47 ++--------------
>  src/gallium/drivers/ilo/ilo_state.c               |   27 +++++++--
>  src/gallium/drivers/llvmpipe/lp_state_sampler.c   |   30 +---------
>  src/gallium/drivers/noop/noop_state.c             |   13 ++---
>  src/gallium/drivers/nouveau/nv30/nv30_context.h   |    8 +++
>  src/gallium/drivers/nouveau/nv30/nv30_fragtex.c   |   24 +++++++-
>  src/gallium/drivers/nouveau/nv30/nv40_verttex.c   |    4 +-
>  src/gallium/drivers/nouveau/nv50/nv50_state.c     |   39 ++++++-------
>  src/gallium/drivers/nouveau/nvc0/nvc0_state.c     |   57 ++++++++-----------
>  src/gallium/drivers/r300/r300_state.c             |   13 +++--
>  src/gallium/drivers/r600/evergreen_compute.c      |    3 +-
>  src/gallium/drivers/r600/r600_pipe.h              |    5 ++
>  src/gallium/drivers/r600/r600_state_common.c      |   20 ++-----
>  src/gallium/drivers/radeonsi/si_state.c           |   30 ++++------
>  src/gallium/drivers/rbug/rbug_context.c           |   30 +---------
>  src/gallium/drivers/softpipe/sp_state_sampler.c   |   32 +----------
>  src/gallium/drivers/svga/svga_pipe_sampler.c      |   11 +---
>  src/gallium/drivers/trace/tr_context.c            |   62 ++-------------------
>  src/gallium/include/pipe/p_context.h              |   18 +-----
>  src/gallium/tests/graw/fs-test.c                  |    2 +-
>  src/gallium/tests/graw/gs-test.c                  |    2 +-
>  src/gallium/tests/graw/quad-sample.c              |    2 +-
>  src/gallium/tests/graw/quad-tex.c                 |    2 +-
>  src/gallium/tests/graw/tex-srgb.c                 |    4 +-
>  src/gallium/tests/graw/tex-swizzle.c              |    2 +-
>  src/gallium/tests/graw/vs-test.c                  |    2 +-
>  src/gallium/tests/trivial/compute.c               |    4 +-
>  src/gallium/tools/trace/dump_state.py             |   14 +----
>  44 files changed, 278 insertions(+), 492 deletions(-)
>
> diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c
> index 6642c45..178f3f6 100644
> --- a/src/gallium/auxiliary/cso_cache/cso_context.c
> +++ b/src/gallium/auxiliary/cso_cache/cso_context.c
> @@ -306,6 +306,7 @@ void cso_release_all( struct cso_context *ctx )
>        ctx->pipe->bind_rasterizer_state( ctx->pipe, NULL );
>
>        {
> +         static struct pipe_sampler_view *views[PIPE_MAX_SAMPLERS] = { NULL };
>           static void *zeros[PIPE_MAX_SAMPLERS] = { NULL };
>           struct pipe_screen *scr = ctx->pipe->screen;
>           unsigned sh;
> @@ -315,6 +316,7 @@ void cso_release_all( struct cso_context *ctx )
>              assert(max <= PIPE_MAX_SAMPLERS);
>              if (max > 0) {
>                 ctx->pipe->bind_sampler_states(ctx->pipe, sh, 0, max, zeros);
> +               ctx->pipe->set_sampler_views(ctx->pipe, sh, 0, max, views);
>              }
>           }
>        }
> @@ -323,9 +325,7 @@ void cso_release_all( struct cso_context *ctx )
>        ctx->pipe->bind_fs_state( ctx->pipe, NULL );
>        ctx->pipe->bind_vs_state( ctx->pipe, NULL );
>        ctx->pipe->bind_vertex_elements_state( ctx->pipe, NULL );
> -      ctx->pipe->set_fragment_sampler_views(ctx->pipe, 0, NULL);
> -      if (ctx->pipe->set_vertex_sampler_views)
> -         ctx->pipe->set_vertex_sampler_views(ctx->pipe, 0, NULL);
> +
>        if (ctx->pipe->set_stream_output_targets)
>           ctx->pipe->set_stream_output_targets(ctx->pipe, 0, NULL, 0);
>     }
> @@ -1185,19 +1185,8 @@ cso_set_sampler_views(struct cso_context *ctx,
>     info->nr_views = count;
>
>     /* bind the new sampler views */
> -   switch (shader_stage) {
> -   case PIPE_SHADER_FRAGMENT:
> -      ctx->pipe->set_fragment_sampler_views(ctx->pipe, count, info->views);
> -      break;
> -   case PIPE_SHADER_VERTEX:
> -      ctx->pipe->set_vertex_sampler_views(ctx->pipe, count, info->views);
> -      break;
> -   case PIPE_SHADER_GEOMETRY:
> -      ctx->pipe->set_geometry_sampler_views(ctx->pipe, count, info->views);
> -      break;
> -   default:
> -      assert(!"bad shader type in cso_set_sampler_views()");
> -   }
> +   ctx->pipe->set_sampler_views(ctx->pipe, shader_stage, 0, count,
> +                                info->views);
>  }
>
>
> @@ -1233,19 +1222,8 @@ cso_restore_sampler_views(struct cso_context *ctx, unsigned shader_stage)
>     }
>
>     /* bind the old/saved sampler views */
> -   switch (shader_stage) {
> -   case PIPE_SHADER_FRAGMENT:
> -      ctx->pipe->set_fragment_sampler_views(ctx->pipe, nr_saved, info->views);
> -      break;
> -   case PIPE_SHADER_VERTEX:
> -      ctx->pipe->set_vertex_sampler_views(ctx->pipe, nr_saved, info->views);
> -      break;
> -   case PIPE_SHADER_GEOMETRY:
> -      ctx->pipe->set_geometry_sampler_views(ctx->pipe, nr_saved, info->views);
> -      break;
> -   default:
> -      assert(!"bad shader type in cso_restore_sampler_views()");
> -   }
> +   ctx->pipe->set_sampler_views(ctx->pipe, shader_stage,
> +                                0, nr_saved, info->views);
>
>     info->nr_views = nr_saved;
>     info->nr_views_saved = 0;
> diff --git a/src/gallium/auxiliary/draw/draw_pipe_aaline.c b/src/gallium/auxiliary/draw/draw_pipe_aaline.c
> index 3c93bf7..d00b721 100644
> --- a/src/gallium/auxiliary/draw/draw_pipe_aaline.c
> +++ b/src/gallium/auxiliary/draw/draw_pipe_aaline.c
> @@ -121,8 +121,8 @@ struct aaline_stage
>     void (*driver_bind_sampler_states)(struct pipe_context *, unsigned, unsigned,
>                                        unsigned, void **);
>
> -   void (*driver_set_sampler_views)(struct pipe_context *,
> -                                    unsigned,
> +   void (*driver_set_sampler_views)(struct pipe_context *, unsigned shader,
> +                                    unsigned start, unsigned count,
>                                      struct pipe_sampler_view **);
>  };
>
> @@ -708,7 +708,8 @@ aaline_first_line(struct draw_stage *stage, struct prim_header *header)
>     aaline->driver_bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT, 0,
>                                        num_samplers, aaline->state.sampler);
>
> -   aaline->driver_set_sampler_views(pipe, num_samplers, aaline->state.sampler_views);
> +   aaline->driver_set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
> +                                    num_samplers, aaline->state.sampler_views);
>
>     /* Disable triangle culling, stippling, unfilled mode etc. */
>     r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade);
> @@ -740,8 +741,8 @@ aaline_flush(struct draw_stage *stage, unsigned flags)
>                                        aaline->num_samplers,
>                                        aaline->state.sampler);
>
> -   aaline->driver_set_sampler_views(pipe,
> -                                    aaline->num_sampler_views,
> +   aaline->driver_set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
> +                                    aaline->num_samplers,
>                                      aaline->state.sampler_views);
>
>     /* restore original rasterizer state */
> @@ -791,7 +792,7 @@ aaline_destroy(struct draw_stage *stage)
>     pipe->delete_fs_state = aaline->driver_delete_fs_state;
>
>     pipe->bind_sampler_states = aaline->driver_bind_sampler_states;
> -   pipe->set_fragment_sampler_views = aaline->driver_set_sampler_views;
> +   pipe->set_sampler_views = aaline->driver_set_sampler_views;
>
>     FREE( stage );
>  }
> @@ -932,8 +933,8 @@ aaline_bind_sampler_states(struct pipe_context *pipe, unsigned shader,
>
>
>  static void
> -aaline_set_sampler_views(struct pipe_context *pipe,
> -                         unsigned num,
> +aaline_set_sampler_views(struct pipe_context *pipe, unsigned shader,
> +                         unsigned start, unsigned num,
>                           struct pipe_sampler_view **views)
>  {
>     struct aaline_stage *aaline = aaline_stage_from_pipe(pipe);
> @@ -943,17 +944,17 @@ aaline_set_sampler_views(struct pipe_context *pipe,
>        return;
>     }
>
> -   /* save current */
> -   for (i = 0; i < num; i++) {
> -      pipe_sampler_view_reference(&aaline->state.sampler_views[i], views[i]);
> -   }
> -   for ( ; i < PIPE_MAX_SHADER_SAMPLER_VIEWS; i++) {
> -      pipe_sampler_view_reference(&aaline->state.sampler_views[i], NULL);
> +   if (shader == PIPE_SHADER_FRAGMENT) {
> +      /* save current */
> +      for (i = 0; i < num; i++) {
> +         pipe_sampler_view_reference(&aaline->state.sampler_views[start + i],
> +                                     views[i]);
> +      }
> +      aaline->num_sampler_views = num;
>     }
> -   aaline->num_sampler_views = num;
>
>     /* pass-through */
> -   aaline->driver_set_sampler_views(pipe, num, views);
> +   aaline->driver_set_sampler_views(pipe, shader, start, num, views);
>  }
>
>
> @@ -1008,7 +1009,7 @@ draw_install_aaline_stage(struct draw_context *draw, struct pipe_context *pipe)
>     aaline->driver_delete_fs_state = pipe->delete_fs_state;
>
>     aaline->driver_bind_sampler_states = pipe->bind_sampler_states;
> -   aaline->driver_set_sampler_views = pipe->set_fragment_sampler_views;
> +   aaline->driver_set_sampler_views = pipe->set_sampler_views;
>
>     /* override the driver's functions */
>     pipe->create_fs_state = aaline_create_fs_state;
> @@ -1016,7 +1017,7 @@ draw_install_aaline_stage(struct draw_context *draw, struct pipe_context *pipe)
>     pipe->delete_fs_state = aaline_delete_fs_state;
>
>     pipe->bind_sampler_states = aaline_bind_sampler_states;
> -   pipe->set_fragment_sampler_views = aaline_set_sampler_views;
> +   pipe->set_sampler_views = aaline_set_sampler_views;
>
>     /* Install once everything is known to be OK:
>      */
> diff --git a/src/gallium/auxiliary/draw/draw_pipe_pstipple.c b/src/gallium/auxiliary/draw/draw_pipe_pstipple.c
> index e39276a..17b1d3d 100644
> --- a/src/gallium/auxiliary/draw/draw_pipe_pstipple.c
> +++ b/src/gallium/auxiliary/draw/draw_pipe_pstipple.c
> @@ -103,7 +103,8 @@ struct pstip_stage
>                                        unsigned, unsigned, void **);
>
>     void (*driver_set_sampler_views)(struct pipe_context *,
> -                                    unsigned,
> +                                    unsigned shader, unsigned start,
> +                                    unsigned count,
>                                      struct pipe_sampler_view **);
>
>     void (*driver_set_polygon_stipple)(struct pipe_context *,
> @@ -552,7 +553,9 @@ pstip_first_tri(struct draw_stage *stage, struct prim_header *header)
>     pstip->driver_bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT, 0,
>                                       num_samplers, pstip->state.samplers);
>
> -   pstip->driver_set_sampler_views(pipe, num_samplers, pstip->state.sampler_views);
> +   pstip->driver_set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
> +                                   num_samplers, pstip->state.sampler_views);
> +
>     draw->suspend_flushing = FALSE;
>
>     /* now really draw first triangle */
> @@ -579,9 +582,10 @@ pstip_flush(struct draw_stage *stage, unsigned flags)
>                                       pstip->num_samplers,
>                                       pstip->state.samplers);
>
> -   pstip->driver_set_sampler_views(pipe,
> +   pstip->driver_set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
>                                     pstip->num_sampler_views,
>                                     pstip->state.sampler_views);
> +
>     draw->suspend_flushing = FALSE;
>  }
>
> @@ -732,24 +736,23 @@ pstip_bind_sampler_states(struct pipe_context *pipe, unsigned shader,
>
>  static void
>  pstip_set_sampler_views(struct pipe_context *pipe,
> -                        unsigned num,
> +                        unsigned shader, unsigned start, unsigned num,
>                          struct pipe_sampler_view **views)
>  {
>     struct pstip_stage *pstip = pstip_stage_from_pipe(pipe);
>     uint i;
>
> -   /* save current */
> -   for (i = 0; i < num; i++) {
> -      pipe_sampler_view_reference(&pstip->state.sampler_views[i], views[i]);
> -   }
> -   for (; i < PIPE_MAX_SHADER_SAMPLER_VIEWS; i++) {
> -      pipe_sampler_view_reference(&pstip->state.sampler_views[i], NULL);
> +   if (shader == PIPE_SHADER_FRAGMENT) {
> +      /* save current */
> +      for (i = 0; i < num; i++) {
> +         pipe_sampler_view_reference(&pstip->state.sampler_views[start + i],
> +                                     views[i]);
> +      }
> +      pstip->num_sampler_views = num;
>     }
>
> -   pstip->num_sampler_views = num;
> -
>     /* pass-through */
> -   pstip->driver_set_sampler_views(pstip->pipe, num, views);
> +   pstip->driver_set_sampler_views(pstip->pipe, shader, start, num, views);
>  }
>
>
> @@ -804,7 +807,7 @@ draw_install_pstipple_stage(struct draw_context *draw,
>     pstip->driver_delete_fs_state = pipe->delete_fs_state;
>
>     pstip->driver_bind_sampler_states = pipe->bind_sampler_states;
> -   pstip->driver_set_sampler_views = pipe->set_fragment_sampler_views;
> +   pstip->driver_set_sampler_views = pipe->set_sampler_views;
>     pstip->driver_set_polygon_stipple = pipe->set_polygon_stipple;
>
>     /* override the driver's functions */
> @@ -813,7 +816,7 @@ draw_install_pstipple_stage(struct draw_context *draw,
>     pipe->delete_fs_state = pstip_delete_fs_state;
>
>     pipe->bind_sampler_states = pstip_bind_sampler_states;
> -   pipe->set_fragment_sampler_views = pstip_set_sampler_views;
> +   pipe->set_sampler_views = pstip_set_sampler_views;
>     pipe->set_polygon_stipple = pstip_set_polygon_stipple;
>
>     return TRUE;
> diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
> index a51b9ef..096d3bc 100644
> --- a/src/gallium/auxiliary/util/u_blitter.c
> +++ b/src/gallium/auxiliary/util/u_blitter.c
> @@ -535,9 +535,9 @@ static void blitter_restore_textures(struct blitter_context_priv *ctx)
>     ctx->base.saved_num_sampler_states = ~0;
>
>     /* Fragment sampler views. */
> -   pipe->set_fragment_sampler_views(pipe,
> -                                    ctx->base.saved_num_sampler_views,
> -                                    ctx->base.saved_sampler_views);
> +   pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
> +                           ctx->base.saved_num_sampler_views,
> +                           ctx->base.saved_sampler_views);
>
>     for (i = 0; i < ctx->base.saved_num_sampler_views; i++)
>        pipe_sampler_view_reference(&ctx->base.saved_sampler_views[i], NULL);
> @@ -1309,7 +1309,7 @@ void util_blitter_blit_generic(struct blitter_context *blitter,
>        views[0] = src;
>        views[1] = pipe->create_sampler_view(pipe, src->texture, &templ);
>
> -      pipe->set_fragment_sampler_views(pipe, 2, views);
> +      pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 2, views);
>        pipe->bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT, 0, 2, samplers);
>
>        pipe_sampler_view_reference(&views[1], NULL);
> @@ -1324,13 +1324,13 @@ void util_blitter_blit_generic(struct blitter_context *blitter,
>
>        view = pipe->create_sampler_view(pipe, src->texture, &templ);
>
> -      pipe->set_fragment_sampler_views(pipe, 1, &view);
> +      pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 1, &view);
>        pipe->bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT,
>                                  0, 1, &sampler_state);
>
>        pipe_sampler_view_reference(&view, NULL);
>     } else {
> -      pipe->set_fragment_sampler_views(pipe, 1, &src);
> +      pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 1, &src);
>        pipe->bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT,
>                                  0, 1, &sampler_state);
>     }
> diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c
> index db4c697..1c8312e 100644
> --- a/src/gallium/auxiliary/vl/vl_compositor.c
> +++ b/src/gallium/auxiliary/vl/vl_compositor.c
> @@ -727,7 +727,9 @@ draw_layers(struct vl_compositor *c, struct vl_compositor_state *s, struct u_rec
>           c->pipe->bind_fs_state(c->pipe, layer->fs);
>           c->pipe->bind_sampler_states(c->pipe, PIPE_SHADER_FRAGMENT, 0,
>                                        num_sampler_views, layer->samplers);
> -         c->pipe->set_fragment_sampler_views(c->pipe, num_sampler_views, samplers);
> +         c->pipe->set_sampler_views(c->pipe, PIPE_SHADER_FRAGMENT, 0,
> +                                    num_sampler_views, samplers);
> +
>           util_draw_arrays(c->pipe, PIPE_PRIM_QUADS, vb_index * 4, 4);
>           vb_index++;
>
> diff --git a/src/gallium/auxiliary/vl/vl_idct.c b/src/gallium/auxiliary/vl/vl_idct.c
> index dc14bb7..79adb04 100644
> --- a/src/gallium/auxiliary/vl/vl_idct.c
> +++ b/src/gallium/auxiliary/vl/vl_idct.c
> @@ -829,7 +829,8 @@ vl_idct_flush(struct vl_idct *idct, struct vl_idct_buffer *buffer, unsigned num_
>     idct->pipe->bind_sampler_states(idct->pipe, PIPE_SHADER_FRAGMENT,
>                                     0, 2, idct->samplers);
>
> -   idct->pipe->set_fragment_sampler_views(idct->pipe, 2, buffer->sampler_views.stage[0]);
> +   idct->pipe->set_sampler_views(idct->pipe, PIPE_SHADER_FRAGMENT, 0, 2,
> +                                 buffer->sampler_views.stage[0]);
>
>     /* mismatch control */
>     idct->pipe->set_framebuffer_state(idct->pipe, &buffer->fb_state_mismatch);
> @@ -855,6 +856,7 @@ vl_idct_prepare_stage2(struct vl_idct *idct, struct vl_idct_buffer *buffer)
>     idct->pipe->bind_rasterizer_state(idct->pipe, idct->rs_state);
>     idct->pipe->bind_sampler_states(idct->pipe, PIPE_SHADER_FRAGMENT,
>                                     0, 2, idct->samplers);
> -   idct->pipe->set_fragment_sampler_views(idct->pipe, 2, buffer->sampler_views.stage[1]);
> +   idct->pipe->set_sampler_views(idct->pipe, PIPE_SHADER_FRAGMENT,
> +                                 0, 2, buffer->sampler_views.stage[1]);
>  }
>
> diff --git a/src/gallium/auxiliary/vl/vl_matrix_filter.c b/src/gallium/auxiliary/vl/vl_matrix_filter.c
> index b7c88e7..56b7003 100644
> --- a/src/gallium/auxiliary/vl/vl_matrix_filter.c
> +++ b/src/gallium/auxiliary/vl/vl_matrix_filter.c
> @@ -308,7 +308,8 @@ vl_matrix_filter_render(struct vl_matrix_filter *filter,
>     filter->pipe->bind_blend_state(filter->pipe, filter->blend);
>     filter->pipe->bind_sampler_states(filter->pipe, PIPE_SHADER_FRAGMENT,
>                                       0, 1, &filter->sampler);
> -   filter->pipe->set_fragment_sampler_views(filter->pipe, 1, &src);
> +   filter->pipe->set_sampler_views(filter->pipe, PIPE_SHADER_FRAGMENT,
> +                                   0, 1, &src);
>     filter->pipe->bind_vs_state(filter->pipe, filter->vs);
>     filter->pipe->bind_fs_state(filter->pipe, filter->fs);
>     filter->pipe->set_framebuffer_state(filter->pipe, &fb_state);
> diff --git a/src/gallium/auxiliary/vl/vl_mc.c b/src/gallium/auxiliary/vl/vl_mc.c
> index bd75df1..7d4aee6 100644
> --- a/src/gallium/auxiliary/vl/vl_mc.c
> +++ b/src/gallium/auxiliary/vl/vl_mc.c
> @@ -613,7 +613,8 @@ vl_mc_render_ref(struct vl_mc *renderer, struct vl_mc_buffer *buffer, struct pip
>     renderer->pipe->bind_vs_state(renderer->pipe, renderer->vs_ref);
>     renderer->pipe->bind_fs_state(renderer->pipe, renderer->fs_ref);
>
> -   renderer->pipe->set_fragment_sampler_views(renderer->pipe, 1, &ref);
> +   renderer->pipe->set_sampler_views(renderer->pipe, PIPE_SHADER_FRAGMENT,
> +                                     0, 1, &ref);
>     renderer->pipe->bind_sampler_states(renderer->pipe, PIPE_SHADER_FRAGMENT,
>                                         0, 1, &renderer->sampler_ref);
>
> diff --git a/src/gallium/auxiliary/vl/vl_median_filter.c b/src/gallium/auxiliary/vl/vl_median_filter.c
> index f5ef117..6d98392 100644
> --- a/src/gallium/auxiliary/vl/vl_median_filter.c
> +++ b/src/gallium/auxiliary/vl/vl_median_filter.c
> @@ -387,7 +387,8 @@ vl_median_filter_render(struct vl_median_filter *filter,
>     filter->pipe->bind_blend_state(filter->pipe, filter->blend);
>     filter->pipe->bind_sampler_states(filter->pipe, PIPE_SHADER_FRAGMENT,
>                                       0, 1, &filter->sampler);
> -   filter->pipe->set_fragment_sampler_views(filter->pipe, 1, &src);
> +   filter->pipe->set_sampler_views(filter->pipe, PIPE_SHADER_FRAGMENT,
> +                                   0, 1, &src);
>     filter->pipe->bind_vs_state(filter->pipe, filter->vs);
>     filter->pipe->bind_fs_state(filter->pipe, filter->fs);
>     filter->pipe->set_framebuffer_state(filter->pipe, &fb_state);
> diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
> index bc207ac..ca4eb3e 100644
> --- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
> +++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
> @@ -746,7 +746,9 @@ vl_mpeg12_end_frame(struct pipe_video_codec *decoder,
>           if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT)
>              vl_idct_prepare_stage2(i ? &dec->idct_c : &dec->idct_y, &buf->idct[plane]);
>           else {
> -            dec->base.context->set_fragment_sampler_views(dec->base.context, 1, &mc_source_sv[plane]);
> +            dec->base.context->set_sampler_views(dec->base.context,
> +                                                 PIPE_SHADER_FRAGMENT, 0, 1,
> +                                                 &mc_source_sv[plane]);
>              dec->base.context->bind_sampler_states(dec->base.context,
>                                                     PIPE_SHADER_FRAGMENT,
>                                                     0, 1, &dec->sampler_ycbcr);
> diff --git a/src/gallium/auxiliary/vl/vl_zscan.c b/src/gallium/auxiliary/vl/vl_zscan.c
> index 2d616d57..40502ae 100644
> --- a/src/gallium/auxiliary/vl/vl_zscan.c
> +++ b/src/gallium/auxiliary/vl/vl_zscan.c
> @@ -578,7 +578,8 @@ vl_zscan_render(struct vl_zscan *zscan, struct vl_zscan_buffer *buffer, unsigned
>                                      0, 3, zscan->samplers);
>     zscan->pipe->set_framebuffer_state(zscan->pipe, &buffer->fb_state);
>     zscan->pipe->set_viewport_states(zscan->pipe, 0, 1, &buffer->viewport);
> -   zscan->pipe->set_fragment_sampler_views(zscan->pipe, 3, &buffer->src);
> +   zscan->pipe->set_sampler_views(zscan->pipe, PIPE_SHADER_FRAGMENT,
> +                                  0, 3, &buffer->src);
>     zscan->pipe->bind_vs_state(zscan->pipe, zscan->vs);
>     zscan->pipe->bind_fs_state(zscan->pipe, zscan->fs);
>     util_draw_arrays_instanced(zscan->pipe, PIPE_PRIM_QUADS, 0, 4, 0, num_instances);
> diff --git a/src/gallium/docs/d3d11ddi.txt b/src/gallium/docs/d3d11ddi.txt
> index 14a589f..a703648 100644
> --- a/src/gallium/docs/d3d11ddi.txt
> +++ b/src/gallium/docs/d3d11ddi.txt
> @@ -343,7 +343,7 @@ PsSetShader -> bind_fs_state
>  PsSetShaderWithIfaces (D3D11 only)
>         - Gallium does not support shader interfaces
>
> -PsSetShaderResources -> set_fragment_sampler_views
> +PsSetShaderResources -> set_sampler_views
>         * may want to allow binding subsets instead of all at once
>
>  QueryBegin -> begin_query
> @@ -458,5 +458,5 @@ VsSetShader -> bind_vs_state
>  VsSetShaderWithIfaces (D3D11 only)
>         - Gallium does not support shader interfaces
>
> -VsSetShaderResources  -> set_fragment_sampler_views
> +VsSetShaderResources  -> set_sampler_views
>         * may want to allow binding subsets instead of all at once
> diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst
> index e471eeb..1037162 100644
> --- a/src/gallium/docs/source/context.rst
> +++ b/src/gallium/docs/source/context.rst
> @@ -104,16 +104,10 @@ The ``first_layer`` and ``last_layer`` fields specify the layer range the
>  texture is going to be constrained to. Similar to the LOD range, this is added
>  to the array index which is used for sampling.
>
> -* ``set_fragment_sampler_views`` binds an array of sampler views to
> -  fragment shader stage. Every binding point acquires a reference
> +* ``set_sampler_views`` binds an array of sampler views to a shader stage.
> +  Every binding point acquires a reference
>    to a respective sampler view and releases a reference to the previous
> -  sampler view.  If M is the maximum number of sampler units and N units
> -  is passed to set_fragment_sampler_views, the driver should unbind the
> -  sampler views for units N..M-1.
> -
> -* ``set_vertex_sampler_views`` binds an array of sampler views to vertex
> -  shader stage. Every binding point acquires a reference to a respective
> -  sampler view and releases a reference to the previous sampler view.
> +  sampler view.
>
>  * ``create_sampler_view`` creates a new sampler view. ``texture`` is associated
>    with the sampler view which results in sampler view holding a reference
> @@ -601,5 +595,5 @@ method.
>
>  In addition, normal texture sampling is allowed from the compute
>  program: ``bind_sampler_states`` may be used to set up texture
> -samplers for the compute stage and ``set_compute_sampler_views`` may
> +samplers for the compute stage and ``set_sampler_views`` may
>  be used to bind a number of sampler views to it.
> diff --git a/src/gallium/drivers/freedreno/freedreno_texture.c b/src/gallium/drivers/freedreno/freedreno_texture.c
> index fc0c8aa..bcc846f 100644
> --- a/src/gallium/drivers/freedreno/freedreno_texture.c
> +++ b/src/gallium/drivers/freedreno/freedreno_texture.c
> @@ -144,6 +144,24 @@ fd_verttex_set_sampler_views(struct pipe_context *pctx, unsigned nr,
>         ctx->dirty |= FD_DIRTY_VERTTEX;
>  }
>
> +static void
> +fd_set_sampler_views(struct pipe_context *pctx, unsigned shader,
> +                     unsigne start, unsigned nr,
> +                     struct pipe_sampler_view **views)
> +{
> +   assert(start == 0);
> +   switch (shader) {
> +   case PIPE_SHADER_FRAGMENT:
> +      fd_fragtex_set_sampler_views(pctx, nr, views);
> +      break;
> +   case PIPE_SHADER_VERTEX:
> +      fd_verttex_set_sampler_views(pctx, nr, views);
> +      break;
> +   default:
> +      ;
> +   }
> +}
> +
>  void
>  fd_texture_init(struct pipe_context *pctx)
>  {
> @@ -152,7 +170,5 @@ fd_texture_init(struct pipe_context *pctx)
>         pctx->sampler_view_destroy = fd_sampler_view_destroy;
>
>         pctx->bind_sampler_states = fd_sampler_states_bind;
> -       pctx->set_fragment_sampler_views = fd_fragtex_set_sampler_views;
> -
> -       pctx->set_vertex_sampler_views = fd_verttex_set_sampler_views;
> +       pctx->set_sampler_views = fd_set_sampler_views;
>  }
> diff --git a/src/gallium/drivers/galahad/glhd_context.c b/src/gallium/drivers/galahad/glhd_context.c
> index dc3d5f0..0bb7abd 100644
> --- a/src/gallium/drivers/galahad/glhd_context.c
> +++ b/src/gallium/drivers/galahad/glhd_context.c
> @@ -519,58 +519,12 @@ galahad_context_set_sampler_views(struct pipe_context *_pipe,
>     struct galahad_context *glhd_pipe = galahad_context(_pipe);
>     struct pipe_context *pipe = glhd_pipe->pipe;
>     struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SAMPLERS];
> -   struct pipe_sampler_view **views = NULL;
>     unsigned i;
>
> -   if (_views) {
> -      for (i = 0; i < num; i++)
> -         unwrapped_views[i] = galahad_sampler_view_unwrap(_views[i]);
> -      for (; i < PIPE_MAX_SAMPLERS; i++)
> -         unwrapped_views[i] = NULL;
> +   for (i = 0; i < num; i++)
> +      unwrapped_views[i] = galahad_sampler_view_unwrap(_views[i]);
>
> -      views = unwrapped_views;
> -   }
> -
> -   switch (shader) {
> -   case PIPE_SHADER_VERTEX:
> -      pipe->set_vertex_sampler_views(pipe, num, views);
> -      break;
> -   case PIPE_SHADER_FRAGMENT:
> -      pipe->set_fragment_sampler_views(pipe, num, views);
> -      break;
> -   case PIPE_SHADER_GEOMETRY:
> -      pipe->set_geometry_sampler_views(pipe, num, views);
> -      break;
> -   default:
> -      assert(0);
> -   }
> -}
> -
> -static void
> -galahad_context_set_vertex_sampler_views(struct pipe_context *_pipe,
> -                                         unsigned num,
> -                                         struct pipe_sampler_view **_views)
> -{
> -   galahad_context_set_sampler_views(_pipe, PIPE_SHADER_VERTEX,
> -                                     0, num, _views);
> -}
> -
> -static void
> -galahad_context_set_fragment_sampler_views(struct pipe_context *_pipe,
> -                                           unsigned num,
> -                                           struct pipe_sampler_view **_views)
> -{
> -   galahad_context_set_sampler_views(_pipe, PIPE_SHADER_FRAGMENT,
> -                                     0, num, _views);
> -}
> -
> -static void
> -galahad_context_set_geometry_sampler_views(struct pipe_context *_pipe,
> -                                           unsigned num,
> -                                           struct pipe_sampler_view **_views)
> -{
> -   galahad_context_set_sampler_views(_pipe, PIPE_SHADER_GEOMETRY,
> -                                     0, num, _views);
> +   pipe->set_sampler_views(pipe, shader, start, num, unwrapped_views);
>  }
>
>  static void
> @@ -1053,10 +1007,7 @@ galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
>     GLHD_PIPE_INIT(set_polygon_stipple);
>     GLHD_PIPE_INIT(set_scissor_states);
>     GLHD_PIPE_INIT(set_viewport_states);
> -   GLHD_PIPE_INIT(set_fragment_sampler_views);
> -   GLHD_PIPE_INIT(set_vertex_sampler_views);
> -   GLHD_PIPE_INIT(set_geometry_sampler_views);
> -   //GLHD_PIPE_INIT(set_compute_sampler_views);
> +   GLHD_PIPE_INIT(set_sampler_views);
>     //GLHD_PIPE_INIT(set_shader_resources);
>     GLHD_PIPE_INIT(set_vertex_buffers);
>     GLHD_PIPE_INIT(set_index_buffer);
> diff --git a/src/gallium/drivers/i915/i915_state.c b/src/gallium/drivers/i915/i915_state.c
> index 70cba8b..00a55a8 100644
> --- a/src/gallium/drivers/i915/i915_state.c
> +++ b/src/gallium/drivers/i915/i915_state.c
> @@ -782,6 +782,25 @@ i915_set_vertex_sampler_views(struct pipe_context *pipe,
>  }
>
>
> +static void
> +i915_set_sampler_views(struct pipe_context *pipe, unsigned shader,
> +                       unsigned start, unsigned num,
> +                       struct pipe_sampler_view **views)
> +{
> +   assert(start == 0);
> +   switch (shader) {
> +   case PIPE_SHADER_FRAGMENT:
> +      i915_set_fragment_sampler_views(pipe, num, views);
> +      break;
> +   case PIPE_SHADER_VERTEX:
> +      i915_set_vertex_sampler_views(pipe, num, views);
> +      break;
> +   default:
> +      ;
> +   }
> +}
> +
> +
>  static struct pipe_sampler_view *
>  i915_create_sampler_view(struct pipe_context *pipe,
>                           struct pipe_resource *texture,
> @@ -1065,8 +1084,7 @@ i915_init_state_functions( struct i915_context *i915 )
>
>     i915->base.set_polygon_stipple = i915_set_polygon_stipple;
>     i915->base.set_scissor_states = i915_set_scissor_states;
> -   i915->base.set_fragment_sampler_views = i915_set_fragment_sampler_views;
> -   i915->base.set_vertex_sampler_views = i915_set_vertex_sampler_views;
> +   i915->base.set_sampler_views = i915_set_sampler_views;
>     i915->base.create_sampler_view = i915_create_sampler_view;
>     i915->base.sampler_view_destroy = i915_sampler_view_destroy;
>     i915->base.set_viewport_states = i915_set_viewport_states;
> diff --git a/src/gallium/drivers/identity/id_context.c b/src/gallium/drivers/identity/id_context.c
> index 0aff75f..60e8860 100644
> --- a/src/gallium/drivers/identity/id_context.c
> +++ b/src/gallium/drivers/identity/id_context.c
> @@ -486,50 +486,12 @@ identity_set_sampler_views(struct pipe_context *_pipe,
>     struct identity_context *id_pipe = identity_context(_pipe);
>     struct pipe_context *pipe = id_pipe->pipe;
>     struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SAMPLERS];
> -   struct pipe_sampler_view **views = NULL;
>     unsigned i;
>
> -   /* remove this when we have pipe->set_sampler_views(..., start, ...) */
> -   assert(start == 0);
> +   for (i = 0; i < num; i++)
> +      unwrapped_views[i] = identity_sampler_view_unwrap(_views[i]);
>
> -   if (_views) {
> -      for (i = 0; i < num; i++)
> -         unwrapped_views[i] = identity_sampler_view_unwrap(_views[i]);
> -      for (; i < PIPE_MAX_SAMPLERS; i++)
> -         unwrapped_views[i] = NULL;
> -
> -      views = unwrapped_views;
> -   }
> -
> -   switch (shader) {
> -   case PIPE_SHADER_VERTEX:
> -      pipe->set_vertex_sampler_views(pipe, num, views);
> -      break;
> -   case PIPE_SHADER_GEOMETRY:
> -      pipe->set_geometry_sampler_views(pipe, num, views);
> -      break;
> -   case PIPE_SHADER_FRAGMENT:
> -      pipe->set_fragment_sampler_views(pipe, num, views);
> -      break;
> -   default:
> -      debug_error("Unexpected shader in identity_set_sampler_views()");
> -   }
> -}
> -
> -static void
> -identity_set_fragment_sampler_views(struct pipe_context *_pipe,
> -                                    unsigned num,
> -                                    struct pipe_sampler_view **_views)
> -{
> -   identity_set_sampler_views(_pipe, PIPE_SHADER_FRAGMENT, 0, num, _views);
> -}
> -
> -static void
> -identity_set_vertex_sampler_views(struct pipe_context *_pipe,
> -                                  unsigned num,
> -                                  struct pipe_sampler_view **_views)
> -{
> -   identity_set_sampler_views(_pipe, PIPE_SHADER_VERTEX, 0, num, _views);
> +   pipe->set_sampler_views(pipe, shader, start, num, unwrapped_views);
>  }
>
>  static void
> @@ -894,8 +856,7 @@ identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
>     id_pipe->base.set_polygon_stipple = identity_set_polygon_stipple;
>     id_pipe->base.set_scissor_states = identity_set_scissor_states;
>     id_pipe->base.set_viewport_states = identity_set_viewport_states;
> -   id_pipe->base.set_fragment_sampler_views = identity_set_fragment_sampler_views;
> -   id_pipe->base.set_vertex_sampler_views = identity_set_vertex_sampler_views;
> +   id_pipe->base.set_sampler_views = identity_set_sampler_views;
>     id_pipe->base.set_vertex_buffers = identity_set_vertex_buffers;
>     id_pipe->base.set_index_buffer = identity_set_index_buffer;
>     id_pipe->base.resource_copy_region = identity_resource_copy_region;
> diff --git a/src/gallium/drivers/ilo/ilo_state.c b/src/gallium/drivers/ilo/ilo_state.c
> index caad308..91d7c76 100644
> --- a/src/gallium/drivers/ilo/ilo_state.c
> +++ b/src/gallium/drivers/ilo/ilo_state.c
> @@ -893,6 +893,28 @@ ilo_set_compute_sampler_views(struct pipe_context *pipe,
>  }
>
>  static void
> +ilo_set_sampler_views2(struct pipe_context *pipe, unsigned shader,
> +                       unsigned start_slot, unsigned num_views,
> +                       struct pipe_sampler_view **views)
> +{
> +   switch (shader) {
> +   case PIPE_SHADER_VERTEX:
> +      ilo_set_vertex_sampler_views(pipe, num_views, views);
> +      break;
> +   case PIPE_SHADER_GEOMETRY:
> +      ilo_set_geometry_sampler_views(pipe, num_views, views);
> +      break;
> +   case PIPE_SHADER_FRAGMENT:
> +      ilo_set_fragment_sampler_views(pipe, num_views, views);
> +      break;
> +   case PIPE_SHADER_COMPUTE:
> +      ilo_set_compute_sampler_views(pipe, start_slot, num_views, views);
> +      break;
> +   }
> +}
> +
> +
> +static void
>  ilo_set_shader_resources(struct pipe_context *pipe,
>                           unsigned start, unsigned count,
>                           struct pipe_surface **surfaces)
> @@ -1289,10 +1311,7 @@ ilo_init_state_functions(struct ilo_context *ilo)
>     ilo->base.set_polygon_stipple = ilo_set_polygon_stipple;
>     ilo->base.set_scissor_states = ilo_set_scissor_states;
>     ilo->base.set_viewport_states = ilo_set_viewport_states;
> -   ilo->base.set_fragment_sampler_views = ilo_set_fragment_sampler_views;
> -   ilo->base.set_vertex_sampler_views = ilo_set_vertex_sampler_views;
> -   ilo->base.set_geometry_sampler_views = ilo_set_geometry_sampler_views;
> -   ilo->base.set_compute_sampler_views = ilo_set_compute_sampler_views;
> +   ilo->base.set_sampler_views = ilo_set_sampler_views2;
>     ilo->base.set_shader_resources = ilo_set_shader_resources;
>     ilo->base.set_vertex_buffers = ilo_set_vertex_buffers;
>     ilo->base.set_index_buffer = ilo_set_index_buffer;
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_sampler.c b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
> index 6bf2fb8..1d3db0f 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_sampler.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
> @@ -159,32 +159,6 @@ llvmpipe_set_sampler_views(struct pipe_context *pipe,
>  }
>
>
> -static void
> -llvmpipe_set_fragment_sampler_views(struct pipe_context *pipe,
> -                                    unsigned num,
> -                                    struct pipe_sampler_view **views)
> -{
> -   llvmpipe_set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num, views);
> -}
> -
> -
> -static void
> -llvmpipe_set_vertex_sampler_views(struct pipe_context *pipe,
> -                                  unsigned num,
> -                                  struct pipe_sampler_view **views)
> -{
> -   llvmpipe_set_sampler_views(pipe, PIPE_SHADER_VERTEX, 0, num, views);
> -}
> -
> -
> -static void
> -llvmpipe_set_geometry_sampler_views(struct pipe_context *pipe,
> -                                    unsigned num,
> -                                    struct pipe_sampler_view **views)
> -{
> -   llvmpipe_set_sampler_views(pipe, PIPE_SHADER_GEOMETRY, 0, num, views);
> -}
> -
>  static struct pipe_sampler_view *
>  llvmpipe_create_sampler_view(struct pipe_context *pipe,
>                              struct pipe_resource *texture,
> @@ -395,10 +369,8 @@ llvmpipe_init_sampler_funcs(struct llvmpipe_context *llvmpipe)
>     llvmpipe->pipe.create_sampler_state = llvmpipe_create_sampler_state;
>
>     llvmpipe->pipe.bind_sampler_states = llvmpipe_bind_sampler_states;
> -   llvmpipe->pipe.set_fragment_sampler_views = llvmpipe_set_fragment_sampler_views;
> -   llvmpipe->pipe.set_vertex_sampler_views = llvmpipe_set_vertex_sampler_views;
> -   llvmpipe->pipe.set_geometry_sampler_views = llvmpipe_set_geometry_sampler_views;
>     llvmpipe->pipe.create_sampler_view = llvmpipe_create_sampler_view;
> +   llvmpipe->pipe.set_sampler_views = llvmpipe_set_sampler_views;
>     llvmpipe->pipe.sampler_view_destroy = llvmpipe_sampler_view_destroy;
>     llvmpipe->pipe.delete_sampler_state = llvmpipe_delete_sampler_state;
>  }
> diff --git a/src/gallium/drivers/noop/noop_state.c b/src/gallium/drivers/noop/noop_state.c
> index 173e2cc..9c62c27 100644
> --- a/src/gallium/drivers/noop/noop_state.c
> +++ b/src/gallium/drivers/noop/noop_state.c
> @@ -124,13 +124,9 @@ static struct pipe_surface *noop_create_surface(struct pipe_context *ctx,
>         return surface;
>  }
>
> -static void noop_set_vs_sampler_view(struct pipe_context *ctx, unsigned count,
> -                                       struct pipe_sampler_view **views)
> -{
> -}
> -
> -static void noop_set_ps_sampler_view(struct pipe_context *ctx, unsigned count,
> -                                       struct pipe_sampler_view **views)
> +static void noop_set_sampler_views(struct pipe_context *ctx, unsigned shader,
> +                                   unsigned start, unsigned count,
> +                                   struct pipe_sampler_view **views)
>  {
>  }
>
> @@ -312,7 +308,7 @@ void noop_init_state_functions(struct pipe_context *ctx)
>         ctx->set_blend_color = noop_set_blend_color;
>         ctx->set_clip_state = noop_set_clip_state;
>         ctx->set_constant_buffer = noop_set_constant_buffer;
> -       ctx->set_fragment_sampler_views = noop_set_ps_sampler_view;
> +       ctx->set_sampler_views = noop_set_sampler_views;
>         ctx->set_framebuffer_state = noop_set_framebuffer_state;
>         ctx->set_polygon_stipple = noop_set_polygon_stipple;
>         ctx->set_sample_mask = noop_set_sample_mask;
> @@ -320,7 +316,6 @@ void noop_init_state_functions(struct pipe_context *ctx)
>         ctx->set_stencil_ref = noop_set_stencil_ref;
>         ctx->set_vertex_buffers = noop_set_vertex_buffers;
>         ctx->set_index_buffer = noop_set_index_buffer;
> -       ctx->set_vertex_sampler_views = noop_set_vs_sampler_view;
>         ctx->set_viewport_states = noop_set_viewport_states;
>         ctx->sampler_view_destroy = noop_sampler_view_destroy;
>         ctx->surface_destroy = noop_surface_destroy;
> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_context.h b/src/gallium/drivers/nouveau/nv30/nv30_context.h
> index 292dcfe..527614a 100644
> --- a/src/gallium/drivers/nouveau/nv30/nv30_context.h
> +++ b/src/gallium/drivers/nouveau/nv30/nv30_context.h
> @@ -195,6 +195,14 @@ nv40_verttex_sampler_states_bind(struct pipe_context *pipe,
>                                   unsigned nr, void **hwcso);
>
>  void
> +nv40_verttex_set_sampler_views(struct pipe_context *pipe, unsigned nr,
> +                               struct pipe_sampler_view **views);
> +
> +void
> +nv30_fragtex_set_sampler_views(struct pipe_context *pipe,
> +                               unsigned nr, struct pipe_sampler_view **views);
> +
> +void
>  nv30_push_vbo(struct nv30_context *nv30, const struct pipe_draw_info *info);
>
>  void
> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_fragtex.c b/src/gallium/drivers/nouveau/nv30/nv30_fragtex.c
> index 87e66cc..4ab31d1 100644
> --- a/src/gallium/drivers/nouveau/nv30/nv30_fragtex.c
> +++ b/src/gallium/drivers/nouveau/nv30/nv30_fragtex.c
> @@ -171,7 +171,7 @@ nv30_fragtex_sampler_states_bind(struct pipe_context *pipe,
>  }
>
>
> -static void
> +void
>  nv30_fragtex_set_sampler_views(struct pipe_context *pipe, unsigned nr,
>                                 struct pipe_sampler_view **views)
>  {
> @@ -194,8 +194,28 @@ nv30_fragtex_set_sampler_views(struct pipe_context *pipe, unsigned nr,
>     nv30->dirty |= NV30_NEW_FRAGTEX;
>  }
>
> +
> +static void
> +nv30_set_sampler_views(struct pipe_context *pipe, unsigned shader,
> +                       unsigned start, unsigned nr,
> +                       struct pipe_sampler_view **views)
> +{
> +   assert(start == 0);
> +   switch (shader) {
> +   case PIPE_SHADER_FRAGMENT:
> +      nv30_fragtex_set_sampler_views(pipe, nr, views);
> +      break;
> +   case PIPE_SHADER_VERTEX:
> +      nv40_verttex_set_sampler_views(pipe, nr, views);
> +      break;
> +   default:
> +      ;
> +   }
> +}
> +
> +
>  void
>  nv30_fragtex_init(struct pipe_context *pipe)
>  {
> -   pipe->set_fragment_sampler_views = nv30_fragtex_set_sampler_views;
> +   pipe->set_sampler_views = nv30_set_sampler_views;
>  }
> diff --git a/src/gallium/drivers/nouveau/nv30/nv40_verttex.c b/src/gallium/drivers/nouveau/nv30/nv40_verttex.c
> index 48465cf..5c7fc62 100644
> --- a/src/gallium/drivers/nouveau/nv30/nv40_verttex.c
> +++ b/src/gallium/drivers/nouveau/nv30/nv40_verttex.c
> @@ -69,7 +69,7 @@ nv40_verttex_sampler_states_bind(struct pipe_context *pipe,
>  }
>
>
> -static void
> +void
>  nv40_verttex_set_sampler_views(struct pipe_context *pipe, unsigned nr,
>                                 struct pipe_sampler_view **views)
>  {
> @@ -95,5 +95,5 @@ nv40_verttex_set_sampler_views(struct pipe_context *pipe, unsigned nr,
>  void
>  nv40_verttex_init(struct pipe_context *pipe)
>  {
> -   pipe->set_vertex_sampler_views = nv40_verttex_set_sampler_views;
> +   /* nothing */
>  }
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state.c b/src/gallium/drivers/nouveau/nv50/nv50_state.c
> index aaea19f..b6a180e 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_state.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_state.c
> @@ -671,28 +671,27 @@ nv50_stage_set_sampler_views(struct nv50_context *nv50, int s,
>  }
>
>  static void
> -nv50_vp_set_sampler_views(struct pipe_context *pipe,
> -                          unsigned nr,
> -                          struct pipe_sampler_view **views)
> +nv50_set_sampler_views(struct pipe_context *pipe, unsigned shader,
> +                       unsigned start, unsigned nr,
> +                       struct pipe_sampler_view **views)
>  {
> -   nv50_stage_set_sampler_views(nv50_context(pipe), 0, nr, views);
> +   assert(start == 0);
> +   switch (shader) {
> +   case PIPE_SHADER_VERTEX:
> +      nv50_stage_set_sampler_views(nv50_context(pipe), 0, nr, views);
> +      break;
> +   case PIPE_SHADER_GEOMETRY:
> +      nv50_stage_set_sampler_views(nv50_context(pipe), 1, nr, views);
> +      break;
> +   case PIPE_SHADER_FRAGMENT:
> +      nv50_stage_set_sampler_views(nv50_context(pipe), 2, nr, views);
> +      break;
> +   default:
> +      ;
> +   }
>  }
>
> -static void
> -nv50_fp_set_sampler_views(struct pipe_context *pipe,
> -                          unsigned nr,
> -                          struct pipe_sampler_view **views)
> -{
> -   nv50_stage_set_sampler_views(nv50_context(pipe), 2, nr, views);
> -}
>
> -static void
> -nv50_gp_set_sampler_views(struct pipe_context *pipe,
> -                          unsigned nr,
> -                          struct pipe_sampler_view **views)
> -{
> -   nv50_stage_set_sampler_views(nv50_context(pipe), 1, nr, views);
> -}
>
>  /* ============================= SHADERS =======================================
>   */
> @@ -1092,9 +1091,7 @@ nv50_init_state_functions(struct nv50_context *nv50)
>
>     pipe->create_sampler_view = nv50_create_sampler_view;
>     pipe->sampler_view_destroy = nv50_sampler_view_destroy;
> -   pipe->set_vertex_sampler_views   = nv50_vp_set_sampler_views;
> -   pipe->set_fragment_sampler_views = nv50_fp_set_sampler_views;
> -   pipe->set_geometry_sampler_views = nv50_gp_set_sampler_views;
> +   pipe->set_sampler_views = nv50_set_sampler_views;
>
>     pipe->create_vs_state = nv50_vp_state_create;
>     pipe->create_fs_state = nv50_fp_state_create;
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
> index e0e6e13..4b8632a 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
> @@ -588,30 +588,6 @@ nvc0_stage_set_sampler_views(struct nvc0_context *nvc0, int s,
>  }
>
>  static void
> -nvc0_vp_set_sampler_views(struct pipe_context *pipe,
> -                          unsigned nr,
> -                          struct pipe_sampler_view **views)
> -{
> -   nvc0_stage_set_sampler_views(nvc0_context(pipe), 0, nr, views);
> -}
> -
> -static void
> -nvc0_fp_set_sampler_views(struct pipe_context *pipe,
> -                          unsigned nr,
> -                          struct pipe_sampler_view **views)
> -{
> -   nvc0_stage_set_sampler_views(nvc0_context(pipe), 4, nr, views);
> -}
> -
> -static void
> -nvc0_gp_set_sampler_views(struct pipe_context *pipe,
> -                          unsigned nr,
> -                          struct pipe_sampler_view **views)
> -{
> -   nvc0_stage_set_sampler_views(nvc0_context(pipe), 3, nr, views);
> -}
> -
> -static void
>  nvc0_stage_set_sampler_views_range(struct nvc0_context *nvc0, const unsigned s,
>                                     unsigned start, unsigned nr,
>                                     struct pipe_sampler_view **views)
> @@ -662,13 +638,29 @@ nvc0_stage_set_sampler_views_range(struct nvc0_context *nvc0, const unsigned s,
>  }
>
>  static void
> -nvc0_cp_set_sampler_views(struct pipe_context *pipe,
> -                          unsigned start, unsigned nr,
> -                          struct pipe_sampler_view **views)
> +nvc0_set_sampler_views(struct pipe_context *pipe, unsigned shader,
> +                       unsigned start, unsigned nr,
> +                       struct pipe_sampler_view **views)
>  {
> -   nvc0_stage_set_sampler_views_range(nvc0_context(pipe), 5, start, nr, views);
> -
> -   nvc0_context(pipe)->dirty_cp |= NVC0_NEW_CP_TEXTURES;
> +   assert(start == 0);
> +   switch (shader) {
> +   case PIPE_SHADER_VERTEX:
> +      nvc0_stage_set_sampler_views(nvc0_context(pipe), 0, nr, views);
> +      break;
> +   case PIPE_SHADER_GEOMETRY:
> +      nvc0_stage_set_sampler_views(nvc0_context(pipe), 3, nr, views);
> +      break;
> +   case PIPE_SHADER_FRAGMENT:
> +      nvc0_stage_set_sampler_views(nvc0_context(pipe), 4, nr, views);
> +      break;
> +   case PIPE_SHADER_COMPUTE:
> +      nvc0_stage_set_sampler_views_range(nvc0_context(pipe), 5,
> +                                         start, nr, views);
> +      nvc0_context(pipe)->dirty_cp |= NVC0_NEW_CP_TEXTURES;
> +      break;
> +   default:
> +      ;
> +   }
>  }
>
>
> @@ -1197,10 +1189,7 @@ nvc0_init_state_functions(struct nvc0_context *nvc0)
>
>     pipe->create_sampler_view = nvc0_create_sampler_view;
>     pipe->sampler_view_destroy = nvc0_sampler_view_destroy;
> -   pipe->set_vertex_sampler_views   = nvc0_vp_set_sampler_views;
> -   pipe->set_fragment_sampler_views = nvc0_fp_set_sampler_views;
> -   pipe->set_geometry_sampler_views = nvc0_gp_set_sampler_views;
> -   pipe->set_compute_sampler_views = nvc0_cp_set_sampler_views;
> +   pipe->set_sampler_views = nvc0_set_sampler_views;
>
>     pipe->create_vs_state = nvc0_vp_state_create;
>     pipe->create_fs_state = nvc0_fp_state_create;
> diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
> index 6ce009e..6840e8b 100644
> --- a/src/gallium/drivers/r300/r300_state.c
> +++ b/src/gallium/drivers/r300/r300_state.c
> @@ -1576,9 +1576,9 @@ static uint32_t r300_assign_texture_cache_region(unsigned index, unsigned num)
>          return R300_TX_CACHE(num + index);
>  }
>
> -static void r300_set_fragment_sampler_views(struct pipe_context* pipe,
> -                                            unsigned count,
> -                                            struct pipe_sampler_view** views)
> +static void r300_set_sampler_views(struct pipe_context* pipe, unsigned shader,
> +                                   unsigned start, unsigned count,
> +                                   struct pipe_sampler_view** views)
>  {
>      struct r300_context* r300 = r300_context(pipe);
>      struct r300_textures_state* state =
> @@ -1588,6 +1588,11 @@ static void r300_set_fragment_sampler_views(struct pipe_context* pipe,
>      unsigned tex_units = r300->screen->caps.num_tex_units;
>      boolean dirty_tex = FALSE;
>
> +    if (shader != PIPE_SHADER_FRAGMENT)
> +       return;
> +
> +    assert(start == 0);  /* non-zero not handled yet */
> +
>      if (count > tex_units) {
>          return;
>      }
> @@ -2159,7 +2164,7 @@ void r300_init_state_functions(struct r300_context* r300)
>      r300->context.bind_sampler_states = r300_bind_sampler_states;
>      r300->context.delete_sampler_state = r300_delete_sampler_state;
>
> -    r300->context.set_fragment_sampler_views = r300_set_fragment_sampler_views;
> +    r300->context.set_sampler_views = r300_set_sampler_views;
>      r300->context.create_sampler_view = r300_create_sampler_view;
>      r300->context.sampler_view_destroy = r300_sampler_view_destroy;
>
> diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c
> index e36c3a8..ade3706 100644
> --- a/src/gallium/drivers/r600/evergreen_compute.c
> +++ b/src/gallium/drivers/r600/evergreen_compute.c
> @@ -597,7 +597,7 @@ static void evergreen_set_compute_resources(struct pipe_context * ctx_,
>         }
>  }
>
> -static void evergreen_set_cs_sampler_view(struct pipe_context *ctx_,
> +void evergreen_set_cs_sampler_view(struct pipe_context *ctx_,
>                 unsigned start_slot, unsigned count,
>                 struct pipe_sampler_view **views)
>  {
> @@ -848,7 +848,6 @@ void evergreen_init_compute_state_functions(struct r600_context *ctx)
>         ctx->b.b.bind_compute_state = evergreen_bind_compute_state;
>  //      ctx->context.create_sampler_view = evergreen_compute_create_sampler_view;
>         ctx->b.b.set_compute_resources = evergreen_set_compute_resources;
> -       ctx->b.b.set_compute_sampler_views = evergreen_set_cs_sampler_view;
>         ctx->b.b.set_global_binding = evergreen_set_global_binding;
>         ctx->b.b.launch_grid = evergreen_launch_grid;
>
> diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
> index 0304d6a..75a721c 100644
> --- a/src/gallium/drivers/r600/r600_pipe.h
> +++ b/src/gallium/drivers/r600/r600_pipe.h
> @@ -574,6 +574,11 @@ void compute_memory_pool_delete(struct compute_memory_pool* pool);
>  struct compute_memory_pool* compute_memory_pool_new(
>         struct r600_screen *rscreen);
>
> +/* evergreen_compute.c */
> +void evergreen_set_cs_sampler_view(struct pipe_context *ctx_,
> +                                   unsigned start_slot, unsigned count,
> +                                   struct pipe_sampler_view **views);
> +
>  /* evergreen_state.c */
>  struct pipe_sampler_view *
>  evergreen_create_sampler_view_custom(struct pipe_context *ctx,
> diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
> index 482eb44..8f164bf 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -578,6 +578,11 @@ static void r600_set_sampler_views(struct pipe_context *pipe, unsigned shader,
>
>         assert(start == 0); /* XXX fix below */
>
> +       if (shader == PIPE_SHADER_COMPUTE) {
> +               evergreen_set_cs_sampler_view(pipe, start, count, views);
> +               return;
> +       }
> +
>         remaining_mask = dst->views.enabled_mask & disable_mask;
>
>         while (remaining_mask) {
> @@ -644,18 +649,6 @@ static void r600_set_sampler_views(struct pipe_context *pipe, unsigned shader,
>         }
>  }
>
> -static void r600_set_vs_sampler_views(struct pipe_context *ctx, unsigned count,
> -                                     struct pipe_sampler_view **views)
> -{
> -       r600_set_sampler_views(ctx, PIPE_SHADER_VERTEX, 0, count, views);
> -}
> -
> -static void r600_set_ps_sampler_views(struct pipe_context *ctx, unsigned count,
> -                                     struct pipe_sampler_view **views)
> -{
> -       r600_set_sampler_views(ctx, PIPE_SHADER_FRAGMENT, 0, count, views);
> -}
> -
>  static void r600_set_viewport_states(struct pipe_context *ctx,
>                                       unsigned start_slot,
>                                       unsigned num_viewports,
> @@ -2100,8 +2093,7 @@ void r600_init_common_state_functions(struct r600_context *rctx)
>         rctx->b.b.set_viewport_states = r600_set_viewport_states;
>         rctx->b.b.set_vertex_buffers = r600_set_vertex_buffers;
>         rctx->b.b.set_index_buffer = r600_set_index_buffer;
> -       rctx->b.b.set_fragment_sampler_views = r600_set_ps_sampler_views;
> -       rctx->b.b.set_vertex_sampler_views = r600_set_vs_sampler_views;
> +       rctx->b.b.set_sampler_views = r600_set_sampler_views;
>         rctx->b.b.sampler_view_destroy = r600_sampler_view_destroy;
>         rctx->b.b.texture_barrier = r600_texture_barrier;
>         rctx->b.b.set_stream_output_targets = r600_set_streamout_targets;
> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
> index adbb716..028b65c 100644
> --- a/src/gallium/drivers/radeonsi/si_state.c
> +++ b/src/gallium/drivers/radeonsi/si_state.c
> @@ -2609,14 +2609,21 @@ static void *si_create_sampler_state(struct pipe_context *ctx,
>
>  /* XXX consider moving this function to si_descriptors.c for gcc to inline
>   *     the si_set_sampler_view calls. LTO might help too. */
> -static void si_set_sampler_views(struct r600_context *rctx,
> -                                unsigned shader, unsigned count,
> +static void si_set_sampler_views(struct pipe_context *ctx,
> +                                unsigned shader, unsigned start,
> +                                 unsigned count,
>                                  struct pipe_sampler_view **views)
>  {
> +       struct r600_context *rctx = (struct r600_context *)ctx;
>         struct r600_textures_info *samplers = &rctx->samplers[shader];
>         struct si_pipe_sampler_view **rviews = (struct si_pipe_sampler_view **)views;
>         int i;
>
> +       if (shader != PIPE_SHADER_VERTEX && shader != PIPE_SHADER_FRAGMENT)
> +               return;
> +
> +       assert(start == 0);
> +
>         for (i = 0; i < count; i++) {
>                 if (views[i]) {
>                         struct r600_texture *rtex =
> @@ -2662,22 +2669,6 @@ static void si_set_sampler_views(struct r600_context *rctx,
>         rctx->b.flags |= R600_CONTEXT_INV_TEX_CACHE;
>  }
>
> -static void si_set_vs_sampler_views(struct pipe_context *ctx, unsigned count,
> -                                   struct pipe_sampler_view **views)
> -{
> -       struct r600_context *rctx = (struct r600_context *)ctx;
> -
> -       si_set_sampler_views(rctx, PIPE_SHADER_VERTEX, count, views);
> -}
> -
> -static void si_set_ps_sampler_views(struct pipe_context *ctx, unsigned count,
> -                                   struct pipe_sampler_view **views)
> -{
> -       struct r600_context *rctx = (struct r600_context *)ctx;
> -
> -       si_set_sampler_views(rctx, PIPE_SHADER_FRAGMENT, count, views);
> -}
> -
>  static struct si_pm4_state *si_set_sampler_states(struct r600_context *rctx, unsigned count,
>                                                    void **states,
>                                                    struct r600_textures_info *samplers,
> @@ -3034,8 +3025,7 @@ void si_init_state_functions(struct r600_context *rctx)
>         rctx->b.b.delete_sampler_state = si_delete_sampler_state;
>
>         rctx->b.b.create_sampler_view = si_create_sampler_view;
> -       rctx->b.b.set_vertex_sampler_views = si_set_vs_sampler_views;
> -       rctx->b.b.set_fragment_sampler_views = si_set_ps_sampler_views;
> +       rctx->b.b.set_sampler_views = si_set_sampler_views;
>         rctx->b.b.sampler_view_destroy = si_sampler_view_destroy;
>
>         rctx->b.b.set_sample_mask = si_set_sample_mask;
> diff --git a/src/gallium/drivers/rbug/rbug_context.c b/src/gallium/drivers/rbug/rbug_context.c
> index 083d372..be3e964 100644
> --- a/src/gallium/drivers/rbug/rbug_context.c
> +++ b/src/gallium/drivers/rbug/rbug_context.c
> @@ -736,37 +736,12 @@ rbug_set_sampler_views(struct pipe_context *_pipe,
>        views = unwrapped_views;
>     }
>
> -   switch (shader) {
> -   case PIPE_SHADER_VERTEX:
> -      pipe->set_vertex_sampler_views(pipe, num, views);
> -      break;
> -   case PIPE_SHADER_FRAGMENT:
> -      pipe->set_fragment_sampler_views(pipe, num, views);
> -      break;
> -   default:
> -      assert(0);
> -   }
> +   pipe->set_sampler_views(pipe, shader, start, num, views);
>
>     pipe_mutex_unlock(rb_pipe->call_mutex);
>  }
>
>  static void
> -rbug_set_vertex_sampler_views(struct pipe_context *_pipe,
> -                              unsigned num,
> -                              struct pipe_sampler_view **_views)
> -{
> -   rbug_set_sampler_views(_pipe, PIPE_SHADER_VERTEX, 0, num, _views);
> -}
> -
> -static void
> -rbug_set_fragment_sampler_views(struct pipe_context *_pipe,
> -                                unsigned num,
> -                                struct pipe_sampler_view **_views)
> -{
> -   rbug_set_sampler_views(_pipe, PIPE_SHADER_FRAGMENT, 0, num, _views);
> -}
> -
> -static void
>  rbug_set_vertex_buffers(struct pipe_context *_pipe,
>                          unsigned start_slot, unsigned num_buffers,
>                          const struct pipe_vertex_buffer *_buffers)
> @@ -1171,8 +1146,7 @@ rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
>     rb_pipe->base.set_polygon_stipple = rbug_set_polygon_stipple;
>     rb_pipe->base.set_scissor_states = rbug_set_scissor_states;
>     rb_pipe->base.set_viewport_states = rbug_set_viewport_states;
> -   rb_pipe->base.set_fragment_sampler_views = rbug_set_fragment_sampler_views;
> -   rb_pipe->base.set_vertex_sampler_views = rbug_set_vertex_sampler_views;
> +   rb_pipe->base.set_sampler_views = rbug_set_sampler_views;
>     rb_pipe->base.set_vertex_buffers = rbug_set_vertex_buffers;
>     rb_pipe->base.set_index_buffer = rbug_set_index_buffer;
>     rb_pipe->base.set_sample_mask = rbug_set_sample_mask;
> diff --git a/src/gallium/drivers/softpipe/sp_state_sampler.c b/src/gallium/drivers/softpipe/sp_state_sampler.c
> index be9d645..dde7c13 100644
> --- a/src/gallium/drivers/softpipe/sp_state_sampler.c
> +++ b/src/gallium/drivers/softpipe/sp_state_sampler.c
> @@ -166,33 +166,6 @@ softpipe_set_sampler_views(struct pipe_context *pipe,
>
>
>  static void
> -softpipe_set_fragment_sampler_views(struct pipe_context *pipe,
> -                                    unsigned num,
> -                                    struct pipe_sampler_view **views)
> -{
> -   softpipe_set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num, views);
> -}
> -
> -
> -static void
> -softpipe_set_vertex_sampler_views(struct pipe_context *pipe,
> -                                  unsigned num,
> -                                  struct pipe_sampler_view **views)
> -{
> -   softpipe_set_sampler_views(pipe, PIPE_SHADER_VERTEX, 0, num, views);
> -}
> -
> -
> -static void
> -softpipe_set_geometry_sampler_views(struct pipe_context *pipe,
> -                                    unsigned num,
> -                                    struct pipe_sampler_view **views)
> -{
> -   softpipe_set_sampler_views(pipe, PIPE_SHADER_GEOMETRY, 0, num, views);
> -}
> -
> -
> -static void
>  softpipe_delete_sampler_state(struct pipe_context *pipe,
>                                void *sampler)
>  {
> @@ -207,11 +180,8 @@ softpipe_init_sampler_funcs(struct pipe_context *pipe)
>     pipe->bind_sampler_states = softpipe_bind_sampler_states;
>     pipe->delete_sampler_state = softpipe_delete_sampler_state;
>
> -   pipe->set_fragment_sampler_views = softpipe_set_fragment_sampler_views;
> -   pipe->set_vertex_sampler_views = softpipe_set_vertex_sampler_views;
> -   pipe->set_geometry_sampler_views = softpipe_set_geometry_sampler_views;
> -
>     pipe->create_sampler_view = softpipe_create_sampler_view;
> +   pipe->set_sampler_views = softpipe_set_sampler_views;
>     pipe->sampler_view_destroy = softpipe_sampler_view_destroy;
>  }
>
> diff --git a/src/gallium/drivers/svga/svga_pipe_sampler.c b/src/gallium/drivers/svga/svga_pipe_sampler.c
> index b64e813..805e23b 100644
> --- a/src/gallium/drivers/svga/svga_pipe_sampler.c
> +++ b/src/gallium/drivers/svga/svga_pipe_sampler.c
> @@ -289,21 +289,12 @@ svga_set_sampler_views(struct pipe_context *pipe,
>  }
>
>
> -static void
> -svga_set_fragment_sampler_views(struct pipe_context *pipe,
> -                                unsigned num,
> -                                struct pipe_sampler_view **views)
> -{
> -   svga_set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num, views);
> -}
> -
> -
>  void svga_init_sampler_functions( struct svga_context *svga )
>  {
>     svga->pipe.create_sampler_state = svga_create_sampler_state;
>     svga->pipe.bind_sampler_states = svga_bind_sampler_states;
>     svga->pipe.delete_sampler_state = svga_delete_sampler_state;
> -   svga->pipe.set_fragment_sampler_views = svga_set_fragment_sampler_views;
> +   svga->pipe.set_sampler_views = svga_set_sampler_views;
>     svga->pipe.create_sampler_view = svga_create_sampler_view;
>     svga->pipe.sampler_view_destroy = svga_sampler_view_destroy;
>  }
> diff --git a/src/gallium/drivers/trace/tr_context.c b/src/gallium/drivers/trace/tr_context.c
> index 1b34986..78911aa 100644
> --- a/src/gallium/drivers/trace/tr_context.c
> +++ b/src/gallium/drivers/trace/tr_context.c
> @@ -903,71 +903,21 @@ trace_context_set_sampler_views(struct pipe_context *_pipe,
>     }
>     views = unwrapped_views;
>
> -   switch (shader) {
> -   case PIPE_SHADER_VERTEX:
> -      trace_dump_call_begin("pipe_context", "set_vertex_sampler_views");
> -      break;
> -   case PIPE_SHADER_GEOMETRY:
> -      trace_dump_call_begin("pipe_context", "set_geometry_sampler_views");
> -      break;
> -   case PIPE_SHADER_FRAGMENT:
> -      trace_dump_call_begin("pipe_context", "set_fragment_sampler_views");
> -      break;
> -   default:
> -      debug_error("Unexpected shader in trace_context_set_sampler_views()");
> -   }
> +   trace_dump_call_begin("pipe_context", "set_sampler_views");
>
>     trace_dump_arg(ptr, pipe);
> -   /*trace_dump_arg(uint, shader);*/
> +   trace_dump_arg(uint, shader);
> +   trace_dump_arg(uint, start);
>     trace_dump_arg(uint, num);
>     trace_dump_arg_array(ptr, views, num);
>
> -   switch (shader) {
> -   case PIPE_SHADER_VERTEX:
> -      pipe->set_vertex_sampler_views(pipe, num, views);
> -      break;
> -   case PIPE_SHADER_GEOMETRY:
> -      pipe->set_geometry_sampler_views(pipe, num, views);
> -      break;
> -   case PIPE_SHADER_FRAGMENT:
> -      pipe->set_fragment_sampler_views(pipe, num, views);
> -      break;
> -   default:
> -      debug_error("Unexpected shader in trace_context_set_sampler_views()");
> -   }
> +   pipe->set_sampler_views(pipe, shader, start, num, views);
>
>     trace_dump_call_end();
>  }
>
>
>  static INLINE void
> -trace_context_set_fragment_sampler_views(struct pipe_context *_pipe,
> -                                         unsigned num,
> -                                         struct pipe_sampler_view **views)
> -{
> -   trace_context_set_sampler_views(_pipe, PIPE_SHADER_FRAGMENT, 0, num, views);
> -}
> -
> -
> -static INLINE void
> -trace_context_set_vertex_sampler_views(struct pipe_context *_pipe,
> -                                       unsigned num,
> -                                       struct pipe_sampler_view **views)
> -{
> -   trace_context_set_sampler_views(_pipe, PIPE_SHADER_VERTEX, 0, num, views);
> -}
> -
> -
> -static INLINE void
> -trace_context_set_geometry_sampler_views(struct pipe_context *_pipe,
> -                                       unsigned num,
> -                                       struct pipe_sampler_view **views)
> -{
> -   trace_context_set_sampler_views(_pipe, PIPE_SHADER_GEOMETRY, 0, num, views);
> -}
> -
> -
> -static INLINE void
>  trace_context_set_vertex_buffers(struct pipe_context *_pipe,
>                                   unsigned start_slot, unsigned num_buffers,
>                                   const struct pipe_vertex_buffer *buffers)
> @@ -1556,9 +1506,7 @@ trace_context_create(struct trace_screen *tr_scr,
>     TR_CTX_INIT(set_polygon_stipple);
>     TR_CTX_INIT(set_scissor_states);
>     TR_CTX_INIT(set_viewport_states);
> -   TR_CTX_INIT(set_fragment_sampler_views);
> -   TR_CTX_INIT(set_vertex_sampler_views);
> -   TR_CTX_INIT(set_geometry_sampler_views);
> +   TR_CTX_INIT(set_sampler_views);
>     TR_CTX_INIT(create_sampler_view);
>     TR_CTX_INIT(sampler_view_destroy);
>     TR_CTX_INIT(create_surface);
> diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
> index 9d6b9b5..af64f4b 100644
> --- a/src/gallium/include/pipe/p_context.h
> +++ b/src/gallium/include/pipe/p_context.h
> @@ -213,21 +213,9 @@ struct pipe_context {
>                                  unsigned num_viewports,
>                                  const struct pipe_viewport_state *);
>
> -   void (*set_fragment_sampler_views)(struct pipe_context *,
> -                                      unsigned num_views,
> -                                      struct pipe_sampler_view **);
> -
> -   void (*set_vertex_sampler_views)(struct pipe_context *,
> -                                    unsigned num_views,
> -                                    struct pipe_sampler_view **);
> -
> -   void (*set_geometry_sampler_views)(struct pipe_context *,
> -                                      unsigned num_views,
> -                                      struct pipe_sampler_view **);
> -
> -   void (*set_compute_sampler_views)(struct pipe_context *,
> -                                     unsigned start_slot, unsigned num_views,
> -                                     struct pipe_sampler_view **);
> +   void (*set_sampler_views)(struct pipe_context *, unsigned shader,
> +                             unsigned start_slot, unsigned num_views,
> +                             struct pipe_sampler_view **);
>
>     /**
>      * Bind an array of shader resources that will be used by the
> diff --git a/src/gallium/tests/graw/fs-test.c b/src/gallium/tests/graw/fs-test.c
> index d962791..4d38e08 100644
> --- a/src/gallium/tests/graw/fs-test.c
> +++ b/src/gallium/tests/graw/fs-test.c
> @@ -352,7 +352,7 @@ static void init_tex( void )
>     if (sv == NULL)
>        exit(5);
>
> -   ctx->set_fragment_sampler_views(ctx, 1, &sv);
> +   ctx->set_sampler_views(ctx, PIPE_SHADER_FRAGMENT, 0, 1, &sv);
>
>
>     memset(&sampler_desc, 0, sizeof sampler_desc);
> diff --git a/src/gallium/tests/graw/gs-test.c b/src/gallium/tests/graw/gs-test.c
> index 2a8f26e..3ada18a 100644
> --- a/src/gallium/tests/graw/gs-test.c
> +++ b/src/gallium/tests/graw/gs-test.c
> @@ -459,7 +459,7 @@ static void init_tex( void )
>     if (sv == NULL)
>        exit(5);
>
> -   ctx->set_fragment_sampler_views(ctx, 1, &sv);
> +   ctx->set_sampler_views(ctx, PIPE_SHADER_FRAGMENT, 0, 1, &sv);
>
>
>     memset(&sampler_desc, 0, sizeof sampler_desc);
> diff --git a/src/gallium/tests/graw/quad-sample.c b/src/gallium/tests/graw/quad-sample.c
> index bfae2e0..b4a29e1 100644
> --- a/src/gallium/tests/graw/quad-sample.c
> +++ b/src/gallium/tests/graw/quad-sample.c
> @@ -267,7 +267,7 @@ static void init_tex( void )
>     if (sv == NULL)
>        exit(5);
>
> -   ctx->set_fragment_sampler_views(ctx, 1, &sv);
> +   ctx->set_sampler_views(ctx, PIPE_SHADER_FRAGMENT, 0, 1, &sv);
>
>
>     memset(&sampler_desc, 0, sizeof sampler_desc);
> diff --git a/src/gallium/tests/graw/quad-tex.c b/src/gallium/tests/graw/quad-tex.c
> index 7802d8e..9e4407e 100644
> --- a/src/gallium/tests/graw/quad-tex.c
> +++ b/src/gallium/tests/graw/quad-tex.c
> @@ -167,7 +167,7 @@ static void init_tex( void )
>                                      PIPE_FORMAT_B8G8R8A8_UNORM, tex2d);
>
>     sv = graw_util_create_simple_sampler_view(&info, texture);
> -   info.ctx->set_fragment_sampler_views(info.ctx, 1, &sv);
> +   info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, &sv);
>
>     sampler = graw_util_create_simple_sampler(&info,
>                                               PIPE_TEX_WRAP_REPEAT,
> diff --git a/src/gallium/tests/graw/tex-srgb.c b/src/gallium/tests/graw/tex-srgb.c
> index 5035fa7..dce9118 100644
> --- a/src/gallium/tests/graw/tex-srgb.c
> +++ b/src/gallium/tests/graw/tex-srgb.c
> @@ -128,11 +128,11 @@ static void draw( void )
>
>     info.ctx->clear(info.ctx, PIPE_CLEAR_COLOR, &clear_color, 0, 0);
>
> -   info.ctx->set_fragment_sampler_views(info.ctx, 1, &linear_sv);
> +   info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, &linear_sv);
>     set_vertices(vertices1, 4);
>     util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, 4);
>
> -   info.ctx->set_fragment_sampler_views(info.ctx, 1, &srgb_sv);
> +   info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, &srgb_sv);
>     set_vertices(vertices2, 4);
>     util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, 4);
>
> diff --git a/src/gallium/tests/graw/tex-swizzle.c b/src/gallium/tests/graw/tex-swizzle.c
> index 65c1d4d..910a8ca 100644
> --- a/src/gallium/tests/graw/tex-swizzle.c
> +++ b/src/gallium/tests/graw/tex-swizzle.c
> @@ -146,7 +146,7 @@ init_tex(const unsigned swizzle[4])
>     if (sv == NULL)
>        exit(5);
>
> -   info.ctx->set_fragment_sampler_views(info.ctx, 1, &sv);
> +   info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, &sv);
>
>     sampler = graw_util_create_simple_sampler(&info,
>                                               PIPE_TEX_WRAP_REPEAT,
> diff --git a/src/gallium/tests/graw/vs-test.c b/src/gallium/tests/graw/vs-test.c
> index f351928..f7d4d73 100644
> --- a/src/gallium/tests/graw/vs-test.c
> +++ b/src/gallium/tests/graw/vs-test.c
> @@ -346,7 +346,7 @@ static void init_tex( void )
>     if (sv == NULL)
>        exit(5);
>
> -   ctx->set_fragment_sampler_views(ctx, 1, &sv);
> +   ctx->set_sampler_views(ctx, PIPE_SHADER_FRAGMENT, 0, 1, &sv);
>
>
>     memset(&sampler_desc, 0, sizeof sampler_desc);
> diff --git a/src/gallium/tests/trivial/compute.c b/src/gallium/tests/trivial/compute.c
> index 339c264..4edb857 100644
> --- a/src/gallium/tests/trivial/compute.c
> +++ b/src/gallium/tests/trivial/compute.c
> @@ -312,7 +312,7 @@ static void init_sampler_views(struct context *ctx, const int *slots)
>                  assert(ctx->view[i]);
>          }
>
> -        pipe->set_compute_sampler_views(pipe, 0, i, ctx->view);
> +        pipe->set_sampler_views(pipe, PIPE_SHADER_COMPUTE, 0, i, ctx->view);
>  }
>
>  static void destroy_sampler_views(struct context *ctx)
> @@ -320,7 +320,7 @@ static void destroy_sampler_views(struct context *ctx)
>          struct pipe_context *pipe = ctx->pipe;
>          int i;
>
> -        pipe->set_compute_sampler_views(pipe, 0, MAX_RESOURCES, NULL);
> +        pipe->set_sampler_views(pipe, PIPE_SHADER_COMPUTE, 0, MAX_RESOURCES, NULL);
>
>          for (i = 0; i < MAX_RESOURCES; ++i) {
>                  if (ctx->view[i]) {
> diff --git a/src/gallium/tools/trace/dump_state.py b/src/gallium/tools/trace/dump_state.py
> index d4df2e0..8c3bdab 100755
> --- a/src/gallium/tools/trace/dump_state.py
> +++ b/src/gallium/tools/trace/dump_state.py
> @@ -243,9 +243,7 @@ class Context(Dispatcher):
>          self._state.vs.sampler = []
>          self._state.gs.sampler = []
>          self._state.fs.sampler = []
> -        self._state.vs.sampler_views = []
> -        self._state.gs.sampler_views = []
> -        self._state.fs.sampler_views = []
> +        self._state.sampler_views = {}
>          self._state.vs.constant_buffer = []
>          self._state.gs.constant_buffer = []
>          self._state.fs.constant_buffer = []
> @@ -400,14 +398,8 @@ class Context(Dispatcher):
>      def sampler_view_destroy(self, view):
>          pass
>
> -    def set_fragment_sampler_views(self, num, views):
> -        self._state.fs.sampler_views = views
> -
> -    def set_geometry_sampler_views(self, num, views):
> -        self._state.gs.sampler_views = views
> -
> -    def set_vertex_sampler_views(self, num, views):
> -        self._state.vs.sampler_views = views
> +    def set_sampler_views(self, shader, start, num, views):
> +        self._state.sampler_views[shader] = views
>
>      def set_vertex_buffers(self, start_slot, num_buffers, buffers):
>          self._update(self._state.vertex_buffers, start_slot, num_buffers, buffers)
> --
> 1.7.10.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list