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

Liu Aleaxander aleaxander at gmail.com
Fri Mar 16 19:58:27 PDT 2012


On Sat, Mar 17, 2012 at 1:57 AM, Eric Anholt <eric at anholt.net> wrote:
> 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.

Yes, and I did it on purpose, since we want to check the mis-match
case of coord_replace_bits and tex_coord_unit_bits. You can see the
following comments why I did this.

>
>> +
>> +   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.

Yeah, you are right. Will fix it.

>
>>  /**********************************************************************/
>>  /*                 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?

A nice point. Yeah, I should do the stuff there.

So, how about the following patch

(note: I haven't tested the patch yet since I don't have hardware for
testing at home, but it should work ;)
(send from my gmail account, the format may not good, sorry for that)

---



More information about the mesa-dev mailing list