mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-19 06:47:02 -04:00
examples: add render-pass-ext exmaple
This commit is contained in:
parent
fce738d78d
commit
77e2b0ad07
20 changed files with 1082 additions and 0 deletions
98
examples/render-pass-ext/triangle_pass.c
Normal file
98
examples/render-pass-ext/triangle_pass.c
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
#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
|
||||
#if WLR_HAS_VULKAN_RENDERER
|
||||
#include "vulkan/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 = 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