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 <brianp@vmware.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
This commit is contained in:
@@ -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)
|
||||
|
@@ -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))
|
||||
|
@@ -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 */
|
||||
};
|
||||
|
@@ -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 */
|
||||
}
|
||||
|
@@ -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)" );
|
||||
|
Reference in New Issue
Block a user