diff options
| author | 2019-10-29 22:06:41 -0400 | |
|---|---|---|
| committer | 2019-10-29 22:06:41 -0400 | |
| commit | b5138f3c35e61adc90c6c17e206c0aab5d6d3575 (patch) | |
| tree | 92964dced4540b91f27aeeee9ceae90ca488dd57 /src | |
| parent | Merge pull request #3007 from DarkLordZach/fsc-regress (diff) | |
| parent | rasterizer_accelerated: Add intermediary for GPU rasterizers (diff) | |
| download | yuzu-b5138f3c35e61adc90c6c17e206c0aab5d6d3575.tar.gz yuzu-b5138f3c35e61adc90c6c17e206c0aab5d6d3575.tar.xz yuzu-b5138f3c35e61adc90c6c17e206c0aab5d6d3575.zip | |
Merge pull request #3035 from ReinUsesLisp/rasterizer-accelerated
rasterizer_accelerated: Add intermediary for GPU rasterizers
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/video_core/rasterizer_accelerated.cpp | 63 | ||||
| -rw-r--r-- | src/video_core/rasterizer_accelerated.h | 31 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 36 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 11 |
5 files changed, 98 insertions, 45 deletions
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index cb6eda1b8..c911c6ec4 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt | |||
| @@ -36,6 +36,8 @@ add_library(video_core STATIC | |||
| 36 | memory_manager.h | 36 | memory_manager.h |
| 37 | morton.cpp | 37 | morton.cpp |
| 38 | morton.h | 38 | morton.h |
| 39 | rasterizer_accelerated.cpp | ||
| 40 | rasterizer_accelerated.h | ||
| 39 | rasterizer_cache.cpp | 41 | rasterizer_cache.cpp |
| 40 | rasterizer_cache.h | 42 | rasterizer_cache.h |
| 41 | rasterizer_interface.h | 43 | rasterizer_interface.h |
diff --git a/src/video_core/rasterizer_accelerated.cpp b/src/video_core/rasterizer_accelerated.cpp new file mode 100644 index 000000000..b230dcc18 --- /dev/null +++ b/src/video_core/rasterizer_accelerated.cpp | |||
| @@ -0,0 +1,63 @@ | |||
| 1 | // Copyright 2019 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <mutex> | ||
| 6 | |||
| 7 | #include <boost/icl/interval_map.hpp> | ||
| 8 | |||
| 9 | #include "common/assert.h" | ||
| 10 | #include "common/common_types.h" | ||
| 11 | #include "core/memory.h" | ||
| 12 | #include "video_core/rasterizer_accelerated.h" | ||
| 13 | |||
| 14 | namespace VideoCore { | ||
| 15 | |||
| 16 | namespace { | ||
| 17 | |||
| 18 | template <typename Map, typename Interval> | ||
| 19 | constexpr auto RangeFromInterval(Map& map, const Interval& interval) { | ||
| 20 | return boost::make_iterator_range(map.equal_range(interval)); | ||
| 21 | } | ||
| 22 | |||
| 23 | } // Anonymous namespace | ||
| 24 | |||
| 25 | RasterizerAccelerated::RasterizerAccelerated() = default; | ||
| 26 | |||
| 27 | RasterizerAccelerated::~RasterizerAccelerated() = default; | ||
| 28 | |||
| 29 | void RasterizerAccelerated::UpdatePagesCachedCount(VAddr addr, u64 size, int delta) { | ||
| 30 | std::lock_guard lock{pages_mutex}; | ||
| 31 | const u64 page_start{addr >> Memory::PAGE_BITS}; | ||
| 32 | const u64 page_end{(addr + size + Memory::PAGE_SIZE - 1) >> Memory::PAGE_BITS}; | ||
| 33 | |||
| 34 | // Interval maps will erase segments if count reaches 0, so if delta is negative we have to | ||
| 35 | // subtract after iterating | ||
| 36 | const auto pages_interval = CachedPageMap::interval_type::right_open(page_start, page_end); | ||
| 37 | if (delta > 0) { | ||
| 38 | cached_pages.add({pages_interval, delta}); | ||
| 39 | } | ||
| 40 | |||
| 41 | for (const auto& pair : RangeFromInterval(cached_pages, pages_interval)) { | ||
| 42 | const auto interval = pair.first & pages_interval; | ||
| 43 | const int count = pair.second; | ||
| 44 | |||
| 45 | const VAddr interval_start_addr = boost::icl::first(interval) << Memory::PAGE_BITS; | ||
| 46 | const VAddr interval_end_addr = boost::icl::last_next(interval) << Memory::PAGE_BITS; | ||
| 47 | const u64 interval_size = interval_end_addr - interval_start_addr; | ||
| 48 | |||
| 49 | if (delta > 0 && count == delta) { | ||
| 50 | Memory::RasterizerMarkRegionCached(interval_start_addr, interval_size, true); | ||
| 51 | } else if (delta < 0 && count == -delta) { | ||
| 52 | Memory::RasterizerMarkRegionCached(interval_start_addr, interval_size, false); | ||
| 53 | } else { | ||
| 54 | ASSERT(count >= 0); | ||
| 55 | } | ||
| 56 | } | ||
| 57 | |||
| 58 | if (delta < 0) { | ||
| 59 | cached_pages.add({pages_interval, delta}); | ||
| 60 | } | ||
| 61 | } | ||
| 62 | |||
| 63 | } // namespace VideoCore | ||
diff --git a/src/video_core/rasterizer_accelerated.h b/src/video_core/rasterizer_accelerated.h new file mode 100644 index 000000000..8f7e3547e --- /dev/null +++ b/src/video_core/rasterizer_accelerated.h | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | // Copyright 2019 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <mutex> | ||
| 8 | |||
| 9 | #include <boost/icl/interval_map.hpp> | ||
| 10 | |||
| 11 | #include "common/common_types.h" | ||
| 12 | #include "video_core/rasterizer_interface.h" | ||
| 13 | |||
| 14 | namespace VideoCore { | ||
| 15 | |||
| 16 | /// Implements the shared part in GPU accelerated rasterizers in RasterizerInterface. | ||
| 17 | class RasterizerAccelerated : public RasterizerInterface { | ||
| 18 | public: | ||
| 19 | explicit RasterizerAccelerated(); | ||
| 20 | ~RasterizerAccelerated() override; | ||
| 21 | |||
| 22 | void UpdatePagesCachedCount(VAddr addr, u64 size, int delta) override; | ||
| 23 | |||
| 24 | private: | ||
| 25 | using CachedPageMap = boost::icl::interval_map<u64, int>; | ||
| 26 | CachedPageMap cached_pages; | ||
| 27 | |||
| 28 | std::mutex pages_mutex; | ||
| 29 | }; | ||
| 30 | |||
| 31 | } // namespace VideoCore | ||
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 43032e9a7..63cf4216b 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -342,42 +342,6 @@ std::size_t RasterizerOpenGL::CalculateIndexBufferSize() const { | |||
| 342 | static_cast<std::size_t>(regs.index_array.FormatSizeInBytes()); | 342 | static_cast<std::size_t>(regs.index_array.FormatSizeInBytes()); |
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | template <typename Map, typename Interval> | ||
| 346 | static constexpr auto RangeFromInterval(Map& map, const Interval& interval) { | ||
| 347 | return boost::make_iterator_range(map.equal_range(interval)); | ||
| 348 | } | ||
| 349 | |||
| 350 | void RasterizerOpenGL::UpdatePagesCachedCount(VAddr addr, u64 size, int delta) { | ||
| 351 | std::lock_guard lock{pages_mutex}; | ||
| 352 | const u64 page_start{addr >> Memory::PAGE_BITS}; | ||
| 353 | const u64 page_end{(addr + size + Memory::PAGE_SIZE - 1) >> Memory::PAGE_BITS}; | ||
| 354 | |||
| 355 | // Interval maps will erase segments if count reaches 0, so if delta is negative we have to | ||
| 356 | // subtract after iterating | ||
| 357 | const auto pages_interval = CachedPageMap::interval_type::right_open(page_start, page_end); | ||
| 358 | if (delta > 0) | ||
| 359 | cached_pages.add({pages_interval, delta}); | ||
| 360 | |||
| 361 | for (const auto& pair : RangeFromInterval(cached_pages, pages_interval)) { | ||
| 362 | const auto interval = pair.first & pages_interval; | ||
| 363 | const int count = pair.second; | ||
| 364 | |||
| 365 | const VAddr interval_start_addr = boost::icl::first(interval) << Memory::PAGE_BITS; | ||
| 366 | const VAddr interval_end_addr = boost::icl::last_next(interval) << Memory::PAGE_BITS; | ||
| 367 | const u64 interval_size = interval_end_addr - interval_start_addr; | ||
| 368 | |||
| 369 | if (delta > 0 && count == delta) | ||
| 370 | Memory::RasterizerMarkRegionCached(interval_start_addr, interval_size, true); | ||
| 371 | else if (delta < 0 && count == -delta) | ||
| 372 | Memory::RasterizerMarkRegionCached(interval_start_addr, interval_size, false); | ||
| 373 | else | ||
| 374 | ASSERT(count >= 0); | ||
| 375 | } | ||
| 376 | |||
| 377 | if (delta < 0) | ||
| 378 | cached_pages.add({pages_interval, delta}); | ||
| 379 | } | ||
| 380 | |||
| 381 | void RasterizerOpenGL::LoadDiskResources(const std::atomic_bool& stop_loading, | 345 | void RasterizerOpenGL::LoadDiskResources(const std::atomic_bool& stop_loading, |
| 382 | const VideoCore::DiskResourceLoadCallback& callback) { | 346 | const VideoCore::DiskResourceLoadCallback& callback) { |
| 383 | shader_cache.LoadDiskCache(stop_loading, callback); | 347 | shader_cache.LoadDiskCache(stop_loading, callback); |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index c24a02d71..bd6fe5c3a 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -9,17 +9,16 @@ | |||
| 9 | #include <cstddef> | 9 | #include <cstddef> |
| 10 | #include <map> | 10 | #include <map> |
| 11 | #include <memory> | 11 | #include <memory> |
| 12 | #include <mutex> | ||
| 13 | #include <optional> | 12 | #include <optional> |
| 14 | #include <tuple> | 13 | #include <tuple> |
| 15 | #include <utility> | 14 | #include <utility> |
| 16 | 15 | ||
| 17 | #include <boost/icl/interval_map.hpp> | ||
| 18 | #include <glad/glad.h> | 16 | #include <glad/glad.h> |
| 19 | 17 | ||
| 20 | #include "common/common_types.h" | 18 | #include "common/common_types.h" |
| 21 | #include "video_core/engines/const_buffer_info.h" | 19 | #include "video_core/engines/const_buffer_info.h" |
| 22 | #include "video_core/engines/maxwell_3d.h" | 20 | #include "video_core/engines/maxwell_3d.h" |
| 21 | #include "video_core/rasterizer_accelerated.h" | ||
| 23 | #include "video_core/rasterizer_cache.h" | 22 | #include "video_core/rasterizer_cache.h" |
| 24 | #include "video_core/rasterizer_interface.h" | 23 | #include "video_core/rasterizer_interface.h" |
| 25 | #include "video_core/renderer_opengl/gl_buffer_cache.h" | 24 | #include "video_core/renderer_opengl/gl_buffer_cache.h" |
| @@ -52,7 +51,7 @@ namespace OpenGL { | |||
| 52 | struct ScreenInfo; | 51 | struct ScreenInfo; |
| 53 | struct DrawParameters; | 52 | struct DrawParameters; |
| 54 | 53 | ||
| 55 | class RasterizerOpenGL : public VideoCore::RasterizerInterface { | 54 | class RasterizerOpenGL : public VideoCore::RasterizerAccelerated { |
| 56 | public: | 55 | public: |
| 57 | explicit RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window, | 56 | explicit RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window, |
| 58 | ScreenInfo& info); | 57 | ScreenInfo& info); |
| @@ -73,7 +72,6 @@ public: | |||
| 73 | const Tegra::Engines::Fermi2D::Config& copy_config) override; | 72 | const Tegra::Engines::Fermi2D::Config& copy_config) override; |
| 74 | bool AccelerateDisplay(const Tegra::FramebufferConfig& config, VAddr framebuffer_addr, | 73 | bool AccelerateDisplay(const Tegra::FramebufferConfig& config, VAddr framebuffer_addr, |
| 75 | u32 pixel_stride) override; | 74 | u32 pixel_stride) override; |
| 76 | void UpdatePagesCachedCount(VAddr addr, u64 size, int delta) override; | ||
| 77 | void LoadDiskResources(const std::atomic_bool& stop_loading, | 75 | void LoadDiskResources(const std::atomic_bool& stop_loading, |
| 78 | const VideoCore::DiskResourceLoadCallback& callback) override; | 76 | const VideoCore::DiskResourceLoadCallback& callback) override; |
| 79 | 77 | ||
| @@ -228,11 +226,6 @@ private: | |||
| 228 | AccelDraw accelerate_draw = AccelDraw::Disabled; | 226 | AccelDraw accelerate_draw = AccelDraw::Disabled; |
| 229 | 227 | ||
| 230 | OGLFramebuffer clear_framebuffer; | 228 | OGLFramebuffer clear_framebuffer; |
| 231 | |||
| 232 | using CachedPageMap = boost::icl::interval_map<u64, int>; | ||
| 233 | CachedPageMap cached_pages; | ||
| 234 | |||
| 235 | std::mutex pages_mutex; | ||
| 236 | }; | 229 | }; |
| 237 | 230 | ||
| 238 | } // namespace OpenGL | 231 | } // namespace OpenGL |