aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortheuni <theuni-nospam-@xbmc.org>2011-10-06 12:14:32 -0400
committertheuni <theuni-nospam-@xbmc.org>2011-10-23 22:34:07 -0400
commit0e8168e5bd5f48d10aeacbba9e7a7c01bbb1c898 (patch)
tree5fb8f7b84efdb759fadcb1d7888228cb4e1c39b2
parenta3304cf5bf162d4a4e1700eafab5c55c8464bf59 (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.cpp6
-rw-r--r--xbmc/guilib/DirtyRegionSolvers.h6
-rw-r--r--xbmc/guilib/DirtyRegionTracker.cpp10
-rw-r--r--xbmc/guilib/GUIWindowManager.cpp8
-rw-r--r--xbmc/guilib/IDirtyRegionSolver.h1
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
{