diff options
| -rw-r--r-- | src/video_core/query_cache.h | 39 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_fence_manager.cpp | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 6 | 
3 files changed, 30 insertions, 16 deletions
| diff --git a/src/video_core/query_cache.h b/src/video_core/query_cache.h index 2a14cc36a..9c6f57817 100644 --- a/src/video_core/query_cache.h +++ b/src/video_core/query_cache.h @@ -6,6 +6,7 @@  #include <algorithm>  #include <array>  #include <cstring> +#include <functional>  #include <iterator>  #include <list>  #include <memory> @@ -101,10 +102,10 @@ class QueryCacheBase : public VideoCommon::ChannelSetupCaches<VideoCommon::Chann  public:      explicit QueryCacheBase(VideoCore::RasterizerInterface& rasterizer_,                              Core::Memory::Memory& cpu_memory_) -        : rasterizer{rasterizer_}, cpu_memory{cpu_memory_}, streams{ -                                       {CounterStream{static_cast<QueryCache&>(*this), -                                                      VideoCore::QueryType::SamplesPassed}}} { -        (void) slot_async_jobs.insert(); // Null value +        : rasterizer{rasterizer_}, +          cpu_memory{cpu_memory_}, streams{{CounterStream{static_cast<QueryCache&>(*this), +                                                          VideoCore::QueryType::SamplesPassed}}} { +        (void)slot_async_jobs.insert(); // Null value      }      void InvalidateRegion(VAddr addr, std::size_t size) { @@ -136,7 +137,7 @@ public:              query = Register(type, *cpu_addr, host_ptr, timestamp.has_value());          } -        auto result = query->BindCounter(Stream(type).Current()); +        auto result = query->BindCounter(Stream(type).Current(), timestamp);          if (result) {              auto async_job_id = query->GetAsyncJob();              auto& async_job = slot_async_jobs[async_job_id]; @@ -294,15 +295,17 @@ private:      void AsyncFlushQuery(CachedQuery* query, std::optional<u64> timestamp,                           std::unique_lock<std::recursive_mutex>& lock) {          const AsyncJobId new_async_job_id = slot_async_jobs.insert(); -        AsyncJob& async_job = slot_async_jobs[new_async_job_id]; -        query->SetAsyncJob(new_async_job_id); -        async_job.query_location = query->GetCpuAddr(); -        async_job.collected = false; +        { +            AsyncJob& async_job = slot_async_jobs[new_async_job_id]; +            query->SetAsyncJob(new_async_job_id); +            async_job.query_location = query->GetCpuAddr(); +            async_job.collected = false; -        if (!uncommitted_flushes) { -            uncommitted_flushes = std::make_shared<std::vector<AsyncJobId>>(); +            if (!uncommitted_flushes) { +                uncommitted_flushes = std::make_shared<std::vector<AsyncJobId>>(); +            } +            uncommitted_flushes->push_back(new_async_job_id);          } -        uncommitted_flushes->push_back(new_async_job_id);          lock.unlock();          std::function<void()> operation([this, new_async_job_id, timestamp] {              std::unique_lock local_lock{mutex}; @@ -408,11 +411,20 @@ public:          // When counter is nullptr it means that it's just been reset. We are supposed to write a          // zero in these cases.          const u64 value = counter ? counter->Query(async) : 0; +        if (async) { +            return value; +        } +        std::memcpy(host_ptr, &value, sizeof(u64)); + +        if (timestamp) { +            std::memcpy(host_ptr + TIMESTAMP_OFFSET, &*timestamp, sizeof(u64)); +        }          return value;      }      /// Binds a counter to this query. -    std::optional<u64> BindCounter(std::shared_ptr<HostCounter> counter_) { +    std::optional<u64> BindCounter(std::shared_ptr<HostCounter> counter_, +                                   std::optional<u64> timestamp_) {          std::optional<u64> result{};          if (counter) {              // If there's an old counter set it means the query is being rewritten by the game. @@ -420,6 +432,7 @@ public:              result = std::make_optional(Flush());          }          counter = std::move(counter_); +        timestamp = timestamp_;          return result;      } diff --git a/src/video_core/renderer_vulkan/vk_fence_manager.cpp b/src/video_core/renderer_vulkan/vk_fence_manager.cpp index 3bba8aeb0..fad9e3832 100644 --- a/src/video_core/renderer_vulkan/vk_fence_manager.cpp +++ b/src/video_core/renderer_vulkan/vk_fence_manager.cpp @@ -10,7 +10,6 @@  #include "video_core/renderer_vulkan/vk_texture_cache.h"  #include "video_core/vulkan_common/vulkan_device.h" -  namespace Vulkan {  InnerFence::InnerFence(Scheduler& scheduler_, bool is_stubbed_) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 2d865729a..2d5ef89f0 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -172,7 +172,8 @@ RasterizerVulkan::RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra        buffer_cache(*this, cpu_memory_, buffer_cache_runtime),        pipeline_cache(*this, device, scheduler, descriptor_pool, update_descriptor_queue,                       render_pass_cache, buffer_cache, texture_cache, gpu.ShaderNotify()), -      query_cache{*this, cpu_memory_, device, scheduler}, accelerate_dma(buffer_cache, texture_cache, scheduler), +      query_cache{*this, cpu_memory_, device, scheduler}, +      accelerate_dma(buffer_cache, texture_cache, scheduler),        fence_manager(*this, gpu, texture_cache, buffer_cache, query_cache, device, scheduler),        wfi_event(device.GetLogical().CreateEvent()) {      scheduler.SetQueryCache(query_cache); @@ -675,7 +676,8 @@ bool RasterizerVulkan::AccelerateConditionalRendering() {      const GPUVAddr condition_address{maxwell3d->regs.render_enable.Address()};      Maxwell::ReportSemaphore::Compare cmp;      if (gpu_memory->IsMemoryDirty(condition_address, sizeof(cmp), -                                  VideoCommon::CacheType::BufferCache | VideoCommon::CacheType::QueryCache)) { +                                  VideoCommon::CacheType::BufferCache | +                                      VideoCommon::CacheType::QueryCache)) {          return true;      }      return false; | 
