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

@ -27,7 +27,7 @@ bool wlr_renderer_is_gles2(const struct wlr_renderer *wlr_renderer) {
return wlr_renderer->impl == &renderer_impl;
}
struct wlr_gles2_renderer *gles2_get_renderer(
struct wlr_gles2_renderer *wlr_gles2_renderer_from_renderer(
struct wlr_renderer *wlr_renderer) {
assert(wlr_renderer_is_gles2(wlr_renderer));
struct wlr_gles2_renderer *renderer = wl_container_of(wlr_renderer, renderer, wlr_renderer);
@ -51,13 +51,13 @@ static void destroy_buffer(struct wlr_gles2_buffer *buffer) {
struct wlr_egl_context prev_ctx;
wlr_egl_make_current(buffer->renderer->egl, &prev_ctx);
push_gles2_debug(buffer->renderer);
wlr_gles2_push_debug(buffer->renderer);
glDeleteFramebuffers(1, &buffer->fbo);
glDeleteRenderbuffers(1, &buffer->rbo);
glDeleteTextures(1, &buffer->tex);
pop_gles2_debug(buffer->renderer);
wlr_gles2_pop_debug(buffer->renderer);
wlr_egl_destroy_image(buffer->renderer->egl, buffer->image);
@ -87,7 +87,7 @@ GLuint gles2_buffer_get_fbo(struct wlr_gles2_buffer *buffer) {
return buffer->fbo;
}
push_gles2_debug(buffer->renderer);
wlr_gles2_push_debug(buffer->renderer);
if (!buffer->rbo) {
glGenRenderbuffers(1, &buffer->rbo);
@ -110,7 +110,7 @@ GLuint gles2_buffer_get_fbo(struct wlr_gles2_buffer *buffer) {
buffer->fbo = 0;
}
pop_gles2_debug(buffer->renderer);
wlr_gles2_pop_debug(buffer->renderer);
return buffer->fbo;
}
@ -160,7 +160,7 @@ error_buffer:
static const struct wlr_drm_format_set *gles2_get_texture_formats(
struct wlr_renderer *wlr_renderer, uint32_t buffer_caps) {
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
struct wlr_gles2_renderer *renderer = wlr_gles2_renderer_from_renderer(wlr_renderer);
if (buffer_caps & WLR_BUFFER_CAP_DMABUF) {
return wlr_egl_get_dmabuf_texture_formats(renderer->egl);
} else if (buffer_caps & WLR_BUFFER_CAP_DATA_PTR) {
@ -172,13 +172,13 @@ static const struct wlr_drm_format_set *gles2_get_texture_formats(
static const struct wlr_drm_format_set *gles2_get_render_formats(
struct wlr_renderer *wlr_renderer) {
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
struct wlr_gles2_renderer *renderer = wlr_gles2_renderer_from_renderer(wlr_renderer);
return wlr_egl_get_dmabuf_render_formats(renderer->egl);
}
static int gles2_get_drm_fd(struct wlr_renderer *wlr_renderer) {
struct wlr_gles2_renderer *renderer =
gles2_get_renderer(wlr_renderer);
wlr_gles2_renderer_from_renderer(wlr_renderer);
if (renderer->drm_fd < 0) {
renderer->drm_fd = wlr_egl_dup_drm_fd(renderer->egl);
@ -189,12 +189,12 @@ static int gles2_get_drm_fd(struct wlr_renderer *wlr_renderer) {
struct wlr_egl *wlr_gles2_renderer_get_egl(struct wlr_renderer *wlr_renderer) {
struct wlr_gles2_renderer *renderer =
gles2_get_renderer(wlr_renderer);
wlr_gles2_renderer_from_renderer(wlr_renderer);
return renderer->egl;
}
static void gles2_destroy(struct wlr_renderer *wlr_renderer) {
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
struct wlr_gles2_renderer *renderer = wlr_gles2_renderer_from_renderer(wlr_renderer);
wlr_egl_make_current(renderer->egl, NULL);
@ -227,7 +227,7 @@ static void gles2_destroy(struct wlr_renderer *wlr_renderer) {
static struct wlr_render_pass *gles2_begin_buffer_pass(struct wlr_renderer *wlr_renderer,
struct wlr_buffer *wlr_buffer, const struct wlr_buffer_pass_options *options) {
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
struct wlr_gles2_renderer *renderer = wlr_gles2_renderer_from_renderer(wlr_renderer);
struct wlr_egl_context prev_ctx = {0};
if (!wlr_egl_make_current(renderer->egl, &prev_ctx)) {
@ -255,7 +255,7 @@ static struct wlr_render_pass *gles2_begin_buffer_pass(struct wlr_renderer *wlr_
GLuint wlr_gles2_renderer_get_buffer_fbo(struct wlr_renderer *wlr_renderer,
struct wlr_buffer *wlr_buffer) {
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
struct wlr_gles2_renderer *renderer = wlr_gles2_renderer_from_renderer(wlr_renderer);
GLuint fbo = 0;
struct wlr_egl_context prev_ctx = {0};
@ -273,7 +273,7 @@ GLuint wlr_gles2_renderer_get_buffer_fbo(struct wlr_renderer *wlr_renderer,
}
static struct wlr_render_timer *gles2_render_timer_create(struct wlr_renderer *wlr_renderer) {
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
struct wlr_gles2_renderer *renderer = wlr_gles2_renderer_from_renderer(wlr_renderer);
if (!renderer->exts.EXT_disjoint_timer_query) {
wlr_log(WLR_ERROR, "can't create timer, EXT_disjoint_timer_query not available");
return NULL;
@ -354,7 +354,7 @@ static const struct wlr_render_timer_impl render_timer_impl = {
.destroy = gles2_render_timer_destroy,
};
void push_gles2_debug_(struct wlr_gles2_renderer *renderer,
void wlr_gles2_push_debug_(struct wlr_gles2_renderer *renderer,
const char *file, const char *func) {
if (!renderer->procs.glPushDebugGroupKHR) {
return;
@ -366,7 +366,7 @@ void push_gles2_debug_(struct wlr_gles2_renderer *renderer,
renderer->procs.glPushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION_KHR, 1, -1, str);
}
void pop_gles2_debug(struct wlr_gles2_renderer *renderer) {
void wlr_gles2_pop_debug(struct wlr_gles2_renderer *renderer) {
if (renderer->procs.glPopDebugGroupKHR) {
renderer->procs.glPopDebugGroupKHR();
}
@ -394,7 +394,7 @@ static void gles2_log(GLenum src, GLenum type, GLuint id, GLenum severity,
static GLuint compile_shader(struct wlr_gles2_renderer *renderer,
GLenum type, const GLchar *src) {
push_gles2_debug(renderer);
wlr_gles2_push_debug(renderer);
GLuint shader = glCreateShader(type);
glShaderSource(shader, 1, &src, NULL);
@ -408,13 +408,13 @@ static GLuint compile_shader(struct wlr_gles2_renderer *renderer,
shader = 0;
}
pop_gles2_debug(renderer);
wlr_gles2_pop_debug(renderer);
return shader;
}
GLuint gles2_link_program(struct wlr_gles2_renderer *renderer,
GLuint wlr_gles2_link_program(struct wlr_gles2_renderer *renderer,
const GLchar *vert_src, const GLchar *frag_src) {
push_gles2_debug(renderer);
wlr_gles2_push_debug(renderer);
GLuint vert = compile_shader(renderer, GL_VERTEX_SHADER, vert_src);
if (!vert) {
@ -445,11 +445,11 @@ GLuint gles2_link_program(struct wlr_gles2_renderer *renderer,
goto error;
}
pop_gles2_debug(renderer);
wlr_gles2_pop_debug(renderer);
return prog;
error:
pop_gles2_debug(renderer);
wlr_gles2_pop_debug(renderer);
return 0;
}
@ -631,6 +631,6 @@ struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl) {
bool wlr_gles2_renderer_check_ext(struct wlr_renderer *wlr_renderer,
const char *ext) {
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
struct wlr_gles2_renderer *renderer = wlr_gles2_renderer_from_renderer(wlr_renderer);
return check_gl_ext(renderer->exts_str, ext);
}