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;
 | 
			
		||||
            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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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,10 +1102,12 @@ public:
 | 
			
		||||
                tfb_streamer.Free(query->dependant_index);
 | 
			
		||||
            } else {
 | 
			
		||||
                u8* pointer = device_memory.GetPointer<u8>(query->dependant_address);
 | 
			
		||||
                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) {
 | 
			
		||||
                case Maxwell3D::Regs::PrimitiveTopology::Points:
 | 
			
		||||
@@ -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{};
 | 
			
		||||
        if (ptr != nullptr) {
 | 
			
		||||
            std::memcpy(&value, ptr, sizeof(value));
 | 
			
		||||
        }
 | 
			
		||||
        return value == 0;
 | 
			
		||||
    };
 | 
			
		||||
    std::array<VideoCommon::LookupData*, 2> objects{&object_1, &object_2};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user