From 22edafb23942f98b3e805f0871dcad839f20b977 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Mon, 27 May 2019 16:26:25 +0200 Subject: virgl: Add code to accept BGRx_SRGB as RGBx_SRGB This will be enabled in later patches by the emulation tweak. Signed-off-by: Gert Wollny Reviewed-by: Gurchetan Singh --- src/gallium/drivers/virgl/virgl_screen.c | 25 ++++++++++++++++++++++--- src/gallium/drivers/virgl/virgl_screen.h | 1 + 2 files changed, 23 insertions(+), 3 deletions(-) (limited to 'src/gallium/drivers') diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index e8fbdac6544..1baea5d3f19 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -595,13 +595,30 @@ virgl_is_vertex_format_supported(struct pipe_screen *screen, static boolean virgl_format_check_bitmask(enum pipe_format format, - uint32_t bitmask[16]) + uint32_t bitmask[16], + boolean may_emulate_bgra) { int big = format / 32; int small = format % 32; if ((bitmask[big] & (1 << small))) return TRUE; + /* On GLES hosts we don't advertise BGRx_SRGB, but we may be able + * emulate it by using a swizzled RGBx */ + if (may_emulate_bgra) { + if (format == PIPE_FORMAT_B8G8R8A8_SRGB) + format = PIPE_FORMAT_R8G8B8A8_SRGB; + else if (format == PIPE_FORMAT_B8G8R8X8_SRGB) + format = PIPE_FORMAT_R8G8B8X8_SRGB; + else { + return FALSE; + } + + big = format / 32; + small = format % 32; + if (bitmask[big] & (1 << small)) + return TRUE; + } return FALSE; } @@ -693,7 +710,8 @@ virgl_is_format_supported( struct pipe_screen *screen, return FALSE; if (!virgl_format_check_bitmask(format, - vscreen->caps.caps.v1.render.bitmask)) + vscreen->caps.caps.v1.render.bitmask, + may_emulate_bgra)) return FALSE; } @@ -738,7 +756,8 @@ virgl_is_format_supported( struct pipe_screen *screen, out_lookup: return virgl_format_check_bitmask(format, - vscreen->caps.caps.v1.sampler.bitmask); + vscreen->caps.caps.v1.sampler.bitmask, + may_emulate_bgra); } static void virgl_flush_frontbuffer(struct pipe_screen *screen, diff --git a/src/gallium/drivers/virgl/virgl_screen.h b/src/gallium/drivers/virgl/virgl_screen.h index 93b52b5138d..62001421936 100644 --- a/src/gallium/drivers/virgl/virgl_screen.h +++ b/src/gallium/drivers/virgl/virgl_screen.h @@ -46,6 +46,7 @@ struct virgl_screen { struct slab_parent_pool transfer_pool; uint32_t sub_ctx_id; + bool tweak_gles_emulate_bgra; }; -- cgit v1.2.3