blob: 3c5d356da043a303aef0f71751ca7ab415d9913b [file] [log] [blame]
zmo@google.comfd747b82011-04-23 01:30:07 +00001//
zmo@google.com89c98132012-01-06 02:17:03 +00002// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
zmo@google.comfd747b82011-04-23 01:30:07 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7#include "compiler/MapLongVariableNames.h"
8
9namespace {
10
zmo@google.com24c08c42011-05-27 17:40:48 +000011TString mapLongName(int id, const TString& name, bool isVarying)
zmo@google.comfd747b82011-04-23 01:30:07 +000012{
kbr@chromium.org22152112011-10-26 01:18:28 +000013 ASSERT(name.size() > MAX_SHORTENED_IDENTIFIER_SIZE);
zmo@google.comfd747b82011-04-23 01:30:07 +000014 TStringStream stream;
zmo@google.com24c08c42011-05-27 17:40:48 +000015 stream << "webgl_";
16 if (isVarying)
17 stream << "v";
18 stream << id << "_";
kbr@chromium.org22152112011-10-26 01:18:28 +000019 stream << name.substr(0, MAX_SHORTENED_IDENTIFIER_SIZE - stream.str().size());
zmo@google.comfd747b82011-04-23 01:30:07 +000020 return stream.str();
21}
22
23} // anonymous namespace
24
zmo@google.com24c08c42011-05-27 17:40:48 +000025MapLongVariableNames::MapLongVariableNames(
zmo@google.com46974d22011-09-27 21:26:19 +000026 std::map<std::string, std::string>& varyingLongNameMap)
zmo@google.com24c08c42011-05-27 17:40:48 +000027 : mVaryingLongNameMap(varyingLongNameMap)
28{
29}
30
zmo@google.comfd747b82011-04-23 01:30:07 +000031void MapLongVariableNames::visitSymbol(TIntermSymbol* symbol)
32{
33 ASSERT(symbol != NULL);
kbr@chromium.org22152112011-10-26 01:18:28 +000034 if (symbol->getSymbol().size() > MAX_SHORTENED_IDENTIFIER_SIZE) {
zmo@google.com24c08c42011-05-27 17:40:48 +000035 switch (symbol->getQualifier()) {
36 case EvqVaryingIn:
37 case EvqVaryingOut:
38 case EvqInvariantVaryingIn:
39 case EvqInvariantVaryingOut:
zmo@google.com89c98132012-01-06 02:17:03 +000040 case EvqUniform:
zmo@google.com24c08c42011-05-27 17:40:48 +000041 symbol->setSymbol(
42 mapVaryingLongName(symbol->getSymbol()));
43 break;
44 default:
45 symbol->setSymbol(
46 mapLongName(symbol->getId(), symbol->getSymbol(), false));
47 break;
48 };
49 }
zmo@google.comfd747b82011-04-23 01:30:07 +000050}
51
zmo@google.com216aa5e2011-06-17 22:31:32 +000052bool MapLongVariableNames::visitLoop(Visit, TIntermLoop* node)
zmo@google.comfd747b82011-04-23 01:30:07 +000053{
zmo@google.com216aa5e2011-06-17 22:31:32 +000054 if (node->getInit())
55 node->getInit()->traverse(this);
zmo@google.comfd747b82011-04-23 01:30:07 +000056 return true;
57}
58
zmo@google.com24c08c42011-05-27 17:40:48 +000059TString MapLongVariableNames::mapVaryingLongName(const TString& name)
60{
zmo@google.com46974d22011-09-27 21:26:19 +000061 std::map<std::string, std::string>::const_iterator it = mVaryingLongNameMap.find(name.c_str());
zmo@google.com24c08c42011-05-27 17:40:48 +000062 if (it != mVaryingLongNameMap.end())
zmo@google.com46974d22011-09-27 21:26:19 +000063 return (*it).second.c_str();
zmo@google.com24c08c42011-05-27 17:40:48 +000064
65 int id = mVaryingLongNameMap.size();
66 TString mappedName = mapLongName(id, name, true);
67 mVaryingLongNameMap.insert(
zmo@google.com46974d22011-09-27 21:26:19 +000068 std::map<std::string, std::string>::value_type(name.c_str(), mappedName.c_str()));
zmo@google.com24c08c42011-05-27 17:40:48 +000069 return mappedName;
70}