aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Stoeckl <code@mstoeckl.com>2021-07-29 23:55:57 -0400
committerSimon Ser <contact@emersion.fr>2021-07-30 08:29:13 +0200
commitf5df956c18634e501d878531858ed75391fec644 (patch)
treeb395903b9356ffee40e61e51e3cb757c4f73c6c0
parent44e8451cd93ede3ebef0bab44af874c07c9fde42 (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.h2
-rw-r--r--render/gles2/pixel_format.c33
-rw-r--r--render/gles2/renderer.c6
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,