diff options
author | Manuel Stoeckl <code@mstoeckl.com> | 2021-07-29 23:55:57 -0400 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-07-30 08:29:13 +0200 |
commit | f5df956c18634e501d878531858ed75391fec644 (patch) | |
tree | b395903b9356ffee40e61e51e3cb757c4f73c6c0 | |
parent | 44e8451cd93ede3ebef0bab44af874c07c9fde42 (diff) |
render/gles2: add a few 10-bit and FP16 formats
The half-float formats depend on GL_OES_texture_half_float_linear,
not just the GL_OES_texture_half_float extension, because the latter
does not include support for linear magni/minification filters.
The new 2101010 and 16161616F formats are only available on little-
endian builds, since their gl_types are larger than a byte and thus
endianness dependent.
-rw-r--r-- | include/render/gles2.h | 2 | ||||
-rw-r--r-- | render/gles2/pixel_format.c | 33 | ||||
-rw-r--r-- | render/gles2/renderer.c | 6 |
3 files changed, 40 insertions, 1 deletions
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, |