diff options
| author | 2023-08-06 09:38:16 +0200 | |
|---|---|---|
| committer | 2023-09-23 23:05:30 +0200 | |
| commit | 282ae8fa51e060e6d4ef026b734aa871b1b9331e (patch) | |
| tree | 3bc4603b6add0582315dc65544f1986427e4182d /src/video_core/renderer_opengl | |
| parent | QueryCache: Implement dependant queries. (diff) | |
| download | yuzu-282ae8fa51e060e6d4ef026b734aa871b1b9331e.tar.gz yuzu-282ae8fa51e060e6d4ef026b734aa871b1b9331e.tar.xz yuzu-282ae8fa51e060e6d4ef026b734aa871b1b9331e.zip | |
Query Cache: address issues
Diffstat (limited to 'src/video_core/renderer_opengl')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 24 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 3 |
2 files changed, 18 insertions, 9 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index a975bbe75..27e2de1bf 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -405,8 +405,6 @@ void RasterizerOpenGL::ResetCounter(VideoCommon::QueryType type) { | |||
| 405 | void RasterizerOpenGL::Query(GPUVAddr gpu_addr, VideoCommon::QueryType type, | 405 | void RasterizerOpenGL::Query(GPUVAddr gpu_addr, VideoCommon::QueryType type, |
| 406 | VideoCommon::QueryPropertiesFlags flags, u32 payload, u32 subreport) { | 406 | VideoCommon::QueryPropertiesFlags flags, u32 payload, u32 subreport) { |
| 407 | if (type == VideoCommon::QueryType::ZPassPixelCount64) { | 407 | if (type == VideoCommon::QueryType::ZPassPixelCount64) { |
| 408 | std::optional<u64> timestamp{True(flags & VideoCommon::QueryPropertiesFlags::HasTimeout) | ||
| 409 | ? std::make_optional<u64>(gpu.GetTicks()) : std:: nullopt }; | ||
| 410 | if (True(flags & VideoCommon::QueryPropertiesFlags::HasTimeout)) { | 408 | if (True(flags & VideoCommon::QueryPropertiesFlags::HasTimeout)) { |
| 411 | query_cache.Query(gpu_addr, VideoCore::QueryType::SamplesPassed, {gpu.GetTicks()}); | 409 | query_cache.Query(gpu_addr, VideoCore::QueryType::SamplesPassed, {gpu.GetTicks()}); |
| 412 | } else { | 410 | } else { |
| @@ -414,13 +412,23 @@ void RasterizerOpenGL::Query(GPUVAddr gpu_addr, VideoCommon::QueryType type, | |||
| 414 | } | 412 | } |
| 415 | return; | 413 | return; |
| 416 | } | 414 | } |
| 417 | if (True(flags & VideoCommon::QueryPropertiesFlags::HasTimeout)) { | 415 | if (type != VideoCommon::QueryType::Payload) { |
| 418 | u64 ticks = gpu.GetTicks(); | 416 | payload = 1u; |
| 419 | gpu_memory->Write<u64>(gpu_addr + 8, ticks); | 417 | } |
| 420 | gpu_memory->Write<u64>(gpu_addr, static_cast<u64>(payload)); | 418 | std::function<void()> func([this, gpu_addr, flags, memory_manager = gpu_memory, payload]() { |
| 421 | } else { | 419 | if (True(flags & VideoCommon::QueryPropertiesFlags::HasTimeout)) { |
| 422 | gpu_memory->Write<u32>(gpu_addr, payload); | 420 | u64 ticks = gpu.GetTicks(); |
| 421 | memory_manager->Write<u64>(gpu_addr + 8, ticks); | ||
| 422 | memory_manager->Write<u64>(gpu_addr, static_cast<u64>(payload)); | ||
| 423 | } else { | ||
| 424 | memory_manager->Write<u32>(gpu_addr, payload); | ||
| 425 | } | ||
| 426 | }); | ||
| 427 | if (True(flags & VideoCommon::QueryPropertiesFlags::IsAFence)) { | ||
| 428 | SignalFence(std::move(func)); | ||
| 429 | return; | ||
| 423 | } | 430 | } |
| 431 | func(); | ||
| 424 | } | 432 | } |
| 425 | 433 | ||
| 426 | void RasterizerOpenGL::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, | 434 | void RasterizerOpenGL::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 05e048e15..ceffe1f1e 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -87,7 +87,8 @@ public: | |||
| 87 | void Clear(u32 layer_count) override; | 87 | void Clear(u32 layer_count) override; |
| 88 | void DispatchCompute() override; | 88 | void DispatchCompute() override; |
| 89 | void ResetCounter(VideoCommon::QueryType type) override; | 89 | void ResetCounter(VideoCommon::QueryType type) override; |
| 90 | void Query(GPUVAddr gpu_addr, VideoCommon::QueryType type, VideoCommon::QueryPropertiesFlags flags, u32 payload, u32 subreport) override; | 90 | void Query(GPUVAddr gpu_addr, VideoCommon::QueryType type, |
| 91 | VideoCommon::QueryPropertiesFlags flags, u32 payload, u32 subreport) override; | ||
| 91 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override; | 92 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override; |
| 92 | void DisableGraphicsUniformBuffer(size_t stage, u32 index) override; | 93 | void DisableGraphicsUniformBuffer(size_t stage, u32 index) override; |
| 93 | void FlushAll() override; | 94 | void FlushAll() override; |