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:
Yuxuan Shui 2022-08-11 04:53:14 +01:00
parent eb54974ac0
commit 83e1cd9a19
No known key found for this signature in database
GPG Key ID: D3A4405BE6CC17F4
6 changed files with 36 additions and 0 deletions

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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?
};

View File

@ -134,6 +134,7 @@ struct shader_info {
char *key;
char *source;
void *backend_shader;
uint64_t attributes;
UT_hash_handle hh;
};

View File

@ -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;
}
}
}