From e824c30460449da57a67919d606415cf3e17cd87 Mon Sep 17 00:00:00 2001 From: Vishnu Vardan Date: Sun, 26 Apr 2026 01:49:21 -0400 Subject: [PATCH] mesa/st: remove redundant has_hw_atomics from st_context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit has_hw_atomics is set when the fragment shader stage reports non-zero max_hw_atomic_counters. Inline the same condition at each call site. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/13596 Reviewed-by: Marek Olšák Part-of: --- src/mesa/state_tracker/st_atom_atomicbuf.c | 7 ++++--- src/mesa/state_tracker/st_atom_storagebuf.c | 2 +- src/mesa/state_tracker/st_context.c | 8 +++----- src/mesa/state_tracker/st_context.h | 2 -- src/mesa/state_tracker/st_glsl_to_nir.cpp | 3 ++- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/mesa/state_tracker/st_atom_atomicbuf.c b/src/mesa/state_tracker/st_atom_atomicbuf.c index cf42e1e7280..41df15c72f6 100644 --- a/src/mesa/state_tracker/st_atom_atomicbuf.c +++ b/src/mesa/state_tracker/st_atom_atomicbuf.c @@ -70,7 +70,8 @@ st_bind_atomics(struct st_context *st, struct gl_program *prog, { unsigned i; - if (!prog || !st->pipe->set_shader_buffers || st->has_hw_atomics) + if (!prog || !st->pipe->set_shader_buffers || + st->screen->shader_caps[MESA_SHADER_FRAGMENT].max_hw_atomic_counters != 0) return; /* For !has_hw_atomics, the atomic counters have been rewritten to be above @@ -141,7 +142,7 @@ st_bind_tes_atomics(struct st_context *st) void st_bind_cs_atomics(struct st_context *st) { - if (st->has_hw_atomics) { + if (st->screen->shader_caps[MESA_SHADER_FRAGMENT].max_hw_atomic_counters != 0) { st_bind_hw_atomic_buffers(st); return; } @@ -176,7 +177,7 @@ st_bind_hw_atomic_buffers(struct st_context *st) int i; unsigned count; - if (!st->has_hw_atomics) + if (st->screen->shader_caps[MESA_SHADER_FRAGMENT].max_hw_atomic_counters == 0) return; count = MIN2(st->ctx->Const.MaxAtomicBufferBindings, PIPE_MAX_HW_ATOMIC_BUFFERS); diff --git a/src/mesa/state_tracker/st_atom_storagebuf.c b/src/mesa/state_tracker/st_atom_storagebuf.c index d8a3dc49561..dfa59f8aa8d 100644 --- a/src/mesa/state_tracker/st_atom_storagebuf.c +++ b/src/mesa/state_tracker/st_atom_storagebuf.c @@ -79,7 +79,7 @@ st_bind_ssbos(struct st_context *st, struct gl_program *prog, /* Clear out any stale shader buffers (or lowered atomic counters). */ int num_ssbos = prog->info.num_ssbos; - if (!st->has_hw_atomics) + if (st->screen->shader_caps[MESA_SHADER_FRAGMENT].max_hw_atomic_counters == 0) num_ssbos += st->last_used_atomic_bindings[shader_type]; if (st->last_num_ssbos[shader_type] > num_ssbos) { st->pipe->set_shader_buffers( diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index 68804f8c7da..22435bc59fb 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -377,7 +377,7 @@ st_init_driver_flags(struct st_context *st) struct gl_driver_flags *f = &st->ctx->DriverFlags; /* Shader resources */ - if (st->has_hw_atomics) + if (st->screen->shader_caps[MESA_SHADER_FRAGMENT].max_hw_atomic_counters != 0) ST_SET_STATE2(f->NewAtomicBuffer, ST_NEW_HW_ATOMICS, ST_NEW_CS_ATOMICS); else ST_SET_SHADER_STATES(f->NewAtomicBuffer, ATOMICS); @@ -423,7 +423,8 @@ st_init_driver_flags(struct st_context *st) ST_SET_SHADER_STATES(f->NewSamplersWithClamp, STATE); } - if (!st->has_hw_atomics && st->ctx->Const.ShaderStorageBufferOffsetAlignment > 4) + if (st->screen->shader_caps[MESA_SHADER_FRAGMENT].max_hw_atomic_counters == 0 + && st->ctx->Const.ShaderStorageBufferOffsetAlignment > 4) ST_SET_SHADER_STATES(f->NewAtomicBuffer, CONSTANTS); } @@ -591,9 +592,6 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe, break; default: break; } - st->has_hw_atomics = - screen->shader_caps[MESA_SHADER_FRAGMENT].max_hw_atomic_counters - ? true : false; util_throttle_init(&st->throttle, screen->caps.max_texture_upload_memory_budget); diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index abcc8dee9df..6e97ddd4648 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -174,8 +174,6 @@ struct st_context bool alpha_border_color_is_not_w; bool draw_needs_minmax_index; - bool has_hw_atomics; - bool is_threaded_context; /* driver supports scissored clears */ diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index e0ee23a1b5f..218b0e9ffcb 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -349,7 +349,8 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog, nir_remove_dead_variables(nir, nir_var_function_temp, NULL); - if (!st->has_hw_atomics && !screen->caps.nir_atomics_as_deref) { + if (st->screen->shader_caps[MESA_SHADER_FRAGMENT].max_hw_atomic_counters == 0 + && !screen->caps.nir_atomics_as_deref) { unsigned align_offset_state = 0; if (st->ctx->Const.ShaderStorageBufferOffsetAlignment > 4) { struct gl_program_parameter_list *params = prog->Parameters;