diff options
Diffstat (limited to 'common/gl_utils.h')
-rw-r--r-- | common/gl_utils.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/common/gl_utils.h b/common/gl_utils.h new file mode 100644 index 00000000..41266775 --- /dev/null +++ b/common/gl_utils.h @@ -0,0 +1,85 @@ +/* + Copyright (C) 2009 Red Hat, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef GL_UTILS_H +#define GL_UTILS_H + +#ifdef RED_DEBUG +#define GLC_ERROR_TEST_FLUSH { \ + GLenum gl_err; glFlush(); \ + if ((gl_err = glGetError()) != GL_NO_ERROR) { \ + printf("%s[%d]: opengl error: %s\n", __FUNCTION__, __LINE__, \ + gluErrorString(gl_err)); \ + abort(); \ + } \ +} + +#define GLC_ERROR_TEST_FINISH { \ + GLenum gl_err; glFinish(); \ + if ((gl_err = glGetError()) != GL_NO_ERROR) { \ + printf("%s[%d]: opengl error: %s\n", __FUNCTION__, __LINE__, \ + gluErrorString(gl_err)); \ + abort(); \ + } \ +} +#else +#define GLC_ERROR_TEST_FLUSH ; + +#define GLC_ERROR_TEST_FINISH ; +#endif + +#ifdef WIN32 +static inline int find_msb(uint32_t val) +{ + uint32_t r; + __asm { + bsr eax, val + jnz found + mov eax, -1 + +found: + mov r, eax + } + return r + 1; +} + +#else +static inline int find_msb(unsigned int val) +{ + int ret; + + asm ("bsrl %1,%0\n\t" + "jnz 1f\n\t" + "movl $-1,%0\n" + "1:" + : "=r"(ret) : "r"(val)); + return ret + 1; +} + +#endif + +static inline int gl_get_to_power_two(unsigned int val) +{ + if ((val & (val - 1)) == 0) { + return val; + } + return 1 << find_msb(val); +} + +#endif |