r300g: Work around "defect" in r300compiler.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Thu, 11 Feb 2010 02:38:53 +0000 (18:38 -0800)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Thu, 11 Feb 2010 02:40:12 +0000 (18:40 -0800)
r300compiler doesn't handle half swizzles for vert shaders, which don't
have them. So, for now, disable them.

src/gallium/drivers/r300/r300_fs.c
src/gallium/drivers/r300/r300_tgsi_to_rc.c
src/gallium/drivers/r300/r300_tgsi_to_rc.h
src/gallium/drivers/r300/r300_vs.c

index 75a05498eb32c22b01a8d84941aa16a7f98b8b28..ae4c62b2f1d830ad4cd1feb4c1f51387c345ce19 100644 (file)
@@ -179,6 +179,7 @@ static void r300_translate_fragment_shader(
     /* Translate TGSI to our internal representation */
     ttr.compiler = &compiler.Base;
     ttr.info = &fs->info;
+    ttr.use_half_swizzles = TRUE;
 
     r300_tgsi_to_rc(&ttr, fs->state.tokens);
 
index 1c82fccd9c09429d7c6914c30f62b9b74b020d63..aff4ddd4e23f9a8bb4a2479aa3a81bfe2746ddfe 100644 (file)
@@ -307,7 +307,7 @@ static void handle_immediate(struct tgsi_to_rc * ttr,
     for (i = 0; i < 4; i++) {
         if (imm->u[i].Float == 0.0f) {
             swizzle |= RC_SWIZZLE_ZERO << (i * 3);
-        } else if (imm->u[i].Float == 0.5f) {
+        } else if (imm->u[i].Float == 0.5f && ttr->use_half_swizzles) {
             swizzle |= RC_SWIZZLE_HALF << (i * 3);
         } else if (imm->u[i].Float == 1.0f) {
             swizzle |= RC_SWIZZLE_ONE << (i * 3);
@@ -330,7 +330,8 @@ static void handle_immediate(struct tgsi_to_rc * ttr,
     }
 }
 
-void r300_tgsi_to_rc(struct tgsi_to_rc * ttr, const struct tgsi_token * tokens)
+void r300_tgsi_to_rc(struct tgsi_to_rc * ttr,
+                     const struct tgsi_token * tokens)
 {
     struct tgsi_parse_context parser;
     unsigned imm_index = 0;
index 39b473c7bf5cc35762c67c034fb8920bbd4fb680..97641a954b9c77497c3406d0820f760679748e0a 100644 (file)
@@ -23,6 +23,8 @@
 #ifndef R300_TGSI_TO_RC_H
 #define R300_TGSI_TO_RC_H
 
+#include "pipe/p_compiler.h"
+
 struct radeon_compiler;
 
 struct tgsi_full_declaration;
@@ -41,6 +43,10 @@ struct tgsi_to_rc {
     int immediate_offset;
     struct swizzled_imms * imms_to_swizzle;
     unsigned imms_to_swizzle_count;
+
+    /* Vertex shaders have no half swizzles, and no way to handle them, so
+     * until rc grows proper support, indicate if they're safe to use. */
+    boolean use_half_swizzles;
 };
 
 void r300_tgsi_to_rc(struct tgsi_to_rc * ttr, const struct tgsi_token * tokens);
index fb81b2439b6fd13a925fdf9b33bdd225564008ea..a6786c321c615a3fadc4b0938e33e7e7ac07930d 100644 (file)
@@ -340,6 +340,7 @@ void r300_translate_vertex_shader(struct r300_context* r300,
     /* Translate TGSI to our internal representation */
     ttr.compiler = &compiler.Base;
     ttr.info = &vs->info;
+    ttr.use_half_swizzles = FALSE;
 
     r300_tgsi_to_rc(&ttr, vs->state.tokens);