From: Gert Wollny Date: Mon, 27 May 2019 14:32:40 +0000 (+0200) Subject: virgl: Add tweak to apply a swizzle when drawing/blitting to a emulated BGRA texture X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=59757dbad68ae51c63bff61277ffdd24a7e85839;p=mesa.git virgl: Add tweak to apply a swizzle when drawing/blitting to a emulated BGRA texture With Qemu this final swizzle is not needed, but with vtest it is, i.e. it depends on how a program using virglrenderer uses the surface that is rendered to, hence a tweak is added. v2: Update description and fix spelling (Emil) v3: Send tweak as binary value instead of using strings (Gurchetan) Reviewed-by: Gurchetan Singh --- diff --git a/src/gallium/drivers/virgl/virgl_context.c b/src/gallium/drivers/virgl/virgl_context.c index 3ce131a1e06..5f643788664 100644 --- a/src/gallium/drivers/virgl/virgl_context.c +++ b/src/gallium/drivers/virgl/virgl_context.c @@ -1406,6 +1406,9 @@ static void virgl_send_tweaks(struct virgl_context *vctx, struct virgl_screen *r { if (rs->tweak_gles_emulate_bgra) virgl_encode_tweak(vctx, virgl_tweak_gles_brga_emulate, 1); + + if (rs->tweak_gles_apply_bgra_dest_swizzle) + virgl_encode_tweak(vctx, virgl_tweak_gles_brga_apply_dest_swizzle, 1); } struct pipe_context *virgl_context_create(struct pipe_screen *pscreen, diff --git a/src/gallium/drivers/virgl/virgl_driinfo.h.in b/src/gallium/drivers/virgl/virgl_driinfo.h.in index 66d547d4712..d6162b3f39a 100644 --- a/src/gallium/drivers/virgl/virgl_driinfo.h.in +++ b/src/gallium/drivers/virgl/virgl_driinfo.h.in @@ -8,5 +8,6 @@ // 5. Implement the tweak in virglrenderer DRI_CONF_SECTION_MISCELLANEOUS DRI_CONF_GLES_EMULATE_BGRA("false") + DRI_CONF_GLES_APPLY_BGRA_DEST_SWIZZLE("false") DRI_CONF_SECTION_END diff --git a/src/gallium/drivers/virgl/virgl_protocol.h b/src/gallium/drivers/virgl/virgl_protocol.h index 71d1703cada..73795a8a7cd 100644 --- a/src/gallium/drivers/virgl/virgl_protocol.h +++ b/src/gallium/drivers/virgl/virgl_protocol.h @@ -593,6 +593,7 @@ enum virgl_context_cmd { enum vrend_tweak_type { virgl_tweak_gles_brga_emulate, + virgl_tweak_gles_brga_apply_dest_swizzle, virgl_tweak_undefined }; diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index 54bde6f1237..e96a10ffbc7 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -855,6 +855,7 @@ virgl_create_screen(struct virgl_winsys *vws, const struct pipe_screen_config *c struct virgl_screen *screen = CALLOC_STRUCT(virgl_screen); const char *VIRGL_GLES_EMULATE_BGRA = "gles_emulate_bgra"; + const char *VIRGL_GLES_APPLY_BGRA_DEST_SWIZZLE = "gles_apply_bgra_dest_swizzle"; if (!screen) return NULL; @@ -863,6 +864,8 @@ virgl_create_screen(struct virgl_winsys *vws, const struct pipe_screen_config *c if (config && config->options) { screen->tweak_gles_emulate_bgra = driQueryOptionb(config->options, VIRGL_GLES_EMULATE_BGRA); + screen->tweak_gles_apply_bgra_dest_swizzle = + driQueryOptionb(config->options, VIRGL_GLES_APPLY_BGRA_DEST_SWIZZLE); } 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 62001421936..89b06a25e35 100644 --- a/src/gallium/drivers/virgl/virgl_screen.h +++ b/src/gallium/drivers/virgl/virgl_screen.h @@ -47,6 +47,7 @@ struct virgl_screen { uint32_t sub_ctx_id; bool tweak_gles_emulate_bgra; + bool tweak_gles_apply_bgra_dest_swizzle; }; diff --git a/src/util/xmlpool/t_options.h b/src/util/xmlpool/t_options.h index e43692c8ef9..2abd2dd0fc4 100644 --- a/src/util/xmlpool/t_options.h +++ b/src/util/xmlpool/t_options.h @@ -370,3 +370,7 @@ DRI_CONF_OPT_BEGIN_B(gles_emulate_bgra, def) \ DRI_CONF_DESC(en,gettext("On GLES emulate BGRA formats by using a swizzled RGBA format")) \ DRI_CONF_OPT_END +#define DRI_CONF_GLES_APPLY_BGRA_DEST_SWIZZLE(def) \ +DRI_CONF_OPT_BEGIN_B(gles_apply_bgra_dest_swizzle, def) \ + DRI_CONF_DESC(en,gettext("When the BGRA formats are emulated by using swizzled RGBA formats on GLES apply the swizzle when writing")) \ +DRI_CONF_OPT_END