diff options
author | Gert Wollny <[email protected]> | 2019-05-27 16:26:25 +0200 |
---|---|---|
committer | Gert Wollny <[email protected]> | 2019-06-20 08:50:38 +0200 |
commit | 22edafb23942f98b3e805f0871dcad839f20b977 (patch) | |
tree | 281f7ab3cfba981b84c42732b2c88e73fe54d51b /src | |
parent | d8967b79518c54f6e8a9444819b28e6e70df46bf (diff) |
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 <[email protected]>
Reviewed-by: Gurchetan Singh <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/virgl/virgl_screen.c | 25 | ||||
-rw-r--r-- | src/gallium/drivers/virgl/virgl_screen.h | 1 |
2 files changed, 23 insertions, 3 deletions
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; }; |