On Sun, May 13, 2018 at 12:46 AM, Timothy Arceri <tarc...@itsqueeze.com> wrote:
> On 13/05/18 08:17, Bas Nieuwenhuizen wrote:
>>
>> Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
>>
>> if you also have a spec to go with the new bit. (and add it to the
>> headers)
>
>
> VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT is already part of the spec. I
> think you are getting confused with the previous discussion for a threaded
> shader compiles bit.

Looks like I was indeed.

>
>
>>
>> On Tue, May 8, 2018 at 7:58 AM, Timothy Arceri <tarc...@itsqueeze.com>
>> wrote:
>>>
>>> When VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT is set we skip NIR
>>> linking optimisations and only run over the NIR optimisation loop
>>> once similar to the GLSLOptimizeConservatively constant used by
>>> some GL drivers.
>>>
>>> We need to run over the opts at least once to avoid errors in LLVM
>>> (e.g. dead vars it can't handle) and also to reduce the time spent
>>> compiling the IR in LLVM.
>>>
>>> With this change the Blacksmith Unity demos compilation times
>>> go from 329760 ms -> 299881 ms when using Wine and DXVK.
>>>
>>> V2: add bit to radv_pipeline_key
>>>
>>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106246
>>> ---
>>>   src/amd/vulkan/radv_pipeline.c | 26 +++++++++++++++++---------
>>>   src/amd/vulkan/radv_private.h  |  1 +
>>>   src/amd/vulkan/radv_shader.c   | 12 +++++++-----
>>>   src/amd/vulkan/radv_shader.h   |  5 +++--
>>>   4 files changed, 28 insertions(+), 16 deletions(-)
>>>
>>> diff --git a/src/amd/vulkan/radv_pipeline.c
>>> b/src/amd/vulkan/radv_pipeline.c
>>> index b4e4f3211e2..d443f8271e9 100644
>>> --- a/src/amd/vulkan/radv_pipeline.c
>>> +++ b/src/amd/vulkan/radv_pipeline.c
>>> @@ -1724,13 +1724,13 @@ radv_link_shaders(struct radv_pipeline *pipeline,
>>> nir_shader **shaders)
>>>
>>> ac_lower_indirect_derefs(ordered_shaders[i],
>>>
>>> pipeline->device->physical_device->rad_info.chip_class);
>>>                          }
>>> -                       radv_optimize_nir(ordered_shaders[i]);
>>> +                       radv_optimize_nir(ordered_shaders[i], false);
>>>
>>>                          if
>>> (nir_lower_global_vars_to_local(ordered_shaders[i - 1])) {
>>>
>>> ac_lower_indirect_derefs(ordered_shaders[i - 1],
>>>
>>> pipeline->device->physical_device->rad_info.chip_class);
>>>                          }
>>> -                       radv_optimize_nir(ordered_shaders[i - 1]);
>>> +                       radv_optimize_nir(ordered_shaders[i - 1], false);
>>>                  }
>>>          }
>>>   }
>>> @@ -1750,6 +1750,9 @@ radv_generate_graphics_pipeline_key(struct
>>> radv_pipeline *pipeline,
>>>          struct radv_pipeline_key key;
>>>          memset(&key, 0, sizeof(key));
>>>
>>> +       if (pCreateInfo->flags &
>>> VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT)
>>> +               key.optimisations_disabled = 1;
>>> +
>>>          key.has_multiview_view_index = has_view_index;
>>>
>>>          uint32_t binding_input_rate = 0;
>>> @@ -1878,7 +1881,8 @@ void radv_create_shaders(struct radv_pipeline
>>> *pipeline,
>>>                            struct radv_device *device,
>>>                            struct radv_pipeline_cache *cache,
>>>                            struct radv_pipeline_key key,
>>> -                         const VkPipelineShaderStageCreateInfo
>>> **pStages)
>>> +                         const VkPipelineShaderStageCreateInfo
>>> **pStages,
>>> +                         const VkPipelineCreateFlags flags)
>>>   {
>>>          struct radv_shader_module fs_m = {0};
>>>          struct radv_shader_module *modules[MESA_SHADER_STAGES] = { 0, };
>>> @@ -1944,7 +1948,8 @@ void radv_create_shaders(struct radv_pipeline
>>> *pipeline,
>>>
>>>                  nir[i] = radv_shader_compile_to_nir(device, modules[i],
>>>                                                      stage ? stage->pName
>>> : "main", i,
>>> -                                                   stage ?
>>> stage->pSpecializationInfo : NULL);
>>> +                                                   stage ?
>>> stage->pSpecializationInfo : NULL,
>>> +                                                   flags);
>>>                  pipeline->active_stages |= mesa_to_vk_shader_stage(i);
>>>
>>>                  /* We don't want to alter meta shaders IR directly so
>>> clone it
>>> @@ -1963,8 +1968,10 @@ void radv_create_shaders(struct radv_pipeline
>>> *pipeline,
>>>                          if (i != last)
>>>                                  mask = mask | nir_var_shader_out;
>>>
>>> -                       nir_lower_io_to_scalar_early(nir[i], mask);
>>> -                       radv_optimize_nir(nir[i]);
>>> +                       if (!(flags &
>>> VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT)) {
>>> +                               nir_lower_io_to_scalar_early(nir[i],
>>> mask);
>>> +                               radv_optimize_nir(nir[i], false);
>>> +                       }
>>>                  }
>>>          }
>>>
>>> @@ -1973,7 +1980,8 @@ void radv_create_shaders(struct radv_pipeline
>>> *pipeline,
>>>                  merge_tess_info(&nir[MESA_SHADER_TESS_EVAL]->info,
>>> &nir[MESA_SHADER_TESS_CTRL]->info);
>>>          }
>>>
>>> -       radv_link_shaders(pipeline, nir);
>>> +       if (!(flags & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT))
>>> +               radv_link_shaders(pipeline, nir);
>>>
>>>          for (int i = 0; i < MESA_SHADER_STAGES; ++i) {
>>>                  if (modules[i] && radv_can_dump_shader(device,
>>> modules[i]))
>>> @@ -3349,7 +3357,7 @@ radv_pipeline_init(struct radv_pipeline *pipeline,
>>>
>>>          radv_create_shaders(pipeline, device, cache,
>>>
>>> radv_generate_graphics_pipeline_key(pipeline, pCreateInfo, &blend,
>>> has_view_index),
>>> -                           pStages);
>>> +                           pStages, pCreateInfo->flags);
>>>
>>>          pipeline->graphics.spi_baryc_cntl =
>>> S_0286E0_FRONT_FACE_ALL_BITS(1);
>>>          radv_pipeline_init_multisample_state(pipeline, &blend,
>>> pCreateInfo);
>>> @@ -3582,7 +3590,7 @@ static VkResult radv_compute_pipeline_create(
>>>          assert(pipeline->layout);
>>>
>>>          pStages[MESA_SHADER_COMPUTE] = &pCreateInfo->stage;
>>> -       radv_create_shaders(pipeline, device, cache, (struct
>>> radv_pipeline_key) {0}, pStages);
>>> +       radv_create_shaders(pipeline, device, cache, (struct
>>> radv_pipeline_key) {0}, pStages, pCreateInfo->flags);
>>>
>>>          pipeline->user_data_0[MESA_SHADER_COMPUTE] =
>>> radv_pipeline_stage_to_user_data_0(pipeline, MESA_SHADER_COMPUTE,
>>> device->physical_device->rad_info.chip_class);
>>>          pipeline->need_indirect_descriptor_sets |=
>>> pipeline->shaders[MESA_SHADER_COMPUTE]->info.need_indirect_descriptor_sets;
>>> diff --git a/src/amd/vulkan/radv_private.h
>>> b/src/amd/vulkan/radv_private.h
>>> index 5d67271961b..4805acab280 100644
>>> --- a/src/amd/vulkan/radv_private.h
>>> +++ b/src/amd/vulkan/radv_private.h
>>> @@ -360,6 +360,7 @@ struct radv_pipeline_key {
>>>          uint8_t log2_num_samples;
>>>          uint32_t multisample : 1;
>>>          uint32_t has_multiview_view_index : 1;
>>> +       uint32_t optimisations_disabled : 1;
>>>   };
>>>
>>>   void
>>> diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
>>> index 014ed78c228..d6d70b971cd 100644
>>> --- a/src/amd/vulkan/radv_shader.c
>>> +++ b/src/amd/vulkan/radv_shader.c
>>> @@ -117,7 +117,7 @@ void radv_DestroyShaderModule(
>>>   }
>>>
>>>   void
>>> -radv_optimize_nir(struct nir_shader *shader)
>>> +radv_optimize_nir(struct nir_shader *shader, bool
>>> optimize_conservatively)
>>>   {
>>>           bool progress;
>>>
>>> @@ -149,7 +149,7 @@ radv_optimize_nir(struct nir_shader *shader)
>>>                   if (shader->options->max_unroll_iterations) {
>>>                           NIR_PASS(progress, shader, nir_opt_loop_unroll,
>>> 0);
>>>                   }
>>> -        } while (progress);
>>> +        } while (progress && !optimize_conservatively);
>>>
>>>           NIR_PASS(progress, shader, nir_opt_shrink_load);
>>>           NIR_PASS(progress, shader, nir_opt_move_load_ubo);
>>> @@ -160,7 +160,8 @@ radv_shader_compile_to_nir(struct radv_device
>>> *device,
>>>                             struct radv_shader_module *module,
>>>                             const char *entrypoint_name,
>>>                             gl_shader_stage stage,
>>> -                          const VkSpecializationInfo *spec_info)
>>> +                          const VkSpecializationInfo *spec_info,
>>> +                          const VkPipelineCreateFlags flags)
>>>   {
>>>          if (strcmp(entrypoint_name, "main") != 0) {
>>>                  radv_finishme("Multiple shaders per module not really
>>> supported");
>>> @@ -293,7 +294,8 @@ radv_shader_compile_to_nir(struct radv_device
>>> *device,
>>>                          .lower_vote_eq_to_ballot = 1,
>>>                  });
>>>
>>> -       radv_optimize_nir(nir);
>>> +       if (!(flags & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT))
>>> +               radv_optimize_nir(nir, false);
>>>
>>>          /* Indirect lowering must be called after the
>>> radv_optimize_nir() loop
>>>           * has been called at least once. Otherwise indirect lowering
>>> can
>>> @@ -301,7 +303,7 @@ radv_shader_compile_to_nir(struct radv_device
>>> *device,
>>>           * considered too large for unrolling.
>>>           */
>>>          ac_lower_indirect_derefs(nir,
>>> device->physical_device->rad_info.chip_class);
>>> -       radv_optimize_nir(nir);
>>> +       radv_optimize_nir(nir, flags &
>>> VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT);
>>>
>>>          return nir;
>>>   }
>>> diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
>>> index 6588b787724..182b69849c0 100644
>>> --- a/src/amd/vulkan/radv_shader.h
>>> +++ b/src/amd/vulkan/radv_shader.h
>>> @@ -282,14 +282,15 @@ struct radv_shader_slab {
>>>   };
>>>
>>>   void
>>> -radv_optimize_nir(struct nir_shader *shader);
>>> +radv_optimize_nir(struct nir_shader *shader, bool
>>> optimize_conservatively);
>>>
>>>   nir_shader *
>>>   radv_shader_compile_to_nir(struct radv_device *device,
>>>                             struct radv_shader_module *module,
>>>                             const char *entrypoint_name,
>>>                             gl_shader_stage stage,
>>> -                          const VkSpecializationInfo *spec_info);
>>> +                          const VkSpecializationInfo *spec_info,
>>> +                          const VkPipelineCreateFlags flags);
>>>
>>>   void *
>>>   radv_alloc_shader_memory(struct radv_device *device,
>>> --
>>> 2.17.0
>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev@lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to