[Mesa-dev] [PATCH v4] mesa/driconf: rotation of 0-vector

Sergii Romantsov sergii.romantsov at gmail.com
Wed Nov 7 15:18:23 UTC 2018


Specification doesn't define behaviour for rotation of 0-vector.
In https://github.com/KhronosGroup/OpenGL-API/issues/41 said that
behaviour is undefined and agreed that it would be fine for
implementation to do something useful for this.
Windows and Nvidia drivers have a workaround for that.
For compatibility proposed optimized version of computations.
Specification defines a formula of rotation (see "OpenGL 4.6
(Compatibility Profile) - May 14, 2018", paragraph "12.1.1 Matrices").

Optimized formula will look so:

               R = cos(angle) * I

That is equavalent to logic that magnitude of (0,0,0)-vector is 1.0.

-v2: logic moved to _math_matrix_rotate

-v3: general optimization of computations

-v4: added compatible_0vector_rotation option

CC: Tapani Pälli <tapani.palli at intel.com>
CC: Timothy Arceri <tarceri at itsqueeze.com>
CC: Brian Paul <brianp at vmware.com>
Signed-off-by: Sergii Romantsov <sergii.romantsov at globallogic.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100960
Spec: https://github.com/KhronosGroup/OpenGL-API/issues/41
---
 src/mesa/drivers/dri/i915/intel_screen.c |  1 +
 src/mesa/drivers/dri/i965/brw_context.c  |  3 +++
 src/mesa/drivers/dri/i965/intel_screen.c |  1 +
 src/mesa/main/matrix.c                   |  3 ++-
 src/mesa/main/mtypes.h                   |  5 +++++
 src/mesa/math/m_matrix.c                 | 14 +++++++++++++-
 src/mesa/math/m_matrix.h                 |  2 +-
 src/util/xmlpool/t_options.h             |  5 +++++
 8 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c
index 50934c1..49a1c5f 100644
--- a/src/mesa/drivers/dri/i915/intel_screen.c
+++ b/src/mesa/drivers/dri/i915/intel_screen.c
@@ -71,6 +71,7 @@ DRI_CONF_BEGIN
       DRI_CONF_FORCE_GLSL_EXTENSIONS_WARN("false")
       DRI_CONF_DISABLE_GLSL_LINE_CONTINUATIONS("false")
       DRI_CONF_DISABLE_BLEND_FUNC_EXTENDED("false")
+      DRI_CONF_COMPATIBLE_0VECTOR_ROTATION("false")
 
       DRI_CONF_OPT_BEGIN_B(stub_occlusion_query, "false")
 	 DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.")
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
index 6ba64e4..ca50364 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -890,6 +890,9 @@ brw_process_driconf_options(struct brw_context *brw)
    ctx->Const.AllowGLSLCrossStageInterpolationMismatch =
       driQueryOptionb(options, "allow_glsl_cross_stage_interpolation_mismatch");
 
+   ctx->Const.Compatible0VectorRotation =
+      driQueryOptionb(options, "compatible_0vector_rotation");
+
    ctx->Const.dri_config_options_sha1 = ralloc_array(brw, unsigned char, 20);
    driComputeOptionsSha1(&brw->screen->optionCache,
                          ctx->Const.dri_config_options_sha1);
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index c57fb54..67938b6 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -87,6 +87,7 @@ DRI_CONF_BEGIN
       DRI_CONF_ALLOW_GLSL_CROSS_STAGE_INTERPOLATION_MISMATCH("false")
       DRI_CONF_ALLOW_HIGHER_COMPAT_VERSION("false")
       DRI_CONF_FORCE_GLSL_ABS_SQRT("false")
+      DRI_CONF_COMPATIBLE_0VECTOR_ROTATION("false")
 
       DRI_CONF_OPT_BEGIN_B(shader_precompile, "true")
 	 DRI_CONF_DESC(en, "Perform code generation at shader link time.")
diff --git a/src/mesa/main/matrix.c b/src/mesa/main/matrix.c
index 8065a83..28537a5 100644
--- a/src/mesa/main/matrix.c
+++ b/src/mesa/main/matrix.c
@@ -415,7 +415,8 @@ _mesa_Rotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z )
 
    FLUSH_VERTICES(ctx, 0);
    if (angle != 0.0F) {
-      _math_matrix_rotate( ctx->CurrentStack->Top, angle, x, y, z);
+      _math_matrix_rotate( ctx->CurrentStack->Top, angle, x, y, z,
+                           ctx->Const.Compatible0VectorRotation );
       ctx->NewState |= ctx->CurrentStack->DirtyFlag;
    }
 }
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 9ed49b7..e9cbcf1 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -3789,6 +3789,11 @@ struct gl_constants
    GLboolean AllowLayoutQualifiersOnFunctionParameters;
 
    /**
+    * Allow compatible to Windows and Nvidia logic of 0-vector rotation.
+    */
+   GLboolean Compatible0VectorRotation;
+
+   /**
     * Force computing the absolute value for sqrt() and inversesqrt() to follow
     * D3D9 when apps rely on this behaviour.
     */
