glamor: fix CbCr format handling
In GLES2, we cannot do GL_RED or GL_RG without GL_EXT_texture_rg. So, add check for GL_EXT_texture_rg to make it working. Also add a yuv2 pixman format into render.h to make Xv yuv rendering works. Signed-off-by: Yuriy Vasilev <uuvasiliev@yandex.ru> Reviewed-by: Adam Jackson <ajax@redhat.com> Reviewed-by: Emma Anholt <emma@anholt.net>
This commit is contained in:
parent
a59531533f
commit
65392d27d7
|
@ -223,7 +223,7 @@ glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth,
|
|||
|
||||
pixmap_priv = glamor_get_pixmap_private(pixmap);
|
||||
|
||||
pixmap_priv->is_cbcr = (usage == GLAMOR_CREATE_FORMAT_CBCR);
|
||||
pixmap_priv->is_cbcr = (GLAMOR_CREATE_FORMAT_CBCR & usage) == GLAMOR_CREATE_FORMAT_CBCR;
|
||||
|
||||
pitch = (((w * pixmap->drawable.bitsPerPixel + 7) / 8) + 3) & ~3;
|
||||
screen->ModifyPixmapHeader(pixmap, w, h, 0, 0, pitch, NULL);
|
||||
|
@ -550,9 +550,10 @@ glamor_setup_formats(ScreenPtr screen)
|
|||
glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
|
||||
|
||||
/* Prefer r8 textures since they're required by GLES3 and core,
|
||||
* only falling back to a8 if we can't do them.
|
||||
* only falling back to a8 if we can't do them. We cannot do them
|
||||
* on GLES2 due to lack of texture swizzle.
|
||||
*/
|
||||
if (glamor_priv->is_gles || epoxy_has_gl_extension("GL_ARB_texture_rg")) {
|
||||
if (glamor_priv->has_rg && glamor_priv->has_texture_swizzle) {
|
||||
glamor_add_format(screen, 1, PICT_a1,
|
||||
GL_R8, GL_RED, GL_UNSIGNED_BYTE, FALSE);
|
||||
glamor_add_format(screen, 8, PICT_a8,
|
||||
|
@ -606,8 +607,13 @@ glamor_setup_formats(ScreenPtr screen)
|
|||
}
|
||||
|
||||
glamor_priv->cbcr_format.depth = 16;
|
||||
glamor_priv->cbcr_format.internalformat = GL_RG8;
|
||||
if (glamor_priv->is_gles && glamor_priv->has_rg) {
|
||||
glamor_priv->cbcr_format.internalformat = GL_RG;
|
||||
} else {
|
||||
glamor_priv->cbcr_format.internalformat = GL_RG8;
|
||||
}
|
||||
glamor_priv->cbcr_format.format = GL_RG;
|
||||
glamor_priv->cbcr_format.render_format = PICT_yuv2;
|
||||
glamor_priv->cbcr_format.type = GL_UNSIGNED_BYTE;
|
||||
glamor_priv->cbcr_format.rendering_supported = TRUE;
|
||||
}
|
||||
|
@ -787,6 +793,11 @@ glamor_init(ScreenPtr screen, unsigned int flags)
|
|||
glamor_priv->has_clear_texture =
|
||||
epoxy_gl_version() >= 44 ||
|
||||
epoxy_has_gl_extension("GL_ARB_clear_texture");
|
||||
/* GL_EXT_texture_rg is part of GLES3 core */
|
||||
glamor_priv->has_rg =
|
||||
(glamor_priv->is_gles && epoxy_gl_version() >= 30) ||
|
||||
epoxy_has_gl_extension("GL_EXT_texture_rg") ||
|
||||
epoxy_has_gl_extension("GL_ARB_texture_rg");
|
||||
|
||||
glamor_priv->can_copyplane = (gl_version >= 30);
|
||||
|
||||
|
|
|
@ -216,6 +216,7 @@ typedef struct glamor_screen_private {
|
|||
Bool has_dual_blend;
|
||||
Bool has_clear_texture;
|
||||
Bool has_texture_swizzle;
|
||||
Bool has_rg;
|
||||
Bool is_core_profile;
|
||||
Bool can_copyplane;
|
||||
Bool use_gpu_shader4;
|
||||
|
|
|
@ -125,7 +125,10 @@ typedef enum _PictFormatShort {
|
|||
/* 1bpp formats */
|
||||
PICT_a1 = PIXMAN_a1,
|
||||
|
||||
PICT_g1 = PIXMAN_g1
|
||||
PICT_g1 = PIXMAN_g1,
|
||||
|
||||
/* YCbCr formats */
|
||||
PICT_yuv2 = PIXMAN_yuy2
|
||||
} PictFormatShort;
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue