xserver: Branch 'master'
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Oct 31 14:59:26 UTC 2023
hw/xwayland/xwayland-glamor-gbm.c | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
New commits:
commit 5fdd3125b4fe843091145f2b97c338198e8da7f1
Author: Konstantin <ria.freelander at gmail.com>
Date: Tue Oct 3 11:50:10 2023 +0300
xwayland/glamor/gbm: use GBM_FORMAT_ARGB8888 for 24-bit on ES
On Mesa, when we request GBM_FORMAT_XRGB8888, driver set surface storage
format to GL_RGB8, which breaks GL ES rendering (on any GL ES version).
If we force set gbm_format to GBM_FORMAT_ARGB8888, then rendering
will happen and working.
Fixes #1288
Fixes #1356
diff --git a/hw/xwayland/xwayland-glamor-gbm.c b/hw/xwayland/xwayland-glamor-gbm.c
index cfcd39a35..fca476b86 100644
--- a/hw/xwayland/xwayland-glamor-gbm.c
+++ b/hw/xwayland/xwayland-glamor-gbm.c
@@ -62,6 +62,7 @@ struct xwl_gbm_private {
Bool drm_authenticated;
uint32_t capabilities;
int dmabuf_capable;
+ Bool glamor_gles;
};
struct xwl_pixmap {
@@ -82,13 +83,25 @@ xwl_gbm_get(struct xwl_screen *xwl_screen)
&xwl_gbm_private_key);
}
+/* There is a workaround for Mesa behaviour, which will cause black windows
+ * when RGBX formats is using. Why exactly? There is an explanation:
+ * 1. We create GL_RGBA texture with GL_UNSIGNED_BYTE type, all allowed by ES.
+ * 2 .We export these texture to GBM bo with GBM_FORMAT_XRGB8888, and Mesa sets internal
+ * format of these textures as GL_RGB8 (mesa/mesa!5034 (merged))
+ * 3. We import these BO at some point, and use glTexSubImage on it with GL_RGBA format
+ * and with GL_UNSIGNED_BYTE type, as we creates. Mesa checks its internalformat
+ * in glTexSubImage2D and fails due to GLES internal format limitation
+ * (see https://registry.khronos.org/OpenGL/specs/es/2.0/es_full_spec_2.0.pdf, section 3.7.1).
+ */
static uint32_t
-gbm_format_for_depth(int depth)
+gbm_format_for_depth(int depth, int gles)
{
switch (depth) {
case 16:
return GBM_FORMAT_RGB565;
case 24:
+ if (gles)
+ return GBM_FORMAT_ARGB8888;
return GBM_FORMAT_XRGB8888;
case 30:
return GBM_FORMAT_ARGB2101010;
@@ -291,7 +304,7 @@ xwl_glamor_gbm_create_pixmap_internal(struct xwl_screen *xwl_screen,
(hint == CREATE_PIXMAP_USAGE_BACKING_PIXMAP ||
hint == CREATE_PIXMAP_USAGE_SHARED ||
(xwl_screen->rootless && hint == 0))) {
- uint32_t format = gbm_format_for_depth(depth);
+ uint32_t format = gbm_format_for_depth(depth, xwl_gbm->glamor_gles);
Bool implicit = FALSE;
#ifdef GBM_BO_WITH_MODIFIERS
@@ -710,7 +723,7 @@ glamor_pixmap_from_fds(ScreenPtr screen, CARD8 num_fds, const int *fds,
data.width = width;
data.height = height;
data.num_fds = num_fds;
- data.format = gbm_format_for_depth(depth);
+ data.format = gbm_format_for_depth(depth, xwl_gbm->glamor_gles);
data.modifier = modifier;
for (i = 0; i < num_fds; i++) {
data.fds[i] = fds[i];
@@ -727,7 +740,7 @@ glamor_pixmap_from_fds(ScreenPtr screen, CARD8 num_fds, const int *fds,
data.width = width;
data.height = height;
data.stride = strides[0];
- data.format = gbm_format_for_depth(depth);
+ data.format = gbm_format_for_depth(depth, xwl_gbm->glamor_gles);
bo = gbm_bo_import(xwl_gbm->gbm, GBM_BO_IMPORT_FD, &data,
GBM_BO_USE_RENDERING);
implicit = TRUE;
@@ -1180,6 +1193,7 @@ xwl_glamor_gbm_init_egl(struct xwl_screen *xwl_screen)
/* Mesa uses "drm" as backend name, in that case, just do nothing */
if (gbm_backend_name && strcmp(gbm_backend_name, "drm") != 0)
xwl_screen->glvnd_vendor = gbm_backend_name;
+ xwl_gbm->glamor_gles = !epoxy_is_desktop_gl();
return TRUE;
error:
More information about the xorg-commit
mailing list