diff options
| author | 2019-11-28 11:43:17 -0500 | |
|---|---|---|
| committer | 2019-11-28 11:43:17 -0500 | |
| commit | e3ee017e91ef4d713f1af8cb60c5157e40d43f18 (patch) | |
| tree | e0a5b47cac1d548599b8ceba7f71b40746fe6b48 /src/video_core | |
| parent | Merge pull request #3171 from lioncash/internal-link (diff) | |
| parent | core/memory; Migrate over SetCurrentPageTable() to the Memory class (diff) | |
| download | yuzu-e3ee017e91ef4d713f1af8cb60c5157e40d43f18.tar.gz yuzu-e3ee017e91ef4d713f1af8cb60c5157e40d43f18.tar.xz yuzu-e3ee017e91ef4d713f1af8cb60c5157e40d43f18.zip | |
Merge pull request #3169 from lioncash/memory
core/memory: Deglobalize memory management code
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/memory_manager.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/rasterizer_accelerated.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/rasterizer_accelerated.h | 9 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 8 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_buffer_cache.h | 7 |
7 files changed, 31 insertions, 16 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index bffae940c..11848fbce 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -52,7 +52,7 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, u64 size) { | |||
| 52 | const u64 aligned_size{Common::AlignUp(size, page_size)}; | 52 | const u64 aligned_size{Common::AlignUp(size, page_size)}; |
| 53 | const GPUVAddr gpu_addr{FindFreeRegion(address_space_base, aligned_size)}; | 53 | const GPUVAddr gpu_addr{FindFreeRegion(address_space_base, aligned_size)}; |
| 54 | 54 | ||
| 55 | MapBackingMemory(gpu_addr, Memory::GetPointer(cpu_addr), aligned_size, cpu_addr); | 55 | MapBackingMemory(gpu_addr, system.Memory().GetPointer(cpu_addr), aligned_size, cpu_addr); |
| 56 | ASSERT(system.CurrentProcess() | 56 | ASSERT(system.CurrentProcess() |
| 57 | ->VMManager() | 57 | ->VMManager() |
| 58 | .SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped, | 58 | .SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped, |
| @@ -67,7 +67,7 @@ GPUVAddr MemoryManager::MapBufferEx(VAddr cpu_addr, GPUVAddr gpu_addr, u64 size) | |||
| 67 | 67 | ||
| 68 | const u64 aligned_size{Common::AlignUp(size, page_size)}; | 68 | const u64 aligned_size{Common::AlignUp(size, page_size)}; |
| 69 | 69 | ||
| 70 | MapBackingMemory(gpu_addr, Memory::GetPointer(cpu_addr), aligned_size, cpu_addr); | 70 | MapBackingMemory(gpu_addr, system.Memory().GetPointer(cpu_addr), aligned_size, cpu_addr); |
| 71 | ASSERT(system.CurrentProcess() | 71 | ASSERT(system.CurrentProcess() |
| 72 | ->VMManager() | 72 | ->VMManager() |
| 73 | .SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped, | 73 | .SetMemoryAttribute(cpu_addr, size, Kernel::MemoryAttribute::DeviceMapped, |
diff --git a/src/video_core/rasterizer_accelerated.cpp b/src/video_core/rasterizer_accelerated.cpp index b230dcc18..fc6ecb899 100644 --- a/src/video_core/rasterizer_accelerated.cpp +++ b/src/video_core/rasterizer_accelerated.cpp | |||
| @@ -22,7 +22,8 @@ constexpr auto RangeFromInterval(Map& map, const Interval& interval) { | |||
| 22 | 22 | ||
| 23 | } // Anonymous namespace | 23 | } // Anonymous namespace |
| 24 | 24 | ||
| 25 | RasterizerAccelerated::RasterizerAccelerated() = default; | 25 | RasterizerAccelerated::RasterizerAccelerated(Memory::Memory& cpu_memory_) |
| 26 | : cpu_memory{cpu_memory_} {} | ||
| 26 | 27 | ||
| 27 | RasterizerAccelerated::~RasterizerAccelerated() = default; | 28 | RasterizerAccelerated::~RasterizerAccelerated() = default; |
| 28 | 29 | ||
| @@ -47,9 +48,9 @@ void RasterizerAccelerated::UpdatePagesCachedCount(VAddr addr, u64 size, int del | |||
| 47 | const u64 interval_size = interval_end_addr - interval_start_addr; | 48 | const u64 interval_size = interval_end_addr - interval_start_addr; |
| 48 | 49 | ||
| 49 | if (delta > 0 && count == delta) { | 50 | if (delta > 0 && count == delta) { |
| 50 | Memory::RasterizerMarkRegionCached(interval_start_addr, interval_size, true); | 51 | cpu_memory.RasterizerMarkRegionCached(interval_start_addr, interval_size, true); |
| 51 | } else if (delta < 0 && count == -delta) { | 52 | } else if (delta < 0 && count == -delta) { |
| 52 | Memory::RasterizerMarkRegionCached(interval_start_addr, interval_size, false); | 53 | cpu_memory.RasterizerMarkRegionCached(interval_start_addr, interval_size, false); |
| 53 | } else { | 54 | } else { |
| 54 | ASSERT(count >= 0); | 55 | ASSERT(count >= 0); |
| 55 | } | 56 | } |
diff --git a/src/video_core/rasterizer_accelerated.h b/src/video_core/rasterizer_accelerated.h index 8f7e3547e..315798e7c 100644 --- a/src/video_core/rasterizer_accelerated.h +++ b/src/video_core/rasterizer_accelerated.h | |||
| @@ -11,12 +11,16 @@ | |||
| 11 | #include "common/common_types.h" | 11 | #include "common/common_types.h" |
| 12 | #include "video_core/rasterizer_interface.h" | 12 | #include "video_core/rasterizer_interface.h" |
| 13 | 13 | ||
| 14 | namespace Memory { | ||
| 15 | class Memory; | ||
| 16 | } | ||
| 17 | |||
| 14 | namespace VideoCore { | 18 | namespace VideoCore { |
| 15 | 19 | ||
| 16 | /// Implements the shared part in GPU accelerated rasterizers in RasterizerInterface. | 20 | /// Implements the shared part in GPU accelerated rasterizers in RasterizerInterface. |
| 17 | class RasterizerAccelerated : public RasterizerInterface { | 21 | class RasterizerAccelerated : public RasterizerInterface { |
| 18 | public: | 22 | public: |
| 19 | explicit RasterizerAccelerated(); | 23 | explicit RasterizerAccelerated(Memory::Memory& cpu_memory_); |
| 20 | ~RasterizerAccelerated() override; | 24 | ~RasterizerAccelerated() override; |
| 21 | 25 | ||
| 22 | void UpdatePagesCachedCount(VAddr addr, u64 size, int delta) override; | 26 | void UpdatePagesCachedCount(VAddr addr, u64 size, int delta) override; |
| @@ -24,8 +28,9 @@ public: | |||
| 24 | private: | 28 | private: |
| 25 | using CachedPageMap = boost::icl::interval_map<u64, int>; | 29 | using CachedPageMap = boost::icl::interval_map<u64, int>; |
| 26 | CachedPageMap cached_pages; | 30 | CachedPageMap cached_pages; |
| 27 | |||
| 28 | std::mutex pages_mutex; | 31 | std::mutex pages_mutex; |
| 32 | |||
| 33 | Memory::Memory& cpu_memory; | ||
| 29 | }; | 34 | }; |
| 30 | 35 | ||
| 31 | } // namespace VideoCore | 36 | } // namespace VideoCore |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index f97ec06f0..a568a4343 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include "common/scope_exit.h" | 19 | #include "common/scope_exit.h" |
| 20 | #include "core/core.h" | 20 | #include "core/core.h" |
| 21 | #include "core/hle/kernel/process.h" | 21 | #include "core/hle/kernel/process.h" |
| 22 | #include "core/memory.h" | ||
| 22 | #include "core/settings.h" | 23 | #include "core/settings.h" |
| 23 | #include "video_core/engines/kepler_compute.h" | 24 | #include "video_core/engines/kepler_compute.h" |
| 24 | #include "video_core/engines/maxwell_3d.h" | 25 | #include "video_core/engines/maxwell_3d.h" |
| @@ -86,8 +87,9 @@ std::size_t GetConstBufferSize(const Tegra::Engines::ConstBufferInfo& buffer, | |||
| 86 | 87 | ||
| 87 | RasterizerOpenGL::RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window, | 88 | RasterizerOpenGL::RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window, |
| 88 | ScreenInfo& info) | 89 | ScreenInfo& info) |
| 89 | : texture_cache{system, *this, device}, shader_cache{*this, system, emu_window, device}, | 90 | : RasterizerAccelerated{system.Memory()}, texture_cache{system, *this, device}, |
| 90 | system{system}, screen_info{info}, buffer_cache{*this, system, device, STREAM_BUFFER_SIZE} { | 91 | shader_cache{*this, system, emu_window, device}, system{system}, screen_info{info}, |
| 92 | buffer_cache{*this, system, device, STREAM_BUFFER_SIZE} { | ||
| 91 | shader_program_manager = std::make_unique<GLShader::ProgramManager>(); | 93 | shader_program_manager = std::make_unique<GLShader::ProgramManager>(); |
| 92 | state.draw.shader_program = 0; | 94 | state.draw.shader_program = 0; |
| 93 | state.Apply(); | 95 | state.Apply(); |
| @@ -837,7 +839,7 @@ bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& config, | |||
| 837 | MICROPROFILE_SCOPE(OpenGL_CacheManagement); | 839 | MICROPROFILE_SCOPE(OpenGL_CacheManagement); |
| 838 | 840 | ||
| 839 | const auto surface{ | 841 | const auto surface{ |
| 840 | texture_cache.TryFindFramebufferSurface(Memory::GetPointer(framebuffer_addr))}; | 842 | texture_cache.TryFindFramebufferSurface(system.Memory().GetPointer(framebuffer_addr))}; |
| 841 | if (!surface) { | 843 | if (!surface) { |
| 842 | return {}; | 844 | return {}; |
| 843 | } | 845 | } |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 7646cbb0e..a57a564f7 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -158,7 +158,7 @@ void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuf | |||
| 158 | VideoCore::Surface::PixelFormatFromGPUPixelFormat(framebuffer.pixel_format)}; | 158 | VideoCore::Surface::PixelFormatFromGPUPixelFormat(framebuffer.pixel_format)}; |
| 159 | const u32 bytes_per_pixel{VideoCore::Surface::GetBytesPerPixel(pixel_format)}; | 159 | const u32 bytes_per_pixel{VideoCore::Surface::GetBytesPerPixel(pixel_format)}; |
| 160 | const u64 size_in_bytes{framebuffer.stride * framebuffer.height * bytes_per_pixel}; | 160 | const u64 size_in_bytes{framebuffer.stride * framebuffer.height * bytes_per_pixel}; |
| 161 | const auto host_ptr{Memory::GetPointer(framebuffer_addr)}; | 161 | u8* const host_ptr{system.Memory().GetPointer(framebuffer_addr)}; |
| 162 | rasterizer->FlushRegion(ToCacheAddr(host_ptr), size_in_bytes); | 162 | rasterizer->FlushRegion(ToCacheAddr(host_ptr), size_in_bytes); |
| 163 | 163 | ||
| 164 | // TODO(Rodrigo): Read this from HLE | 164 | // TODO(Rodrigo): Read this from HLE |
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index d2e9f4031..46da81aaa 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -24,9 +24,11 @@ CachedBufferEntry::CachedBufferEntry(VAddr cpu_addr, std::size_t size, u64 offse | |||
| 24 | alignment{alignment} {} | 24 | alignment{alignment} {} |
| 25 | 25 | ||
| 26 | VKBufferCache::VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, | 26 | VKBufferCache::VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, |
| 27 | Memory::Memory& cpu_memory_, | ||
| 27 | VideoCore::RasterizerInterface& rasterizer, const VKDevice& device, | 28 | VideoCore::RasterizerInterface& rasterizer, const VKDevice& device, |
| 28 | VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size) | 29 | VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size) |
| 29 | : RasterizerCache{rasterizer}, tegra_memory_manager{tegra_memory_manager} { | 30 | : RasterizerCache{rasterizer}, tegra_memory_manager{tegra_memory_manager}, cpu_memory{ |
| 31 | cpu_memory_} { | ||
| 30 | const auto usage = vk::BufferUsageFlagBits::eVertexBuffer | | 32 | const auto usage = vk::BufferUsageFlagBits::eVertexBuffer | |
| 31 | vk::BufferUsageFlagBits::eIndexBuffer | | 33 | vk::BufferUsageFlagBits::eIndexBuffer | |
| 32 | vk::BufferUsageFlagBits::eUniformBuffer; | 34 | vk::BufferUsageFlagBits::eUniformBuffer; |
| @@ -48,9 +50,9 @@ u64 VKBufferCache::UploadMemory(GPUVAddr gpu_addr, std::size_t size, u64 alignme | |||
| 48 | // TODO: Figure out which size is the best for given games. | 50 | // TODO: Figure out which size is the best for given games. |
| 49 | cache &= size >= 2048; | 51 | cache &= size >= 2048; |
| 50 | 52 | ||
| 51 | const auto& host_ptr{Memory::GetPointer(*cpu_addr)}; | 53 | u8* const host_ptr{cpu_memory.GetPointer(*cpu_addr)}; |
| 52 | if (cache) { | 54 | if (cache) { |
| 53 | auto entry = TryGet(host_ptr); | 55 | const auto entry = TryGet(host_ptr); |
| 54 | if (entry) { | 56 | if (entry) { |
| 55 | if (entry->GetSize() >= size && entry->GetAlignment() == alignment) { | 57 | if (entry->GetSize() >= size && entry->GetAlignment() == alignment) { |
| 56 | return entry->GetOffset(); | 58 | return entry->GetOffset(); |
| @@ -62,7 +64,7 @@ u64 VKBufferCache::UploadMemory(GPUVAddr gpu_addr, std::size_t size, u64 alignme | |||
| 62 | AlignBuffer(alignment); | 64 | AlignBuffer(alignment); |
| 63 | const u64 uploaded_offset = buffer_offset; | 65 | const u64 uploaded_offset = buffer_offset; |
| 64 | 66 | ||
| 65 | if (!host_ptr) { | 67 | if (host_ptr == nullptr) { |
| 66 | return uploaded_offset; | 68 | return uploaded_offset; |
| 67 | } | 69 | } |
| 68 | 70 | ||
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 49f13bcdc..daa8ccf66 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h | |||
| @@ -13,6 +13,10 @@ | |||
| 13 | #include "video_core/renderer_vulkan/declarations.h" | 13 | #include "video_core/renderer_vulkan/declarations.h" |
| 14 | #include "video_core/renderer_vulkan/vk_scheduler.h" | 14 | #include "video_core/renderer_vulkan/vk_scheduler.h" |
| 15 | 15 | ||
| 16 | namespace Memory { | ||
| 17 | class Memory; | ||
| 18 | } | ||
| 19 | |||
| 16 | namespace Tegra { | 20 | namespace Tegra { |
| 17 | class MemoryManager; | 21 | class MemoryManager; |
| 18 | } | 22 | } |
| @@ -58,7 +62,7 @@ private: | |||
| 58 | 62 | ||
| 59 | class VKBufferCache final : public RasterizerCache<std::shared_ptr<CachedBufferEntry>> { | 63 | class VKBufferCache final : public RasterizerCache<std::shared_ptr<CachedBufferEntry>> { |
| 60 | public: | 64 | public: |
| 61 | explicit VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, | 65 | explicit VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, Memory::Memory& cpu_memory_, |
| 62 | VideoCore::RasterizerInterface& rasterizer, const VKDevice& device, | 66 | VideoCore::RasterizerInterface& rasterizer, const VKDevice& device, |
| 63 | VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size); | 67 | VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size); |
| 64 | ~VKBufferCache(); | 68 | ~VKBufferCache(); |
| @@ -92,6 +96,7 @@ private: | |||
| 92 | void AlignBuffer(std::size_t alignment); | 96 | void AlignBuffer(std::size_t alignment); |
| 93 | 97 | ||
| 94 | Tegra::MemoryManager& tegra_memory_manager; | 98 | Tegra::MemoryManager& tegra_memory_manager; |
| 99 | Memory::Memory& cpu_memory; | ||
| 95 | 100 | ||
| 96 | std::unique_ptr<VKStreamBuffer> stream_buffer; | 101 | std::unique_ptr<VKStreamBuffer> stream_buffer; |
| 97 | vk::Buffer buffer_handle; | 102 | vk::Buffer buffer_handle; |