r300/compiler: make optimizations not use 0.5 swizzles in vertex shaders
authorMarek Olšák <maraeo@gmail.com>
Wed, 1 Sep 2010 04:14:58 +0000 (06:14 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sat, 4 Sep 2010 16:56:21 +0000 (18:56 +0200)
src/gallium/drivers/r300/r300_fs.c
src/gallium/drivers/r300/r300_vs.c
src/mesa/drivers/dri/r300/compiler/radeon_compiler.h
src/mesa/drivers/dri/r300/compiler/radeon_optimize.c
src/mesa/drivers/dri/r300/r300_blit.c
src/mesa/drivers/dri/r300/r300_fragprog_common.c
src/mesa/drivers/dri/r300/r300_vertprog.c

index 7a5ed1b03bcc4fba39985b723874e513ca04ffd6..e8ebe90b33b4a45ec8b2cb30e72ef784d839a877 100644 (file)
@@ -385,6 +385,7 @@ static void r300_translate_fragment_shader(
     compiler.code = &shader->code;
     compiler.state = shader->compare_state;
     compiler.Base.is_r500 = r300->screen->caps.is_r500;
+    compiler.Base.has_half_swizzles = TRUE;
     compiler.Base.max_temp_regs = compiler.Base.is_r500 ? 128 : 32;
     compiler.Base.max_constants = compiler.Base.is_r500 ? 256 : 32;
     compiler.Base.max_alu_insts = compiler.Base.is_r500 ? 512 : 64;
index 4df6464224cda3ee5ada44357f9d1d335de17e75..2db7b52a87e4a33d03b254bc7c720bc06ed04964 100644 (file)
@@ -205,6 +205,7 @@ void r300_translate_vertex_shader(struct r300_context *r300,
     compiler.code = &vs->code;
     compiler.UserData = vs;
     compiler.Base.is_r500 = r300->screen->caps.is_r500;
+    compiler.Base.has_half_swizzles = FALSE;
     compiler.Base.max_temp_regs = 32;
     compiler.Base.max_constants = 256;
     compiler.Base.max_alu_insts = r300->screen->caps.is_r500 ? 1024 : 256;
index fcb0aee9f1b8be7b066353fa0220e8fae6a7764d..f6a8e8343426e485f7639e6be2f9f213730638d5 100644 (file)
@@ -41,6 +41,7 @@ struct radeon_compiler {
 
        /* Hardware specification. */
        unsigned is_r500:1;
+       unsigned has_half_swizzles:1;
        unsigned max_temp_regs;
        unsigned max_constants;
        int max_alu_insts;
index 8db521e51b9cad10dcf2ab56777814916229b3fe..a9be30706bb1e833892ff5a6856d850fb1a8f8a3 100644 (file)
@@ -410,7 +410,7 @@ static void constant_folding(struct radeon_compiler * c, struct rc_instruction *
                                newswz = RC_SWIZZLE_ZERO;
                        } else if (baseimm == 1.0) {
                                newswz = RC_SWIZZLE_ONE;
-                       } else if (baseimm == 0.5) {
+                       } else if (baseimm == 0.5 && c->has_half_swizzles) {
                                newswz = RC_SWIZZLE_HALF;
                        } else {
                                have_real_reference = 1;
index c22890c29e94068b3999eb353a3b99a263f2da22..e43f0eeb88925cd067bfb50363966dec17be61c4 100644 (file)
@@ -89,6 +89,7 @@ static void create_vertex_program(struct r300_context *r300)
     compiler.SetHwInputOutput = vp_ins_outs;
     compiler.code = &r300->blit.vp_code;
     compiler.Base.is_r500 = r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515;
+    compiler.Base.has_half_swizzles = 0;
     compiler.Base.max_temp_regs = 32;
     compiler.Base.max_constants = 256;
     compiler.Base.max_alu_insts = compiler.Base.is_r500 ? 1024 : 256;
@@ -123,6 +124,7 @@ static void create_fragment_program(struct r300_context *r300)
     compiler.OutputDepth = FRAG_RESULT_DEPTH;
     compiler.enable_shadow_ambient = GL_TRUE;
     compiler.Base.is_r500 = (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515);
+    compiler.Base.has_half_swizzles = 1;
     compiler.Base.max_temp_regs = (compiler.Base.is_r500) ? 128 : 32;
     compiler.Base.max_constants = compiler.Base.is_r500 ? 256 : 32;
     compiler.Base.max_alu_insts = compiler.Base.is_r500 ? 512 : 64;
index cd0f6b3fe64e2f99ff2a1329be3fabdec35f2d7a..47cf3e49008b04b38fd1c92b58bac0833270b9fa 100644 (file)
@@ -220,6 +220,7 @@ static void translate_fragment_program(GLcontext *ctx, struct r300_fragment_prog
        compiler.state = fp->state;
        compiler.enable_shadow_ambient = GL_TRUE;
        compiler.Base.is_r500 = (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) ? GL_TRUE : GL_FALSE;
+       compiler.Base.has_half_swizzles = 1;
        compiler.Base.max_temp_regs = (compiler.Base.is_r500) ? 128 : 32;
        compiler.Base.max_constants = compiler.Base.is_r500 ? 256 : 32;
        compiler.Base.max_alu_insts = compiler.Base.is_r500 ? 512 : 64;
index e7dcdef9b00215914d3e6e78c18f29e75f203fe5..1d24266fbddc709d71b27776eba5b6ebd4e4dea4 100644 (file)
@@ -245,6 +245,7 @@ static struct r300_vertex_program *build_program(GLcontext *ctx,
        compiler.RequiredOutputs = compute_required_outputs(vp->Base, vp->key.FpReads);
        compiler.SetHwInputOutput = &t_inputs_outputs;
        compiler.Base.is_r500 = R300_CONTEXT(ctx)->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515;
+       compiler.Base.has_half_swizzles = 0;
        compiler.Base.max_temp_regs = 32;
        compiler.Base.max_constants = 256;
        compiler.Base.max_alu_insts = compiler.Base.is_r500 ? 1024 : 256;