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

Yuanhan Liu yuanhan.liu at linux.intel.com
Sun Mar 11 19:14:06 PDT 2012


On Fri, Mar 09, 2012 at 10:35:33AM -0800, Eric Anholt wrote:
> On Thu, 8 Mar 2012 19:21:23 +0800, Yuanhan Liu <yuanhan.liu at linux.intel.com> wrote:
> > From ddd1a9d8f0d82c2f5fcb78a471608a005a6a077c Mon Sep 17 00:00:00 2001
> > From: Yuanhan Liu <yuanhan.liu at linux.intel.com>
> > Date: Thu, 8 Mar 2012 18:48:54 +0800
> > Subject: [PATCH] i915: set SPRITE_POINT_ENABLE bit just when we need do coord
> >  replace
> > 
> > When SPRITE_POINT_ENABLE bit is set, the texture coord would be
> > replaced, and this is only needed when we called something like
> > glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE).
> > 
> > Since we currently handling varying inputs as tex coord, we would be
> > careful when setting this bit and set it just when needed, or you will
> > find the value of varying input is not right and changed.
> > 
> > With handling the bit setup at i915ValidateFragmentProgram, we don't
> > need the code at i915Enable then.
> > 
> > This patch would _really_ fix the webglc point-size.html test case and
> > of course, not regress piglit point-sprite and glean-pointSprite testcase.
> > 
> > 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 |    5 +++++
> >  src/mesa/drivers/dri/i915/i915_state.c    |   13 +------------
> >  2 files changed, 6 insertions(+), 12 deletions(-)
> > 
> > diff --git a/src/mesa/drivers/dri/i915/i915_fragprog.c b/src/mesa/drivers/dri/i915/i915_fragprog.c
> > index 5b7e93e..8829e8d 100644
> > --- a/src/mesa/drivers/dri/i915/i915_fragprog.c
> > +++ b/src/mesa/drivers/dri/i915/i915_fragprog.c
> > @@ -1379,7 +1379,12 @@ i915ValidateFragmentProgram(struct i915_context *i915)
> >        EMIT_ATTR(_TNL_ATTRIB_FOG, EMIT_1F, S4_VFMT_FOG_PARAM, 4);
> >     }
> >  
> > +   s4 &= ~S4_SPRITE_POINT_ENABLE;
> >     for (i = 0; i < p->ctx->Const.MaxTextureCoordUnits; i++) {
> > +      /* Do set SPRITE_POINT_ENABLE bit when we need do coord replace */
> > +      if (ctx->Point.CoordReplace[i] && ctx->Point.PointSprite)
> > +         s4 |= S4_SPRITE_POINT_ENABLE;
> > +
> >        if (inputsRead & FRAG_BIT_TEX(i)) {
> >           int sz = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->size;
> 
> I don't think you've done anything to guarantee that this code is called
> when CoordReplace changes.

Yes, you are right. Maybe we can do it at the final _draw_ time, say
i915_reduced_primitive_state?

> 
> A more general problem: you're turning on point sprite if coord replace
> is set on any texcoord.  i915 replaces all texcoords with (0,0)-(1,1)
> when point sprite is enabled, which breaks any non-point-sprite
> coordinates, plus varyings as you noted. 

Well, I guess that's also what the current code do. Since
SPRITE_POINT_ENABLE is just _one_ bit instead of a set of mask bits.

> If you need point sprite
> coordinates and actual texcoords, a fallback should be done.

Yes, agreed acoording to the above state.

> 
> (Well, if we did better compiling, we could route a couple of varyings
> through color/secondarycolor while still getting point sprite
> coordinates on the texcoords)

That's a good hint. But I'd like to do the fallback first. Since I don't
know how many works should be done to get the better compiling.

Thanks,
Yuanhan Liu


More information about the mesa-dev mailing list