mirror of
https://github.com/spice2x/spice2x.github.io.git
synced 2026-08-01 22:30:42 -07:00
graphics: custom resolution for subscreen (#553)
## Link to GitHub Issue, if one exists n/a ## Description of change Allow user to specify a custom resolution for the sub monitor, in addition to the existing refresh rate option This would allow practically any touch monitor (including ones with weird resolution / aspect ratio / refresh rate) to be used with IIDX/SDVX. ## Testing Tested with various resolution / refresh rate combinations on IIDX / SDVX.
This commit is contained in:
@@ -945,7 +945,8 @@ HRESULT STDMETHODCALLTYPE WrappedIDirect3D9::CreateDeviceEx(
|
|||||||
|
|
||||||
for (size_t i = 0; i < num_adapters; i++) {
|
for (size_t i = 0; i < num_adapters; i++) {
|
||||||
auto *params = &pPresentationParameters[i];
|
auto *params = &pPresentationParameters[i];
|
||||||
if (!GRAPHICS_WINDOWED && i == 0) {
|
if (!GRAPHICS_WINDOWED){
|
||||||
|
if (i == 0) {
|
||||||
GRAPHICS_FS_ORIGINAL_WIDTH = params->BackBufferWidth;
|
GRAPHICS_FS_ORIGINAL_WIDTH = params->BackBufferWidth;
|
||||||
GRAPHICS_FS_ORIGINAL_HEIGHT = params->BackBufferHeight;
|
GRAPHICS_FS_ORIGINAL_HEIGHT = params->BackBufferHeight;
|
||||||
log_misc("graphics::d3d9", "original resolution: {}x{}", GRAPHICS_FS_ORIGINAL_WIDTH, GRAPHICS_FS_ORIGINAL_HEIGHT);
|
log_misc("graphics::d3d9", "original resolution: {}x{}", GRAPHICS_FS_ORIGINAL_WIDTH, GRAPHICS_FS_ORIGINAL_HEIGHT);
|
||||||
@@ -966,6 +967,16 @@ HRESULT STDMETHODCALLTYPE WrappedIDirect3D9::CreateDeviceEx(
|
|||||||
params->BackBufferHeight, params->BackBufferWidth);
|
params->BackBufferHeight, params->BackBufferWidth);
|
||||||
std::swap(params->BackBufferWidth, params->BackBufferHeight);
|
std::swap(params->BackBufferWidth, params->BackBufferHeight);
|
||||||
}
|
}
|
||||||
|
} else if (i == 1 && GRAPHICS_FS_CUSTOM_RESOLUTION_SUB.has_value()) {
|
||||||
|
log_misc(
|
||||||
|
"graphics::d3d9",
|
||||||
|
"use custom sub resolution {}x{} => {}x{}",
|
||||||
|
params->BackBufferWidth, params->BackBufferHeight,
|
||||||
|
GRAPHICS_FS_CUSTOM_RESOLUTION_SUB.value().first,
|
||||||
|
GRAPHICS_FS_CUSTOM_RESOLUTION_SUB.value().second);
|
||||||
|
params->BackBufferWidth = GRAPHICS_FS_CUSTOM_RESOLUTION_SUB.value().first;
|
||||||
|
params->BackBufferHeight = GRAPHICS_FS_CUSTOM_RESOLUTION_SUB.value().second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info("graphics::d3d9",
|
log_info("graphics::d3d9",
|
||||||
@@ -992,13 +1003,18 @@ HRESULT STDMETHODCALLTYPE WrappedIDirect3D9::CreateDeviceEx(
|
|||||||
for (size_t i = 0; i < num_adapters; i++) {
|
for (size_t i = 0; i < num_adapters; i++) {
|
||||||
auto *fullscreen_display_mode = &pFullscreenDisplayMode[i];
|
auto *fullscreen_display_mode = &pFullscreenDisplayMode[i];
|
||||||
|
|
||||||
if (!GRAPHICS_WINDOWED && i == 0) {
|
if (!GRAPHICS_WINDOWED) {
|
||||||
|
if (i == 0) {
|
||||||
if (GRAPHICS_FS_CUSTOM_RESOLUTION.has_value()) {
|
if (GRAPHICS_FS_CUSTOM_RESOLUTION.has_value()) {
|
||||||
fullscreen_display_mode->Width = GRAPHICS_FS_CUSTOM_RESOLUTION.value().first;
|
fullscreen_display_mode->Width = GRAPHICS_FS_CUSTOM_RESOLUTION.value().first;
|
||||||
fullscreen_display_mode->Height = GRAPHICS_FS_CUSTOM_RESOLUTION.value().second;
|
fullscreen_display_mode->Height = GRAPHICS_FS_CUSTOM_RESOLUTION.value().second;
|
||||||
} else if (GRAPHICS_FS_ORIENTATION_SWAP) {
|
} else if (GRAPHICS_FS_ORIENTATION_SWAP) {
|
||||||
std::swap(fullscreen_display_mode->Width, fullscreen_display_mode->Height);
|
std::swap(fullscreen_display_mode->Width, fullscreen_display_mode->Height);
|
||||||
}
|
}
|
||||||
|
} else if (i == 1 && GRAPHICS_FS_CUSTOM_RESOLUTION_SUB.has_value()) {
|
||||||
|
fullscreen_display_mode->Width = GRAPHICS_FS_CUSTOM_RESOLUTION_SUB.value().first;
|
||||||
|
fullscreen_display_mode->Height = GRAPHICS_FS_CUSTOM_RESOLUTION_SUB.value().second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info("graphics::d3d9",
|
log_info("graphics::d3d9",
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ bool GRAPHICS_9_ON_12_REQUESTED_BY_GAME = false;
|
|||||||
bool SUBSCREEN_FORCE_REDRAW = false;
|
bool SUBSCREEN_FORCE_REDRAW = false;
|
||||||
bool D3D9_DEVICE_HOOK_DISABLE = false;
|
bool D3D9_DEVICE_HOOK_DISABLE = false;
|
||||||
std::optional<std::pair<uint32_t, uint32_t>> GRAPHICS_FS_CUSTOM_RESOLUTION;
|
std::optional<std::pair<uint32_t, uint32_t>> GRAPHICS_FS_CUSTOM_RESOLUTION;
|
||||||
|
std::optional<std::pair<uint32_t, uint32_t>> GRAPHICS_FS_CUSTOM_RESOLUTION_SUB;
|
||||||
bool GRAPHICS_FS_ORIENTATION_SWAP = false;
|
bool GRAPHICS_FS_ORIENTATION_SWAP = false;
|
||||||
uint32_t GRAPHICS_FS_ORIGINAL_WIDTH = 0;
|
uint32_t GRAPHICS_FS_ORIGINAL_WIDTH = 0;
|
||||||
uint32_t GRAPHICS_FS_ORIGINAL_HEIGHT = 0;
|
uint32_t GRAPHICS_FS_ORIGINAL_HEIGHT = 0;
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ extern std::optional<int> GRAPHICS_FORCE_VSYNC_BUFFER;
|
|||||||
extern bool GRAPHICS_FORCE_SINGLE_ADAPTER;
|
extern bool GRAPHICS_FORCE_SINGLE_ADAPTER;
|
||||||
extern bool GRAPHICS_PREVENT_SECONDARY_WINDOW;
|
extern bool GRAPHICS_PREVENT_SECONDARY_WINDOW;
|
||||||
extern std::optional<std::pair<uint32_t, uint32_t>> GRAPHICS_FS_CUSTOM_RESOLUTION;
|
extern std::optional<std::pair<uint32_t, uint32_t>> GRAPHICS_FS_CUSTOM_RESOLUTION;
|
||||||
|
extern std::optional<std::pair<uint32_t, uint32_t>> GRAPHICS_FS_CUSTOM_RESOLUTION_SUB;
|
||||||
extern bool GRAPHICS_FS_ORIENTATION_SWAP;
|
extern bool GRAPHICS_FS_ORIENTATION_SWAP;
|
||||||
extern uint32_t GRAPHICS_FS_ORIGINAL_WIDTH;
|
extern uint32_t GRAPHICS_FS_ORIGINAL_WIDTH;
|
||||||
extern uint32_t GRAPHICS_FS_ORIGINAL_HEIGHT;
|
extern uint32_t GRAPHICS_FS_ORIGINAL_HEIGHT;
|
||||||
|
|||||||
@@ -1406,6 +1406,15 @@ int main_implementation(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options[launcher::Options::FullscreenSubResolution].is_active()) {
|
||||||
|
std::pair<uint32_t, uint32_t> result;
|
||||||
|
if (parse_width_height(options[launcher::Options::FullscreenSubResolution].value_text(), result)) {
|
||||||
|
GRAPHICS_FS_CUSTOM_RESOLUTION_SUB = result;
|
||||||
|
} else {
|
||||||
|
log_warning("launcher", "failed to parse -forceressub");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SDVXFullscreenLandscape disabled due to it messing with in-game camera angle
|
// SDVXFullscreenLandscape disabled due to it messing with in-game camera angle
|
||||||
// FullscreenOrientationFlip continues to live on, however.
|
// FullscreenOrientationFlip continues to live on, however.
|
||||||
if (options[launcher::Options::SDVXFullscreenLandscape].value_bool() && !cfg::CONFIGURATOR_STANDALONE) {
|
if (options[launcher::Options::SDVXFullscreenLandscape].value_bool() && !cfg::CONFIGURATOR_STANDALONE) {
|
||||||
|
|||||||
@@ -256,9 +256,21 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
|||||||
.hidden = true,
|
.hidden = true,
|
||||||
.category = "Graphics (Full Screen)"
|
.category = "Graphics (Full Screen)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// FullscreenSubResolution
|
||||||
|
.title = "Force FS Subscreen Resolution (EXPERIMENTAL)",
|
||||||
|
.name = "forceressub",
|
||||||
|
.desc =
|
||||||
|
"Override fullscreen resolution requested by the game for second monitor, "
|
||||||
|
"useful if you have a sub monitor that is not quite exactly what the game expects.\n\n"
|
||||||
|
"WARNING: experimental as we have not done extensive testing to see if this causes desyncs.",
|
||||||
|
.type = OptionType::Text,
|
||||||
|
.setting_name = "1280,720",
|
||||||
|
.category = "Graphics (Full Screen)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// FullscreenSubRefreshRate
|
// FullscreenSubRefreshRate
|
||||||
.title = "Force Submonitor Refresh Rate (EXPERIMENTAL)",
|
.title = "Force FS Subscreen Refresh Rate (EXPERIMENTAL)",
|
||||||
.name = "graphics-force-refresh-sub",
|
.name = "graphics-force-refresh-sub",
|
||||||
.desc =
|
.desc =
|
||||||
"Override fullscreen refresh rate requested by the game for second monitor, "
|
"Override fullscreen refresh rate requested by the game for second monitor, "
|
||||||
@@ -814,7 +826,7 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
|||||||
.category = "Game Options",
|
.category = "Game Options",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "SDVX Native Touch Handling",
|
.title = "SDVX FS Subscreen Native Touch Handling",
|
||||||
.name = "sdvxnativetouch",
|
.name = "sdvxnativetouch",
|
||||||
.desc = "Disables touch hooks and lets the game access a touch screen directly. "
|
.desc = "Disables touch hooks and lets the game access a touch screen directly. "
|
||||||
"Requires a touch screen to be connected as a secondary monitor. "
|
"Requires a touch screen to be connected as a secondary monitor. "
|
||||||
@@ -824,6 +836,18 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
|||||||
.game_name = "Sound Voltex",
|
.game_name = "Sound Voltex",
|
||||||
.category = "Game Options (Advanced)",
|
.category = "Game Options (Advanced)",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// spice2x_SDVXSubRedraw
|
||||||
|
.title = "SDVX FS Subscreen Force Redraw",
|
||||||
|
.name = "sp2x-sdvxsubredraw",
|
||||||
|
.display_name = "sdvxsubredraw",
|
||||||
|
.aliases= "sdvxsubredraw",
|
||||||
|
.desc = "Check if submonitor in fullscreen mode doesn't update every frame; "
|
||||||
|
"this option forces subscreen to redraw every frame.",
|
||||||
|
.type = OptionType::Bool,
|
||||||
|
.game_name = "Sound Voltex",
|
||||||
|
.category = "Game Options (Advanced)",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// spice2x_SDVXDigitalKnobSensitivity
|
// spice2x_SDVXDigitalKnobSensitivity
|
||||||
.title = "SDVX Digital Knob Sensitivity",
|
.title = "SDVX Digital Knob Sensitivity",
|
||||||
@@ -884,18 +908,6 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
|||||||
{"bottomright", "for landscape"},
|
{"bottomright", "for landscape"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
// spice2x_SDVXSubRedraw
|
|
||||||
.title = "SDVX Subscreen Force Redraw",
|
|
||||||
.name = "sp2x-sdvxsubredraw",
|
|
||||||
.display_name = "sdvxsubredraw",
|
|
||||||
.aliases= "sdvxsubredraw",
|
|
||||||
.desc = "Check if second monitor for subscreen doesn't update every frame; "
|
|
||||||
"forces subscreen to redraw every frame, only needed for newer EG.",
|
|
||||||
.type = OptionType::Bool,
|
|
||||||
.game_name = "Sound Voltex",
|
|
||||||
.category = "Game Options (Advanced)",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
.title = "Force Load DDR Module",
|
.title = "Force Load DDR Module",
|
||||||
.name = "ddr",
|
.name = "ddr",
|
||||||
@@ -2251,7 +2263,7 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
// spice2x_IIDXNativeTouch
|
// spice2x_IIDXNativeTouch
|
||||||
.title = "IIDX Native Touch Handling",
|
.title = "IIDX TDJ Subscreen Native Touch Handling",
|
||||||
.name = "sp2x-iidxnativetouch",
|
.name = "sp2x-iidxnativetouch",
|
||||||
.display_name = "iidxnativetouch",
|
.display_name = "iidxnativetouch",
|
||||||
.aliases= "iidxnativetouch",
|
.aliases= "iidxnativetouch",
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ namespace launcher {
|
|||||||
GraphicsForceRefresh,
|
GraphicsForceRefresh,
|
||||||
FullscreenResolution,
|
FullscreenResolution,
|
||||||
FullscreenOrientationFlip,
|
FullscreenOrientationFlip,
|
||||||
|
FullscreenSubResolution,
|
||||||
FullscreenSubRefreshRate,
|
FullscreenSubRefreshRate,
|
||||||
Graphics9On12,
|
Graphics9On12,
|
||||||
spice2x_Dx9On12,
|
spice2x_Dx9On12,
|
||||||
@@ -85,11 +86,11 @@ namespace launcher {
|
|||||||
SDVXPrinterJPGQuality,
|
SDVXPrinterJPGQuality,
|
||||||
SDVXDisableCameras,
|
SDVXDisableCameras,
|
||||||
SDVXNativeTouch,
|
SDVXNativeTouch,
|
||||||
|
spice2x_SDVXSubRedraw,
|
||||||
spice2x_SDVXDigitalKnobSensitivity,
|
spice2x_SDVXDigitalKnobSensitivity,
|
||||||
SDVXDigitalKnobSocd,
|
SDVXDigitalKnobSocd,
|
||||||
spice2x_SDVXAsioDriver,
|
spice2x_SDVXAsioDriver,
|
||||||
spice2x_SDVXSubPos,
|
spice2x_SDVXSubPos,
|
||||||
spice2x_SDVXSubRedraw,
|
|
||||||
LoadDDRModule,
|
LoadDDRModule,
|
||||||
DDR43Mode,
|
DDR43Mode,
|
||||||
DDRSkipCodecRegisteration,
|
DDRSkipCodecRegisteration,
|
||||||
|
|||||||
Reference in New Issue
Block a user