[Mesa-dev] [PATCH v2 13/16] i965: Move fs_visitor ra pass to new fs_visitor::allocate_registers()
Kristian Høgsberg
krh at bitplanet.net
Tue Nov 25 12:31:49 PST 2014
On Thu, Nov 13, 2014 at 6:38 PM, Connor Abbott <cwabbott0 at gmail.com> wrote:
> On Thu, Nov 13, 2014 at 7:28 PM, Kristian Høgsberg <krh at bitplanet.net> wrote:
>> This will be reused for the scalar VS pass.
>>
>> Signed-off-by: Kristian Høgsberg <krh at bitplanet.net>
>> ---
>> src/mesa/drivers/dri/i965/brw_fs.cpp | 132 +++++++++++++++++++----------------
>> src/mesa/drivers/dri/i965/brw_fs.h | 1 +
>> 2 files changed, 71 insertions(+), 62 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
>> index cb73b9f..4dce0a2 100644
>> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
>> @@ -3538,11 +3538,79 @@ fs_visitor::optimize()
>> lower_uniform_pull_constant_loads();
>> }
>>
>> +void
>> +fs_visitor::allocate_registers()
>> +{
>> + bool allocated_without_spills;
>> +
>> + static enum instruction_scheduler_mode pre_modes[] = {
>> + SCHEDULE_PRE,
>> + SCHEDULE_PRE_NON_LIFO,
>> + SCHEDULE_PRE_LIFO,
>> + };
>> +
>> + /* Try each scheduling heuristic to see if it can successfully register
>> + * allocate without spilling. They should be ordered by decreasing
>> + * performance but increasing likelihood of allocating.
>> + */
>> + for (unsigned i = 0; i < ARRAY_SIZE(pre_modes); i++) {
>> + schedule_instructions(pre_modes[i]);
>> +
>> + if (0) {
>> + assign_regs_trivial();
>> + allocated_without_spills = true;
>> + } else {
>> + allocated_without_spills = assign_regs(false);
>> + }
>> + if (allocated_without_spills)
>> + break;
>> + }
>> +
>> + if (!allocated_without_spills) {
>> + /* We assume that any spilling is worse than just dropping back to
>> + * SIMD8. There's probably actually some intermediate point where
>> + * SIMD16 with a couple of spills is still better.
>> + */
>> + if (dispatch_width == 16) {
>> + fail("Failure to register allocate. Reduce number of "
>> + "live scalar values to avoid this.");
>> + } else {
>> + perf_debug("Fragment shader triggered register spilling. "
>> + "Try reducing the number of live scalar values to "
>> + "improve performance.\n");
>
> Hmm, this warning will be pretty confusing once we start hitting this
> path for vertex shaders as well...
Right, I'll put the actual stage name there instead.
Kristian
>> + }
>> +
>> + /* Since we're out of heuristics, just go spill registers until we
>> + * get an allocation.
>> + */
>> + while (!assign_regs(true)) {
>> + if (failed)
>> + break;
>> + }
>> + }
>> +
>> + assert(force_uncompressed_stack == 0);
>> +
>> + /* This must come after all optimization and register allocation, since
>> + * it inserts dead code that happens to have side effects, and it does
>> + * so based on the actual physical registers in use.
>> + */
>> + insert_gen4_send_dependency_workarounds();
>> +
>> + if (failed)
>> + return;
>> +
>> + if (!allocated_without_spills)
>> + schedule_instructions(SCHEDULE_POST);
>> +
>> + if (last_scratch > 0)
>> + prog_data->total_scratch = brw_get_scratch_size(last_scratch);
>> +}
>> +
>> bool
>> fs_visitor::run()
>> {
>> sanity_param_count = prog->Parameters->NumParameters;
>> - bool allocated_without_spills;
>>
>> assign_binding_table_offsets();
>>
>> @@ -3555,7 +3623,6 @@ fs_visitor::run()
>> emit_dummy_fs();
>> } else if (brw->use_rep_send && dispatch_width == 16) {
>> emit_repclear_shader();
>> - allocated_without_spills = true;
>> } else {
>> if (INTEL_DEBUG & DEBUG_SHADER_TIME)
>> emit_shader_time_begin();
>> @@ -3610,68 +3677,9 @@ fs_visitor::run()
>> assign_curb_setup();
>> assign_urb_setup();
>>
>> - static enum instruction_scheduler_mode pre_modes[] = {
>> - SCHEDULE_PRE,
>> - SCHEDULE_PRE_NON_LIFO,
>> - SCHEDULE_PRE_LIFO,
>> - };
>> -
>> - /* Try each scheduling heuristic to see if it can successfully register
>> - * allocate without spilling. They should be ordered by decreasing
>> - * performance but increasing likelihood of allocating.
>> - */
>> - for (unsigned i = 0; i < ARRAY_SIZE(pre_modes); i++) {
>> - schedule_instructions(pre_modes[i]);
>> -
>> - if (0) {
>> - assign_regs_trivial();
>> - allocated_without_spills = true;
>> - } else {
>> - allocated_without_spills = assign_regs(false);
>> - }
>> - if (allocated_without_spills)
>> - break;
>> - }
>> -
>> - if (!allocated_without_spills) {
>> - /* We assume that any spilling is worse than just dropping back to
>> - * SIMD8. There's probably actually some intermediate point where
>> - * SIMD16 with a couple of spills is still better.
>> - */
>> - if (dispatch_width == 16) {
>> - fail("Failure to register allocate. Reduce number of "
>> - "live scalar values to avoid this.");
>> - } else {
>> - perf_debug("Fragment shader triggered register spilling. "
>> - "Try reducing the number of live scalar values to "
>> - "improve performance.\n");
>> - }
>> -
>> - /* Since we're out of heuristics, just go spill registers until we
>> - * get an allocation.
>> - */
>> - while (!assign_regs(true)) {
>> - if (failed)
>> - break;
>> - }
>> - }
>> -
>> - assert(force_uncompressed_stack == 0);
>> -
>> - /* This must come after all optimization and register allocation, since
>> - * it inserts dead code that happens to have side effects, and it does
>> - * so based on the actual physical registers in use.
>> - */
>> - insert_gen4_send_dependency_workarounds();
>> -
>> + allocate_registers();
>> if (failed)
>> return false;
>> -
>> - if (!allocated_without_spills)
>> - schedule_instructions(SCHEDULE_POST);
>> -
>> - if (last_scratch > 0)
>> - prog_data->total_scratch = brw_get_scratch_size(last_scratch);
>> }
>>
>> if (stage == MESA_SHADER_FRAGMENT) {
>> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
>> index 31c3001..bb6f767 100644
>> --- a/src/mesa/drivers/dri/i965/brw_fs.h
>> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
>> @@ -407,6 +407,7 @@ public:
>>
>> bool run();
>> void optimize();
>> + void allocate_registers();
>> void assign_binding_table_offsets();
>> void setup_payload_gen4();
>> void setup_payload_gen6();
>> --
>> 2.1.0
>>
>> _______________________________________________
>> 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