[Mesa-dev] [PATCH 1/4] gallium: Add support for multiple viewports
Marek Olšák
maraeo at gmail.com
Fri May 24 15:00:29 PDT 2013
This patch is:
Reviewed-by: Marek Olšák <maraeo at gmail.com>
Marek
On Fri, May 24, 2013 at 10:56 PM, Zack Rusin <zackr at vmware.com> wrote:
> Gallium supported only a single viewport/scissor combination. This
> commit changes the interface to allow us to add support for multiple
> viewports/scissors.
>
> Signed-off-by: Zack Rusin <zackr at vmware.com>
> ---
> src/gallium/auxiliary/cso_cache/cso_context.c | 4 +--
> src/gallium/auxiliary/draw/draw_context.c | 7 +++--
> src/gallium/auxiliary/draw/draw_context.h | 6 +++--
> src/gallium/auxiliary/tgsi/tgsi_scan.c | 6 +++++
> src/gallium/auxiliary/tgsi/tgsi_scan.h | 1 +
> src/gallium/auxiliary/tgsi/tgsi_strings.c | 3 ++-
> src/gallium/auxiliary/util/u_blitter.c | 8 +++---
> src/gallium/auxiliary/vl/vl_compositor.c | 4 +--
> src/gallium/auxiliary/vl/vl_idct.c | 4 +--
> src/gallium/auxiliary/vl/vl_matrix_filter.c | 2 +-
> src/gallium/auxiliary/vl/vl_mc.c | 2 +-
> src/gallium/auxiliary/vl/vl_median_filter.c | 2 +-
> src/gallium/auxiliary/vl/vl_zscan.c | 2 +-
> src/gallium/docs/source/context.rst | 8 +++---
> src/gallium/drivers/freedreno/freedreno_state.c | 12 ++++++---
> src/gallium/drivers/galahad/glhd_context.c | 20 ++++++++------
> src/gallium/drivers/i915/i915_state.c | 15 +++++++----
> src/gallium/drivers/identity/id_context.c | 22 +++++++++-------
> src/gallium/drivers/ilo/ilo_state.c | 16 +++++++-----
> src/gallium/drivers/llvmpipe/lp_screen.c | 2 ++
> src/gallium/drivers/llvmpipe/lp_state_clip.c | 23 +++++++++-------
> src/gallium/drivers/noop/noop_state.c | 16 +++++++-----
> src/gallium/drivers/nv30/nv30_draw.c | 2 +-
> src/gallium/drivers/nv30/nv30_state.c | 16 +++++++-----
> src/gallium/drivers/nv50/nv50_state.c | 16 +++++++-----
> src/gallium/drivers/nvc0/nvc0_state.c | 16 +++++++-----
> src/gallium/drivers/r300/r300_context.c | 2 +-
> src/gallium/drivers/r300/r300_state.c | 18 ++++++++-----
> src/gallium/drivers/r600/evergreen_state.c | 6 +++--
> src/gallium/drivers/r600/r600_state.c | 8 +++---
> src/gallium/drivers/r600/r600_state_common.c | 10 ++++---
> src/gallium/drivers/radeonsi/si_state.c | 16 +++++++-----
> src/gallium/drivers/rbug/rbug_context.c | 22 +++++++++-------
> src/gallium/drivers/softpipe/sp_screen.c | 2 ++
> src/gallium/drivers/softpipe/sp_state_clip.c | 19 +++++++++-----
> src/gallium/drivers/svga/svga_pipe_misc.c | 20 ++++++++------
> src/gallium/drivers/svga/svga_swtnl_state.c | 2 +-
> src/gallium/drivers/trace/tr_context.c | 32 ++++++++++++++---------
> src/gallium/include/pipe/p_context.h | 12 ++++++---
> src/gallium/include/pipe/p_defines.h | 3 ++-
> src/gallium/include/pipe/p_shader_tokens.h | 3 ++-
> src/gallium/include/pipe/p_state.h | 1 +
> src/gallium/tests/graw/fs-test.c | 2 +-
> src/gallium/tests/graw/graw_util.h | 2 +-
> src/gallium/tests/graw/gs-test.c | 2 +-
> src/gallium/tests/graw/quad-sample.c | 2 +-
> src/gallium/tests/graw/shader-leak.c | 2 +-
> src/gallium/tests/graw/tri-gs.c | 2 +-
> src/gallium/tests/graw/tri-instanced.c | 2 +-
> src/gallium/tests/graw/vs-test.c | 2 +-
> src/mesa/state_tracker/st_atom_scissor.c | 2 +-
> src/mesa/state_tracker/st_draw_feedback.c | 2 +-
> 52 files changed, 265 insertions(+), 166 deletions(-)
>
> diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c
> index e46f2ab..b06a070 100644
> --- a/src/gallium/auxiliary/cso_cache/cso_context.c
> +++ b/src/gallium/auxiliary/cso_cache/cso_context.c
> @@ -652,7 +652,7 @@ void cso_set_viewport(struct cso_context *ctx,
> {
> if (memcmp(&ctx->vp, vp, sizeof(*vp))) {
> ctx->vp = *vp;
> - ctx->pipe->set_viewport_state(ctx->pipe, vp);
> + ctx->pipe->set_viewport_states(ctx->pipe, 0, 1, vp);
> }
> }
>
> @@ -666,7 +666,7 @@ void cso_restore_viewport(struct cso_context *ctx)
> {
> if (memcmp(&ctx->vp, &ctx->vp_saved, sizeof(ctx->vp))) {
> ctx->vp = ctx->vp_saved;
> - ctx->pipe->set_viewport_state(ctx->pipe, &ctx->vp);
> + ctx->pipe->set_viewport_states(ctx->pipe, 0, 1, &ctx->vp);
> }
> }
>
> diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c
> index 7819038..b555c65 100644
> --- a/src/gallium/auxiliary/draw/draw_context.c
> +++ b/src/gallium/auxiliary/draw/draw_context.c
> @@ -311,9 +311,12 @@ void draw_set_clip_state( struct draw_context *draw,
> /**
> * Set the draw module's viewport state.
> */
> -void draw_set_viewport_state( struct draw_context *draw,
> - const struct pipe_viewport_state *viewport )
> +void draw_set_viewport_states( struct draw_context *draw,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *vps )
> {
> + const struct pipe_viewport_state *viewport = vps;
> draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
> draw->viewport = *viewport; /* struct copy */
> draw->identity_viewport = (viewport->scale[0] == 1.0f &&
> diff --git a/src/gallium/auxiliary/draw/draw_context.h b/src/gallium/auxiliary/draw/draw_context.h
> index 47bad0d..2d843b7 100644
> --- a/src/gallium/auxiliary/draw/draw_context.h
> +++ b/src/gallium/auxiliary/draw/draw_context.h
> @@ -71,8 +71,10 @@ void draw_destroy( struct draw_context *draw );
>
> void draw_flush(struct draw_context *draw);
>
> -void draw_set_viewport_state( struct draw_context *draw,
> - const struct pipe_viewport_state *viewport );
> +void draw_set_viewport_states( struct draw_context *draw,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *viewports );
>
> void draw_set_clip_state( struct draw_context *pipe,
> const struct pipe_clip_state *clip );
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> index bd79405..0230267 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> @@ -211,6 +211,12 @@ tgsi_scan_shader(const struct tgsi_token *tokens,
> fulldecl->Semantic.Name == TGSI_SEMANTIC_EDGEFLAG) {
> info->writes_edgeflag = TRUE;
> }
> +
> + if (procType == TGSI_PROCESSOR_GEOMETRY &&
> + fulldecl->Semantic.Name ==
> + TGSI_SEMANTIC_VIEWPORT_INDEX) {
> + info->writes_viewport_index = TRUE;
> + }
> }
>
> }
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h
> index 9debc34..676abf0 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h
> @@ -75,6 +75,7 @@ struct tgsi_shader_info
> boolean origin_lower_left;
> boolean pixel_center_integer;
> boolean color0_writes_all_cbufs;
> + boolean writes_viewport_index;
>
> unsigned num_written_clipdistance;
> /**
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_strings.c b/src/gallium/auxiliary/tgsi/tgsi_strings.c
> index 95a5ade..6abf927 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_strings.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c
> @@ -78,7 +78,8 @@ const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] =
> "BLOCK_SIZE",
> "THREAD_ID",
> "TEXCOORD",
> - "PCOORD"
> + "PCOORD",
> + "VIEWPORT_INDEX"
> };
>
> const char *tgsi_texture_names[TGSI_TEXTURE_COUNT] =
> diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
> index 2acc5af..8c871fd 100644
> --- a/src/gallium/auxiliary/util/u_blitter.c
> +++ b/src/gallium/auxiliary/util/u_blitter.c
> @@ -504,7 +504,7 @@ static void blitter_restore_fragment_states(struct blitter_context_priv *ctx)
> /* XXX check whether these are saved and whether they need to be restored
> * (depending on the operation) */
> pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref);
> - pipe->set_viewport_state(pipe, &ctx->base.saved_viewport);
> + pipe->set_viewport_states(pipe, 0, 1, &ctx->base.saved_viewport);
> }
>
> static void blitter_check_saved_fb_state(struct blitter_context_priv *ctx)
> @@ -599,7 +599,7 @@ static void blitter_set_rectangle(struct blitter_context_priv *ctx,
> ctx->viewport.translate[1] = 0.5f * ctx->dst_height;
> ctx->viewport.translate[2] = 0.0f;
> ctx->viewport.translate[3] = 0.0f;
> - ctx->base.pipe->set_viewport_state(ctx->base.pipe, &ctx->viewport);
> + ctx->base.pipe->set_viewport_states(ctx->base.pipe, 0, 1, &ctx->viewport);
> }
>
> static void blitter_set_clear_color(struct blitter_context_priv *ctx,
> @@ -1401,7 +1401,7 @@ void util_blitter_blit_generic(struct blitter_context *blitter,
>
> pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
> if (scissor) {
> - pipe->set_scissor_state(pipe, scissor);
> + pipe->set_scissor_states(pipe, 0, 1, scissor);
> }
>
> blitter_set_common_draw_rect_state(ctx, scissor != NULL);
> @@ -1496,7 +1496,7 @@ void util_blitter_blit_generic(struct blitter_context *blitter,
> blitter_restore_textures(ctx);
> blitter_restore_fb_state(ctx);
> if (scissor) {
> - pipe->set_scissor_state(pipe, &ctx->base.saved_scissor);
> + pipe->set_scissor_states(pipe, 0, 1, &ctx->base.saved_scissor);
> }
> blitter_restore_render_cond(ctx);
> blitter_unset_running_flag(ctx);
> diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c
> index 62f593a..4b83087 100644
> --- a/src/gallium/auxiliary/vl/vl_compositor.c
> +++ b/src/gallium/auxiliary/vl/vl_compositor.c
> @@ -723,7 +723,7 @@ draw_layers(struct vl_compositor *c, struct vl_compositor_state *s, struct u_rec
> void *blend = layer->blend ? layer->blend : i ? c->blend_add : c->blend_clear;
>
> c->pipe->bind_blend_state(c->pipe, blend);
> - c->pipe->set_viewport_state(c->pipe, &layer->viewport);
> + c->pipe->set_viewport_states(c->pipe, 0, 1, &layer->viewport);
> c->pipe->bind_fs_state(c->pipe, layer->fs);
> c->pipe->bind_fragment_sampler_states(c->pipe, num_sampler_views, layer->samplers);
> c->pipe->set_fragment_sampler_views(c->pipe, num_sampler_views, samplers);
> @@ -1014,7 +1014,7 @@ vl_compositor_render(struct vl_compositor_state *s,
> dirty_area->x1 = dirty_area->y1 = MIN_DIRTY;
> }
>
> - c->pipe->set_scissor_state(c->pipe, &s->scissor);
> + c->pipe->set_scissor_states(c->pipe, 0, 1, &s->scissor);
> c->pipe->set_framebuffer_state(c->pipe, &c->fb_state);
> c->pipe->bind_vs_state(c->pipe, c->vs);
> c->pipe->set_vertex_buffers(c->pipe, 0, 1, &c->vertex_buf);
> diff --git a/src/gallium/auxiliary/vl/vl_idct.c b/src/gallium/auxiliary/vl/vl_idct.c
> index bd73dfd..5346cbc 100644
> --- a/src/gallium/auxiliary/vl/vl_idct.c
> +++ b/src/gallium/auxiliary/vl/vl_idct.c
> @@ -830,14 +830,14 @@ vl_idct_flush(struct vl_idct *idct, struct vl_idct_buffer *buffer, unsigned num_
>
> /* mismatch control */
> idct->pipe->set_framebuffer_state(idct->pipe, &buffer->fb_state_mismatch);
> - idct->pipe->set_viewport_state(idct->pipe, &buffer->viewport_mismatch);
> + idct->pipe->set_viewport_states(idct->pipe, 0, 1, &buffer->viewport_mismatch);
> idct->pipe->bind_vs_state(idct->pipe, idct->vs_mismatch);
> idct->pipe->bind_fs_state(idct->pipe, idct->fs_mismatch);
> util_draw_arrays_instanced(idct->pipe, PIPE_PRIM_POINTS, 0, 1, 0, num_instances);
>
> /* first stage */
> idct->pipe->set_framebuffer_state(idct->pipe, &buffer->fb_state);
> - idct->pipe->set_viewport_state(idct->pipe, &buffer->viewport);
> + idct->pipe->set_viewport_states(idct->pipe, 0, 1, &buffer->viewport);
> idct->pipe->bind_vs_state(idct->pipe, idct->vs);
> idct->pipe->bind_fs_state(idct->pipe, idct->fs);
> util_draw_arrays_instanced(idct->pipe, PIPE_PRIM_QUADS, 0, 4, 0, num_instances);
> diff --git a/src/gallium/auxiliary/vl/vl_matrix_filter.c b/src/gallium/auxiliary/vl/vl_matrix_filter.c
> index cda90ff..9bd7ed1 100644
> --- a/src/gallium/auxiliary/vl/vl_matrix_filter.c
> +++ b/src/gallium/auxiliary/vl/vl_matrix_filter.c
> @@ -311,7 +311,7 @@ vl_matrix_filter_render(struct vl_matrix_filter *filter,
> 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);
> - filter->pipe->set_viewport_state(filter->pipe, &viewport);
> + filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport);
> filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &filter->quad);
> filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves);
>
> diff --git a/src/gallium/auxiliary/vl/vl_mc.c b/src/gallium/auxiliary/vl/vl_mc.c
> index b427209..1fd40c3 100644
> --- a/src/gallium/auxiliary/vl/vl_mc.c
> +++ b/src/gallium/auxiliary/vl/vl_mc.c
> @@ -600,7 +600,7 @@ prepare_pipe_4_rendering(struct vl_mc *renderer, struct vl_mc_buffer *buffer, un
> renderer->pipe->bind_blend_state(renderer->pipe, renderer->blend_clear[mask]);
>
> renderer->pipe->set_framebuffer_state(renderer->pipe, &buffer->fb_state);
> - renderer->pipe->set_viewport_state(renderer->pipe, &buffer->viewport);
> + renderer->pipe->set_viewport_states(renderer->pipe, 0, 1, &buffer->viewport);
> }
>
> void
> diff --git a/src/gallium/auxiliary/vl/vl_median_filter.c b/src/gallium/auxiliary/vl/vl_median_filter.c
> index 2db1479..158751a 100644
> --- a/src/gallium/auxiliary/vl/vl_median_filter.c
> +++ b/src/gallium/auxiliary/vl/vl_median_filter.c
> @@ -390,7 +390,7 @@ vl_median_filter_render(struct vl_median_filter *filter,
> 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);
> - filter->pipe->set_viewport_state(filter->pipe, &viewport);
> + filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport);
> filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &filter->quad);
> filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves);
>
> diff --git a/src/gallium/auxiliary/vl/vl_zscan.c b/src/gallium/auxiliary/vl/vl_zscan.c
> index 262fb0d..33baa3d 100644
> --- a/src/gallium/auxiliary/vl/vl_zscan.c
> +++ b/src/gallium/auxiliary/vl/vl_zscan.c
> @@ -576,7 +576,7 @@ vl_zscan_render(struct vl_zscan *zscan, struct vl_zscan_buffer *buffer, unsigned
> zscan->pipe->bind_blend_state(zscan->pipe, zscan->blend);
> zscan->pipe->bind_fragment_sampler_states(zscan->pipe, 3, zscan->samplers);
> zscan->pipe->set_framebuffer_state(zscan->pipe, &buffer->fb_state);
> - zscan->pipe->set_viewport_state(zscan->pipe, &buffer->viewport);
> + zscan->pipe->set_viewport_states(zscan->pipe, 0, 1, &buffer->viewport);
> zscan->pipe->set_fragment_sampler_views(zscan->pipe, 3, &buffer->src);
> zscan->pipe->bind_vs_state(zscan->pipe, zscan->vs);
> zscan->pipe->bind_fs_state(zscan->pipe, zscan->fs);
> diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst
> index 2cc1848..679772f 100644
> --- a/src/gallium/docs/source/context.rst
> +++ b/src/gallium/docs/source/context.rst
> @@ -68,13 +68,15 @@ objects. They all follow simple, one-method binding calls, e.g.
> * ``set_sample_mask``
> * ``set_clip_state``
> * ``set_polygon_stipple``
> -* ``set_scissor_state`` sets the bounds for the scissor test, which culls
> +* ``set_scissor_states`` sets the bounds for the scissor test, which culls
> pixels before blending to render targets. If the :ref:`Rasterizer` does
> not have the scissor test enabled, then the scissor bounds never need to
> be set since they will not be used. Note that scissor xmin and ymin are
> inclusive, but xmax and ymax are exclusive. The inclusive ranges in x
> - and y would be [xmin..xmax-1] and [ymin..ymax-1].
> -* ``set_viewport_state``
> + and y would be [xmin..xmax-1] and [ymin..ymax-1]. The number of scissors
> + should be the same as the number of set viewports and can be up to
> + PIPE_MAX_VIEWPORTS.
> +* ``set_viewport_states``
>
>
> Sampler Views
> diff --git a/src/gallium/drivers/freedreno/freedreno_state.c b/src/gallium/drivers/freedreno/freedreno_state.c
> index ce9a522..9f4e4f8 100644
> --- a/src/gallium/drivers/freedreno/freedreno_state.c
> +++ b/src/gallium/drivers/freedreno/freedreno_state.c
> @@ -158,7 +158,9 @@ fd_set_polygon_stipple(struct pipe_context *pctx,
> }
>
> static void
> -fd_set_scissor_state(struct pipe_context *pctx,
> +fd_set_scissor_states(struct pipe_context *pctx,
> + unsigned start_slot,
> + unsigned num_scissors,
> const struct pipe_scissor_state *scissor)
> {
> struct fd_context *ctx = fd_context(pctx);
> @@ -168,7 +170,9 @@ fd_set_scissor_state(struct pipe_context *pctx,
> }
>
> static void
> -fd_set_viewport_state(struct pipe_context *pctx,
> +fd_set_viewport_states(struct pipe_context *pctx,
> + unsigned start_slot,
> + unsigned num_viewports,
> const struct pipe_viewport_state *viewport)
> {
> struct fd_context *ctx = fd_context(pctx);
> @@ -234,8 +238,8 @@ fd_state_init(struct pipe_context *pctx)
> pctx->set_constant_buffer = fd_set_constant_buffer;
> pctx->set_framebuffer_state = fd_set_framebuffer_state;
> pctx->set_polygon_stipple = fd_set_polygon_stipple;
> - pctx->set_scissor_state = fd_set_scissor_state;
> - pctx->set_viewport_state = fd_set_viewport_state;
> + pctx->set_scissor_states = fd_set_scissor_states;
> + pctx->set_viewport_states = fd_set_viewport_states;
>
> pctx->set_vertex_buffers = fd_set_vertex_buffers;
> pctx->set_index_buffer = fd_set_index_buffer;
> diff --git a/src/gallium/drivers/galahad/glhd_context.c b/src/gallium/drivers/galahad/glhd_context.c
> index a73a3ad..7e8af56 100644
> --- a/src/gallium/drivers/galahad/glhd_context.c
> +++ b/src/gallium/drivers/galahad/glhd_context.c
> @@ -524,25 +524,29 @@ galahad_context_set_polygon_stipple(struct pipe_context *_pipe,
> }
>
> static void
> -galahad_context_set_scissor_state(struct pipe_context *_pipe,
> +galahad_context_set_scissor_states(struct pipe_context *_pipe,
> + unsigned start_slot,
> + unsigned num_scissors,
> const struct pipe_scissor_state *scissor)
> {
> struct galahad_context *glhd_pipe = galahad_context(_pipe);
> struct pipe_context *pipe = glhd_pipe->pipe;
>
> - pipe->set_scissor_state(pipe,
> - scissor);
> + pipe->set_scissor_states(pipe, start_slot, num_scissors,
> + scissor);
> }
>
> static void
> -galahad_context_set_viewport_state(struct pipe_context *_pipe,
> +galahad_context_set_viewport_states(struct pipe_context *_pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> const struct pipe_viewport_state *viewport)
> {
> struct galahad_context *glhd_pipe = galahad_context(_pipe);
> struct pipe_context *pipe = glhd_pipe->pipe;
>
> - pipe->set_viewport_state(pipe,
> - viewport);
> + pipe->set_viewport_states(pipe, start_slot, num_viewports,
> + viewport);
> }
>
> static void
> @@ -1077,8 +1081,8 @@ galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
> GLHD_PIPE_INIT(set_constant_buffer);
> GLHD_PIPE_INIT(set_framebuffer_state);
> GLHD_PIPE_INIT(set_polygon_stipple);
> - GLHD_PIPE_INIT(set_scissor_state);
> - GLHD_PIPE_INIT(set_viewport_state);
> + 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);
> diff --git a/src/gallium/drivers/i915/i915_state.c b/src/gallium/drivers/i915/i915_state.c
> index 4a4faa5..06d4d3b 100644
> --- a/src/gallium/drivers/i915/i915_state.c
> +++ b/src/gallium/drivers/i915/i915_state.c
> @@ -534,7 +534,9 @@ static void i915_delete_depth_stencil_state(struct pipe_context *pipe,
> }
>
>
> -static void i915_set_scissor_state( struct pipe_context *pipe,
> +static void i915_set_scissor_states( struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_scissors,
> const struct pipe_scissor_state *scissor )
> {
> struct i915_context *i915 = i915_context(pipe);
> @@ -825,7 +827,9 @@ static void i915_set_clip_state( struct pipe_context *pipe,
> /* Called when driver state tracker notices changes to the viewport
> * matrix:
> */
> -static void i915_set_viewport_state( struct pipe_context *pipe,
> +static void i915_set_viewport_states( struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> const struct pipe_viewport_state *viewport )
> {
> struct i915_context *i915 = i915_context(pipe);
> @@ -833,7 +837,8 @@ static void i915_set_viewport_state( struct pipe_context *pipe,
> i915->viewport = *viewport; /* struct copy */
>
> /* pass the viewport info to the draw module */
> - draw_set_viewport_state(i915->draw, &i915->viewport);
> + draw_set_viewport_states(i915->draw, start_slot, num_viewports,
> + &i915->viewport);
>
> i915->dirty |= I915_NEW_VIEWPORT;
> }
> @@ -1040,12 +1045,12 @@ i915_init_state_functions( struct i915_context *i915 )
> i915->base.set_framebuffer_state = i915_set_framebuffer_state;
>
> i915->base.set_polygon_stipple = i915_set_polygon_stipple;
> - i915->base.set_scissor_state = i915_set_scissor_state;
> + 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.create_sampler_view = i915_create_sampler_view;
> i915->base.sampler_view_destroy = i915_sampler_view_destroy;
> - i915->base.set_viewport_state = i915_set_viewport_state;
> + i915->base.set_viewport_states = i915_set_viewport_states;
> i915->base.set_vertex_buffers = i915_set_vertex_buffers;
> i915->base.set_index_buffer = i915_set_index_buffer;
> }
> diff --git a/src/gallium/drivers/identity/id_context.c b/src/gallium/drivers/identity/id_context.c
> index 0eff6c9..6b342eb 100644
> --- a/src/gallium/drivers/identity/id_context.c
> +++ b/src/gallium/drivers/identity/id_context.c
> @@ -486,25 +486,27 @@ identity_set_polygon_stipple(struct pipe_context *_pipe,
> }
>
> static void
> -identity_set_scissor_state(struct pipe_context *_pipe,
> - const struct pipe_scissor_state *scissor)
> +identity_set_scissor_states(struct pipe_context *_pipe,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state *scissor)
> {
> struct identity_context *id_pipe = identity_context(_pipe);
> struct pipe_context *pipe = id_pipe->pipe;
>
> - pipe->set_scissor_state(pipe,
> - scissor);
> + pipe->set_scissor_states(pipe, start_slot, num_scissors, scissor);
> }
>
> static void
> -identity_set_viewport_state(struct pipe_context *_pipe,
> - const struct pipe_viewport_state *viewport)
> +identity_set_viewport_states(struct pipe_context *_pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *viewport)
> {
> struct identity_context *id_pipe = identity_context(_pipe);
> struct pipe_context *pipe = id_pipe->pipe;
>
> - pipe->set_viewport_state(pipe,
> - viewport);
> + pipe->set_viewport_states(pipe, start_slot, num_viewports, viewport);
> }
>
> static void
> @@ -914,8 +916,8 @@ identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
> id_pipe->base.set_constant_buffer = identity_set_constant_buffer;
> id_pipe->base.set_framebuffer_state = identity_set_framebuffer_state;
> id_pipe->base.set_polygon_stipple = identity_set_polygon_stipple;
> - id_pipe->base.set_scissor_state = identity_set_scissor_state;
> - id_pipe->base.set_viewport_state = identity_set_viewport_state;
> + 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_vertex_buffers = identity_set_vertex_buffers;
> diff --git a/src/gallium/drivers/ilo/ilo_state.c b/src/gallium/drivers/ilo/ilo_state.c
> index 8443a2c..33da429 100644
> --- a/src/gallium/drivers/ilo/ilo_state.c
> +++ b/src/gallium/drivers/ilo/ilo_state.c
> @@ -563,8 +563,10 @@ ilo_set_polygon_stipple(struct pipe_context *pipe,
> }
>
> static void
> -ilo_set_scissor_state(struct pipe_context *pipe,
> - const struct pipe_scissor_state *state)
> +ilo_set_scissor_states(struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state *state)
> {
> struct ilo_context *ilo = ilo_context(pipe);
>
> @@ -574,8 +576,10 @@ ilo_set_scissor_state(struct pipe_context *pipe,
> }
>
> static void
> -ilo_set_viewport_state(struct pipe_context *pipe,
> - const struct pipe_viewport_state *state)
> +ilo_set_viewport_states(struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *state)
> {
> struct ilo_context *ilo = ilo_context(pipe);
>
> @@ -992,8 +996,8 @@ ilo_init_state_functions(struct ilo_context *ilo)
> ilo->base.set_constant_buffer = ilo_set_constant_buffer;
> ilo->base.set_framebuffer_state = ilo_set_framebuffer_state;
> ilo->base.set_polygon_stipple = ilo_set_polygon_stipple;
> - ilo->base.set_scissor_state = ilo_set_scissor_state;
> - ilo->base.set_viewport_state = ilo_set_viewport_state;
> + 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;
> diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
> index 073d751..35630b9 100644
> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
> @@ -230,6 +230,8 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
> return 1;
> case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
> return 0;
> + case PIPE_CAP_MAX_VIEWPORTS:
> + return 1;
> }
> /* should only get here on unhandled cases */
> debug_printf("Unexpected PIPE_CAP %d query\n", param);
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_clip.c b/src/gallium/drivers/llvmpipe/lp_state_clip.c
> index 32ae079..a26c79f 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_clip.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_clip.c
> @@ -44,28 +44,33 @@ llvmpipe_set_clip_state(struct pipe_context *pipe,
>
>
> static void
> -llvmpipe_set_viewport_state(struct pipe_context *pipe,
> - const struct pipe_viewport_state *viewport)
> +llvmpipe_set_viewport_states(struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *viewports)
> {
> struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
>
> /* pass the viewport info to the draw module */
> - draw_set_viewport_state(llvmpipe->draw, viewport);
> + draw_set_viewport_states(llvmpipe->draw, start_slot, num_viewports,
> + viewports);
>
> - llvmpipe->viewport = *viewport; /* struct copy */
> + llvmpipe->viewport = *viewports; /* struct copy */
> llvmpipe->dirty |= LP_NEW_VIEWPORT;
> }
>
>
> static void
> -llvmpipe_set_scissor_state(struct pipe_context *pipe,
> - const struct pipe_scissor_state *scissor)
> +llvmpipe_set_scissor_states(struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state *scissors)
> {
> struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
>
> draw_flush(llvmpipe->draw);
>
> - llvmpipe->scissor = *scissor; /* struct copy */
> + llvmpipe->scissor = *scissors; /* struct copy */
> llvmpipe->dirty |= LP_NEW_SCISSOR;
> }
>
> @@ -89,6 +94,6 @@ llvmpipe_init_clip_funcs(struct llvmpipe_context *llvmpipe)
> {
> llvmpipe->pipe.set_clip_state = llvmpipe_set_clip_state;
> llvmpipe->pipe.set_polygon_stipple = llvmpipe_set_polygon_stipple;
> - llvmpipe->pipe.set_scissor_state = llvmpipe_set_scissor_state;
> - llvmpipe->pipe.set_viewport_state = llvmpipe_set_viewport_state;
> + llvmpipe->pipe.set_scissor_states = llvmpipe_set_scissor_states;
> + llvmpipe->pipe.set_viewport_states = llvmpipe_set_viewport_states;
> }
> diff --git a/src/gallium/drivers/noop/noop_state.c b/src/gallium/drivers/noop/noop_state.c
> index f56ff59..29eeda8 100644
> --- a/src/gallium/drivers/noop/noop_state.c
> +++ b/src/gallium/drivers/noop/noop_state.c
> @@ -152,8 +152,10 @@ static void noop_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask
> {
> }
>
> -static void noop_set_scissor_state(struct pipe_context *ctx,
> - const struct pipe_scissor_state *state)
> +static void noop_set_scissor_states(struct pipe_context *ctx,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state *state)
> {
> }
>
> @@ -162,8 +164,10 @@ static void noop_set_stencil_ref(struct pipe_context *ctx,
> {
> }
>
> -static void noop_set_viewport_state(struct pipe_context *ctx,
> - const struct pipe_viewport_state *state)
> +static void noop_set_viewport_states(struct pipe_context *ctx,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *state)
> {
> }
>
> @@ -311,12 +315,12 @@ void noop_init_state_functions(struct pipe_context *ctx)
> ctx->set_framebuffer_state = noop_set_framebuffer_state;
> ctx->set_polygon_stipple = noop_set_polygon_stipple;
> ctx->set_sample_mask = noop_set_sample_mask;
> - ctx->set_scissor_state = noop_set_scissor_state;
> + ctx->set_scissor_states = noop_set_scissor_states;
> 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_state = noop_set_viewport_state;
> + ctx->set_viewport_states = noop_set_viewport_states;
> ctx->sampler_view_destroy = noop_sampler_view_destroy;
> ctx->surface_destroy = noop_surface_destroy;
> ctx->draw_vbo = noop_draw_vbo;
> diff --git a/src/gallium/drivers/nv30/nv30_draw.c b/src/gallium/drivers/nv30/nv30_draw.c
> index e0a1628..85b4fcd 100644
> --- a/src/gallium/drivers/nv30/nv30_draw.c
> +++ b/src/gallium/drivers/nv30/nv30_draw.c
> @@ -373,7 +373,7 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
> nv30_render_validate(nv30);
>
> if (nv30->draw_dirty & NV30_NEW_VIEWPORT)
> - draw_set_viewport_state(draw, &nv30->viewport);
> + draw_set_viewport_states(draw, 0, 1, &nv30->viewport);
> if (nv30->draw_dirty & NV30_NEW_RASTERIZER)
> draw_set_rasterizer_state(draw, &nv30->rast->pipe, NULL);
> if (nv30->draw_dirty & NV30_NEW_CLIP)
> diff --git a/src/gallium/drivers/nv30/nv30_state.c b/src/gallium/drivers/nv30/nv30_state.c
> index 2a80974..55f2b8c 100644
> --- a/src/gallium/drivers/nv30/nv30_state.c
> +++ b/src/gallium/drivers/nv30/nv30_state.c
> @@ -373,8 +373,10 @@ nv30_set_polygon_stipple(struct pipe_context *pipe,
> }
>
> static void
> -nv30_set_scissor_state(struct pipe_context *pipe,
> - const struct pipe_scissor_state *scissor)
> +nv30_set_scissor_states(struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_scissor_state *scissor)
> {
> struct nv30_context *nv30 = nv30_context(pipe);
>
> @@ -383,8 +385,10 @@ nv30_set_scissor_state(struct pipe_context *pipe,
> }
>
> static void
> -nv30_set_viewport_state(struct pipe_context *pipe,
> - const struct pipe_viewport_state *vpt)
> +nv30_set_viewport_states(struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *vpt)
> {
> struct nv30_context *nv30 = nv30_context(pipe);
>
> @@ -446,8 +450,8 @@ nv30_state_init(struct pipe_context *pipe)
> pipe->set_constant_buffer = nv30_set_constant_buffer;
> pipe->set_framebuffer_state = nv30_set_framebuffer_state;
> pipe->set_polygon_stipple = nv30_set_polygon_stipple;
> - pipe->set_scissor_state = nv30_set_scissor_state;
> - pipe->set_viewport_state = nv30_set_viewport_state;
> + pipe->set_scissor_states = nv30_set_scissor_states;
> + pipe->set_viewport_states = nv30_set_viewport_states;
>
> pipe->set_vertex_buffers = nv30_set_vertex_buffers;
> pipe->set_index_buffer = nv30_set_index_buffer;
> diff --git a/src/gallium/drivers/nv50/nv50_state.c b/src/gallium/drivers/nv50/nv50_state.c
> index ffabf4c..2454a3d 100644
> --- a/src/gallium/drivers/nv50/nv50_state.c
> +++ b/src/gallium/drivers/nv50/nv50_state.c
> @@ -871,8 +871,10 @@ nv50_set_polygon_stipple(struct pipe_context *pipe,
> }
>
> static void
> -nv50_set_scissor_state(struct pipe_context *pipe,
> - const struct pipe_scissor_state *scissor)
> +nv50_set_scissor_states(struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state *scissor)
> {
> struct nv50_context *nv50 = nv50_context(pipe);
>
> @@ -881,8 +883,10 @@ nv50_set_scissor_state(struct pipe_context *pipe,
> }
>
> static void
> -nv50_set_viewport_state(struct pipe_context *pipe,
> - const struct pipe_viewport_state *vpt)
> +nv50_set_viewport_states(struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *vpt)
> {
> struct nv50_context *nv50 = nv50_context(pipe);
>
> @@ -1090,8 +1094,8 @@ nv50_init_state_functions(struct nv50_context *nv50)
> pipe->set_constant_buffer = nv50_set_constant_buffer;
> pipe->set_framebuffer_state = nv50_set_framebuffer_state;
> pipe->set_polygon_stipple = nv50_set_polygon_stipple;
> - pipe->set_scissor_state = nv50_set_scissor_state;
> - pipe->set_viewport_state = nv50_set_viewport_state;
> + pipe->set_scissor_states = nv50_set_scissor_states;
> + pipe->set_viewport_states = nv50_set_viewport_states;
>
> pipe->create_vertex_elements_state = nv50_vertex_state_create;
> pipe->delete_vertex_elements_state = nv50_vertex_state_delete;
> diff --git a/src/gallium/drivers/nvc0/nvc0_state.c b/src/gallium/drivers/nvc0/nvc0_state.c
> index 9adc99c..2f40369 100644
> --- a/src/gallium/drivers/nvc0/nvc0_state.c
> +++ b/src/gallium/drivers/nvc0/nvc0_state.c
> @@ -903,8 +903,10 @@ nvc0_set_polygon_stipple(struct pipe_context *pipe,
> }
>
> static void
> -nvc0_set_scissor_state(struct pipe_context *pipe,
> - const struct pipe_scissor_state *scissor)
> +nvc0_set_scissor_states(struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state *scissor)
> {
> struct nvc0_context *nvc0 = nvc0_context(pipe);
>
> @@ -913,8 +915,10 @@ nvc0_set_scissor_state(struct pipe_context *pipe,
> }
>
> static void
> -nvc0_set_viewport_state(struct pipe_context *pipe,
> - const struct pipe_viewport_state *vpt)
> +nvc0_set_viewport_states(struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *vpt)
> {
> struct nvc0_context *nvc0 = nvc0_context(pipe);
>
> @@ -1223,8 +1227,8 @@ nvc0_init_state_functions(struct nvc0_context *nvc0)
> pipe->set_constant_buffer = nvc0_set_constant_buffer;
> pipe->set_framebuffer_state = nvc0_set_framebuffer_state;
> pipe->set_polygon_stipple = nvc0_set_polygon_stipple;
> - pipe->set_scissor_state = nvc0_set_scissor_state;
> - pipe->set_viewport_state = nvc0_set_viewport_state;
> + pipe->set_scissor_states = nvc0_set_scissor_states;
> + pipe->set_viewport_states = nvc0_set_viewport_states;
>
> pipe->create_vertex_elements_state = nvc0_vertex_state_create;
> pipe->delete_vertex_elements_state = nvc0_vertex_state_delete;
> diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c
> index ba1859b..7647f9e 100644
> --- a/src/gallium/drivers/r300/r300_context.c
> +++ b/src/gallium/drivers/r300/r300_context.c
> @@ -275,7 +275,7 @@ static void r300_init_states(struct pipe_context *pipe)
>
> pipe->set_blend_color(pipe, &bc);
> pipe->set_clip_state(pipe, &cs);
> - pipe->set_scissor_state(pipe, &ss);
> + pipe->set_scissor_states(pipe, 0, 1, &ss);
> pipe->set_sample_mask(pipe, ~0);
>
> /* Initialize the GPU flush. */
> diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
> index 36d510d..6cfc192 100644
> --- a/src/gallium/drivers/r300/r300_state.c
> +++ b/src/gallium/drivers/r300/r300_state.c
> @@ -1722,8 +1722,10 @@ static void r300_set_sample_mask(struct pipe_context *pipe,
> r300_mark_atom_dirty(r300, &r300->sample_mask);
> }
>
> -static void r300_set_scissor_state(struct pipe_context* pipe,
> - const struct pipe_scissor_state* state)
> +static void r300_set_scissor_states(struct pipe_context* pipe,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state* state)
> {
> struct r300_context* r300 = r300_context(pipe);
>
> @@ -1733,8 +1735,10 @@ static void r300_set_scissor_state(struct pipe_context* pipe,
> r300_mark_atom_dirty(r300, &r300->scissor_state);
> }
>
> -static void r300_set_viewport_state(struct pipe_context* pipe,
> - const struct pipe_viewport_state* state)
> +static void r300_set_viewport_states(struct pipe_context* pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state* state)
> {
> struct r300_context* r300 = r300_context(pipe);
> struct r300_viewport_state* viewport =
> @@ -1743,7 +1747,7 @@ static void r300_set_viewport_state(struct pipe_context* pipe,
> r300->viewport = *state;
>
> if (r300->draw) {
> - draw_set_viewport_state(r300->draw, state);
> + draw_set_viewport_states(r300->draw, start_slot, num_viewports, state);
> viewport->vte_control = R300_VTX_XY_FMT | R300_VTX_Z_FMT;
> return;
> }
> @@ -2162,9 +2166,9 @@ void r300_init_state_functions(struct r300_context* r300)
> r300->context.create_sampler_view = r300_create_sampler_view;
> r300->context.sampler_view_destroy = r300_sampler_view_destroy;
>
> - r300->context.set_scissor_state = r300_set_scissor_state;
> + r300->context.set_scissor_states = r300_set_scissor_states;
>
> - r300->context.set_viewport_state = r300_set_viewport_state;
> + r300->context.set_viewport_states = r300_set_viewport_states;
>
> if (r300->screen->caps.has_tcl) {
> r300->context.set_vertex_buffers = r300_set_vertex_buffers_hwtcl;
> diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
> index f49c595..3ebb157 100644
> --- a/src/gallium/drivers/r600/evergreen_state.c
> +++ b/src/gallium/drivers/r600/evergreen_state.c
> @@ -1309,7 +1309,9 @@ static void evergreen_get_scissor_rect(struct r600_context *rctx,
> *br = S_028244_BR_X(br_x) | S_028244_BR_Y(br_y);
> }
>
> -static void evergreen_set_scissor_state(struct pipe_context *ctx,
> +static void evergreen_set_scissor_states(struct pipe_context *ctx,
> + unsigned start_slot,
> + unsigned num_scissors,
> const struct pipe_scissor_state *state)
> {
> struct r600_context *rctx = (struct r600_context *)ctx;
> @@ -3860,7 +3862,7 @@ void evergreen_init_state_functions(struct r600_context *rctx)
> rctx->context.create_sampler_view = evergreen_create_sampler_view;
> rctx->context.set_framebuffer_state = evergreen_set_framebuffer_state;
> rctx->context.set_polygon_stipple = evergreen_set_polygon_stipple;
> - rctx->context.set_scissor_state = evergreen_set_scissor_state;
> + rctx->context.set_scissor_states = evergreen_set_scissor_states;
>
> if (rctx->chip_class == EVERGREEN)
> rctx->context.get_sample_position = evergreen_get_sample_position;
> diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c
> index f0e3675..068d871 100644
> --- a/src/gallium/drivers/r600/r600_state.c
> +++ b/src/gallium/drivers/r600/r600_state.c
> @@ -1215,8 +1215,10 @@ static void r600_emit_scissor_state(struct r600_context *rctx, struct r600_atom
> }
> }
>
> -static void r600_set_scissor_state(struct pipe_context *ctx,
> - const struct pipe_scissor_state *state)
> +static void r600_set_scissor_states(struct pipe_context *ctx,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state *state)
> {
> struct r600_context *rctx = (struct r600_context *)ctx;
>
> @@ -3252,7 +3254,7 @@ void r600_init_state_functions(struct r600_context *rctx)
> rctx->context.create_sampler_view = r600_create_sampler_view;
> rctx->context.set_framebuffer_state = r600_set_framebuffer_state;
> rctx->context.set_polygon_stipple = r600_set_polygon_stipple;
> - rctx->context.set_scissor_state = r600_set_scissor_state;
> + rctx->context.set_scissor_states = r600_set_scissor_states;
>
> rctx->context.get_sample_position = r600_get_sample_position;
> }
> diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
> index fbac576..4995c81 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -660,8 +660,10 @@ static void r600_set_ps_sampler_views(struct pipe_context *ctx, unsigned count,
> r600_set_sampler_views(ctx, PIPE_SHADER_FRAGMENT, 0, count, views);
> }
>
> -static void r600_set_viewport_state(struct pipe_context *ctx,
> - const struct pipe_viewport_state *state)
> +static void r600_set_viewport_states(struct pipe_context *ctx,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *state)
> {
> struct r600_context *rctx = (struct r600_context *)ctx;
>
> @@ -1547,7 +1549,7 @@ void r600_draw_rectangle(struct blitter_context *blitter,
> viewport.translate[1] = 0.0f;
> viewport.translate[2] = 0.0f;
> viewport.translate[3] = 0.0f;
> - rctx->context.set_viewport_state(&rctx->context, &viewport);
> + rctx->context.set_viewport_states(&rctx->context, 0, 1, &viewport);
>
> /* Upload vertices. The hw rectangle has only 3 vertices,
> * I guess the 4th one is derived from the first 3.
> @@ -1750,7 +1752,7 @@ void r600_init_common_state_functions(struct r600_context *rctx)
> rctx->context.set_constant_buffer = r600_set_constant_buffer;
> rctx->context.set_sample_mask = r600_set_sample_mask;
> rctx->context.set_stencil_ref = r600_set_pipe_stencil_ref;
> - rctx->context.set_viewport_state = r600_set_viewport_state;
> + rctx->context.set_viewport_states = r600_set_viewport_states;
> rctx->context.set_vertex_buffers = r600_set_vertex_buffers;
> rctx->context.set_index_buffer = r600_set_index_buffer;
> rctx->context.set_fragment_sampler_views = r600_set_ps_sampler_views;
> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
> index dec535c..01f476a 100644
> --- a/src/gallium/drivers/radeonsi/si_state.c
> +++ b/src/gallium/drivers/radeonsi/si_state.c
> @@ -263,8 +263,10 @@ static void si_set_clip_state(struct pipe_context *ctx,
> si_pm4_set_state(rctx, clip, pm4);
> }
>
> -static void si_set_scissor_state(struct pipe_context *ctx,
> - const struct pipe_scissor_state *state)
> +static void si_set_scissor_states(struct pipe_context *ctx,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state *state)
> {
> struct r600_context *rctx = (struct r600_context *)ctx;
> struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
> @@ -287,8 +289,10 @@ static void si_set_scissor_state(struct pipe_context *ctx,
> si_pm4_set_state(rctx, scissor, pm4);
> }
>
> -static void si_set_viewport_state(struct pipe_context *ctx,
> - const struct pipe_viewport_state *state)
> +static void si_set_viewport_states(struct pipe_context *ctx,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *state)
> {
> struct r600_context *rctx = (struct r600_context *)ctx;
> struct si_state_viewport *viewport = CALLOC_STRUCT(si_state_viewport);
> @@ -2694,8 +2698,8 @@ void si_init_state_functions(struct r600_context *rctx)
> rctx->custom_dsa_flush_inplace = si_create_db_flush_dsa(rctx, false, false);
>
> rctx->context.set_clip_state = si_set_clip_state;
> - rctx->context.set_scissor_state = si_set_scissor_state;
> - rctx->context.set_viewport_state = si_set_viewport_state;
> + rctx->context.set_scissor_states = si_set_scissor_states;
> + rctx->context.set_viewport_states = si_set_viewport_states;
> rctx->context.set_stencil_ref = si_set_pipe_stencil_ref;
>
> rctx->context.set_framebuffer_state = si_set_framebuffer_state;
> diff --git a/src/gallium/drivers/rbug/rbug_context.c b/src/gallium/drivers/rbug/rbug_context.c
> index bf939b9..7214197 100644
> --- a/src/gallium/drivers/rbug/rbug_context.c
> +++ b/src/gallium/drivers/rbug/rbug_context.c
> @@ -693,28 +693,30 @@ rbug_set_polygon_stipple(struct pipe_context *_pipe,
> }
>
> static void
> -rbug_set_scissor_state(struct pipe_context *_pipe,
> - const struct pipe_scissor_state *scissor)
> +rbug_set_scissor_states(struct pipe_context *_pipe,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state *scissor)
> {
> struct rbug_context *rb_pipe = rbug_context(_pipe);
> struct pipe_context *pipe = rb_pipe->pipe;
>
> pipe_mutex_lock(rb_pipe->call_mutex);
> - pipe->set_scissor_state(pipe,
> - scissor);
> + pipe->set_scissor_states(pipe, start_slot, num_scissors, scissor);
> pipe_mutex_unlock(rb_pipe->call_mutex);
> }
>
> static void
> -rbug_set_viewport_state(struct pipe_context *_pipe,
> - const struct pipe_viewport_state *viewport)
> +rbug_set_viewport_states(struct pipe_context *_pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *viewport)
> {
> struct rbug_context *rb_pipe = rbug_context(_pipe);
> struct pipe_context *pipe = rb_pipe->pipe;
>
> pipe_mutex_lock(rb_pipe->call_mutex);
> - pipe->set_viewport_state(pipe,
> - viewport);
> + pipe->set_viewport_states(pipe, start_slot, num_viewports, viewport);
> pipe_mutex_unlock(rb_pipe->call_mutex);
> }
>
> @@ -1171,8 +1173,8 @@ rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
> rb_pipe->base.set_constant_buffer = rbug_set_constant_buffer;
> rb_pipe->base.set_framebuffer_state = rbug_set_framebuffer_state;
> rb_pipe->base.set_polygon_stipple = rbug_set_polygon_stipple;
> - rb_pipe->base.set_scissor_state = rbug_set_scissor_state;
> - rb_pipe->base.set_viewport_state = rbug_set_viewport_state;
> + 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_vertex_buffers = rbug_set_vertex_buffers;
> diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c
> index fe5de17..16311fa 100644
> --- a/src/gallium/drivers/softpipe/sp_screen.c
> +++ b/src/gallium/drivers/softpipe/sp_screen.c
> @@ -182,6 +182,8 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
> case PIPE_CAP_TGSI_TEXCOORD:
> case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
> return 0;
> + case PIPE_CAP_MAX_VIEWPORTS:
> + return 1;
> }
> /* should only get here on unhandled cases */
> debug_printf("Unexpected PIPE_CAP %d query\n", param);
> diff --git a/src/gallium/drivers/softpipe/sp_state_clip.c b/src/gallium/drivers/softpipe/sp_state_clip.c
> index f3a4c23..cd1a195 100644
> --- a/src/gallium/drivers/softpipe/sp_state_clip.c
> +++ b/src/gallium/drivers/softpipe/sp_state_clip.c
> @@ -44,13 +44,16 @@ softpipe_set_clip_state(struct pipe_context *pipe,
>
>
> static void
> -softpipe_set_viewport_state(struct pipe_context *pipe,
> - const struct pipe_viewport_state *viewport)
> +softpipe_set_viewport_states(struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *viewport)
> {
> struct softpipe_context *softpipe = softpipe_context(pipe);
>
> /* pass the viewport info to the draw module */
> - draw_set_viewport_state(softpipe->draw, viewport);
> + draw_set_viewport_states(softpipe->draw, start_slot, num_viewports,
> + viewport);
>
> softpipe->viewport = *viewport; /* struct copy */
> softpipe->dirty |= SP_NEW_VIEWPORT;
> @@ -58,8 +61,10 @@ softpipe_set_viewport_state(struct pipe_context *pipe,
>
>
> static void
> -softpipe_set_scissor_state(struct pipe_context *pipe,
> - const struct pipe_scissor_state *scissor)
> +softpipe_set_scissor_states(struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state *scissor)
> {
> struct softpipe_context *softpipe = softpipe_context(pipe);
>
> @@ -87,7 +92,7 @@ void
> softpipe_init_clip_funcs(struct pipe_context *pipe)
> {
> pipe->set_clip_state = softpipe_set_clip_state;
> - pipe->set_viewport_state = softpipe_set_viewport_state;
> - pipe->set_scissor_state = softpipe_set_scissor_state;
> + pipe->set_viewport_states = softpipe_set_viewport_states;
> + pipe->set_scissor_states = softpipe_set_scissor_states;
> pipe->set_polygon_stipple = softpipe_set_polygon_stipple;
> }
> diff --git a/src/gallium/drivers/svga/svga_pipe_misc.c b/src/gallium/drivers/svga/svga_pipe_misc.c
> index 7884b6d..f1c007b 100644
> --- a/src/gallium/drivers/svga/svga_pipe_misc.c
> +++ b/src/gallium/drivers/svga/svga_pipe_misc.c
> @@ -31,12 +31,14 @@
> #include "svga_surface.h"
>
>
> -static void svga_set_scissor_state( struct pipe_context *pipe,
> - const struct pipe_scissor_state *scissor )
> +static void svga_set_scissor_states( struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state *scissors )
> {
> struct svga_context *svga = svga_context(pipe);
>
> - memcpy( &svga->curr.scissor, scissor, sizeof(*scissor) );
> + memcpy( &svga->curr.scissor, scissors, sizeof(*scissors) );
> svga->dirty |= SVGA_NEW_SCISSOR;
> }
>
> @@ -161,12 +163,14 @@ static void svga_set_clip_state( struct pipe_context *pipe,
> /* Called when driver state tracker notices changes to the viewport
> * matrix:
> */
> -static void svga_set_viewport_state( struct pipe_context *pipe,
> - const struct pipe_viewport_state *viewport )
> +static void svga_set_viewport_states( struct pipe_context *pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *viewports )
> {
> struct svga_context *svga = svga_context(pipe);
>
> - svga->curr.viewport = *viewport; /* struct copy */
> + svga->curr.viewport = *viewports; /* struct copy */
>
> svga->dirty |= SVGA_NEW_VIEWPORT;
> }
> @@ -175,11 +179,11 @@ static void svga_set_viewport_state( struct pipe_context *pipe,
>
> void svga_init_misc_functions( struct svga_context *svga )
> {
> - svga->pipe.set_scissor_state = svga_set_scissor_state;
> + svga->pipe.set_scissor_states = svga_set_scissor_states;
> svga->pipe.set_polygon_stipple = svga_set_polygon_stipple;
> svga->pipe.set_framebuffer_state = svga_set_framebuffer_state;
> svga->pipe.set_clip_state = svga_set_clip_state;
> - svga->pipe.set_viewport_state = svga_set_viewport_state;
> + svga->pipe.set_viewport_states = svga_set_viewport_states;
> }
>
>
> diff --git a/src/gallium/drivers/svga/svga_swtnl_state.c b/src/gallium/drivers/svga/svga_swtnl_state.c
> index dea3a26..d744f18 100644
> --- a/src/gallium/drivers/svga/svga_swtnl_state.c
> +++ b/src/gallium/drivers/svga/svga_swtnl_state.c
> @@ -80,7 +80,7 @@ static void set_draw_viewport( struct svga_context *svga )
> vp.translate[0] += adjx;
> vp.translate[1] += adjy;
>
> - draw_set_viewport_state(svga->swtnl.draw, &vp);
> + draw_set_viewport_states(svga->swtnl.draw, 0, 1, &vp);
> }
>
> static enum pipe_error
> diff --git a/src/gallium/drivers/trace/tr_context.c b/src/gallium/drivers/trace/tr_context.c
> index 962b15e..ee23077 100644
> --- a/src/gallium/drivers/trace/tr_context.c
> +++ b/src/gallium/drivers/trace/tr_context.c
> @@ -765,36 +765,44 @@ trace_context_set_polygon_stipple(struct pipe_context *_pipe,
>
>
> static INLINE void
> -trace_context_set_scissor_state(struct pipe_context *_pipe,
> - const struct pipe_scissor_state *state)
> +trace_context_set_scissor_states(struct pipe_context *_pipe,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state *states)
> {
> struct trace_context *tr_ctx = trace_context(_pipe);
> struct pipe_context *pipe = tr_ctx->pipe;
>
> - trace_dump_call_begin("pipe_context", "set_scissor_state");
> + trace_dump_call_begin("pipe_context", "set_scissor_states");
>
> trace_dump_arg(ptr, pipe);
> - trace_dump_arg(scissor_state, state);
> + trace_dump_arg(uint, start_slot);
> + trace_dump_arg(uint, num_scissors);
> + trace_dump_arg(scissor_state, states);
>
> - pipe->set_scissor_state(pipe, state);
> + pipe->set_scissor_states(pipe, start_slot, num_scissors, states);
>
> trace_dump_call_end();
> }
>
>
> static INLINE void
> -trace_context_set_viewport_state(struct pipe_context *_pipe,
> - const struct pipe_viewport_state *state)
> +trace_context_set_viewport_states(struct pipe_context *_pipe,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *states)
> {
> struct trace_context *tr_ctx = trace_context(_pipe);
> struct pipe_context *pipe = tr_ctx->pipe;
>
> - trace_dump_call_begin("pipe_context", "set_viewport_state");
> + trace_dump_call_begin("pipe_context", "set_viewport_states");
>
> trace_dump_arg(ptr, pipe);
> - trace_dump_arg(viewport_state, state);
> + trace_dump_arg(uint, start_slot);
> + trace_dump_arg(uint, num_viewports);
> + trace_dump_arg(viewport_state, states);
>
> - pipe->set_viewport_state(pipe, state);
> + pipe->set_viewport_states(pipe, start_slot, num_viewports, states);
>
> trace_dump_call_end();
> }
> @@ -1576,8 +1584,8 @@ trace_context_create(struct trace_screen *tr_scr,
> TR_CTX_INIT(set_constant_buffer);
> TR_CTX_INIT(set_framebuffer_state);
> TR_CTX_INIT(set_polygon_stipple);
> - TR_CTX_INIT(set_scissor_state);
> - TR_CTX_INIT(set_viewport_state);
> + 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);
> diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
> index d1130bc..0403d3b 100644
> --- a/src/gallium/include/pipe/p_context.h
> +++ b/src/gallium/include/pipe/p_context.h
> @@ -211,11 +211,15 @@ struct pipe_context {
> void (*set_polygon_stipple)( struct pipe_context *,
> const struct pipe_poly_stipple * );
>
> - void (*set_scissor_state)( struct pipe_context *,
> - const struct pipe_scissor_state * );
> + void (*set_scissor_states)( struct pipe_context *,
> + unsigned start_slot,
> + unsigned num_scissors,
> + const struct pipe_scissor_state * );
>
> - void (*set_viewport_state)( struct pipe_context *,
> - const struct pipe_viewport_state * );
> + void (*set_viewport_states)( struct pipe_context *,
> + unsigned start_slot,
> + unsigned num_viewports,
> + const struct pipe_viewport_state *);
>
> void (*set_fragment_sampler_views)(struct pipe_context *,
> unsigned num_views,
> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
> index bb86968..8af1a84 100644
> --- a/src/gallium/include/pipe/p_defines.h
> +++ b/src/gallium/include/pipe/p_defines.h
> @@ -507,7 +507,8 @@ enum pipe_cap {
> PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER = 80,
> PIPE_CAP_QUERY_PIPELINE_STATISTICS = 81,
> PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK = 82,
> - PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE = 83
> + PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE = 83,
> + PIPE_CAP_MAX_VIEWPORTS = 84
> };
>
> #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
> diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
> index 50de2d3..b33cf1d 100644
> --- a/src/gallium/include/pipe/p_shader_tokens.h
> +++ b/src/gallium/include/pipe/p_shader_tokens.h
> @@ -164,7 +164,8 @@ struct tgsi_declaration_interp
> #define TGSI_SEMANTIC_THREAD_ID 18 /**< block-relative id of the current thread */
> #define TGSI_SEMANTIC_TEXCOORD 19 /**< texture or sprite coordinates */
> #define TGSI_SEMANTIC_PCOORD 20 /**< point sprite coordinate */
> -#define TGSI_SEMANTIC_COUNT 21 /**< number of semantic values */
> +#define TGSI_SEMANTIC_VIEWPORT_INDEX 21 /**< viewport index */
> +#define TGSI_SEMANTIC_COUNT 22 /**< number of semantic values */
>
> struct tgsi_declaration_semantic
> {
> diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
> index 262078d..ff0aac7 100644
> --- a/src/gallium/include/pipe/p_state.h
> +++ b/src/gallium/include/pipe/p_state.h
> @@ -65,6 +65,7 @@ extern "C" {
> #define PIPE_MAX_TEXTURE_LEVELS 16
> #define PIPE_MAX_SO_BUFFERS 4
> #define PIPE_MAX_SO_OUTPUTS 64
> +#define PIPE_MAX_VIEWPORTS 16
>
>
> struct pipe_reference
> diff --git a/src/gallium/tests/graw/fs-test.c b/src/gallium/tests/graw/fs-test.c
> index e59377f..685be92 100644
> --- a/src/gallium/tests/graw/fs-test.c
> +++ b/src/gallium/tests/graw/fs-test.c
> @@ -150,7 +150,7 @@ static void set_viewport( float x, float y,
> vp.translate[2] = half_depth + z;
> vp.translate[3] = 0.0f;
>
> - ctx->set_viewport_state( ctx, &vp );
> + ctx->set_viewport_states( ctx, 0, 1, &vp );
> }
>
> static void set_vertices( void )
> diff --git a/src/gallium/tests/graw/graw_util.h b/src/gallium/tests/graw/graw_util.h
> index febdf44..84456b4 100644
> --- a/src/gallium/tests/graw/graw_util.h
> +++ b/src/gallium/tests/graw/graw_util.h
> @@ -203,7 +203,7 @@ graw_util_viewport(struct graw_info *info,
> vp.translate[2] = half_depth + z;
> vp.translate[3] = 0.0f;
>
> - info->ctx->set_viewport_state(info->ctx, &vp);
> + info->ctx->set_viewport_states(info->ctx, 0, 1, &vp);
> }
>
>
> diff --git a/src/gallium/tests/graw/gs-test.c b/src/gallium/tests/graw/gs-test.c
> index 351a772..e4e4f61 100644
> --- a/src/gallium/tests/graw/gs-test.c
> +++ b/src/gallium/tests/graw/gs-test.c
> @@ -225,7 +225,7 @@ static void set_viewport( float x, float y,
> vp.translate[2] = half_depth + z;
> vp.translate[3] = 0.0f;
>
> - ctx->set_viewport_state( ctx, &vp );
> + ctx->set_viewport_states( ctx, 0, 1, &vp );
> }
>
> static void set_vertices( void )
> diff --git a/src/gallium/tests/graw/quad-sample.c b/src/gallium/tests/graw/quad-sample.c
> index dd2865d..9100272 100644
> --- a/src/gallium/tests/graw/quad-sample.c
> +++ b/src/gallium/tests/graw/quad-sample.c
> @@ -78,7 +78,7 @@ static void set_viewport( float x, float y,
> vp.translate[2] = half_depth + z;
> vp.translate[3] = 0.0f;
>
> - ctx->set_viewport_state( ctx, &vp );
> + ctx->set_viewport_states( ctx, 0, 1, &vp );
> }
>
> static void set_vertices( void )
> diff --git a/src/gallium/tests/graw/shader-leak.c b/src/gallium/tests/graw/shader-leak.c
> index 9c6e0eb..014e0cc 100644
> --- a/src/gallium/tests/graw/shader-leak.c
> +++ b/src/gallium/tests/graw/shader-leak.c
> @@ -68,7 +68,7 @@ static void set_viewport( float x, float y,
> vp.translate[2] = half_depth + z;
> vp.translate[3] = 0.0f;
>
> - ctx->set_viewport_state( ctx, &vp );
> + ctx->set_viewport_states( ctx, 0, 1, &vp );
> }
>
> static void set_vertices( void )
> diff --git a/src/gallium/tests/graw/tri-gs.c b/src/gallium/tests/graw/tri-gs.c
> index 03b5234..535825e 100644
> --- a/src/gallium/tests/graw/tri-gs.c
> +++ b/src/gallium/tests/graw/tri-gs.c
> @@ -69,7 +69,7 @@ static void set_viewport( float x, float y,
> vp.translate[2] = half_depth + z;
> vp.translate[3] = 0.0f;
>
> - ctx->set_viewport_state( ctx, &vp );
> + ctx->set_viewport_states( ctx, 0, 1, &vp );
> }
>
> static void set_vertices( void )
> diff --git a/src/gallium/tests/graw/tri-instanced.c b/src/gallium/tests/graw/tri-instanced.c
> index 901ac86..d00e7e9 100644
> --- a/src/gallium/tests/graw/tri-instanced.c
> +++ b/src/gallium/tests/graw/tri-instanced.c
> @@ -98,7 +98,7 @@ static void set_viewport( float x, float y,
> vp.translate[2] = half_depth + z;
> vp.translate[3] = 0.0f;
>
> - ctx->set_viewport_state( ctx, &vp );
> + ctx->set_viewport_states( ctx, 0, 1, &vp );
> }
>
>
> diff --git a/src/gallium/tests/graw/vs-test.c b/src/gallium/tests/graw/vs-test.c
> index 1ab6732..bfb40be 100644
> --- a/src/gallium/tests/graw/vs-test.c
> +++ b/src/gallium/tests/graw/vs-test.c
> @@ -136,7 +136,7 @@ static void set_viewport( float x, float y,
> vp.translate[2] = half_depth + z;
> vp.translate[3] = 0.0f;
>
> - ctx->set_viewport_state( ctx, &vp );
> + ctx->set_viewport_states( ctx, 0, 1, &vp );
> }
>
> static void set_vertices( void )
> diff --git a/src/mesa/state_tracker/st_atom_scissor.c b/src/mesa/state_tracker/st_atom_scissor.c
> index eb13877..19c2cd2 100644
> --- a/src/mesa/state_tracker/st_atom_scissor.c
> +++ b/src/mesa/state_tracker/st_atom_scissor.c
> @@ -86,7 +86,7 @@ update_scissor( struct st_context *st )
> if (memcmp(&scissor, &st->state.scissor, sizeof(scissor)) != 0) {
> /* state has changed */
> st->state.scissor = scissor; /* struct copy */
> - st->pipe->set_scissor_state(st->pipe, &scissor); /* activate */
> + st->pipe->set_scissor_states(st->pipe, 0, 1, &scissor); /* activate */
> }
> }
>
> diff --git a/src/mesa/state_tracker/st_draw_feedback.c b/src/mesa/state_tracker/st_draw_feedback.c
> index fe66b99..b19d913 100644
> --- a/src/mesa/state_tracker/st_draw_feedback.c
> +++ b/src/mesa/state_tracker/st_draw_feedback.c
> @@ -133,7 +133,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
> * code sends state updates to the pipe, not to our private draw module.
> */
> assert(draw);
> - draw_set_viewport_state(draw, &st->state.viewport);
> + draw_set_viewport_states(draw, 0, 1, &st->state.viewport);
> draw_set_clip_state(draw, &st->state.clip);
> draw_set_rasterizer_state(draw, &st->state.rasterizer, NULL);
> draw_bind_vertex_shader(draw, st->vp_variant->draw_shader);
> --
> 1.7.10.4
More information about the mesa-dev
mailing list