mesa: Add gl_point_attrib::CoordReplaceBits bitfield.
authorMathias Fröhlich <mathias.froehlich@web.de>
Sun, 22 May 2016 12:10:19 +0000 (14:10 +0200)
committerMathias Fröhlich <mathias.froehlich@web.de>
Thu, 16 Jun 2016 03:50:52 +0000 (05:50 +0200)
The aim is to replace the CoordReplace array by
a bitfield. Until all drivers are converted,
establish the bitfield in parallel to the
CoordReplace array.

v2: Fix bitmask logic.

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
src/mesa/main/attrib.c
src/mesa/main/ffvertex_prog.c
src/mesa/main/mtypes.h
src/mesa/main/points.c
src/mesa/main/texenv.c

index 61f703667aa7fa174ffabf75a602561a05af1e61..6f39cb0610ba820fcafef1048cc39977a7edd577 100644 (file)
@@ -1247,7 +1247,7 @@ _mesa_PopAttrib(void)
                   GLuint u;
                   for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
                      _mesa_TexEnvi(GL_POINT_SPRITE_NV, GL_COORD_REPLACE_NV,
-                                   (GLint) point->CoordReplace[u]);
+                                   !!(point->CoordReplaceBits & (1u << u)));
                   }
                   _mesa_set_enable(ctx, GL_POINT_SPRITE_NV,point->PointSprite);
                   if (ctx->Extensions.NV_point_sprite)
index d72bc71aa72392613b83bb1e8ea8f1c0988ee453..adf71dc58d625d53c3cd86430f36a344ac22ea8e 100644 (file)
@@ -243,7 +243,7 @@ static void make_state_key( struct gl_context *ctx, struct state_key *key )
         key->unit[i].texunit_really_enabled = 1;
 
       if (ctx->Point.PointSprite)
-        if (ctx->Point.CoordReplace[i])
+        if (ctx->Point.CoordReplaceBits & (1u << i))
            key->unit[i].coord_replace = 1;
 
       if (ctx->Texture._TexMatEnabled & ENABLE_TEXMAT(i))
index 4d2fdb9f4a0e3b2ef7cdd680e211d3533bdecb93..9aca64510cf8c6358ad918975f70a946016918ea 100644 (file)
@@ -757,6 +757,7 @@ struct gl_point_attrib
    GLboolean _Attenuated;      /**< True if Params != [1, 0, 0] */
    GLboolean PointSprite;      /**< GL_NV/ARB_point_sprite */
    GLboolean CoordReplace[MAX_TEXTURE_COORD_UNITS]; /**< GL_ARB_point_sprite*/
+   GLbitfield CoordReplaceBits; /**< GL_ARB_point_sprite*/
    GLenum SpriteRMode;         /**< GL_NV_point_sprite (only!) */
    GLenum SpriteOrigin;                /**< GL_ARB_point_sprite */
 };
index c2f2b6399cb28efb6ab96970f362b79d94613466..3fbd5d3046b6cf21d297e54cd7efc9e60477d3a0 100644 (file)
@@ -256,4 +256,5 @@ _mesa_init_point(struct gl_context *ctx)
    for (i = 0; i < ARRAY_SIZE(ctx->Point.CoordReplace); i++) {
       ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_ARB/NV_point_sprite */
    }
+   ctx->Point.CoordReplaceBits = 0; /* GL_ARB/NV_point_sprite */
 }
index 93c680650bbbfe2dd168ee73a2dd2e6e8b7c7430..2cf322d1e1a19c194d9427051d9f2e65ce95f9b4 100644 (file)
@@ -460,20 +460,24 @@ _mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param )
         return;
       }
       if (pname == GL_COORD_REPLACE_NV) {
-         if (iparam0 == GL_TRUE || iparam0 == GL_FALSE) {
-            /* It's kind of weird to set point state via glTexEnv,
-             * but that's what the spec calls for.
-             */
-            const GLboolean state = (GLboolean) iparam0;
-            if (ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] == state)
+         /* It's kind of weird to set point state via glTexEnv,
+          * but that's what the spec calls for.
+          */
+         if (iparam0 == GL_TRUE) {
+            if (ctx->Point.CoordReplaceBits & (1u << ctx->Texture.CurrentUnit))
                return;
-            FLUSH_VERTICES(ctx, _NEW_POINT);
-            ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = state;
-         }
-         else {
+            ctx->Point.CoordReplaceBits |= (1u << ctx->Texture.CurrentUnit);
+            ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = GL_TRUE;
+         } else if (iparam0 == GL_FALSE) {
+            if (~(ctx->Point.CoordReplaceBits) & (1u << ctx->Texture.CurrentUnit))
+               return;
+            ctx->Point.CoordReplaceBits &= ~(1u << ctx->Texture.CurrentUnit);
+            ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = GL_FALSE;
+         } else {
             _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0);
             return;
          }
+         FLUSH_VERTICES(ctx, _NEW_POINT);
       }
       else {
          _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname );
@@ -675,7 +679,10 @@ _mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
          return;
       }
       if (pname == GL_COORD_REPLACE_NV) {
-         *params = (GLfloat) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit];
+         if (ctx->Point.CoordReplaceBits & (1u << ctx->Texture.CurrentUnit))
+            *params = 1.0f;
+         else
+            *params = 0.0f;
       }
       else {
          _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
@@ -736,7 +743,10 @@ _mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params )
          return;
       }
       if (pname == GL_COORD_REPLACE_NV) {
-         *params = (GLint) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit];
+         if (ctx->Point.CoordReplaceBits & (1u << ctx->Texture.CurrentUnit))
+            *params = GL_TRUE;
+         else
+            *params = GL_FALSE;
       }
       else {
          _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );