Edit

kc3-lang/angle/src/compiler/translator/TranslatorMetalDirect/IdGen.cpp

Branch :

  • Show log

    Commit

  • Author : Kyle Piddington
    Date : 2021-04-26 16:56:15
    Hash : d7aa0130
    Message : Upstream Apple's direct-to-Metal backend: compile translator. This change is meant to merge the translator changes from Apple's direct-to-Metal backend. Taken from Kyle Piddington's CL: https://chromium-review.googlesource.com/c/angle/angle/+/2857366/ The goal of this CL is to merge the translator code in a state that compiles, but not to switch the Metal backend over to use this translator backend yet. Bug: angleproject:5505 Change-Id: I68a6354604498cd5fd1eb96c13fc56f3b38f2bd0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2897536 Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Commit-Queue: Jonah Ryan-Davis <jonahr@google.com>

  • src/compiler/translator/TranslatorMetalDirect/IdGen.cpp
  • //
    // 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 <cctype>
    #include <cstring>
    #include <limits>
    #include <unordered_map>
    #include <unordered_set>
    
    #include "compiler/translator/TranslatorMetalDirect/RewriteKeywords.h"
    
    using namespace sh;
    
    ////////////////////////////////////////////////////////////////////////////////
    
    IdGen::IdGen() {}
    
    template <typename String, typename StringToImmutable>
    Name IdGen::createNewName(size_t count,
                              const String *baseNames,
                              const StringToImmutable &toImmutable)
    {
        const unsigned id = mNext++;
        char idBuffer[std::numeric_limits<unsigned>::digits10 + 1];
        sprintf(idBuffer, "%u", id);
    
        mNewNameBuffer.clear();
        mNewNameBuffer += '_';
        mNewNameBuffer += idBuffer;
    
        // Note:
        // Double underscores are only allowed in C++ (and thus Metal) vendor identifiers, so here we
        // take care not to introduce any.
    
        for (size_t i = 0; i < count; ++i)
        {
            const ImmutableString baseName = toImmutable(baseNames[i]);
            if (!baseName.empty())
            {
                const char *base = baseName.data();
                if (baseName.beginsWith(kAngleInternalPrefix))
                {
                    base += sizeof(kAngleInternalPrefix) - 1;
                }
                if (*base == '_')
                {
                    ++base;
                }
                ASSERT(*base != '_');
    
                if (mNewNameBuffer.back() != '_')
                {
                    mNewNameBuffer += '_';
                }
    
                mNewNameBuffer += base;
            }
        }
    
        return Name(ImmutableString(mNewNameBuffer), SymbolType::AngleInternal);
    }
    
    Name IdGen::createNewName(const ImmutableString &baseName)
    {
        return createNewName({baseName});
    }
    
    Name IdGen::createNewName(const Name &baseName)
    {
        return createNewName(baseName.rawName());
    }
    
    Name IdGen::createNewName(const char *baseName)
    {
        return createNewName(ImmutableString(baseName));
    }
    
    Name IdGen::createNewName(std::initializer_list<ImmutableString> baseNames)
    {
        return createNewName(baseNames.size(), baseNames.begin(),
                             [](const ImmutableString &s) { return s; });
    }
    
    Name IdGen::createNewName(std::initializer_list<Name> baseNames)
    {
        return createNewName(baseNames.size(), baseNames.begin(),
                             [](const Name &s) { return s.rawName(); });
    }
    
    Name IdGen::createNewName(std::initializer_list<const char *> baseNames)
    {
        return createNewName(baseNames.size(), baseNames.begin(),
                             [](const char *s) { return ImmutableString(s); });
    }