mirror of
https://github.com/spice2x/spice2x.github.io.git
synced 2026-08-01 22:30:42 -07:00
0078b72b03
## Link to GitHub Issue, if one exists Regressed by #401 ## Description of change Two things from testing SDVX Live2D - 1. ColorFill is almost always too expensive and will lead to drops 1. Scale factor of 0.5 causes GPU to sync and causes drops (ARGB/XRGB doesn't matter, linear filtering doesn't matter) 1 is fixed by removing ColorFill calls on every frame - instead only do this once when the user changes the duplicate option (on the next frame) 2 is fixed by updating the UI (limit the slider) though people can ctrl+click to override these slider limits. The warning label will be kept with slightly reworded text. ## Testing tested in sdvx eg final (sudden death) - on my RTX 4070, my FPS is rock solid 120 fps even with image resize on now.
87 lines
2.5 KiB
C++
87 lines
2.5 KiB
C++
#pragma once
|
|
|
|
#include <atomic>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <optional>
|
|
#include <filesystem>
|
|
#include "external/rapidjson/document.h"
|
|
|
|
namespace cfg {
|
|
|
|
enum WindowDecorationMode {
|
|
Default = 0,
|
|
Borderless = 1,
|
|
ResizableFrame = 2
|
|
};
|
|
|
|
enum ScreenDuplicateMode {
|
|
None = 0,
|
|
CopyLeft = 1,
|
|
CopyRight = 2,
|
|
};
|
|
|
|
struct fullscreen_setting {
|
|
int offset_x = 0;
|
|
int offset_y = 0;
|
|
float scale_x = 1.0;
|
|
float scale_y = 1.0;
|
|
bool keep_aspect_ratio = true;
|
|
ScreenDuplicateMode duplicate = ScreenDuplicateMode::None;
|
|
};
|
|
|
|
extern std::optional<std::string> SCREEN_RESIZE_CFG_PATH_OVERRIDE;
|
|
|
|
class ScreenResize {
|
|
private:
|
|
std::filesystem::path config_path;
|
|
// bool config_dirty = false;
|
|
|
|
bool load_bool_value(rapidjson::Document& doc, std::string path, bool& value);
|
|
bool load_int_value(rapidjson::Document& doc, std::string path, int& value);
|
|
bool load_uint32_value(rapidjson::Document& doc, std::string path, uint32_t& value);
|
|
bool load_float_value(rapidjson::Document& doc, std::string path, float& value);
|
|
|
|
public:
|
|
ScreenResize();
|
|
~ScreenResize();
|
|
|
|
// full screen (directx) image settings
|
|
bool enable_screen_resize = false;
|
|
int8_t screen_resize_current_scene = 0;
|
|
bool enable_linear_filter = true;
|
|
fullscreen_setting scene_settings[4];
|
|
|
|
// state
|
|
std::atomic<bool> need_surface_clean = false;
|
|
|
|
// windowed mode sizing
|
|
// Windows terminology:
|
|
// window = rectangle including the frame
|
|
// client = just the content area without frames.
|
|
bool window_always_on_top = false;
|
|
bool client_keep_aspect_ratio = true;
|
|
bool enable_window_resize = false;
|
|
int window_decoration = 0; // enum type WindowDecorationMode
|
|
uint32_t client_width = 0;
|
|
uint32_t client_height = 0;
|
|
int32_t window_offset_x = 0;
|
|
int32_t window_offset_y = 0;
|
|
|
|
// these are not saved by config, but used by window management
|
|
uint32_t init_client_width = 0;
|
|
uint32_t init_client_height = 0;
|
|
float init_client_aspect_ratio = 1.f;
|
|
uint32_t init_window_style = 0;
|
|
uint32_t init_window_style_ex = 0;
|
|
uint32_t window_deco_width = 0;
|
|
uint32_t window_deco_height = 0;
|
|
|
|
void config_load();
|
|
void config_save();
|
|
};
|
|
|
|
// globals
|
|
extern std::unique_ptr<cfg::ScreenResize> SCREENRESIZE;
|
|
}
|