diff options
author | Sameer Lattannavar <sameer.lattannavar@intel.com> | 2020-10-07 02:25:16 +0000 |
---|---|---|
committer | Sameer Lattannavar <sameer.lattannavar@intel.com> | 2020-10-07 02:25:16 +0000 |
commit | c94339f27e16a52ba3b32aeebc5d317b2554af92 (patch) | |
tree | 49766c033916549cb4f3190211d7751d1b1fd08b | |
parent | 6c83de91fa492e3aba0288de95d4dd8656a9d07b (diff) |
[GameFrame] Setting Game frame to Window size
When user selects 'Nearest neighbour' under Video filter +
'Original size' under Stretch mode from Game settings window and
'Display hardware scaling fitler' under Home->Settings->System->Display
then dont let Retroplayer scale it using GL instead pass the
frame size to Kodi so that Display Engine can take right
scaling (Integer) and filter (NN) supported by hardware.
Date: Wed Sep 02 2020
Addressing review comments on:
1) code optimization within 'CRPBaseRenderer::ManageRenderArea' function.
2) Removing the extra video filter type 'DISPLAY' instead we can use
'NEAREST' filter in Display hardware.
Date: Tue Sep 08 2020
Addressed the review commens on :
1) Avoiding setting Kodi's window size to game frame size 60 times per second
2) optimized the usage of header files
3) Clang-formatting
Date: Sun Oct 04 2020
Aligned code to make use of 'CWinSystemGbm::UpdateDisplayHardwareScaling' to
'SetFullScreen' to pass Gameframe to DRM.
Date: Mon Oct 05 2020
Removed the setting fulscreen when game exited to avoid incorrect
behavior in windowed mode on Windows.
Signed-off-by: Sameer Lattannavar <sameer.lattannavar@intel.com>
Signed-off-by: Garrett Brown <themagnificentmrb@gmail.com>
5 files changed, 63 insertions, 4 deletions
diff --git a/xbmc/cores/RetroPlayer/rendering/RPRenderManager.cpp b/xbmc/cores/RetroPlayer/rendering/RPRenderManager.cpp index 1bb1f11039..e764d6e9d0 100644 --- a/xbmc/cores/RetroPlayer/rendering/RPRenderManager.cpp +++ b/xbmc/cores/RetroPlayer/rendering/RPRenderManager.cpp @@ -294,6 +294,38 @@ void CRPRenderManager::RenderWindow(bool bClear, const RESOLUTION_INFO& coordsRe m_renderContext.SetRenderingResolution(m_renderContext.GetVideoResolution(), false); + if (!m_bDisplayScaleSet && m_renderContext.DisplayHardwareScalingEnabled()) + { + // If the renderer has a render buffer, get the dimensions + const unsigned int sourceWidth = (renderBuffer != nullptr ? renderBuffer->GetWidth() : 0); + const unsigned int sourceHeight = (renderBuffer != nullptr ? renderBuffer->GetHeight() : 0); + + // Get render video settings for the fullscreen window + CRenderVideoSettings renderVideoSettings = GetEffectiveSettings(nullptr); + + // Get the scaling mode of the render video settings + const SCALINGMETHOD scaleMode = renderVideoSettings.GetScalingMethod(); + const STRETCHMODE stretchMode = renderVideoSettings.GetRenderStretchMode(); + + // Update display with video dimensions for integer scaling + if (scaleMode == SCALINGMETHOD::NEAREST && stretchMode == STRETCHMODE::Original && + sourceWidth > 0 && sourceHeight > 0) + { + RESOLUTION_INFO gameRes = m_renderContext.GetResInfo(); + gameRes.Overscan.left = 0; + gameRes.Overscan.top = 0; + gameRes.Overscan.right = sourceWidth; + gameRes.Overscan.bottom = sourceHeight; + gameRes.iWidth = sourceWidth; + gameRes.iHeight = sourceHeight; + gameRes.iScreenWidth = sourceWidth; + gameRes.iScreenHeight = sourceHeight; + + m_renderContext.UpdateDisplayHardwareScaling(gameRes); + m_bDisplayScaleSet = true; + } + } + RenderInternal(renderer, renderBuffer, bClear, 255); m_renderContext.SetRenderingResolution(coordsRes, false); diff --git a/xbmc/cores/RetroPlayer/rendering/RPRenderManager.h b/xbmc/cores/RetroPlayer/rendering/RPRenderManager.h index 5ec29e59b3..58d3e64496 100644 --- a/xbmc/cores/RetroPlayer/rendering/RPRenderManager.h +++ b/xbmc/cores/RetroPlayer/rendering/RPRenderManager.h @@ -219,6 +219,9 @@ private: std::set<std::string> m_failedShaderPresets; std::atomic<bool> m_bFlush = {false}; + // Windowing state + bool m_bDisplayScaleSet = false; + // Playback parameters std::atomic<double> m_speed = {1.0}; diff --git a/xbmc/cores/RetroPlayer/rendering/RenderContext.cpp b/xbmc/cores/RetroPlayer/rendering/RenderContext.cpp index 88bcb8af95..1842684b97 100644 --- a/xbmc/cores/RetroPlayer/rendering/RenderContext.cpp +++ b/xbmc/cores/RetroPlayer/rendering/RenderContext.cpp @@ -176,6 +176,16 @@ bool CRenderContext::UseLimitedColor() return m_windowing->UseLimitedColor(); } +bool CRenderContext::DisplayHardwareScalingEnabled() +{ + return m_windowing->DisplayHardwareScalingEnabled(); +} + +void CRenderContext::UpdateDisplayHardwareScaling(const RESOLUTION_INFO& resInfo) +{ + return m_windowing->UpdateDisplayHardwareScaling(resInfo); +} + int CRenderContext::GetScreenWidth() { return m_graphicsContext.GetWidth(); @@ -221,7 +231,7 @@ RESOLUTION CRenderContext::GetVideoResolution() return m_graphicsContext.GetVideoResolution(); } -void CRenderContext::Clear(UTILS::Color color /* = 0 */) +void CRenderContext::Clear(::UTILS::Color color /* = 0 */) { m_graphicsContext.Clear(color); } @@ -236,7 +246,7 @@ void CRenderContext::SetRenderingResolution(const RESOLUTION_INFO& res, bool nee m_graphicsContext.SetRenderingResolution(res, needsScaling); } -UTILS::Color CRenderContext::MergeAlpha(UTILS::Color color) +::UTILS::Color CRenderContext::MergeAlpha(::UTILS::Color color) { return m_graphicsContext.MergeAlpha(color); } diff --git a/xbmc/cores/RetroPlayer/rendering/RenderContext.h b/xbmc/cores/RetroPlayer/rendering/RenderContext.h index 74cba02a1c..813bee6702 100644 --- a/xbmc/cores/RetroPlayer/rendering/RenderContext.h +++ b/xbmc/cores/RetroPlayer/rendering/RenderContext.h @@ -65,6 +65,8 @@ public: // Windowing functions bool UseLimitedColor(); + bool DisplayHardwareScalingEnabled(); + void UpdateDisplayHardwareScaling(const RESOLUTION_INFO& resInfo); // Graphics functions int GetScreenWidth(); @@ -76,7 +78,7 @@ public: bool IsFullScreenVideo(); bool IsCalibrating(); RESOLUTION GetVideoResolution(); - void Clear(UTILS::Color color = 0); + void Clear(::UTILS::Color color = 0); RESOLUTION_INFO GetResInfo(); void SetRenderingResolution(const RESOLUTION_INFO& res, bool needsScaling); UTILS::Color MergeAlpha(UTILS::Color color); diff --git a/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPBaseRenderer.cpp b/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPBaseRenderer.cpp index 02b4ea3962..3fa2c38124 100644 --- a/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPBaseRenderer.cpp +++ b/xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPBaseRenderer.cpp @@ -130,6 +130,7 @@ void CRPBaseRenderer::ManageRenderArea(const IRenderBuffer& renderBuffer) const float sourceAspectRatio = static_cast<float>(sourceWidth) / static_cast<float>(sourceHeight); + const SCALINGMETHOD scaleMode = m_renderSettings.VideoSettings().GetScalingMethod(); const STRETCHMODE stretchMode = m_renderSettings.VideoSettings().GetRenderStretchMode(); const unsigned int rotationDegCCW = (sourceRotationDegCCW + m_renderSettings.VideoSettings().GetRenderRotation()) % 360; @@ -138,7 +139,18 @@ void CRPBaseRenderer::ManageRenderArea(const IRenderBuffer& renderBuffer) float screenWidth; float screenHeight; float screenPixelRatio; - GetScreenDimensions(screenWidth, screenHeight, screenPixelRatio); + + if (scaleMode == SCALINGMETHOD::NEAREST && stretchMode == STRETCHMODE::Original && + m_context.DisplayHardwareScalingEnabled()) + { + screenWidth = sourceWidth; + screenHeight = sourceHeight; + screenPixelRatio = 1.0; + } + else + { + GetScreenDimensions(screenWidth, screenHeight, screenPixelRatio); + } // Entire target rendering area for the video (including black bars) const CRect viewRect = m_context.GetViewWindow(); |