aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/render/gles2.h3
-rw-r--r--render/gles2/pixel_format.c18
-rw-r--r--render/gles2/renderer.c3
-rw-r--r--render/gles2/texture.c7
-rw-r--r--render/pixel_format.c12
5 files changed, 42 insertions, 1 deletions
diff --git a/include/render/gles2.h b/include/render/gles2.h
index 245b2804..714bacf5 100644
--- a/include/render/gles2.h
+++ b/include/render/gles2.h
@@ -17,6 +17,8 @@
struct wlr_gles2_pixel_format {
uint32_t drm_format;
+ // optional field, if empty then internalformat = format
+ GLint gl_internalformat;
GLint gl_format, gl_type;
bool has_alpha;
};
@@ -45,6 +47,7 @@ struct wlr_gles2_renderer {
bool OES_egl_image;
bool EXT_texture_type_2_10_10_10_REV;
bool OES_texture_half_float_linear;
+ bool EXT_texture_norm16;
} exts;
struct {
diff --git a/render/gles2/pixel_format.c b/render/gles2/pixel_format.c
index b155bbbe..acaac5ce 100644
--- a/render/gles2/pixel_format.c
+++ b/render/gles2/pixel_format.c
@@ -93,6 +93,20 @@ static const struct wlr_gles2_pixel_format formats[] = {
.gl_type = GL_HALF_FLOAT_OES,
.has_alpha = true,
},
+ {
+ .drm_format = DRM_FORMAT_XBGR16161616,
+ .gl_internalformat = GL_RGBA16_EXT,
+ .gl_format = GL_RGBA,
+ .gl_type = GL_UNSIGNED_SHORT,
+ .has_alpha = false,
+ },
+ {
+ .drm_format = DRM_FORMAT_ABGR16161616,
+ .gl_internalformat = GL_RGBA16_EXT,
+ .gl_format = GL_RGBA,
+ .gl_type = GL_UNSIGNED_SHORT,
+ .has_alpha = true,
+ },
#endif
};
@@ -112,6 +126,10 @@ bool is_gles2_pixel_format_supported(const struct wlr_gles2_renderer *renderer,
&& !renderer->exts.OES_texture_half_float_linear) {
return false;
}
+ if (format->gl_type == GL_UNSIGNED_SHORT
+ && !renderer->exts.EXT_texture_norm16) {
+ return false;
+ }
/*
* Note that we don't need to check for GL_EXT_texture_format_BGRA8888
* here, since we've already checked if we have it at renderer creation
diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c
index 67b8ead4..5ffd6f85 100644
--- a/render/gles2/renderer.c
+++ b/render/gles2/renderer.c
@@ -765,6 +765,9 @@ struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl) {
renderer->exts.OES_texture_half_float_linear =
check_gl_ext(exts_str, "GL_OES_texture_half_float_linear");
+ renderer->exts.EXT_texture_norm16 =
+ check_gl_ext(exts_str, "GL_EXT_texture_norm16");
+
if (check_gl_ext(exts_str, "GL_KHR_debug")) {
renderer->exts.KHR_debug = true;
load_gl_proc(&renderer->procs.glDebugMessageCallbackKHR,
diff --git a/render/gles2/texture.c b/render/gles2/texture.c
index 8d6f3fc2..57420744 100644
--- a/render/gles2/texture.c
+++ b/render/gles2/texture.c
@@ -210,6 +210,11 @@ static struct wlr_texture *gles2_texture_from_pixels(
texture->has_alpha = fmt->has_alpha;
texture->drm_format = fmt->drm_format;
+ GLint internal_format = fmt->gl_internalformat;
+ if (!internal_format) {
+ internal_format = fmt->gl_format;
+ }
+
struct wlr_egl_context prev_ctx;
wlr_egl_save_context(&prev_ctx);
wlr_egl_make_current(renderer->egl);
@@ -222,7 +227,7 @@ static struct wlr_texture *gles2_texture_from_pixels(
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, stride / (drm_fmt->bpp / 8));
- glTexImage2D(GL_TEXTURE_2D, 0, fmt->gl_format, width, height, 0,
+ glTexImage2D(GL_TEXTURE_2D, 0, internal_format, width, height, 0,
fmt->gl_format, fmt->gl_type, data);
glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, 0);
diff --git a/render/pixel_format.c b/render/pixel_format.c
index bd59af8b..e6417fd7 100644
--- a/render/pixel_format.c
+++ b/render/pixel_format.c
@@ -128,6 +128,18 @@ static const struct wlr_pixel_format_info pixel_format_info[] = {
.bpp = 64,
.has_alpha = true,
},
+ {
+ .drm_format = DRM_FORMAT_XBGR16161616,
+ .opaque_substitute = DRM_FORMAT_INVALID,
+ .bpp = 64,
+ .has_alpha = false,
+ },
+ {
+ .drm_format = DRM_FORMAT_ABGR16161616,
+ .opaque_substitute = DRM_FORMAT_XBGR16161616,
+ .bpp = 64,
+ .has_alpha = true,
+ },
};
static const size_t pixel_format_info_size =