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
This commit is contained in:
parent
564ccf2ce9
commit
5fdd3125b4
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue