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.
This commit is contained in:
parent
44e8451cd9
commit
f5df956c18
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue