mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-13 08:22:16 -04:00
render: unify render pass accessors
Introduce helper functions to retrieve backend-specific render passes from struct wlr_render_pass and replace ad-hoc internal accessors.
This commit is contained in:
parent
a1861c8295
commit
53630a0a60
8 changed files with 94 additions and 83 deletions
|
|
@ -19,19 +19,20 @@
|
|||
|
||||
static const struct wlr_render_pass_impl render_pass_impl;
|
||||
|
||||
static struct wlr_gles2_render_pass *get_render_pass(struct wlr_render_pass *wlr_pass) {
|
||||
struct wlr_gles2_render_pass *wlr_gles2_render_pass_from_render_pass(
|
||||
struct wlr_render_pass *wlr_pass) {
|
||||
assert(wlr_pass->impl == &render_pass_impl);
|
||||
struct wlr_gles2_render_pass *pass = wl_container_of(wlr_pass, pass, base);
|
||||
return pass;
|
||||
}
|
||||
|
||||
static bool render_pass_submit(struct wlr_render_pass *wlr_pass) {
|
||||
struct wlr_gles2_render_pass *pass = get_render_pass(wlr_pass);
|
||||
struct wlr_gles2_render_pass *pass = wlr_gles2_render_pass_from_render_pass(wlr_pass);
|
||||
struct wlr_gles2_renderer *renderer = pass->buffer->renderer;
|
||||
struct wlr_gles2_render_timer *timer = pass->timer;
|
||||
bool ok = false;
|
||||
|
||||
push_gles2_debug(renderer);
|
||||
wlr_gles2_push_debug(renderer);
|
||||
|
||||
if (timer) {
|
||||
// clear disjoint flag
|
||||
|
|
@ -71,7 +72,7 @@ static bool render_pass_submit(struct wlr_render_pass *wlr_pass) {
|
|||
out:
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
|
||||
pop_gles2_debug(renderer);
|
||||
wlr_gles2_pop_debug(renderer);
|
||||
wlr_egl_restore_context(&pass->prev_ctx);
|
||||
|
||||
wlr_drm_syncobj_timeline_unref(pass->signal_timeline);
|
||||
|
|
@ -130,7 +131,7 @@ static void render(const struct wlr_box *box, const pixman_region32_t *clip, GLi
|
|||
pixman_region32_fini(®ion);
|
||||
}
|
||||
|
||||
static void set_proj_matrix(GLint loc, float proj[9], const struct wlr_box *box) {
|
||||
void wlr_gles_set_proj_matrix(GLint loc, float proj[9], const struct wlr_box *box) {
|
||||
float gl_matrix[9];
|
||||
wlr_matrix_identity(gl_matrix);
|
||||
wlr_matrix_translate(gl_matrix, box->x, box->y);
|
||||
|
|
@ -172,7 +173,7 @@ static void setup_blending(enum wlr_render_blend_mode mode) {
|
|||
|
||||
static void render_pass_add_texture(struct wlr_render_pass *wlr_pass,
|
||||
const struct wlr_render_texture_options *options) {
|
||||
struct wlr_gles2_render_pass *pass = get_render_pass(wlr_pass);
|
||||
struct wlr_gles2_render_pass *pass = wlr_gles2_render_pass_from_render_pass(wlr_pass);
|
||||
struct wlr_gles2_renderer *renderer = pass->buffer->renderer;
|
||||
struct wlr_gles2_texture *texture = gles2_get_texture(options->texture);
|
||||
struct wlr_gles2_render_texture_pass *texture_pass =
|
||||
|
|
@ -208,7 +209,7 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass,
|
|||
src_fbox.width /= options->texture->width;
|
||||
src_fbox.height /= options->texture->height;
|
||||
|
||||
push_gles2_debug(renderer);
|
||||
wlr_gles2_push_debug(renderer);
|
||||
|
||||
if (options->wait_timeline != NULL) {
|
||||
int sync_file_fd =
|
||||
|
|
@ -251,18 +252,18 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass,
|
|||
|
||||
glUniform1i(shader->tex, 0);
|
||||
glUniform1f(shader->alpha, alpha);
|
||||
set_proj_matrix(shader->proj, pass->projection_matrix, &dst_box);
|
||||
wlr_gles_set_proj_matrix(shader->proj, pass->projection_matrix, &dst_box);
|
||||
set_tex_matrix(shader->tex_proj, options->transform, &src_fbox);
|
||||
|
||||
render(&dst_box, options->clip, shader->pos_attrib);
|
||||
|
||||
glBindTexture(texture->target, 0);
|
||||
pop_gles2_debug(renderer);
|
||||
wlr_gles2_pop_debug(renderer);
|
||||
}
|
||||
|
||||
static void render_pass_add_rect(struct wlr_render_pass *wlr_pass,
|
||||
const struct wlr_render_rect_options *options) {
|
||||
struct wlr_gles2_render_pass *pass = get_render_pass(wlr_pass);
|
||||
struct wlr_gles2_render_pass *pass = wlr_gles2_render_pass_from_render_pass(wlr_pass);
|
||||
struct wlr_gles2_renderer *renderer = pass->buffer->renderer;
|
||||
struct wlr_gles2_render_rect_pass *rect_pass =
|
||||
wlr_gles2_render_rect_pass_from_pass(renderer->wlr_renderer.rect_pass);
|
||||
|
|
@ -272,7 +273,7 @@ static void render_pass_add_rect(struct wlr_render_pass *wlr_pass,
|
|||
struct wlr_buffer *wlr_buffer = pass->buffer->buffer;
|
||||
wlr_render_rect_options_get_box(options, wlr_buffer, &box);
|
||||
|
||||
push_gles2_debug(renderer);
|
||||
wlr_gles2_push_debug(renderer);
|
||||
enum wlr_render_blend_mode blend_mode =
|
||||
color->a == 1.0 ? WLR_RENDER_BLEND_MODE_NONE : options->blend_mode;
|
||||
if (blend_mode == WLR_RENDER_BLEND_MODE_NONE &&
|
||||
|
|
@ -285,12 +286,12 @@ static void render_pass_add_rect(struct wlr_render_pass *wlr_pass,
|
|||
} else {
|
||||
setup_blending(blend_mode);
|
||||
glUseProgram(rect_pass->shader.program);
|
||||
set_proj_matrix(rect_pass->shader.proj, pass->projection_matrix, &box);
|
||||
wlr_gles_set_proj_matrix(rect_pass->shader.proj, pass->projection_matrix, &box);
|
||||
glUniform4f(rect_pass->shader.color, color->r, color->g, color->b, color->a);
|
||||
render(&box, options->clip, rect_pass->shader.pos_attrib);
|
||||
}
|
||||
|
||||
pop_gles2_debug(renderer);
|
||||
wlr_gles2_pop_debug(renderer);
|
||||
}
|
||||
|
||||
static void render_pass_destory(struct wlr_render_pass *wlr_pass) {
|
||||
|
|
@ -298,7 +299,7 @@ static void render_pass_destory(struct wlr_render_pass *wlr_pass) {
|
|||
}
|
||||
|
||||
static struct wlr_renderer *render_pass_get_renderer(struct wlr_render_pass *wlr_pass) {
|
||||
struct wlr_gles2_render_pass *pass = get_render_pass(wlr_pass);
|
||||
struct wlr_gles2_render_pass *pass = wlr_gles2_render_pass_from_render_pass(wlr_pass);
|
||||
struct wlr_gles2_renderer *renderer = pass->buffer->renderer;
|
||||
|
||||
return &renderer->wlr_renderer;
|
||||
|
|
@ -360,13 +361,13 @@ struct wlr_gles2_render_pass *begin_gles2_buffer_pass(struct wlr_gles2_buffer *b
|
|||
matrix_projection(pass->projection_matrix, wlr_buffer->width, wlr_buffer->height,
|
||||
WL_OUTPUT_TRANSFORM_FLIPPED_180);
|
||||
|
||||
push_gles2_debug(renderer);
|
||||
wlr_gles2_push_debug(renderer);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
||||
|
||||
glViewport(0, 0, wlr_buffer->width, wlr_buffer->height);
|
||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
pop_gles2_debug(renderer);
|
||||
wlr_gles2_pop_debug(renderer);
|
||||
|
||||
return pass;
|
||||
}
|
||||
|
|
@ -374,9 +375,9 @@ struct wlr_gles2_render_pass *begin_gles2_buffer_pass(struct wlr_gles2_buffer *b
|
|||
static void render_rect_pass_destroy(struct wlr_render_rect_pass *pass) {
|
||||
struct wlr_gles2_render_rect_pass *gles2_pass =
|
||||
wlr_gles2_render_rect_pass_from_pass(pass);
|
||||
push_gles2_debug(gles2_pass->renderer);
|
||||
wlr_gles2_push_debug(gles2_pass->renderer);
|
||||
glDeleteProgram(gles2_pass->shader.program);
|
||||
pop_gles2_debug(gles2_pass->renderer);
|
||||
wlr_gles2_pop_debug(gles2_pass->renderer);
|
||||
free(gles2_pass);
|
||||
}
|
||||
|
||||
|
|
@ -393,17 +394,17 @@ struct wlr_render_rect_pass *wlr_gles2_render_rect_pass_create(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
|
||||
struct wlr_gles2_renderer *renderer = wlr_gles2_renderer_from_renderer(wlr_renderer);
|
||||
if (!wlr_egl_make_current(renderer->egl, NULL)) {
|
||||
free(pass);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
wlr_render_rect_pass_init(&pass->base, &render_rect_pass_impl);
|
||||
push_gles2_debug(renderer);
|
||||
wlr_gles2_push_debug(renderer);
|
||||
GLuint prog;
|
||||
pass->shader.program = prog =
|
||||
gles2_link_program(renderer, common_vert_src, quad_frag_src);
|
||||
wlr_gles2_link_program(renderer, common_vert_src, quad_frag_src);
|
||||
if (!pass->shader.program) {
|
||||
goto error;
|
||||
}
|
||||
|
|
@ -411,14 +412,14 @@ struct wlr_render_rect_pass *wlr_gles2_render_rect_pass_create(
|
|||
pass->shader.proj = glGetUniformLocation(pass->shader.program, "proj");
|
||||
pass->shader.color = glGetUniformLocation(pass->shader.program, "color");
|
||||
pass->shader.pos_attrib = glGetAttribLocation(pass->shader.program, "pos");
|
||||
pop_gles2_debug(renderer);
|
||||
wlr_gles2_pop_debug(renderer);
|
||||
wlr_egl_unset_current(renderer->egl);
|
||||
pass->renderer = renderer;
|
||||
return &pass->base;
|
||||
|
||||
error:
|
||||
render_rect_pass_destroy(&pass->base);
|
||||
pop_gles2_debug(renderer);
|
||||
wlr_gles2_pop_debug(renderer);
|
||||
wlr_egl_unset_current(renderer->egl);
|
||||
|
||||
return NULL;
|
||||
|
|
@ -443,11 +444,11 @@ struct wlr_gles2_render_rect_pass *wlr_gles2_render_rect_pass_from_pass(
|
|||
static void render_texture_pass_destroy(struct wlr_render_texture_pass *pass) {
|
||||
struct wlr_gles2_render_texture_pass *gles2_pass =
|
||||
wlr_gles2_render_texture_pass_from_pass(pass);
|
||||
push_gles2_debug(gles2_pass->renderer);
|
||||
wlr_gles2_push_debug(gles2_pass->renderer);
|
||||
glDeleteProgram(gles2_pass->shaders.tex_rgba.program);
|
||||
glDeleteProgram(gles2_pass->shaders.tex_rgbx.program);
|
||||
glDeleteProgram(gles2_pass->shaders.tex_ext.program);
|
||||
pop_gles2_debug(gles2_pass->renderer);
|
||||
wlr_gles2_pop_debug(gles2_pass->renderer);
|
||||
free(gles2_pass);
|
||||
}
|
||||
|
||||
|
|
@ -464,15 +465,15 @@ struct wlr_render_texture_pass *wlr_gles2_render_texture_pass_create(
|
|||
return NULL;
|
||||
}
|
||||
wlr_render_texture_pass_init(&pass->base, &render_texture_pass_impl);
|
||||
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
|
||||
struct wlr_gles2_renderer *renderer = wlr_gles2_renderer_from_renderer(wlr_renderer);
|
||||
if (!wlr_egl_make_current(renderer->egl, NULL)) {
|
||||
free(pass);
|
||||
return NULL;
|
||||
}
|
||||
push_gles2_debug(renderer);
|
||||
wlr_gles2_push_debug(renderer);
|
||||
GLuint prog;
|
||||
pass->shaders.tex_rgba.program = prog =
|
||||
gles2_link_program(renderer, common_vert_src, tex_rgba_frag_src);
|
||||
wlr_gles2_link_program(renderer, common_vert_src, tex_rgba_frag_src);
|
||||
if (!pass->shaders.tex_rgba.program) {
|
||||
goto error;
|
||||
}
|
||||
|
|
@ -483,7 +484,7 @@ struct wlr_render_texture_pass *wlr_gles2_render_texture_pass_create(
|
|||
pass->shaders.tex_rgba.pos_attrib = glGetAttribLocation(prog, "pos");
|
||||
|
||||
pass->shaders.tex_rgbx.program = prog =
|
||||
gles2_link_program(renderer, common_vert_src, tex_rgbx_frag_src);
|
||||
wlr_gles2_link_program(renderer, common_vert_src, tex_rgbx_frag_src);
|
||||
if (!pass->shaders.tex_rgbx.program) {
|
||||
goto error;
|
||||
}
|
||||
|
|
@ -495,7 +496,7 @@ struct wlr_render_texture_pass *wlr_gles2_render_texture_pass_create(
|
|||
|
||||
if (renderer->exts.OES_egl_image_external) {
|
||||
pass->shaders.tex_ext.program = prog =
|
||||
gles2_link_program(renderer, common_vert_src, tex_external_frag_src);
|
||||
wlr_gles2_link_program(renderer, common_vert_src, tex_external_frag_src);
|
||||
if (!pass->shaders.tex_ext.program) {
|
||||
goto error;
|
||||
}
|
||||
|
|
@ -506,7 +507,7 @@ struct wlr_render_texture_pass *wlr_gles2_render_texture_pass_create(
|
|||
pass->shaders.tex_ext.pos_attrib = glGetAttribLocation(prog, "pos");
|
||||
}
|
||||
|
||||
pop_gles2_debug(renderer);
|
||||
wlr_gles2_pop_debug(renderer);
|
||||
|
||||
wlr_egl_unset_current(renderer->egl);
|
||||
pass->renderer = renderer;
|
||||
|
|
@ -514,7 +515,7 @@ struct wlr_render_texture_pass *wlr_gles2_render_texture_pass_create(
|
|||
|
||||
error:
|
||||
render_texture_pass_destroy(&pass->base);
|
||||
pop_gles2_debug(renderer);
|
||||
wlr_gles2_pop_debug(renderer);
|
||||
wlr_egl_unset_current(renderer->egl);
|
||||
|
||||
return NULL;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue