Hash :
3b650ffa
Author :
Date :
2024-03-19T09:53:06
Metal: Assert while using gl_VertexID as ivec Metal [vertex_id] is uint while gl_VertexID is int. Replacing gl_VertexID with gl_VertexIDMetal without rewrites of the expressions would cause invalid expressions. Fix by casting uint kgl_VertexIDMetal to int kgl_VertexID instead of replacing variable during compile. Bug: angleproject:8597 Change-Id: I76acdb2a0ab5982aa05181175925b3359068e901 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5376498 Reviewed-by: Alexey Knyazev <lexa.knyazev@gmail.com> Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Commit-Queue: Kenneth Russell <kbr@chromium.org> Reviewed-by: Kenneth Russell <kbr@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 90 91 92 93 94 95 96 97 98
//
// 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/tree_ops/msl/IntroduceVertexIndexID.h"
#include "compiler/translator/IntermRebuild.h"
#include "compiler/translator/StaticType.h"
#include "compiler/translator/msl/AstHelpers.h"
#include "compiler/translator/tree_util/BuiltIn.h"
using namespace sh;
////////////////////////////////////////////////////////////////////////////////
namespace
{
constexpr const TVariable kgl_VertexIDMetal(BuiltInId::gl_VertexID,
ImmutableString("vertexIDMetal"),
SymbolType::AngleInternal,
TExtension::UNDEFINED,
StaticType::Get<EbtUInt, EbpHigh, EvqVertexID, 1, 1>());
constexpr const TVariable kgl_instanceIdMetal(
BuiltInId::gl_InstanceID,
ImmutableString("instanceIdMod"),
SymbolType::AngleInternal,
TExtension::UNDEFINED,
StaticType::Get<EbtUInt, EbpHigh, EvqInstanceID, 1, 1>());
constexpr const TVariable kgl_baseInstanceMetal(
BuiltInId::gl_BaseInstance,
ImmutableString("baseInstance"),
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)
{
// Ensure these variables are present because they are required for XFB emulation.
mVariablesToIntroduce.push_back(&kgl_instanceIdMetal);
mVariablesToIntroduce.push_back(&kgl_baseInstanceMetal);
}
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;
}