diff options
author | theuni <theuni-nospam-@xbmc.org> | 2011-10-06 12:14:32 -0400 |
---|---|---|
committer | theuni <theuni-nospam-@xbmc.org> | 2011-10-23 22:34:07 -0400 |
commit | 0e8168e5bd5f48d10aeacbba9e7a7c01bbb1c898 (patch) | |
tree | 5fb8f7b84efdb759fadcb1d7888228cb4e1c39b2 | |
parent | a3304cf5bf162d4a4e1700eafab5c55c8464bf59 (diff) |
d-r: add new rendering mode
added: DIRTYREGION_SOLVER_FILL_VIEWPORT_ON_CHANGE
This solver (mode 3) always marks the entire screen as dirty. The difference
between this and mode 0 is that it stops rendering when there are no dirty
regions left.
This should be a safe default as it does not require preserved backbuffers,
though to be safe we will need to stop flipping when we haven't rendered.
-rw-r--r-- | xbmc/guilib/DirtyRegionSolvers.cpp | 6 | ||||
-rw-r--r-- | xbmc/guilib/DirtyRegionSolvers.h | 6 | ||||
-rw-r--r-- | xbmc/guilib/DirtyRegionTracker.cpp | 10 | ||||
-rw-r--r-- | xbmc/guilib/GUIWindowManager.cpp | 8 | ||||
-rw-r--r-- | xbmc/guilib/IDirtyRegionSolver.h | 1 |
5 files changed, 28 insertions, 3 deletions
diff --git a/xbmc/guilib/DirtyRegionSolvers.cpp b/xbmc/guilib/DirtyRegionSolvers.cpp index 6c885bb5c8..ffaa13f941 100644 --- a/xbmc/guilib/DirtyRegionSolvers.cpp +++ b/xbmc/guilib/DirtyRegionSolvers.cpp @@ -39,6 +39,12 @@ void CFillViewportAlwaysRegionSolver::Solve(const CDirtyRegionList &input, CDirt output.push_back(unifiedRegion); } +void CFillViewportOnChangeRegionSolver::Solve(const CDirtyRegionList &input, CDirtyRegionList &output) +{ + if (input.size() > 0) + output.assign(1,g_graphicsContext.GetViewWindow()); +} + CGreedyDirtyRegionSolver::CGreedyDirtyRegionSolver() { m_costNewRegion = 10.0f; diff --git a/xbmc/guilib/DirtyRegionSolvers.h b/xbmc/guilib/DirtyRegionSolvers.h index 026faab591..9324c48f91 100644 --- a/xbmc/guilib/DirtyRegionSolvers.h +++ b/xbmc/guilib/DirtyRegionSolvers.h @@ -34,6 +34,12 @@ public: virtual void Solve(const CDirtyRegionList &input, CDirtyRegionList &output); }; +class CFillViewportOnChangeRegionSolver : public IDirtyRegionSolver +{ +public: + virtual void Solve(const CDirtyRegionList &input, CDirtyRegionList &output); +}; + class CGreedyDirtyRegionSolver : public IDirtyRegionSolver { public: diff --git a/xbmc/guilib/DirtyRegionTracker.cpp b/xbmc/guilib/DirtyRegionTracker.cpp index 12f0b38886..8ef6191e13 100644 --- a/xbmc/guilib/DirtyRegionTracker.cpp +++ b/xbmc/guilib/DirtyRegionTracker.cpp @@ -41,14 +41,18 @@ void CDirtyRegionTracker::SelectAlgorithm() switch (g_advancedSettings.m_guiAlgorithmDirtyRegions) { - case DIRTYREGION_SOLVER_UNION: - m_solver = new CUnionDirtyRegionSolver(); - CLog::Log(LOGDEBUG, "guilib: Union as algorithm for solving rendering passes"); + case DIRTYREGION_SOLVER_FILL_VIEWPORT_ON_CHANGE: + CLog::Log(LOGDEBUG, "guilib: Fill viewport on change for solving rendering passes"); + m_solver = new CFillViewportOnChangeRegionSolver(); break; case DIRTYREGION_SOLVER_COST_REDUCTION: CLog::Log(LOGDEBUG, "guilib: Cost reduction as algorithm for solving rendering passes"); m_solver = new CGreedyDirtyRegionSolver(); break; + case DIRTYREGION_SOLVER_UNION: + m_solver = new CUnionDirtyRegionSolver(); + CLog::Log(LOGDEBUG, "guilib: Union as algorithm for solving rendering passes"); + break; case DIRTYREGION_SOLVER_FILL_VIEWPORT_ALWAYS: default: CLog::Log(LOGDEBUG, "guilib: Fill viewport always for solving rendering passes"); diff --git a/xbmc/guilib/GUIWindowManager.cpp b/xbmc/guilib/GUIWindowManager.cpp index f2cec3ca3a..477449aa3e 100644 --- a/xbmc/guilib/GUIWindowManager.cpp +++ b/xbmc/guilib/GUIWindowManager.cpp @@ -554,6 +554,14 @@ bool CGUIWindowManager::Render() RenderPass(); hasRendered = true; } + else if (g_advancedSettings.m_guiAlgorithmDirtyRegions == DIRTYREGION_SOLVER_FILL_VIEWPORT_ON_CHANGE) + { + if (dirtyRegions.size() > 0) + { + RenderPass(); + hasRendered = true; + } + } else { for (CDirtyRegionList::const_iterator i = dirtyRegions.begin(); i != dirtyRegions.end(); i++) diff --git a/xbmc/guilib/IDirtyRegionSolver.h b/xbmc/guilib/IDirtyRegionSolver.h index ec70fff3a1..e7d733f4a7 100644 --- a/xbmc/guilib/IDirtyRegionSolver.h +++ b/xbmc/guilib/IDirtyRegionSolver.h @@ -25,6 +25,7 @@ #define DIRTYREGION_SOLVER_FILL_VIEWPORT_ALWAYS 0 #define DIRTYREGION_SOLVER_UNION 1 #define DIRTYREGION_SOLVER_COST_REDUCTION 2 +#define DIRTYREGION_SOLVER_FILL_VIEWPORT_ON_CHANGE 3 class IDirtyRegionSolver { |