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
No known key found for this signature in database
GPG Key ID: AAAE6C7FD4186B0C
1 changed files with
12 additions and
7 deletions
-
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(), |
|
|
|
.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
|
|
|
|
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 BreadthFirstSearch(value, pred); |
|
|
|
|