diff --git a/src/gallium/drivers/virgl/virgl_driinfo.h.in b/src/gallium/drivers/virgl/virgl_driinfo.h.in
index 7a1fef7eb0d..f57e5880965 100644
--- a/src/gallium/drivers/virgl/virgl_driinfo.h.in
+++ b/src/gallium/drivers/virgl/virgl_driinfo.h.in
@@ -7,6 +7,7 @@
// 4. Add the code to send the tweak to the host in virgl_send_tweaks
// 5. Implement the tweak in virglrenderer
DRI_CONF_SECTION_MISCELLANEOUS
+ DRI_CONF_FORMAT_L8_SRGB_ENABLE_READBACK(false)
DRI_CONF_GLES_EMULATE_BGRA(true)
DRI_CONF_GLES_APPLY_BGRA_DEST_SWIZZLE(true)
DRI_CONF_GLES_SAMPLES_PASSED_VALUE(1024, 1, 400000000)
diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c
index a832f98461d..6fe0e175975 100644
--- a/src/gallium/drivers/virgl/virgl_screen.c
+++ b/src/gallium/drivers/virgl/virgl_screen.c
@@ -51,6 +51,7 @@ static const struct debug_named_value virgl_debug_options[] = {
{ "nobgraswz", VIRGL_DEBUG_NO_BGRA_DEST_SWIZZLE,"Disable tweak to swizzle emulated BGRA on GLES hosts" },
{ "sync", VIRGL_DEBUG_SYNC, "Sync after every flush" },
{ "xfer", VIRGL_DEBUG_XFER, "Do not optimize for transfers" },
+ { "r8srgb-readback", VIRGL_DEBUG_L8_SRGB_ENABLE_READBACK, "Enable redaback for L8 sRGB textures" },
{ "nocoherent", VIRGL_DEBUG_NO_COHERENT, "Disable coherent memory"},
DEBUG_NAMED_VALUE_END
};
@@ -542,8 +543,15 @@ virgl_has_readback_format(struct pipe_screen *screen,
enum virgl_formats fmt)
{
struct virgl_screen *vscreen = virgl_screen(screen);
- return has_format_bit(&vscreen->caps.caps.v2.supported_readback_formats,
- fmt);
+ if (has_format_bit(&vscreen->caps.caps.v2.supported_readback_formats,
+ fmt))
+ return true;
+
+ if (fmt == VIRGL_FORMAT_L8_SRGB && vscreen->tweak_l8_srgb_readback) {
+ return true;
+ }
+
+ return false;
}
static bool
@@ -956,6 +964,7 @@ virgl_create_screen(struct virgl_winsys *vws, const struct pipe_screen_config *c
const char *VIRGL_GLES_EMULATE_BGRA = "gles_emulate_bgra";
const char *VIRGL_GLES_APPLY_BGRA_DEST_SWIZZLE = "gles_apply_bgra_dest_swizzle";
const char *VIRGL_GLES_SAMPLES_PASSED_VALUE = "gles_samples_passed_value";
+ const char *VIRGL_FORMAT_L8_SRGB_ENABLE_READBACK = "format_l8_srgb_enable_readback";
if (!screen)
return NULL;
@@ -972,10 +981,13 @@ virgl_create_screen(struct virgl_winsys *vws, const struct pipe_screen_config *c
driQueryOptionb(config->options, VIRGL_GLES_APPLY_BGRA_DEST_SWIZZLE);
screen->tweak_gles_tf3_value =
driQueryOptioni(config->options, VIRGL_GLES_SAMPLES_PASSED_VALUE);
+ screen->tweak_l8_srgb_readback =
+ driQueryOptionb(config->options, VIRGL_FORMAT_L8_SRGB_ENABLE_READBACK);
}
screen->tweak_gles_emulate_bgra &= !(virgl_debug & VIRGL_DEBUG_NO_EMULATE_BGRA);
screen->tweak_gles_apply_bgra_dest_swizzle &= !(virgl_debug & VIRGL_DEBUG_NO_BGRA_DEST_SWIZZLE);
screen->no_coherent = virgl_debug & VIRGL_DEBUG_NO_COHERENT;
+ screen->tweak_l8_srgb_readback |= !!(virgl_debug & VIRGL_DEBUG_L8_SRGB_ENABLE_READBACK);
screen->vws = vws;
screen->base.get_name = virgl_get_name;
diff --git a/src/gallium/drivers/virgl/virgl_screen.h b/src/gallium/drivers/virgl/virgl_screen.h
index c44509f3ffb..3881669450b 100644
--- a/src/gallium/drivers/virgl/virgl_screen.h
+++ b/src/gallium/drivers/virgl/virgl_screen.h
@@ -37,6 +37,7 @@ enum virgl_debug_flags {
VIRGL_DEBUG_XFER = 1 << 5,
VIRGL_DEBUG_NO_COHERENT = 1 << 6,
VIRGL_DEBUG_NIR = 1 << 7,
+ VIRGL_DEBUG_L8_SRGB_ENABLE_READBACK = 1 << 8,
};
extern int virgl_debug;
@@ -58,6 +59,7 @@ struct virgl_screen {
uint32_t sub_ctx_id;
bool tweak_gles_emulate_bgra;
bool tweak_gles_apply_bgra_dest_swizzle;
+ bool tweak_l8_srgb_readback;
bool no_coherent;
int32_t tweak_gles_tf3_value;
diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf
index b7084b5c1b2..2c8350c76ee 100644
--- a/src/util/00-mesa-defaults.conf
+++ b/src/util/00-mesa-defaults.conf
@@ -893,6 +893,12 @@ TODO: document the other workarounds.
+
+
+
+
+
+