mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-29 16:05:59 +01:00
render/gles2: hide shm formats without GL support
This change introduces a new function to check whether the renderer has the needed GL extensions to read a given pixel format.
This commit is contained in:
parent
4dc52bcb6c
commit
44e8451cd9
3 changed files with 26 additions and 13 deletions
|
@ -109,10 +109,14 @@ struct wlr_gles2_texture {
|
||||||
struct wl_listener buffer_destroy;
|
struct wl_listener buffer_destroy;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
bool is_gles2_pixel_format_supported(const struct wlr_gles2_renderer *renderer,
|
||||||
|
const struct wlr_gles2_pixel_format *format);
|
||||||
const struct wlr_gles2_pixel_format *get_gles2_format_from_drm(uint32_t fmt);
|
const struct wlr_gles2_pixel_format *get_gles2_format_from_drm(uint32_t fmt);
|
||||||
const struct wlr_gles2_pixel_format *get_gles2_format_from_gl(
|
const struct wlr_gles2_pixel_format *get_gles2_format_from_gl(
|
||||||
GLint gl_format, GLint gl_type, bool alpha);
|
GLint gl_format, GLint gl_type, bool alpha);
|
||||||
const uint32_t *get_gles2_shm_formats(size_t *len);
|
const uint32_t *get_gles2_shm_formats(const struct wlr_gles2_renderer *renderer,
|
||||||
|
size_t *len);
|
||||||
|
|
||||||
struct wlr_gles2_renderer *gles2_get_renderer(
|
struct wlr_gles2_renderer *gles2_get_renderer(
|
||||||
struct wlr_renderer *wlr_renderer);
|
struct wlr_renderer *wlr_renderer);
|
||||||
|
|
|
@ -75,6 +75,15 @@ static const struct wlr_gles2_pixel_format formats[] = {
|
||||||
|
|
||||||
// TODO: more pixel formats
|
// TODO: more pixel formats
|
||||||
|
|
||||||
|
bool is_gles2_pixel_format_supported(const struct wlr_gles2_renderer *renderer,
|
||||||
|
const struct wlr_gles2_pixel_format *format) {
|
||||||
|
if (format->gl_format == GL_BGRA_EXT
|
||||||
|
&& !renderer->exts.EXT_read_format_bgra) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
const struct wlr_gles2_pixel_format *get_gles2_format_from_drm(uint32_t fmt) {
|
const struct wlr_gles2_pixel_format *get_gles2_format_from_drm(uint32_t fmt) {
|
||||||
for (size_t i = 0; i < sizeof(formats) / sizeof(*formats); ++i) {
|
for (size_t i = 0; i < sizeof(formats) / sizeof(*formats); ++i) {
|
||||||
if (formats[i].drm_format == fmt) {
|
if (formats[i].drm_format == fmt) {
|
||||||
|
@ -96,11 +105,16 @@ const struct wlr_gles2_pixel_format *get_gles2_format_from_gl(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t *get_gles2_shm_formats(size_t *len) {
|
const uint32_t *get_gles2_shm_formats(const struct wlr_gles2_renderer *renderer,
|
||||||
|
size_t *len) {
|
||||||
static uint32_t shm_formats[sizeof(formats) / sizeof(formats[0])];
|
static uint32_t shm_formats[sizeof(formats) / sizeof(formats[0])];
|
||||||
*len = sizeof(formats) / sizeof(formats[0]);
|
size_t j = 0;
|
||||||
for (size_t i = 0; i < sizeof(formats) / sizeof(formats[0]); i++) {
|
for (size_t i = 0; i < sizeof(formats) / sizeof(formats[0]); i++) {
|
||||||
shm_formats[i] = formats[i].drm_format;
|
if (!is_gles2_pixel_format_supported(renderer, &formats[i])) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
shm_formats[j++] = formats[i].drm_format;
|
||||||
|
}
|
||||||
|
*len = j;
|
||||||
return shm_formats;
|
return shm_formats;
|
||||||
}
|
}
|
||||||
|
|
|
@ -376,7 +376,8 @@ static void gles2_render_quad_with_matrix(struct wlr_renderer *wlr_renderer,
|
||||||
|
|
||||||
static const uint32_t *gles2_get_shm_texture_formats(
|
static const uint32_t *gles2_get_shm_texture_formats(
|
||||||
struct wlr_renderer *wlr_renderer, size_t *len) {
|
struct wlr_renderer *wlr_renderer, size_t *len) {
|
||||||
return get_gles2_shm_formats(len);
|
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
|
||||||
|
return get_gles2_shm_formats(renderer, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct wlr_drm_format_set *gles2_get_dmabuf_texture_formats(
|
static const struct wlr_drm_format_set *gles2_get_dmabuf_texture_formats(
|
||||||
|
@ -431,14 +432,8 @@ static bool gles2_read_pixels(struct wlr_renderer *wlr_renderer,
|
||||||
|
|
||||||
const struct wlr_gles2_pixel_format *fmt =
|
const struct wlr_gles2_pixel_format *fmt =
|
||||||
get_gles2_format_from_drm(drm_format);
|
get_gles2_format_from_drm(drm_format);
|
||||||
if (fmt == NULL) {
|
if (fmt == NULL || !is_gles2_pixel_format_supported(renderer, fmt)) {
|
||||||
wlr_log(WLR_ERROR, "Cannot read pixels: unsupported pixel format");
|
wlr_log(WLR_ERROR, "Cannot read pixels: unsupported pixel format 0x%"PRIX32, drm_format);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fmt->gl_format == GL_BGRA_EXT && !renderer->exts.EXT_read_format_bgra) {
|
|
||||||
wlr_log(WLR_ERROR,
|
|
||||||
"Cannot read pixels: missing GL_EXT_read_format_bgra extension");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue