summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/svga/svga_context.c
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2014-03-24 17:24:01 -0600
committerBrian Paul <[email protected]>2014-03-26 10:31:13 -0600
commitc875d6e57a817bb6a8163a8a98ebd2768ee91848 (patch)
tree53b86bb87d4b9cd3e0ff862590580284a03fb975 /src/gallium/drivers/svga/svga_context.c
parent070951b6ba58ae37e931e79f03636a200df730b9 (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.c33
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: