Edit

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

Branch :

  • Show log

    Commit

  • Author : Kimmo Kinnunen
    Date : 2015-07-16 14:13:11
    Hash : b18609b9
    Message : Implement ES 2,3 parts of EXT_blend_func_extended for shader translation Exposes gl_SecondaryFragColor, glSecondaryFragData[] and gl_MaxDualSourceDrawBuffers to GLES SL 1.0. Relaxes rules for undefined output locations for GLES SL 3.0 and exposes gl_MaxDualSourceDrawBuffers. If the output GL context is GL ES 2.0 or 3.0: The emulation layer is expected to turn on EXT_blend_func_extended if the output GL context supports it. If the output GL context is GL: The emulation layer is expected to turn on EXT_blend_func_extended if the output GL context supports ARB_blend_func_extended or if GL context is 3.2 or later. If the source shader spec is GLES SL 2.0: The emulation layer is expected to inspect the shader compilation output variables upon linking. If output target is GL SL, the emulation layer should bind color location 0, index 1 to "angle_SecondaryFragColor" if variable "gl_SecondaryFragColorEXT" is used. Alternatively, emulation layer should bind "angle_SecondaryFragData" to locations 0,1,2,3,..., all color index 1, if "gl_SecondaryFragData" array is used. (The caller can not bind the locations or specify output variables.) If the source shader spec is GLES SL 3.0: The emulation layer is expected to do location auto-resolve of the the output variables that have undefined output locations that have not been bound by the caller. (The caller can not use gl_ built-ins, so nothing to do with those.) BUG=angleproject:1085 TEST=angle_unittest Change-Id: I5cafe205b0c29478b0dcd24aa89a7b0000f5d046 Reviewed-on: https://chromium-review.googlesource.com/287580 Reviewed-by: Zhenyao Mo <zmo@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Tested-by: Kimmo Kinnunen <kkinnunen@nvidia.com>

  • src/compiler/translator/OutputGLSL.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/OutputGLSL.h"
    
    TOutputGLSL::TOutputGLSL(TInfoSinkBase& objSink,
                             ShArrayIndexClampingStrategy clampingStrategy,
                             ShHashFunction64 hashFunction,
                             NameMap& nameMap,
                             TSymbolTable& symbolTable,
                             int shaderVersion,
                             ShShaderOutput output)
        : TOutputGLSLBase(objSink,
                          clampingStrategy,
                          hashFunction,
                          nameMap,
                          symbolTable,
                          shaderVersion,
                          output)
    {
    }
    
    bool TOutputGLSL::writeVariablePrecision(TPrecision)
    {
        return false;
    }
    
    void TOutputGLSL::visitSymbol(TIntermSymbol *node)
    {
        TInfoSinkBase& out = objSink();
    
        const TString &symbol = node->getSymbol();
        if (symbol == "gl_FragDepthEXT")
        {
            out << "gl_FragDepth";
        }
        else if (symbol == "gl_FragColor" && IsGLSL130OrNewer(getShaderOutput()))
        {
            out << "webgl_FragColor";
        }
        else if (symbol == "gl_FragData" && IsGLSL130OrNewer(getShaderOutput()))
        {
            out << "webgl_FragData";
        }
        else if (symbol == "gl_SecondaryFragColorEXT")
        {
            out << "angle_SecondaryFragColor";
        }
        else if (symbol == "gl_SecondaryFragDataEXT")
        {
            out << "angle_SecondaryFragData";
        }
        else
        {
            TOutputGLSLBase::visitSymbol(node);
        }
    }
    
    TString TOutputGLSL::translateTextureFunction(TString &name)
    {
        static const char *simpleRename[] = {
            "texture2DLodEXT", "texture2DLod",
            "texture2DProjLodEXT", "texture2DProjLod",
            "textureCubeLodEXT", "textureCubeLod",
            "texture2DGradEXT", "texture2DGradARB",
            "texture2DProjGradEXT", "texture2DProjGradARB",
            "textureCubeGradEXT", "textureCubeGradARB",
            NULL, NULL
        };
        static const char *legacyToCoreRename[] = {
            "texture2D", "texture",
            "texture2DProj", "textureProj",
            "texture2DLod", "textureLod",
            "texture2DProjLod", "textureProjLod",
            "textureCube", "texture",
            "textureCubeLod", "textureLod",
            // Extensions
            "texture2DLodEXT", "textureLod",
            "texture2DProjLodEXT", "textureProjLod",
            "textureCubeLodEXT", "textureLod",
            "texture2DGradEXT", "textureGrad",
            "texture2DProjGradEXT", "textureProjGrad",
            "textureCubeGradEXT", "textureGrad",
            NULL, NULL
        };
        const char **mapping = (IsGLSL130OrNewer(getShaderOutput())) ?
            legacyToCoreRename : simpleRename;
    
        for (int i = 0; mapping[i] != NULL; i += 2)
        {
            if (name == mapping[i])
            {
                return mapping[i+1];
            }
        }
    
        return name;
    }