diff options
Diffstat (limited to 'Source/Core/VideoBackends/Null/ShaderCache.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Null/ShaderCache.cpp | 76 |
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; +} |
