summaryrefslogtreecommitdiffstats
path: root/opengl.h
diff options
context:
space:
mode:
authorRichard Grenville <[email protected]>2013-03-16 22:54:43 +0800
committerRichard Grenville <[email protected]>2013-03-16 22:54:43 +0800
commit74792903de7a88eda20aad031ca1f36cb56e2c2b (patch)
treea0b126ca46f02d479f8e65db23d2e921a576ff44 /opengl.h
parentf9f1e1f228ec21be08833f6aa86fe6ea2c64b625 (diff)
downloadtdebase-74792903de7a88eda20aad031ca1f36cb56e2c2b.tar.gz
tdebase-74792903de7a88eda20aad031ca1f36cb56e2c2b.zip
Bug fix: GLX backend incompatibility with mesa & others
- Fix a bug that glx_bind_pixmap() doesn't work with mesa drivers. Thanks to Janhouse and mkraemer for reporting. (#7) - Use stencil buffer to attempt to eliminate potential double-paint issue in glx_render(). X Fixes doesn't guarantee the rectangles in a region do not overlap, and this may cause some regions to be painted twice, which would be a problem if we are painting transparent things. Now the target window must have a stencil buffer. Compiz uses its own region implementation to deal with this, but as a lightweight compositor we can't really do the same. It may have a positive or negative effort over performance. Callgrind result indicates basically no change in performance, but this may or may not be true. - Correctly distinguish GL extensions and GLX extensions. Sorry. :-D - Handle screen size. Thanks to tsmithe for reporting. (#7) - Rename OpenGL backend to GLX backend, because, we might have a EGL backend someday. - Add configuration file option `backend` to specify backend. Add `backend` to D-Bus `opts_get`. - Add OpenGL shader compilation code, but currently unused. - Minor adjustments. - Known issue: Window content doesn't get updated in VirtualBox, probably because its OpenGL implementation requires constant rebinding of texture. But that's really slow... - Known issue: Blur feature is still unimplemented in GLX backend.
Diffstat (limited to 'opengl.h')
-rw-r--r--opengl.h56
1 files changed, 48 insertions, 8 deletions
diff --git a/opengl.h b/opengl.h
index b48b441d0..7f6dae696 100644
--- a/opengl.h
+++ b/opengl.h
@@ -13,21 +13,61 @@
#include <ctype.h>
/**
+ * Check if a word is in string.
+ */
+static inline bool
+wd_is_in_str(const char *haystick, const char *needle) {
+ if (!haystick)
+ return false;
+
+ assert(*needle);
+
+ const char *pos = haystick - 1;
+ while ((pos = strstr(pos + 1, needle))) {
+ // Continue if it isn't a word boundary
+ if (((pos - haystick) && !isspace(*(pos - 1)))
+ || (strlen(pos) > strlen(needle) && !isspace(pos[strlen(needle)])))
+ continue;
+ return true;
+ }
+
+ return false;
+}
+
+/**
* Check if a GLX extension exists.
*/
static inline bool
-glx_hasext(session_t *ps, const char *ext) {
+glx_hasglxext(session_t *ps, const char *ext) {
const char *glx_exts = glXQueryExtensionsString(ps->dpy, ps->scr);
- const char *pos = strstr(glx_exts, ext);
- // Make sure the extension string is matched as a whole word
- if (!pos
- || ((pos - glx_exts) && !isspace(*(pos - 1)))
- || (strlen(pos) > strlen(ext) && !isspace(pos[strlen(ext)]))) {
- printf_errf("(): Missing OpenGL extension %s.", ext);
+ if (!glx_exts) {
+ printf_errf("(): Failed get GLX extension list.");
return false;
}
- return true;
+ bool found = wd_is_in_str(glx_exts, ext);
+ if (!found)
+ printf_errf("(): Missing GLX extension %s.", ext);
+
+ return found;
+}
+
+/**
+ * Check if a GLX extension exists.
+ */
+static inline bool
+glx_hasglext(session_t *ps, const char *ext) {
+ const char *gl_exts = (const char *) glGetString(GL_EXTENSIONS);
+ if (!gl_exts) {
+ printf_errf("(): Failed get GL extension list.");
+ return false;
+ }
+
+ bool found = wd_is_in_str(gl_exts, ext);
+ if (!found)
+ printf_errf("(): Missing GL extension %s.", ext);
+
+ return found;
}
static inline XVisualInfo *