aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorliamwhite <[email protected]>2024-02-27 09:42:15 -0500
committerGitHub <[email protected]>2024-02-27 15:42:15 +0100
commit6948ac8c1622ebb3f9da065d3678e571b7ff726e (patch)
tree1cfed7dc79952d21efc54a265988fd0a4e225230 /src
parentb2e129eaa5c97f216dcf02e2d853ca809ce392b7 (diff)
downloadyuzu-android-6948ac8c1622ebb3f9da065d3678e571b7ff726e.tar.gz
yuzu-android-6948ac8c1622ebb3f9da065d3678e571b7ff726e.zip
general: workarounds for SMMU syncing issues (#12749)
Diffstat (limited to 'src')
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h5
-rw-r--r--src/video_core/renderer_vulkan/vk_query_cache.cpp14
2 files changed, 12 insertions, 7 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index ed7a5b27e..af237703d 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -1488,7 +1488,10 @@ void BufferCache<P>::ImmediateUploadMemory([[maybe_unused]] Buffer& buffer,
std::span<const u8> upload_span;
const DAddr device_addr = buffer.CpuAddr() + copy.dst_offset;
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 {
if (immediate_buffer.empty()) {
immediate_buffer = ImmediateBuffer(largest_copy);
diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp
index 7cbc9c73c..a28296bda 100644
--- a/src/video_core/renderer_vulkan/vk_query_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp
@@ -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;
pending_flush_queries.push_back(index);
@@ -1104,9 +1102,11 @@ public:
tfb_streamer.Free(query->dependant_index);
} else {
u8* pointer = device_memory.GetPointer<u8>(query->dependant_address);
- u32 result;
- std::memcpy(&result, pointer, sizeof(u32));
- num_vertices = static_cast<u64>(result) / query->stride;
+ if (pointer != nullptr) {
+ u32 result;
+ std::memcpy(&result, pointer, sizeof(u32));
+ num_vertices = static_cast<u64>(result) / query->stride;
+ }
}
query->value = [&]() -> u64 {
switch (query->topology) {
@@ -1360,7 +1360,9 @@ bool QueryCacheRuntime::HostConditionalRenderingCompareValues(VideoCommon::Looku
const auto check_value = [&](DAddr address) {
u8* ptr = impl->device_memory.GetPointer<u8>(address);
u64 value{};
- std::memcpy(&value, ptr, sizeof(value));
+ if (ptr != nullptr) {
+ std::memcpy(&value, ptr, sizeof(value));
+ }
return value == 0;
};
std::array<VideoCommon::LookupData*, 2> objects{&object_1, &object_2};