On 10/22/2014 11:13 AM, mathias.froehl...@gmx.net wrote:
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;
+};

Under "New State" the spec says the state is part of the xform group, so these fields should be in gl_transform_attrib. Then, they'll get pushed/popped properly by glPush/PopAttrib().


+
+
+/**
   * 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);

I don't think the (GLboolean) casts are needed.



     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);

This is the same code as above. I wonder if this derived state could be recomputed somewhere in state.c

+
+      /* 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]);


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to