[Mesa-dev] [RFC PATCH 06/10] i965/Gen4-5: Set clip flags from clip distances

Chris Forbes chrisf at ijw.co.nz
Mon Aug 5 14:12:07 PDT 2013


You're right, that's completely bogus, and I meant to read the flags instead.

Thanks :)

On Tue, Aug 6, 2013 at 9:09 AM, Paul Berry <stereotype441 at gmail.com> wrote:
> On 3 August 2013 19:59, Chris Forbes <chrisf at ijw.co.nz> wrote:
>>
>> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
>> ---
>>  src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 25
>> ++++++++++++++-----------
>>  1 file changed, 14 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 f80777b..c0b5ccd 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,22 @@ 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 temp = dst_reg(this, glsl_type::uint_type);
>> +         dst_reg temp2 = 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(temp, src_reg(output_reg[VARYING_SLOT_CLIP_DIST0]),
>> src_reg(0.0f), BRW_CONDITIONAL_L));
>> +         emit(AND(temp2, src_reg(temp), src_reg(0x0fu)));
>
>
> I don't think this works.  From the i965 PRM
> (https://01.org/linuxgraphics/sites/default/files/documentation/965_g35_vol_4_subsystem_core_1.pdf),
> page 425:
>
> "Destination operand can be a GRF, an MRF or a null register. If it is not
> null, for the enabled channels, the LSB of the result in the destination
> channel contains the flag value for the channel. The other bits are
> undefined."
>
> You're making use of the lower 4 bits of the result, 3 of which are
> undefined.
>
> I believe you can achieve the effect you want by reading from the "flag"
> register, though you'll have to do some bit swizzling to unpack the values
> you want, since the flag register stores the result of the comparison for
> vertex 0 in its lower nibble and the result of the comparison for vertex 1
> in its lower nibble.
>
>>
>>
>> -        inst = emit(OR(header1_w, src_reg(header1_w), 1u << i));
>> -        inst->predicate = BRW_PREDICATE_NORMAL;
>> +         emit(CMP(temp, src_reg(output_reg[VARYING_SLOT_CLIP_DIST1]),
>> src_reg(0.0f), BRW_CONDITIONAL_L));
>> +         emit(AND(temp, src_reg(temp), src_reg(0x0fu)));
>> +         emit(SHL(temp, src_reg(temp), src_reg(4)));
>> +         emit(OR(temp2, src_reg(temp2), src_reg(temp)));
>> +
>> +         /* mask just the enabled planes */
>> +         emit(AND(temp2, src_reg(temp2),
>> src_reg(ctx->Transform.ClipPlanesEnabled)));
>> +         emit(OR(header1_w, src_reg(header1_w), src_reg(temp2)));
>>        }
>>
>>        /* i965 clipping workaround:
>> --
>> 1.8.3.4
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
>


More information about the mesa-dev mailing list