Skip to content
Snippets Groups Projects
Commit 1ed73246 authored by Ander Conselvan de Oliveira's avatar Ander Conselvan de Oliveira Committed by Kristian Høgsberg
Browse files

gl-renderer: Compile shaders only when needed

Saves some start up time by not compiling specific shaders until they
are needed.
parent f6128fcd
No related branches found
No related tags found
No related merge requests found
......@@ -44,6 +44,7 @@ struct gl_shader {
GLint tex_uniforms[3];
GLint alpha_uniform;
GLint color_uniform;
const char *vertex_source, *fragment_source;
};
#define BUFFER_DAMAGE_COUNT 2
......@@ -717,13 +718,26 @@ use_output(struct weston_output *output)
return 0;
}
static int
shader_init(struct gl_shader *shader, struct gl_renderer *gr,
const char *vertex_source, const char *fragment_source);
static void
use_shader(struct gl_renderer *gr,
struct gl_shader *shader)
use_shader(struct gl_renderer *gr, struct gl_shader *shader)
{
if (!shader->program) {
int ret;
ret = shader_init(shader, gr,
shader->vertex_source,
shader->fragment_source);
if (ret < 0)
weston_log("warning: failed to compile shader\n");
}
if (gr->current_shader == shader)
return;
glUseProgram(shader->program);
gr->current_shader = shader;
}
......@@ -1453,14 +1467,13 @@ compile_shader(GLenum type, int count, const char **sources)
}
static int
shader_init(struct gl_shader *shader, struct weston_compositor *ec,
shader_init(struct gl_shader *shader, struct gl_renderer *renderer,
const char *vertex_source, const char *fragment_source)
{
char msg[512];
GLint status;
int count;
const char *sources[3];
struct gl_renderer *renderer = get_renderer(ec);
shader->vertex_shader =
compile_shader(GL_VERTEX_SHADER, 1, &vertex_source);
......@@ -1844,28 +1857,29 @@ compile_shaders(struct weston_compositor *ec)
{
struct gl_renderer *gr = get_renderer(ec);
if (shader_init(&gr->texture_shader_rgba, ec,
vertex_shader, texture_fragment_shader_rgba) < 0)
return -1;
if (shader_init(&gr->texture_shader_rgbx, ec,
vertex_shader, texture_fragment_shader_rgbx) < 0)
return -1;
if (gr->has_egl_image_external &&
shader_init(&gr->texture_shader_egl_external, ec,
vertex_shader, texture_fragment_shader_egl_external) < 0)
return -1;
if (shader_init(&gr->texture_shader_y_uv, ec,
vertex_shader, texture_fragment_shader_y_uv) < 0)
return -1;
if (shader_init(&gr->texture_shader_y_u_v, ec,
vertex_shader, texture_fragment_shader_y_u_v) < 0)
return -1;
if (shader_init(&gr->texture_shader_y_xuxv, ec,
vertex_shader, texture_fragment_shader_y_xuxv) < 0)
return -1;
if (shader_init(&gr->solid_shader, ec,
vertex_shader, solid_fragment_shader) < 0)
return -1;
gr->texture_shader_rgba.vertex_source = vertex_shader;
gr->texture_shader_rgba.fragment_source = texture_fragment_shader_rgba;
gr->texture_shader_rgbx.vertex_source = vertex_shader;
gr->texture_shader_rgbx.fragment_source = texture_fragment_shader_rgbx;
gr->texture_shader_egl_external.vertex_source = vertex_shader;
gr->texture_shader_egl_external.fragment_source =
texture_fragment_shader_egl_external;
gr->texture_shader_y_uv.vertex_source = vertex_shader;
gr->texture_shader_y_uv.fragment_source = texture_fragment_shader_y_uv;
gr->texture_shader_y_u_v.vertex_source = vertex_shader;
gr->texture_shader_y_u_v.fragment_source =
texture_fragment_shader_y_u_v;
gr->texture_shader_y_u_v.vertex_source = vertex_shader;
gr->texture_shader_y_xuxv.fragment_source =
texture_fragment_shader_y_xuxv;
gr->solid_shader.vertex_source = vertex_shader;
gr->solid_shader.fragment_source = solid_fragment_shader;
return 0;
}
......@@ -1888,8 +1902,6 @@ fragment_debug_binding(struct weston_seat *seat, uint32_t time, uint32_t key,
shader_release(&gr->texture_shader_y_xuxv);
shader_release(&gr->solid_shader);
compile_shaders(ec);
/* Force use_shader() to call glUseProgram(), since we need to use
* the recompiled version of the shader. */
gr->current_shader = NULL;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment