summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Null/ShaderCache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoBackends/Null/ShaderCache.cpp')
-rw-r--r--Source/Core/VideoBackends/Null/ShaderCache.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/Source/Core/VideoBackends/Null/ShaderCache.cpp b/Source/Core/VideoBackends/Null/ShaderCache.cpp
new file mode 100644
index 0000000000..e0fa000765
--- /dev/null
+++ b/Source/Core/VideoBackends/Null/ShaderCache.cpp
@@ -0,0 +1,76 @@
+// Copyright 2015 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include "VideoBackends/Null/ShaderCache.h"
+
+#include "VideoCommon/Debugger.h"
+#include "VideoCommon/Statistics.h"
+
+namespace Null
+{
+template <typename Uid>
+ShaderCache<Uid>::ShaderCache()
+{
+ Clear();
+
+ SETSTAT(stats.numPixelShadersCreated, 0);
+ SETSTAT(stats.numPixelShadersAlive, 0);
+}
+
+template <typename Uid>
+ShaderCache<Uid>::~ShaderCache()
+{
+ Clear();
+}
+
+template <typename Uid>
+void ShaderCache<Uid>::Clear()
+{
+ m_shaders.clear();
+ m_last_entry = nullptr;
+}
+
+template <typename Uid>
+bool ShaderCache<Uid>::SetShader(DSTALPHA_MODE dst_alpha_mode, u32 primitive_type)
+{
+ Uid uid = GetUid(dst_alpha_mode, primitive_type, API_OPENGL);
+
+ // Check if the shader is already set
+ if (m_last_entry)
+ {
+ if (uid == m_last_uid)
+ {
+ return true;
+ }
+ }
+
+ m_last_uid = uid;
+
+ // Check if the shader is already in the cache
+ auto iter = m_shaders.find(uid);
+ if (iter != m_shaders.end())
+ {
+ const std::string& entry = iter->second;
+ m_last_entry = &entry;
+
+ GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true);
+ return true;
+ }
+
+ // Need to compile a new shader
+ ShaderCode code = GenerateCode(dst_alpha_mode, primitive_type, API_OPENGL);
+ m_shaders.emplace(uid, code.GetBuffer());
+
+ GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true);
+ return true;
+}
+
+template class ShaderCache<VertexShaderUid>;
+template class ShaderCache<GeometryShaderUid>;
+template class ShaderCache<PixelShaderUid>;
+
+std::unique_ptr<VertexShaderCache> VertexShaderCache::s_instance;
+std::unique_ptr<GeometryShaderCache> GeometryShaderCache::s_instance;
+std::unique_ptr<PixelShaderCache> PixelShaderCache::s_instance;
+}