summaryrefslogtreecommitdiffstats
path: root/common/gl_utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'common/gl_utils.h')
-rw-r--r--common/gl_utils.h85
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