Move Shader UID mismatch checking to VideoCommon.
This commit is contained in:
parent
ec5f596b31
commit
ec08914905
|
@ -1207,6 +1207,13 @@ static void WriteFog(T& out, pixel_shader_uid_data& uid_data)
|
||||||
void GetPixelShaderUid(PixelShaderUid& object, DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType, u32 components)
|
void GetPixelShaderUid(PixelShaderUid& object, DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType, u32 components)
|
||||||
{
|
{
|
||||||
GeneratePixelShader<PixelShaderUid>(object, dstAlphaMode, ApiType, components);
|
GeneratePixelShader<PixelShaderUid>(object, dstAlphaMode, ApiType, components);
|
||||||
|
|
||||||
|
if (g_ActiveConfig.bEnableShaderDebugging)
|
||||||
|
{
|
||||||
|
PixelShaderCode code;
|
||||||
|
GeneratePixelShaderCode(code, dstAlphaMode, API_OPENGL, components);
|
||||||
|
CheckForUidMismatch<PixelShaderUid,PixelShaderCode>(code, object);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GeneratePixelShaderCode(PixelShaderCode& object, DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType, u32 components)
|
void GeneratePixelShaderCode(PixelShaderCode& object, DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType, u32 components)
|
||||||
|
|
|
@ -226,7 +226,6 @@ typedef ShaderUid<pixel_shader_uid_data> PixelShaderUid;
|
||||||
typedef ShaderCode PixelShaderCode; // TODO: Obsolete
|
typedef ShaderCode PixelShaderCode; // TODO: Obsolete
|
||||||
typedef ShaderConstantProfile PixelShaderConstantProfile; // TODO: Obsolete
|
typedef ShaderConstantProfile PixelShaderConstantProfile; // TODO: Obsolete
|
||||||
|
|
||||||
|
|
||||||
void GeneratePixelShaderCode(PixelShaderCode& object, DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType, u32 components);
|
void GeneratePixelShaderCode(PixelShaderCode& object, DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType, u32 components);
|
||||||
void GetPixelShaderUid(PixelShaderUid& object, DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType, u32 components);
|
void GetPixelShaderUid(PixelShaderUid& object, DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType, u32 components);
|
||||||
void GetPixelShaderConstantProfile(PixelShaderConstantProfile& object, DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType, u32 components);
|
void GetPixelShaderConstantProfile(PixelShaderConstantProfile& object, DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType, u32 components);
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <typeinfo>
|
||||||
|
|
||||||
#include "CommonTypes.h"
|
#include "CommonTypes.h"
|
||||||
#include "VideoCommon.h"
|
#include "VideoCommon.h"
|
||||||
|
@ -166,4 +168,49 @@ struct LightingUidData
|
||||||
} lit_chans[4];
|
} lit_chans[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct pixel_shader_uid_data;
|
||||||
|
struct vertex_shader_uid_data;
|
||||||
|
|
||||||
|
typedef ShaderUid<pixel_shader_uid_data> PixelShaderUid;
|
||||||
|
typedef ShaderUid<vertex_shader_uid_data> VertexShaderUid;
|
||||||
|
|
||||||
|
template<class UidT, class CodeT>
|
||||||
|
void CheckForUidMismatch(CodeT& new_code, const UidT& new_uid)
|
||||||
|
{
|
||||||
|
static std::map<UidT,std::string> s_shaders;
|
||||||
|
static std::vector<UidT> s_uids;
|
||||||
|
|
||||||
|
bool uid_is_indexed = std::find(s_uids.begin(), s_uids.end(), new_uid) != s_uids.end();
|
||||||
|
if (!uid_is_indexed)
|
||||||
|
{
|
||||||
|
s_uids.push_back(new_uid);
|
||||||
|
s_shaders[new_uid] = new_code.GetBuffer();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// uid is already in the index => check if there's a shader with the same uid but different code
|
||||||
|
auto& old_code = s_shaders[new_uid];
|
||||||
|
if (strcmp(old_code.c_str(), new_code.GetBuffer()) != 0)
|
||||||
|
{
|
||||||
|
static int num_failures = 0;
|
||||||
|
|
||||||
|
char szTemp[MAX_PATH];
|
||||||
|
sprintf(szTemp, "%s%ssuid_mismatch_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(),
|
||||||
|
(typeid(UidT) == typeid(PixelShaderUid)) ? "p" : (typeid(UidT) == typeid(VertexShaderUid)) ? "v" : "o",
|
||||||
|
++num_failures);
|
||||||
|
|
||||||
|
// TODO: Should also dump uids
|
||||||
|
std::ofstream file;
|
||||||
|
OpenFStream(file, szTemp, std::ios_base::out);
|
||||||
|
file << "Old shader code:\n" << old_code;
|
||||||
|
file << "\n\nNew shader code:\n" << new_code.GetBuffer();
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
// TODO: Make this more idiot-proof
|
||||||
|
ERROR_LOG(VIDEO, "%s shader uid mismatch!",
|
||||||
|
(typeid(UidT) == typeid(PixelShaderUid)) ? "Pixel" : (typeid(UidT) == typeid(VertexShaderUid)) ? "Vertex" : "Other");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif // _SHADERGENCOMMON_H
|
#endif // _SHADERGENCOMMON_H
|
||||||
|
|
|
@ -524,6 +524,13 @@ static void GenerateVertexShader(T& out, u32 components, API_TYPE api_type)
|
||||||
void GetVertexShaderUid(VertexShaderUid& object, u32 components, API_TYPE api_type)
|
void GetVertexShaderUid(VertexShaderUid& object, u32 components, API_TYPE api_type)
|
||||||
{
|
{
|
||||||
GenerateVertexShader<VertexShaderUid>(object, components, api_type);
|
GenerateVertexShader<VertexShaderUid>(object, components, api_type);
|
||||||
|
|
||||||
|
if (g_ActiveConfig.bEnableShaderDebugging)
|
||||||
|
{
|
||||||
|
VertexShaderCode code;
|
||||||
|
GenerateVertexShaderCode(code, components, API_OPENGL);
|
||||||
|
CheckForUidMismatch<VertexShaderUid,VertexShaderCode>(code, object);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GenerateVertexShaderCode(VertexShaderCode& object, u32 components, API_TYPE api_type)
|
void GenerateVertexShaderCode(VertexShaderCode& object, u32 components, API_TYPE api_type)
|
||||||
|
|
|
@ -23,9 +23,6 @@
|
||||||
#include "ImageWrite.h"
|
#include "ImageWrite.h"
|
||||||
#include "Render.h"
|
#include "Render.h"
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <typeinfo>
|
|
||||||
|
|
||||||
namespace OGL
|
namespace OGL
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -356,73 +353,12 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code )
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class UidT> UidT GetPartialUid(const SHADERUID& uid);
|
|
||||||
template<> PixelShaderUid GetPartialUid(const SHADERUID& uid) { return uid.puid; }
|
|
||||||
template<> VertexShaderUid GetPartialUid(const SHADERUID& uid) { return uid.vuid; }
|
|
||||||
|
|
||||||
template<class UidT> const std::string& GetShaderCode(const SHADER& shader);
|
|
||||||
template<> const std::string& GetShaderCode<PixelShaderUid>(const SHADER& shader) { return shader.strpprog; }
|
|
||||||
template<> const std::string& GetShaderCode<VertexShaderUid>(const SHADER& shader) { return shader.strvprog; }
|
|
||||||
|
|
||||||
template<class UidT, class CodeT>
|
|
||||||
void CheckForUidMismatch(const ProgramShaderCache::PCache& cache, CodeT& new_code, const UidT& new_uid)
|
|
||||||
{
|
|
||||||
static std::map<UidT,std::string> s_shaders;
|
|
||||||
static std::vector<UidT> s_uids;
|
|
||||||
|
|
||||||
bool uid_is_indexed = std::find(s_uids.begin(), s_uids.end(), new_uid) != s_uids.end();
|
|
||||||
if (!uid_is_indexed)
|
|
||||||
{
|
|
||||||
s_uids.push_back(new_uid);
|
|
||||||
s_shaders[new_uid] = new_code.GetBuffer();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// uid is already in the index => check if there's a shader with the same uid but different code
|
|
||||||
auto& old_code = s_shaders[new_uid];
|
|
||||||
if (strcmp(old_code.c_str(), new_code.GetBuffer()) != 0)
|
|
||||||
{
|
|
||||||
static int num_failures = 0;
|
|
||||||
|
|
||||||
char szTemp[MAX_PATH];
|
|
||||||
sprintf(szTemp, "%s%ssuid_mismatch_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(),
|
|
||||||
(typeid(UidT) == typeid(PixelShaderUid)) ? "p" : (typeid(UidT) == typeid(VertexShaderUid)) ? "v" : "o",
|
|
||||||
++num_failures);
|
|
||||||
|
|
||||||
// TODO: Should also dump uids
|
|
||||||
std::ofstream file;
|
|
||||||
OpenFStream(file, szTemp, std::ios_base::out);
|
|
||||||
file << "Old shader code:\n" << old_code;
|
|
||||||
file << "\n\nNew shader code:\n" << new_code.GetBuffer();
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
// TODO: Make this more idiot-proof
|
|
||||||
ERROR_LOG(VIDEO, "%s shader uid mismatch!",
|
|
||||||
(typeid(UidT) == typeid(PixelShaderUid)) ? "Pixel" : (typeid(UidT) == typeid(VertexShaderUid)) ? "Vertex" : "Other");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ProgramShaderCache::GetShaderId(SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, u32 components)
|
void ProgramShaderCache::GetShaderId(SHADERUID* uid, DSTALPHA_MODE dstAlphaMode, u32 components)
|
||||||
{
|
{
|
||||||
GetPixelShaderUid(uid->puid, dstAlphaMode, API_OPENGL, components);
|
GetPixelShaderUid(uid->puid, dstAlphaMode, API_OPENGL, components);
|
||||||
GetVertexShaderUid(uid->vuid, components, API_OPENGL);
|
GetVertexShaderUid(uid->vuid, components, API_OPENGL);
|
||||||
|
|
||||||
if (g_ActiveConfig.bEnableShaderDebugging)
|
|
||||||
{
|
|
||||||
PixelShaderCode pcode;
|
|
||||||
VertexShaderCode vcode;
|
|
||||||
|
|
||||||
GeneratePixelShaderCode(pcode, dstAlphaMode, API_OPENGL, components);
|
|
||||||
GenerateVertexShaderCode(vcode, components, API_OPENGL);
|
|
||||||
|
|
||||||
CheckForUidMismatch<PixelShaderUid,PixelShaderCode>(pshaders, pcode, uid->puid);
|
|
||||||
CheckForUidMismatch<VertexShaderUid,VertexShaderCode>(pshaders, vcode, uid->vuid);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ProgramShaderCache::PCacheEntry ProgramShaderCache::GetShaderProgram(void)
|
ProgramShaderCache::PCacheEntry ProgramShaderCache::GetShaderProgram(void)
|
||||||
{
|
{
|
||||||
return *last_entry;
|
return *last_entry;
|
||||||
|
|
Loading…
Reference in New Issue