[Mesa-dev] [v2 1/2] i965: Validate textures before altering driver state

Ian Romanick idr at freedesktop.org
Wed Feb 10 18:39:24 UTC 2016


On 01/28/2016 02:29 PM, Topi Pohjolainen wrote:
> Validation may kick off copies and subsequently color resolves.
> Color resolves (and the copies themselves if ending up in meta path)
> will overwrite the internal driver state but are not prepared to
> restore it. Instead of adding that capability the validation can be
> simply performed before the state is updated.

The problem isn't src/mesa/drivers/common/meta*.  The problem is
brw_meta_* because it directly pokes at driver context state instead of
using higher-level operations, right?

Do we have a test case that encounters this problem?  It seems like this
must have been very difficult to detect, and that worries me.  It's
completely non-obvious that brw_validate_textures will do meta ops.  I
wonder if we could add some sort of flag in debug builds to signal
"doing meta would be bad right now."

Either way, this patch is

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

After it gets a bit of extra soak time on master, we may want to
nominate it for stable.  This clearly fixes a problem, and I don't want
to have to debug an application rendering error that could result from
it. :)

> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> ---
>  src/mesa/drivers/dri/i965/brw_draw.c | 18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
> index 8737c64..c295d91 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw.c
> +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> @@ -420,6 +420,15 @@ brw_try_draw_prims(struct gl_context *ctx,
>     if (ctx->NewState)
>        _mesa_update_state(ctx);
>  
> +   /* We have to validate the textures *before* checking for fallbacks;
> +    * otherwise, the software fallback won't be able to rely on the
> +    * texture state, the firstLevel and lastLevel fields won't be
> +    * set in the intel texture object (they'll both be 0), and the
> +    * software fallback will segfault if it attempts to access any
> +    * texture level other than level 0.
> +    */
> +   brw_validate_textures(brw);
> +
>     /* Find the highest sampler unit used by each shader program.  A bit-count
>      * won't work since ARB programs use the texture unit number as the sampler
>      * index.
> @@ -435,15 +444,6 @@ brw_try_draw_prims(struct gl_context *ctx,
>     brw->vs.base.sampler_count =
>        _mesa_fls(ctx->VertexProgram._Current->Base.SamplersUsed);
>  
> -   /* We have to validate the textures *before* checking for fallbacks;
> -    * otherwise, the software fallback won't be able to rely on the
> -    * texture state, the firstLevel and lastLevel fields won't be
> -    * set in the intel texture object (they'll both be 0), and the
> -    * software fallback will segfault if it attempts to access any
> -    * texture level other than level 0.
> -    */
> -   brw_validate_textures(brw);
> -
>     intel_prepare_render(brw);
>  
>     /* This workaround has to happen outside of brw_upload_render_state()
> 



More information about the mesa-dev mailing list