[Mesa-dev] [PATCH v2 1/3] i965: add FS_OPCODE_OVERWRITE_DST

Chia-I Wu olvaffe at gmail.com
Wed Oct 16 08:56:05 CEST 2013


On Wed, Oct 16, 2013 at 2:08 AM, Ian Romanick <idr at freedesktop.org> wrote:
> On 10/09/2013 12:06 AM, Chia-I Wu wrote:
>> From: Chia-I Wu <olv at lunarg.com>
>>
>> FS_OPCODE_OVERWRITE_DST is used to indicate that the destination register is
>> (completely) overwritten.  No code is emitted, but the liveness analysis can
>> use it as a hint to add the destination register to DEF bitset.  This is
>> needed because it is hard to figure out if some partial writes combined
>> constitute a complete write during liveness analysis, while it is easier for
>> the FS visitor to know if that is the case.
>
> What changed from v1 of the series?  Just reordering (since some other
> patches from the original series landed) and rebasing on current master?
Yes, as said in my reply to Eric.  I will send v3 shortly, and add
notes as to what were changed.

>
>> Signed-off-by: Chia-I Wu <olv at lunarg.com>
>> ---
>>  src/mesa/drivers/dri/i965/brw_defines.h                 | 1 +
>>  src/mesa/drivers/dri/i965/brw_fs_generator.cpp          | 4 ++++
>>  src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp     | 5 +++--
>>  src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp | 3 ++-
>>  src/mesa/drivers/dri/i965/brw_shader.cpp                | 3 +++
>>  5 files changed, 13 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h
>> index c1e7f31..753a9ec 100644
>> --- a/src/mesa/drivers/dri/i965/brw_defines.h
>> +++ b/src/mesa/drivers/dri/i965/brw_defines.h
>> @@ -793,6 +793,7 @@ enum opcode {
>>     FS_OPCODE_UNPACK_HALF_2x16_SPLIT_X,
>>     FS_OPCODE_UNPACK_HALF_2x16_SPLIT_Y,
>>     FS_OPCODE_PLACEHOLDER_HALT,
>> +   FS_OPCODE_OVERWRITE_DST,
>>
>>     VS_OPCODE_URB_WRITE,
>>     VS_OPCODE_SCRATCH_READ,
>> diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
>> index dbfbc11..4b37784 100644
>> --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
>> @@ -1547,6 +1547,10 @@ fs_generator::generate_code(exec_list *instructions)
>>           patch_discard_jumps_to_fb_writes();
>>           break;
>>
>> +      case FS_OPCODE_OVERWRITE_DST:
>> +         /* This is to help liveness analysis. */
>> +         break;
>> +
>>        default:
>>        if (inst->opcode < (int) ARRAY_SIZE(opcode_descs)) {
>>           _mesa_problem(ctx, "Unsupported opcode `%s' in FS",
>> diff --git a/src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp b/src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp
>> index f5daab2..13891f8 100644
>> --- a/src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp
>> @@ -77,8 +77,9 @@ fs_live_variables::setup_def_use()
>>         * variable, and thus qualify for being in def[].
>>         */
>>        if (inst->dst.file == GRF &&
>> -          inst->regs_written == v->virtual_grf_sizes[inst->dst.reg] &&
>> -          !inst->is_partial_write()) {
>> +          (inst->opcode == FS_OPCODE_OVERWRITE_DST ||
>> +           (inst->regs_written == v->virtual_grf_sizes[inst->dst.reg] &&
>> +            !inst->is_partial_write()))) {
>>           int reg = inst->dst.reg;
>>              if (!BITSET_TEST(bd[b].use, reg))
>>                 BITSET_SET(bd[b].def, reg);
>> diff --git a/src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp b/src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp
>> index 5530683..4e59a10 100644
>> --- a/src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp
>> @@ -562,7 +562,8 @@ fs_instruction_scheduler::calculate_deps()
>>        schedule_node *n = (schedule_node *)node;
>>        fs_inst *inst = (fs_inst *)n->inst;
>>
>> -      if (inst->opcode == FS_OPCODE_PLACEHOLDER_HALT)
>> +      if (inst->opcode == FS_OPCODE_PLACEHOLDER_HALT ||
>> +          inst->opcode == FS_OPCODE_OVERWRITE_DST)
>>           add_barrier_deps(n);
>>
>>        /* read-after-write deps. */
>> diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp
>> index 61c4bf5..e226c94 100644
>> --- a/src/mesa/drivers/dri/i965/brw_shader.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp
>> @@ -485,6 +485,9 @@ brw_instruction_name(enum opcode op)
>>     case FS_OPCODE_PLACEHOLDER_HALT:
>>        return "placeholder_halt";
>>
>> +   case FS_OPCODE_OVERWRITE_DST:
>> +      return "overwrite_dst";
>> +
>>     case VS_OPCODE_URB_WRITE:
>>        return "vs_urb_write";
>>     case VS_OPCODE_SCRATCH_READ:
>>
>



-- 
olv at LunarG.com


More information about the mesa-dev mailing list