Edit

kc3-lang/angle/src/compiler/translator/HashNames.cpp

Branch :

  • Show log

    Commit

  • Author : Shahbaz Youssefi
    Date : 2021-07-29 11:19:33
    Hash : ebe943e2
    Message : Vulkan: SPIR-V Gen: Fix gl_Clip/CullDistance These built-ins can be redeclared in the shader. The translator took these redeclarations (and gl_LastFragData) as UserDefined symbols. There were a number of hacks such as in name generation and CollectVariables, to special-case these redeclarations. This change instead makes sure that these variables continue to be considered built-ins with the appropriate qualifiers. A number of fixes are made accordingly: - Hacks are removed. - In fragment shaders, ANGLEClipDistance was initialized with gl_ClipDistance for further use by the shader. The code generation however mistakenly produced `gl_ClipDistance[0] = ANGLEClipDistance[0];`, which caused compilation failures by glslang, but passed the tests accidentally because they expected link failures (see next item). - CollectVariables is fixed to correctly collect gl_Clip/CullDistance in fragment shaders; previously they were collected as output varyings, and therefore the aforementioned link error was not produced in the tests after the compilation error was fixed. Additional fixes: - The transformation of gl_Clip/CullDistance was always ever done on one of them due to misplaced breaks in the loop that detected their presence. - The transformation of gl_CullDistance was skipped when it was not redeclared. Validation is added to make sure these built-ins always have the correct qualifier even when redeclared. SPIR-V gen support for these variables have been fixed as well. Bug: angleproject:4889 Change-Id: Ic8bf2c508357035cb937ef41a28ae22ffc533ebe Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3059921 Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>

  • src/compiler/translator/HashNames.cpp
  • //
    // Copyright 2017 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/HashNames.h"
    
    #include "compiler/translator/ImmutableString.h"
    #include "compiler/translator/ImmutableStringBuilder.h"
    #include "compiler/translator/IntermNode.h"
    #include "compiler/translator/Symbol.h"
    
    namespace sh
    {
    
    namespace
    {
    constexpr const ImmutableString kHashedNamePrefix("webgl_");
    
    ImmutableString HashName(const ImmutableString &name, ShHashFunction64 hashFunction)
    {
        ASSERT(!name.empty());
        ASSERT(hashFunction);
        khronos_uint64_t number = (*hashFunction)(name.data(), name.length());
    
        // Build the hashed name in place.
        static const unsigned int kHexStrMaxLength = sizeof(number) * 2;
        static const size_t kHashedNameMaxLength   = kHashedNamePrefix.length() + kHexStrMaxLength;
    
        ImmutableStringBuilder hashedName(kHashedNameMaxLength);
        hashedName << kHashedNamePrefix;
    
        hashedName.appendHex(number);
    
        return hashedName;
    }
    
    void AddToNameMapIfNotMapped(const ImmutableString &name,
                                 const ImmutableString &hashedName,
                                 NameMap *nameMap)
    {
        if (nameMap)
        {
            NameMap::const_iterator it = nameMap->find(name.data());
            if (it != nameMap->end())
            {
                // (How bout returning?)
                return;
            }
            (*nameMap)[name.data()] = hashedName.data();
        }
    }
    
    }  // anonymous namespace
    
    ImmutableString HashName(const ImmutableString &name,
                             ShHashFunction64 hashFunction,
                             NameMap *nameMap)
    {
        const ImmutableString kUnhashedNamePrefix(kUserDefinedNamePrefix);
    
        if (hashFunction == nullptr)
        {
            if (name.length() + kUnhashedNamePrefix.length() > kESSLMaxIdentifierLength)
            {
                // If the identifier length is already close to the limit, we can't prefix it. This is
                // not a problem since there are no builtins or ANGLE's internal variables that would
                // have as long names and could conflict.
                return name;
            }
            ImmutableStringBuilder prefixedName(kUnhashedNamePrefix.length() + name.length());
            prefixedName << kUnhashedNamePrefix << name;
            ImmutableString res = prefixedName;
            AddToNameMapIfNotMapped(name, res, nameMap);
            return res;
        }
    
        // Has a hash function
        ImmutableString hashedName = HashName(name, hashFunction);
        AddToNameMapIfNotMapped(name, hashedName, nameMap);
        return hashedName;
    }
    
    ImmutableString HashName(const TSymbol *symbol, ShHashFunction64 hashFunction, NameMap *nameMap)
    {
        if (symbol->symbolType() == SymbolType::Empty)
        {
            return kEmptyImmutableString;
        }
        if (symbol->symbolType() == SymbolType::AngleInternal ||
            symbol->symbolType() == SymbolType::BuiltIn)
        {
            return symbol->name();
        }
        return HashName(symbol->name(), hashFunction, nameMap);
    }
    
    }  // namespace sh