[Mesa-dev] [PATCH] llvmpipe: warn about illegal use of objects in different contexts

Jose Fonseca jfonseca at vmware.com
Wed Jan 20 07:39:06 PST 2016


On 19/01/16 23:49, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> Doing that is clearly a bug. We can't quite assert as st/mesa may hit this,
> but increase at least visibility of it a bit.
> (For the non-refcounted objects it would be illegal too, but we can't detect
> that unless we'd store the context ourselves. Plus, those don't tend to cause
> random crashes at context or object destruction time... So just sampler views,
> surfaces and so targets for now.)
> ---
>   src/gallium/drivers/llvmpipe/lp_state_sampler.c |  9 +++++++++
>   src/gallium/drivers/llvmpipe/lp_state_so.c      |  9 +++++++++
>   src/gallium/drivers/llvmpipe/lp_state_surface.c | 15 ++++++++++++++-
>   3 files changed, 32 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_sampler.c b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
> index 69af38e..32bf9fd 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_sampler.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
> @@ -129,6 +129,15 @@ llvmpipe_set_sampler_views(struct pipe_context *pipe,
>          */
>         pipe_sampler_view_release(pipe,
>                                   &llvmpipe->sampler_views[shader][start + i]);
> +      /*
> +       * Warn if someone tries to set a view created in a different context
> +       * (which is why we need the hack above in the first place).
> +       * An assert would be better but st/mesa relies on it...
> +       */
> +      if (views[i] && views[i]->context != pipe) {
> +         debug_printf("Illegal setting of sampler_view %d created in another "
> +                      "context\n", i);
> +      }
>         pipe_sampler_view_reference(&llvmpipe->sampler_views[shader][start + i],
>                                     views[i]);
>      }
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_so.c b/src/gallium/drivers/llvmpipe/lp_state_so.c
> index 2af04cd..b2afd6f 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_so.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_so.c
> @@ -70,6 +70,15 @@ llvmpipe_set_so_targets(struct pipe_context *pipe,
>      int i;
>      for (i = 0; i < num_targets; i++) {
>         const boolean append = (offsets[i] == (unsigned)-1);
> +      /*
> +       * Warn if the so target was created in another context.
> +       * XXX Not entirely sure if mesa/st may rely on this?
> +       * Otherwise should just assert.
> +       */
> +      if (targets[i] && targets[i]->context != pipe) {
> +         debug_printf("Illegal setting of so target with target %d created in "
> +                       "another context\n", i);
> +      }
>         pipe_so_target_reference((struct pipe_stream_output_target **)&llvmpipe->so_targets[i], targets[i]);
>         /* If we're not appending then lets set the internal
>            offset to what was requested */
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_surface.c b/src/gallium/drivers/llvmpipe/lp_state_surface.c
> index c879ba9..b20b9c5 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_surface.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_surface.c
> @@ -52,6 +52,7 @@ llvmpipe_set_framebuffer_state(struct pipe_context *pipe,
>      struct llvmpipe_context *lp = llvmpipe_context(pipe);
>
>      boolean changed = !util_framebuffer_state_equal(&lp->framebuffer, fb);
> +   unsigned i;
>
>      assert(fb->width <= LP_MAX_WIDTH);
>      assert(fb->height <= LP_MAX_HEIGHT);
> @@ -66,10 +67,22 @@ llvmpipe_set_framebuffer_state(struct pipe_context *pipe,
>         const struct util_format_description *depth_desc =
>            util_format_description(depth_format);
>
> +      if (lp->framebuffer.zsbuf && lp->framebuffer.zsbuf->context != pipe) {
> +         debug_printf("Illegal setting of fb state with zsbuf created in "
> +                       "another context\n");
> +      }
> +      for (i = 0; i < fb->nr_cbufs; i++) {
> +         if (lp->framebuffer.cbufs[i] &&
> +             lp->framebuffer.cbufs[i]->context != pipe) {
> +            debug_printf("Illegal setting of fb state with cbuf %d created in "
> +                          "another context\n", i);
> +         }
> +      }
> +
>         util_copy_framebuffer_state(&lp->framebuffer, fb);
>
>         if (LP_PERF & PERF_NO_DEPTH) {
> -	 pipe_surface_reference(&lp->framebuffer.zsbuf, NULL);
> +         pipe_surface_reference(&lp->framebuffer.zsbuf, NULL);
>         }
>
>         /*
>

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



More information about the mesa-dev mailing list