mesa: new _mesa_is_pow_two() function

This commit is contained in:
Brian
2008-11-10 20:15:28 -07:00
parent 8df4f6667f
commit be1b8e5d6c
5 changed files with 33 additions and 23 deletions

View File

@@ -383,7 +383,7 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
return; return;
} }
if (width < 0 || (width != 0 && _mesa_bitcount(width) != 1)) { if (width < 0 || (width != 0 && !_mesa_is_pow_two(width))) {
/* error */ /* error */
if (proxy) { if (proxy) {
table->Size = 0; table->Size = 0;

View File

@@ -955,7 +955,7 @@ _mesa_Histogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean s
} }
} }
if (width != 0 && _mesa_bitcount(width) != 1) { if (width != 0 && !_mesa_is_pow_two(width)) {
if (target == GL_PROXY_HISTOGRAM) { if (target == GL_PROXY_HISTOGRAM) {
error = GL_TRUE; error = GL_TRUE;
} }

View File

@@ -462,6 +462,16 @@ static INLINE int iceil(float f)
#endif #endif
/**
* Is x a power of two?
*/
static INLINE int
_mesa_is_pow_two(int x)
{
return !(x & (x - 1));
}
/*** /***
*** UNCLAMPED_FLOAT_TO_UBYTE: clamp float to [0,1] and map to ubyte in [0,255] *** UNCLAMPED_FLOAT_TO_UBYTE: clamp float to [0,1] and map to ubyte in [0,255]
*** CLAMPED_FLOAT_TO_UBYTE: map float known to be in [0,1] to ubyte in [0,255] *** CLAMPED_FLOAT_TO_UBYTE: map float known to be in [0,1] to ubyte in [0,255]

View File

@@ -150,7 +150,7 @@ _mesa_PixelMapfv( GLenum map, GLsizei mapsize, const GLfloat *values )
if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) { if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) {
/* test that mapsize is a power of two */ /* test that mapsize is a power of two */
if (_mesa_bitcount((GLuint) mapsize) != 1) { if (!_mesa_is_pow_two(mapsize)) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" ); _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
return; return;
} }
@@ -209,7 +209,7 @@ _mesa_PixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values )
if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) { if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) {
/* test that mapsize is a power of two */ /* test that mapsize is a power of two */
if (_mesa_bitcount((GLuint) mapsize) != 1) { if (!_mesa_is_pow_two(mapsize)) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapuiv(mapsize)" ); _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapuiv(mapsize)" );
return; return;
} }
@@ -282,7 +282,7 @@ _mesa_PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values )
if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) { if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) {
/* test that mapsize is a power of two */ /* test that mapsize is a power of two */
if (_mesa_bitcount((GLuint) mapsize) != 1) { if (!_mesa_is_pow_two(mapsize)) {
_mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapuiv(mapsize)" ); _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapuiv(mapsize)" );
return; return;
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Mesa 3-D graphics library * mesa 3-D graphics library
* Version: 7.1 * Version: 7.1
* *
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved. * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
@@ -1233,9 +1233,9 @@ _mesa_init_teximage_fields(GLcontext *ctx, GLenum target,
img->IsCompressed = GL_FALSE; img->IsCompressed = GL_FALSE;
img->CompressedSize = 0; img->CompressedSize = 0;
if ((width == 1 || _mesa_bitcount(img->Width2) == 1) && if ((width == 1 || _mesa_is_pow_two(img->Width2)) &&
(height == 1 || _mesa_bitcount(img->Height2) == 1) && (height == 1 || _mesa_is_pow_two(img->Height2)) &&
(depth == 1 || _mesa_bitcount(img->Depth2) == 1)) (depth == 1 || _mesa_is_pow_two(img->Depth2)))
img->_IsPowerOfTwo = GL_TRUE; img->_IsPowerOfTwo = GL_TRUE;
else else
img->_IsPowerOfTwo = GL_FALSE; img->_IsPowerOfTwo = GL_FALSE;
@@ -1306,7 +1306,7 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
if (width < 2 * border || width > 2 + maxSize || if (width < 2 * border || width > 2 + maxSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && (!ctx->Extensions.ARB_texture_non_power_of_two &&
width >0 && _mesa_bitcount(width - 2 * border) != 1) || width >0 && !_mesa_is_pow_two(width - 2 * border)) ||
level >= ctx->Const.MaxTextureLevels) { level >= ctx->Const.MaxTextureLevels) {
/* bad width or level */ /* bad width or level */
return GL_FALSE; return GL_FALSE;
@@ -1316,10 +1316,10 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
if (width < 2 * border || width > 2 + maxSize || if (width < 2 * border || width > 2 + maxSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && (!ctx->Extensions.ARB_texture_non_power_of_two &&
width > 0 && _mesa_bitcount(width - 2 * border) != 1) || width > 0 && !_mesa_is_pow_two(width - 2 * border)) ||
height < 2 * border || height > 2 + maxSize || height < 2 * border || height > 2 + maxSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && (!ctx->Extensions.ARB_texture_non_power_of_two &&
height > 0 && _mesa_bitcount(height - 2 * border) != 1) || height > 0 && !_mesa_is_pow_two(height - 2 * border)) ||
level >= ctx->Const.MaxTextureLevels) { level >= ctx->Const.MaxTextureLevels) {
/* bad width or height or level */ /* bad width or height or level */
return GL_FALSE; return GL_FALSE;
@@ -1329,13 +1329,13 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1); maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1);
if (width < 2 * border || width > 2 + maxSize || if (width < 2 * border || width > 2 + maxSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && (!ctx->Extensions.ARB_texture_non_power_of_two &&
width > 0 && _mesa_bitcount(width - 2 * border) != 1) || width > 0 && !_mesa_is_pow_two(width - 2 * border)) ||
height < 2 * border || height > 2 + maxSize || height < 2 * border || height > 2 + maxSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && (!ctx->Extensions.ARB_texture_non_power_of_two &&
height > 0 && _mesa_bitcount(height - 2 * border) != 1) || height > 0 && !_mesa_is_pow_two(height - 2 * border)) ||
depth < 2 * border || depth > 2 + maxSize || depth < 2 * border || depth > 2 + maxSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && (!ctx->Extensions.ARB_texture_non_power_of_two &&
depth > 0 && _mesa_bitcount(depth - 2 * border) != 1) || depth > 0 && !_mesa_is_pow_two(depth - 2 * border)) ||
level >= ctx->Const.Max3DTextureLevels) { level >= ctx->Const.Max3DTextureLevels) {
/* bad width or height or depth or level */ /* bad width or height or depth or level */
return GL_FALSE; return GL_FALSE;
@@ -1353,10 +1353,10 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
maxSize = 1 << (ctx->Const.MaxCubeTextureLevels - 1); maxSize = 1 << (ctx->Const.MaxCubeTextureLevels - 1);
if (width < 2 * border || width > 2 + maxSize || if (width < 2 * border || width > 2 + maxSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && (!ctx->Extensions.ARB_texture_non_power_of_two &&
width > 0 && _mesa_bitcount(width - 2 * border) != 1) || width > 0 && !_mesa_is_pow_two(width - 2 * border)) ||
height < 2 * border || height > 2 + maxSize || height < 2 * border || height > 2 + maxSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && (!ctx->Extensions.ARB_texture_non_power_of_two &&
height > 0 && _mesa_bitcount(height - 2 * border) != 1) || height > 0 && !_mesa_is_pow_two(height - 2 * border)) ||
level >= ctx->Const.MaxCubeTextureLevels) { level >= ctx->Const.MaxCubeTextureLevels) {
/* bad width or height */ /* bad width or height */
return GL_FALSE; return GL_FALSE;
@@ -1366,7 +1366,7 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
if (width < 2 * border || width > 2 + maxSize || if (width < 2 * border || width > 2 + maxSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && (!ctx->Extensions.ARB_texture_non_power_of_two &&
width > 0 && _mesa_bitcount(width - 2 * border) != 1) || width > 0 && !_mesa_is_pow_two(width - 2 * border)) ||
level >= ctx->Const.MaxTextureLevels) { level >= ctx->Const.MaxTextureLevels) {
/* bad width or level */ /* bad width or level */
return GL_FALSE; return GL_FALSE;
@@ -1380,10 +1380,10 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
if (width < 2 * border || width > 2 + maxSize || if (width < 2 * border || width > 2 + maxSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && (!ctx->Extensions.ARB_texture_non_power_of_two &&
width > 0 && _mesa_bitcount(width - 2 * border) != 1) || width > 0 && !_mesa_is_pow_two(width - 2 * border)) ||
height < 2 * border || height > 2 + maxSize || height < 2 * border || height > 2 + maxSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && (!ctx->Extensions.ARB_texture_non_power_of_two &&
height > 0 && _mesa_bitcount(height - 2 * border) != 1) || height > 0 && !_mesa_is_pow_two(height - 2 * border)) ||
level >= ctx->Const.MaxTextureLevels) { level >= ctx->Const.MaxTextureLevels) {
/* bad width or height or level */ /* bad width or height or level */
return GL_FALSE; return GL_FALSE;
@@ -3273,16 +3273,16 @@ compressed_texture_error_check(GLcontext *ctx, GLint dimensions,
* XXX We should probably use the proxy texture error check function here. * XXX We should probably use the proxy texture error check function here.
*/ */
if (width < 1 || width > maxTextureSize || if (width < 1 || width > maxTextureSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && _mesa_bitcount(width) != 1)) (!ctx->Extensions.ARB_texture_non_power_of_two && !_mesa_is_pow_two(width)))
return GL_INVALID_VALUE; return GL_INVALID_VALUE;
if ((height < 1 || height > maxTextureSize || if ((height < 1 || height > maxTextureSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && _mesa_bitcount(height) != 1)) (!ctx->Extensions.ARB_texture_non_power_of_two && !_mesa_is_pow_two(height)))
&& dimensions > 1) && dimensions > 1)
return GL_INVALID_VALUE; return GL_INVALID_VALUE;
if ((depth < 1 || depth > maxTextureSize || if ((depth < 1 || depth > maxTextureSize ||
(!ctx->Extensions.ARB_texture_non_power_of_two && _mesa_bitcount(depth) != 1)) (!ctx->Extensions.ARB_texture_non_power_of_two && !_mesa_is_pow_two(depth)))
&& dimensions > 2) && dimensions > 2)
return GL_INVALID_VALUE; return GL_INVALID_VALUE;