summaryrefslogtreecommitdiffstats
path: root/common.h
diff options
context:
space:
mode:
authorRichard Grenville <pyxlcy@gmail.com>2013-03-16 22:54:43 +0800
committerRichard Grenville <pyxlcy@gmail.com>2013-03-16 22:54:43 +0800
commit74792903de7a88eda20aad031ca1f36cb56e2c2b (patch)
treea0b126ca46f02d479f8e65db23d2e921a576ff44 /common.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 'common.h')
-rw-r--r--common.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/common.h b/common.h
index 30c09e3a5..f36edf4ba 100644
--- a/common.h
+++ b/common.h
@@ -89,6 +89,10 @@
// libGL
#ifdef CONFIG_VSYNC_OPENGL
+#ifdef CONFIG_VSYNC_OPENGL_GLSL
+#define GL_GLEXT_PROTOTYPES
+#endif
+
#include <GL/glx.h>
#endif
@@ -263,6 +267,7 @@ typedef enum {
enum backend {
BKEND_XRENDER,
BKEND_GLX,
+ NUM_BKEND,
};
typedef struct _glx_texture glx_texture_t;
@@ -594,6 +599,8 @@ typedef struct {
// === OpenGL related ===
/// GLX context.
GLXContext glx_context;
+ /// Whether we have GL_ARB_texture_non_power_of_two.
+ bool glx_has_texture_non_power_of_two;
/// Pointer to glXGetVideoSyncSGI function.
f_GetVideoSync glXGetVideoSyncSGI;
/// Pointer to glXWaitVideoSyncSGI function.
@@ -874,6 +881,7 @@ typedef enum {
extern const char * const WINTYPES[NUM_WINTYPES];
extern const char * const VSYNC_STRS[NUM_VSYNC];
+extern const char * const BACKEND_STRS[NUM_BKEND];
extern session_t *ps_g;
// == Debugging code ==
@@ -1252,6 +1260,20 @@ parse_vsync(session_t *ps, const char *str) {
return false;
}
+/**
+ * Parse a backend option argument.
+ */
+static inline bool
+parse_backend(session_t *ps, const char *str) {
+ for (enum backend i = 0; i < (sizeof(BACKEND_STRS) / sizeof(BACKEND_STRS[0])); ++i)
+ if (!strcasecmp(str, BACKEND_STRS[i])) {
+ ps->o.backend = i;
+ return true;
+ }
+ printf_errf("(\"%s\"): Invalid backend argument.", str);
+ return false;
+}
+
timeout_t *
timeout_insert(session_t *ps, time_ms_t interval,
bool (*callback)(session_t *ps, timeout_t *ptmout), void *data);
@@ -1543,6 +1565,9 @@ void
glx_on_root_change(session_t *ps);
bool
+glx_init_blur(session_t *ps);
+
+bool
glx_bind_pixmap(session_t *ps, glx_texture_t **pptex, Pixmap pixmap,
int width, int height, int depth);
@@ -1554,6 +1579,9 @@ glx_tex_binded(const glx_texture_t *ptex) {
return ptex && ptex->glpixmap && ptex->texture;
}
+void
+glx_set_clip(session_t *ps, XserverRegion reg);
+
bool
glx_render(session_t *ps, const glx_texture_t *ptex,
int x, int y, int dx, int dy, int width, int height, int z,