diff options
| author | Jules Blok <jules.blok@gmail.com> | 2014-12-14 21:23:13 +0100 |
|---|---|---|
| committer | Jules Blok <jules.blok@gmail.com> | 2014-12-14 21:23:13 +0100 |
| commit | b406e4e1f2c696ba5f6bec04ea2e6a8cc03a02d1 (patch) | |
| tree | 5d047b49b3b35e4f2f4abe05a69992f630bc7870 /Source/Core/VideoCommon/GeometryShaderManager.cpp | |
| parent | 21ac9aa715d7bfc24e52474c2511892ed4ad6ac8 (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.cpp | 82 |
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(); + } +} |
