| // |
| // 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. |
| // |
| // TranslatorVulkan: |
| // A GLSL-based translator 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/TranslatorVulkan.h" |
| |
| #include "angle_gl.h" |
| #include "compiler/translator/OutputVulkanGLSL.h" |
| |
| namespace sh |
| { |
| |
| TranslatorVulkan::TranslatorVulkan(sh::GLenum type, ShShaderSpec spec) |
| : TCompiler(type, spec, SH_GLSL_450_CORE_OUTPUT) |
| { |
| } |
| |
| void TranslatorVulkan::translate(TIntermBlock *root, ShCompileOptions compileOptions) |
| { |
| TInfoSinkBase &sink = getInfoSink().obj; |
| |
| sink << "#version 450 core\n"; |
| |
| // Declare gl_FragColor and glFragData as webgl_FragColor and webgl_FragData |
| // if it's core profile shaders and they are used. |
| if (getShaderType() == GL_FRAGMENT_SHADER) |
| { |
| bool hasGLFragColor = false; |
| bool hasGLFragData = false; |
| |
| for (const auto &outputVar : outputVariables) |
| { |
| if (outputVar.name == "gl_FragColor") |
| { |
| ASSERT(!hasGLFragColor); |
| hasGLFragColor = true; |
| continue; |
| } |
| else if (outputVar.name == "gl_FragData") |
| { |
| ASSERT(!hasGLFragData); |
| hasGLFragData = true; |
| continue; |
| } |
| } |
| ASSERT(!(hasGLFragColor && hasGLFragData)); |
| if (hasGLFragColor) |
| { |
| sink << "layout(location = 0) out vec4 webgl_FragColor;\n"; |
| } |
| if (hasGLFragData) |
| { |
| sink << "layout(location = 0) out vec4 webgl_FragData[gl_MaxDrawBuffers];\n"; |
| } |
| } |
| |
| // Write translated shader. |
| TOutputVulkanGLSL outputGLSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), |
| getNameMap(), getSymbolTable(), getShaderType(), |
| getShaderVersion(), getOutputType(), compileOptions); |
| root->traverse(&outputGLSL); |
| } |
| |
| bool TranslatorVulkan::shouldFlattenPragmaStdglInvariantAll() |
| { |
| // Not necessary. |
| return false; |
| } |
| |
| } // namespace sh |