mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 05:08:08 +02:00
r600/sfn: Fix atomic lowering
Fixes:56dedf052fr600/sfn: add r600 specific lowering pass for atomics and use it Signed-off-by: Gert Wollny <gert.wollny@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21684> (cherry picked from commit9b09f244f0)
This commit is contained in:
parent
960dec4d50
commit
3fb500f802
2 changed files with 23 additions and 16 deletions
|
|
@ -4045,7 +4045,7 @@
|
|||
"description": "r600/sfn: Fix atomic lowering",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": "56dedf052f4af1903a0d312eb9c7721c69f36c69"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -443,25 +443,32 @@ r600_lower_clipvertex_to_clipdist(nir_shader *sh, pipe_stream_output_info& so_in
|
|||
static bool
|
||||
r600_nir_lower_atomics(nir_shader *shader)
|
||||
{
|
||||
/* First re-do the offsets, in Hardware we start at zero for each new
|
||||
* binding, and we use an offset of one per counter */
|
||||
int current_binding = -1;
|
||||
int current_offset = 0;
|
||||
nir_foreach_variable_with_modes(var, shader, nir_var_uniform)
|
||||
{
|
||||
if (!var->type->contains_atomic())
|
||||
continue;
|
||||
/* In Hardware we start at a zero index for each new
|
||||
* binding, and we use an offset of one per counter. We also
|
||||
* need to sort the atomics according to binding and offset. */
|
||||
std::map<unsigned, unsigned> binding_offset;
|
||||
std::map<unsigned, nir_variable *> sorted_var;
|
||||
|
||||
if (current_binding == (int)var->data.binding) {
|
||||
var->data.index = current_offset;
|
||||
current_offset += var->type->atomic_size() / ATOMIC_COUNTER_SIZE;
|
||||
} else {
|
||||
current_binding = var->data.binding;
|
||||
var->data.index = 0;
|
||||
current_offset = var->type->atomic_size() / ATOMIC_COUNTER_SIZE;
|
||||
nir_foreach_variable_with_modes_safe(var, shader, nir_var_uniform) {
|
||||
if (var->type->contains_atomic()) {
|
||||
sorted_var[(var->data.binding << 16) | var->data.offset] = var;
|
||||
exec_node_remove(&var->node);
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& [dummy, var] : sorted_var) {
|
||||
auto iindex = binding_offset.find(var->data.binding);
|
||||
unsigned offset_update = var->type->atomic_size() / ATOMIC_COUNTER_SIZE;
|
||||
if (iindex == binding_offset.end()) {
|
||||
var->data.index = 0;
|
||||
binding_offset[var->data.binding] = offset_update;
|
||||
} else {
|
||||
var->data.index = iindex->second;
|
||||
iindex->second += offset_update;
|
||||
}
|
||||
shader->variables.push_tail(&var->node);
|
||||
}
|
||||
|
||||
return nir_shader_instructions_pass(shader,
|
||||
r600_lower_deref_instr,
|
||||
nir_metadata_block_index | nir_metadata_dominance,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue