[Mesa-dev] [PATCH 3/3] svga: add work-around for Sauerbraten Z fighting issue
Jose Fonseca
jfonseca at vmware.com
Wed Mar 26 09:00:33 PDT 2014
----- Original Message -----
> ---
> src/gallium/drivers/svga/svga_context.c | 33
> ++++++++++++++++++++++
> src/gallium/drivers/svga/svga_context.h | 5 ++++
> src/gallium/drivers/svga/svga_state_need_swtnl.c | 13 +++++++--
> 3 files changed, 49 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/svga/svga_context.c
> b/src/gallium/drivers/svga/svga_context.c
> index 4da9a65..0ba09ce 100644
> --- a/src/gallium/drivers/svga/svga_context.c
> +++ b/src/gallium/drivers/svga/svga_context.c
> @@ -25,11 +25,13 @@
>
> #include "svga_cmd.h"
>
> +#include "os/os_process.h"
> #include "pipe/p_defines.h"
> #include "util/u_inlines.h"
> #include "pipe/p_screen.h"
> #include "util/u_memory.h"
> #include "util/u_bitmask.h"
> +#include "util/u_string.h"
>
> #include "svga_context.h"
> #include "svga_screen.h"
> @@ -80,6 +82,35 @@ static void svga_destroy( struct pipe_context *pipe )
> }
>
>
> +/**
> + * Check the process name to see if we're running with an app that
> + * needs any particular work-arounds.
> + */
> +static void
> +check_for_workarounds(struct svga_context *svga)
> +{
> + char name[1000];
> +
> + if (!os_get_process_name(name, sizeof(name)))
> + return;
> +
> + if (util_strcmp(name, "sauer_client") == 0) {
> + /*
> + * Sauerbraten uses a two-pass rendering algorithm. The first pass
> + * draws a depth map. The second pass draws the colors. On the
> second
> + * pass we wind up using the swtnl path because the game tries to use
> + * a GLbyte[3] normal vector array (which the SVGA3D protocol does not
> + * support.) The vertices of the first and second passes don't quite
> + * match so we see some depth/Z-fighting issues. This work-around
> + * causes us to map GLbyte[3] to SVGA3D_DECLTYPE_UBYTE4N and avoid the
> + * swtnl path. Despite not correctly converting normal vectors from
> + * GLbyte[3] to float[4], the rendering looks OK.
> + */
> + debug_printf("Enabling sauerbraten GLbyte[3] work-around\n");
> + svga->workaround.use_decltype_ubyte4n = TRUE;
> + }
> +}
> +
>
> struct pipe_context *svga_context_create( struct pipe_screen *screen,
> void *priv )
> @@ -156,6 +187,8 @@ struct pipe_context *svga_context_create( struct
> pipe_screen *screen,
>
> LIST_INITHEAD(&svga->dirty_buffers);
>
> + check_for_workarounds(svga);
> +
> return &svga->pipe;
>
> no_state:
> diff --git a/src/gallium/drivers/svga/svga_context.h
> b/src/gallium/drivers/svga/svga_context.h
> index 0daab0b..1e93b02 100644
> --- a/src/gallium/drivers/svga/svga_context.h
> +++ b/src/gallium/drivers/svga/svga_context.h
> @@ -389,6 +389,11 @@ struct svga_context
> /** performance / info queries */
> uint64_t num_draw_calls; /**< SVGA_QUERY_DRAW_CALLS */
> uint64_t num_fallbacks; /**< SVGA_QUERY_FALLBACKS */
> +
> + /** quirks / work-around flags for particular apps */
> + struct {
> + boolean use_decltype_ubyte4n;
> + } workaround;
> };
>
> /* A flag for each state_tracker state object:
> diff --git a/src/gallium/drivers/svga/svga_state_need_swtnl.c
> b/src/gallium/drivers/svga/svga_state_need_swtnl.c
> index c0bfd2c..6f1d802 100644
> --- a/src/gallium/drivers/svga/svga_state_need_swtnl.c
> +++ b/src/gallium/drivers/svga/svga_state_need_swtnl.c
> @@ -36,7 +36,8 @@
> * format. Return SVGA3D_DECLTYPE_MAX for unsupported gallium formats.
> */
> static INLINE SVGA3dDeclType
> -svga_translate_vertex_format(enum pipe_format format)
> +svga_translate_vertex_format(const struct svga_context *svga,
> + enum pipe_format format)
> {
> switch (format) {
> case PIPE_FORMAT_R32_FLOAT: return SVGA3D_DECLTYPE_FLOAT1;
> @@ -57,6 +58,12 @@ svga_translate_vertex_format(enum pipe_format format)
> case PIPE_FORMAT_R16G16_FLOAT: return SVGA3D_DECLTYPE_FLOAT16_2;
> case PIPE_FORMAT_R16G16B16A16_FLOAT: return SVGA3D_DECLTYPE_FLOAT16_4;
>
> + case PIPE_FORMAT_R8G8B8_SNORM:
> + if (svga->workaround.use_decltype_ubyte4n) {
> + return SVGA3D_DECLTYPE_UBYTE4N;
> + }
> + /* fall-through */
> +
> default:
> /* There are many formats without hardware support. This case
> * will be hit regularly, meaning we'll need swvfetch.
> @@ -78,7 +85,9 @@ update_need_swvfetch(struct svga_context *svga, unsigned
> dirty)
> }
>
> for (i = 0; i < svga->curr.velems->count; i++) {
> - svga->state.sw.ve_format[i] =
> svga_translate_vertex_format(svga->curr.velems->velem[i].src_format);
> + svga->state.sw.ve_format[i] =
> + svga_translate_vertex_format(svga,
> +
> svga->curr.velems->velem[i].src_format);
> if (svga->state.sw.ve_format[i] == SVGA3D_DECLTYPE_MAX) {
> /* Unsupported format - use software fetch */
> need_swvfetch = TRUE;
> --
> 1.7.10.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://urldefense.proofpoint.com/v1/url?u=http://lists.freedesktop.org/mailman/listinfo/mesa-dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0A&m=bUFb65CGw9qnIKJ%2B4A%2FetCzS4sUJZr5stYFdvN%2FmhNM%3D%0A&s=ebed37f07052b55f47dc46ced85bbcb2defd223ee03a071dfc085e9b550777dc
>
Series is
Reviewed-by: Jose Fonseca <jfonseca at vmware.com>
More information about the mesa-dev
mailing list