[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