diff options
author | José Fonseca <[email protected]> | 2011-02-17 10:09:06 +0000 |
---|---|---|
committer | José Fonseca <[email protected]> | 2011-02-17 15:29:32 +0000 |
commit | 0adeaf00e6c4592e78cca36c3b365110b83c965d (patch) | |
tree | bce7eae3a5b94461dac5663dd695918779aed2fb | |
parent | 8902c42db4fd72568cfa071987cfa10e7a366c2e (diff) |
svga: Don't use more than one constant per IFC instruction.
-rw-r--r-- | src/gallium/drivers/svga/svga_tgsi_insn.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/gallium/drivers/svga/svga_tgsi_insn.c b/src/gallium/drivers/svga/svga_tgsi_insn.c index 5f262b3eadb..97d91046427 100644 --- a/src/gallium/drivers/svga/svga_tgsi_insn.c +++ b/src/gallium/drivers/svga/svga_tgsi_insn.c @@ -746,7 +746,7 @@ static boolean emit_fake_arl(struct svga_shader_emitter *emit, static boolean emit_if(struct svga_shader_emitter *emit, const struct tgsi_full_instruction *insn) { - const struct src_register src = translate_src_register( + struct src_register src0 = translate_src_register( emit, &insn->Src[0] ); struct src_register zero = get_zero_immediate( emit ); SVGA3dShaderInstToken if_token = inst_token( SVGA3DOP_IFC ); @@ -754,10 +754,23 @@ static boolean emit_if(struct svga_shader_emitter *emit, if_token.control = SVGA3DOPCOMPC_NE; zero = scalar(zero, TGSI_SWIZZLE_X); + if (SVGA3dShaderGetRegType(src0.base.value) == SVGA3DREG_CONST) { + /* + * Max different constant registers readable per IFC instruction is 1. + */ + + SVGA3dShaderDestToken tmp = get_temp( emit ); + + if (!submit_op1(emit, inst_token( SVGA3DOP_MOV ), tmp, src0)) + return FALSE; + + src0 = scalar(src( tmp ), TGSI_SWIZZLE_X); + } + emit->dynamic_branching_level++; return (emit_instruction( emit, if_token ) && - emit_src( emit, src ) && + emit_src( emit, src0 ) && emit_src( emit, zero ) ); } |