diff --git a/src/mesa/math/m_matrix.c b/src/mesa/math/m_matrix.c
index 57a4953..8ff7b11 100644
--- a/src/mesa/math/m_matrix.c
+++ b/src/mesa/math/m_matrix.c
@@ -794,7 +794,7 @@ static GLboolean matrix_invert( GLmatrix *mat )
  */
 void
 _math_matrix_rotate( GLmatrix *mat,
-		     GLfloat angle, GLfloat x, GLfloat y, GLfloat z )
+		     GLfloat angle, GLfloat x, GLfloat y, GLfloat z, GLboolean process_zeros )
 {
    GLfloat xx, yy, zz, xy, yz, zx, xs, ys, zs, one_c, s, c;
    GLfloat m[16];
@@ -824,6 +824,18 @@ _math_matrix_rotate( GLmatrix *mat,
                M(1,0) = s;
             }
          }
+         else if (process_zeros) {
+            /* https://bugs.freedesktop.org/show_bug.cgi?id=100960
+             * https://github.com/KhronosGroup/OpenGL-API/issues/41
+             * Here we will treat magnitude as 1.0 if it really 0.0.
+             * So that is kind of workaround for empty-vectors to have
+             * compatibility with Windows and Nvidia drivers.
+             */
+            optimized = GL_TRUE;
+            M(0,0) = c;
+            M(1,1) = c;
+            M(2,2) = c;
+         }
       }
       else if (z == 0.0F) {
          optimized = GL_TRUE;
diff --git a/src/mesa/math/m_matrix.h b/src/mesa/math/m_matrix.h
index c34d9e3..44459a6 100644
--- a/src/mesa/math/m_matrix.h
+++ b/src/mesa/math/m_matrix.h
@@ -104,7 +104,7 @@ _math_matrix_translate( GLmatrix *mat, GLfloat x, GLfloat y, GLfloat z );
 
 extern void
 _math_matrix_rotate( GLmatrix *m, GLfloat angle,
-		     GLfloat x, GLfloat y, GLfloat z );
+		     GLfloat x, GLfloat y, GLfloat z, GLboolean process_zeros );
 
 extern void
 _math_matrix_scale( GLmatrix *mat, GLfloat x, GLfloat y, GLfloat z );
diff --git a/src/util/xmlpool/t_options.h b/src/util/xmlpool/t_options.h
index e0a30f5..3bc5495 100644
--- a/src/util/xmlpool/t_options.h
+++ b/src/util/xmlpool/t_options.h
@@ -145,6 +145,11 @@ DRI_CONF_OPT_BEGIN_B(force_compat_profile, def) \
         DRI_CONF_DESC(en,gettext("Force an OpenGL compatibility context")) \
 DRI_CONF_OPT_END
 
+#define DRI_CONF_COMPATIBLE_0VECTOR_ROTATION(def) \
+DRI_CONF_OPT_BEGIN_B(compatible_0vector_rotation, def) \
+        DRI_CONF_DESC(en,gettext("Allow compatible to Windows and Nvidia logic of 0-vector rotation")) \
+DRI_CONF_OPT_END
+
 /**
  * \brief Image quality-related options
  */
-- 
2.7.4



More information about the mesa-dev mailing list