[Mesa-dev] [PATCH 2/4] mesa: add support for GL_EXT_polygon_offset_clamp
Ilia Mirkin
imirkin at alum.mit.edu
Fri Jan 2 11:44:34 PST 2015
On Thu, Jan 1, 2015 at 4:58 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Thu, Jan 1, 2015 at 4:44 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
>> On Wednesday, December 31, 2014 02:38:12 AM Ilia Mirkin wrote:
>>> Nothing enables the extension yet, but the values are now available.
>>> The spec calls for it to only be exposed for GL 3.3+, which is core-only
>>> in mesa. Restrict it as such so that drivers enabling the extension
>>> don't end up accidentally exposing the function in compat contexts.
>>>
>>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>>> ---
>>> src/mesa/drivers/dri/nouveau/nouveau_state.c | 2 +-
>>> src/mesa/drivers/dri/r200/r200_state.c | 2 +-
>>> src/mesa/drivers/dri/radeon/radeon_state.c | 2 +-
>>> src/mesa/main/dd.h | 2 +-
>>> src/mesa/main/extensions.c | 1 +
>>> src/mesa/main/get.c | 1 +
>>> src/mesa/main/get_hash_params.py | 4 ++++
>>> src/mesa/main/mtypes.h | 2 ++
>>> src/mesa/main/polygon.c | 28 ++++++++++++++++++++++++++--
>>> 9 files changed, 38 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/src/mesa/drivers/dri/nouveau/nouveau_state.c b/src/mesa/drivers/dri/nouveau/nouveau_state.c
>>> index db4915f..3aad10e 100644
>>> --- a/src/mesa/drivers/dri/nouveau/nouveau_state.c
>>> +++ b/src/mesa/drivers/dri/nouveau/nouveau_state.c
>>> @@ -319,7 +319,7 @@ nouveau_polygon_mode(struct gl_context *ctx, GLenum face, GLenum mode)
>>> }
>>>
>>> static void
>>> -nouveau_polygon_offset(struct gl_context *ctx, GLfloat factor, GLfloat units)
>>> +nouveau_polygon_offset(struct gl_context *ctx, GLfloat factor, GLfloat units, GLfloat clamp)
>>> {
>>> context_dirty(ctx, POLYGON_OFFSET);
>>> }
>>> diff --git a/src/mesa/drivers/dri/r200/r200_state.c b/src/mesa/drivers/dri/r200/r200_state.c
>>> index 2ad8439..930ead8 100644
>>> --- a/src/mesa/drivers/dri/r200/r200_state.c
>>> +++ b/src/mesa/drivers/dri/r200/r200_state.c
>>> @@ -712,7 +712,7 @@ static void r200ColorMask( struct gl_context *ctx,
>>> */
>>>
>>> static void r200PolygonOffset( struct gl_context *ctx,
>>> - GLfloat factor, GLfloat units )
>>> + GLfloat factor, GLfloat units, GLfloat clamp )
>>> {
>>> r200ContextPtr rmesa = R200_CONTEXT(ctx);
>>> const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
>>> diff --git a/src/mesa/drivers/dri/radeon/radeon_state.c b/src/mesa/drivers/dri/radeon/radeon_state.c
>>> index 0f4d84f..726b06d 100644
>>> --- a/src/mesa/drivers/dri/radeon/radeon_state.c
>>> +++ b/src/mesa/drivers/dri/radeon/radeon_state.c
>>> @@ -520,7 +520,7 @@ static void radeonColorMask( struct gl_context *ctx,
>>> */
>>>
>>> static void radeonPolygonOffset( struct gl_context *ctx,
>>> - GLfloat factor, GLfloat units )
>>> + GLfloat factor, GLfloat units, GLfloat clamp )
>>> {
>>> r100ContextPtr rmesa = R100_CONTEXT(ctx);
>>> const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
>>> diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
>>> index 2f40915..6ba0959 100644
>>> --- a/src/mesa/main/dd.h
>>> +++ b/src/mesa/main/dd.h
>>> @@ -563,7 +563,7 @@ struct dd_function_table {
>>> /** Select a polygon rasterization mode */
>>> void (*PolygonMode)(struct gl_context *ctx, GLenum face, GLenum mode);
>>> /** Set the scale and units used to calculate depth values */
>>> - void (*PolygonOffset)(struct gl_context *ctx, GLfloat factor, GLfloat units);
>>> + void (*PolygonOffset)(struct gl_context *ctx, GLfloat factor, GLfloat units, GLfloat clamp);
>>> /** Set the polygon stippling pattern */
>>> void (*PolygonStipple)(struct gl_context *ctx, const GLubyte *mask );
>>> /* Specifies the current buffer for reading */
>>> diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
>>> index 0df04c2..bffa6b2 100644
>>> --- a/src/mesa/main/extensions.c
>>> +++ b/src/mesa/main/extensions.c
>>> @@ -231,6 +231,7 @@ static const struct extension extension_table[] = {
>>> { "GL_EXT_pixel_buffer_object", o(EXT_pixel_buffer_object), GL, 2004 },
>>> { "GL_EXT_point_parameters", o(EXT_point_parameters), GLL, 1997 },
>>> { "GL_EXT_polygon_offset", o(dummy_true), GLL, 1995 },
>>> + { "GL_EXT_polygon_offset_clamp", o(EXT_polygon_offset_clamp), GLC, 2014 },
>>> { "GL_EXT_provoking_vertex", o(EXT_provoking_vertex), GL, 2009 },
>>> { "GL_EXT_rescale_normal", o(dummy_true), GLL, 1997 },
>>> { "GL_EXT_secondary_color", o(dummy_true), GLL, 1999 },
>>> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
>>> index 6091efc..3f9d745 100644
>>> --- a/src/mesa/main/get.c
>>> +++ b/src/mesa/main/get.c
>>> @@ -392,6 +392,7 @@ EXTRA_EXT2(ARB_transform_feedback3, ARB_gpu_shader5);
>>> EXTRA_EXT(INTEL_performance_query);
>>> EXTRA_EXT(ARB_explicit_uniform_location);
>>> EXTRA_EXT(ARB_clip_control);
>>> +EXTRA_EXT(EXT_polygon_offset_clamp);
>>>
>>> static const int
>>> extra_ARB_color_buffer_float_or_glcore[] = {
>>> diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py
>>> index 09a61ac..299ad24 100644
>>> --- a/src/mesa/main/get_hash_params.py
>>> +++ b/src/mesa/main/get_hash_params.py
>>> @@ -811,6 +811,10 @@ descriptor=[
>>> [ "VIEWPORT_BOUNDS_RANGE", "CONTEXT_FLOAT2(Const.ViewportBounds), extra_ARB_viewport_array" ],
>>> [ "LAYER_PROVOKING_VERTEX", "CONTEXT_ENUM(Light.ProvokingVertex), extra_ARB_viewport_array" ],
>>> [ "VIEWPORT_INDEX_PROVOKING_VERTEX", "CONTEXT_ENUM(Light.ProvokingVertex), extra_ARB_viewport_array" ],
>>> +
>>> +# GL_EXT_polygon_offset_clamp
>>> + [ "POLYGON_OFFSET_CLAMP_EXT", "CONTEXT_FLOAT(Polygon.OffsetUnits), extra_EXT_polygon_offset_clamp" ],
>>> +
>>> ]}
>>>
>>> ]
>>
>> You want CONTEXT_FLOAT(Polygon.OffsetClamp) here, not OffsetUnits.
>>
>> With that fixed, patches 1-3 are:
>> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
>
> Thanks! I actually caught that, and a few other things last night...
> updated patches at https://github.com/imirkin/mesa/commits/master
>
> Things like dispatch_test failing, a missing return in the "is this
> supported" check. (I think that's it.)
>
>>
>> Patch 4 looks fine too, but I haven't verified that every Gallium driver
>> exposing core profile actually has the feature wired up.
>
> grep shows that they all seem to do it... perhaps I missed one.
>
>>
>> There are a couple of existing PolygonOffset piglit tests - perhaps those
>> could be extended to handle this? In the meantime, I dug out some of Intel's
>> tests, hacked both the tests and Mesa to let me run them in core profile,
>> and they all pass. So I suspect this is working fine.
>
> Those tests are way too complex for me to comprehend... I have an idea
> for something relatively simple -- draw a sloped quad, and a flat one
> strictly above it, then use clamps and a high slope factor to control
> whether the sloped quad appears above or below the flat one. That
> seems like it could work, right?
I've posted a piglit test which seems to pass on llvmpipe and nvc0
after a lot of fiddling (still learning how depth works). Haven't
tested it on my SNB yet.
Any opinion on whether I should just get rid of the extension bool and
start it off with dummy_false and then flip it to dummy_true at the
end of the series? Seems like all the core-supporting drivers support
it, and I suspect that will be true long-term. The only driver I'm
aware of that's in any danger of acquiring core context support is
freedreno on a3xx and a4xx. a4xx is a DX11-capable gpu, so should have
it. a3xx is unclear, but it's also pretty far away from core contexts.
There's also a potential counter-argument of making the extension
available in all GL contexts despite the extension text requiring GL
3.3. In that case we definitely need the per-driver enable (and I'd
have to propagate it as a gallium cap). I'm not sure why the extension
text requires GL 3.3 -- perhaps it's as a proxy for "DX10 GPU", in
which case it may make sense to expose it in GL 3.0 compat contexts on
those GPU's...
-ilia
More information about the mesa-dev
mailing list