Edit

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

Branch :

  • Show log

    Commit

  • Author : Olli Etuaho
    Date : 2015-02-13 13:12:22
    Hash : a3a5cc6a
    Message : Expose the IntermNode tree generated in the compiler for testing This refactoring makes it possible for tests to access the IntermNode tree produced by compilation by calling compileTree(). Removing ParseContext usage from OutputHLSL has the additional benefit of better separation between parsing and output. BUG=angle:916 Change-Id: Ib40954832316328772a5c1dcbbe6b46b238e4e65 Reviewed-on: https://chromium-review.googlesource.com/249723 Reviewed-by: Olli Etuaho <oetuaho@nvidia.com> Tested-by: Olli Etuaho <oetuaho@nvidia.com>

  • src/compiler/translator/TranslatorGLSL.cpp
  • //
    // Copyright (c) 2002-2013 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/TranslatorGLSL.h"
    
    #include "compiler/translator/EmulatePrecision.h"
    #include "compiler/translator/OutputGLSL.h"
    #include "compiler/translator/VersionGLSL.h"
    
    
    TranslatorGLSL::TranslatorGLSL(sh::GLenum type, ShShaderSpec spec)
        : TCompiler(type, spec, SH_GLSL_OUTPUT) {
    }
    
    void TranslatorGLSL::translate(TIntermNode *root, int) {
        TInfoSinkBase& sink = getInfoSink().obj;
    
        // Write GLSL version.
        writeVersion(root);
    
        writePragma();
    
        // Write extension behaviour as needed
        writeExtensionBehavior();
    
        bool precisionEmulation = getResources().WEBGL_debug_shader_precision && getPragma().debugShaderPrecision;
    
        if (precisionEmulation)
        {
            EmulatePrecision emulatePrecision;
            root->traverse(&emulatePrecision);
            emulatePrecision.updateTree();
            emulatePrecision.writeEmulationHelpers(sink, SH_GLSL_OUTPUT);
        }
    
        // Write emulated built-in functions if needed.
        getBuiltInFunctionEmulator().OutputEmulatedFunctionDefinition(
            sink, false);
    
        // Write array bounds clamping emulation if needed.
        getArrayBoundsClamper().OutputClampingFunctionDefinition(sink);
    
        // Write translated shader.
        TOutputGLSL outputGLSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), getNameMap(), getSymbolTable(), getShaderVersion());
        root->traverse(&outputGLSL);
    }
    
    void TranslatorGLSL::writeVersion(TIntermNode *root)
    {
        TVersionGLSL versionGLSL(getShaderType(), getPragma());
        root->traverse(&versionGLSL);
        int version = versionGLSL.getVersion();
        // We need to write version directive only if it is greater than 110.
        // If there is no version directive in the shader, 110 is implied.
        if (version > 110)
        {
            TInfoSinkBase& sink = getInfoSink().obj;
            sink << "#version " << version << "\n";
        }
    }
    
    void TranslatorGLSL::writeExtensionBehavior() {
        TInfoSinkBase& sink = getInfoSink().obj;
        const TExtensionBehavior& extBehavior = getExtensionBehavior();
        for (TExtensionBehavior::const_iterator iter = extBehavior.begin();
             iter != extBehavior.end(); ++iter) {
            if (iter->second == EBhUndefined)
                continue;
    
            // For GLSL output, we don't need to emit most extensions explicitly,
            // but some we need to translate.
            if (iter->first == "GL_EXT_shader_texture_lod") {
                sink << "#extension GL_ARB_shader_texture_lod : "
                     << getBehaviorString(iter->second) << "\n";
            }
        }
    }