summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGert Wollny <[email protected]>2019-05-27 16:26:25 +0200
committerGert Wollny <[email protected]>2019-06-20 08:50:38 +0200
commit22edafb23942f98b3e805f0871dcad839f20b977 (patch)
tree281f7ab3cfba981b84c42732b2c88e73fe54d51b /src
parentd8967b79518c54f6e8a9444819b28e6e70df46bf (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.c25
-rw-r--r--src/gallium/drivers/virgl/virgl_screen.h1
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;
};