[Mesa-dev] [PATCH] draw: fix pstipple and aaline stages wrt sampler_views/samplers

Jose Fonseca jfonseca at vmware.com
Thu Dec 17 08:54:21 PST 2015


On 17/12/15 04:59, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> Those stages only really work for OGL-style texturing (so number of samplers
> and views mostly the same, certainly for the max values).
> These get often set up all at once, thus there might be max number of both
> even if all of them are just NULL. We must not set the max number of samplers
> and views to the same value since that will lead to terrible things if a driver
> supports more views than samplers (and the state tracker set up all the views).
> (This will not make these stages magically work if a shader uses dx10-style
> texturing, they might still replace an actually used sview in that case.)
> ---
>   src/gallium/auxiliary/draw/draw_pipe_aaline.c   | 9 +++++----
>   src/gallium/auxiliary/draw/draw_pipe_pstipple.c | 7 ++++---
>   2 files changed, 9 insertions(+), 7 deletions(-)
>
> diff --git a/src/gallium/auxiliary/draw/draw_pipe_aaline.c b/src/gallium/auxiliary/draw/draw_pipe_aaline.c
> index 85d24b7..85ae84c 100644
> --- a/src/gallium/auxiliary/draw/draw_pipe_aaline.c
> +++ b/src/gallium/auxiliary/draw/draw_pipe_aaline.c
> @@ -646,6 +646,7 @@ aaline_first_line(struct draw_stage *stage, struct prim_header *header)
>      struct pipe_context *pipe = draw->pipe;
>      const struct pipe_rasterizer_state *rast = draw->rasterizer;
>      uint num_samplers;
> +   uint num_sampler_views;
>      void *r;
>
>      assert(draw->rasterizer->line_smooth);
> @@ -667,9 +668,9 @@ aaline_first_line(struct draw_stage *stage, struct prim_header *header)
>      draw_aaline_prepare_outputs(draw, draw->pipeline.aaline);
>
>      /* how many samplers? */
> -   /* we'll use sampler/texture[pstip->sampler_unit] for the stipple */
> -   num_samplers = MAX2(aaline->num_sampler_views, aaline->num_samplers);
> -   num_samplers = MAX2(num_samplers, aaline->fs->sampler_unit + 1);
> +   /* we'll use sampler/texture[aaline->sampler_unit] for the alpha texture */
> +   num_samplers = MAX2(aaline->num_samplers, aaline->fs->sampler_unit + 1);
> +   num_sampler_views = MAX2(num_samplers, aaline->num_sampler_views);
>
>      aaline->state.sampler[aaline->fs->sampler_unit] = aaline->sampler_cso;
>      pipe_sampler_view_reference(&aaline->state.sampler_views[aaline->fs->sampler_unit],
> @@ -681,7 +682,7 @@ aaline_first_line(struct draw_stage *stage, struct prim_header *header)
>                                         num_samplers, aaline->state.sampler);
>
>      aaline->driver_set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
> -                                    num_samplers, aaline->state.sampler_views);
> +                                    num_sampler_views, aaline->state.sampler_views);
>
>      /* Disable triangle culling, stippling, unfilled mode etc. */
>      r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade);
> diff --git a/src/gallium/auxiliary/draw/draw_pipe_pstipple.c b/src/gallium/auxiliary/draw/draw_pipe_pstipple.c
> index a51e91f..3bfd414 100644
> --- a/src/gallium/auxiliary/draw/draw_pipe_pstipple.c
> +++ b/src/gallium/auxiliary/draw/draw_pipe_pstipple.c
> @@ -477,6 +477,7 @@ pstip_first_tri(struct draw_stage *stage, struct prim_header *header)
>      struct pipe_context *pipe = pstip->pipe;
>      struct draw_context *draw = stage->draw;
>      uint num_samplers;
> +   uint num_sampler_views;
>
>      assert(stage->draw->rasterizer->poly_stipple_enable);
>
> @@ -490,8 +491,8 @@ pstip_first_tri(struct draw_stage *stage, struct prim_header *header)
>
>      /* how many samplers? */
>      /* we'll use sampler/texture[pstip->sampler_unit] for the stipple */
> -   num_samplers = MAX2(pstip->num_sampler_views, pstip->num_samplers);
> -   num_samplers = MAX2(num_samplers, pstip->fs->sampler_unit + 1);
> +   num_samplers = MAX2(pstip->num_samplers, pstip->fs->sampler_unit + 1);
> +   num_sampler_views = MAX2(pstip->num_sampler_views, num_samplers);
>
>      /* plug in our sampler, texture */
>      pstip->state.samplers[pstip->fs->sampler_unit] = pstip->sampler_cso;
> @@ -506,7 +507,7 @@ pstip_first_tri(struct draw_stage *stage, struct prim_header *header)
>                                        num_samplers, pstip->state.samplers);
>
>      pstip->driver_set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
> -                                   num_samplers, pstip->state.sampler_views);
> +                                   num_sampler_views, pstip->state.sampler_views);
>
>      draw->suspend_flushing = FALSE;
>
>

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>


More information about the mesa-dev mailing list