Hash :
958dce52
Author :
Date :
2021-09-09T14:36:37
Move IntermRebuild.h/cpp to tree_util Bug: angleproject:5505 Change-Id: I7b68057fff0a0eb0d86c1aed01599fa9dbb7db3b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3152167 Commit-Queue: Gregg Tavares <gman@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
//
// Copyright 2020 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#include "compiler/translator/TranslatorMetalDirect/IntroduceVertexIndexID.h"
#include "compiler/translator/StaticType.h"
#include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
#include "compiler/translator/tree_util/BuiltIn.h"
#include "compiler/translator/tree_util/IntermRebuild.h"
using namespace sh;
////////////////////////////////////////////////////////////////////////////////
namespace
{
constexpr const TVariable kgl_VertexIDMetal(BuiltInId::gl_VertexID,
ImmutableString("gl_VertexID"),
SymbolType::BuiltIn,
TExtension::UNDEFINED,
StaticType::Get<EbtUInt, EbpHigh, EvqVertexID, 1, 1>());
constexpr const TVariable kgl_instanceIdMetal(
BuiltInId::gl_VertexID,
ImmutableString("instanceIdMod"),
SymbolType::AngleInternal,
TExtension::UNDEFINED,
StaticType::Get<EbtUInt, EbpHigh, EvqInstanceID, 1, 1>());
class Rewriter : public TIntermRebuild
{
public:
Rewriter(TCompiler &compiler) : TIntermRebuild(compiler, true, true) {}
private:
PreResult visitFunctionDefinitionPre(TIntermFunctionDefinition &node) override
{
if (node.getFunction()->isMain())
{
const TFunction *mainFunction = node.getFunction();
bool needsVertexId = true;
bool needsInstanceId = true;
std::vector<const TVariable *> mVariablesToIntroduce;
for (size_t i = 0; i < mainFunction->getParamCount(); ++i)
{
const TVariable *param = mainFunction->getParam(i);
Name instanceIDName =
Pipeline{Pipeline::Type::InstanceId, nullptr}.getStructInstanceName(
Pipeline::Variant::Modified);
if (Name(*param) == instanceIDName)
{
needsInstanceId = false;
}
else if (param->getType().getQualifier() == TQualifier::EvqVertexID)
{
needsVertexId = false;
}
}
if (needsInstanceId)
{
mVariablesToIntroduce.push_back(&kgl_instanceIdMetal);
}
if (needsVertexId)
{
mVariablesToIntroduce.push_back(&kgl_VertexIDMetal);
}
const TFunction &newFunction = CloneFunctionAndAppendParams(
mSymbolTable, nullptr, *node.getFunction(), mVariablesToIntroduce);
TIntermFunctionPrototype *newProto = new TIntermFunctionPrototype(&newFunction);
return new TIntermFunctionDefinition(newProto, node.getBody());
}
return node;
}
};
} // anonymous namespace
////////////////////////////////////////////////////////////////////////////////
bool sh::IntroduceVertexAndInstanceIndex(TCompiler &compiler, TIntermBlock &root)
{
if (!Rewriter(compiler).rebuildRoot(root))
{
return false;
}
return true;
}