I cannot yet see why, but this patch breaks 'make check'. There is a huge pile of link errors in glx-tests.
Run make check every time you build. If this isn't fixed pretty quickly, I'm going to revert the whole series. On 10/24/2014 10:31 AM, Mathias Fröhlich wrote: > Module: Mesa > Branch: master > Commit: 34a3c97fe6d273d68d2ee80386791832824f3211 > URL: > http://cgit.freedesktop.org/mesa/mesa/commit/?id=34a3c97fe6d273d68d2ee80386791832824f3211 > > Author: Mathias Fröhlich <[email protected]> > Date: Sun Sep 21 18:09:22 2014 +0200 > > mesa: Implement ARB_clip_control. > > Implement the mesa parts of ARB_clip_control. > So far no driver enables this. > > v3: > Restrict getting clip control state to the availability > of ARB_clip_control. > Move to transformation state. > Handle clip control state with the GL_TRANSFORM_BIT. > Move _FrontBit update into state.c. > > Reviewed-by: Brian Paul <[email protected]> > Signed-off-by: Mathias Froehlich <[email protected]> > > --- > > src/mapi/glapi/gen/ARB_clip_control.xml | 25 ++++++++++ > src/mapi/glapi/gen/gl_API.xml | 4 +- > src/mesa/main/attrib.c | 1 + > src/mesa/main/dlist.c | 26 +++++++++++ > src/mesa/main/extensions.c | 1 + > src/mesa/main/get.c | 1 + > src/mesa/main/get_hash_params.py | 2 + > src/mesa/main/mtypes.h | 4 ++ > src/mesa/main/polygon.c | 2 - > src/mesa/main/state.c | 16 +++++++ > src/mesa/main/tests/dispatch_sanity.cpp | 3 ++ > src/mesa/main/viewport.c | 78 > +++++++++++++++++++++++++++++-- > src/mesa/main/viewport.h | 3 ++ > 13 files changed, 159 insertions(+), 7 deletions(-) > > diff --git a/src/mapi/glapi/gen/ARB_clip_control.xml > b/src/mapi/glapi/gen/ARB_clip_control.xml > new file mode 100644 > index 0000000..2973a31 > --- /dev/null > +++ b/src/mapi/glapi/gen/ARB_clip_control.xml > @@ -0,0 +1,25 @@ > +<?xml version="1.0"?> > +<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd"> > + > +<OpenGLAPI> > + > +<category name="GL_ARB_clip_control" number="160"> > + > + <enum name="LOWER_LEFT" value = "0x8CA1"/> > + <enum name="UPPER_LEFT" value = "0x8CA2"/> > + > + <enum name="NEGATIVE_ONE_TO_ONE" value = "0x935E"/> > + <enum name="ZERO_TO_ONE" value = "0x935F"/> > + > + <enum name="CLIP_ORIGIN" value = "0x935C"/> > + <enum name="CLIP_DEPTH_MODE" value = "0x935D"/> > + > + <function name="ClipControl" offset="assign"> > + <param name="origin" type="GLenum"/> > + <param name="depth" type="GLenum"/> > + <glx rop="1340"/> > + </function> > + > +</category> > + > +</OpenGLAPI> > diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml > index 73f2f75..534e6a0 100644 > --- a/src/mapi/glapi/gen/gl_API.xml > +++ b/src/mapi/glapi/gen/gl_API.xml > @@ -8364,7 +8364,9 @@ > > <xi:include href="ARB_multi_bind.xml" > xmlns:xi="http://www.w3.org/2001/XInclude"/> > > -<!-- ARB extensions 148 - 160 --> > +<!-- ARB extensions 148 - 159 --> > + > +<xi:include href="ARB_clip_control.xml" > xmlns:xi="http://www.w3.org/2001/XInclude"/> > > <category name="GL_ARB_conditional_render_inverted" number="161"> > <enum name="QUERY_WAIT_INVERTED" value="0x8E17"/> > diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c > index d90e662..5345339 100644 > --- a/src/mesa/main/attrib.c > +++ b/src/mesa/main/attrib.c > @@ -1345,6 +1345,7 @@ _mesa_PopAttrib(void) > if (xform->DepthClamp != ctx->Transform.DepthClamp) > _mesa_set_enable(ctx, GL_DEPTH_CLAMP, > ctx->Transform.DepthClamp); > + _mesa_ClipControl(xform->ClipOrigin, xform->ClipDepthMode); > } > break; > case GL_TEXTURE_BIT: > diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c > index 5c7160d..4b7b060 100644 > --- a/src/mesa/main/dlist.c > +++ b/src/mesa/main/dlist.c > @@ -398,6 +398,9 @@ typedef enum > OPCODE_PROGRAM_UNIFORM_MATRIX34F, > OPCODE_PROGRAM_UNIFORM_MATRIX43F, > > + /* GL_ARB_clip_control */ > + OPCODE_CLIP_CONTROL, > + > /* GL_ARB_color_buffer_float */ > OPCODE_CLAMP_COLOR, > > @@ -7208,6 +7211,22 @@ save_ProgramUniformMatrix4fv(GLuint program, GLint > location, GLsizei count, > } > > static void GLAPIENTRY > +save_ClipControl(GLenum origin, GLenum depth) > +{ > + GET_CURRENT_CONTEXT(ctx); > + Node *n; > + ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); > + n = alloc_instruction(ctx, OPCODE_CLIP_CONTROL, 2); > + if (n) { > + n[1].e = origin; > + n[2].e = depth; > + } > + if (ctx->ExecuteFlag) { > + CALL_ClipControl(ctx->Exec, (origin, depth)); > + } > +} > + > +static void GLAPIENTRY > save_ClampColorARB(GLenum target, GLenum clamp) > { > GET_CURRENT_CONTEXT(ctx); > @@ -8617,6 +8636,10 @@ execute_list(struct gl_context *ctx, GLuint list) > get_pointer(&n[5]))); > break; > > + case OPCODE_CLIP_CONTROL: > + CALL_ClipControl(ctx->Exec, (n[1].e, n[2].e)); > + break; > + > case OPCODE_CLAMP_COLOR: > CALL_ClampColor(ctx->Exec, (n[1].e, n[2].e)); > break; > @@ -9551,6 +9574,9 @@ _mesa_initialize_save_table(const struct gl_context > *ctx) > SET_TexParameterIiv(table, save_TexParameterIiv); > SET_TexParameterIuiv(table, save_TexParameterIuiv); > > + /* GL_ARB_clip_control */ > + SET_ClipControl(table, save_ClipControl); > + > /* GL_ARB_color_buffer_float */ > SET_ClampColor(table, save_ClampColorARB); > > diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c > index f0e2f89..15d66a7 100644 > --- a/src/mesa/main/extensions.c > +++ b/src/mesa/main/extensions.c > @@ -91,6 +91,7 @@ static const struct extension extension_table[] = { > { "GL_ARB_buffer_storage", o(ARB_buffer_storage), > GL, 2013 }, > { "GL_ARB_clear_buffer_object", o(dummy_true), > GL, 2012 }, > { "GL_ARB_clear_texture", o(ARB_clear_texture), > GL, 2013 }, > + { "GL_ARB_clip_control", o(ARB_clip_control), > GL, 2014 }, > { "GL_ARB_color_buffer_float", > o(ARB_color_buffer_float), GL, 2004 }, > { "GL_ARB_compressed_texture_pixel_storage", o(dummy_true), > GL, 2011 }, > { "GL_ARB_compute_shader", o(ARB_compute_shader), > GL, 2012 }, > diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c > index 0e2d8f6..6091efc 100644 > --- a/src/mesa/main/get.c > +++ b/src/mesa/main/get.c > @@ -391,6 +391,7 @@ EXTRA_EXT(ARB_gpu_shader5); > EXTRA_EXT2(ARB_transform_feedback3, ARB_gpu_shader5); > EXTRA_EXT(INTEL_performance_query); > EXTRA_EXT(ARB_explicit_uniform_location); > +EXTRA_EXT(ARB_clip_control); > > 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 da35684..aa9f282 100644 > --- a/src/mesa/main/get_hash_params.py > +++ b/src/mesa/main/get_hash_params.py > @@ -414,6 +414,8 @@ descriptor=[ > [ "AUX_BUFFERS", "BUFFER_INT(Visual.numAuxBuffers), NO_EXTRA" ], > [ "BLUE_BIAS", "CONTEXT_FLOAT(Pixel.BlueBias), NO_EXTRA" ], > [ "BLUE_SCALE", "CONTEXT_FLOAT(Pixel.BlueScale), NO_EXTRA" ], > + [ "CLIP_DEPTH_MODE", "CONTEXT_ENUM(Transform.ClipDepthMode), > extra_ARB_clip_control" ], > + [ "CLIP_ORIGIN", "CONTEXT_ENUM(Transform.ClipOrigin), > extra_ARB_clip_control" ], > [ "CLIENT_ATTRIB_STACK_DEPTH", "CONTEXT_INT(ClientAttribStackDepth), > NO_EXTRA" ], > [ "COLOR_MATERIAL_FACE", "CONTEXT_ENUM(Light.ColorMaterialFace), NO_EXTRA" > ], > [ "COLOR_MATERIAL_PARAMETER", "CONTEXT_ENUM(Light.ColorMaterialMode), > NO_EXTRA" ], > diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h > index 415d302..e1f1f1d 100644 > --- a/src/mesa/main/mtypes.h > +++ b/src/mesa/main/mtypes.h > @@ -1430,6 +1430,9 @@ struct gl_transform_attrib > GLboolean RescaleNormals; /**< GL_EXT_rescale_normal */ > GLboolean RasterPositionUnclipped; /**< GL_IBM_rasterpos_clip */ > GLboolean DepthClamp; /**< GL_ARB_depth_clamp */ > + /** GL_ARB_clip_control */ > + GLenum ClipOrigin; /**< GL_LOWER_LEFT or GL_UPPER_LEFT */ > + GLenum ClipDepthMode; /**< GL_NEGATIVE_ONE_TO_ONE or GL_ZERO_TO_ONE */ > }; > > > @@ -3698,6 +3701,7 @@ struct gl_extensions > GLboolean ARB_blend_func_extended; > GLboolean ARB_buffer_storage; > GLboolean ARB_clear_texture; > + GLboolean ARB_clip_control; > GLboolean ARB_color_buffer_float; > GLboolean ARB_compute_shader; > GLboolean ARB_conditional_render_inverted; > diff --git a/src/mesa/main/polygon.c b/src/mesa/main/polygon.c > index 611cef6..76d6019 100644 > --- a/src/mesa/main/polygon.c > +++ b/src/mesa/main/polygon.c > @@ -104,8 +104,6 @@ _mesa_FrontFace( GLenum mode ) > FLUSH_VERTICES(ctx, _NEW_POLYGON); > ctx->Polygon.FrontFace = mode; > > - ctx->Polygon._FrontBit = (GLboolean) (mode == GL_CW); > - > if (ctx->Driver.FrontFace) > ctx->Driver.FrontFace( ctx, mode ); > } > diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c > index 3dbbfaa..45bce78 100644 > --- a/src/mesa/main/state.c > +++ b/src/mesa/main/state.c > @@ -292,6 +292,19 @@ update_viewport_matrix(struct gl_context *ctx) > > > /** > + * Update the ctx->Polygon._FrontBit flag. > + */ > +static void > +update_frontbit(struct gl_context *ctx) > +{ > + if (ctx->Transform.ClipOrigin == GL_LOWER_LEFT) > + ctx->Polygon._FrontBit = (ctx->Polygon.FrontFace == GL_CW); > + else > + ctx->Polygon._FrontBit = (ctx->Polygon.FrontFace == GL_CCW); > +} > + > + > +/** > * Update derived multisample state. > */ > static void > @@ -373,6 +386,9 @@ _mesa_update_state_locked( struct gl_context *ctx ) > if (new_state & (_NEW_PROGRAM|_NEW_TEXTURE|_NEW_TEXTURE_MATRIX)) > _mesa_update_texture( ctx, new_state ); > > + if (new_state & _NEW_POLYGON) > + update_frontbit( ctx ); > + > if (new_state & _NEW_BUFFERS) > _mesa_update_framebuffer(ctx); > > diff --git a/src/mesa/main/tests/dispatch_sanity.cpp > b/src/mesa/main/tests/dispatch_sanity.cpp > index 04fa86b..03428dd 100644 > --- a/src/mesa/main/tests/dispatch_sanity.cpp > +++ b/src/mesa/main/tests/dispatch_sanity.cpp > @@ -951,6 +951,9 @@ const struct function gl_core_functions_possible[] = { > { "glClearTexImage", 13, -1 }, > { "glClearTexSubImage", 13, -1 }, > > + /* GL_ARB_clip_control */ > + { "glClipControl", 45, -1 }, > + > { NULL, 0, -1 } > }; > > diff --git a/src/mesa/main/viewport.c b/src/mesa/main/viewport.c > index afc813d..d6a9e29 100644 > --- a/src/mesa/main/viewport.c > +++ b/src/mesa/main/viewport.c > @@ -30,6 +30,7 @@ > > > #include "context.h" > +#include "enums.h" > #include "macros.h" > #include "mtypes.h" > #include "viewport.h" > @@ -390,6 +391,9 @@ void _mesa_init_viewport(struct gl_context *ctx) > GLfloat depthMax = 65535.0F; /* sorf of arbitrary */ > unsigned i; > > + ctx->Transform.ClipOrigin = GL_LOWER_LEFT; > + ctx->Transform.ClipDepthMode = GL_NEGATIVE_ONE_TO_ONE; > + > /* Note: ctx->Const.MaxViewports may not have been set by the driver yet, > * so just initialize all of them. > */ > @@ -424,6 +428,62 @@ void _mesa_free_viewport_data(struct gl_context *ctx) > _math_matrix_dtr(&ctx->ViewportArray[i]._WindowMap); > } > > +extern void GLAPIENTRY > +_mesa_ClipControl(GLenum origin, GLenum depth) > +{ > + GET_CURRENT_CONTEXT(ctx); > + > + if (MESA_VERBOSE&VERBOSE_API) > + _mesa_debug(ctx, "glClipControl(%s, %s)\n", > + _mesa_lookup_enum_by_nr(origin), > + _mesa_lookup_enum_by_nr(depth)); > + > + ASSERT_OUTSIDE_BEGIN_END(ctx); > + > + if (!ctx->Extensions.ARB_clip_control) { > + _mesa_error(ctx, GL_INVALID_OPERATION, "glClipControl"); > + return; > + } > + > + if (origin != GL_LOWER_LEFT && origin != GL_UPPER_LEFT) { > + _mesa_error(ctx, GL_INVALID_ENUM, "glClipControl"); > + return; > + } > + > + if (depth != GL_NEGATIVE_ONE_TO_ONE && depth != GL_ZERO_TO_ONE) { > + _mesa_error(ctx, GL_INVALID_ENUM, "glClipControl"); > + return; > + } > + > + if (ctx->Transform.ClipOrigin == origin && > + ctx->Transform.ClipDepthMode == depth) > + return; > + > + FLUSH_VERTICES(ctx, 0); > + > + if (ctx->Transform.ClipOrigin != origin) { > + ctx->Transform.ClipOrigin = origin; > + > + /* Affects the winding order of the front face. */ > + ctx->NewState |= _NEW_POLYGON; > + /* Affects the y component of the viewport transform. */ > + ctx->NewState |= _NEW_VIEWPORT; > + > + if (ctx->Driver.FrontFace) > + ctx->Driver.FrontFace(ctx, ctx->Polygon.FrontFace); > + } > + > + if (ctx->Transform.ClipDepthMode != depth) { > + ctx->Transform.ClipDepthMode = depth; > + > + /* Affects the z part of the viewpoint transform. */ > + ctx->NewState |= _NEW_VIEWPORT; > + > + if (ctx->Driver.DepthRange) > + ctx->Driver.DepthRange(ctx); > + } > +} > + > /** > * Computes the scaling and the translation part of the > * viewport transform matrix of the \param i-th viewport > @@ -442,8 +502,18 @@ _mesa_get_viewport_xform(struct gl_context *ctx, > unsigned i, > > scale[0] = half_width; > translate[0] = half_width + x; > - scale[1] = half_height; > - translate[1] = half_height + y; > - scale[2] = 0.5*(f - n); > - translate[2] = 0.5*(n + f); > + if (ctx->Transform.ClipOrigin == GL_UPPER_LEFT) { > + scale[1] = -half_height; > + translate[1] = half_height - y; > + } else { > + scale[1] = half_height; > + translate[1] = half_height + y; > + } > + if (ctx->Transform.ClipDepthMode == GL_NEGATIVE_ONE_TO_ONE) { > + scale[2] = 0.5*(f - n); > + translate[2] = 0.5*(n + f); > + } else { > + scale[2] = f - n; > + translate[2] = n; > + } > } > diff --git a/src/mesa/main/viewport.h b/src/mesa/main/viewport.h > index 514ff10..426e194 100644 > --- a/src/mesa/main/viewport.h > +++ b/src/mesa/main/viewport.h > @@ -71,6 +71,9 @@ _mesa_init_viewport(struct gl_context *ctx); > extern void > _mesa_free_viewport_data(struct gl_context *ctx); > > +extern void GLAPIENTRY > +_mesa_ClipControl(GLenum origin, GLenum depth); > + > extern void > _mesa_get_viewport_xform(struct gl_context *ctx, unsigned i, > double scale[3], double translate[3]); > > _______________________________________________ > mesa-commit mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/mesa-commit > _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
