diff options
| author | 2020-06-24 11:40:30 -0400 | |
|---|---|---|
| committer | 2020-06-24 11:40:30 -0400 | |
| commit | 0e1268e507ea6a6f84a41159bd1d5b2f4c24eb1c (patch) | |
| tree | 4d4ae082c57945c29cad70d1afb258e8d17df717 /src/video_core/buffer_cache | |
| parent | Merge pull request #4083 from Morph1984/B10G11R11F (diff) | |
| parent | buffer_cache: Use buffer methods instead of cache virtual methods (diff) | |
| download | yuzu-0e1268e507ea6a6f84a41159bd1d5b2f4c24eb1c.tar.gz yuzu-0e1268e507ea6a6f84a41159bd1d5b2f4c24eb1c.tar.xz yuzu-0e1268e507ea6a6f84a41159bd1d5b2f4c24eb1c.zip | |
Merge pull request #4105 from ReinUsesLisp/resident-buffers
gl_rasterizer: Use NV_vertex_buffer_unified_memory for vertex buffer robustness
Diffstat (limited to 'src/video_core/buffer_cache')
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 44 |
1 files changed, 19 insertions, 25 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index bae1d527c..cf8bdd021 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h | |||
| @@ -41,7 +41,11 @@ class BufferCache { | |||
| 41 | static constexpr u64 BLOCK_PAGE_SIZE = 1ULL << BLOCK_PAGE_BITS; | 41 | static constexpr u64 BLOCK_PAGE_SIZE = 1ULL << BLOCK_PAGE_BITS; |
| 42 | 42 | ||
| 43 | public: | 43 | public: |
| 44 | using BufferInfo = std::pair<BufferType, u64>; | 44 | struct BufferInfo { |
| 45 | BufferType handle; | ||
| 46 | u64 offset; | ||
| 47 | u64 address; | ||
| 48 | }; | ||
| 45 | 49 | ||
| 46 | BufferInfo UploadMemory(GPUVAddr gpu_addr, std::size_t size, std::size_t alignment = 4, | 50 | BufferInfo UploadMemory(GPUVAddr gpu_addr, std::size_t size, std::size_t alignment = 4, |
| 47 | bool is_written = false, bool use_fast_cbuf = false) { | 51 | bool is_written = false, bool use_fast_cbuf = false) { |
| @@ -50,7 +54,7 @@ public: | |||
| 50 | auto& memory_manager = system.GPU().MemoryManager(); | 54 | auto& memory_manager = system.GPU().MemoryManager(); |
| 51 | const std::optional<VAddr> cpu_addr_opt = memory_manager.GpuToCpuAddress(gpu_addr); | 55 | const std::optional<VAddr> cpu_addr_opt = memory_manager.GpuToCpuAddress(gpu_addr); |
| 52 | if (!cpu_addr_opt) { | 56 | if (!cpu_addr_opt) { |
| 53 | return {GetEmptyBuffer(size), 0}; | 57 | return GetEmptyBuffer(size); |
| 54 | } | 58 | } |
| 55 | const VAddr cpu_addr = *cpu_addr_opt; | 59 | const VAddr cpu_addr = *cpu_addr_opt; |
| 56 | 60 | ||
| @@ -88,7 +92,7 @@ public: | |||
| 88 | Buffer* const block = GetBlock(cpu_addr, size); | 92 | Buffer* const block = GetBlock(cpu_addr, size); |
| 89 | MapInterval* const map = MapAddress(block, gpu_addr, cpu_addr, size); | 93 | MapInterval* const map = MapAddress(block, gpu_addr, cpu_addr, size); |
| 90 | if (!map) { | 94 | if (!map) { |
| 91 | return {GetEmptyBuffer(size), 0}; | 95 | return GetEmptyBuffer(size); |
| 92 | } | 96 | } |
| 93 | if (is_written) { | 97 | if (is_written) { |
| 94 | map->MarkAsModified(true, GetModifiedTicks()); | 98 | map->MarkAsModified(true, GetModifiedTicks()); |
| @@ -101,7 +105,7 @@ public: | |||
| 101 | } | 105 | } |
| 102 | } | 106 | } |
| 103 | 107 | ||
| 104 | return {block->Handle(), static_cast<u64>(block->Offset(cpu_addr))}; | 108 | return BufferInfo{block->Handle(), block->Offset(cpu_addr), block->Address()}; |
| 105 | } | 109 | } |
| 106 | 110 | ||
| 107 | /// Uploads from a host memory. Returns the OpenGL buffer where it's located and its offset. | 111 | /// Uploads from a host memory. Returns the OpenGL buffer where it's located and its offset. |
| @@ -254,27 +258,17 @@ public: | |||
| 254 | committed_flushes.pop_front(); | 258 | committed_flushes.pop_front(); |
| 255 | } | 259 | } |
| 256 | 260 | ||
| 257 | virtual BufferType GetEmptyBuffer(std::size_t size) = 0; | 261 | virtual BufferInfo GetEmptyBuffer(std::size_t size) = 0; |
| 258 | 262 | ||
| 259 | protected: | 263 | protected: |
| 260 | explicit BufferCache(VideoCore::RasterizerInterface& rasterizer, Core::System& system, | 264 | explicit BufferCache(VideoCore::RasterizerInterface& rasterizer, Core::System& system, |
| 261 | std::unique_ptr<StreamBuffer> stream_buffer_) | 265 | std::unique_ptr<StreamBuffer> stream_buffer) |
| 262 | : rasterizer{rasterizer}, system{system}, stream_buffer{std::move(stream_buffer_)}, | 266 | : rasterizer{rasterizer}, system{system}, stream_buffer{std::move(stream_buffer)} {} |
| 263 | stream_buffer_handle{stream_buffer->Handle()} {} | ||
| 264 | 267 | ||
| 265 | ~BufferCache() = default; | 268 | ~BufferCache() = default; |
| 266 | 269 | ||
| 267 | virtual std::shared_ptr<Buffer> CreateBlock(VAddr cpu_addr, std::size_t size) = 0; | 270 | virtual std::shared_ptr<Buffer> CreateBlock(VAddr cpu_addr, std::size_t size) = 0; |
| 268 | 271 | ||
| 269 | virtual void UploadBlockData(const Buffer& buffer, std::size_t offset, std::size_t size, | ||
| 270 | const u8* data) = 0; | ||
| 271 | |||
| 272 | virtual void DownloadBlockData(const Buffer& buffer, std::size_t offset, std::size_t size, | ||
| 273 | u8* data) = 0; | ||
| 274 | |||
| 275 | virtual void CopyBlock(const Buffer& src, const Buffer& dst, std::size_t src_offset, | ||
| 276 | std::size_t dst_offset, std::size_t size) = 0; | ||
| 277 | |||
| 278 | virtual BufferInfo ConstBufferUpload(const void* raw_pointer, std::size_t size) { | 272 | virtual BufferInfo ConstBufferUpload(const void* raw_pointer, std::size_t size) { |
| 279 | return {}; | 273 | return {}; |
| 280 | } | 274 | } |
| @@ -336,11 +330,11 @@ private: | |||
| 336 | const VAddr cpu_addr_end = cpu_addr + size; | 330 | const VAddr cpu_addr_end = cpu_addr + size; |
| 337 | if (memory_manager.IsGranularRange(gpu_addr, size)) { | 331 | if (memory_manager.IsGranularRange(gpu_addr, size)) { |
| 338 | u8* host_ptr = memory_manager.GetPointer(gpu_addr); | 332 | u8* host_ptr = memory_manager.GetPointer(gpu_addr); |
| 339 | UploadBlockData(*block, block->Offset(cpu_addr), size, host_ptr); | 333 | block->Upload(block->Offset(cpu_addr), size, host_ptr); |
| 340 | } else { | 334 | } else { |
| 341 | staging_buffer.resize(size); | 335 | staging_buffer.resize(size); |
| 342 | memory_manager.ReadBlockUnsafe(gpu_addr, staging_buffer.data(), size); | 336 | memory_manager.ReadBlockUnsafe(gpu_addr, staging_buffer.data(), size); |
| 343 | UploadBlockData(*block, block->Offset(cpu_addr), size, staging_buffer.data()); | 337 | block->Upload(block->Offset(cpu_addr), size, staging_buffer.data()); |
| 344 | } | 338 | } |
| 345 | return Register(MapInterval(cpu_addr, cpu_addr_end, gpu_addr)); | 339 | return Register(MapInterval(cpu_addr, cpu_addr_end, gpu_addr)); |
| 346 | } | 340 | } |
| @@ -399,7 +393,7 @@ private: | |||
| 399 | } | 393 | } |
| 400 | staging_buffer.resize(size); | 394 | staging_buffer.resize(size); |
| 401 | system.Memory().ReadBlockUnsafe(interval.lower(), staging_buffer.data(), size); | 395 | system.Memory().ReadBlockUnsafe(interval.lower(), staging_buffer.data(), size); |
| 402 | UploadBlockData(*block, block->Offset(interval.lower()), size, staging_buffer.data()); | 396 | block->Upload(block->Offset(interval.lower()), size, staging_buffer.data()); |
| 403 | } | 397 | } |
| 404 | } | 398 | } |
| 405 | 399 | ||
| @@ -436,7 +430,7 @@ private: | |||
| 436 | 430 | ||
| 437 | const std::size_t size = map->end - map->start; | 431 | const std::size_t size = map->end - map->start; |
| 438 | staging_buffer.resize(size); | 432 | staging_buffer.resize(size); |
| 439 | DownloadBlockData(*block, block->Offset(map->start), size, staging_buffer.data()); | 433 | block->Download(block->Offset(map->start), size, staging_buffer.data()); |
| 440 | system.Memory().WriteBlockUnsafe(map->start, staging_buffer.data(), size); | 434 | system.Memory().WriteBlockUnsafe(map->start, staging_buffer.data(), size); |
| 441 | map->MarkAsModified(false, 0); | 435 | map->MarkAsModified(false, 0); |
| 442 | } | 436 | } |
| @@ -449,7 +443,7 @@ private: | |||
| 449 | 443 | ||
| 450 | buffer_ptr += size; | 444 | buffer_ptr += size; |
| 451 | buffer_offset += size; | 445 | buffer_offset += size; |
| 452 | return {stream_buffer_handle, uploaded_offset}; | 446 | return BufferInfo{stream_buffer->Handle(), uploaded_offset, stream_buffer->Address()}; |
| 453 | } | 447 | } |
| 454 | 448 | ||
| 455 | void AlignBuffer(std::size_t alignment) { | 449 | void AlignBuffer(std::size_t alignment) { |
| @@ -464,7 +458,7 @@ private: | |||
| 464 | const std::size_t new_size = old_size + BLOCK_PAGE_SIZE; | 458 | const std::size_t new_size = old_size + BLOCK_PAGE_SIZE; |
| 465 | const VAddr cpu_addr = buffer->CpuAddr(); | 459 | const VAddr cpu_addr = buffer->CpuAddr(); |
| 466 | std::shared_ptr<Buffer> new_buffer = CreateBlock(cpu_addr, new_size); | 460 | std::shared_ptr<Buffer> new_buffer = CreateBlock(cpu_addr, new_size); |
| 467 | CopyBlock(*buffer, *new_buffer, 0, 0, old_size); | 461 | new_buffer->CopyFrom(*buffer, 0, 0, old_size); |
| 468 | QueueDestruction(std::move(buffer)); | 462 | QueueDestruction(std::move(buffer)); |
| 469 | 463 | ||
| 470 | const VAddr cpu_addr_end = cpu_addr + new_size - 1; | 464 | const VAddr cpu_addr_end = cpu_addr + new_size - 1; |
| @@ -486,8 +480,8 @@ private: | |||
| 486 | const std::size_t new_size = size_1 + size_2; | 480 | const std::size_t new_size = size_1 + size_2; |
| 487 | 481 | ||
| 488 | std::shared_ptr<Buffer> new_buffer = CreateBlock(new_addr, new_size); | 482 | std::shared_ptr<Buffer> new_buffer = CreateBlock(new_addr, new_size); |
| 489 | CopyBlock(*first, *new_buffer, 0, new_buffer->Offset(first_addr), size_1); | 483 | new_buffer->CopyFrom(*first, 0, new_buffer->Offset(first_addr), size_1); |
| 490 | CopyBlock(*second, *new_buffer, 0, new_buffer->Offset(second_addr), size_2); | 484 | new_buffer->CopyFrom(*second, 0, new_buffer->Offset(second_addr), size_2); |
| 491 | QueueDestruction(std::move(first)); | 485 | QueueDestruction(std::move(first)); |
| 492 | QueueDestruction(std::move(second)); | 486 | QueueDestruction(std::move(second)); |
| 493 | 487 | ||