[Mesa-dev] [PATCH 31/38] i965/fs: Migrate translation of NIR control flow to the IR builder.
Matt Turner
mattst88 at gmail.com
Mon Jun 8 10:29:22 PDT 2015
On Mon, Jun 8, 2015 at 7:00 AM, Francisco Jerez <currojerez at riseup.net> wrote:
> Matt Turner <mattst88 at gmail.com> writes:
>
>> On Thu, Jun 4, 2015 at 9:05 AM, Francisco Jerez <currojerez at riseup.net> wrote:
>>> ---
>>> src/mesa/drivers/dri/i965/brw_fs.h | 3 ++-
>>> src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 23 ++++++++++++-----------
>>> 2 files changed, 14 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
>>> index 3f775d3..8803d5a 100644
>>> --- a/src/mesa/drivers/dri/i965/brw_fs.h
>>> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
>>> @@ -319,7 +319,8 @@ public:
>>> void nir_emit_alu(nir_alu_instr *instr);
>>> void nir_emit_intrinsic(nir_intrinsic_instr *instr);
>>> void nir_emit_texture(nir_tex_instr *instr);
>>> - void nir_emit_jump(nir_jump_instr *instr);
>>> + void nir_emit_jump(const brw::fs_builder &bld,
>>> + nir_jump_instr *instr);
>>> fs_reg get_nir_src(nir_src src);
>>> fs_reg get_nir_dest(nir_dest dest);
>>> void emit_percomp(const brw::fs_builder &bld, const fs_inst &inst,
>>> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
>>> index 3f84830..f31829f 100644
>>> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
>>> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
>>> @@ -397,21 +397,21 @@ void
>>> fs_visitor::nir_emit_if(nir_if *if_stmt)
>>> {
>>> /* first, put the condition into f0 */
>>> - fs_inst *inst = emit(MOV(reg_null_d,
>>> + fs_inst *inst = bld.MOV(bld.null_reg_d(),
>>> retype(get_nir_src(if_stmt->condition),
>>> - BRW_REGISTER_TYPE_D)));
>>> + BRW_REGISTER_TYPE_D));
>>> inst->conditional_mod = BRW_CONDITIONAL_NZ;
>>>
>>> - emit(IF(BRW_PREDICATE_NORMAL));
>>> + bld.IF(BRW_PREDICATE_NORMAL);
>>>
>>> nir_emit_cf_list(&if_stmt->then_list);
>>>
>>> /* note: if the else is empty, dead CF elimination will remove it */
>>> - emit(BRW_OPCODE_ELSE);
>>> + bld.emit(BRW_OPCODE_ELSE);
>>>
>>> nir_emit_cf_list(&if_stmt->else_list);
>>>
>>> - emit(BRW_OPCODE_ENDIF);
>>> + bld.emit(BRW_OPCODE_ENDIF);
>>>
>>> if (!try_replace_with_sel() && devinfo->gen < 6) {
>>> no16("Can't support (non-uniform) control flow on SIMD16\n");
>>> @@ -425,11 +425,11 @@ fs_visitor::nir_emit_loop(nir_loop *loop)
>>> no16("Can't support (non-uniform) control flow on SIMD16\n");
>>> }
>>>
>>> - emit(BRW_OPCODE_DO);
>>> + bld.emit(BRW_OPCODE_DO);
>>>
>>> nir_emit_cf_list(&loop->body);
>>>
>>> - emit(BRW_OPCODE_WHILE);
>>> + bld.emit(BRW_OPCODE_WHILE);
>>> }
>>>
>>> void
>>> @@ -443,6 +443,7 @@ fs_visitor::nir_emit_block(nir_block *block)
>>> void
>>> fs_visitor::nir_emit_instr(nir_instr *instr)
>>> {
>>> + const fs_builder abld = bld.annotate(NULL, instr);
>>> this->base_ir = instr;
>>>
>>> switch (instr->type) {
>>> @@ -465,7 +466,7 @@ fs_visitor::nir_emit_instr(nir_instr *instr)
>>> break;
>>>
>>> case nir_instr_type_jump:
>>> - nir_emit_jump(nir_instr_as_jump(instr));
>>> + nir_emit_jump(abld, nir_instr_as_jump(instr));
>>
>> Why do we need to change the annotation to NULL?
>
> The annotation string should already have been NULL because the
> translation pass from NIR didn't ever set it to anything else -- And if
> in some case it wasn't NULL, it would have been an annotation previously
> set by some fs_visitor helper method during the translation of some
> previous instruction "leaking" into the current instruction, IOW a bug.
I can't convince myself that it's needed, but okay I guess.
Reviewed-by: Matt Turner <mattst88 at gmail.com>
More information about the mesa-dev
mailing list