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.
This commit is contained in:
Richard Grenville
2013-03-16 22:54:43 +08:00
parent 8ffcf1c1e8
commit 66be1f2fe1
8 changed files with 349 additions and 51 deletions

View File

@ -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);
@ -1542,6 +1564,9 @@ glx_destroy(session_t *ps);
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,