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:
28
src/common.h
28
src/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);
|
||||
@ -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,
|
||||
|
Reference in New Issue
Block a user