Browse Source

[host] Adjusted Track function for bias handling and alignment checks for storage buffers

eds-true-adreno-fixes
CamilleLaVey 4 weeks ago
committed by Caio Oliveira
parent
commit
a83157f0a9
No known key found for this signature in database GPG Key ID: AAAE6C7FD4186B0C
  1. 19
      src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp

19
src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp

@ -354,16 +354,21 @@ std::optional<StorageBufferAddr> Track(const IR::Value& value, const Bias* bias)
.index = index.U32(), .index = index.U32(),
.offset = offset.U32(), .offset = offset.U32(),
}; };
const u32 alignment{bias ? bias->alignment : 16U};
if (!Common::IsAligned(storage_buffer.offset, alignment)) {
if (bias) {
if (!MeetsBias(storage_buffer, *bias)) {
// We have to blacklist some addresses in case we wrongly
// point to them
return std::nullopt;
}
const u32 relative_offset{storage_buffer.offset - bias->offset_begin};
if (!Common::IsAligned(relative_offset, bias->alignment)) {
// NVN descriptors are tightly packed but the range base is biased
return std::nullopt;
}
} else if (!Common::IsAligned(storage_buffer.offset, 16U)) {
// The SSBO pointer has to be aligned // The SSBO pointer has to be aligned
return std::nullopt; return std::nullopt;
} }
if (bias && !MeetsBias(storage_buffer, *bias)) {
// We have to blacklist some addresses in case we wrongly
// point to them
return std::nullopt;
}
return storage_buffer; return storage_buffer;
}}; }};
return BreadthFirstSearch(value, pred); return BreadthFirstSearch(value, pred);

Loading…
Cancel
Save