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:
YaoBing Xiao 2026-03-23 21:04:32 +08:00
parent a1861c8295
commit 53630a0a60
8 changed files with 94 additions and 83 deletions

View file

@ -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(&region);
}
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;