diff --git a/include/render/gles2.h b/include/render/gles2.h index 68fbb40e..cc5a2808 100644 --- a/include/render/gles2.h +++ b/include/render/gles2.h @@ -43,6 +43,8 @@ struct wlr_gles2_renderer { bool KHR_debug; bool OES_egl_image_external; bool OES_egl_image; + bool EXT_texture_type_2_10_10_10_REV; + bool OES_texture_half_float_linear; } exts; struct { diff --git a/render/gles2/pixel_format.c b/render/gles2/pixel_format.c index ceb8dadd..31bb3908 100644 --- a/render/gles2/pixel_format.c +++ b/render/gles2/pixel_format.c @@ -69,7 +69,30 @@ static const struct wlr_gles2_pixel_format formats[] = { .gl_type = GL_UNSIGNED_SHORT_5_6_5, .has_alpha = false, }, - // TODO: EXT_texture_type_2_10_10_10_REV support + { + .drm_format = DRM_FORMAT_XBGR2101010, + .gl_format = GL_RGBA, + .gl_type = GL_UNSIGNED_INT_2_10_10_10_REV_EXT, + .has_alpha = false, + }, + { + .drm_format = DRM_FORMAT_ABGR2101010, + .gl_format = GL_RGBA, + .gl_type = GL_UNSIGNED_INT_2_10_10_10_REV_EXT, + .has_alpha = true, + }, + { + .drm_format = DRM_FORMAT_XBGR16161616F, + .gl_format = GL_RGBA, + .gl_type = GL_HALF_FLOAT_OES, + .has_alpha = false, + }, + { + .drm_format = DRM_FORMAT_ABGR16161616F, + .gl_format = GL_RGBA, + .gl_type = GL_HALF_FLOAT_OES, + .has_alpha = true, + }, #endif }; @@ -77,6 +100,14 @@ static const struct wlr_gles2_pixel_format formats[] = { bool is_gles2_pixel_format_supported(const struct wlr_gles2_renderer *renderer, const struct wlr_gles2_pixel_format *format) { + if (format->gl_type == GL_UNSIGNED_INT_2_10_10_10_REV_EXT + && !renderer->exts.EXT_texture_type_2_10_10_10_REV) { + return false; + } + if (format->gl_type == GL_HALF_FLOAT_OES + && !renderer->exts.OES_texture_half_float_linear) { + return false; + } if (format->gl_format == GL_BGRA_EXT && !renderer->exts.EXT_read_format_bgra) { return false; diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c index 509d39d2..9ae6e2bb 100644 --- a/render/gles2/renderer.c +++ b/render/gles2/renderer.c @@ -749,6 +749,12 @@ struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl) { renderer->exts.EXT_read_format_bgra = check_gl_ext(exts_str, "GL_EXT_read_format_bgra"); + renderer->exts.EXT_texture_type_2_10_10_10_REV = + check_gl_ext(exts_str, "GL_EXT_texture_type_2_10_10_10_REV"); + + renderer->exts.OES_texture_half_float_linear = + check_gl_ext(exts_str, "GL_OES_texture_half_float_linear"); + if (check_gl_ext(exts_str, "GL_KHR_debug")) { renderer->exts.KHR_debug = true; load_gl_proc(&renderer->procs.glDebugMessageCallbackKHR,