diff options
| -rw-r--r-- | src/core/core_timing.cpp | 4 | ||||
| -rw-r--r-- | src/core/core_timing.h | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/event.h | 12 | ||||
| -rw-r--r-- | src/core/perf_stats.cpp | 17 | ||||
| -rw-r--r-- | src/core/perf_stats.h | 8 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.h | 11 | ||||
| -rw-r--r-- | src/yuzu/debugger/wait_tree.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 14 |
10 files changed, 52 insertions, 35 deletions
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp index b2e3a495a..d3bb6f818 100644 --- a/src/core/core_timing.cpp +++ b/src/core/core_timing.cpp | |||
| @@ -226,8 +226,8 @@ void Idle() { | |||
| 226 | downcount = 0; | 226 | downcount = 0; |
| 227 | } | 227 | } |
| 228 | 228 | ||
| 229 | u64 GetGlobalTimeUs() { | 229 | std::chrono::microseconds GetGlobalTimeUs() { |
| 230 | return GetTicks() * 1000000 / BASE_CLOCK_RATE; | 230 | return std::chrono::microseconds{GetTicks() * 1000000 / BASE_CLOCK_RATE}; |
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | int GetDowncount() { | 233 | int GetDowncount() { |
diff --git a/src/core/core_timing.h b/src/core/core_timing.h index 5bbde47f4..dfa161c0d 100644 --- a/src/core/core_timing.h +++ b/src/core/core_timing.h | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | * ScheduleEvent(periodInCycles - cyclesLate, callback, "whatever") | 17 | * ScheduleEvent(periodInCycles - cyclesLate, callback, "whatever") |
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | #include <chrono> | ||
| 20 | #include <functional> | 21 | #include <functional> |
| 21 | #include <string> | 22 | #include <string> |
| 22 | #include "common/common_types.h" | 23 | #include "common/common_types.h" |
| @@ -86,7 +87,7 @@ void ClearPendingEvents(); | |||
| 86 | 87 | ||
| 87 | void ForceExceptionCheck(s64 cycles); | 88 | void ForceExceptionCheck(s64 cycles); |
| 88 | 89 | ||
| 89 | u64 GetGlobalTimeUs(); | 90 | std::chrono::microseconds GetGlobalTimeUs(); |
| 90 | 91 | ||
| 91 | int GetDowncount(); | 92 | int GetDowncount(); |
| 92 | 93 | ||
diff --git a/src/core/hle/kernel/event.h b/src/core/hle/kernel/event.h index 1c99911b2..3c20c05e8 100644 --- a/src/core/hle/kernel/event.h +++ b/src/core/hle/kernel/event.h | |||
| @@ -31,10 +31,9 @@ public: | |||
| 31 | return HANDLE_TYPE; | 31 | return HANDLE_TYPE; |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | ResetType reset_type; ///< Current ResetType | 34 | ResetType GetResetType() const { |
| 35 | 35 | return reset_type; | |
| 36 | bool signaled; ///< Whether the event has already been signaled | 36 | } |
| 37 | std::string name; ///< Name of event (optional) | ||
| 38 | 37 | ||
| 39 | bool ShouldWait(Thread* thread) const override; | 38 | bool ShouldWait(Thread* thread) const override; |
| 40 | void Acquire(Thread* thread) override; | 39 | void Acquire(Thread* thread) override; |
| @@ -47,6 +46,11 @@ public: | |||
| 47 | private: | 46 | private: |
| 48 | Event(); | 47 | Event(); |
| 49 | ~Event() override; | 48 | ~Event() override; |
| 49 | |||
| 50 | ResetType reset_type; ///< Current ResetType | ||
| 51 | |||
| 52 | bool signaled; ///< Whether the event has already been signaled | ||
| 53 | std::string name; ///< Name of event (optional) | ||
| 50 | }; | 54 | }; |
| 51 | 55 | ||
| 52 | } // namespace Kernel | 56 | } // namespace Kernel |
diff --git a/src/core/perf_stats.cpp b/src/core/perf_stats.cpp index 5f53b16d3..8e09b9b63 100644 --- a/src/core/perf_stats.cpp +++ b/src/core/perf_stats.cpp | |||
| @@ -40,22 +40,21 @@ void PerfStats::EndGameFrame() { | |||
| 40 | game_frames += 1; | 40 | game_frames += 1; |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | PerfStats::Results PerfStats::GetAndResetStats(u64 current_system_time_us) { | 43 | PerfStats::Results PerfStats::GetAndResetStats(microseconds current_system_time_us) { |
| 44 | std::lock_guard<std::mutex> lock(object_mutex); | 44 | std::lock_guard<std::mutex> lock(object_mutex); |
| 45 | 45 | ||
| 46 | auto now = Clock::now(); | 46 | const auto now = Clock::now(); |
| 47 | // Walltime elapsed since stats were reset | 47 | // Walltime elapsed since stats were reset |
| 48 | auto interval = duration_cast<DoubleSecs>(now - reset_point).count(); | 48 | const auto interval = duration_cast<DoubleSecs>(now - reset_point).count(); |
| 49 | 49 | ||
| 50 | auto system_us_per_second = | 50 | const auto system_us_per_second = (current_system_time_us - reset_point_system_us) / interval; |
| 51 | static_cast<double>(current_system_time_us - reset_point_system_us) / interval; | ||
| 52 | 51 | ||
| 53 | Results results{}; | 52 | Results results{}; |
| 54 | results.system_fps = static_cast<double>(system_frames) / interval; | 53 | results.system_fps = static_cast<double>(system_frames) / interval; |
| 55 | results.game_fps = static_cast<double>(game_frames) / interval; | 54 | results.game_fps = static_cast<double>(game_frames) / interval; |
| 56 | results.frametime = duration_cast<DoubleSecs>(accumulated_frametime).count() / | 55 | results.frametime = duration_cast<DoubleSecs>(accumulated_frametime).count() / |
| 57 | static_cast<double>(system_frames); | 56 | static_cast<double>(system_frames); |
| 58 | results.emulation_speed = system_us_per_second / 1'000'000.0; | 57 | results.emulation_speed = system_us_per_second.count() / 1'000'000.0; |
| 59 | 58 | ||
| 60 | // Reset counters | 59 | // Reset counters |
| 61 | reset_point = now; | 60 | reset_point = now; |
| @@ -74,10 +73,10 @@ double PerfStats::GetLastFrameTimeScale() { | |||
| 74 | return duration_cast<DoubleSecs>(previous_frame_length).count() / FRAME_LENGTH; | 73 | return duration_cast<DoubleSecs>(previous_frame_length).count() / FRAME_LENGTH; |
| 75 | } | 74 | } |
| 76 | 75 | ||
| 77 | void FrameLimiter::DoFrameLimiting(u64 current_system_time_us) { | 76 | void FrameLimiter::DoFrameLimiting(microseconds current_system_time_us) { |
| 78 | // Max lag caused by slow frames. Can be adjusted to compensate for too many slow frames. Higher | 77 | // Max lag caused by slow frames. Can be adjusted to compensate for too many slow frames. Higher |
| 79 | // values increase the time needed to recover and limit framerate again after spikes. | 78 | // values increase the time needed to recover and limit framerate again after spikes. |
| 80 | constexpr microseconds MAX_LAG_TIME_US = 25ms; | 79 | constexpr microseconds MAX_LAG_TIME_US = 25us; |
| 81 | 80 | ||
| 82 | if (!Settings::values.toggle_framelimit) { | 81 | if (!Settings::values.toggle_framelimit) { |
| 83 | return; | 82 | return; |
| @@ -85,7 +84,7 @@ void FrameLimiter::DoFrameLimiting(u64 current_system_time_us) { | |||
| 85 | 84 | ||
| 86 | auto now = Clock::now(); | 85 | auto now = Clock::now(); |
| 87 | 86 | ||
| 88 | frame_limiting_delta_err += microseconds(current_system_time_us - previous_system_time_us); | 87 | frame_limiting_delta_err += current_system_time_us - previous_system_time_us; |
| 89 | frame_limiting_delta_err -= duration_cast<microseconds>(now - previous_walltime); | 88 | frame_limiting_delta_err -= duration_cast<microseconds>(now - previous_walltime); |
| 90 | frame_limiting_delta_err = | 89 | frame_limiting_delta_err = |
| 91 | std::clamp(frame_limiting_delta_err, -MAX_LAG_TIME_US, MAX_LAG_TIME_US); | 90 | std::clamp(frame_limiting_delta_err, -MAX_LAG_TIME_US, MAX_LAG_TIME_US); |
diff --git a/src/core/perf_stats.h b/src/core/perf_stats.h index 362b205c8..6e4619701 100644 --- a/src/core/perf_stats.h +++ b/src/core/perf_stats.h | |||
| @@ -33,7 +33,7 @@ public: | |||
| 33 | void EndSystemFrame(); | 33 | void EndSystemFrame(); |
| 34 | void EndGameFrame(); | 34 | void EndGameFrame(); |
| 35 | 35 | ||
| 36 | Results GetAndResetStats(u64 current_system_time_us); | 36 | Results GetAndResetStats(std::chrono::microseconds current_system_time_us); |
| 37 | 37 | ||
| 38 | /** | 38 | /** |
| 39 | * Gets the ratio between walltime and the emulated time of the previous system frame. This is | 39 | * Gets the ratio between walltime and the emulated time of the previous system frame. This is |
| @@ -47,7 +47,7 @@ private: | |||
| 47 | /// Point when the cumulative counters were reset | 47 | /// Point when the cumulative counters were reset |
| 48 | Clock::time_point reset_point = Clock::now(); | 48 | Clock::time_point reset_point = Clock::now(); |
| 49 | /// System time when the cumulative counters were reset | 49 | /// System time when the cumulative counters were reset |
| 50 | u64 reset_point_system_us = 0; | 50 | std::chrono::microseconds reset_point_system_us{0}; |
| 51 | 51 | ||
| 52 | /// Cumulative duration (excluding v-sync/frame-limiting) of frames since last reset | 52 | /// Cumulative duration (excluding v-sync/frame-limiting) of frames since last reset |
| 53 | Clock::duration accumulated_frametime = Clock::duration::zero(); | 53 | Clock::duration accumulated_frametime = Clock::duration::zero(); |
| @@ -68,11 +68,11 @@ class FrameLimiter { | |||
| 68 | public: | 68 | public: |
| 69 | using Clock = std::chrono::high_resolution_clock; | 69 | using Clock = std::chrono::high_resolution_clock; |
| 70 | 70 | ||
| 71 | void DoFrameLimiting(u64 current_system_time_us); | 71 | void DoFrameLimiting(std::chrono::microseconds current_system_time_us); |
| 72 | 72 | ||
| 73 | private: | 73 | private: |
| 74 | /// Emulated system time (in microseconds) at the last limiter invocation | 74 | /// Emulated system time (in microseconds) at the last limiter invocation |
| 75 | u64 previous_system_time_us = 0; | 75 | std::chrono::microseconds previous_system_time_us{0}; |
| 76 | /// Walltime at the last limiter invocation | 76 | /// Walltime at the last limiter invocation |
| 77 | Clock::time_point previous_walltime = Clock::now(); | 77 | Clock::time_point previous_walltime = Clock::now(); |
| 78 | 78 | ||
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index a235b543e..5c0ae8009 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp | |||
| @@ -285,8 +285,6 @@ Texture::TICEntry Maxwell3D::GetTICEntry(u32 tic_index) const { | |||
| 285 | 285 | ||
| 286 | // TODO(Subv): Different data types for separate components are not supported | 286 | // TODO(Subv): Different data types for separate components are not supported |
| 287 | ASSERT(r_type == g_type && r_type == b_type && r_type == a_type); | 287 | ASSERT(r_type == g_type && r_type == b_type && r_type == a_type); |
| 288 | // TODO(Subv): Only UNORM formats are supported for now. | ||
| 289 | ASSERT(r_type == Texture::ComponentType::UNORM); | ||
| 290 | 288 | ||
| 291 | return tic_entry; | 289 | return tic_entry; |
| 292 | } | 290 | } |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp index c8f0c4e28..257aa9571 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | |||
| @@ -46,6 +46,8 @@ struct FormatTuple { | |||
| 46 | params.height = Common::AlignUp(config.tic.Height(), GetCompressionFactor(params.pixel_format)); | 46 | params.height = Common::AlignUp(config.tic.Height(), GetCompressionFactor(params.pixel_format)); |
| 47 | params.unaligned_height = config.tic.Height(); | 47 | params.unaligned_height = config.tic.Height(); |
| 48 | params.size_in_bytes = params.SizeInBytes(); | 48 | params.size_in_bytes = params.SizeInBytes(); |
| 49 | params.cache_width = Common::AlignUp(params.width, 16); | ||
| 50 | params.cache_height = Common::AlignUp(params.height, 16); | ||
| 49 | return params; | 51 | return params; |
| 50 | } | 52 | } |
| 51 | 53 | ||
| @@ -63,6 +65,8 @@ struct FormatTuple { | |||
| 63 | params.height = config.height; | 65 | params.height = config.height; |
| 64 | params.unaligned_height = config.height; | 66 | params.unaligned_height = config.height; |
| 65 | params.size_in_bytes = params.SizeInBytes(); | 67 | params.size_in_bytes = params.SizeInBytes(); |
| 68 | params.cache_width = Common::AlignUp(params.width, 16); | ||
| 69 | params.cache_height = Common::AlignUp(params.height, 16); | ||
| 66 | return params; | 70 | return params; |
| 67 | } | 71 | } |
| 68 | 72 | ||
| @@ -82,6 +86,8 @@ struct FormatTuple { | |||
| 82 | params.height = zeta_height; | 86 | params.height = zeta_height; |
| 83 | params.unaligned_height = zeta_height; | 87 | params.unaligned_height = zeta_height; |
| 84 | params.size_in_bytes = params.SizeInBytes(); | 88 | params.size_in_bytes = params.SizeInBytes(); |
| 89 | params.cache_width = Common::AlignUp(params.width, 16); | ||
| 90 | params.cache_height = Common::AlignUp(params.height, 16); | ||
| 85 | return params; | 91 | return params; |
| 86 | } | 92 | } |
| 87 | 93 | ||
| @@ -680,12 +686,12 @@ Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params) { | |||
| 680 | // If use_accurate_framebuffers is enabled, always load from memory | 686 | // If use_accurate_framebuffers is enabled, always load from memory |
| 681 | FlushSurface(surface); | 687 | FlushSurface(surface); |
| 682 | UnregisterSurface(surface); | 688 | UnregisterSurface(surface); |
| 683 | } else if (surface->GetSurfaceParams() != params) { | 689 | } else if (surface->GetSurfaceParams().IsCompatibleSurface(params)) { |
| 684 | // If surface parameters changed, recreate the surface from the old one | ||
| 685 | return RecreateSurface(surface, params); | ||
| 686 | } else { | ||
| 687 | // Use the cached surface as-is | 690 | // Use the cached surface as-is |
| 688 | return surface; | 691 | return surface; |
| 692 | } else { | ||
| 693 | // If surface parameters changed, recreate the surface from the old one | ||
| 694 | return RecreateSurface(surface, params); | ||
| 689 | } | 695 | } |
| 690 | } | 696 | } |
| 691 | 697 | ||
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h index 4e1e18d9c..39fcf22b4 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <memory> | 9 | #include <memory> |
| 10 | #include <vector> | 10 | #include <vector> |
| 11 | #include <boost/icl/interval_map.hpp> | 11 | #include <boost/icl/interval_map.hpp> |
| 12 | |||
| 12 | #include "common/common_types.h" | 13 | #include "common/common_types.h" |
| 13 | #include "common/math_util.h" | 14 | #include "common/math_util.h" |
| 14 | #include "video_core/engines/maxwell_3d.h" | 15 | #include "video_core/engines/maxwell_3d.h" |
| @@ -546,6 +547,12 @@ struct SurfaceParams { | |||
| 546 | return !operator==(other); | 547 | return !operator==(other); |
| 547 | } | 548 | } |
| 548 | 549 | ||
| 550 | /// Checks if surfaces are compatible for caching | ||
| 551 | bool IsCompatibleSurface(const SurfaceParams& other) const { | ||
| 552 | return std::tie(pixel_format, type, cache_width, cache_height) == | ||
| 553 | std::tie(other.pixel_format, other.type, other.cache_width, other.cache_height); | ||
| 554 | } | ||
| 555 | |||
| 549 | Tegra::GPUVAddr addr; | 556 | Tegra::GPUVAddr addr; |
| 550 | bool is_tiled; | 557 | bool is_tiled; |
| 551 | u32 block_height; | 558 | u32 block_height; |
| @@ -556,6 +563,10 @@ struct SurfaceParams { | |||
| 556 | u32 height; | 563 | u32 height; |
| 557 | u32 unaligned_height; | 564 | u32 unaligned_height; |
| 558 | size_t size_in_bytes; | 565 | size_t size_in_bytes; |
| 566 | |||
| 567 | // Parameters used for caching only | ||
| 568 | u32 cache_width; | ||
| 569 | u32 cache_height; | ||
| 559 | }; | 570 | }; |
| 560 | 571 | ||
| 561 | class CachedSurface final { | 572 | class CachedSurface final { |
diff --git a/src/yuzu/debugger/wait_tree.cpp b/src/yuzu/debugger/wait_tree.cpp index 3b23d0bbe..d0926d723 100644 --- a/src/yuzu/debugger/wait_tree.cpp +++ b/src/yuzu/debugger/wait_tree.cpp | |||
| @@ -316,7 +316,7 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeEvent::GetChildren() const { | |||
| 316 | 316 | ||
| 317 | list.push_back(std::make_unique<WaitTreeText>( | 317 | list.push_back(std::make_unique<WaitTreeText>( |
| 318 | tr("reset type = %1") | 318 | tr("reset type = %1") |
| 319 | .arg(GetResetTypeQString(static_cast<const Kernel::Event&>(object).reset_type)))); | 319 | .arg(GetResetTypeQString(static_cast<const Kernel::Event&>(object).GetResetType())))); |
| 320 | return list; | 320 | return list; |
| 321 | } | 321 | } |
| 322 | 322 | ||
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index e28679cd1..d0415a7dc 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp | |||
| @@ -654,9 +654,8 @@ void GMainWindow::OnMenuRecentFile() { | |||
| 654 | QAction* action = qobject_cast<QAction*>(sender()); | 654 | QAction* action = qobject_cast<QAction*>(sender()); |
| 655 | assert(action); | 655 | assert(action); |
| 656 | 656 | ||
| 657 | QString filename = action->data().toString(); | 657 | const QString filename = action->data().toString(); |
| 658 | QFileInfo file_info(filename); | 658 | if (QFileInfo::exists(filename)) { |
| 659 | if (file_info.exists()) { | ||
| 660 | BootGame(filename); | 659 | BootGame(filename); |
| 661 | } else { | 660 | } else { |
| 662 | // Display an error message and remove the file from the list. | 661 | // Display an error message and remove the file from the list. |
| @@ -947,15 +946,14 @@ void GMainWindow::UpdateUITheme() { | |||
| 947 | QStringList theme_paths(default_theme_paths); | 946 | QStringList theme_paths(default_theme_paths); |
| 948 | if (UISettings::values.theme != UISettings::themes[0].second && | 947 | if (UISettings::values.theme != UISettings::themes[0].second && |
| 949 | !UISettings::values.theme.isEmpty()) { | 948 | !UISettings::values.theme.isEmpty()) { |
| 950 | QString theme_uri(":" + UISettings::values.theme + "/style.qss"); | 949 | const QString theme_uri(":" + UISettings::values.theme + "/style.qss"); |
| 951 | QFile f(theme_uri); | 950 | QFile f(theme_uri); |
| 952 | if (!f.exists()) { | 951 | if (f.open(QFile::ReadOnly | QFile::Text)) { |
| 953 | LOG_ERROR(Frontend, "Unable to set style, stylesheet file not found"); | ||
| 954 | } else { | ||
| 955 | f.open(QFile::ReadOnly | QFile::Text); | ||
| 956 | QTextStream ts(&f); | 952 | QTextStream ts(&f); |
| 957 | qApp->setStyleSheet(ts.readAll()); | 953 | qApp->setStyleSheet(ts.readAll()); |
| 958 | GMainWindow::setStyleSheet(ts.readAll()); | 954 | GMainWindow::setStyleSheet(ts.readAll()); |
| 955 | } else { | ||
| 956 | LOG_ERROR(Frontend, "Unable to set style, stylesheet file not found"); | ||
| 959 | } | 957 | } |
| 960 | theme_paths.append(QStringList{":/icons/default", ":/icons/" + UISettings::values.theme}); | 958 | theme_paths.append(QStringList{":/icons/default", ":/icons/" + UISettings::values.theme}); |
| 961 | QIcon::setThemeName(":/icons/" + UISettings::values.theme); | 959 | QIcon::setThemeName(":/icons/" + UISettings::values.theme); |