freedreno/a3xx/compiler: highp frag shader
authorRob Clark <robclark@freedesktop.org>
Thu, 31 Oct 2013 13:59:49 +0000 (09:59 -0400)
committerRob Clark <robclark@freedesktop.org>
Sat, 2 Nov 2013 00:19:42 +0000 (20:19 -0400)
Fixes use of full-precision in fragment shader (ie. don't clobber r0.x
since that can be used by future bary instructions for varying fetch).
And makes use of full-precision the default in fragment shader (but can
be overriden via FD_MESA_DEBUG=fraghalf).

Seems like half precision is often not enough for texture coordinates.
The blob compiler is clever enough to keep texture coords in full
precision registers while using half precision for everything else.  But
we aren't quite that clever yet, so better to default to full precision.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a3xx/fd3_compiler.c
src/gallium/drivers/freedreno/a3xx/fd3_program.c
src/gallium/drivers/freedreno/freedreno_screen.c
src/gallium/drivers/freedreno/freedreno_util.h

index 5e94a6f397ada4d5d40dddfc47725f382dd4e11a..760fb7de2ed9a99d788089a7a33da37c66b27c41 100644 (file)
@@ -153,7 +153,7 @@ static unsigned
 compile_init(struct fd3_compile_context *ctx, struct fd3_shader_stateobj *so,
                const struct tgsi_token *tokens)
 {
-       unsigned ret;
+       unsigned ret, base = 0;
 
        ctx->tokens = tokens;
        ctx->ir = so->ir;
@@ -175,11 +175,17 @@ compile_init(struct fd3_compile_context *ctx, struct fd3_shader_stateobj *so,
        ctx->base_reg[TGSI_FILE_IMMEDIATE] =
                        ctx->info.file_max[TGSI_FILE_CONSTANT] + 1;
 
+       /* if full precision and fragment shader, don't clobber
+        * r0.x w/ bary fetch:
+        */
+       if ((so->type == SHADER_FRAGMENT) && !so->half_precision)
+               base = 1;
+
        /* Temporaries after outputs after inputs: */
-       ctx->base_reg[TGSI_FILE_INPUT]     = 0;
-       ctx->base_reg[TGSI_FILE_OUTPUT]    =
+       ctx->base_reg[TGSI_FILE_INPUT]     = base;
+       ctx->base_reg[TGSI_FILE_OUTPUT]    = base +
                        ctx->info.file_max[TGSI_FILE_INPUT] + 1;
-       ctx->base_reg[TGSI_FILE_TEMPORARY] =
+       ctx->base_reg[TGSI_FILE_TEMPORARY] = base +
                        ctx->info.file_max[TGSI_FILE_INPUT] + 1 +
                        ctx->info.file_max[TGSI_FILE_OUTPUT] + 1;
 
index b0eec6e66d3820dbef1573c48ff0be80349d13a9..7bb96faa8999f5aacd16d5991e530cf65f341853 100644 (file)
@@ -98,15 +98,8 @@ create_shader(struct pipe_context *pctx, const struct pipe_shader_state *cso,
                tgsi_dump(cso->tokens, 0);
        }
 
-       if (type == SHADER_FRAGMENT) {
-               /* we seem to get wrong colors (maybe swap/endianess or hw issue?)
-                * with full precision color reg.  And blob driver only seems to
-                * use half precision register for color output (that I can find
-                * so far), even with highp precision.  So for force half precision
-                * for frag shader:
-                */
+       if ((type == SHADER_FRAGMENT) && (fd_mesa_debug & FD_DBG_FRAGHALF))
                so->half_precision = true;
-       }
 
        ret = fd3_compile_shader(so, cso->tokens);
        if (ret) {
index b6d37e7e43880ad3c00218207931f6018dbd0105..20adf21eec6b974b91b85369e574fa451c725108 100644 (file)
@@ -63,6 +63,7 @@ static const struct debug_named_value debug_options[] = {
                {"dscis",     FD_DBG_DSCIS,  "Disable scissor optimization"},
                {"direct",    FD_DBG_DIRECT, "Force inline (SS_DIRECT) state loads"},
                {"dbypass",   FD_DBG_DBYPASS,"Disable GMEM bypass"},
+               {"fraghalf",  FD_DBG_FRAGHALF, "Use half-precision in fragment shader"},
                DEBUG_NAMED_VALUE_END
 };
 
index a189e1aba5e382fe2b69be804b32634ff2e1ad6f..48d346eb35b3f838e2522c42c3e342d2e72186e2 100644 (file)
@@ -59,6 +59,8 @@ enum adreno_stencil_op fd_stencil_op(unsigned op);
 #define FD_DBG_DSCIS    0x10
 #define FD_DBG_DIRECT   0x20
 #define FD_DBG_DBYPASS  0x40
+#define FD_DBG_FRAGHALF 0x80
+
 extern int fd_mesa_debug;
 
 #define DBG(fmt, ...) \