general: workarounds for SMMU syncing issues (#12749)
This commit is contained in:
parent
b2e129eaa5
commit
6948ac8c16
2 changed files with 12 additions and 7 deletions
|
@ -1488,7 +1488,10 @@ void BufferCache<P>::ImmediateUploadMemory([[maybe_unused]] Buffer& buffer,
|
||||||
std::span<const u8> upload_span;
|
std::span<const u8> upload_span;
|
||||||
const DAddr device_addr = buffer.CpuAddr() + copy.dst_offset;
|
const DAddr device_addr = buffer.CpuAddr() + copy.dst_offset;
|
||||||
if (IsRangeGranular(device_addr, copy.size)) {
|
if (IsRangeGranular(device_addr, copy.size)) {
|
||||||
upload_span = std::span(device_memory.GetPointer<u8>(device_addr), copy.size);
|
auto* const ptr = device_memory.GetPointer<u8>(device_addr);
|
||||||
|
if (ptr != nullptr) {
|
||||||
|
upload_span = std::span(ptr, copy.size);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (immediate_buffer.empty()) {
|
if (immediate_buffer.empty()) {
|
||||||
immediate_buffer = ImmediateBuffer(largest_copy);
|
immediate_buffer = ImmediateBuffer(largest_copy);
|
||||||
|
|
|
@ -1064,8 +1064,6 @@ public:
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
auto* ptr = device_memory.GetPointer<u8>(new_query->dependant_address);
|
|
||||||
ASSERT(ptr != nullptr);
|
|
||||||
|
|
||||||
new_query->dependant_manage = must_manage_dependance;
|
new_query->dependant_manage = must_manage_dependance;
|
||||||
pending_flush_queries.push_back(index);
|
pending_flush_queries.push_back(index);
|
||||||
|
@ -1104,10 +1102,12 @@ public:
|
||||||
tfb_streamer.Free(query->dependant_index);
|
tfb_streamer.Free(query->dependant_index);
|
||||||
} else {
|
} else {
|
||||||
u8* pointer = device_memory.GetPointer<u8>(query->dependant_address);
|
u8* pointer = device_memory.GetPointer<u8>(query->dependant_address);
|
||||||
|
if (pointer != nullptr) {
|
||||||
u32 result;
|
u32 result;
|
||||||
std::memcpy(&result, pointer, sizeof(u32));
|
std::memcpy(&result, pointer, sizeof(u32));
|
||||||
num_vertices = static_cast<u64>(result) / query->stride;
|
num_vertices = static_cast<u64>(result) / query->stride;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
query->value = [&]() -> u64 {
|
query->value = [&]() -> u64 {
|
||||||
switch (query->topology) {
|
switch (query->topology) {
|
||||||
case Maxwell3D::Regs::PrimitiveTopology::Points:
|
case Maxwell3D::Regs::PrimitiveTopology::Points:
|
||||||
|
@ -1360,7 +1360,9 @@ bool QueryCacheRuntime::HostConditionalRenderingCompareValues(VideoCommon::Looku
|
||||||
const auto check_value = [&](DAddr address) {
|
const auto check_value = [&](DAddr address) {
|
||||||
u8* ptr = impl->device_memory.GetPointer<u8>(address);
|
u8* ptr = impl->device_memory.GetPointer<u8>(address);
|
||||||
u64 value{};
|
u64 value{};
|
||||||
|
if (ptr != nullptr) {
|
||||||
std::memcpy(&value, ptr, sizeof(value));
|
std::memcpy(&value, ptr, sizeof(value));
|
||||||
|
}
|
||||||
return value == 0;
|
return value == 0;
|
||||||
};
|
};
|
||||||
std::array<VideoCommon::LookupData*, 2> objects{&object_1, &object_2};
|
std::array<VideoCommon::LookupData*, 2> objects{&object_1, &object_2};
|
||||||
|
|
Loading…
Reference in a new issue