diff options
| author | 2023-08-04 03:32:30 +0200 | |
|---|---|---|
| committer | 2023-09-23 23:05:29 +0200 | |
| commit | f1a2e367113518b277f34ffbb04499882c3b6051 (patch) | |
| tree | 0920a98bd359b9207130d01f6df4ae5135ec805c /src/video_core/buffer_cache | |
| parent | Query Cache: Setup Base rework (diff) | |
| download | yuzu-f1a2e367113518b277f34ffbb04499882c3b6051.tar.gz yuzu-f1a2e367113518b277f34ffbb04499882c3b6051.tar.xz yuzu-f1a2e367113518b277f34ffbb04499882c3b6051.zip | |
Query Cachge: Fully rework Vulkan's query cache
Diffstat (limited to 'src/video_core/buffer_cache')
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 19 | ||||
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache_base.h | 12 |
2 files changed, 25 insertions, 6 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 8be7bd594..f91b7d1e4 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h | |||
| @@ -272,13 +272,20 @@ std::pair<typename P::Buffer*, u32> BufferCache<P>::ObtainBuffer(GPUVAddr gpu_ad | |||
| 272 | if (!cpu_addr) { | 272 | if (!cpu_addr) { |
| 273 | return {&slot_buffers[NULL_BUFFER_ID], 0}; | 273 | return {&slot_buffers[NULL_BUFFER_ID], 0}; |
| 274 | } | 274 | } |
| 275 | const BufferId buffer_id = FindBuffer(*cpu_addr, size); | 275 | return ObtainCPUBuffer(*cpu_addr, size, sync_info, post_op); |
| 276 | } | ||
| 277 | |||
| 278 | template <class P> | ||
| 279 | std::pair<typename P::Buffer*, u32> BufferCache<P>::ObtainCPUBuffer(VAddr cpu_addr, u32 size, | ||
| 280 | ObtainBufferSynchronize sync_info, | ||
| 281 | ObtainBufferOperation post_op) { | ||
| 282 | const BufferId buffer_id = FindBuffer(cpu_addr, size); | ||
| 276 | Buffer& buffer = slot_buffers[buffer_id]; | 283 | Buffer& buffer = slot_buffers[buffer_id]; |
| 277 | 284 | ||
| 278 | // synchronize op | 285 | // synchronize op |
| 279 | switch (sync_info) { | 286 | switch (sync_info) { |
| 280 | case ObtainBufferSynchronize::FullSynchronize: | 287 | case ObtainBufferSynchronize::FullSynchronize: |
| 281 | SynchronizeBuffer(buffer, *cpu_addr, size); | 288 | SynchronizeBuffer(buffer, cpu_addr, size); |
| 282 | break; | 289 | break; |
| 283 | default: | 290 | default: |
| 284 | break; | 291 | break; |
| @@ -286,11 +293,11 @@ std::pair<typename P::Buffer*, u32> BufferCache<P>::ObtainBuffer(GPUVAddr gpu_ad | |||
| 286 | 293 | ||
| 287 | switch (post_op) { | 294 | switch (post_op) { |
| 288 | case ObtainBufferOperation::MarkAsWritten: | 295 | case ObtainBufferOperation::MarkAsWritten: |
| 289 | MarkWrittenBuffer(buffer_id, *cpu_addr, size); | 296 | MarkWrittenBuffer(buffer_id, cpu_addr, size); |
| 290 | break; | 297 | break; |
| 291 | case ObtainBufferOperation::DiscardWrite: { | 298 | case ObtainBufferOperation::DiscardWrite: { |
| 292 | VAddr cpu_addr_start = Common::AlignDown(*cpu_addr, 64); | 299 | VAddr cpu_addr_start = Common::AlignDown(cpu_addr, 64); |
| 293 | VAddr cpu_addr_end = Common::AlignUp(*cpu_addr + size, 64); | 300 | VAddr cpu_addr_end = Common::AlignUp(cpu_addr + size, 64); |
| 294 | IntervalType interval{cpu_addr_start, cpu_addr_end}; | 301 | IntervalType interval{cpu_addr_start, cpu_addr_end}; |
| 295 | ClearDownload(interval); | 302 | ClearDownload(interval); |
| 296 | common_ranges.subtract(interval); | 303 | common_ranges.subtract(interval); |
| @@ -300,7 +307,7 @@ std::pair<typename P::Buffer*, u32> BufferCache<P>::ObtainBuffer(GPUVAddr gpu_ad | |||
| 300 | break; | 307 | break; |
| 301 | } | 308 | } |
| 302 | 309 | ||
| 303 | return {&buffer, buffer.Offset(*cpu_addr)}; | 310 | return {&buffer, buffer.Offset(cpu_addr)}; |
| 304 | } | 311 | } |
| 305 | 312 | ||
| 306 | template <class P> | 313 | template <class P> |
diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h index 0b7135d49..9507071e5 100644 --- a/src/video_core/buffer_cache/buffer_cache_base.h +++ b/src/video_core/buffer_cache/buffer_cache_base.h | |||
| @@ -295,6 +295,10 @@ public: | |||
| 295 | [[nodiscard]] std::pair<Buffer*, u32> ObtainBuffer(GPUVAddr gpu_addr, u32 size, | 295 | [[nodiscard]] std::pair<Buffer*, u32> ObtainBuffer(GPUVAddr gpu_addr, u32 size, |
| 296 | ObtainBufferSynchronize sync_info, | 296 | ObtainBufferSynchronize sync_info, |
| 297 | ObtainBufferOperation post_op); | 297 | ObtainBufferOperation post_op); |
| 298 | |||
| 299 | [[nodiscard]] std::pair<Buffer*, u32> ObtainCPUBuffer(VAddr gpu_addr, u32 size, | ||
| 300 | ObtainBufferSynchronize sync_info, | ||
| 301 | ObtainBufferOperation post_op); | ||
| 298 | void FlushCachedWrites(); | 302 | void FlushCachedWrites(); |
| 299 | 303 | ||
| 300 | /// Return true when there are uncommitted buffers to be downloaded | 304 | /// Return true when there are uncommitted buffers to be downloaded |
| @@ -335,6 +339,14 @@ public: | |||
| 335 | 339 | ||
| 336 | [[nodiscard]] std::pair<Buffer*, u32> GetDrawIndirectBuffer(); | 340 | [[nodiscard]] std::pair<Buffer*, u32> GetDrawIndirectBuffer(); |
| 337 | 341 | ||
| 342 | template <typename Func> | ||
| 343 | void BufferOperations(Func&& func) { | ||
| 344 | do { | ||
| 345 | channel_state->has_deleted_buffers = false; | ||
| 346 | func(); | ||
| 347 | } while (channel_state->has_deleted_buffers); | ||
| 348 | } | ||
| 349 | |||
| 338 | std::recursive_mutex mutex; | 350 | std::recursive_mutex mutex; |
| 339 | Runtime& runtime; | 351 | Runtime& runtime; |
| 340 | 352 | ||