mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-13 08:22:16 -04:00
examples: add render-pass-ext exmaple
This commit is contained in:
parent
53630a0a60
commit
393f96274a
14 changed files with 705 additions and 0 deletions
95
examples/render-pass-ext/triangle_pass.c
Normal file
95
examples/render-pass-ext/triangle_pass.c
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
#include <assert.h>
|
||||
#include <wlr/config.h>
|
||||
#include <wlr/render/pixman.h>
|
||||
#include <wlr/render/pass.h>
|
||||
#if WLR_HAS_GLES2_RENDERER
|
||||
#include <wlr/render/gles2.h>
|
||||
#endif
|
||||
#if WLR_HAS_VULKAN_RENDERER
|
||||
#include <wlr/render/vulkan.h>
|
||||
#endif
|
||||
#include <wlr/render/interface.h>
|
||||
#include <wlr/util/log.h>
|
||||
|
||||
#include "triangle_pass.h"
|
||||
#include "pixman/triangle_pass.h"
|
||||
#if WLR_HAS_GLES2_RENDERER
|
||||
#include "gles2/triangle_pass.h"
|
||||
#endif
|
||||
|
||||
void render_triangle_pass_init(struct render_triangle_pass *pass,
|
||||
const struct render_triangle_pass_impl *impl) {
|
||||
assert(impl->render);
|
||||
*pass = (struct render_triangle_pass){
|
||||
.impl = impl,
|
||||
};
|
||||
|
||||
wl_signal_init(&pass->events.destroy);
|
||||
}
|
||||
|
||||
void render_triangle_pass_destroy(struct render_triangle_pass *pass) {
|
||||
if (pass == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
pass->impl->destroy(pass);
|
||||
}
|
||||
|
||||
struct render_triangle_pass *get_or_create_render_triangle_pass(
|
||||
struct wlr_renderer *renderer) {
|
||||
if (renderer == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (renderer->data == NULL) {
|
||||
struct render_triangle_pass *pass = NULL;
|
||||
if (wlr_renderer_is_pixman(renderer)) {
|
||||
pass = pixman_render_triangle_pass_create(renderer);
|
||||
}
|
||||
|
||||
#if WLR_HAS_GLES2_RENDERER
|
||||
else if (wlr_renderer_is_gles2(renderer)) {
|
||||
pass = gles2_render_triangle_pass_create(renderer);
|
||||
}
|
||||
#endif
|
||||
|
||||
// #if WLR_HAS_VULKAN_RENDERER
|
||||
// else if (wlr_renderer_is_vk(renderer)) {
|
||||
// pass = wlr_vk_render_triangle_pass_create(renderer);
|
||||
// }
|
||||
// #endif
|
||||
|
||||
renderer->data = pass;
|
||||
return pass;
|
||||
} else {
|
||||
return renderer->data;
|
||||
}
|
||||
}
|
||||
|
||||
void render_triangle_pass_add(struct wlr_render_pass *render_pass,
|
||||
const struct custom_render_triangle_options *options) {
|
||||
struct wlr_renderer *renderer =
|
||||
wlr_get_wlr_renderer_from_render_pass(render_pass);
|
||||
|
||||
struct render_triangle_pass *pass = renderer->data;
|
||||
if (pass == NULL) {
|
||||
wlr_log(WLR_ERROR, "No triangle pass is available for this renderer");
|
||||
return;
|
||||
}
|
||||
return pass->impl->render(render_pass, options);
|
||||
}
|
||||
|
||||
void custom_render_triangle_options_get_box(const struct custom_render_triangle_options *options,
|
||||
const struct wlr_buffer *buffer, struct wlr_box *box) {
|
||||
if (wlr_box_empty(&options->box)) {
|
||||
*box = (struct wlr_box){
|
||||
.width = buffer->width,
|
||||
.height = buffer->height,
|
||||
};
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
*box = options->box;
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue