[Mesa-dev] [PATCH v2] i965: Fix point size with tessellation/geometry shaders in GLES.
Kenneth Graunke
kenneth at whitecape.org
Fri Jun 3 18:12:18 UTC 2016
On Friday, June 3, 2016 10:13:37 AM PDT Michael Schellenberger Costa wrote:
> Hi Kenneth,
>
> Am 03.06.2016 um 10:08 schrieb Kenneth Graunke:
> > Our previous code worked for desktop GL, and ES without geometry or
> > tessellation shaders. But those features require fancier point size
> > handling. Fortunately, we can use one rule for all APIs.
> >
> > Fixes a number of dEQP tests with EXT_tessellation_shader enabled:
> > dEQP-GLES31.functional.tessellation_geometry_interaction.point_size.*
> >
> > Cc: Ilia Mirkin <imirkin at alum.mit.edu>
> > Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> > ---
> > src/mesa/drivers/dri/i965/brw_state.h | 49 +++++++++++++++++++++++++++++++
> > src/mesa/drivers/dri/i965/gen6_sf_state.c | 5 ++--
> > src/mesa/drivers/dri/i965/gen7_sf_state.c | 7 +++--
> > src/mesa/drivers/dri/i965/gen8_sf_state.c | 7 +++--
> > 4 files changed, 59 insertions(+), 9 deletions(-)
> >
> > Hey Ilia,
> >
> > Thanks for helping me figure out these rules on IRC yesterday.
> > I think this version should work...
> >
> > --Ken
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
> > index 0a4c21f..be7f6ce 100644
> > --- a/src/mesa/drivers/dri/i965/brw_state.h
> > +++ b/src/mesa/drivers/dri/i965/brw_state.h
> > @@ -473,6 +473,55 @@ is_drawing_lines(const struct brw_context *brw)
> > return false;
> > }
> >
> > +static inline bool
> > +use_state_point_size(const struct brw_context *brw)
> > +{
> > + const struct gl_context *ctx = &brw->ctx;
> > +
> > + /* Section 14.4 (Points) of the OpenGL 4.5 specification says:
> > + *
> > + * "If program point size mode is enabled, the derived point size is
> > + * taken from the (potentially clipped) shader built-in gl_PointSize
> > + * written by:
> > + *
> > + * * the geometry shader, if active;
> > + * * the tessellation evaluation shader, if active and no
> > + * geometry shader is active;
> > + * * the vertex shader, otherwise
> > + *
> > + * and clamped to the implementation-dependent point size range. If
> > + * the value written to gl_PointSize is less than or equal to zero,
> > + * or if no value was written to gl_PointSize, results are undefined.
> > + * If program point size mode is disabled, the derived point size is
> > + * specified with the command
> > + *
> > + * void PointSize(float size);
> > + *
> > + * size specifies the requested size of a point. The default value
> > + * is 1.0."
> > + *
> > + * The rules for GLES come from the ES 3.2, OES_geometry_point_size, and
> > + * OES_tessellation_point_size specifications. To summarize: if the last
> > + * stage before rasterization is a GS or TES, then use gl_PointSize from
> > + * the shader if written. Otherwise, use 1.0. If the last stage is a
> > + * vertex shader, use gl_PointSize, or it is undefined.
> > + *
> > + * We can combine these rules into a single condition for both APIs.
> > + * Using the state point size when the last shader stage doesn't write
> > + * gl_PointSize satisfies GL's requirements, as it's undefined. Because
> > + * ES doesn't have a PointSize() command, the state point size will
> > + * remain 1.0, satisfying the ES default value in the GS/TES case, and
> > + * the VS case (1.0 works for "undefined"). Mesa sets the program point
> > + * mode flag to always-enabled in ES, so we can safely check that, and
> > + * it'll be ignored for ES.
> > + *
> > + * _NEW_PROGRAM | _NEW_POINT
> > + * BRW_NEW_VUE_MAP_GEOM_OUT
> > + */
> > + return (!ctx->VertexProgram.PointSizeEnabled && !ctx->Point._Attenuated) ||
> > + (brw->vue_map_geom_out.slots_valid & VARYING_BIT_PSIZ) == 0;
> That last condition looks decidedly weird. Are those brackets correct?
> --Michael
This part?
(brw->vue_map_geom_out.slots_valid & VARYING_BIT_PSIZ) == 0;
That's just saying "Is the PointSize bit not set in the Output Slots
bitfield?" Did you read it as && rather than &? That would certainly
be weird :)
--Ken
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160603/510299da/attachment.sig>
More information about the mesa-dev
mailing list