[Mesa-dev] [PATCH 2/5] mesa: Implement ARB_clip_control.
Brian Paul
brianp at vmware.com
Fri Oct 24 08:00:02 PDT 2014
On 10/24/2014 01:26 AM, Mathias.Froehlich at gmx.net wrote:
> From: Mathias Fröhlich <Mathias.Froehlich at gmx.net>
>
> 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.
>
> Signed-off-by: Mathias Froehlich <Mathias.Froehlich at web.de>
> ---
> 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 | 3 ++
> 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, 158 insertions(+), 7 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/attrib.c b/src/mesa/main/attrib.c
> index d90e662..55ce462 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->Origin, xform->Depth);
> }
> 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..6bd3f26 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.Depth), extra_ARB_clip_control" ],
> + [ "CLIP_ORIGIN", "CONTEXT_ENUM(Transform.Origin), 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..c4f51e2 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -1430,6 +1430,8 @@ struct gl_transform_attrib
> GLboolean RescaleNormals; /**< GL_EXT_rescale_normal */
> GLboolean RasterPositionUnclipped; /**< GL_IBM_rasterpos_clip */
> GLboolean DepthClamp; /**< GL_ARB_depth_clamp */
> + GLenum Origin; /**< GL_ARB_clip_control */
> + GLenum Depth; /**< GL_ARB_clip_control */
Sorry to be pedantic, but I think some better names and comments would
be helpful. How about this:
/** 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 */
This way, the field names echo the GL_CLIP_ORIGIN and GL_CLIP_DEPTH_MODE
names.
The new variables in meta.c could be the same.
Otherwise, the series looks good to me. Thanks for doing this!
-Brian
> };
>
>
> @@ -3698,6 +3700,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..e058ef8 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.Origin == 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..1434dc0 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.Origin = GL_LOWER_LEFT;
> + ctx->Transform.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,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.Origin == origin &&
> + ctx->Transform.Depth == depth)
> + return;
> +
> + FLUSH_VERTICES(ctx, 0);
> +
> + if (ctx->Transform.Origin != origin) {
> + ctx->Transform.Origin = 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.Depth != depth) {
> + ctx->Transform.Depth = 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.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->Transform.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]);
>
More information about the mesa-dev
mailing list