Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / compiler / translator / TranslatorESSL.cpp
1 //
2 // Copyright (c) 2002-2013 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 //
6
7 #include "compiler/translator/TranslatorESSL.h"
8
9 #include "compiler/translator/OutputESSL.h"
10 #include "angle_gl.h"
11
12 TranslatorESSL::TranslatorESSL(sh::GLenum type, ShShaderSpec spec)
13     : TCompiler(type, spec, SH_ESSL_OUTPUT) {
14 }
15
16 void TranslatorESSL::translate(TIntermNode* root) {
17     TInfoSinkBase& sink = getInfoSink().obj;
18
19     // Write built-in extension behaviors.
20     writeExtensionBehavior();
21
22     // Write emulated built-in functions if needed.
23     getBuiltInFunctionEmulator().OutputEmulatedFunctionDefinition(
24         sink, getShaderType() == GL_FRAGMENT_SHADER);
25
26     // Write array bounds clamping emulation if needed.
27     getArrayBoundsClamper().OutputClampingFunctionDefinition(sink);
28
29     // Write translated shader.
30     TOutputESSL outputESSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), getNameMap(), getSymbolTable(), getShaderVersion());
31     root->traverse(&outputESSL);
32 }
33
34 void TranslatorESSL::writeExtensionBehavior() {
35     TInfoSinkBase& sink = getInfoSink().obj;
36     const TExtensionBehavior& extensionBehavior = getExtensionBehavior();
37     for (TExtensionBehavior::const_iterator iter = extensionBehavior.begin();
38          iter != extensionBehavior.end(); ++iter) {
39         if (iter->second != EBhUndefined) {
40             sink << "#extension " << iter->first << " : "
41                  << getBehaviorString(iter->second) << "\n";
42         }
43     }
44 }