mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	general: workarounds for SMMU syncing issues (#12749)
This commit is contained in:
		@@ -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,9 +1102,11 @@ 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);
 | 
				
			||||||
                u32 result;
 | 
					                if (pointer != nullptr) {
 | 
				
			||||||
                std::memcpy(&result, pointer, sizeof(u32));
 | 
					                    u32 result;
 | 
				
			||||||
                num_vertices = static_cast<u64>(result) / query->stride;
 | 
					                    std::memcpy(&result, pointer, sizeof(u32));
 | 
				
			||||||
 | 
					                    num_vertices = static_cast<u64>(result) / query->stride;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            query->value = [&]() -> u64 {
 | 
					            query->value = [&]() -> u64 {
 | 
				
			||||||
                switch (query->topology) {
 | 
					                switch (query->topology) {
 | 
				
			||||||
@@ -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{};
 | 
				
			||||||
        std::memcpy(&value, ptr, sizeof(value));
 | 
					        if (ptr != nullptr) {
 | 
				
			||||||
 | 
					            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};
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user