summaryrefslogtreecommitdiffstats
path: root/src/video_core/query_cache.h
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2020-04-06 00:39:24 +0200
committerFernando Sahmkow <fsahmkow27@gmail.com>2020-04-06 15:23:07 +0200
commit3dd5c07454bda0518b965f941399d64aabac5629 (patch)
tree217539bf095122bc2d81898044bf488887196e28 /src/video_core/query_cache.h
parentBuffer Cache: Use vAddr instead of physical memory. (diff)
downloadyuzu-3dd5c07454bda0518b965f941399d64aabac5629.tar
yuzu-3dd5c07454bda0518b965f941399d64aabac5629.tar.gz
yuzu-3dd5c07454bda0518b965f941399d64aabac5629.tar.bz2
yuzu-3dd5c07454bda0518b965f941399d64aabac5629.tar.lz
yuzu-3dd5c07454bda0518b965f941399d64aabac5629.tar.xz
yuzu-3dd5c07454bda0518b965f941399d64aabac5629.tar.zst
yuzu-3dd5c07454bda0518b965f941399d64aabac5629.zip
Diffstat (limited to 'src/video_core/query_cache.h')
-rw-r--r--src/video_core/query_cache.h36
1 files changed, 18 insertions, 18 deletions
diff --git a/src/video_core/query_cache.h b/src/video_core/query_cache.h
index e66054ed0..84cbe93f6 100644
--- a/src/video_core/query_cache.h
+++ b/src/video_core/query_cache.h
@@ -98,12 +98,12 @@ public:
static_cast<QueryCache&>(*this),
VideoCore::QueryType::SamplesPassed}}} {}
- void InvalidateRegion(CacheAddr addr, std::size_t size) {
+ void InvalidateRegion(VAddr addr, std::size_t size) {
std::unique_lock lock{mutex};
FlushAndRemoveRegion(addr, size);
}
- void FlushRegion(CacheAddr addr, std::size_t size) {
+ void FlushRegion(VAddr addr, std::size_t size) {
std::unique_lock lock{mutex};
FlushAndRemoveRegion(addr, size);
}
@@ -117,14 +117,18 @@ public:
void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) {
std::unique_lock lock{mutex};
auto& memory_manager = system.GPU().MemoryManager();
- const auto host_ptr = memory_manager.GetPointer(gpu_addr);
+ const std::optional<VAddr> cpu_addr_opt =
+ memory_manager.GpuToCpuAddress(gpu_addr);
+ ASSERT(cpu_addr_opt);
+ VAddr cpu_addr = *cpu_addr_opt;
- CachedQuery* query = TryGet(ToCacheAddr(host_ptr));
+
+ CachedQuery* query = TryGet(cpu_addr);
if (!query) {
- const auto cpu_addr = memory_manager.GpuToCpuAddress(gpu_addr);
- ASSERT_OR_EXECUTE(cpu_addr, return;);
+ ASSERT_OR_EXECUTE(cpu_addr_opt, return;);
+ const auto host_ptr = memory_manager.GetPointer(gpu_addr);
- query = Register(type, *cpu_addr, host_ptr, timestamp.has_value());
+ query = Register(type, cpu_addr, host_ptr, timestamp.has_value());
}
query->BindCounter(Stream(type).Current(), timestamp);
@@ -173,11 +177,11 @@ protected:
private:
/// Flushes a memory range to guest memory and removes it from the cache.
- void FlushAndRemoveRegion(CacheAddr addr, std::size_t size) {
+ void FlushAndRemoveRegion(VAddr addr, std::size_t size) {
const u64 addr_begin = static_cast<u64>(addr);
const u64 addr_end = addr_begin + static_cast<u64>(size);
const auto in_range = [addr_begin, addr_end](CachedQuery& query) {
- const u64 cache_begin = query.GetCacheAddr();
+ const u64 cache_begin = query.GetCpuAddr();
const u64 cache_end = cache_begin + query.SizeInBytes();
return cache_begin < addr_end && addr_begin < cache_end;
};
@@ -193,7 +197,7 @@ private:
if (!in_range(query)) {
continue;
}
- rasterizer.UpdatePagesCachedCount(query.CpuAddr(), query.SizeInBytes(), -1);
+ rasterizer.UpdatePagesCachedCount(query.GetCpuAddr(), query.SizeInBytes(), -1);
query.Flush();
}
contents.erase(std::remove_if(std::begin(contents), std::end(contents), in_range),
@@ -204,13 +208,13 @@ private:
/// Registers the passed parameters as cached and returns a pointer to the stored cached query.
CachedQuery* Register(VideoCore::QueryType type, VAddr cpu_addr, u8* host_ptr, bool timestamp) {
rasterizer.UpdatePagesCachedCount(cpu_addr, CachedQuery::SizeInBytes(timestamp), 1);
- const u64 page = static_cast<u64>(ToCacheAddr(host_ptr)) >> PAGE_SHIFT;
+ const u64 page = static_cast<u64>(cpu_addr) >> PAGE_SHIFT;
return &cached_queries[page].emplace_back(static_cast<QueryCache&>(*this), type, cpu_addr,
host_ptr);
}
/// Tries to a get a cached query. Returns nullptr on failure.
- CachedQuery* TryGet(CacheAddr addr) {
+ CachedQuery* TryGet(VAddr addr) {
const u64 page = static_cast<u64>(addr) >> PAGE_SHIFT;
const auto it = cached_queries.find(page);
if (it == std::end(cached_queries)) {
@@ -219,7 +223,7 @@ private:
auto& contents = it->second;
const auto found =
std::find_if(std::begin(contents), std::end(contents),
- [addr](auto& query) { return query.GetCacheAddr() == addr; });
+ [addr](auto& query) { return query.GetCpuAddr() == addr; });
return found != std::end(contents) ? &*found : nullptr;
}
@@ -323,14 +327,10 @@ public:
timestamp = timestamp_;
}
- VAddr CpuAddr() const noexcept {
+ VAddr GetCpuAddr() const noexcept {
return cpu_addr;
}
- CacheAddr GetCacheAddr() const noexcept {
- return ToCacheAddr(host_ptr);
- }
-
u64 SizeInBytes() const noexcept {
return SizeInBytes(timestamp.has_value());
}