Add a new renderer API

Goals:

- Extensibility: we need to be able to add new params to the calls
  to render a texture/rect. For instance we'll need to add fences to
  the render texture operation for explicit sync purposes.
- No implicit state: no more bind_buffer, begin, end.
- No matrices: these hurt Pixman and we don't need them.
- Clip regions for optimized damage repainting.

Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3188
This commit is contained in:
Simon Ser 2022-06-21 22:39:29 +02:00
parent 17ad034480
commit 756dedae20
5 changed files with 126 additions and 5 deletions

View file

@ -8,6 +8,7 @@ endif
wlr_files += files(
'dmabuf.c',
'drm_format_set.c',
'pass.c',
'pixel_format.c',
'swapchain.c',
'wlr_renderer.c',

25
render/pass.c Normal file
View file

@ -0,0 +1,25 @@
#include <assert.h>
#include <string.h>
#include <wlr/render/interface.h>
#include <wlr/render/wlr_renderer.h>
void wlr_render_pass_init(struct wlr_render_pass *render_pass,
const struct wlr_render_pass_impl *impl) {
assert(impl->submit && impl->add_texture && impl->add_rect);
memset(render_pass, 0, sizeof(*render_pass));
render_pass->impl = impl;
}
bool wlr_render_pass_submit(struct wlr_render_pass *render_pass) {
return render_pass->impl->submit(render_pass);
}
void wlr_render_pass_add_texture(struct wlr_render_pass *render_pass,
const struct wlr_render_texture_options *options) {
render_pass->impl->add_texture(render_pass, options);
}
void wlr_render_pass_add_rect(struct wlr_render_pass *render_pass,
const struct wlr_render_rect_options *options) {
render_pass->impl->add_rect(render_pass, options);
}

View file

@ -33,11 +33,13 @@
void wlr_renderer_init(struct wlr_renderer *renderer,
const struct wlr_renderer_impl *impl) {
assert(impl->begin);
assert(impl->clear);
assert(impl->scissor);
assert(impl->render_subtexture_with_matrix);
assert(impl->render_quad_with_matrix);
if (!impl->begin_buffer_pass) {
assert(impl->begin);
assert(impl->clear);
assert(impl->scissor);
assert(impl->render_subtexture_with_matrix);
assert(impl->render_quad_with_matrix);
}
assert(impl->get_shm_texture_formats);
assert(impl->get_render_buffer_caps);
@ -409,3 +411,11 @@ int wlr_renderer_get_drm_fd(struct wlr_renderer *r) {
}
return r->impl->get_drm_fd(r);
}
struct wlr_render_pass *wlr_renderer_begin_buffer_pass(
struct wlr_renderer *renderer, struct wlr_buffer *buffer) {
if (!renderer->impl->begin_buffer_pass) {
return NULL;
}
return renderer->impl->begin_buffer_pass(renderer, buffer);
}