gfx/angle/src/compiler/MapLongVariableNames.cpp

Wed, 31 Dec 2014 07:16:47 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:16:47 +0100
branch
TOR_BUG_9701
changeset 3
141e0f1194b1
permissions
-rw-r--r--

Revert simplistic fix pending revisit of Mozilla integration attempt.

     1 //
     2 // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
     3 // Use of this source code is governed by a BSD-style license that can be
     4 // found in the LICENSE file.
     5 //
     7 #include "compiler/MapLongVariableNames.h"
     9 #include "third_party/murmurhash/MurmurHash3.h"
    11 namespace {
    13 TString mapLongName(size_t id, const TString& name, bool isGlobal)
    14 {
    15     ASSERT(name.size() > MAX_SHORTENED_IDENTIFIER_SIZE);
    16     TStringStream stream;
    18     uint64_t hash[2] = {0, 0};
    19     MurmurHash3_x64_128(name.data(), name.length(), 0, hash);
    21     // We want to avoid producing a string with a double underscore,
    22     // which would be an illegal GLSL identifier. We can assume that the
    23     // original identifier doesn't have a double underscore, otherwise
    24     // it's illegal anyway.
    25     stream << (name[0] == '_' ? "webgl" : "webgl_")
    26            << name.substr(0, 9)
    27            << (name[8] == '_' ? "" : "_")
    28            << std::hex
    29            << hash[0];
    30     ASSERT(stream.str().length() <= MAX_SHORTENED_IDENTIFIER_SIZE);
    31     ASSERT(stream.str().length() >= MAX_SHORTENED_IDENTIFIER_SIZE - 2);
    32     return stream.str();
    33 }
    35 LongNameMap* gLongNameMapInstance = NULL;
    37 }  // anonymous namespace
    39 LongNameMap::LongNameMap()
    40     : refCount(0)
    41 {
    42 }
    44 LongNameMap::~LongNameMap()
    45 {
    46 }
    48 // static
    49 LongNameMap* LongNameMap::GetInstance()
    50 {
    51     if (gLongNameMapInstance == NULL)
    52         gLongNameMapInstance = new LongNameMap;
    53     gLongNameMapInstance->refCount++;
    54     return gLongNameMapInstance;
    55 }
    57 void LongNameMap::Release()
    58 {
    59     ASSERT(gLongNameMapInstance == this);
    60     ASSERT(refCount > 0);
    61     refCount--;
    62     if (refCount == 0) {
    63         delete gLongNameMapInstance;
    64         gLongNameMapInstance = NULL;
    65     }
    66 }
    68 const char* LongNameMap::Find(const char* originalName) const
    69 {
    70     std::map<std::string, std::string>::const_iterator it = mLongNameMap.find(
    71         originalName);
    72     if (it != mLongNameMap.end())
    73         return (*it).second.c_str();
    74     return NULL;
    75 }
    77 void LongNameMap::Insert(const char* originalName, const char* mappedName)
    78 {
    79     mLongNameMap.insert(std::map<std::string, std::string>::value_type(
    80         originalName, mappedName));
    81 }
    83 size_t LongNameMap::Size() const
    84 {
    85     return mLongNameMap.size();
    86 }
    88 MapLongVariableNames::MapLongVariableNames(LongNameMap* globalMap)
    89 {
    90     ASSERT(globalMap);
    91     mGlobalMap = globalMap;
    92 }
    94 void MapLongVariableNames::visitSymbol(TIntermSymbol* symbol)
    95 {
    96     ASSERT(symbol != NULL);
    97     if (symbol->getSymbol().size() > MAX_SHORTENED_IDENTIFIER_SIZE) {
    98         switch (symbol->getQualifier()) {
    99           case EvqVaryingIn:
   100           case EvqVaryingOut:
   101           case EvqInvariantVaryingIn:
   102           case EvqInvariantVaryingOut:
   103           case EvqUniform:
   104             symbol->setSymbol(
   105                 mapGlobalLongName(symbol->getSymbol()));
   106             break;
   107           default:
   108             symbol->setSymbol(
   109                 mapLongName(symbol->getId(), symbol->getSymbol(), false));
   110             break;
   111         };
   112     }
   113 }
   115 bool MapLongVariableNames::visitLoop(Visit, TIntermLoop* node)
   116 {
   117     if (node->getInit())
   118         node->getInit()->traverse(this);
   119     return true;
   120 }
   122 TString MapLongVariableNames::mapGlobalLongName(const TString& name)
   123 {
   124     ASSERT(mGlobalMap);
   125     const char* mappedName = mGlobalMap->Find(name.c_str());
   126     if (mappedName != NULL)
   127         return mappedName;
   128     size_t id = mGlobalMap->Size();
   129     TString rt = mapLongName(id, name, true);
   130     mGlobalMap->Insert(name.c_str(), rt.c_str());
   131     return rt;
   132 }

mercurial