aco: skip scratch buffer init when its arg is not used
authorQiang Yu <yuq825@gmail.com>
Fri, 14 Apr 2023 07:51:34 +0000 (15:51 +0800)
committerMarge Bot <emma+marge@anholt.net>
Wed, 19 Apr 2023 08:39:46 +0000 (08:39 +0000)
radeonsi does not pass scratch buffer address by arg,
but dynamical relocation symbol when upload. Just skip
this part to enable radeonsi use aco, but it will fail
when spill.

Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22525>

src/amd/compiler/aco_instruction_selection.cpp

index 7e9c82f..33a88eb 100644 (file)
@@ -11252,20 +11252,22 @@ add_startpgm(struct isel_context* ctx)
       }
    }
 
-   if (ctx->program->gfx_level < GFX9) {
-      /* Stash these in the program so that they can be accessed later when
-       * handling spilling.
-       */
-      ctx->program->private_segment_buffer = get_arg(ctx, ctx->args->ring_offsets);
-      ctx->program->scratch_offset = get_arg(ctx, ctx->args->scratch_offset);
+   if (ctx->args->ring_offsets.used) {
+      if (ctx->program->gfx_level < GFX9) {
+         /* Stash these in the program so that they can be accessed later when
+          * handling spilling.
+          */
+         ctx->program->private_segment_buffer = get_arg(ctx, ctx->args->ring_offsets);
+         ctx->program->scratch_offset = get_arg(ctx, ctx->args->scratch_offset);
 
-   } else if (ctx->program->gfx_level <= GFX10_3 && ctx->program->stage != raytracing_cs) {
-      /* Manually initialize scratch. For RT stages scratch initialization is done in the prolog. */
-      Operand scratch_offset = Operand(get_arg(ctx, ctx->args->scratch_offset));
-      scratch_offset.setLateKill(true);
-      Builder bld(ctx->program, ctx->block);
-      bld.pseudo(aco_opcode::p_init_scratch, bld.def(s2), bld.def(s1, scc),
-                 get_arg(ctx, ctx->args->ring_offsets), scratch_offset);
+      } else if (ctx->program->gfx_level <= GFX10_3 && ctx->program->stage != raytracing_cs) {
+         /* Manually initialize scratch. For RT stages scratch initialization is done in the prolog. */
+         Operand scratch_offset = Operand(get_arg(ctx, ctx->args->scratch_offset));
+         scratch_offset.setLateKill(true);
+         Builder bld(ctx->program, ctx->block);
+         bld.pseudo(aco_opcode::p_init_scratch, bld.def(s2), bld.def(s1, scc),
+                    get_arg(ctx, ctx->args->ring_offsets), scratch_offset);
+      }
    }
 
    return startpgm;