Shaders: report all shader file paths
When reporting a shader log error, include all the shader file paths and the effect path in the detailed error information.
This commit is contained in:
committed by
Automatic Release Builder
parent
2ef8c0d27b
commit
5d4201cdfa
@@ -227,8 +227,9 @@ Effect::Effect()
|
|||||||
}
|
}
|
||||||
|
|
||||||
Effect::Effect(const Effect& rhs, const CopyOp& copyop)
|
Effect::Effect(const Effect& rhs, const CopyOp& copyop)
|
||||||
: osg::Object(rhs,copyop), root(rhs.root), parametersProp(rhs.parametersProp), _cache(0),
|
: osg::Object(rhs, copyop), root(rhs.root), parametersProp(rhs.parametersProp), _cache(0),
|
||||||
_isRealized(rhs._isRealized)
|
_isRealized(rhs._isRealized),
|
||||||
|
_effectFilePath(rhs._effectFilePath)
|
||||||
{
|
{
|
||||||
typedef vector<ref_ptr<Technique> > TechniqueList;
|
typedef vector<ref_ptr<Technique> > TechniqueList;
|
||||||
for (TechniqueList::const_iterator itr = rhs.techniques.begin(),
|
for (TechniqueList::const_iterator itr = rhs.techniques.begin(),
|
||||||
@@ -961,7 +962,11 @@ void ShaderProgramBuilder::buildAttribute(Effect* effect, Pass* pass,
|
|||||||
pass->setAttributeAndModes(program);
|
pass->setAttributeAndModes(program);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
program = new SGProgram;
|
|
||||||
|
auto sgprogram = new SGProgram;
|
||||||
|
program = sgprogram;
|
||||||
|
sgprogram->setEffectFilePath(effect->filePath());
|
||||||
|
|
||||||
for (const auto& skey : resolvedKey.shaders) {
|
for (const auto& skey : resolvedKey.shaders) {
|
||||||
const string& fileName = skey.first;
|
const string& fileName = skey.first;
|
||||||
Shader::Type stype = (Shader::Type)skey.second;
|
Shader::Type stype = (Shader::Type)skey.second;
|
||||||
@@ -1654,3 +1659,15 @@ expression::ExpParserRegistrar propvalueRegistrar("float-property",
|
|||||||
propertyExpressionParser<float>);
|
propertyExpressionParser<float>);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
using namespace simgear;
|
||||||
|
|
||||||
|
void Effect::setFilePath(const SGPath& path)
|
||||||
|
{
|
||||||
|
_effectFilePath = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
SGPath Effect::filePath() const
|
||||||
|
{
|
||||||
|
return _effectFilePath;
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,10 +29,11 @@
|
|||||||
#include <osg/observer_ptr>
|
#include <osg/observer_ptr>
|
||||||
#include <osgDB/ReaderWriter>
|
#include <osgDB/ReaderWriter>
|
||||||
|
|
||||||
|
#include <simgear/misc/sg_path.hxx>
|
||||||
#include <simgear/props/props.hxx>
|
#include <simgear/props/props.hxx>
|
||||||
#include <simgear/scene/util/UpdateOnceCallback.hxx>
|
#include <simgear/scene/util/UpdateOnceCallback.hxx>
|
||||||
#include <simgear/threads/SGThread.hxx>
|
|
||||||
#include <simgear/structure/Singleton.hxx>
|
#include <simgear/structure/Singleton.hxx>
|
||||||
|
#include <simgear/threads/SGThread.hxx>
|
||||||
|
|
||||||
namespace osg
|
namespace osg
|
||||||
{
|
{
|
||||||
@@ -106,6 +107,10 @@ public:
|
|||||||
|
|
||||||
std::string getName(){return _name;}
|
std::string getName(){return _name;}
|
||||||
void setName(std::string name){_name = name;}
|
void setName(std::string name){_name = name;}
|
||||||
|
|
||||||
|
void setFilePath(const SGPath& path);
|
||||||
|
SGPath filePath() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
~Effect();
|
~Effect();
|
||||||
// Support for a cache of effects that inherit from this one, so
|
// Support for a cache of effects that inherit from this one, so
|
||||||
@@ -142,10 +147,13 @@ protected:
|
|||||||
Cache* _cache;
|
Cache* _cache;
|
||||||
friend size_t hash_value(const Key& key);
|
friend size_t hash_value(const Key& key);
|
||||||
friend Effect* makeEffect(SGPropertyNode* prop, bool realizeTechniques,
|
friend Effect* makeEffect(SGPropertyNode* prop, bool realizeTechniques,
|
||||||
const SGReaderWriterOptions* options);
|
const SGReaderWriterOptions* options,
|
||||||
|
const SGPath& path);
|
||||||
bool _isRealized;
|
bool _isRealized;
|
||||||
std::string _name;
|
std::string _name;
|
||||||
|
SGPath _effectFilePath;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Automatic support for boost hash function
|
// Automatic support for boost hash function
|
||||||
size_t hash_value(const Effect::Key&);
|
size_t hash_value(const Effect::Key&);
|
||||||
|
|
||||||
@@ -156,7 +164,8 @@ Effect* makeEffect(const std::string& name,
|
|||||||
|
|
||||||
Effect* makeEffect(SGPropertyNode* prop,
|
Effect* makeEffect(SGPropertyNode* prop,
|
||||||
bool realizeTechniques,
|
bool realizeTechniques,
|
||||||
const SGReaderWriterOptions* options);
|
const SGReaderWriterOptions* options,
|
||||||
|
const SGPath& path = SGPath{});
|
||||||
|
|
||||||
bool makeParametersFromStateSet(SGPropertyNode* paramRoot,
|
bool makeParametersFromStateSet(SGPropertyNode* paramRoot,
|
||||||
const osg::StateSet* ss);
|
const osg::StateSet* ss);
|
||||||
|
|||||||
@@ -26,8 +26,9 @@
|
|||||||
#include <osgDB/Registry>
|
#include <osgDB/Registry>
|
||||||
|
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
#include <simgear/scene/util/SGReaderWriterOptions.hxx>
|
#include <simgear/misc/sg_path.hxx>
|
||||||
#include <simgear/props/props_io.hxx>
|
#include <simgear/props/props_io.hxx>
|
||||||
|
#include <simgear/scene/util/SGReaderWriterOptions.hxx>
|
||||||
#include <simgear/scene/util/SGSceneFeatures.hxx>
|
#include <simgear/scene/util/SGSceneFeatures.hxx>
|
||||||
#include <simgear/scene/util/SplicingVisitor.hxx>
|
#include <simgear/scene/util/SplicingVisitor.hxx>
|
||||||
#include <simgear/structure/SGExpression.hxx>
|
#include <simgear/structure/SGExpression.hxx>
|
||||||
@@ -139,7 +140,7 @@ Effect* makeEffect(const string& name,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ref_ptr<Effect> result = makeEffect(effectProps.ptr(), realizeTechniques,
|
ref_ptr<Effect> result = makeEffect(effectProps.ptr(), realizeTechniques,
|
||||||
options);
|
options, SGPath::fromUtf8(absFileName));
|
||||||
if (result.valid()) {
|
if (result.valid()) {
|
||||||
OpenThreads::ScopedLock<OpenThreads::ReentrantMutex> lock(effectMutex);
|
OpenThreads::ScopedLock<OpenThreads::ReentrantMutex> lock(effectMutex);
|
||||||
pair<EffectMap::iterator, bool> irslt
|
pair<EffectMap::iterator, bool> irslt
|
||||||
@@ -156,7 +157,8 @@ Effect* makeEffect(const string& name,
|
|||||||
|
|
||||||
Effect* makeEffect(SGPropertyNode* prop,
|
Effect* makeEffect(SGPropertyNode* prop,
|
||||||
bool realizeTechniques,
|
bool realizeTechniques,
|
||||||
const SGReaderWriterOptions* options)
|
const SGReaderWriterOptions* options,
|
||||||
|
const SGPath& filePath)
|
||||||
{
|
{
|
||||||
// Give default names to techniques and passes
|
// Give default names to techniques and passes
|
||||||
vector<SGPropertyNode_ptr> techniques = prop->getChildren("technique");
|
vector<SGPropertyNode_ptr> techniques = prop->getChildren("technique");
|
||||||
@@ -217,6 +219,7 @@ Effect* makeEffect(SGPropertyNode* prop,
|
|||||||
if (!effect.valid()) {
|
if (!effect.valid()) {
|
||||||
effect = new Effect;
|
effect = new Effect;
|
||||||
effect->setName(nameProp->getStringValue());
|
effect->setName(nameProp->getStringValue());
|
||||||
|
effect->setFilePath(filePath.isNull() ? parent->filePath() : filePath);
|
||||||
effect->root = new SGPropertyNode;
|
effect->root = new SGPropertyNode;
|
||||||
mergePropertyTrees(effect->root, prop, parent->root);
|
mergePropertyTrees(effect->root, prop, parent->root);
|
||||||
effect->parametersProp = effect->root->getChild("parameters");
|
effect->parametersProp = effect->root->getChild("parameters");
|
||||||
@@ -240,6 +243,7 @@ Effect* makeEffect(SGPropertyNode* prop,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
effect = new Effect;
|
effect = new Effect;
|
||||||
|
effect->setFilePath(filePath);
|
||||||
effect->setName(nameProp->getStringValue());
|
effect->setName(nameProp->getStringValue());
|
||||||
effect->root = prop;
|
effect->root = prop;
|
||||||
effect->parametersProp = effect->root->getChild("parameters");
|
effect->parametersProp = effect->root->getChild("parameters");
|
||||||
|
|||||||
@@ -20,13 +20,25 @@
|
|||||||
#include "SGProgram.hxx"
|
#include "SGProgram.hxx"
|
||||||
|
|
||||||
#include <osg/State>
|
#include <osg/State>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
#include <simgear/debug/ErrorReportingCallback.hxx>
|
#include <simgear/debug/ErrorReportingCallback.hxx>
|
||||||
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
|
||||||
SGProgram::SGProgram(const SGProgram& rhs, const osg::CopyOp& copyop) : osg::Program(rhs, copyop)
|
SGProgram::SGProgram()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SGProgram::SGProgram(const SGProgram& rhs, const osg::CopyOp& copyop) : osg::Program(rhs, copyop),
|
||||||
|
_effectFilePath(rhs._effectFilePath)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGProgram::setEffectFilePath(const SGPath& p)
|
||||||
|
{
|
||||||
|
_effectFilePath = p;
|
||||||
|
}
|
||||||
|
|
||||||
void SGProgram::apply(osg::State& state) const
|
void SGProgram::apply(osg::State& state) const
|
||||||
{
|
{
|
||||||
osg::Program::apply(state);
|
osg::Program::apply(state);
|
||||||
@@ -41,8 +53,17 @@ void SGProgram::apply(osg::State& state) const
|
|||||||
_checkState = FailedToApply;
|
_checkState = FailedToApply;
|
||||||
getPCP(state)->getInfoLog(infoLog);
|
getPCP(state)->getInfoLog(infoLog);
|
||||||
|
|
||||||
|
// log all the shader source file names, to help in debugging link errors
|
||||||
|
std::ostringstream os;
|
||||||
|
for (int i = 0; i < getNumShaders(); ++i) {
|
||||||
|
const auto shader = getShader(i);
|
||||||
|
os << "\t" << shader->getFileName() << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
simgear::reportFailure(simgear::LoadFailure::BadData, simgear::ErrorCode::LoadEffectsShaders,
|
simgear::reportFailure(simgear::LoadFailure::BadData, simgear::ErrorCode::LoadEffectsShaders,
|
||||||
"Shader program errors: " + infoLog, sg_location());
|
"Shader program errors: " + infoLog +
|
||||||
|
"\n\nShader sources:\n" + os.str(),
|
||||||
|
_effectFilePath);
|
||||||
|
|
||||||
for (int i = 0; i < getNumShaders(); ++i) {
|
for (int i = 0; i < getNumShaders(); ++i) {
|
||||||
const auto shader = getShader(i);
|
const auto shader = getShader(i);
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
|
|
||||||
#include <osg/Program>
|
#include <osg/Program>
|
||||||
|
|
||||||
|
#include <simgear/misc/sg_path.hxx>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief wrapper around osg::Program to allow detecting shader/link
|
* @brief wrapper around osg::Program to allow detecting shader/link
|
||||||
* errors in the GLSL code at runtime, and reporting of them
|
* errors in the GLSL code at runtime, and reporting of them
|
||||||
@@ -26,7 +28,7 @@
|
|||||||
class SGProgram : public osg::Program
|
class SGProgram : public osg::Program
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SGProgram() = default;
|
SGProgram();
|
||||||
|
|
||||||
SGProgram(const SGProgram& rhs, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
|
SGProgram(const SGProgram& rhs, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
|
||||||
|
|
||||||
@@ -40,6 +42,9 @@ public:
|
|||||||
FailedToApply
|
FailedToApply
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void setEffectFilePath(const SGPath& p);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
SGPath _effectFilePath;
|
||||||
mutable ErrorCheckState _checkState = NotApplied;
|
mutable ErrorCheckState _checkState = NotApplied;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user