Patch sent to mesa-dev. On 10/24/2014 05:21 PM, Ian Romanick wrote: > 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
