mirror of https://github.com/yshui/picom.git
backend: add and implement get_shader_attributes
Used for passing back information about whether a shader needs to be re-rendered every frame. Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
parent
eb54974ac0
commit
83e1cd9a19
|
@ -80,6 +80,12 @@ enum image_operations {
|
|||
IMAGE_OP_APPLY_ALPHA,
|
||||
};
|
||||
|
||||
enum shader_attributes {
|
||||
// Whether the shader needs to be render regardless of whether the window is
|
||||
// updated.
|
||||
SHADER_ATTRIBUTE_ANIMATED = 1,
|
||||
};
|
||||
|
||||
struct gaussian_blur_args {
|
||||
int size;
|
||||
double deviation;
|
||||
|
@ -203,13 +209,23 @@ struct backend_operations {
|
|||
void (*release_image)(backend_t *backend_data, void *img_data) attr_nonnull(1, 2);
|
||||
|
||||
/// Create a shader object from a shader source.
|
||||
///
|
||||
/// Optional
|
||||
void *(*create_shader)(backend_t *backend_data, const char *source)attr_nonnull(1, 2);
|
||||
|
||||
/// Free a shader object.
|
||||
///
|
||||
/// Required if create_shader is present.
|
||||
void (*destroy_shader)(backend_t *backend_data, void *shader) attr_nonnull(1, 2);
|
||||
|
||||
// =========== Query ===========
|
||||
|
||||
/// Get the attributes of a shader.
|
||||
///
|
||||
/// Optional, Returns a bitmask of attributes, see `shader_attributes`.
|
||||
uint64_t (*get_shader_attributes)(backend_t *backend_data, void *shader)
|
||||
attr_nonnull(1, 2);
|
||||
|
||||
/// Return if image is not completely opaque.
|
||||
///
|
||||
/// This function is needed because some backend might change the content of the
|
||||
|
|
|
@ -1682,6 +1682,15 @@ void *gl_create_window_shader(backend_t *backend_data attr_unused, const char *s
|
|||
return win_shader;
|
||||
}
|
||||
|
||||
uint64_t gl_get_shader_attributes(backend_t *backend_data attr_unused, void *shader) {
|
||||
auto win_shader = (gl_win_shader_t *)shader;
|
||||
uint64_t ret = 0;
|
||||
if (glGetUniformLocation(win_shader->prog, "time") >= 0) {
|
||||
ret |= SHADER_ATTRIBUTE_ANIMATED;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool gl_init(struct gl_data *gd, session_t *ps) {
|
||||
// Initialize GLX data structure
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
|
|
@ -110,6 +110,7 @@ GLuint gl_create_program(const GLuint *const shaders, int nshaders);
|
|||
GLuint gl_create_program_from_str(const char *vert_shader_str, const char *frag_shader_str);
|
||||
void *gl_create_window_shader(backend_t *backend_data, const char *source);
|
||||
void gl_destroy_window_shader(backend_t *backend_data, void *shader);
|
||||
uint64_t gl_get_shader_attributes(backend_t *backend_data, void *shader);
|
||||
bool gl_set_image_property(backend_t *backend_data, enum image_properties prop,
|
||||
void *image_data, void *args);
|
||||
|
||||
|
|
|
@ -549,6 +549,7 @@ struct backend_operations glx_ops = {
|
|||
.device_status = gl_device_status,
|
||||
.create_shader = gl_create_window_shader,
|
||||
.destroy_shader = gl_destroy_window_shader,
|
||||
.get_shader_attributes = gl_get_shader_attributes,
|
||||
.max_buffer_age = 5, // Why?
|
||||
};
|
||||
|
||||
|
|
|
@ -134,6 +134,7 @@ struct shader_info {
|
|||
char *key;
|
||||
char *source;
|
||||
void *backend_shader;
|
||||
uint64_t attributes;
|
||||
UT_hash_handle hh;
|
||||
};
|
||||
|
||||
|
|
|
@ -519,6 +519,14 @@ static bool initialize_backend(session_t *ps) {
|
|||
log_warn("Failed to create shader for shader file %s, "
|
||||
"this shader will not be used",
|
||||
shader->key);
|
||||
} else {
|
||||
if (ps->backend_data->ops->get_shader_attributes) {
|
||||
shader->attributes =
|
||||
ps->backend_data->ops->get_shader_attributes(
|
||||
ps->backend_data, shader->backend_shader);
|
||||
} else {
|
||||
shader->attributes = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue