summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Langdale <philipl@overt.org>2021-11-05 20:05:42 -0700
committerPhilip Langdale <github.philipl@overt.org>2021-11-10 09:57:58 -0800
commit2b9d8ae8b146f459da8647360d148c54cc72bc7e (patch)
treece7b6fcad6355d8e7e76561c2100e39b272517a0
parent10d677575a0e6ea3deb7b824559535df6d5ed6d3 (diff)
downloadmpv-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.
-rw-r--r--video/out/drm_common.c4
-rw-r--r--video/out/drm_common.h2
-rw-r--r--video/out/opengl/context_drm_egl.c31
3 files changed, 34 insertions, 3 deletions
diff --git a/video/out/drm_common.c b/video/out/drm_common.c
index 5e730c3833..aa86b7750b 100644
--- a/video/out/drm_common.c
+++ b/video/out/drm_common.c
@@ -90,7 +90,9 @@ const struct m_sub_options drm_conf = {
M_RANGE(0, INT_MAX)},
{"drm-format", OPT_CHOICE(drm_format,
{"xrgb8888", DRM_OPTS_FORMAT_XRGB8888},
- {"xrgb2101010", DRM_OPTS_FORMAT_XRGB2101010})},
+ {"xrgb2101010", DRM_OPTS_FORMAT_XRGB2101010},
+ {"xbgr8888", DRM_OPTS_FORMAT_XBGR8888},
+ {"xbgr2101010", DRM_OPTS_FORMAT_XBGR2101010})},
{"drm-draw-surface-size", OPT_SIZE_BOX(drm_draw_surface_size)},
{"drm-osd-plane-id", OPT_REPLACED("drm-draw-plane")},
diff --git a/video/out/drm_common.h b/video/out/drm_common.h
index 5aa3681ea8..d8a550e4f1 100644
--- a/video/out/drm_common.h
+++ b/video/out/drm_common.h
@@ -26,6 +26,8 @@
#define DRM_OPTS_FORMAT_XRGB8888 0
#define DRM_OPTS_FORMAT_XRGB2101010 1
+#define DRM_OPTS_FORMAT_XBGR8888 2
+#define DRM_OPTS_FORMAT_XBGR2101010 3
struct kms {
struct mp_log *log;
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)) {