<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 20, 2015 at 7:30 AM,  <span dir="ltr"><<a href="mailto:marius.predut@intel.com" target="_blank">marius.predut@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Marius Predut <<a href="mailto:marius.predut@intel.com">marius.predut@intel.com</a>><br>
<br>
On 32-bit, for floating point operations is used x86 FPU registers instead SSE,<br>
reason for  when reinterprets an integer as a float result is unexpected<br>
(modify floats when they are written to memory).<br>
This fixes <a href="https://bugs.freedesktop.org/show_bug.cgi?id=82668" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=82668</a><br>
<br>
Reviewed-by: Roberts, Neil S<<a href="mailto:neil.s.roberts@intel.com">neil.s.roberts@intel.com</a>><br>
---<br>
 src/mesa/main/context.c       |    2 +-<br>
 src/mesa/main/macros.h        |   29 ++-------------------------<br>
 src/mesa/vbo/vbo_attrib_tmp.h |   43 +++++++++++++++++++++++++++++++++++++----<br>
 src/mesa/vbo/vbo_exec.h       |    3 ++-<br>
 src/mesa/vbo/vbo_exec_api.c   |   25 ++++++++++++------------<br>
 src/mesa/vbo/vbo_exec_eval.c  |   22 ++++++++++++++++-----<br>
 src/mesa/vbo/vbo_save_api.c   |   10 +++++-----<br>
 7 files changed, 78 insertions(+), 56 deletions(-)<br>
<br>
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c<br>
index 400c158..3007491 100644<br>
--- a/src/mesa/main/context.c<br>
+++ b/src/mesa/main/context.c<br>
@@ -656,7 +656,7 @@ _mesa_init_constants(struct gl_constants *consts, gl_api api)<br>
    consts->MaxSamples = 0;<br>
<br>
    /* GLSL default if NativeIntegers == FALSE */<br>
-   consts->UniformBooleanTrue = FLT_AS_UINT(1.0f);<br>
+   consts->UniformBooleanTrue = 1;<br></blockquote><div><br></div><div>This doesn't do what you think it does. FLT_AS_UINT(1.0f) and 1 are very different values.  We need to leave the above alone as it's the uniform value passed in as "true" to uniforms on hardware that can only handle floating-point values.<br><br>I haven't looked very thoroughly at the rest of the patch but I didn't see anything wrong with it either.<br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
    /* GL_ARB_sync */<br>
    consts->MaxServerWaitTimeout = 0x1fff7fffffffULL;<br>
diff --git a/src/mesa/main/macros.h b/src/mesa/main/macros.h<br>
index cd5f2d6..4d245e1 100644<br>
--- a/src/mesa/main/macros.h<br>
+++ b/src/mesa/main/macros.h<br>
@@ -170,27 +170,6 @@ extern GLfloat _mesa_ubyte_to_float_color_tab[256];<br>
        ub = ((GLubyte) F_TO_I((f) * 255.0F))<br>
 #endif<br>
<br>
-static inline GLfloat INT_AS_FLT(GLint i)<br>
-{<br>
-   fi_type tmp;<br>
-   tmp.i = i;<br>
-   return tmp.f;<br>
-}<br>
-<br>
-static inline GLfloat UINT_AS_FLT(GLuint u)<br>
-{<br>
-   fi_type tmp;<br>
-   tmp.u = u;<br>
-   return tmp.f;<br>
-}<br>
-<br>
-static inline unsigned FLT_AS_UINT(float f)<br>
-{<br>
-   fi_type tmp;<br>
-   tmp.f = f;<br>
-   return tmp.u;<br>
-}<br>
-<br>
 /**<br>
  * Convert a floating point value to an unsigned fixed point value.<br>
  *<br>
@@ -625,15 +604,11 @@ COPY_CLEAN_4V_TYPE_AS_FLOAT(GLfloat dst[4], int sz, const GLfloat src[4],<br>
 {<br>
    switch (type) {<br>
    case GL_FLOAT:<br>
-      ASSIGN_4V(dst, 0, 0, 0, 1);<br>
+      ASSIGN_4V(dst, 0.0f, 0.0f, 0.0f, 1.0f);<br>
       break;<br>
    case GL_INT:<br>
-      ASSIGN_4V(dst, INT_AS_FLT(0), INT_AS_FLT(0),<br>
-                     INT_AS_FLT(0), INT_AS_FLT(1));<br>
-      break;<br>
    case GL_UNSIGNED_INT:<br>
-      ASSIGN_4V(dst, UINT_AS_FLT(0), UINT_AS_FLT(0),<br>
-                     UINT_AS_FLT(0), UINT_AS_FLT(1));<br>
+      ASSIGN_4V(dst, 0, 0, 0, 1);<br>
       break;<br>
    default:<br>
       ASSIGN_4V(dst, 0.0f, 0.0f, 0.0f, 1.0f); /* silence warnings */<br>
diff --git a/src/mesa/vbo/vbo_attrib_tmp.h b/src/mesa/vbo/vbo_attrib_tmp.h<br>
index ec66934..a853cb1 100644<br>
--- a/src/mesa/vbo/vbo_attrib_tmp.h<br>
+++ b/src/mesa/vbo/vbo_attrib_tmp.h<br>
@@ -28,6 +28,41 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.<br>
 #include "util/u_format_r11g11b10f.h"<br>
 #include "main/varray.h"<br>
<br>
+#include "program/prog_parameter.h"<br>
+<br>
+<br>
+static union gl_constant_value UINT_AS_UNION(GLuint u)<br>
+{<br>
+   union gl_constant_value tmp;<br>
+   tmp.u = u;<br>
+   return tmp;<br>
+}<br>
+<br>
+static inline union gl_constant_value INT_AS_UNION(GLint i)<br>
+{<br>
+   union gl_constant_value tmp;<br>
+   tmp.i = i;<br>
+   return tmp;<br>
+}<br>
+<br>
+static inline union gl_constant_value FLOAT_AS_UNION(GLfloat f)<br>
+{<br>
+   union gl_constant_value tmp;<br>
+   tmp.f = f;<br>
+   return tmp;<br>
+}<br>
+<br>
+/* ATTR */<br>
+#define ATTR( A, N, T, V0, V1, V2, V3 )          ATTR_##T((A), (N), (T), (V0), (V1), (V2), (V3))<br>
+<br>
+#define ATTR_GL_UNSIGNED_INT( A, N, T, V0, V1, V2, V3 ) \<br>
+    ATTR_UNION(A, N, T, UINT_AS_UNION(V0), UINT_AS_UNION(V1), UINT_AS_UNION(V2), UINT_AS_UNION(V3))<br>
+#define ATTR_GL_INT( A, N, T, V0, V1, V2, V3 ) \<br>
+    ATTR_UNION(A, N, T, INT_AS_UNION(V0), INT_AS_UNION(V1), INT_AS_UNION(V2), INT_AS_UNION(V3))<br>
+#define ATTR_GL_FLOAT( A, N, T, V0, V1, V2, V3 )       \<br>
+    ATTR_UNION(A, N, T, FLOAT_AS_UNION(V0), FLOAT_AS_UNION(V1), FLOAT_AS_UNION(V2), FLOAT_AS_UNION(V3))<br>
+<br>
+<br>
 /* float */<br>
 #define ATTR1FV( A, V ) ATTR( A, 1, GL_FLOAT, (V)[0], 0, 0, 1 )<br>
 #define ATTR2FV( A, V ) ATTR( A, 2, GL_FLOAT, (V)[0], (V)[1], 0, 1 )<br>
@@ -41,8 +76,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.<br>
<br>
 /* int */<br>
 #define ATTRI( A, N, X, Y, Z, W) ATTR( A, N, GL_INT, \<br>
-                                       INT_AS_FLT(X), INT_AS_FLT(Y), \<br>
-                                       INT_AS_FLT(Z), INT_AS_FLT(W) )<br>
+                                       X, Y, \<br>
+                                       Z, W )<br>
<br>
 #define ATTR2IV( A, V ) ATTRI( A, 2, (V)[0], (V)[1], 0, 1 )<br>
 #define ATTR3IV( A, V ) ATTRI( A, 3, (V)[0], (V)[1], (V)[2], 1 )<br>
@@ -56,8 +91,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.<br>
<br>
 /* uint */<br>
 #define ATTRUI( A, N, X, Y, Z, W) ATTR( A, N, GL_UNSIGNED_INT, \<br>
-                                        UINT_AS_FLT(X), UINT_AS_FLT(Y), \<br>
-                                        UINT_AS_FLT(Z), UINT_AS_FLT(W) )<br>
+                                        X, Y, \<br>
+                                        Z, W )<br>
<br>
 #define ATTR2UIV( A, V ) ATTRUI( A, 2, (V)[0], (V)[1], 0, 1 )<br>
 #define ATTR3UIV( A, V ) ATTRUI( A, 3, (V)[0], (V)[1], (V)[2], 1 )<br>
diff --git a/src/mesa/vbo/vbo_exec.h b/src/mesa/vbo/vbo_exec.h<br>
index bb265de..7db6b6b 100644<br>
--- a/src/mesa/vbo/vbo_exec.h<br>
+++ b/src/mesa/vbo/vbo_exec.h<br>
@@ -38,6 +38,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.<br>
 #include "vbo.h"<br>
 #include "vbo_attrib.h"<br>
<br>
+#include "program/prog_parameter.h"<br>
<br>
 /**<br>
  * Max number of primitives (number of glBegin/End pairs) per VBO.<br>
@@ -104,7 +105,7 @@ struct vbo_exec_context<br>
       GLenum attrtype[VBO_ATTRIB_MAX];<br>
       GLubyte active_sz[VBO_ATTRIB_MAX];<br>
<br>
-      GLfloat *attrptr[VBO_ATTRIB_MAX];<br>
+      gl_constant_value *attrptr[VBO_ATTRIB_MAX];<br>
       struct gl_client_array arrays[VERT_ATTRIB_MAX];<br>
<br>
       /* According to program mode, the values above plus current<br>
diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c<br>
index 5f8250e..b6c1055 100644<br>
--- a/src/mesa/vbo/vbo_exec_api.c<br>
+++ b/src/mesa/vbo/vbo_exec_api.c<br>
@@ -46,7 +46,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.<br>
 #include "vbo_context.h"<br>
 #include "vbo_noop.h"<br>
<br>
-<br>
 #ifdef ERROR<br>
 #undef ERROR<br>
 #endif<br>
@@ -163,7 +162,7 @@ static void vbo_exec_copy_to_current( struct vbo_exec_context *exec )<br>
<br>
          COPY_CLEAN_4V_TYPE_AS_FLOAT(tmp,<br>
                                      exec->vtx.attrsz[i],<br>
-                                     exec->vtx.attrptr[i],<br>
+                                     (GLfloat*)exec->vtx.attrptr[i],<br>
                                      exec->vtx.attrtype[i]);<br>
<br>
          if (exec->vtx.attrtype[i] != vbo->currval[i].Type ||<br>
@@ -216,10 +215,10 @@ vbo_exec_copy_from_current(struct vbo_exec_context *exec)<br>
    for (i = VBO_ATTRIB_POS + 1; i < VBO_ATTRIB_MAX; i++) {<br>
       const GLfloat *current = (GLfloat *) vbo->currval[i].Ptr;<br>
       switch (exec->vtx.attrsz[i]) {<br>
-      case 4: exec->vtx.attrptr[i][3] = current[3];<br>
-      case 3: exec->vtx.attrptr[i][2] = current[2];<br>
-      case 2: exec->vtx.attrptr[i][1] = current[1];<br>
-      case 1: exec->vtx.attrptr[i][0] = current[0];<br>
+      case 4: exec->vtx.attrptr[i][3].f = current[3];<br>
+      case 3: exec->vtx.attrptr[i][2].f = current[2];<br>
+      case 2: exec->vtx.attrptr[i][1].f = current[1];<br>
+      case 1: exec->vtx.attrptr[i][0].f = current[0];<br>
         break;<br>
       }<br>
    }<br>
@@ -291,7 +290,7 @@ vbo_exec_wrap_upgrade_vertex(struct vbo_exec_context *exec,<br>
<br>
       for (i = 0 ; i < VBO_ATTRIB_MAX ; i++) {<br>
         if (exec->vtx.attrsz[i]) {<br>
-           exec->vtx.attrptr[i] = tmp;<br>
+           exec->vtx.attrptr[i] = (gl_constant_value*) tmp;<br>
            tmp += exec->vtx.attrsz[i];<br>
         }<br>
         else<br>
@@ -305,8 +304,8 @@ vbo_exec_wrap_upgrade_vertex(struct vbo_exec_context *exec,<br>
    }<br>
    else {<br>
       /* Just have to append the new attribute at the end */<br>
-      exec->vtx.attrptr[attr] = exec->vtx.vertex +<br>
-        exec->vtx.vertex_size - newSize;<br>
+      exec->vtx.attrptr[attr] = (gl_constant_value*)(exec->vtx.vertex +<br>
+        exec->vtx.vertex_size - newSize);<br>
    }<br>
<br>
    /* Replay stored vertices to translate them<br>
@@ -327,7 +326,7 @@ vbo_exec_wrap_upgrade_vertex(struct vbo_exec_context *exec,<br>
<br>
            if (sz) {<br>
               GLint old_offset = old_attrptr[j] - exec->vtx.vertex;<br>
-              GLint new_offset = exec->vtx.attrptr[j] - exec->vtx.vertex;<br>
+              GLint new_offset = (GLfloat*)exec->vtx.attrptr[j] - exec->vtx.vertex;<br>
<br>
               if (j == attr) {<br>
                  if (oldSize) {<br>
@@ -383,7 +382,7 @@ vbo_exec_fixup_vertex(struct gl_context *ctx, GLuint attr, GLuint newSize)<br>
        * zeros.  Don't need to flush or wrap.<br>
        */<br>
       for (i = newSize; i <= exec->vtx.attrsz[attr]; i++)<br>
-        exec->vtx.attrptr[attr][i-1] = id[i-1];<br>
+        exec->vtx.attrptr[attr][i-1].f = id[i-1];<br>
    }<br>
<br>
    exec->vtx.active_sz[attr] = newSize;<br>
@@ -401,7 +400,7 @@ vbo_exec_fixup_vertex(struct gl_context *ctx, GLuint attr, GLuint newSize)<br>
  * This macro is used to implement all the glVertex, glColor, glTexCoord,<br>
  * glVertexAttrib, etc functions.<br>
  */<br>
-#define ATTR( A, N, T, V0, V1, V2, V3 )                                        \<br>
+#define ATTR_UNION( A, N, T, V0, V1, V2, V3 )                                  \<br>
 do {                                                                   \<br>
    struct vbo_exec_context *exec = &vbo_context(ctx)->exec;            \<br>
                                                                        \<br>
@@ -412,7 +411,7 @@ do {                                                                        \<br>
       vbo_exec_fixup_vertex(ctx, A, N);                                        \<br>
                                                                        \<br>
    {                                                                   \<br>
-      GLfloat *dest = exec->vtx.attrptr[A];                            \<br>
+      gl_constant_value *dest = exec->vtx.attrptr[A];                          \<br>
       if (N>0) dest[0] = V0;                                           \<br>
       if (N>1) dest[1] = V1;                                           \<br>
       if (N>2) dest[2] = V2;                                           \<br>
diff --git a/src/mesa/vbo/vbo_exec_eval.c b/src/mesa/vbo/vbo_exec_eval.c<br>
index 82f89b9..670e763 100644<br>
--- a/src/mesa/vbo/vbo_exec_eval.c<br>
+++ b/src/mesa/vbo/vbo_exec_eval.c<br>
@@ -33,6 +33,18 @@<br>
 #include "vbo_exec.h"<br>
<br>
<br>
+/** Copy \p SZ elements into a 4-element vector */<br>
+#define COPY_UNION_SZ_4V(DST, SZ, SRC)  \<br>
+do {                              \<br>
+   switch (SZ) {                  \<br>
+   case 4: (DST)[3].f = (SRC)[3];   \<br>
+   case 3: (DST)[2].f = (SRC)[2];   \<br>
+   case 2: (DST)[1].f = (SRC)[1];   \<br>
+   case 1: (DST)[0].f = (SRC)[0];   \<br>
+   }                              \<br>
+} while(0)<br>
+<br>
+<br>
 static void clear_active_eval1( struct vbo_exec_context *exec, GLuint attr )<br>
 {<br>
    assert(attr < Elements(exec->eval.map1));<br>
@@ -138,9 +150,9 @@ void vbo_exec_do_EvalCoord1f(struct vbo_exec_context *exec, GLfloat u)<br>
                                   exec->eval.map1[attr].sz,<br>
                                   map->Order);<br>
<br>
-        COPY_SZ_4V( exec->vtx.attrptr[attr],<br>
-                    exec->vtx.attrsz[attr],<br>
-                    data );<br>
+        COPY_UNION_SZ_4V( exec->vtx.attrptr[attr],<br>
+             exec->vtx.attrsz[attr],<br>
+             data );<br>
       }<br>
    }<br>
<br>
@@ -186,7 +198,7 @@ void vbo_exec_do_EvalCoord2f( struct vbo_exec_context *exec,<br>
                                  exec->eval.map2[attr].sz,<br>
                                  map->Uorder, map->Vorder);<br>
<br>
-        COPY_SZ_4V( exec->vtx.attrptr[attr],<br>
+        COPY_UNION_SZ_4V( exec->vtx.attrptr[attr],<br>
                     exec->vtx.attrsz[attr],<br>
                     data );<br>
       }<br>
@@ -225,7 +237,7 @@ void vbo_exec_do_EvalCoord2f( struct vbo_exec_context *exec,<br>
          NORMALIZE_3FV(normal);<br>
         normal[3] = 1.0;<br>
<br>
-        COPY_SZ_4V( exec->vtx.attrptr[VBO_ATTRIB_NORMAL],<br>
+        COPY_UNION_SZ_4V( exec->vtx.attrptr[VBO_ATTRIB_NORMAL],<br>
                     exec->vtx.attrsz[VBO_ATTRIB_NORMAL],<br>
                     normal );<br>
<br>
diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c<br>
index 5055c22..2a43f15 100644<br>
--- a/src/mesa/vbo/vbo_save_api.c<br>
+++ b/src/mesa/vbo/vbo_save_api.c<br>
@@ -769,7 +769,7 @@ _save_reset_vertex(struct gl_context *ctx)<br>
  * 3f version won't otherwise set color[3] to 1.0 -- this is the job<br>
  * of the chooser function when switching between Color4f and Color3f.<br>
  */<br>
-#define ATTR(A, N, T, V0, V1, V2, V3)                          \<br>
+#define ATTR_UNION(A, N, T, V0, V1, V2, V3)                            \<br>
 do {                                                           \<br>
    struct vbo_save_context *save = &vbo_context(ctx)->save;    \<br>
                                                                \<br>
@@ -778,10 +778,10 @@ do {                                                              \<br>
                                                                \<br>
    {                                                           \<br>
       GLfloat *dest = save->attrptr[A];                                \<br>
-      if (N>0) dest[0] = V0;                                   \<br>
-      if (N>1) dest[1] = V1;                                   \<br>
-      if (N>2) dest[2] = V2;                                   \<br>
-      if (N>3) dest[3] = V3;                                   \<br>
+      if (N>0) dest[0] = V0.f;                                 \<br>
+      if (N>1) dest[1] = V1.f;                                 \<br>
+      if (N>2) dest[2] = V2.f;                                 \<br>
+      if (N>3) dest[3] = V3.f;                                 \<br>
       save->attrtype[A] = T;                                    \<br>
    }                                                           \<br>
                                                                \<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.9.5<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>