gitadora: add native dual fullscreen for Arena (#846)
## Link to GitHub Issue or related Pull Request, if one exists Fixed https://github.com/spice2x/spice2x.github.io/issues/740 ## Description of change - Enable native D3D9 adapter-group dual fullscreen for the GITADORA Arena model when the two-screen MAIN + SMALL configuration is selected without windowed mode. - Present MAIN and SMALL on their respective monitor heads while keeping the invisible LEFT and RIGHT targets offscreen. - Scope the new fake-swap-chain query behavior to the hidden GITADORA two-head targets, preserving existing behavior for other games and configurations. The existing borderless-windowed two-screen path could not consistently keep input and game timing synchronized and also reduced rendering performance. Native dual fullscreen avoids that windowed composition path. ## Testing - Manually tested GITADORA Arena with separate MAIN and SMALL monitors in fullscreen mode. Windowed mode still works if the user chooses to use that. - Confirmed both displays render correctly, touch input works on the SMALL screen, gameplay input stays synchronized, and gameplay holds a steady 60 FPS. - Built `spicetools_spice64` at commit `e4a98e9` with the repository Docker toolchain. - Confirmed no new compiler warnings. - Confirmed the forbidden static DLL import check passes. - Confirmed the Windows 7 DLL compatibility check reports `All DLLs OK!`. --------- Co-authored-by: vgod <428979+vgod@users.noreply.github.com>
This commit is contained in:
co-authored by
vgod
parent
c590b87cff
commit
3012139028
@@ -0,0 +1,78 @@
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
|
||||
#include <d3d9.h>
|
||||
|
||||
inline constexpr UINT GFDM_SIDE_WIDTH = 1080;
|
||||
inline constexpr UINT GFDM_SIDE_HEIGHT = 1920;
|
||||
inline constexpr UINT GFDM_SMALL_WIDTH = 800;
|
||||
inline constexpr UINT GFDM_SMALL_HEIGHT = 1280;
|
||||
inline constexpr UINT GFDM_LOGICAL_HEAD_COUNT = 4;
|
||||
inline constexpr UINT GFDM_NATIVE_SMALL_SWAPCHAIN = 1;
|
||||
|
||||
struct GfdmTwoHeadDeviceState {
|
||||
explicit GfdmTwoHeadDeviceState(
|
||||
D3DPRESENT_PARAMETERS *presentation_parameters,
|
||||
D3DDISPLAYMODEEX *fullscreen_display_modes,
|
||||
UINT logical_small_swapchain = 2)
|
||||
: presentation_parameters(presentation_parameters),
|
||||
fullscreen_display_modes(fullscreen_display_modes),
|
||||
logical_small_swapchain(logical_small_swapchain) {}
|
||||
|
||||
void use_native_parameters() {
|
||||
presentation_parameters = native_presentation_parameters.data();
|
||||
fullscreen_display_modes = source_fullscreen_display_modes != nullptr
|
||||
? native_fullscreen_display_modes.data()
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
std::array<D3DPRESENT_PARAMETERS, 2> native_presentation_parameters {};
|
||||
std::array<D3DDISPLAYMODEEX, 2> native_fullscreen_display_modes {};
|
||||
std::array<D3DPRESENT_PARAMETERS, 2> recovery_parameters {};
|
||||
std::array<D3DDISPLAYMODEEX, 2> recovery_modes {};
|
||||
D3DPRESENT_PARAMETERS *presentation_parameters;
|
||||
D3DDISPLAYMODEEX *fullscreen_display_modes;
|
||||
D3DDISPLAYMODEEX *const source_fullscreen_display_modes = fullscreen_display_modes;
|
||||
UINT logical_small_swapchain;
|
||||
bool recovery_candidate = false;
|
||||
};
|
||||
|
||||
bool gfdm_two_head_exclusive();
|
||||
bool is_fake_subscreen_adapter(UINT adapter);
|
||||
void get_fake_subscreen_display_mode(UINT adapter, D3DDISPLAYMODE *mode);
|
||||
void get_fake_subscreen_display_mode_ex(UINT adapter, D3DDISPLAYMODEEX *mode);
|
||||
|
||||
HRESULT graphics_d3d9_gfdm_select_two_head_group_parameters(
|
||||
const D3DPRESENT_PARAMETERS *logical_presentation_parameters,
|
||||
const D3DDISPLAYMODEEX *logical_fullscreen_display_modes,
|
||||
D3DPRESENT_PARAMETERS *native_presentation_parameters,
|
||||
D3DDISPLAYMODEEX *native_fullscreen_display_modes,
|
||||
UINT *logical_small_swapchain,
|
||||
const char *operation);
|
||||
|
||||
HRESULT graphics_d3d9_gfdm_remap_two_head_group_parameters(
|
||||
D3DPRESENT_PARAMETERS *presentation_parameters,
|
||||
D3DDISPLAYMODEEX *fullscreen_display_modes,
|
||||
const char *operation);
|
||||
|
||||
void graphics_d3d9_gfdm_align_two_head_refresh_to_desktop(
|
||||
IDirect3D9Ex *d3d,
|
||||
UINT master_adapter,
|
||||
D3DPRESENT_PARAMETERS *presentation_parameters,
|
||||
D3DDISPLAYMODEEX *fullscreen_display_modes,
|
||||
const char *operation);
|
||||
|
||||
HRESULT validate_gfdm_two_head_exclusive(
|
||||
IDirect3D9 *d3d,
|
||||
UINT adapter,
|
||||
D3DDEVTYPE device_type,
|
||||
DWORD behavior_flags,
|
||||
const D3DPRESENT_PARAMETERS *presentation_parameters);
|
||||
|
||||
HRESULT graphics_d3d9_gfdm_recover_two_head_present_mode(
|
||||
IDirect3D9Ex *d3d,
|
||||
IDirect3DDevice9Ex *device,
|
||||
UINT master_adapter,
|
||||
const D3DPRESENT_PARAMETERS *desired_parameters,
|
||||
const D3DDISPLAYMODEEX *desired_modes);
|
||||
Reference in New Issue
Block a user