summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorXiang, Haihao <haihao.xiang@intel.com>2007-12-19 10:36:56 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2007-12-19 10:36:56 +0800
commit41ed6be1da92fe8b48f106e7b540bd6a8ad2446a (patch)
treec2c702f2c4d48f00ad46868e8cb2a90bd1ab66d0 /src
parent27de28fc3ec46cd5cac1e6de52d27922aabe340e (diff)
i965: restore the flag after building the subroutine of the
GS thread. fix #13240
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_sf_emit.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_sf_emit.c b/src/mesa/drivers/dri/i965/brw_sf_emit.c
index 2ea9816e285..38ac0841e8d 100644
--- a/src/mesa/drivers/dri/i965/brw_sf_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_sf_emit.c
@@ -564,6 +564,8 @@ void brw_emit_anyprim_setup( struct brw_sf_compile *c )
struct brw_reg primmask;
struct brw_instruction *jmp;
struct brw_reg v1_null_ud = vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_UD));
+
+ GLuint saveflag;
alloc_regs(c);
@@ -582,10 +584,15 @@ void brw_emit_anyprim_setup( struct brw_sf_compile *c )
(1<<_3DPRIM_TRIFAN_NOSTIPPLE)));
jmp = brw_JMPI(p, ip, ip, brw_imm_w(0));
{
- brw_push_insn_state(p);
+ saveflag = p->flag_value;
+ brw_push_insn_state(p);
brw_emit_tri_setup( c );
brw_pop_insn_state(p);
- /* note - thread killed in subroutine */
+ p->flag_value = saveflag;
+ /* note - thread killed in subroutine, so must
+ * restore the flag which is changed when building
+ * the subroutine. fix #13240
+ */
}
brw_land_fwd_jump(p, jmp);
@@ -598,9 +605,11 @@ void brw_emit_anyprim_setup( struct brw_sf_compile *c )
(1<<_3DPRIM_LINESTRIP_CONT_BF)));
jmp = brw_JMPI(p, ip, ip, brw_imm_w(0));
{
+ saveflag = p->flag_value;
brw_push_insn_state(p);
brw_emit_line_setup( c );
brw_pop_insn_state(p);
+ p->flag_value = saveflag;
/* note - thread killed in subroutine */
}
brw_land_fwd_jump(p, jmp);