mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-12-02 01:05:58 +01:00
render/gles2: provide public API to access GL texture
Prior to this commit, compositors needed to render the texture to an
intermediate off-screen buffer using wlr_renderer APIs if they wanted to
use a custom rendering path (e.g. render to a 3D scene).
A new wlr_gles2_texture_get_attribs exposes the GL texture target and ID
so that compositors can render wlr_textures with their own shaders. An
example of a compositor doing so is available at [1].
[1]: 3db905b784/src/render.c (L227)
This commit is contained in:
parent
eaa98f6aff
commit
447835afc1
2 changed files with 28 additions and 1 deletions
|
@ -9,6 +9,7 @@
|
||||||
#ifndef WLR_RENDER_GLES2_H
|
#ifndef WLR_RENDER_GLES2_H
|
||||||
#define WLR_RENDER_GLES2_H
|
#define WLR_RENDER_GLES2_H
|
||||||
|
|
||||||
|
#include <GLES2/gl2.h>
|
||||||
#include <wlr/backend.h>
|
#include <wlr/backend.h>
|
||||||
#include <wlr/render/wlr_renderer.h>
|
#include <wlr/render/wlr_renderer.h>
|
||||||
|
|
||||||
|
@ -24,4 +25,16 @@ struct wlr_texture *wlr_gles2_texture_from_wl_drm(struct wlr_egl *egl,
|
||||||
struct wlr_texture *wlr_gles2_texture_from_dmabuf(struct wlr_egl *egl,
|
struct wlr_texture *wlr_gles2_texture_from_dmabuf(struct wlr_egl *egl,
|
||||||
struct wlr_dmabuf_attributes *attribs);
|
struct wlr_dmabuf_attributes *attribs);
|
||||||
|
|
||||||
|
struct wlr_gles2_texture_attribs {
|
||||||
|
GLenum target; /* either GL_TEXTURE_2D or GL_TEXTURE_EXTERNAL_OES */
|
||||||
|
GLuint tex;
|
||||||
|
|
||||||
|
bool inverted_y;
|
||||||
|
bool has_alpha;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool wlr_texture_is_gles2(struct wlr_texture *texture);
|
||||||
|
void wlr_gles2_texture_get_attribs(struct wlr_texture *texture,
|
||||||
|
struct wlr_gles2_texture_attribs *attribs);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -17,9 +17,13 @@
|
||||||
|
|
||||||
static const struct wlr_texture_impl texture_impl;
|
static const struct wlr_texture_impl texture_impl;
|
||||||
|
|
||||||
|
bool wlr_texture_is_gles2(struct wlr_texture *wlr_texture) {
|
||||||
|
return wlr_texture->impl == &texture_impl;
|
||||||
|
}
|
||||||
|
|
||||||
struct wlr_gles2_texture *gles2_get_texture(
|
struct wlr_gles2_texture *gles2_get_texture(
|
||||||
struct wlr_texture *wlr_texture) {
|
struct wlr_texture *wlr_texture) {
|
||||||
assert(wlr_texture->impl == &texture_impl);
|
assert(wlr_texture_is_gles2(wlr_texture));
|
||||||
return (struct wlr_gles2_texture *)wlr_texture;
|
return (struct wlr_gles2_texture *)wlr_texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,3 +295,13 @@ struct wlr_texture *wlr_gles2_texture_from_dmabuf(struct wlr_egl *egl,
|
||||||
POP_GLES2_DEBUG;
|
POP_GLES2_DEBUG;
|
||||||
return &texture->wlr_texture;
|
return &texture->wlr_texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wlr_gles2_texture_get_attribs(struct wlr_texture *wlr_texture,
|
||||||
|
struct wlr_gles2_texture_attribs *attribs) {
|
||||||
|
struct wlr_gles2_texture *texture = gles2_get_texture(wlr_texture);
|
||||||
|
memset(attribs, 0, sizeof(*attribs));
|
||||||
|
attribs->target = texture->target;
|
||||||
|
attribs->tex = texture->tex;
|
||||||
|
attribs->inverted_y = texture->inverted_y;
|
||||||
|
attribs->has_alpha = texture->has_alpha;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue