[Mesa-dev] [PATCH 1/2] i915: set SPRITE_POINT_ENABLE bit correctly

Eric Anholt eric at anholt.net
Fri Mar 16 10:57:27 PDT 2012


On Mon, 12 Mar 2012 16:04:00 +0800, Yuanhan Liu <yuanhan.liu at linux.intel.com> wrote:
> 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).
> 
> And more,  we currently handle varying inputs as texture 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.
> 
> Thus we do set SPRITE_POINT_ENABLE bit only when all enabled tex
> coord units need do CoordReplace. Or fallback is needed to make
> sure the rendering is right.
> 
> As we need guarantee the CoordReplace changes handled well and
> be able to fallback when finding something wrong, I added another
> function to handle it at intelRunPipepline, where the drawing
> happened here and tnl pipeline hasn't started yet.
> 
> With handling the bit setup at intel_validate_sprite_point_enable(),
> we don't need the relative 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.
> 
> v2: fallback just when all enabled tex coord units need do
>     CoordReplace(Eric).
> 
> Signed-off-by: Yuanhan Liu <yuanhan.liu at linux.intel.com>
> ---
>  src/mesa/drivers/dri/i915/i915_context.h |    1 +
>  src/mesa/drivers/dri/i915/i915_state.c   |   13 +-------
>  src/mesa/drivers/dri/i915/intel_tris.c   |   52 ++++++++++++++++++++++++++++++
>  3 files changed, 54 insertions(+), 12 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i915/i915_context.h b/src/mesa/drivers/dri/i915/i915_context.h
> index 8167137..59eeb6e 100644
> --- a/src/mesa/drivers/dri/i915/i915_context.h
> +++ b/src/mesa/drivers/dri/i915/i915_context.h
> @@ -40,6 +40,7 @@
>  #define I915_FALLBACK_POINT_SMOOTH	 0x80000
>  #define I915_FALLBACK_POINT_SPRITE_COORD_ORIGIN	 0x100000
>  #define I915_FALLBACK_DRAW_OFFSET	 0x200000
> +#define I915_FALLBACK_COORD_REPLACE	 0x400000
>  
>  #define I915_UPLOAD_CTX              0x1
>  #define I915_UPLOAD_BUFFERS          0x2
> diff --git a/src/mesa/drivers/dri/i915/i915_state.c b/src/mesa/drivers/dri/i915/i915_state.c
> index 756001f..3c751e4 100644
> --- a/src/mesa/drivers/dri/i915/i915_state.c
> +++ b/src/mesa/drivers/dri/i915/i915_state.c
> @@ -869,18 +869,7 @@ i915Enable(struct gl_context * ctx, GLenum cap, GLboolean state)
>        break;
>  
>     case GL_POINT_SPRITE:
> -      /* This state change is handled in i915_reduced_primitive_state because
> -       * the hardware bit should only be set when rendering points.
> -       */
> -	 dw = i915->state.Ctx[I915_CTXREG_LIS4];
> -      if (state)
> -	 dw |= S4_SPRITE_POINT_ENABLE;
> -      else
> -	 dw &= ~S4_SPRITE_POINT_ENABLE;
> -      if (dw != i915->state.Ctx[I915_CTXREG_LIS4]) {
> -	 i915->state.Ctx[I915_CTXREG_LIS4] = dw;
> -	 I915_STATECHANGE(i915, I915_UPLOAD_CTX);
> -      }
> +      /* Handle it at intel_validate_sprite_point_enable() */
>        break;
>  
>     case GL_POINT_SMOOTH:
> diff --git a/src/mesa/drivers/dri/i915/intel_tris.c b/src/mesa/drivers/dri/i915/intel_tris.c
> index a36011a..58f6a59 100644
> --- a/src/mesa/drivers/dri/i915/intel_tris.c
> +++ b/src/mesa/drivers/dri/i915/intel_tris.c
> @@ -1052,6 +1052,48 @@ static const GLenum reduced_prim[GL_POLYGON + 1] = {
>     GL_TRIANGLES
>  };
>  
> +static void
> +intel_validate_sprite_point_enable(struct intel_context *intel)
> +{
> +   struct gl_context *ctx = &intel->ctx;
> +   struct i915_fragment_program *p =
> +      (struct i915_fragment_program *) ctx->FragmentProgram._Current;
> +   const GLbitfield64 inputsRead = p->FragProg.Base.InputsRead;
> +   struct i915_context *i915 = i915_context(ctx);
> +   GLuint s4 = i915->state.Ctx[I915_CTXREG_LIS4] & ~S4_VFMT_MASK;
> +   int i;
> +   GLuint coord_replace_bits = 0x0;
> +   GLuint tex_coord_unit_bits = 0x0;
> +
> +   for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
> +      if (ctx->Point.CoordReplace[i] && ctx->Point.PointSprite)
> +         coord_replace_bits |= (1 << i);
> +      if (inputsRead & FRAG_BIT_TEX(i))
> +         tex_coord_unit_bits |= (1 << i);
> +   }

This ignores varyings assigned to texture coordinate inputs.

> +
> +   s4 &= ~S4_SPRITE_POINT_ENABLE;
> +   if (coord_replace_bits) {
> +      if (coord_replace_bits != tex_coord_unit_bits) {
> +         /*
> +          * Here we can't enable the SPRITE_POINT_ENABLE bit due to the
> +          * mis-match of tex_coord_unit_bits and coord_replace_bits, or
> +          * this will make all the other non-point-sprite coords be
> +          * replaced to value (0, 0)-(1, 1).
> +          *
> +          * Thus, a fallback is needed.
> +          */
> +         FALLBACK(intel, I915_FALLBACK_COORD_REPLACE, true);

Here, if you ever fall back for coordinate replacement, you'll never
exit software fallbacks.

>  /**********************************************************************/
>  /*                 High level hooks for t_vb_render.c                 */
> @@ -1070,6 +1112,15 @@ intelRunPipeline(struct gl_context * ctx)
>     if (ctx->NewState)
>        _mesa_update_state_locked(ctx);
>  
> +   /*
> +    * Enable POINT_SPRITE_ENABLE bit when needed here
> +    *
> +    * Handle it at _draw_ time so that we can guarantee the CoordReplace
> +    * changes handled well. And we must do it before the tnl pipeline is
> +    * running so that we can fallback when finding something goes wrong.
> +    */
> +   intel_validate_sprite_point_enable(intel);

Other computed state happens in i915InvalidateState.  Why does this one
go here?  I'm also pretty sure this is also being called on i830.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20120316/73a17dc9/attachment.pgp>


More information about the mesa-dev mailing list