diff options
| author | 2019-02-18 20:58:32 -0500 | |
|---|---|---|
| committer | 2019-03-14 22:34:42 -0400 | |
| commit | 2eaf6c41a4686028c0abc84d1be6fd48a67cf49f (patch) | |
| tree | 6ad0848c848aea68e637386cad5068e13c831b92 /src/video_core/renderer_vulkan | |
| parent | Merge pull request #2233 from ReinUsesLisp/morton-cleanup (diff) | |
| download | yuzu-2eaf6c41a4686028c0abc84d1be6fd48a67cf49f.tar.gz yuzu-2eaf6c41a4686028c0abc84d1be6fd48a67cf49f.tar.xz yuzu-2eaf6c41a4686028c0abc84d1be6fd48a67cf49f.zip | |
gpu: Use host address for caching instead of guest address.
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 27 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.h | 31 |
2 files changed, 41 insertions, 17 deletions
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 4a33a6c84..95eab3fec 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -17,6 +17,11 @@ | |||
| 17 | 17 | ||
| 18 | namespace Vulkan { | 18 | namespace Vulkan { |
| 19 | 19 | ||
| 20 | CachedBufferEntry::CachedBufferEntry(VAddr cpu_addr, std::size_t size, u64 offset, | ||
| 21 | std::size_t alignment, u8* host_ptr) | ||
| 22 | : cpu_addr{cpu_addr}, size{size}, offset{offset}, alignment{alignment}, RasterizerCacheObject{ | ||
| 23 | host_ptr} {} | ||
| 24 | |||
| 20 | VKBufferCache::VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, | 25 | VKBufferCache::VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, |
| 21 | VideoCore::RasterizerInterface& rasterizer, const VKDevice& device, | 26 | VideoCore::RasterizerInterface& rasterizer, const VKDevice& device, |
| 22 | VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size) | 27 | VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size) |
| @@ -37,16 +42,18 @@ VKBufferCache::~VKBufferCache() = default; | |||
| 37 | u64 VKBufferCache::UploadMemory(Tegra::GPUVAddr gpu_addr, std::size_t size, u64 alignment, | 42 | u64 VKBufferCache::UploadMemory(Tegra::GPUVAddr gpu_addr, std::size_t size, u64 alignment, |
| 38 | bool cache) { | 43 | bool cache) { |
| 39 | const auto cpu_addr{tegra_memory_manager.GpuToCpuAddress(gpu_addr)}; | 44 | const auto cpu_addr{tegra_memory_manager.GpuToCpuAddress(gpu_addr)}; |
| 40 | ASSERT(cpu_addr); | 45 | ASSERT_MSG(cpu_addr, "Invalid GPU address"); |
| 41 | 46 | ||
| 42 | // Cache management is a big overhead, so only cache entries with a given size. | 47 | // Cache management is a big overhead, so only cache entries with a given size. |
| 43 | // TODO: Figure out which size is the best for given games. | 48 | // TODO: Figure out which size is the best for given games. |
| 44 | cache &= size >= 2048; | 49 | cache &= size >= 2048; |
| 45 | 50 | ||
| 51 | const auto& host_ptr{Memory::GetPointer(*cpu_addr)}; | ||
| 46 | if (cache) { | 52 | if (cache) { |
| 47 | if (auto entry = TryGet(*cpu_addr); entry) { | 53 | auto entry = TryGet(host_ptr); |
| 48 | if (entry->size >= size && entry->alignment == alignment) { | 54 | if (entry) { |
| 49 | return entry->offset; | 55 | if (entry->GetSize() >= size && entry->GetAlignment() == alignment) { |
| 56 | return entry->GetOffset(); | ||
| 50 | } | 57 | } |
| 51 | Unregister(entry); | 58 | Unregister(entry); |
| 52 | } | 59 | } |
| @@ -55,17 +62,17 @@ u64 VKBufferCache::UploadMemory(Tegra::GPUVAddr gpu_addr, std::size_t size, u64 | |||
| 55 | AlignBuffer(alignment); | 62 | AlignBuffer(alignment); |
| 56 | const u64 uploaded_offset = buffer_offset; | 63 | const u64 uploaded_offset = buffer_offset; |
| 57 | 64 | ||
| 58 | Memory::ReadBlock(*cpu_addr, buffer_ptr, size); | 65 | if (!host_ptr) { |
| 66 | return uploaded_offset; | ||
| 67 | } | ||
| 59 | 68 | ||
| 69 | std::memcpy(buffer_ptr, host_ptr, size); | ||
| 60 | buffer_ptr += size; | 70 | buffer_ptr += size; |
| 61 | buffer_offset += size; | 71 | buffer_offset += size; |
| 62 | 72 | ||
| 63 | if (cache) { | 73 | if (cache) { |
| 64 | auto entry = std::make_shared<CachedBufferEntry>(); | 74 | auto entry = std::make_shared<CachedBufferEntry>(*cpu_addr, size, uploaded_offset, |
| 65 | entry->offset = uploaded_offset; | 75 | alignment, host_ptr); |
| 66 | entry->size = size; | ||
| 67 | entry->alignment = alignment; | ||
| 68 | entry->addr = *cpu_addr; | ||
| 69 | Register(entry); | 76 | Register(entry); |
| 70 | } | 77 | } |
| 71 | 78 | ||
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index d8e916f31..8b415744b 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h | |||
| @@ -24,22 +24,39 @@ class VKFence; | |||
| 24 | class VKMemoryManager; | 24 | class VKMemoryManager; |
| 25 | class VKStreamBuffer; | 25 | class VKStreamBuffer; |
| 26 | 26 | ||
| 27 | struct CachedBufferEntry final : public RasterizerCacheObject { | 27 | class CachedBufferEntry final : public RasterizerCacheObject { |
| 28 | VAddr GetAddr() const override { | 28 | public: |
| 29 | return addr; | 29 | explicit CachedBufferEntry(VAddr cpu_addr, std::size_t size, u64 offset, std::size_t alignment, |
| 30 | u8* host_ptr); | ||
| 31 | |||
| 32 | VAddr GetCpuAddr() const override { | ||
| 33 | return cpu_addr; | ||
| 30 | } | 34 | } |
| 31 | 35 | ||
| 32 | std::size_t GetSizeInBytes() const override { | 36 | std::size_t GetSizeInBytes() const override { |
| 33 | return size; | 37 | return size; |
| 34 | } | 38 | } |
| 35 | 39 | ||
| 40 | std::size_t GetSize() const { | ||
| 41 | return size; | ||
| 42 | } | ||
| 43 | |||
| 44 | u64 GetOffset() const { | ||
| 45 | return offset; | ||
| 46 | } | ||
| 47 | |||
| 48 | std::size_t GetAlignment() const { | ||
| 49 | return alignment; | ||
| 50 | } | ||
| 51 | |||
| 36 | // We do not have to flush this cache as things in it are never modified by us. | 52 | // We do not have to flush this cache as things in it are never modified by us. |
| 37 | void Flush() override {} | 53 | void Flush() override {} |
| 38 | 54 | ||
| 39 | VAddr addr; | 55 | private: |
| 40 | std::size_t size; | 56 | VAddr cpu_addr{}; |
| 41 | u64 offset; | 57 | std::size_t size{}; |
| 42 | std::size_t alignment; | 58 | u64 offset{}; |
| 59 | std::size_t alignment{}; | ||
| 43 | }; | 60 | }; |
| 44 | 61 | ||
| 45 | class VKBufferCache final : public RasterizerCache<std::shared_ptr<CachedBufferEntry>> { | 62 | class VKBufferCache final : public RasterizerCache<std::shared_ptr<CachedBufferEntry>> { |