intel/compiler: Use std::unique_ptr for tracking the fs_visitors
authorCaio Oliveira <caio.oliveira@intel.com>
Tue, 8 Nov 2022 22:14:37 +0000 (14:14 -0800)
committerMarge Bot <emma+marge@anholt.net>
Thu, 10 Nov 2022 18:01:52 +0000 (18:01 +0000)
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19605>

src/intel/compiler/brw_fs.cpp
src/intel/compiler/brw_mesh.cpp

index 36eb6ab..7ce67e4 100644 (file)
@@ -43,6 +43,8 @@
 #include "program/prog_parameter.h"
 #include "util/u_math.h"
 
+#include <memory>
+
 using namespace brw;
 
 static unsigned get_lowered_simd_width(const struct brw_compiler *compiler,
@@ -7460,17 +7462,16 @@ brw_compile_fs(const struct brw_compiler *compiler,
    brw_nir_populate_wm_prog_data(nir, compiler->devinfo, key, prog_data,
                                  params->mue_map);
 
-   fs_visitor *v8 = NULL, *v16 = NULL, *v32 = NULL;
+   std::unique_ptr<fs_visitor> v8, v16, v32;
    cfg_t *simd8_cfg = NULL, *simd16_cfg = NULL, *simd32_cfg = NULL;
    float throughput = 0;
    bool has_spilled = false;
 
-   v8 = new fs_visitor(compiler, params->log_data, mem_ctx, &key->base,
-                       &prog_data->base, nir, 8,
-                       debug_enabled);
+   v8 = std::make_unique<fs_visitor>(compiler, params->log_data, mem_ctx, &key->base,
+                                     &prog_data->base, nir, 8,
+                                     debug_enabled);
    if (!v8->run_fs(allow_spilling, false /* do_rep_send */)) {
       params->error_str = ralloc_strdup(mem_ctx, v8->fail_msg);
-      delete v8;
       return NULL;
    } else if (!INTEL_DEBUG(DEBUG_NO8)) {
       simd8_cfg = v8->cfg;
@@ -7508,10 +7509,10 @@ brw_compile_fs(const struct brw_compiler *compiler,
        v8->max_dispatch_width >= 16 &&
        (!INTEL_DEBUG(DEBUG_NO16) || params->use_rep_send)) {
       /* Try a SIMD16 compile */
-      v16 = new fs_visitor(compiler, params->log_data, mem_ctx, &key->base,
-                           &prog_data->base, nir, 16,
-                           debug_enabled);
-      v16->import_uniforms(v8);
+      v16 = std::make_unique<fs_visitor>(compiler, params->log_data, mem_ctx, &key->base,
+                                         &prog_data->base, nir, 16,
+                                         debug_enabled);
+      v16->import_uniforms(v8.get());
       if (!v16->run_fs(allow_spilling, params->use_rep_send)) {
          brw_shader_perf_log(compiler, params->log_data,
                              "SIMD16 shader failed to compile: %s\n",
@@ -7535,10 +7536,10 @@ brw_compile_fs(const struct brw_compiler *compiler,
        devinfo->ver >= 6 && !simd16_failed &&
        !INTEL_DEBUG(DEBUG_NO32)) {
       /* Try a SIMD32 compile */
-      v32 = new fs_visitor(compiler, params->log_data, mem_ctx, &key->base,
-                           &prog_data->base, nir, 32,
-                           debug_enabled);
-      v32->import_uniforms(v8);
+      v32 = std::make_unique<fs_visitor>(compiler, params->log_data, mem_ctx, &key->base,
+                                         &prog_data->base, nir, 32,
+                                         debug_enabled);
+      v32->import_uniforms(v8.get());
       if (!v32->run_fs(allow_spilling, false)) {
          brw_shader_perf_log(compiler, params->log_data,
                              "SIMD32 shader failed to compile: %s\n",
@@ -7648,11 +7649,6 @@ brw_compile_fs(const struct brw_compiler *compiler,
    }
 
    g.add_const_data(nir->constant_data, nir->constant_data_size);
-
-   delete v8;
-   delete v16;
-   delete v32;
-
    return g.get_assembly();
 }
 
@@ -7813,7 +7809,7 @@ brw_compile_cs(const struct brw_compiler *compiler,
    const unsigned required_dispatch_width =
       brw_required_dispatch_width(&nir->info);
 
-   fs_visitor *v[3]     = {0};
+   std::unique_ptr<fs_visitor> v[3];
    const char *error[3] = {0};
 
    for (unsigned simd = 0; simd < 3; simd++) {
@@ -7836,13 +7832,13 @@ brw_compile_cs(const struct brw_compiler *compiler,
       brw_postprocess_nir(shader, compiler, true, debug_enabled,
                           key->base.robust_buffer_access);
 
-      v[simd] = new fs_visitor(compiler, params->log_data, mem_ctx, &key->base,
-                               &prog_data->base, shader, dispatch_width,
-                               debug_enabled);
+      v[simd] = std::make_unique<fs_visitor>(compiler, params->log_data, mem_ctx, &key->base,
+                                    &prog_data->base, shader, dispatch_width,
+                                             debug_enabled);
 
       if (prog_data->prog_mask) {
          unsigned first = ffs(prog_data->prog_mask) - 1;
-         v[simd]->import_uniforms(v[first]);
+         v[simd]->import_uniforms(v[first].get());
       }
 
       const bool allow_spilling = !prog_data->prog_mask ||
@@ -7870,13 +7866,11 @@ brw_compile_cs(const struct brw_compiler *compiler,
    }
 
    assert(selected_simd < 3);
-   fs_visitor *selected = v[selected_simd];
+   fs_visitor *selected = v[selected_simd].get();
 
    if (!nir->info.workgroup_size_variable)
       prog_data->prog_mask = 1 << selected_simd;
 
-   const unsigned *ret = NULL;
-
    fs_generator g(compiler, params->log_data, mem_ctx, &prog_data->base,
                   selected->runtime_check_aads_emit, MESA_SHADER_COMPUTE);
    if (unlikely(debug_enabled)) {
@@ -7900,13 +7894,7 @@ brw_compile_cs(const struct brw_compiler *compiler,
 
    g.add_const_data(nir->constant_data, nir->constant_data_size);
 
-   ret = g.get_assembly();
-
-   delete v[0];
-   delete v[1];
-   delete v[2];
-
-   return ret;
+   return g.get_assembly();
 }
 
 struct brw_cs_dispatch_info
@@ -7960,24 +7948,24 @@ compile_single_bs(const struct brw_compiler *compiler, void *log_data,
    brw_postprocess_nir(shader, compiler, true, debug_enabled,
                        key->base.robust_buffer_access);
 
-   fs_visitor *v = NULL, *v8 = NULL, *v16 = NULL;
+   std::unique_ptr<fs_visitor> v8, v16;
+   fs_visitor *v = NULL;
    bool has_spilled = false;
 
    uint8_t simd_size = 0;
    if ((shader->info.subgroup_size == SUBGROUP_SIZE_VARYING ||
         shader->info.subgroup_size == SUBGROUP_SIZE_REQUIRE_8) &&
        !INTEL_DEBUG(DEBUG_NO8)) {
-      v8 = new fs_visitor(compiler, log_data, mem_ctx, &key->base,
-                          &prog_data->base, shader,
-                          8, debug_enabled);
+      v8 = std::make_unique<fs_visitor>(compiler, log_data, mem_ctx, &key->base,
+                                        &prog_data->base, shader,
+                                        8, debug_enabled);
       const bool allow_spilling = true;
       if (!v8->run_bs(allow_spilling)) {
          if (error_str)
             *error_str = ralloc_strdup(mem_ctx, v8->fail_msg);
-         delete v8;
          return 0;
       } else {
-         v = v8;
+         v = v8.get();
          simd_size = 8;
          if (v8->spilled_any_registers)
             has_spilled = true;
@@ -7987,26 +7975,25 @@ compile_single_bs(const struct brw_compiler *compiler, void *log_data,
    if ((shader->info.subgroup_size == SUBGROUP_SIZE_VARYING ||
         shader->info.subgroup_size == SUBGROUP_SIZE_REQUIRE_16) &&
        !has_spilled && !INTEL_DEBUG(DEBUG_NO16)) {
-      v16 = new fs_visitor(compiler, log_data, mem_ctx, &key->base,
-                           &prog_data->base, shader,
-                           16, debug_enabled);
+      v16 = std::make_unique<fs_visitor>(compiler, log_data, mem_ctx, &key->base,
+                                         &prog_data->base, shader,
+                                         16, debug_enabled);
       const bool allow_spilling = (v == NULL);
       if (!v16->run_bs(allow_spilling)) {
          brw_shader_perf_log(compiler, log_data,
                              "SIMD16 shader failed to compile: %s\n",
                              v16->fail_msg);
          if (v == NULL) {
-            assert(v8 == NULL);
+            assert(!v8);
             if (error_str) {
                *error_str = ralloc_asprintf(
                   mem_ctx, "SIMD8 disabled and couldn't generate SIMD16: %s",
                   v16->fail_msg);
             }
-            delete v16;
             return 0;
          }
       } else {
-         v = v16;
+         v = v16.get();
          simd_size = 16;
          if (v16->spilled_any_registers)
             has_spilled = true;
@@ -8031,9 +8018,6 @@ compile_single_bs(const struct brw_compiler *compiler, void *log_data,
    else
       assert(offset == 0);
 
-   delete v8;
-   delete v16;
-
    return simd_size;
 }
 
index dfae5ce..f7c4b9e 100644 (file)
@@ -28,6 +28,8 @@
 #include "compiler/nir/nir_builder.h"
 #include "dev/intel_debug.h"
 
+#include <memory>
+
 using namespace brw;
 
 static bool
@@ -266,7 +268,7 @@ brw_compile_task(const struct brw_compiler *compiler,
    const unsigned required_dispatch_width =
       brw_required_dispatch_width(&nir->info);
 
-   fs_visitor *v[3]     = {0};
+   std::unique_ptr<fs_visitor> v[3];
    const char *error[3] = {0};
 
    for (unsigned simd = 0; simd < 3; simd++) {
@@ -287,13 +289,13 @@ brw_compile_task(const struct brw_compiler *compiler,
 
       brw_nir_adjust_payload(shader, compiler);
 
-      v[simd] = new fs_visitor(compiler, params->log_data, mem_ctx, &key->base,
-                               &prog_data->base.base, shader, dispatch_width,
-                               debug_enabled);
+      v[simd] = std::make_unique<fs_visitor>(compiler, params->log_data, mem_ctx, &key->base,
+                                             &prog_data->base.base, shader, dispatch_width,
+                                             debug_enabled);
 
       if (prog_data->base.prog_mask) {
          unsigned first = ffs(prog_data->base.prog_mask) - 1;
-         v[simd]->import_uniforms(v[first]);
+         v[simd]->import_uniforms(v[first].get());
       }
 
       const bool allow_spilling = !prog_data->base.prog_mask;
@@ -311,7 +313,7 @@ brw_compile_task(const struct brw_compiler *compiler,
       return NULL;
    }
 
-   fs_visitor *selected = v[selected_simd];
+   fs_visitor *selected = v[selected_simd].get();
    prog_data->base.prog_mask = 1 << selected_simd;
 
    if (unlikely(debug_enabled)) {
@@ -331,11 +333,6 @@ brw_compile_task(const struct brw_compiler *compiler,
 
    g.generate_code(selected->cfg, selected->dispatch_width, selected->shader_stats,
                    selected->performance_analysis.require(), params->stats);
-
-   delete v[0];
-   delete v[1];
-   delete v[2];
-
    return g.get_assembly();
 }
 
@@ -767,7 +764,7 @@ brw_compile_mesh(const struct brw_compiler *compiler,
    const unsigned required_dispatch_width =
       brw_required_dispatch_width(&nir->info);
 
-   fs_visitor *v[3]     = {0};
+   std::unique_ptr<fs_visitor> v[3];
    const char *error[3] = {0};
 
    for (int simd = 0; simd < 3; simd++) {
@@ -800,13 +797,13 @@ brw_compile_mesh(const struct brw_compiler *compiler,
 
       brw_nir_adjust_payload(shader, compiler);
 
-      v[simd] = new fs_visitor(compiler, params->log_data, mem_ctx, &key->base,
-                               &prog_data->base.base, shader, dispatch_width,
-                               debug_enabled);
+      v[simd] = std::make_unique<fs_visitor>(compiler, params->log_data, mem_ctx, &key->base,
+                                             &prog_data->base.base, shader, dispatch_width,
+                                             debug_enabled);
 
       if (prog_data->base.prog_mask) {
          unsigned first = ffs(prog_data->base.prog_mask) - 1;
-         v[simd]->import_uniforms(v[first]);
+         v[simd]->import_uniforms(v[first].get());
       }
 
       const bool allow_spilling = !prog_data->base.prog_mask;
@@ -824,7 +821,7 @@ brw_compile_mesh(const struct brw_compiler *compiler,
       return NULL;
    }
 
-   fs_visitor *selected = v[selected_simd];
+   fs_visitor *selected = v[selected_simd].get();
    prog_data->base.prog_mask = 1 << selected_simd;
 
    if (unlikely(debug_enabled)) {
@@ -848,11 +845,6 @@ brw_compile_mesh(const struct brw_compiler *compiler,
 
    g.generate_code(selected->cfg, selected->dispatch_width, selected->shader_stats,
                    selected->performance_analysis.require(), params->stats);
-
-   delete v[0];
-   delete v[1];
-   delete v[2];
-
    return g.get_assembly();
 }