summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/GeometryShaderManager.cpp
diff options
context:
space:
mode:
authorJules Blok <jules.blok@gmail.com>2014-12-14 21:23:13 +0100
committerJules Blok <jules.blok@gmail.com>2014-12-14 21:23:13 +0100
commitb406e4e1f2c696ba5f6bec04ea2e6a8cc03a02d1 (patch)
tree5d047b49b3b35e4f2f4abe05a69992f630bc7870 /Source/Core/VideoCommon/GeometryShaderManager.cpp
parent21ac9aa715d7bfc24e52474c2511892ed4ad6ac8 (diff)
VideoCommon: Add a separate constants buffer for the geometry shader.
Diffstat (limited to 'Source/Core/VideoCommon/GeometryShaderManager.cpp')
-rw-r--r--Source/Core/VideoCommon/GeometryShaderManager.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/GeometryShaderManager.cpp b/Source/Core/VideoCommon/GeometryShaderManager.cpp
new file mode 100644
index 0000000000..f754961cbc
--- /dev/null
+++ b/Source/Core/VideoCommon/GeometryShaderManager.cpp
@@ -0,0 +1,82 @@
+// Copyright 2013 Dolphin Emulator Project
+// Licensed under GPLv2
+// Refer to the license.txt file included.
+
+#include <cfloat>
+#include <cmath>
+
+#include "VideoCommon/GeometryShaderGen.h"
+#include "VideoCommon/GeometryShaderManager.h"
+#include "VideoCommon/VideoCommon.h"
+#include "VideoCommon/VideoConfig.h"
+#include "VideoCommon/XFMemory.h"
+
+// track changes
+static bool s_projection_changed, s_viewport_changed;
+
+GeometryShaderConstants GeometryShaderManager::constants;
+bool GeometryShaderManager::dirty;
+
+void GeometryShaderManager::Init()
+{
+ memset(&constants, 0, sizeof(constants));
+
+ Dirty();
+}
+
+void GeometryShaderManager::Shutdown()
+{
+}
+
+void GeometryShaderManager::Dirty()
+{
+ s_projection_changed = true;
+ s_viewport_changed = true;
+
+ dirty = true;
+}
+
+// Syncs the shader constant buffers with xfmem
+void GeometryShaderManager::SetConstants()
+{
+ if (s_projection_changed)
+ {
+ s_projection_changed = false;
+
+ if (g_ActiveConfig.iStereoMode > 0 && xfmem.projection.type == GX_PERSPECTIVE)
+ {
+ float offset = (g_ActiveConfig.iStereoSeparation / 1000.0f) * (g_ActiveConfig.iStereoSeparationPercent / 100.0f);
+ constants.stereoparams[0] = (g_ActiveConfig.bStereoSwapEyes) ? offset : -offset;
+ constants.stereoparams[1] = (g_ActiveConfig.bStereoSwapEyes) ? -offset : offset;
+ constants.stereoparams[2] = (g_ActiveConfig.iStereoConvergence / 10.0f) * (g_ActiveConfig.iStereoConvergencePercent / 100.0f);
+ }
+ else
+ {
+ constants.stereoparams[0] = constants.stereoparams[1] = 0;
+ }
+ }
+
+ dirty = true;
+}
+
+void GeometryShaderManager::SetViewportChanged()
+{
+ s_viewport_changed = true;
+}
+
+void GeometryShaderManager::SetProjectionChanged()
+{
+ s_projection_changed = true;
+}
+
+void GeometryShaderManager::DoState(PointerWrap &p)
+{
+ p.Do(dirty);
+
+ if (p.GetMode() == PointerWrap::MODE_READ)
+ {
+ // Reload current state from global GPU state
+ // NOTE: This requires that all GPU memory has been loaded already.
+ Dirty();
+ }
+}