From: Corbin Simpson Date: Thu, 11 Feb 2010 02:38:53 +0000 (-0800) Subject: r300g: Work around "defect" in r300compiler. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=229db2b8ade33571e4cece1d838234895db220c2;p=mesa.git r300g: Work around "defect" in r300compiler. r300compiler doesn't handle half swizzles for vert shaders, which don't have them. So, for now, disable them. --- diff --git a/src/gallium/drivers/r300/r300_fs.c b/src/gallium/drivers/r300/r300_fs.c index 75a05498eb3..ae4c62b2f1d 100644 --- a/src/gallium/drivers/r300/r300_fs.c +++ b/src/gallium/drivers/r300/r300_fs.c @@ -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); diff --git a/src/gallium/drivers/r300/r300_tgsi_to_rc.c b/src/gallium/drivers/r300/r300_tgsi_to_rc.c index 1c82fccd9c0..aff4ddd4e23 100644 --- a/src/gallium/drivers/r300/r300_tgsi_to_rc.c +++ b/src/gallium/drivers/r300/r300_tgsi_to_rc.c @@ -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; diff --git a/src/gallium/drivers/r300/r300_tgsi_to_rc.h b/src/gallium/drivers/r300/r300_tgsi_to_rc.h index 39b473c7bf5..97641a954b9 100644 --- a/src/gallium/drivers/r300/r300_tgsi_to_rc.h +++ b/src/gallium/drivers/r300/r300_tgsi_to_rc.h @@ -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); diff --git a/src/gallium/drivers/r300/r300_vs.c b/src/gallium/drivers/r300/r300_vs.c index fb81b2439b6..a6786c321c6 100644 --- a/src/gallium/drivers/r300/r300_vs.c +++ b/src/gallium/drivers/r300/r300_vs.c @@ -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);