diff options
author | Jakob Bornecrantz <[email protected]> | 2011-04-07 14:07:20 +0100 |
---|---|---|
committer | Brian Paul <[email protected]> | 2011-09-23 07:58:46 -0600 |
commit | 4f17830b3dda5a1727a3c87897e73b56b37613a6 (patch) | |
tree | ddd76680b1a2c0a52ad4065f09def604d354ab24 /src/gallium | |
parent | 3b32e51cb1e0cb3feba01f5612214bac20c5079b (diff) |
svga: Only emit Z depth work if it is actually read
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/svga/svga_tgsi_decl_sm30.c | 32 | ||||
-rw-r--r-- | src/gallium/drivers/svga/svga_tgsi_insn.c | 4 |
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; } |