Notification phase for io remapper
Adds a notification phase to the io remapper. The idea behind this is to give the user a chance to group uniforms and/or in/out variables for a better pipeline layout sharing for vulkan. Change-Id: I7492421085a4156ed3534f01d906ab390d73a623
This commit is contained in:
parent
7cca140956
commit
f1bfeec73d
2 changed files with 53 additions and 0 deletions
|
|
@ -201,6 +201,36 @@ public:
|
|||
const TVarLiveMap& uniformList;
|
||||
};
|
||||
|
||||
struct TNotifyUniformAdaptor
|
||||
{
|
||||
EShLanguage stage;
|
||||
TIoMapResolver& resolver;
|
||||
inline TNotifyUniformAdaptor(EShLanguage s, TIoMapResolver& r)
|
||||
: stage(s)
|
||||
, resolver(r)
|
||||
{
|
||||
}
|
||||
inline void operator()(TVarEntryInfo& ent)
|
||||
{
|
||||
resolver.notifyBinding(stage, ent.symbol->getName().c_str(), ent.symbol->getType(), ent.live);
|
||||
}
|
||||
};
|
||||
|
||||
struct TNotifyInOutAdaptor
|
||||
{
|
||||
EShLanguage stage;
|
||||
TIoMapResolver& resolver;
|
||||
inline TNotifyInOutAdaptor(EShLanguage s, TIoMapResolver& r)
|
||||
: stage(s)
|
||||
, resolver(r)
|
||||
{
|
||||
}
|
||||
inline void operator()(TVarEntryInfo& ent)
|
||||
{
|
||||
resolver.notifyInOut(stage, ent.symbol->getName().c_str(), ent.symbol->getType(), ent.live);
|
||||
}
|
||||
};
|
||||
|
||||
struct TResolverUniformAdaptor
|
||||
{
|
||||
TResolverUniformAdaptor(EShLanguage s, TIoMapResolver& r, TInfoSink& i, bool& e, TIntermediate& interm)
|
||||
|
|
@ -383,6 +413,10 @@ struct TDefaultIoResolverBase : public glslang::TIoMapResolver
|
|||
return -1;
|
||||
}
|
||||
|
||||
void notifyBinding(EShLanguage stage, const char* name, const TType& type, bool is_live) override {}
|
||||
void notifyInOut(EShLanguage stage, const char* name, const TType& type, bool is_live) override {}
|
||||
void endNotifications() override {}
|
||||
|
||||
protected:
|
||||
static int getLayoutSet(const glslang::TType& type) {
|
||||
if (type.getQualifier().hasSet())
|
||||
|
|
@ -674,8 +708,14 @@ bool TIoMapper::addStage(EShLanguage stage, TIntermediate &intermediate, TInfoSi
|
|||
std::sort(uniformVarMap.begin(), uniformVarMap.end(), TVarEntryInfo::TOrderByPriority());
|
||||
|
||||
bool hadError = false;
|
||||
TNotifyInOutAdaptor inOutNotify(stage, *resolver);
|
||||
TNotifyUniformAdaptor uniformNotify(stage, *resolver);
|
||||
TResolverUniformAdaptor uniformResolve(stage, *resolver, infoSink, hadError, intermediate);
|
||||
TResolverInOutAdaptor inOutResolve(stage, *resolver, infoSink, hadError, intermediate);
|
||||
std::for_each(inVarMap.begin(), inVarMap.end(), inOutNotify);
|
||||
std::for_each(outVarMap.begin(), outVarMap.end(), inOutNotify);
|
||||
std::for_each(uniformVarMap.begin(), uniformVarMap.end(), uniformNotify);
|
||||
resolver->endNotifications();
|
||||
std::for_each(inVarMap.begin(), inVarMap.end(), inOutResolve);
|
||||
std::for_each(outVarMap.begin(), outVarMap.end(), inOutResolve);
|
||||
std::for_each(uniformVarMap.begin(), uniformVarMap.end(), uniformResolve);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue