|
|
@ -310,16 +310,22 @@ private: |
|
|
std::function<void()> operation([this, new_async_job_id, timestamp] { |
|
|
std::function<void()> operation([this, new_async_job_id, timestamp] { |
|
|
std::unique_lock local_lock{mutex}; |
|
|
std::unique_lock local_lock{mutex}; |
|
|
AsyncJob& async_job = slot_async_jobs[new_async_job_id]; |
|
|
AsyncJob& async_job = slot_async_jobs[new_async_job_id]; |
|
|
|
|
|
u64 value = async_job.value; |
|
|
|
|
|
VAddr address = async_job.query_location; |
|
|
|
|
|
slot_async_jobs.erase(new_async_job_id); |
|
|
|
|
|
local_lock.unlock(); |
|
|
if (timestamp) { |
|
|
if (timestamp) { |
|
|
u64 timestamp_value = *timestamp; |
|
|
u64 timestamp_value = *timestamp; |
|
|
cpu_memory.WriteBlockUnsafe(async_job.query_location + sizeof(u64), |
|
|
|
|
|
×tamp_value, sizeof(8)); |
|
|
|
|
|
cpu_memory.WriteBlockUnsafe(async_job.query_location, &async_job.value, sizeof(8)); |
|
|
|
|
|
|
|
|
cpu_memory.WriteBlockUnsafe(address + sizeof(u64), ×tamp_value, sizeof(u64)); |
|
|
|
|
|
cpu_memory.WriteBlockUnsafe(address, &value, sizeof(u64)); |
|
|
|
|
|
rasterizer.InvalidateRegion(address, sizeof(u64) * 2, |
|
|
|
|
|
VideoCommon::CacheType::NoQueryCache); |
|
|
} else { |
|
|
} else { |
|
|
u32 small_value = static_cast<u32>(async_job.value); |
|
|
|
|
|
cpu_memory.WriteBlockUnsafe(async_job.query_location, &small_value, sizeof(u32)); |
|
|
|
|
|
|
|
|
u32 small_value = static_cast<u32>(value); |
|
|
|
|
|
cpu_memory.WriteBlockUnsafe(address, &small_value, sizeof(u32)); |
|
|
|
|
|
rasterizer.InvalidateRegion(address, sizeof(u32), |
|
|
|
|
|
VideoCommon::CacheType::NoQueryCache); |
|
|
} |
|
|
} |
|
|
slot_async_jobs.erase(new_async_job_id); |
|
|
|
|
|
}); |
|
|
}); |
|
|
rasterizer.SyncOperation(std::move(operation)); |
|
|
rasterizer.SyncOperation(std::move(operation)); |
|
|
} |
|
|
} |
|
|
|