diff options
author | Brian Paul <[email protected]> | 2014-03-24 17:24:01 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2014-03-26 10:31:13 -0600 |
commit | c875d6e57a817bb6a8163a8a98ebd2768ee91848 (patch) | |
tree | 53b86bb87d4b9cd3e0ff862590580284a03fb975 /src/gallium/drivers/svga/svga_context.c | |
parent | 070951b6ba58ae37e931e79f03636a200df730b9 (diff) |
svga: add work-around for Sauerbraten Z fighting issue
Reviewed-by: Jose Fonseca <[email protected]>
Diffstat (limited to 'src/gallium/drivers/svga/svga_context.c')
-rw-r--r-- | src/gallium/drivers/svga/svga_context.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/gallium/drivers/svga/svga_context.c b/src/gallium/drivers/svga/svga_context.c index 4da9a6551f6..0ba09ce2ebc 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: |