Move opengl related function prototype to opengl.h
And aggregate some of the OPENGL ifdefs Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
parent
c01ad5bf04
commit
417744df14
138
src/common.h
138
src/common.h
|
@ -486,6 +486,8 @@ typedef struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
#else
|
||||||
|
typedef uint32_t glx_prog_main_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -553,10 +555,8 @@ typedef struct _options_t {
|
||||||
bool glx_use_gpushader4;
|
bool glx_use_gpushader4;
|
||||||
/// Custom fragment shader for painting windows, as a string.
|
/// Custom fragment shader for painting windows, as a string.
|
||||||
char *glx_fshader_win_str;
|
char *glx_fshader_win_str;
|
||||||
#ifdef CONFIG_OPENGL
|
|
||||||
/// Custom GLX program used for painting window.
|
/// Custom GLX program used for painting window.
|
||||||
glx_prog_main_t glx_prog_win;
|
glx_prog_main_t glx_prog_win;
|
||||||
#endif
|
|
||||||
/// Whether to fork to background.
|
/// Whether to fork to background.
|
||||||
bool fork_after_register;
|
bool fork_after_register;
|
||||||
/// Whether to detect rounded corners.
|
/// Whether to detect rounded corners.
|
||||||
|
@ -2121,97 +2121,6 @@ void
|
||||||
xr_glx_sync(session_t *ps, Drawable d, XSyncFence *pfence);
|
xr_glx_sync(session_t *ps, Drawable d, XSyncFence *pfence);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool
|
|
||||||
glx_init(session_t *ps, bool need_render);
|
|
||||||
|
|
||||||
void
|
|
||||||
glx_destroy(session_t *ps);
|
|
||||||
|
|
||||||
bool
|
|
||||||
glx_reinit(session_t *ps, bool need_render);
|
|
||||||
|
|
||||||
void
|
|
||||||
glx_on_root_change(session_t *ps);
|
|
||||||
|
|
||||||
bool
|
|
||||||
glx_init_blur(session_t *ps);
|
|
||||||
|
|
||||||
#ifdef CONFIG_OPENGL
|
|
||||||
bool
|
|
||||||
glx_load_prog_main(session_t *ps,
|
|
||||||
const char *vshader_str, const char *fshader_str,
|
|
||||||
glx_prog_main_t *pprogram);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool
|
|
||||||
glx_bind_pixmap(session_t *ps, glx_texture_t **pptex, Pixmap pixmap,
|
|
||||||
unsigned width, unsigned height, unsigned depth);
|
|
||||||
|
|
||||||
void
|
|
||||||
glx_release_pixmap(session_t *ps, glx_texture_t *ptex);
|
|
||||||
|
|
||||||
void
|
|
||||||
glx_paint_pre(session_t *ps, XserverRegion *preg);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a texture is binded, or is binded to the given pixmap.
|
|
||||||
*/
|
|
||||||
static inline bool
|
|
||||||
glx_tex_binded(const glx_texture_t *ptex, Pixmap pixmap) {
|
|
||||||
return ptex && ptex->glpixmap && ptex->texture
|
|
||||||
&& (!pixmap || pixmap == ptex->pixmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
glx_set_clip(session_t *ps, XserverRegion reg, const reg_data_t *pcache_reg);
|
|
||||||
|
|
||||||
#ifdef CONFIG_OPENGL
|
|
||||||
bool
|
|
||||||
glx_blur_dst(session_t *ps, int dx, int dy, int width, int height, float z,
|
|
||||||
GLfloat factor_center,
|
|
||||||
XserverRegion reg_tgt, const reg_data_t *pcache_reg,
|
|
||||||
glx_blur_cache_t *pbc);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool
|
|
||||||
glx_dim_dst(session_t *ps, int dx, int dy, int width, int height, float z,
|
|
||||||
GLfloat factor, XserverRegion reg_tgt, const reg_data_t *pcache_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,
|
|
||||||
double opacity, bool argb, bool neg,
|
|
||||||
XserverRegion reg_tgt, const reg_data_t *pcache_reg
|
|
||||||
#ifdef CONFIG_OPENGL
|
|
||||||
, const glx_prog_main_t *pprogram
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
|
|
||||||
#ifdef CONFIG_OPENGL
|
|
||||||
#define \
|
|
||||||
glx_render(ps, ptex, x, y, dx, dy, width, height, z, opacity, argb, neg, reg_tgt, pcache_reg, pprogram) \
|
|
||||||
glx_render_(ps, ptex, x, y, dx, dy, width, height, z, opacity, argb, neg, reg_tgt, pcache_reg, pprogram)
|
|
||||||
#else
|
|
||||||
#define \
|
|
||||||
glx_render(ps, ptex, x, y, dx, dy, width, height, z, opacity, argb, neg, reg_tgt, pcache_reg, pprogram) \
|
|
||||||
glx_render_(ps, ptex, x, y, dx, dy, width, height, z, opacity, argb, neg, reg_tgt, pcache_reg)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
unsigned char *
|
|
||||||
glx_take_screenshot(session_t *ps, int *out_length);
|
|
||||||
|
|
||||||
#ifdef CONFIG_OPENGL
|
|
||||||
GLuint
|
|
||||||
glx_create_shader(GLenum shader_type, const char *shader_str);
|
|
||||||
|
|
||||||
GLuint
|
|
||||||
glx_create_program(const GLuint * const shaders, int nshaders);
|
|
||||||
|
|
||||||
GLuint
|
|
||||||
glx_create_program_from_str(const char *vert_shader_str,
|
|
||||||
const char *frag_shader_str);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free a GLX texture.
|
* Free a GLX texture.
|
||||||
*/
|
*/
|
||||||
|
@ -2261,49 +2170,6 @@ free_glx_bc(session_t *ps, glx_blur_cache_t *pbc) {
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
|
||||||
* Free a glx_texture_t.
|
|
||||||
*/
|
|
||||||
static inline void
|
|
||||||
free_texture(session_t *ps, glx_texture_t **pptex) {
|
|
||||||
glx_texture_t *ptex = *pptex;
|
|
||||||
|
|
||||||
// Quit if there's nothing
|
|
||||||
if (!ptex)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#ifdef CONFIG_OPENGL
|
|
||||||
glx_release_pixmap(ps, ptex);
|
|
||||||
|
|
||||||
free_texture_r(ps, &ptex->texture);
|
|
||||||
|
|
||||||
// Free structure itself
|
|
||||||
free(ptex);
|
|
||||||
*pptex = NULL;
|
|
||||||
#endif
|
|
||||||
assert(!*pptex);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Free GLX part of paint_t.
|
|
||||||
*/
|
|
||||||
static inline void
|
|
||||||
free_paint_glx(session_t *ps, paint_t *ppaint) {
|
|
||||||
free_texture(ps, &ppaint->ptex);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Free GLX part of win.
|
|
||||||
*/
|
|
||||||
static inline void
|
|
||||||
free_win_res_glx(session_t *ps, win *w) {
|
|
||||||
free_paint_glx(ps, &w->paint);
|
|
||||||
free_paint_glx(ps, &w->shadow_paint);
|
|
||||||
#ifdef CONFIG_OPENGL
|
|
||||||
free_glx_bc(ps, &w->glx_blur_cache);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a OpenGL debugging marker.
|
* Add a OpenGL debugging marker.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1401,14 +1401,12 @@ win_blur_background(session_t *ps, win *w, xcb_render_picture_t tgt_buffer,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
render_(session_t *ps, int x, int y, int dx, int dy, int wid, int hei,
|
render(session_t *ps, int x, int y, int dx, int dy, int wid, int hei,
|
||||||
double opacity, bool argb, bool neg,
|
double opacity, bool argb, bool neg,
|
||||||
xcb_render_picture_t pict, glx_texture_t *ptex,
|
xcb_render_picture_t pict, glx_texture_t *ptex,
|
||||||
XserverRegion reg_paint, const reg_data_t *pcache_reg
|
XserverRegion reg_paint, const reg_data_t *pcache_reg,
|
||||||
#ifdef CONFIG_OPENGL
|
const glx_prog_main_t *pprogram)
|
||||||
, const glx_prog_main_t *pprogram
|
{
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
xcb_connection_t *c = XGetXCBConnection(ps->dpy);
|
xcb_connection_t *c = XGetXCBConnection(ps->dpy);
|
||||||
switch (ps->o.backend) {
|
switch (ps->o.backend) {
|
||||||
case BKEND_XRENDER:
|
case BKEND_XRENDER:
|
||||||
|
@ -1926,7 +1924,7 @@ paint_all(session_t *ps, XserverRegion region, XserverRegion region_real, win *t
|
||||||
glXWaitX();
|
glXWaitX();
|
||||||
assert(ps->tgt_buffer.pixmap);
|
assert(ps->tgt_buffer.pixmap);
|
||||||
xr_sync(ps, ps->tgt_buffer.pixmap, &ps->tgt_buffer_fence);
|
xr_sync(ps, ps->tgt_buffer.pixmap, &ps->tgt_buffer_fence);
|
||||||
paint_bind_tex_real(ps, &ps->tgt_buffer,
|
paint_bind_tex(ps, &ps->tgt_buffer,
|
||||||
ps->root_width, ps->root_height, ps->depth,
|
ps->root_width, ps->root_height, ps->depth,
|
||||||
!ps->o.glx_no_rebind_pixmap);
|
!ps->o.glx_no_rebind_pixmap);
|
||||||
// See #163
|
// See #163
|
||||||
|
|
|
@ -25,6 +25,9 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_OPENGL
|
||||||
|
#include "opengl.h"
|
||||||
|
#endif
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "c2.h"
|
#include "c2.h"
|
||||||
|
|
||||||
|
@ -50,13 +53,11 @@ void set_fade_callback(session_t *ps, win *w,
|
||||||
void map_win(session_t *ps, Window id);
|
void map_win(session_t *ps, Window id);
|
||||||
|
|
||||||
void
|
void
|
||||||
render_(session_t *ps, int x, int y, int dx, int dy, int wid, int hei,
|
render(session_t *ps, int x, int y, int dx, int dy, int wid, int hei,
|
||||||
double opacity, bool argb, bool neg,
|
double opacity, bool argb, bool neg,
|
||||||
xcb_render_picture_t pict, glx_texture_t *ptex,
|
xcb_render_picture_t pict, glx_texture_t *ptex,
|
||||||
XserverRegion reg_paint, const reg_data_t *pcache_reg
|
XserverRegion reg_paint, const reg_data_t *pcache_reg
|
||||||
#ifdef CONFIG_OPENGL
|
|
||||||
, const glx_prog_main_t *pprogram
|
, const glx_prog_main_t *pprogram
|
||||||
#endif
|
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -196,30 +197,38 @@ free_xinerama_info(session_t *ps) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_OPENGL
|
||||||
/**
|
/**
|
||||||
* Bind texture in paint_t if we are using GLX backend.
|
* Bind texture in paint_t if we are using GLX backend.
|
||||||
*/
|
*/
|
||||||
static inline bool
|
static inline bool
|
||||||
paint_bind_tex_real(session_t *ps, paint_t *ppaint,
|
paint_bind_tex(session_t *ps, paint_t *ppaint,
|
||||||
unsigned wid, unsigned hei, unsigned depth, bool force) {
|
unsigned wid, unsigned hei, unsigned depth, bool force)
|
||||||
#ifdef CONFIG_OPENGL
|
{
|
||||||
if (!ppaint->pixmap)
|
if (!ppaint->pixmap)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (force || !glx_tex_binded(ppaint->ptex, ppaint->pixmap))
|
if (force || !glx_tex_binded(ppaint->ptex, ppaint->pixmap))
|
||||||
return glx_bind_pixmap(ps, &ppaint->ptex, ppaint->pixmap, wid, hei, depth);
|
return glx_bind_pixmap(ps, &ppaint->ptex, ppaint->pixmap, wid, hei, depth);
|
||||||
#endif
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
static inline bool
|
static inline bool
|
||||||
paint_bind_tex(session_t *ps, paint_t *ppaint,
|
paint_bind_tex(session_t *ps, paint_t *ppaint,
|
||||||
unsigned wid, unsigned hei, unsigned depth, bool force) {
|
unsigned wid, unsigned hei, unsigned depth, bool force)
|
||||||
if (BKEND_GLX == ps->o.backend)
|
{
|
||||||
return paint_bind_tex_real(ps, ppaint, wid, hei, depth, force);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
static inline void
|
||||||
|
free_paint_glx(session_t *ps, paint_t *p) {}
|
||||||
|
static inline void
|
||||||
|
free_win_res_glx(session_t *ps, win *w) {}
|
||||||
|
static inline void
|
||||||
|
free_texture(session_t *ps, glx_texture_t **t) {
|
||||||
|
assert(!*t);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free data in a reg_data_t.
|
* Free data in a reg_data_t.
|
||||||
|
@ -487,16 +496,6 @@ find_win_all(session_t *ps, const Window wid) {
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_OPENGL
|
|
||||||
#define \
|
|
||||||
render(ps, x, y, dx, dy, wid, hei, opacity, argb, neg, pict, ptex, reg_paint, pcache_reg, pprogram) \
|
|
||||||
render_(ps, x, y, dx, dy, wid, hei, opacity, argb, neg, pict, ptex, reg_paint, pcache_reg, pprogram)
|
|
||||||
#else
|
|
||||||
#define \
|
|
||||||
render(ps, x, y, dx, dy, wid, hei, opacity, argb, neg, pict, ptex, reg_paint, pcache_reg, pprogram) \
|
|
||||||
render_(ps, x, y, dx, dy, wid, hei, opacity, argb, neg, pict, ptex, reg_paint, pcache_reg)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool win_has_alpha(win *);
|
bool win_has_alpha(win *);
|
||||||
static inline void
|
static inline void
|
||||||
win_render(session_t *ps, win *w, int x, int y, int wid, int hei,
|
win_render(session_t *ps, win *w, int x, int y, int wid, int hei,
|
||||||
|
|
|
@ -729,6 +729,9 @@ glx_load_prog_main(session_t *ps,
|
||||||
bool
|
bool
|
||||||
glx_bind_pixmap(session_t *ps, glx_texture_t **pptex, Pixmap pixmap,
|
glx_bind_pixmap(session_t *ps, glx_texture_t **pptex, Pixmap pixmap,
|
||||||
unsigned width, unsigned height, unsigned depth) {
|
unsigned width, unsigned height, unsigned depth) {
|
||||||
|
if (ps->o.backend != BKEND_GLX)
|
||||||
|
return true;
|
||||||
|
|
||||||
if (!pixmap) {
|
if (!pixmap) {
|
||||||
printf_errf("(%#010lx): Binding to an empty pixmap. This can't work.",
|
printf_errf("(%#010lx): Binding to an empty pixmap. This can't work.",
|
||||||
pixmap);
|
pixmap);
|
||||||
|
@ -1413,7 +1416,7 @@ glx_dim_dst(session_t *ps, int dx, int dy, int width, int height, float z,
|
||||||
* @brief Render a region with texture data.
|
* @brief Render a region with texture data.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
glx_render_(session_t *ps, const glx_texture_t *ptex,
|
glx_render(session_t *ps, const glx_texture_t *ptex,
|
||||||
int x, int y, int dx, int dy, int width, int height, int z,
|
int x, int y, int dx, int dy, int width, int height, int z,
|
||||||
double opacity, bool argb, bool neg,
|
double opacity, bool argb, bool neg,
|
||||||
XserverRegion reg_tgt, const reg_data_t *pcache_reg
|
XserverRegion reg_tgt, const reg_data_t *pcache_reg
|
||||||
|
|
116
src/opengl.h
116
src/opengl.h
|
@ -121,3 +121,119 @@ glx_hasglext(session_t *ps, const char *ext) {
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
glx_dim_dst(session_t *ps, int dx, int dy, int width, int height, float z,
|
||||||
|
GLfloat factor, XserverRegion reg_tgt, const reg_data_t *);
|
||||||
|
|
||||||
|
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,
|
||||||
|
double opacity, bool argb, bool neg,
|
||||||
|
XserverRegion reg_tgt, const reg_data_t *,
|
||||||
|
const glx_prog_main_t *pprogram);
|
||||||
|
|
||||||
|
bool
|
||||||
|
glx_init(session_t *ps, bool need_render);
|
||||||
|
|
||||||
|
void
|
||||||
|
glx_destroy(session_t *ps);
|
||||||
|
|
||||||
|
bool
|
||||||
|
glx_reinit(session_t *ps, bool need_render);
|
||||||
|
|
||||||
|
void
|
||||||
|
glx_on_root_change(session_t *ps);
|
||||||
|
|
||||||
|
bool
|
||||||
|
glx_init_blur(session_t *ps);
|
||||||
|
|
||||||
|
#ifdef CONFIG_OPENGL
|
||||||
|
bool
|
||||||
|
glx_load_prog_main(session_t *ps,
|
||||||
|
const char *vshader_str, const char *fshader_str,
|
||||||
|
glx_prog_main_t *pprogram);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool
|
||||||
|
glx_bind_pixmap(session_t *ps, glx_texture_t **pptex, Pixmap pixmap,
|
||||||
|
unsigned width, unsigned height, unsigned depth);
|
||||||
|
|
||||||
|
void
|
||||||
|
glx_release_pixmap(session_t *ps, glx_texture_t *ptex);
|
||||||
|
|
||||||
|
void glx_paint_pre(session_t *ps, XserverRegion *preg)
|
||||||
|
__attribute__((nonnull(1, 2)));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a texture is binded, or is binded to the given pixmap.
|
||||||
|
*/
|
||||||
|
static inline bool
|
||||||
|
glx_tex_binded(const glx_texture_t *ptex, Pixmap pixmap) {
|
||||||
|
return ptex && ptex->glpixmap && ptex->texture
|
||||||
|
&& (!pixmap || pixmap == ptex->pixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
glx_set_clip(session_t *ps, XserverRegion reg, const reg_data_t *);
|
||||||
|
|
||||||
|
bool
|
||||||
|
glx_blur_dst(session_t *ps, int dx, int dy, int width, int height, float z,
|
||||||
|
GLfloat factor_center,
|
||||||
|
XserverRegion reg_tgt,
|
||||||
|
const reg_data_t *,
|
||||||
|
glx_blur_cache_t *pbc);
|
||||||
|
|
||||||
|
GLuint
|
||||||
|
glx_create_shader(GLenum shader_type, const char *shader_str);
|
||||||
|
|
||||||
|
GLuint
|
||||||
|
glx_create_program(const GLuint * const shaders, int nshaders);
|
||||||
|
|
||||||
|
GLuint
|
||||||
|
glx_create_program_from_str(const char *vert_shader_str,
|
||||||
|
const char *frag_shader_str);
|
||||||
|
|
||||||
|
unsigned char *
|
||||||
|
glx_take_screenshot(session_t *ps, int *out_length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free a glx_texture_t.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
free_texture(session_t *ps, glx_texture_t **pptex) {
|
||||||
|
glx_texture_t *ptex = *pptex;
|
||||||
|
|
||||||
|
// Quit if there's nothing
|
||||||
|
if (!ptex)
|
||||||
|
return;
|
||||||
|
|
||||||
|
glx_release_pixmap(ps, ptex);
|
||||||
|
|
||||||
|
free_texture_r(ps, &ptex->texture);
|
||||||
|
|
||||||
|
// Free structure itself
|
||||||
|
free(ptex);
|
||||||
|
*pptex = NULL;
|
||||||
|
assert(!*pptex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free GLX part of paint_t.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
free_paint_glx(session_t *ps, paint_t *ppaint) {
|
||||||
|
free_texture(ps, &ppaint->ptex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free GLX part of win.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
free_win_res_glx(session_t *ps, win *w) {
|
||||||
|
free_paint_glx(ps, &w->paint);
|
||||||
|
free_paint_glx(ps, &w->shadow_paint);
|
||||||
|
#ifdef CONFIG_OPENGL
|
||||||
|
free_glx_bc(ps, &w->glx_blur_cache);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue