diff options
author | Chris Forbes <[email protected]> | 2013-08-04 03:32:34 +1200 |
---|---|---|
committer | Chris Forbes <[email protected]> | 2013-08-16 07:24:55 +1200 |
commit | 3b738f5f85abc5dd0d1f735dc1a56fcf24308323 (patch) | |
tree | fa5c68256bd6757e8a025cc2e69d52a9f654f442 /src | |
parent | a9be50f77675a70a44d231fc1f7fa85f875c5153 (diff) |
i965/Gen4-5: Set clip flags from clip distances
V2: - Use the new VS_OPCODE_UNPACK_FLAGS_SIMD4X2 to correctly split the
flags for the two vertices being processed together.
- Don't apply bogus masking of clip flags. The set of plane enables
aren't included in the shader key, and we wouldn't want the
recompiles anyway.
V3: - Tidy up spurious instructions, name temps properly.
Signed-off-by: Chris Forbes <[email protected]>
[V2] Reviewed-by: Paul Berry <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index f80777b76da..fa32e4a6848 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -2625,7 +2625,6 @@ vec4_visitor::emit_psiz_and_flags(struct brw_reg reg) dst_reg header1 = dst_reg(this, glsl_type::uvec4_type); dst_reg header1_w = header1; header1_w.writemask = WRITEMASK_W; - GLuint i; emit(MOV(header1, 0u)); @@ -2637,18 +2636,19 @@ vec4_visitor::emit_psiz_and_flags(struct brw_reg reg) emit(AND(header1_w, src_reg(header1_w), 0x7ff << 8)); } - current_annotation = "Clipping flags"; - for (i = 0; i < key->nr_userclip_plane_consts; i++) { - vec4_instruction *inst; - gl_varying_slot slot = (prog_data->vue_map.slots_valid & VARYING_BIT_CLIP_VERTEX) - ? VARYING_SLOT_CLIP_VERTEX : VARYING_SLOT_POS; + if (key->userclip_active) { + current_annotation = "Clipping flags"; + dst_reg flags0 = dst_reg(this, glsl_type::uint_type); + dst_reg flags1 = dst_reg(this, glsl_type::uint_type); - inst = emit(DP4(dst_null_f(), src_reg(output_reg[slot]), - src_reg(this->userplane[i]))); - inst->conditional_mod = BRW_CONDITIONAL_L; + emit(CMP(dst_null_f(), src_reg(output_reg[VARYING_SLOT_CLIP_DIST0]), src_reg(0.0f), BRW_CONDITIONAL_L)); + emit(VS_OPCODE_UNPACK_FLAGS_SIMD4X2, flags0, src_reg(0)); + emit(OR(header1_w, src_reg(header1_w), src_reg(flags0))); - inst = emit(OR(header1_w, src_reg(header1_w), 1u << i)); - inst->predicate = BRW_PREDICATE_NORMAL; + emit(CMP(dst_null_f(), src_reg(output_reg[VARYING_SLOT_CLIP_DIST1]), src_reg(0.0f), BRW_CONDITIONAL_L)); + emit(VS_OPCODE_UNPACK_FLAGS_SIMD4X2, flags1, src_reg(0)); + emit(SHL(flags1, src_reg(flags1), src_reg(4))); + emit(OR(header1_w, src_reg(header1_w), src_reg(flags1))); } /* i965 clipping workaround: |