summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/svga
diff options
context:
space:
mode:
authorJakob Bornecrantz <[email protected]>2011-04-07 14:07:20 +0100
committerBrian Paul <[email protected]>2011-09-23 07:58:46 -0600
commit4f17830b3dda5a1727a3c87897e73b56b37613a6 (patch)
treeddd76680b1a2c0a52ad4065f09def604d354ab24 /src/gallium/drivers/svga
parent3b32e51cb1e0cb3feba01f5612214bac20c5079b (diff)
svga: Only emit Z depth work if it is actually read
Diffstat (limited to 'src/gallium/drivers/svga')
-rw-r--r--src/gallium/drivers/svga/svga_tgsi_decl_sm30.c32
-rw-r--r--src/gallium/drivers/svga/svga_tgsi_insn.c4
2 files changed, 21 insertions, 15 deletions
diff --git a/src/gallium/drivers/svga/svga_tgsi_decl_sm30.c b/src/gallium/drivers/svga/svga_tgsi_decl_sm30.c
index 1c385cc7e81..3b70a3a7635 100644
--- a/src/gallium/drivers/svga/svga_tgsi_decl_sm30.c
+++ b/src/gallium/drivers/svga/svga_tgsi_decl_sm30.c
@@ -121,29 +121,35 @@ static boolean ps30_input( struct svga_shader_emitter *emit,
SVGA3dShaderDestToken reg;
if (semantic.Name == TGSI_SEMANTIC_POSITION) {
+
emit->ps_true_pos = src_register( SVGA3DREG_MISCTYPE,
SVGA3DMISCREG_POSITION );
-
emit->ps_true_pos.base.swizzle = TRANSLATE_SWIZZLE( TGSI_SWIZZLE_X,
TGSI_SWIZZLE_Y,
TGSI_SWIZZLE_Y,
TGSI_SWIZZLE_Y );
+ reg = writemask( dst(emit->ps_true_pos),
+ TGSI_WRITEMASK_XY );
+ emit->ps_reads_pos = TRUE;
- emit->ps_temp_pos = dst_register( SVGA3DREG_TEMP,
- emit->nr_hw_temp );
- emit->ps_depth_pos = src_register( SVGA3DREG_INPUT, emit->ps30_input_count++ );
-
- emit->input_map[idx] = src_register( SVGA3DREG_TEMP,
+ if (emit->info.reads_z) {
+ emit->ps_temp_pos = dst_register( SVGA3DREG_TEMP,
emit->nr_hw_temp );
- emit->nr_hw_temp++;
+ emit->ps_depth_pos = src_register( SVGA3DREG_INPUT,
+ emit->ps30_input_count++ );
- reg = writemask( dst(emit->ps_true_pos),
- TGSI_WRITEMASK_XY );
+ emit->input_map[idx] = src_register( SVGA3DREG_TEMP,
+ emit->nr_hw_temp );
+ emit->nr_hw_temp++;
+
+ if (!emit_decl( emit, dst( emit->ps_depth_pos ),
+ SVGA3D_DECLUSAGE_TEXCOORD, 1 ))
+ return FALSE;
+ }
+ else {
+ emit->input_map[idx] = emit->ps_true_pos;
+ }
- emit->ps_reads_pos = TRUE;
- if (!emit_decl( emit, dst(emit->ps_depth_pos),
- SVGA3D_DECLUSAGE_TEXCOORD, 1 ))
- return FALSE;
return emit_decl( emit, reg, 0, 0 );
}
else if (emit->key.fkey.light_twoside &&
diff --git a/src/gallium/drivers/svga/svga_tgsi_insn.c b/src/gallium/drivers/svga/svga_tgsi_insn.c
index ec1906eb619..e6ec5966eaa 100644
--- a/src/gallium/drivers/svga/svga_tgsi_insn.c
+++ b/src/gallium/drivers/svga/svga_tgsi_insn.c
@@ -2550,7 +2550,7 @@ static boolean emit_ps_preamble( struct svga_shader_emitter *emit )
return FALSE;
}
}
- } else if (emit->ps_reads_pos) {
+ } else if (emit->ps_reads_pos && emit->info.reads_z) {
/*
* Assemble the position from various bits of inputs. Depth and W are
* passed in a texcoord this is due to D3D's vPos not hold Z or W.
@@ -2579,7 +2579,7 @@ static boolean emit_ps_preamble( struct svga_shader_emitter *emit )
scalar( src(emit->ps_temp_pos), TGSI_SWIZZLE_W ) ))
return FALSE;
}
-
+
return TRUE;
}