From: Mathias Fröhlich <mathias.froehl...@gmx.net> Implement the mesa parts of ARB_clip_control. So far no driver enables this.
Signed-off-by: Mathias Froehlich <mathias.froehl...@web.de> --- src/mapi/glapi/gen/ARB_clip_control.xml | 25 +++++++++++ src/mapi/glapi/gen/gl_API.xml | 4 +- src/mesa/main/dlist.c | 26 +++++++++++ src/mesa/main/extensions.c | 1 + src/mesa/main/get_hash_params.py | 2 + src/mesa/main/mtypes.h | 12 +++++ src/mesa/main/polygon.c | 5 ++- src/mesa/main/tests/dispatch_sanity.cpp | 3 ++ src/mesa/main/viewport.c | 79 +++++++++++++++++++++++++++++++-- src/mesa/main/viewport.h | 3 ++ 10 files changed, 154 insertions(+), 6 deletions(-) create mode 100644 src/mapi/glapi/gen/ARB_clip_control.xml 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/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_hash_params.py b/src/mesa/main/get_hash_params.py index da35684..ed1f390 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(ClipControl.Depth), NO_EXTRA" ], + [ "CLIP_ORIGIN", "CONTEXT_ENUM(ClipControl.Origin), NO_EXTRA" ], [ "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..be52d4e 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1434,6 +1434,16 @@ struct gl_transform_attrib /** + * Clip control parameters (GL_ARB_clip_control) + */ +struct gl_clip_control +{ + GLenum Origin; + GLenum Depth; +}; + + +/** * Viewport attribute group (GL_VIEWPORT_BIT). */ struct gl_viewport_attrib @@ -3698,6 +3708,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; @@ -4273,6 +4284,7 @@ struct gl_context struct gl_stencil_attrib Stencil; /**< Stencil buffer attributes */ struct gl_texture_attrib Texture; /**< Texture attributes */ struct gl_transform_attrib Transform; /**< Transformation attributes */ + struct gl_clip_control ClipControl; /**< Clip Control (xform) attributes */ struct gl_viewport_attrib ViewportArray[MAX_VIEWPORTS]; /**< Viewport attributes */ /*@}*/ diff --git a/src/mesa/main/polygon.c b/src/mesa/main/polygon.c index 611cef6..bd239bc 100644 --- a/src/mesa/main/polygon.c +++ b/src/mesa/main/polygon.c @@ -104,7 +104,10 @@ _mesa_FrontFace( GLenum mode ) FLUSH_VERTICES(ctx, _NEW_POLYGON); ctx->Polygon.FrontFace = mode; - ctx->Polygon._FrontBit = (GLboolean) (mode == GL_CW); + if (ctx->ClipControl.Origin == GL_LOWER_LEFT) + ctx->Polygon._FrontBit = (GLboolean)(ctx->Polygon.FrontFace == GL_CW); + else + ctx->Polygon._FrontBit = (GLboolean)(ctx->Polygon.FrontFace == GL_CCW); if (ctx->Driver.FrontFace) ctx->Driver.FrontFace( ctx, mode ); 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 89766cf..69107a1 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->ClipControl.Origin = GL_LOWER_LEFT; + ctx->ClipControl.Depth = 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,63 @@ 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; + } + + FLUSH_VERTICES(ctx, 0); + + if (ctx->ClipControl.Origin != origin) { + ctx->ClipControl.Origin = origin; + + if (ctx->ClipControl.Origin == GL_LOWER_LEFT) + ctx->Polygon._FrontBit = (GLboolean)(ctx->Polygon.FrontFace == GL_CW); + else + ctx->Polygon._FrontBit = (GLboolean)(ctx->Polygon.FrontFace == GL_CCW); + + /* 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->ClipControl.Depth != depth) { + ctx->ClipControl.Depth = depth; + + /* Affects the z part of the viewpoint transform. */ + ctx->NewState |= _NEW_VIEWPORT; + + if (ctx->Driver.DepthRange) + ctx->Driver.DepthRange(ctx); + } +} + void _mesa_get_viewport_xform(struct gl_context *ctx, unsigned i, double scale[3], double translate[3]) @@ -437,8 +498,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->ClipControl.Origin == GL_UPPER_LEFT) { + scale[1] = -half_height; + translate[1] = half_height - y; + } else { + scale[1] = half_height; + translate[1] = half_height + y; + } + if (ctx->ClipControl.Depth == 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]); -- 1.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev