From: Mathias Fröhlich Date: Sun, 22 May 2016 12:10:19 +0000 (+0200) Subject: mesa: Add gl_point_attrib::CoordReplaceBits bitfield. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1c78515d93994e529cb4fd8d009476c90c55365c;p=mesa.git mesa: Add gl_point_attrib::CoordReplaceBits bitfield. 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 Reviewed-by: Ian Romanick Signed-off-by: Mathias Fröhlich --- diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c index 61f703667aa..6f39cb0610b 100644 --- a/src/mesa/main/attrib.c +++ b/src/mesa/main/attrib.c @@ -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) diff --git a/src/mesa/main/ffvertex_prog.c b/src/mesa/main/ffvertex_prog.c index d72bc71aa72..adf71dc58d6 100644 --- a/src/mesa/main/ffvertex_prog.c +++ b/src/mesa/main/ffvertex_prog.c @@ -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)) diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 4d2fdb9f4a0..9aca64510cf 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -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 */ }; diff --git a/src/mesa/main/points.c b/src/mesa/main/points.c index c2f2b6399cb..3fbd5d3046b 100644 --- a/src/mesa/main/points.c +++ b/src/mesa/main/points.c @@ -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 */ } diff --git a/src/mesa/main/texenv.c b/src/mesa/main/texenv.c index 93c680650bb..2cf322d1e1a 100644 --- a/src/mesa/main/texenv.c +++ b/src/mesa/main/texenv.c @@ -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)" );