[Mesa-dev] Review request: [PATCH] Fix grabbing the wrong variant if glDrawPixels is called

Ilia Mirkin imirkin at alum.mit.edu
Fri Jul 7 16:16:31 UTC 2017


Hi Matias,

You may want to review

https://www.mesa3d.org/submittingpatches.html

Particularly the "mailing patches" bit of it.

Cheers,

  -ilia


On Fri, Jul 7, 2017 at 11:41 AM, Matias N. Goldberg
<dark_sylinc at yahoo.com.ar> wrote:
> Hi!
>
> I just subscribed to this dev list.
>
>
> I wrote this patch (copy at the end of this email)
>
> https://bugs.freedesktop.org/attachment.cgi?id=132462&action=edit
>
> in order to fix bug Bug 101596 - Blender renders black UI elements
> (https://bugs.freedesktop.org/show_bug.cgi?id=101596)
>
> Note that this bug may not only affect Mesa.
>
>
> I am asking for this patch to be reviewed for inclusion in Mesa.
>
>
> Thanks
>
> Matias
>
>
> From 3db888f8645acd5d41b689ee6522d465bcf71044 Mon Sep 17 00:00:00 2001
> Message-Id:
> <3db888f8645acd5d41b689ee6522d465bcf71044.1499274200.git.dark_sylinc at yahoo.com.ar>
> From: "Matias N. Goldberg" <dark_sylinc at yahoo.com.ar>
> Date: Wed, 5 Jul 2017 14:02:50 -0300
> Subject: [PATCH] Fix grabbing the wrong variant if glDrawPixels is called
>
> By design pixel shaders can have up to 3 variants:
> * The standard one.
> * glDrawPixels variant.
> * glBitmap variant.
> However "shader_has_one_variant" ignores this fact, and therefore
> st_update_fp would select the wrong variant if glDrawPixels or glBitmap
> was ever called.
>
> This patch fixes the problem. If the standard variant has been created,
> calling glDrawPixels or glBitmap will append the variant to the second
> entry of the linked list, so that st_update_fp still selects the right
> one if shader_has_one_variant is set.
>
> If the standard variant hasn't been created yet and glDrawPixel/Bitmap
> has been called, st_update_fp will will see this and take the slow path
> instead. The standard variant will then be added at the front of the
> linked list, so that the next time the fast path is taken.
>
> Blender in particular is hit by this bug.
>
> Fixes https://bugs.freedesktop.org/show_bug.cgi?id=101596
> ---
>  src/mesa/state_tracker/st_atom_shader.c |  4 +++-
>  src/mesa/state_tracker/st_program.c     | 23 ++++++++++++++++++++---
>  2 files changed, 23 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_atom_shader.c
> b/src/mesa/state_tracker/st_atom_shader.c
> index c1869d323b..07cf54f555 100644
> --- a/src/mesa/state_tracker/st_atom_shader.c
> +++ b/src/mesa/state_tracker/st_atom_shader.c
> @@ -108,7 +108,9 @@ st_update_fp( struct st_context *st )
>     if (st->shader_has_one_variant[MESA_SHADER_FRAGMENT] &&
>         !stfp->ati_fs && /* ATI_fragment_shader always has multiple variants
> */
>         !stfp->Base.ExternalSamplersUsed && /* external samplers need
> variants */
> -       stfp->variants) {
> +       stfp->variants &&
> +       !stfp->variants->key.drawpixels &&
> +       !stfp->variants->key.bitmap ) {
>        shader = stfp->variants->driver_shader;
>     } else {
>        memset(&key, 0, sizeof(key));
> diff --git a/src/mesa/state_tracker/st_program.c
> b/src/mesa/state_tracker/st_program.c
> index 6de61741dc..86faf5982d 100644
> --- a/src/mesa/state_tracker/st_program.c
> +++ b/src/mesa/state_tracker/st_program.c
> @@ -1322,9 +1322,26 @@ st_get_fp_variant(struct st_context *st,
>        /* create new */
>        fpv = st_create_fp_variant(st, stfp, key);
>        if (fpv) {
> -         /* insert into list */
> -         fpv->next = stfp->variants;
> -         stfp->variants = fpv;
> +         if( key->bitmap || key->drawpixels ) {
> +            /* Regular variants should always come before the
> +               bitmap & drawpixels variants, (unless there
> +               are no regular variants) so that
> +               st_update_fp can take a fast path when
> +               shader_has_one_variant is set.
> +            */
> +            /* insert into list */
> +            if( !stfp->variants ) {
> +               fpv->next = stfp->variants;
> +               stfp->variants = fpv;
> +            } else {
> +               fpv->next = stfp->variants->next;
> +               stfp->variants->next = fpv;
> +            }
> +         } else {
> +            /* insert into list */
> +            fpv->next = stfp->variants;
> +            stfp->variants = fpv;
> +         }
>        }
>     }
>
> --
> 2.11.0
>
>
> IMPORTANT: The information contained in this email may be commercially
> sensitive and/or legally privileged. It is intended solely for the person(s)
> to whom it is addressed. If the reader of this message is not the intended
> recipient, you are on notice of its status and hereby notified that your
> access is unauthorized, and any review, dissemination, distribution,
> disclose or copying of this message including any attachments is strictly
> prohibited. Please notify the sender immediately by reply e-mail and then
> delete this message from your system.
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>


More information about the mesa-dev mailing list