summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2019-10-29 22:06:41 -0400
committerGravatar GitHub2019-10-29 22:06:41 -0400
commitb5138f3c35e61adc90c6c17e206c0aab5d6d3575 (patch)
tree92964dced4540b91f27aeeee9ceae90ca488dd57 /src
parentMerge pull request #3007 from DarkLordZach/fsc-regress (diff)
parentrasterizer_accelerated: Add intermediary for GPU rasterizers (diff)
downloadyuzu-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.txt2
-rw-r--r--src/video_core/rasterizer_accelerated.cpp63
-rw-r--r--src/video_core/rasterizer_accelerated.h31
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp36
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h11
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
14namespace VideoCore {
15
16namespace {
17
18template <typename Map, typename Interval>
19constexpr auto RangeFromInterval(Map& map, const Interval& interval) {
20 return boost::make_iterator_range(map.equal_range(interval));
21}
22
23} // Anonymous namespace
24
25RasterizerAccelerated::RasterizerAccelerated() = default;
26
27RasterizerAccelerated::~RasterizerAccelerated() = default;
28
29void 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
14namespace VideoCore {
15
16/// Implements the shared part in GPU accelerated rasterizers in RasterizerInterface.
17class RasterizerAccelerated : public RasterizerInterface {
18public:
19 explicit RasterizerAccelerated();
20 ~RasterizerAccelerated() override;
21
22 void UpdatePagesCachedCount(VAddr addr, u64 size, int delta) override;
23
24private:
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
345template <typename Map, typename Interval>
346static constexpr auto RangeFromInterval(Map& map, const Interval& interval) {
347 return boost::make_iterator_range(map.equal_range(interval));
348}
349
350void 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
381void RasterizerOpenGL::LoadDiskResources(const std::atomic_bool& stop_loading, 345void 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 {
52struct ScreenInfo; 51struct ScreenInfo;
53struct DrawParameters; 52struct DrawParameters;
54 53
55class RasterizerOpenGL : public VideoCore::RasterizerInterface { 54class RasterizerOpenGL : public VideoCore::RasterizerAccelerated {
56public: 55public:
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