// 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, API_OPENGL, uid); 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; }