blob: 5b99fea948970c1a2785d75587b30dcfb3af1b20 [file] [log] [blame]
zmo@google.com5601ea02011-06-10 18:23:25 +00001//
Jamie Madill02f20dd2013-09-12 12:07:42 -04002// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
zmo@google.com5601ea02011-06-10 18:23:25 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
Geoff Lang17732822013-08-29 13:46:49 -04007#include "compiler/translator/TranslatorESSL.h"
zmo@google.com5601ea02011-06-10 18:23:25 +00008
Geoff Lang17732822013-08-29 13:46:49 -04009#include "compiler/translator/OutputESSL.h"
Jamie Madill183bde52014-07-02 15:31:19 -040010#include "angle_gl.h"
zmo@google.com5601ea02011-06-10 18:23:25 +000011
Jamie Madill183bde52014-07-02 15:31:19 -040012TranslatorESSL::TranslatorESSL(sh::GLenum type, ShShaderSpec spec)
Jamie Madill68fe74a2014-05-27 12:56:01 -040013 : TCompiler(type, spec, SH_ESSL_OUTPUT) {
zmo@google.com5601ea02011-06-10 18:23:25 +000014}
15
16void TranslatorESSL::translate(TIntermNode* root) {
17 TInfoSinkBase& sink = getInfoSink().obj;
18
19 // Write built-in extension behaviors.
20 writeExtensionBehavior();
21
zmo@google.com32e97312011-08-24 01:03:11 +000022 // Write emulated built-in functions if needed.
23 getBuiltInFunctionEmulator().OutputEmulatedFunctionDefinition(
Jamie Madill183bde52014-07-02 15:31:19 -040024 sink, getShaderType() == GL_FRAGMENT_SHADER);
zmo@google.com32e97312011-08-24 01:03:11 +000025
daniel@transgaming.com4167cc92013-01-11 04:11:53 +000026 // Write array bounds clamping emulation if needed.
27 getArrayBoundsClamper().OutputClampingFunctionDefinition(sink);
28
zmo@google.com5601ea02011-06-10 18:23:25 +000029 // Write translated shader.
Jamie Madill02f20dd2013-09-12 12:07:42 -040030 TOutputESSL outputESSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), getNameMap(), getSymbolTable(), getShaderVersion());
zmo@google.com5601ea02011-06-10 18:23:25 +000031 root->traverse(&outputESSL);
32}
33
34void 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) {
zmo@google.com09c323a2011-08-12 18:22:25 +000039 if (iter->second != EBhUndefined) {
40 sink << "#extension " << iter->first << " : "
41 << getBehaviorString(iter->second) << "\n";
42 }
zmo@google.com5601ea02011-06-10 18:23:25 +000043 }
44}