Edit

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

Branch :

  • Show log

    Commit

  • Author : Olli Etuaho
    Date : 2017-07-13 16:07:26
    Hash : a5e693af
    Message : Make unique id counter a member of TSymbolTable This makes unique id counting thread-safe. BUG=angleproject:624 TEST=angle_unittests Change-Id: Ie0f2c7e574470b39750d37d2181c790bc874b275 Reviewed-on: https://chromium-review.googlesource.com/570419 Commit-Queue: Olli Etuaho <oetuaho@nvidia.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/compiler/translator/OutputVulkanGLSL.cpp
  • //
    // Copyright (c) 2016 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.
    //
    // OutputVulkanGLSL:
    //   Code that outputs shaders that fit GL_KHR_vulkan_glsl.
    //   The shaders are then fed into glslang to spit out SPIR-V (libANGLE-side).
    //   See: https://www.khronos.org/registry/vulkan/specs/misc/GL_KHR_vulkan_glsl.txt
    //
    
    #include "compiler/translator/OutputVulkanGLSL.h"
    
    namespace sh
    {
    
    TOutputVulkanGLSL::TOutputVulkanGLSL(TInfoSinkBase &objSink,
                                         ShArrayIndexClampingStrategy clampingStrategy,
                                         ShHashFunction64 hashFunction,
                                         NameMap &nameMap,
                                         TSymbolTable *symbolTable,
                                         sh::GLenum shaderType,
                                         int shaderVersion,
                                         ShShaderOutput output,
                                         ShCompileOptions compileOptions)
        : TOutputGLSLBase(objSink,
                          clampingStrategy,
                          hashFunction,
                          nameMap,
                          symbolTable,
                          shaderType,
                          shaderVersion,
                          output,
                          compileOptions)
    {
    }
    
    // TODO(jmadill): This is not complete.
    void TOutputVulkanGLSL::writeLayoutQualifier(const TType &type)
    {
        TInfoSinkBase &out                      = objSink();
        const TLayoutQualifier &layoutQualifier = type.getLayoutQualifier();
        out << "layout(";
    
        if (type.getQualifier() == EvqAttribute || type.getQualifier() == EvqFragmentOut ||
            type.getQualifier() == EvqVertexIn)
        {
            // TODO(jmadill): Multiple output locations.
            out << "location = "
                << "0";
        }
    
        if (IsImage(type.getBasicType()) && layoutQualifier.imageInternalFormat != EiifUnspecified)
        {
            ASSERT(type.getQualifier() == EvqTemporary || type.getQualifier() == EvqUniform);
            out << getImageInternalFormatString(layoutQualifier.imageInternalFormat);
        }
    
        out << ") ";
    }
    
    bool TOutputVulkanGLSL::writeVariablePrecision(TPrecision precision)
    {
        if (precision == EbpUndefined)
            return false;
    
        TInfoSinkBase &out = objSink();
        out << getPrecisionString(precision);
        return true;
    }
    
    void TOutputVulkanGLSL::visitSymbol(TIntermSymbol *node)
    {
        TInfoSinkBase &out = objSink();
    
        const TString &symbol = node->getSymbol();
        if (symbol == "gl_FragColor")
        {
            out << "webgl_FragColor";
        }
        else if (symbol == "gl_FragData")
        {
            out << "webgl_FragData";
        }
        else
        {
            TOutputGLSLBase::visitSymbol(node);
        }
    }
    
    }  // namespace sh