diff --git a/GPU/GLES/ShaderManager.cpp b/GPU/GLES/ShaderManager.cpp index 87c104e8a1..51ca2085a2 100644 --- a/GPU/GLES/ShaderManager.cpp +++ b/GPU/GLES/ShaderManager.cpp @@ -15,15 +15,14 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. -#ifdef _WIN32 -#define SHADERLOG -#endif +// #define SHADERLOG -#ifdef SHADERLOG +#if defined(_WIN32) && defined(SHADERLOG) #include "Common/CommonWindows.h" #endif #include +#include #include "base/logging.h" #include "math/math_util.h" @@ -42,11 +41,16 @@ #include "Framebuffer.h" #include "i18n/i18n.h" -Shader::Shader(const char *code, uint32_t shaderType, bool useHWTransform, const ShaderID &shaderID) : failed_(false), useHWTransform_(useHWTransform), id_(shaderID) { +Shader::Shader(const char *code, uint32_t shaderType, bool useHWTransform, const ShaderID &shaderID) + : id_(shaderID), failed_(false), useHWTransform_(useHWTransform) { PROFILE_THIS_SCOPE("shadercomp"); source_ = code; #ifdef SHADERLOG +#ifdef _WIN32 OutputDebugStringUTF8(code); +#else + printf("%s\n", code); +#endif #endif shader = glCreateShader(shaderType); glShaderSource(shader, 1, &code, 0); @@ -702,8 +706,11 @@ void LinkedShader::UpdateUniforms(u32 vertType) { } } -ShaderManager::ShaderManager() : lastShader_(NULL), globalDirty_(0xFFFFFFFF), shaderSwitchDirty_(0) { +ShaderManager::ShaderManager() + : lastShader_(nullptr), globalDirty_(0xFFFFFFFF), shaderSwitchDirty_(0) { codeBuffer_ = new char[16384]; + lastFSID_.set_invalid(); + lastVSID_.set_invalid(); } ShaderManager::~ShaderManager() { @@ -725,8 +732,8 @@ void ShaderManager::Clear() { fsCache_.clear(); vsCache_.clear(); globalDirty_ = 0xFFFFFFFF; - lastFSID_.clear(); - lastVSID_.clear(); + lastFSID_.set_invalid(); + lastVSID_.set_invalid(); DirtyShader(); } @@ -736,8 +743,8 @@ void ShaderManager::ClearCache(bool deleteThem) { void ShaderManager::DirtyShader() { // Forget the last shader ID - lastFSID_.clear(); - lastVSID_.clear(); + lastFSID_.set_invalid(); + lastVSID_.set_invalid(); DirtyLastShader(); globalDirty_ = 0xFFFFFFFF; shaderSwitchDirty_ = 0; @@ -746,24 +753,16 @@ void ShaderManager::DirtyShader() { void ShaderManager::DirtyLastShader() { // disables vertex arrays if (lastShader_) lastShader_->stop(); - lastShader_ = 0; + lastShader_ = nullptr; lastVShaderSame_ = false; } // This is to be used when debugging why incompatible shaders are being linked, like is // happening as I write this in Tactics Ogre bool ShaderManager::DebugAreShadersCompatibleForLinking(Shader *vs, Shader *fs) { - // Check clear mode flag just for starters. - ShaderID vsid = vs->ID(); - ShaderID fsid = fs->ID(); - - // TODO: Make the flag fields more similar? - // Check DoTexture - if (((vsid.d[0] >> 4) & 1) != ((fsid.d[0] >> 1) & 1)) { - ERROR_LOG(G3D, "Texture enable flag mismatch!"); - return false; - } - + // ShaderID vsid = vs->ID(); + // ShaderID fsid = fs->ID(); + // TODO: Redo these checks. return true; } @@ -848,7 +847,7 @@ LinkedShader *ShaderManager::ApplyFragmentShader(Shader *vs, int prim, u32 vertT } // Okay, we have both shaders. Let's see if there's a linked one. - LinkedShader *ls = NULL; + LinkedShader *ls = nullptr; u32 switchDirty = shaderSwitchDirty_; for (auto iter = linkedShaderCache_.begin(); iter != linkedShaderCache_.end(); ++iter) { @@ -861,11 +860,11 @@ LinkedShader *ShaderManager::ApplyFragmentShader(Shader *vs, int prim, u32 vertT } shaderSwitchDirty_ = 0; - if (ls == NULL) { + if (ls == nullptr) { // Check if we can link these. #ifdef _DEBUG if (!DebugAreShadersCompatibleForLinking(vs, fs)) { - return NULL; + return nullptr; } #endif ls = new LinkedShader(vs, fs, vertType, vs->UseHWTransform(), lastShader_); // This does "use" automatically diff --git a/GPU/GLES/ShaderManager.h b/GPU/GLES/ShaderManager.h index 6f56221c2a..76845cbe84 100644 --- a/GPU/GLES/ShaderManager.h +++ b/GPU/GLES/ShaderManager.h @@ -34,6 +34,11 @@ struct ShaderID { d[i] = 0; } } + void set_invalid() { + for (int i = 0; i < ARRAY_SIZE(d); i++) { + d[i] = 0xFFFFFFFF; + } + } u32 d[2]; bool operator < (const ShaderID &other) const {