diff options
author | Philip Langdale <philipl@overt.org> | 2021-11-05 20:05:42 -0700 |
---|---|---|
committer | Philip Langdale <github.philipl@overt.org> | 2021-11-10 09:57:58 -0800 |
commit | 2b9d8ae8b146f459da8647360d148c54cc72bc7e (patch) | |
tree | ce7b6fcad6355d8e7e76561c2100e39b272517a0 /video/out/opengl | |
parent | 10d677575a0e6ea3deb7b824559535df6d5ed6d3 (diff) | |
download | mpv-2b9d8ae8b146f459da8647360d148c54cc72bc7e.tar.bz2 mpv-2b9d8ae8b146f459da8647360d148c54cc72bc7e.tar.xz |
context_drm_egl: add support for BGR surface formats
The new GBM supporting nvidia drivers declare support for 10bit
surfaces using BGR ordering, rather than RGB, so add support for them.
We've also seen examples of hardware supporting BGR8888 but not
RGB8888 so let's support those too.
Of course, the nvidia EGL driver doesn't publish support for any 10bit
formats so you can't actually do 10bit display. Perhaps they'll
eventually fix that.
Diffstat (limited to 'video/out/opengl')
-rw-r--r-- | video/out/opengl/context_drm_egl.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/video/out/opengl/context_drm_egl.c b/video/out/opengl/context_drm_egl.c index cb98c14616..77283c9ddd 100644 --- a/video/out/opengl/context_drm_egl.c +++ b/video/out/opengl/context_drm_egl.c @@ -119,10 +119,18 @@ static const char *gbm_format_to_string(uint32_t format) return "GBM_FORMAT_XRGB8888"; case GBM_FORMAT_ARGB8888: return "GBM_FORMAT_ARGB8888"; + case GBM_FORMAT_XBGR8888: + return "GBM_FORMAT_XBGR8888"; + case GBM_FORMAT_ABGR8888: + return "GBM_FORMAT_ABGR8888"; case GBM_FORMAT_XRGB2101010: return "GBM_FORMAT_XRGB2101010"; case GBM_FORMAT_ARGB2101010: return "GBM_FORMAT_ARGB2101010"; + case GBM_FORMAT_XBGR2101010: + return "GBM_FORMAT_XBGR2101010"; + case GBM_FORMAT_ABGR2101010: + return "GBM_FORMAT_ABGR2101010"; default: return "UNKNOWN"; } @@ -139,10 +147,18 @@ static uint32_t fallback_format_for(uint32_t format) return GBM_FORMAT_ARGB8888; case GBM_FORMAT_ARGB8888: return GBM_FORMAT_XRGB8888; + case GBM_FORMAT_XBGR8888: + return GBM_FORMAT_ABGR8888; + case GBM_FORMAT_ABGR8888: + return GBM_FORMAT_XBGR8888; case GBM_FORMAT_XRGB2101010: return GBM_FORMAT_ARGB2101010; case GBM_FORMAT_ARGB2101010: return GBM_FORMAT_XRGB2101010; + case GBM_FORMAT_XBGR2101010: + return GBM_FORMAT_ABGR2101010; + case GBM_FORMAT_ABGR2101010: + return GBM_FORMAT_XBGR2101010; default: return 0; } @@ -840,12 +856,23 @@ static bool drm_egl_init(struct ra_ctx *ctx) uint32_t argb_format; uint32_t xrgb_format; - if (DRM_OPTS_FORMAT_XRGB2101010 == ctx->vo->opts->drm_opts->drm_format) { + switch (ctx->vo->opts->drm_opts->drm_format) { + case DRM_OPTS_FORMAT_XRGB2101010: argb_format = GBM_FORMAT_ARGB2101010; xrgb_format = GBM_FORMAT_XRGB2101010; - } else { + break; + case DRM_OPTS_FORMAT_XBGR2101010: + argb_format = GBM_FORMAT_ABGR2101010; + xrgb_format = GBM_FORMAT_XBGR2101010; + break; + case DRM_OPTS_FORMAT_XBGR8888: + argb_format = GBM_FORMAT_ABGR8888; + xrgb_format = GBM_FORMAT_XBGR8888; + break; + default: argb_format = GBM_FORMAT_ARGB8888; xrgb_format = GBM_FORMAT_XRGB8888; + break; } if (!probe_gbm_format(ctx, argb_format, xrgb_format)) { |