diff --git a/cmake/PanoPainterSources.cmake b/cmake/PanoPainterSources.cmake index ce856981..14114140 100644 --- a/cmake/PanoPainterSources.cmake +++ b/cmake/PanoPainterSources.cmake @@ -239,6 +239,8 @@ set(PP_WINDOWS_PLATFORM_SOURCES src/platform_windows/windows_async_render_context.h src/platform_windows/windows_lifecycle_shell.cpp src/platform_windows/windows_lifecycle_shell.h + src/platform_windows/windows_lifecycle_state.cpp + src/platform_windows/windows_lifecycle_state.h src/platform_windows/windows_main_window_session.cpp src/platform_windows/windows_main_window_session.h src/platform_windows/windows_platform_services.cpp diff --git a/docs/modernization/roadmap.md b/docs/modernization/roadmap.md index c258abf3..ff1d924b 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -70,6 +70,11 @@ What is already real: - `pp_app_core` Latest slice: +- `src/platform_windows/windows_lifecycle_state.*` now owns the retained + Win32 lifecycle running flag and FPS-title scratch buffer instead of leaving + them inside `windows_lifecycle_shell.cpp`. +- `src/platform_windows/windows_lifecycle_shell.cpp` now keeps lifecycle/VR + control behavior without also owning the retained lifecycle state pocket. - `src/platform_windows/windows_async_render_context.*` now owns the retained Win32 async OpenGL context lock/swap state instead of leaving it inside `windows_platform_services.cpp`. diff --git a/docs/modernization/tasks.md b/docs/modernization/tasks.md index 68832d50..f1a8cfca 100644 --- a/docs/modernization/tasks.md +++ b/docs/modernization/tasks.md @@ -78,6 +78,10 @@ Completed, blocked, and superseded task history moved to the queue is now ordered by code movement instead. Current slice: +- `src/platform_windows/windows_lifecycle_state.*` now owns the retained + Win32 lifecycle running flag and FPS-title scratch buffer. +- `src/platform_windows/windows_lifecycle_shell.cpp` no longer carries that + retained lifecycle state pocket. - `src/platform_windows/windows_async_render_context.*` now owns the retained Win32 async GL context lock/swap state. - `src/platform_windows/windows_platform_services.cpp` no longer carries the diff --git a/src/platform_windows/windows_lifecycle_shell.cpp b/src/platform_windows/windows_lifecycle_shell.cpp index 48fb37f4..7016a391 100644 --- a/src/platform_windows/windows_lifecycle_shell.cpp +++ b/src/platform_windows/windows_lifecycle_shell.cpp @@ -4,42 +4,13 @@ #include "app.h" #include "legacy_preference_storage.h" +#include "platform_windows/windows_lifecycle_state.h" #include "platform_windows/windows_main_window_session.h" #include "platform_windows/windows_runtime_shell.h" #include "platform_windows/windows_stylus_input.h" namespace pp::platform::windows { -namespace { - -[[nodiscard]] std::atomic& retained_running_state() noexcept -{ - static std::atomic running{-1}; - return running; -} - -} - -std::atomic& lifecycle_running_state() noexcept -{ - return retained_running_state(); -} - -void mark_lifecycle_running() noexcept -{ - retained_running_state().store(1, std::memory_order_relaxed); -} - -void mark_lifecycle_stopped() noexcept -{ - retained_running_state().store(0, std::memory_order_relaxed); -} - -bool lifecycle_is_running() noexcept -{ - return retained_running_state().load(std::memory_order_relaxed) == 1; -} - void request_window_close(HWND hWnd) { PostMessage(hWnd, kUserCloseMessage, 0, 0); @@ -64,12 +35,12 @@ void update_stylus_frame(float dt) void update_window_fps(HWND hWnd, const wchar_t* window_title, VrShellState& vr, int frames) { - static wchar_t title_fps[512]; + auto* title_fps = retained_window_fps_title_buffer(); const int vr_fps = current_vr_fps(vr); if (read_vr_session_snapshot(vr).vr_active) - swprintf_s(title_fps, L"%s - %d fps - %d vr fps", window_title, frames, vr_fps); + swprintf_s(title_fps, 512, L"%s - %d fps - %d vr fps", window_title, frames, vr_fps); else - swprintf_s(title_fps, L"%s - %d fps", window_title, frames); + swprintf_s(title_fps, 512, L"%s - %d fps", window_title, frames); SetWindowText(hWnd, title_fps); PostMessage(hWnd, kUserWakeupMessage, 0, 0); @@ -88,7 +59,7 @@ void save_window_preferences(HWND hWnd) bool start_window_vr(VrShellState& vr, bool sandboxed) { - return start_vr_shell(vr, sandboxed, retained_running_state()); + return start_vr_shell(vr, sandboxed, retained_lifecycle_running_state()); } void stop_window_vr(VrShellState& vr) diff --git a/src/platform_windows/windows_lifecycle_state.cpp b/src/platform_windows/windows_lifecycle_state.cpp new file mode 100644 index 00000000..714f8b7e --- /dev/null +++ b/src/platform_windows/windows_lifecycle_state.cpp @@ -0,0 +1,51 @@ +#include "pch.h" + +#include "platform_windows/windows_lifecycle_state.h" + +namespace pp::platform::windows { +namespace { + +struct RetainedWindowLifecycleState final { + std::atomic running{-1}; + wchar_t title_fps[512]{}; +}; + +[[nodiscard]] RetainedWindowLifecycleState& retained_window_lifecycle_state() noexcept +{ + static RetainedWindowLifecycleState state; + return state; +} + +} + +std::atomic& lifecycle_running_state() noexcept +{ + return retained_lifecycle_running_state(); +} + +void mark_lifecycle_running() noexcept +{ + retained_lifecycle_running_state().store(1, std::memory_order_relaxed); +} + +void mark_lifecycle_stopped() noexcept +{ + retained_lifecycle_running_state().store(0, std::memory_order_relaxed); +} + +bool lifecycle_is_running() noexcept +{ + return retained_lifecycle_running_state().load(std::memory_order_relaxed) == 1; +} + +std::atomic& retained_lifecycle_running_state() noexcept +{ + return retained_window_lifecycle_state().running; +} + +wchar_t* retained_window_fps_title_buffer() noexcept +{ + return retained_window_lifecycle_state().title_fps; +} + +} diff --git a/src/platform_windows/windows_lifecycle_state.h b/src/platform_windows/windows_lifecycle_state.h new file mode 100644 index 00000000..b4bb228b --- /dev/null +++ b/src/platform_windows/windows_lifecycle_state.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +#include + +namespace pp::platform::windows { + +[[nodiscard]] std::atomic& lifecycle_running_state() noexcept; +void mark_lifecycle_running() noexcept; +void mark_lifecycle_stopped() noexcept; +[[nodiscard]] bool lifecycle_is_running() noexcept; +[[nodiscard]] std::atomic& retained_lifecycle_running_state() noexcept; +[[nodiscard]] wchar_t* retained_window_fps_title_buffer() noexcept; + +}