[Mesa-dev] [PATCH] i915: fallback when point sprite is enabled while handling varying inputs

Yuanhan Liu yuanhan.liu at linux.intel.com
Thu Mar 8 03:21:23 PST 2012


On Thu, Mar 08, 2012 at 02:30:30PM +0800, Yuanhan Liu wrote:
> The current code would use tex coord to implement varying inputs. If
> point sprite is enabled(always enabled in chrome and firefox), the tex
> coord would be replaced with the value (x, y, 0, 1) where x and y vary
> from 0 to 1. Thus you will find that the value of the varying inputs
> doesn't work anymore.
> 
> Why chrome(and firefox) would always enable GL_POINT_SPRITE to enable
> webglc, if you would ask, here is the answer I find from the code of
> chrome at file gpu/command_buffer/service/gles2_cmd_decoder.cc:
> 
>   // OpenGL ES 2.0 implicitly enables the desktop GL capability
>   // VERTEX_PROGRAM_POINT_SIZE and doesn't expose this enum. This fact
>   // isn't well documented; it was discovered in the Khronos OpenGL ES
>   // mailing list archives. It also implicitly enables the desktop GL
>   // capability GL_POINT_SPRITE to provide access to the gl_PointCoord
>   // variable in fragment shaders.
>   if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) {
>     glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
>     glEnable(GL_POINT_SPRITE);
>   }
> 
> So, fallback when point sprite is enabled while handling varying inputs
> before finding a better way to not use tex coord to implement varying
> inputs.
> 
> This would _really_ fix the following webglc case on pineview this time:
> https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/conformance-suites/1.0.1/conformance/rendering/point-size.html
> 
> NOTE: This is a candidate for stable release branches.
> 
> Signed-off-by: Yuanhan Liu <yuanhan.liu at linux.intel.com>
> ---
>  src/mesa/drivers/dri/i915/i915_fragprog.c |   23 ++++++++++++++++++++---
>  1 files changed, 20 insertions(+), 3 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i915/i915_fragprog.c b/src/mesa/drivers/dri/i915/i915_fragprog.c
> index 5b7e93e..c2390fe 100644
> --- a/src/mesa/drivers/dri/i915/i915_fragprog.c
> +++ b/src/mesa/drivers/dri/i915/i915_fragprog.c
> @@ -132,9 +132,26 @@ src_vector(struct i915_fragment_program *p,
>        case FRAG_ATTRIB_VAR0 + 5:
>        case FRAG_ATTRIB_VAR0 + 6:
>        case FRAG_ATTRIB_VAR0 + 7:
> -         src = i915_emit_decl(p, REG_TYPE_T,
> -                              T_TEX0 + (source->Index - FRAG_ATTRIB_VAR0),
> -                              D0_CHANNEL_ALL);
> +         /*
> +          * The current code would use tex coord to implement varying inputs.
> +          * If point sprite is enabled(always enabled in chrome and firefox),
> +          * the tex coord would be replaced with the value (x, y, 0, 1) where
> +          * x and y vary from 0 to 1. Thus you will find that the value of the
> +          * varying inputs doesn't work anymore.
> +          *
> +          * So, fallback when point sprite is enabled.
> +          *
> +          * FIXME: a better way to not use tex coord to add the support of
> +          *        varying inputs?
> +          */
> +         if (p->ctx->Point.PointSprite) {
> +             i915_program_error(p, "Point Sprite is enabled while using "
> +                                   "tex coord to implement varying inputs");
> +         } else {
> +             src = i915_emit_decl(p, REG_TYPE_T,
> +                                  T_TEX0 + (source->Index - FRAG_ATTRIB_VAR0),
> +                                  D0_CHANNEL_ALL);
> +         }


Honestly, I don't like this patch myself: it makes lots of webglc test
case fallback to swrast. Though I somehow understand why you use tex
coord to implement varying inputs. But I still don't figure a better
way to handle varying inputs. 

Then I tried to get rid of such fallback and came the following patch,
which I think is much better than this one.

----


More information about the mesa-dev mailing list