aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSameer Lattannavar <sameer.lattannavar@intel.com>2020-10-07 02:25:16 +0000
committerSameer Lattannavar <sameer.lattannavar@intel.com>2020-10-07 02:25:16 +0000
commitc94339f27e16a52ba3b32aeebc5d317b2554af92 (patch)
tree49766c033916549cb4f3190211d7751d1b1fd08b
parent6c83de91fa492e3aba0288de95d4dd8656a9d07b (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>
-rw-r--r--xbmc/cores/RetroPlayer/rendering/RPRenderManager.cpp32
-rw-r--r--xbmc/cores/RetroPlayer/rendering/RPRenderManager.h3
-rw-r--r--xbmc/cores/RetroPlayer/rendering/RenderContext.cpp14
-rw-r--r--xbmc/cores/RetroPlayer/rendering/RenderContext.h4
-rw-r--r--xbmc/cores/RetroPlayer/rendering/VideoRenderers/RPBaseRenderer.cpp14
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();