From 90f972dfb4de9c8245f6fc5370a294653de828cc Mon Sep 17 00:00:00 2001 From: Marco Rodolfi Date: Thu, 2 May 2024 14:16:40 +0200 Subject: [PATCH 1/2] Rebase DHD on latest gamescope master --- src/drm.cpp | 11 +++++++++-- src/gamescope_shared.h | 1 + src/modegen.cpp | 34 ++++++++++++++++++++++++++++++---- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/drm.cpp b/src/drm.cpp index 511a571..6ee3bd3 100644 --- a/src/drm.cpp +++ b/src/drm.cpp @@ -2121,6 +2121,7 @@ namespace gamescope ( m_Mutable.szMakePNP == "WLC"sv && m_Mutable.szModel == "ANX7530 U"sv ) || ( m_Mutable.szMakePNP == "ANX"sv && m_Mutable.szModel == "ANX7530 U"sv ) || ( m_Mutable.szMakePNP == "VLV"sv && m_Mutable.szModel == "ANX7530 U"sv ) || + ( m_Mutable.szMakePNP == "DHD"sv && m_Mutable.szModel == "DeckHD-1200p"sv ) || ( m_Mutable.szMakePNP == "VLV"sv && m_Mutable.szModel == "Jupiter"sv ) || ( m_Mutable.szMakePNP == "VLV"sv && m_Mutable.szModel == "Galileo"sv ); const bool bLegionGoDisplay = @@ -2132,6 +2133,7 @@ namespace gamescope { static constexpr uint32_t kPIDGalileoSDC = 0x3003; static constexpr uint32_t kPIDGalileoBOE = 0x3004; + static constexpr uint32_t kPIDJupiterDHD = 0x4001; if ( pProduct->product == kPIDGalileoSDC ) { @@ -2120,6 +2122,10 @@ namespace gamescope m_Mutable.eKnownDisplay = GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_OLED_BOE; m_Mutable.ValidDynamicRefreshRates = std::span( s_kSteamDeckOLEDRates ); } + else if (pProduct-> product == kPIDJupiterDHD ) { + m_Mutable.eKnownDisplay = GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD_DHD; + m_Mutable.ValidDynamicRefreshRates = std::span( s_kSteamDeckLCDRates ); + } else { m_Mutable.eKnownDisplay = GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD; @@ -2149,7 +2155,8 @@ namespace gamescope drm_log.infof( "[colorimetry]: Steam Deck LCD detected. Using known colorimetry" ); m_Mutable.DisplayColorimetry = displaycolorimetry_steamdeck_measured; } - else + else if (m_Mutable.eKnownDisplay == GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_OLED_BOE || + m_Mutable.eKnownDisplay == GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_OLED_SDC ) { // Steam Deck OLED has calibrated chromaticity coordinates in the EDID // for each unit. @@ -2279,7 +2286,7 @@ namespace gamescope .uMinContentLightLevel = nits_to_u16_dark( 0 ), }; } - else if ( eKnownDisplay == GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD ) + else if ( eKnownDisplay == GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD || eKnownDisplay == GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD_DHD ) { // Set up some HDR fallbacks for undocking return BackendConnectorHDRInfo diff --git a/src/gamescope_shared.h b/src/gamescope_shared.h index f34174e59..3b11e82f6 100644 --- a/src/gamescope_shared.h +++ b/src/gamescope_shared.h @@ -8,6 +8,7 @@ namespace gamescope { GAMESCOPE_KNOWN_DISPLAY_UNKNOWN, GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD, // Jupiter + GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD_DHD, // Jupiter Deck HD GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_OLED_SDC, // Galileo SDC GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_OLED_BOE, // Galileo BOE }; diff --git a/src/modegen.cpp b/src/modegen.cpp index d174c2d21..d08622555 100644 --- a/src/modegen.cpp +++ b/src/modegen.cpp @@ -293,6 +293,21 @@ unsigned int galileo_boe_vfp[] = 172,152,136,120,100,84,68,52,36,20,8 }; +#define JUPITER_BOE_PID 0x3001 +#define JUPITER_B_PID 0x3002 +#define JUPITER_HFP 40 +#define JUPITER_HSYNC 4 +#define JUPITER_HBP 0 +#define JUPITER_VFP 30 +#define JUPITER_VSYNC 4 +#define JUPITER_VBP 8 +#define JUPITER_DHD_PID 0x4001 +#define JUPITER_DHD_HFP 40 +#define JUPITER_DHD_HSYNC 20 +#define JUPITER_DHD_HBP 40 +#define JUPITER_DHD_VFP 18 +#define JUPITER_DHD_VSYNC 2 +#define JUPITER_DHD_VBP 20 #define GALILEO_MIN_REFRESH 45 #define GALILEO_SDC_PID 0x3003 #define GALILEO_SDC_VSYNC 1 @@ -344,7 +359,18 @@ void generate_fixed_mode(drmModeModeInfo *mode, const drmModeModeInfo *base, int mode->vsync_end = mode->vsync_start + vsync; mode->vtotal = mode->vsync_end + vbp; } else { - if ( eKnownDisplay == gamescope::GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD ) + if ( eKnownDisplay == gamescope:: GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD_DHD ) { + mode->hdisplay = 1200; + mode->hsync_start = mode->hdisplay + JUPITER_DHD_HFP; + mode->hsync_end = mode->hsync_start + JUPITER_DHD_HSYNC; + mode->htotal = mode->hsync_end + JUPITER_DHD_HBP; + + mode->vdisplay = 1920; + mode->vsync_start = mode->vdisplay + JUPITER_DHD_VFP; + mode->vsync_end = mode->vsync_start + JUPITER_DHD_VSYNC; + mode->vtotal = mode->vsync_end + JUPITER_DHD_VBP; + } + else if ( eKnownDisplay == gamescope::GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD ) { mode->hdisplay = 800; mode->hsync_start = 840; @@ -352,9 +378,9 @@ void generate_fixed_mode(drmModeModeInfo *mode, const drmModeModeInfo *base, int mode->htotal = 884; mode->vdisplay = 1280; - mode->vsync_start = 1310; - mode->vsync_end = 1314; - mode->vtotal = 1322; + mode->vsync_start = mode->vdisplay + JUPITER_VFP; + mode->vsync_end = mode->vsync_start + JUPITER_VSYNC; + mode->vtotal = mode->vsync_end + JUPITER_VBP; } mode->clock = ( ( mode->htotal * mode->vtotal * vrefresh ) + 999 ) / 1000; From a01b1937fe2f898d3aa8628ca6a38465da29e78b Mon Sep 17 00:00:00 2001 From: Marco Rodolfi Date: Fri, 3 May 2024 10:23:30 +0200 Subject: [PATCH 2/2] Couple of stylistic fixes and corrected a timing typo from the original patch --- src/gamescope_shared.h | 2 +- src/modegen.cpp | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/gamescope_shared.h b/src/gamescope_shared.h index 3b11e82f6..60e38293c 100644 --- a/src/gamescope_shared.h +++ b/src/gamescope_shared.h @@ -8,7 +8,7 @@ namespace gamescope { GAMESCOPE_KNOWN_DISPLAY_UNKNOWN, GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD, // Jupiter - GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD_DHD, // Jupiter Deck HD + GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD_DHD, // Jupiter Deck HD GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_OLED_SDC, // Galileo SDC GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_OLED_BOE, // Galileo BOE }; diff --git a/src/modegen.cpp b/src/modegen.cpp index d08622555..5dd113697 100644 --- a/src/modegen.cpp +++ b/src/modegen.cpp @@ -293,14 +293,16 @@ unsigned int galileo_boe_vfp[] = 172,152,136,120,100,84,68,52,36,20,8 }; +//SD LCD Stock Timings #define JUPITER_BOE_PID 0x3001 #define JUPITER_B_PID 0x3002 #define JUPITER_HFP 40 #define JUPITER_HSYNC 4 -#define JUPITER_HBP 0 +#define JUPITER_HBP 40 #define JUPITER_VFP 30 #define JUPITER_VSYNC 4 #define JUPITER_VBP 8 +//SD LCD DeckHD Timings #define JUPITER_DHD_PID 0x4001 #define JUPITER_DHD_HFP 40 #define JUPITER_DHD_HSYNC 20 @@ -308,13 +310,15 @@ unsigned int galileo_boe_vfp[] = #define JUPITER_DHD_VFP 18 #define JUPITER_DHD_VSYNC 2 #define JUPITER_DHD_VBP 20 -#define GALILEO_MIN_REFRESH 45 +//SD OLED SDC Timings #define GALILEO_SDC_PID 0x3003 #define GALILEO_SDC_VSYNC 1 #define GALILEO_SDC_VBP 22 +//SD OLED BOE Timings #define GALILEO_BOE_PID 0x3004 #define GALILEO_BOE_VSYNC 2 #define GALILEO_BOE_VBP 30 +#define GALILEO_MIN_REFRESH 45 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) unsigned int get_galileo_vfp( int vrefresh, unsigned int * vfp_array, unsigned int num_rates ) @@ -359,7 +363,7 @@ void generate_fixed_mode(drmModeModeInfo *mode, const drmModeModeInfo *base, int mode->vsync_end = mode->vsync_start + vsync; mode->vtotal = mode->vsync_end + vbp; } else { - if ( eKnownDisplay == gamescope:: GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD_DHD ) { + if ( eKnownDisplay == gamescope::GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD_DHD ) { mode->hdisplay = 1200; mode->hsync_start = mode->hdisplay + JUPITER_DHD_HFP; mode->hsync_end = mode->hsync_start + JUPITER_DHD_HSYNC; @@ -373,9 +377,9 @@ void generate_fixed_mode(drmModeModeInfo *mode, const drmModeModeInfo *base, int else if ( eKnownDisplay == gamescope::GAMESCOPE_KNOWN_DISPLAY_STEAM_DECK_LCD ) { mode->hdisplay = 800; - mode->hsync_start = 840; - mode->hsync_end = 844; - mode->htotal = 884; + mode->hsync_start = mode->hdisplay + JUPITER_HFP; + mode->hsync_end = mode->hsync_start + JUPITER_HSYNC; + mode->htotal = mode->hsync_end + JUPITER_HBP; mode->vdisplay = 1280; mode->vsync_start = mode->vdisplay + JUPITER_VFP;