svga: Only emit Z depth work if it is actually read
This commit is contained in:
committed by
Brian Paul
parent
3b32e51cb1
commit
4f17830b3d
@@ -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 );
|
||||
|
||||
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,
|
||||
emit->nr_hw_temp );
|
||||
emit->nr_hw_temp++;
|
||||
|
||||
reg = writemask( dst(emit->ps_true_pos),
|
||||
TGSI_WRITEMASK_XY );
|
||||
|
||||
emit->ps_reads_pos = TRUE;
|
||||
if (!emit_decl( emit, dst(emit->ps_depth_pos),
|
||||
SVGA3D_DECLUSAGE_TEXCOORD, 1 ))
|
||||
return FALSE;
|
||||
|
||||
if (emit->info.reads_z) {
|
||||
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,
|
||||
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;
|
||||
}
|
||||
|
||||
return emit_decl( emit, reg, 0, 0 );
|
||||
}
|
||||
else if (emit->key.fkey.light_twoside &&
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user