//
// Copyright 2014 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.
//
// DynamicHLSL.cpp: Implementation for link and run-time HLSL generation
//

#include "libANGLE/renderer/d3d/DynamicHLSL.h"

#include "common/string_utils.h"
#include "common/utilities.h"
#include "compiler/translator/hlsl/blocklayoutHLSL.h"
#include "libANGLE/Context.h"
#include "libANGLE/Program.h"
#include "libANGLE/Shader.h"
#include "libANGLE/VaryingPacking.h"
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/d3d/ProgramD3D.h"
#include "libANGLE/renderer/d3d/ProgramExecutableD3D.h"
#include "libANGLE/renderer/d3d/RendererD3D.h"
#include "libANGLE/renderer/d3d/ShaderD3D.h"

using namespace gl;

namespace rx
{

namespace
{

const char *HLSLComponentTypeString(GLenum componentType)
{
    switch (componentType)
    {
        case GL_UNSIGNED_INT:
            return "uint";
        case GL_INT:
            return "int";
        case GL_UNSIGNED_NORMALIZED:
        case GL_SIGNED_NORMALIZED:
        case GL_FLOAT:
            return "float";
        default:
            UNREACHABLE();
            return "not-component-type";
    }
}

void HLSLComponentTypeString(std::ostringstream &ostream, GLenum componentType, int componentCount)
{
    ostream << HLSLComponentTypeString(componentType);
    if (componentCount > 1)
    {
        ostream << componentCount;
    }
}

const char *HLSLMatrixTypeString(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT_MAT2:
            return "float2x2";
        case GL_FLOAT_MAT3:
            return "float3x3";
        case GL_FLOAT_MAT4:
            return "float4x4";
        case GL_FLOAT_MAT2x3:
            return "float2x3";
        case GL_FLOAT_MAT3x2:
            return "float3x2";
        case GL_FLOAT_MAT2x4:
            return "float2x4";
        case GL_FLOAT_MAT4x2:
            return "float4x2";
        case GL_FLOAT_MAT3x4:
            return "float3x4";
        case GL_FLOAT_MAT4x3:
            return "float4x3";
        default:
            UNREACHABLE();
            return "not-matrix-type";
    }
}

void HLSLTypeString(std::ostringstream &ostream, GLenum type)
{
    if (gl::IsMatrixType(type))
    {
        ostream << HLSLMatrixTypeString(type);
        return;
    }

    HLSLComponentTypeString(ostream, gl::VariableComponentType(type),
                            gl::VariableComponentCount(type));
}

const PixelShaderOutputVariable *FindOutputAtLocation(
    const std::vector<PixelShaderOutputVariable> &outputVariables,
    unsigned int location,
    size_t index = 0)
{
    for (auto &outputVar : outputVariables)
    {
        if (outputVar.outputLocation == location && outputVar.outputIndex == index)
        {
            return &outputVar;
        }
    }

    return nullptr;
}

void WriteArrayString(std::ostringstream &strstr, unsigned int i)
{
    static_assert(GL_INVALID_INDEX == UINT_MAX,
                  "GL_INVALID_INDEX must be equal to the max unsigned int.");
    if (i == UINT_MAX)
    {
        return;
    }

    strstr << "[";
    strstr << i;
    strstr << "]";
}

constexpr const char *VERTEX_ATTRIBUTE_STUB_STRING      = "@@ VERTEX ATTRIBUTES @@";
constexpr const char *VERTEX_OUTPUT_STUB_STRING         = "@@ VERTEX OUTPUT @@";
constexpr const char *PIXEL_OUTPUT_STUB_STRING          = "@@ PIXEL OUTPUT @@";
constexpr const char *PIXEL_MAIN_PARAMETERS_STUB_STRING = "@@ PIXEL MAIN PARAMETERS @@";
constexpr const char *MAIN_PROLOGUE_STUB_STRING         = "@@ MAIN PROLOGUE @@";
}  // anonymous namespace

// BuiltinInfo implementation

BuiltinInfo::BuiltinInfo()  = default;
BuiltinInfo::~BuiltinInfo() = default;

// DynamicHLSL implementation

// static
std::string DynamicHLSL::GenerateVertexShaderForInputLayout(
    RendererD3D *renderer,
    const std::string &sourceShader,
    const InputLayout &inputLayout,
    const std::vector<gl::ProgramInput> &shaderAttributes,
    size_t baseUAVRegister)
{
    std::ostringstream structStream;
    std::ostringstream initStream;

    structStream << "struct VS_INPUT\n"
                    "{\n";

    int semanticIndex       = 0;
    unsigned int inputIndex = 0;

    for (size_t attributeIndex = 0; attributeIndex < shaderAttributes.size(); ++attributeIndex)
    {
        const gl::ProgramInput &shaderAttribute = shaderAttributes[attributeIndex];
        if (!shaderAttribute.name.empty())
        {
            // Built-in attributes do not count
            if (!shaderAttribute.isBuiltIn())
            {
                ASSERT(inputIndex < MAX_VERTEX_ATTRIBS);
            }

            angle::FormatID vertexFormatID =
                inputIndex < inputLayout.size() ? inputLayout[inputIndex] : angle::FormatID::NONE;

            // HLSL code for input structure
            if (IsMatrixType(shaderAttribute.getType()))
            {
                // Matrix types are always transposed
                structStream << "    "
                             << HLSLMatrixTypeString(
                                    TransposeMatrixType(shaderAttribute.getType()));
            }
            else
            {
                if (shaderAttribute.name == "gl_InstanceID" ||
                    shaderAttribute.name == "gl_VertexID")
                {
                    // The input types of the instance ID and vertex ID in HLSL (uint) differs from
                    // the ones in ESSL (int).
                    structStream << " uint";
                }
                else
                {
                    GLenum componentType = renderer->getVertexComponentType(vertexFormatID);

                    structStream << "    ";
                    HLSLComponentTypeString(structStream, componentType,
                                            VariableComponentCount(shaderAttribute.getType()));
                }
            }

            structStream << " " << DecorateVariable(shaderAttribute.name) << " : ";

            if (shaderAttribute.name == "gl_InstanceID")
            {
                structStream << "SV_InstanceID";
            }
            else if (shaderAttribute.name == "gl_VertexID")
            {
                structStream << "SV_VertexID";
            }
            else
            {
                structStream << "TEXCOORD" << semanticIndex;
                semanticIndex += VariableRegisterCount(shaderAttribute.getType());
            }

            structStream << ";\n";

            // HLSL code for initialization
            initStream << "    " << DecorateVariable(shaderAttribute.name) << " = ";

            // Mismatched vertex attribute to vertex input may result in an undefined
            // data reinterpretation (eg for pure integer->float, float->pure integer)
            // TODO: issue warning with gl debug info extension, when supported
            if (IsMatrixType(shaderAttribute.getType()) ||
                (renderer->getVertexConversionType(vertexFormatID) & VERTEX_CONVERT_GPU) != 0)
            {
                GenerateAttributeConversionHLSL(vertexFormatID, shaderAttribute, initStream);
            }
            else
            {
                initStream << "input." << DecorateVariable(shaderAttribute.name);
            }

            if (shaderAttribute.name == "gl_VertexID")
            {
                // dx_VertexID contains the firstVertex offset
                initStream << " + dx_VertexID";
            }

            initStream << ";\n";

            if (!shaderAttribute.isBuiltIn())
            {
                inputIndex += VariableRowCount(TransposeMatrixType(shaderAttribute.getType()));
            }
        }
    }

    structStream << "};\n"
                    "\n"
                    "void initAttributes(VS_INPUT input)\n"
                    "{\n"
                 << initStream.str() << "}\n";

    std::string vertexHLSL(sourceShader);

    bool success =
        angle::ReplaceSubstring(&vertexHLSL, VERTEX_ATTRIBUTE_STUB_STRING, structStream.str());
    ASSERT(success);

    return vertexHLSL;
}

// static
std::string DynamicHLSL::GeneratePixelShaderForOutputSignature(
    const std::string &sourceShader,
    const std::vector<PixelShaderOutputVariable> &outputVariables,
    FragDepthUsage fragDepthUsage,
    bool usesSampleMask,
    const std::vector<GLenum> &outputLayout,
    size_t baseUAVRegister)
{
    std::string targetSemantic = "SV_TARGET";
    std::string depthSemantic  = [fragDepthUsage]() {
        switch (fragDepthUsage)
        {
            case FragDepthUsage::Less:
                return "SV_DepthLessEqual";
            case FragDepthUsage::Greater:
                return "SV_DepthGreaterEqual";
            default:
                return "SV_Depth";
        }
    }();

    std::ostringstream declarationStream;
    std::ostringstream copyStream;

    declarationStream << "struct PS_OUTPUT\n"
                         "{\n";

    size_t numOutputs = outputLayout.size();

    const PixelShaderOutputVariable defaultOutput(GL_FLOAT_VEC4, "unused", "float4(0, 0, 0, 1)", 0,
                                                  0);
    size_t outputIndex = 0;

    for (size_t layoutIndex = 0; layoutIndex < numOutputs; ++layoutIndex)
    {
        GLenum binding = outputLayout.empty() ? GL_COLOR_ATTACHMENT0 : outputLayout[layoutIndex];

        if (binding != GL_NONE)
        {
            unsigned int location = (binding - GL_COLOR_ATTACHMENT0);
            outputIndex =
                layoutIndex > 0 && binding == outputLayout[layoutIndex - 1] ? outputIndex + 1 : 0;

            const PixelShaderOutputVariable *outputVariable =
                outputLayout.empty() ? &defaultOutput
                                     : FindOutputAtLocation(outputVariables, location, outputIndex);

            // OpenGL ES 3.0 spec $4.2.1
            // If [...] not all user-defined output variables are written, the values of fragment
            // colors corresponding to unwritten variables are similarly undefined.
            if (outputVariable)
            {
                declarationStream << "    ";
                HLSLTypeString(declarationStream, outputVariable->type);
                declarationStream << " " << outputVariable->name << " : " << targetSemantic
                                  << static_cast<int>(layoutIndex) << ";\n";

                copyStream << "    output." << outputVariable->name << " = "
                           << outputVariable->source << ";\n";
            }
        }
    }

    if (fragDepthUsage != FragDepthUsage::Unused)
    {
        declarationStream << "    float gl_Depth : " << depthSemantic << ";\n";
        copyStream << "    output.gl_Depth = gl_Depth; \n";
    }

    if (usesSampleMask)
    {
        declarationStream << "    uint sampleMask : SV_Coverage;\n";
        // Ignore gl_SampleMask[0] value when rendering to a single-sampled framebuffer
        copyStream << "    output.sampleMask = (dx_Misc & 1) ? gl_SampleMask[0] : 0xFFFFFFFFu;\n";
    }

    declarationStream << "};\n"
                         "\n"
                         "PS_OUTPUT generateOutput()\n"
                         "{\n"
                         "    PS_OUTPUT output;\n"
                      << copyStream.str()
                      << "    return output;\n"
                         "}\n";

    std::string pixelHLSL(sourceShader);

    bool success =
        angle::ReplaceSubstring(&pixelHLSL, PIXEL_OUTPUT_STUB_STRING, declarationStream.str());
    ASSERT(success);

    return pixelHLSL;
}

// static
std::string DynamicHLSL::GenerateShaderForImage2DBindSignature(
    ProgramExecutableD3D &executableD3D,
    gl::ShaderType shaderType,
    const SharedCompiledShaderStateD3D &shaderData,
    const std::string &shaderHLSL,
    std::vector<sh::ShaderVariable> &image2DUniforms,
    const gl::ImageUnitTextureTypeMap &image2DBindLayout,
    unsigned int baseUAVRegister)
{
    if (image2DUniforms.empty())
    {
        return shaderHLSL;
    }

    return GenerateShaderForImage2DBindSignatureImpl(executableD3D, shaderType, shaderData,
                                                     shaderHLSL, image2DUniforms, image2DBindLayout,
                                                     baseUAVRegister);
}

// static
void DynamicHLSL::GenerateVaryingLinkHLSL(const VaryingPacking &varyingPacking,
                                          const BuiltinInfo &builtins,
                                          FragDepthUsage fragDepthUsage,
                                          std::ostringstream &hlslStream)
{
    ASSERT(builtins.dxPosition.enabled);
    hlslStream << "{\n";
    hlslStream << "    ";
    if (fragDepthUsage == FragDepthUsage::Greater || fragDepthUsage == FragDepthUsage::Less)
    {
        // When conservative depth output is used and the pixel shader runs at pixel-frequency,
        // input position must use centroid interpolation to avoid HLSL compilation errors.
        // NOTE: Accuracy can be improved by using sample interpolation here,
        // when a shader already runs at sample-frequency.
        hlslStream << "centroid ";
    }
    hlslStream << "float4 dx_Position : " << builtins.dxPosition.str() << ";\n";

    if (builtins.glPosition.enabled)
    {
        hlslStream << "    float4 gl_Position : " << builtins.glPosition.str() << ";\n";
    }

    if (builtins.glClipDistance.enabled)
    {
        ASSERT(builtins.glClipDistance.indexOrSize > 0 && builtins.glClipDistance.indexOrSize < 9);
        for (unsigned int i = 0; i < (builtins.glClipDistance.indexOrSize + 3) >> 2; i++)
        {
            unsigned int size = std::min(builtins.glClipDistance.indexOrSize - 4u * i, 4u);
            hlslStream << "    float" << ((size == 1) ? "" : Str(size)) << " gl_ClipDistance" << i
                       << " : " << builtins.glClipDistance.str() << i << ";\n";
        }
    }

    if (builtins.glCullDistance.enabled)
    {
        ASSERT(builtins.glCullDistance.indexOrSize > 0 && builtins.glCullDistance.indexOrSize < 9);
        for (unsigned int i = 0; i < (builtins.glCullDistance.indexOrSize + 3) >> 2; i++)
        {
            unsigned int size = std::min(builtins.glCullDistance.indexOrSize - 4u * i, 4u);
            hlslStream << "    float" << ((size == 1) ? "" : Str(size)) << " gl_CullDistance" << i
                       << " : " << builtins.glCullDistance.str() << i << ";\n";
        }
    }

    if (builtins.glFragCoord.enabled)
    {
        hlslStream << "    float4 gl_FragCoord : " << builtins.glFragCoord.str() << ";\n";
    }

    if (builtins.glPointCoord.enabled)
    {
        hlslStream << "    float2 gl_PointCoord : " << builtins.glPointCoord.str() << ";\n";
    }

    if (builtins.glPointSize.enabled)
    {
        hlslStream << "    float gl_PointSize : " << builtins.glPointSize.str() << ";\n";
    }

    if (builtins.glViewIDOVR.enabled)
    {
        hlslStream << "    nointerpolation uint gl_ViewID_OVR : " << builtins.glViewIDOVR.str()
                   << ";\n";
    }

    std::string varyingSemantic = "TEXCOORD";

    const auto &registerInfos = varyingPacking.getRegisterList();
    for (GLuint registerIndex = 0u; registerIndex < registerInfos.size(); ++registerIndex)
    {
        const PackedVaryingRegister &registerInfo = registerInfos[registerIndex];
        const auto &varying                       = registerInfo.packedVarying->varying();
        ASSERT(!varying.isStruct());

        // TODO: Add checks to ensure D3D interpolation modifiers don't result in too many
        // registers being used.
        // For example, if there are N registers, and we have N vec3 varyings and 1 float
        // varying, then D3D will pack them into N registers.
        // If the float varying has the 'nointerpolation' modifier on it then we would need
        // N + 1 registers, and D3D compilation will fail.

        switch (registerInfo.packedVarying->interpolation)
        {
            case sh::INTERPOLATION_SMOOTH:
                hlslStream << "    ";
                break;
            case sh::INTERPOLATION_FLAT:
                hlslStream << "    nointerpolation ";
                break;
            case sh::INTERPOLATION_NOPERSPECTIVE:
                hlslStream << "    noperspective ";
                break;
            case sh::INTERPOLATION_CENTROID:
                hlslStream << "    centroid ";
                break;
            case sh::INTERPOLATION_SAMPLE:
                hlslStream << "    sample ";
                break;
            case sh::INTERPOLATION_NOPERSPECTIVE_CENTROID:
                hlslStream << "    noperspective centroid ";
                break;
            case sh::INTERPOLATION_NOPERSPECTIVE_SAMPLE:
                hlslStream << "    noperspective sample ";
                break;
            default:
                UNREACHABLE();
        }

        GLenum transposedType = gl::TransposeMatrixType(varying.type);
        GLenum componentType  = gl::VariableComponentType(transposedType);
        int columnCount       = gl::VariableColumnCount(transposedType);
        HLSLComponentTypeString(hlslStream, componentType, columnCount);
        hlslStream << " v" << registerIndex << " : " << varyingSemantic << registerIndex << ";\n";
    }

    // Note that the following outputs need to be declared after the others. They are not included
    // in pixel shader inputs even when they are in vertex/geometry shader outputs, and the pixel
    // shader input struct must be a prefix of the vertex/geometry shader output struct.

    if (builtins.glLayer.enabled)
    {
        hlslStream << "    nointerpolation uint gl_Layer : " << builtins.glLayer.str() << ";\n";
    }

    hlslStream << "};\n";
}

// static
void DynamicHLSL::GenerateShaderLinkHLSL(
    const gl::Caps &caps,
    const gl::ShaderMap<gl::SharedCompiledShaderState> &shaderData,
    const gl::ShaderMap<SharedCompiledShaderStateD3D> &shaderDataD3D,
    const ProgramD3DMetadata &programMetadata,
    const VaryingPacking &varyingPacking,
    const BuiltinVaryingsD3D &builtinsD3D,
    gl::ShaderMap<std::string> *shaderHLSL)
{
    ASSERT(shaderHLSL);
    ASSERT((*shaderHLSL)[gl::ShaderType::Vertex].empty() &&
           (*shaderHLSL)[gl::ShaderType::Fragment].empty());

    const gl::SharedCompiledShaderState &vertexShader   = shaderData[ShaderType::Vertex];
    const gl::SharedCompiledShaderState &fragmentShader = shaderData[ShaderType::Fragment];

    const SharedCompiledShaderStateD3D &fragmentShaderD3D = shaderDataD3D[ShaderType::Fragment];

    // Validation done in the compiler
    ASSERT(!fragmentShaderD3D || !fragmentShaderD3D->usesFragColor ||
           !fragmentShaderD3D->usesFragData);

    std::ostringstream vertexStream;
    vertexStream << "struct VS_OUTPUT\n";
    const auto &vertexBuiltins = builtinsD3D[gl::ShaderType::Vertex];
    GenerateVaryingLinkHLSL(varyingPacking, vertexBuiltins, FragDepthUsage::Unused, vertexStream);

    std::ostringstream vertexGenerateOutput;
    vertexGenerateOutput << "VS_OUTPUT generateOutput(VS_INPUT input)\n"
                         << "{\n"
                         << "    VS_OUTPUT output;\n";

    if (vertexBuiltins.glPosition.enabled)
    {
        vertexGenerateOutput << "    output.gl_Position = gl_Position;\n";
    }

    if (vertexBuiltins.glClipDistance.enabled)
    {
        ASSERT(vertexBuiltins.glClipDistance.indexOrSize > 0 &&
               vertexBuiltins.glClipDistance.indexOrSize < 9);
        vertexGenerateOutput << "    output.gl_ClipDistance0 = (clipDistancesEnabled & ";
        switch (vertexBuiltins.glClipDistance.indexOrSize)
        {
            case 1:
                vertexGenerateOutput << "1) ? (float)gl_ClipDistance : 0;\n";
                break;
            case 2:
                vertexGenerateOutput << "int2(1, 2)) ? (float2)gl_ClipDistance : 0;\n";
                break;
            case 3:
                vertexGenerateOutput << "int3(1, 2, 4)) ? (float3)gl_ClipDistance : 0;\n";
                break;
            default:
                vertexGenerateOutput << "int4(1, 2, 4, 8)) ? (float4)gl_ClipDistance : 0;\n";
                break;
        }
        if (vertexBuiltins.glClipDistance.indexOrSize > 4)
        {
            vertexGenerateOutput << "    output.gl_ClipDistance1 = (clipDistancesEnabled & ";
            switch (vertexBuiltins.glClipDistance.indexOrSize)
            {
                case 5:
                    vertexGenerateOutput << "16) ? gl_ClipDistance[4] : 0;\n";
                    break;
                case 6:
                    vertexGenerateOutput << "int2(16, 32)) ? "
                                            "((float2[3])gl_ClipDistance)[2] : 0;\n";
                    break;
                case 7:
                    vertexGenerateOutput << "int3(16, 32, 64)) ? float3(gl_ClipDistance[4], "
                                            "gl_ClipDistance[5], gl_ClipDistance[6]) : 0;\n";
                    break;
                case 8:
                    vertexGenerateOutput << "int4(16, 32, 64, 128)) ? "
                                            "((float4[2])gl_ClipDistance)[1] : 0;\n";
                    break;
            }
        }
    }

    if (vertexBuiltins.glCullDistance.enabled)
    {
        ASSERT(vertexBuiltins.glCullDistance.indexOrSize > 0 &&
               vertexBuiltins.glCullDistance.indexOrSize < 9);
        vertexGenerateOutput << "    output.gl_CullDistance0 = ";
        switch (vertexBuiltins.glCullDistance.indexOrSize)
        {
            case 1:
                vertexGenerateOutput << "(float)gl_CullDistance;\n";
                break;
            case 2:
                vertexGenerateOutput << "(float2)gl_CullDistance;\n";
                break;
            case 3:
                vertexGenerateOutput << "(float3)gl_CullDistance;\n";
                break;
            default:
                vertexGenerateOutput << "(float4)gl_CullDistance;\n";
                break;
        }
        if (vertexBuiltins.glCullDistance.indexOrSize > 4)
        {
            vertexGenerateOutput << "    output.gl_CullDistance1 = ";
            switch (vertexBuiltins.glCullDistance.indexOrSize)
            {
                case 5:
                    vertexGenerateOutput << "gl_CullDistance[4];\n";
                    break;
                case 6:
                    vertexGenerateOutput << "((float2[3])gl_CullDistance)[2];\n";
                    break;
                case 7:
                    vertexGenerateOutput << "float3(gl_CullDistance[4], "
                                            "gl_CullDistance[5], gl_CullDistance[6]);\n";
                    break;
                case 8:
                    vertexGenerateOutput << "((float4[2])gl_CullDistance)[1];\n";
                    break;
            }
        }
    }

    if (vertexBuiltins.glViewIDOVR.enabled)
    {
        vertexGenerateOutput << "    output.gl_ViewID_OVR = ViewID_OVR;\n";
    }
    if (programMetadata.hasMultiviewEnabled() && programMetadata.canSelectViewInVertexShader())
    {
        ASSERT(vertexBuiltins.glLayer.enabled);
        vertexGenerateOutput << "    output.gl_Layer = ViewID_OVR;\n";
    }

    vertexGenerateOutput << "    output.dx_Position.x = gl_Position.x;\n";

    if (programMetadata.usesViewScale())
    {
        // This code assumes that dx_ViewScale.y = -1.0f when rendering to texture, and +1.0f
        // when rendering to the default framebuffer. No other values are valid.
        vertexGenerateOutput << "    output.dx_Position.y = dx_ViewScale.y * gl_Position.y;\n";
    }
    else
    {
        vertexGenerateOutput << "    output.dx_Position.y = clipControlOrigin * gl_Position.y;\n";
    }

    vertexGenerateOutput
        << "    if (clipControlZeroToOne)\n"
        << "    {\n"
        << "        output.dx_Position.z = gl_Position.z;\n"
        << "    } else {\n"
        << "        output.dx_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n"
        << "    }\n";

    vertexGenerateOutput << "    output.dx_Position.w = gl_Position.w;\n";

    // We don't need to output gl_PointSize if we use are emulating point sprites via instancing.
    if (vertexBuiltins.glPointSize.enabled)
    {
        vertexGenerateOutput << "    output.gl_PointSize = gl_PointSize;\n";
    }

    if (vertexBuiltins.glFragCoord.enabled)
    {
        vertexGenerateOutput << "    output.gl_FragCoord = gl_Position;\n";
    }

    const auto &registerInfos = varyingPacking.getRegisterList();
    for (GLuint registerIndex = 0u; registerIndex < registerInfos.size(); ++registerIndex)
    {
        const PackedVaryingRegister &registerInfo = registerInfos[registerIndex];
        const auto &packedVarying                 = *registerInfo.packedVarying;
        const auto &varying                       = *packedVarying.frontVarying.varying;
        ASSERT(!varying.isStruct());

        vertexGenerateOutput << "    output.v" << registerIndex << " = ";

        if (packedVarying.isStructField())
        {
            vertexGenerateOutput << DecorateVariable(packedVarying.frontVarying.parentStructName)
                                 << ".";
        }

        vertexGenerateOutput << DecorateVariable(varying.name);

        if (varying.isArray())
        {
            WriteArrayString(vertexGenerateOutput, registerInfo.varyingArrayIndex);
        }

        if (VariableRowCount(varying.type) > 1)
        {
            WriteArrayString(vertexGenerateOutput, registerInfo.varyingRowIndex);
        }

        vertexGenerateOutput << ";\n";
    }

    // Renderers that enable instanced pointsprite emulation require the vertex shader output member
    // gl_PointCoord to be set to a default value if used without gl_PointSize. 0.5,0.5 is the same
    // default value used in the generated pixel shader.
    if (programMetadata.usesInsertedPointCoordValue())
    {
        vertexGenerateOutput << "\n"
                                "    output.gl_PointCoord = float2(0.5, 0.5);\n";
    }

    vertexGenerateOutput << "\n"
                            "    return output;\n"
                            "}";

    if (vertexShader)
    {
        std::string vertexSource = *vertexShader->translatedSource;
        angle::ReplaceSubstring(&vertexSource, std::string(MAIN_PROLOGUE_STUB_STRING),
                                "    initAttributes(input);\n");
        angle::ReplaceSubstring(&vertexSource, std::string(VERTEX_OUTPUT_STUB_STRING),
                                vertexGenerateOutput.str());
        vertexStream << vertexSource;
    }

    const auto &pixelBuiltins = builtinsD3D[gl::ShaderType::Fragment];

    std::ostringstream pixelStream;
    pixelStream << "struct PS_INPUT\n";
    GenerateVaryingLinkHLSL(varyingPacking, pixelBuiltins, programMetadata.getFragDepthUsage(),
                            pixelStream);
    pixelStream << "\n";

    std::ostringstream pixelPrologue;
    if (fragmentShaderD3D && fragmentShaderD3D->usesViewID)
    {
        ASSERT(pixelBuiltins.glViewIDOVR.enabled);
        pixelPrologue << "    ViewID_OVR = input.gl_ViewID_OVR;\n";
    }

    if (pixelBuiltins.glFragCoord.enabled)
    {
        pixelPrologue << "    float rhw = 1.0 / input.gl_FragCoord.w;\n";

        // gl_FragCoord is computed from dx_Position, which the pixel shader can read directly.
        // DComp usually gives us an offset at (0, 0), but this is not always the case. It is
        // valid for DComp to give us an offset into the texture atlas. In that scenario, we
        // need to offset gl_FragCoord using dx_FragCoordOffset to point to the correct location
        // of the pixel.
        pixelPrologue << "    gl_FragCoord.x = input.dx_Position.x - dx_FragCoordOffset.x;\n"
                      << "    gl_FragCoord.y = input.dx_Position.y - dx_FragCoordOffset.y;\n";

        if (programMetadata.usesViewScale())
        {
            // Some assumptions:
            //  - dx_ViewScale.y = -1.0f when rendering to texture
            //  - dx_ViewScale.y = +1.0f when rendering to the default framebuffer
            //  - gl_FragCoord.y has been set correctly above.
            //
            // When rendering to the backbuffer, the code inverts gl_FragCoord's y coordinate.
            // This involves subtracting the y coordinate from the height of the area being
            // rendered to.
            //
            // First we calculate the height of the area being rendered to:
            //    render_area_height = (2.0f / (1.0f - input.gl_FragCoord.y * rhw)) *
            //    gl_FragCoord.y
            //
            // Note that when we're rendering to default FB, we want our output to be
            // equivalent to:
            //    "gl_FragCoord.y = render_area_height - gl_FragCoord.y"
            //
            // When we're rendering to a texture, we want our output to be equivalent to:
            //    "gl_FragCoord.y = gl_FragCoord.y;"
            //
            // If we set scale_factor = ((1.0f + dx_ViewScale.y) / 2.0f), then notice that
            //  - When rendering to default FB: scale_factor = 1.0f
            //  - When rendering to texture:    scale_factor = 0.0f
            //
            // Therefore, we can get our desired output by setting:
            //    "gl_FragCoord.y = scale_factor * render_area_height - dx_ViewScale.y *
            //    gl_FragCoord.y"
            //
            // Simplifying, this becomes:
            pixelPrologue
                << "    gl_FragCoord.y = (1.0f + dx_ViewScale.y) * gl_FragCoord.y /"
                   "(1.0f - input.gl_FragCoord.y * rhw)  - dx_ViewScale.y * gl_FragCoord.y;\n";
        }

        pixelPrologue << "    gl_FragCoord.z = input.dx_Position.z;\n";
        pixelPrologue << "    gl_FragCoord.w = rhw;\n";
    }

    if (pixelBuiltins.glPointCoord.enabled)
    {
        pixelPrologue << "    gl_PointCoord.x = input.gl_PointCoord.x;\n"
                      << "    gl_PointCoord.y = 1.0 - input.gl_PointCoord.y;\n";
    }

    if (fragmentShaderD3D && fragmentShaderD3D->usesFrontFacing)
    {
        pixelPrologue << "    gl_FrontFacing = isFrontFace;\n";
    }

    bool declareSampleID = false;
    if (fragmentShaderD3D && fragmentShaderD3D->usesSampleID)
    {
        declareSampleID = true;
        pixelPrologue << "    gl_SampleID = sampleID;\n";
    }

    if (fragmentShaderD3D && fragmentShaderD3D->usesSamplePosition)
    {
        declareSampleID = true;
        pixelPrologue << "    gl_SamplePosition = GetRenderTargetSamplePosition(sampleID) + 0.5;\n";
    }

    if (fragmentShaderD3D && fragmentShaderD3D->clipDistanceSize)
    {
        ASSERT(vertexBuiltins.glClipDistance.indexOrSize > 0 &&
               vertexBuiltins.glClipDistance.indexOrSize < 9);
        switch (pixelBuiltins.glClipDistance.indexOrSize)
        {
            case 1:
                pixelPrologue << "    (float)gl_ClipDistance = input.gl_ClipDistance0;\n";
                break;
            case 2:
                pixelPrologue << "    (float2)gl_ClipDistance = input.gl_ClipDistance0;\n";
                break;
            case 3:
                pixelPrologue << "    (float3)gl_ClipDistance = input.gl_ClipDistance0;\n";
                break;
            default:
                pixelPrologue << "    (float4)gl_ClipDistance = input.gl_ClipDistance0;\n";
                break;
        }
        switch (pixelBuiltins.glClipDistance.indexOrSize)
        {
            case 5:
                pixelPrologue << "    gl_ClipDistance[4] = input.gl_ClipDistance1;\n";
                break;
            case 6:
                pixelPrologue << "    ((float2[3])gl_ClipDistance)[2] = input.gl_ClipDistance1;\n";
                break;
            case 7:
                pixelPrologue << "    gl_ClipDistance[4] = input.gl_ClipDistance1.x;\n";
                pixelPrologue << "    gl_ClipDistance[5] = input.gl_ClipDistance1.y;\n";
                pixelPrologue << "    gl_ClipDistance[6] = input.gl_ClipDistance1.z;\n";
                break;
            case 8:
                pixelPrologue << "    ((float4[2])gl_ClipDistance)[1] = input.gl_ClipDistance1;\n";
                break;
        }
    }

    if (fragmentShaderD3D && fragmentShaderD3D->cullDistanceSize)
    {
        ASSERT(vertexBuiltins.glCullDistance.indexOrSize > 0 &&
               vertexBuiltins.glCullDistance.indexOrSize < 9);
        switch (pixelBuiltins.glCullDistance.indexOrSize)
        {
            case 1:
                pixelPrologue << "    (float)gl_CullDistance = input.gl_CullDistance0;\n";
                break;
            case 2:
                pixelPrologue << "    (float2)gl_CullDistance = input.gl_CullDistance0;\n";
                break;
            case 3:
                pixelPrologue << "    (float3)gl_CullDistance = input.gl_CullDistance0;\n";
                break;
            default:
                pixelPrologue << "    (float4)gl_CullDistance = input.gl_CullDistance0;\n";
                break;
        }
        switch (pixelBuiltins.glCullDistance.indexOrSize)
        {
            case 5:
                pixelPrologue << "    gl_CullDistance[4] = input.gl_CullDistance1;\n";
                break;
            case 6:
                pixelPrologue << "    ((float2[3])gl_CullDistance)[2] = input.gl_CullDistance1;\n";
                break;
            case 7:
                pixelPrologue << "    gl_CullDistance[4] = input.gl_CullDistance1.x;\n";
                pixelPrologue << "    gl_CullDistance[5] = input.gl_CullDistance1.y;\n";
                pixelPrologue << "    gl_CullDistance[6] = input.gl_CullDistance1.z;\n";
                break;
            case 8:
                pixelPrologue << "    ((float4[2])gl_CullDistance)[1] = input.gl_CullDistance1;\n";
                break;
        }
    }

    bool usesSampleInterpolation = false;
    for (GLuint registerIndex = 0u; registerIndex < registerInfos.size(); ++registerIndex)
    {
        const PackedVaryingRegister &registerInfo = registerInfos[registerIndex];
        const auto &packedVarying                 = *registerInfo.packedVarying;

        // Don't reference VS-only transform feedback varyings in the PS.
        if (packedVarying.vertexOnly())
        {
            continue;
        }

        const auto &varying = *packedVarying.backVarying.varying;
        ASSERT(!varying.isBuiltIn() && !varying.isStruct());

        // Note that we're relying on that the active flag is set according to usage in the fragment
        // shader.
        if (!varying.active)
        {
            continue;
        }

        if (packedVarying.interpolation == sh::InterpolationType::INTERPOLATION_SAMPLE ||
            packedVarying.interpolation ==
                sh::InterpolationType::INTERPOLATION_NOPERSPECTIVE_SAMPLE)
        {
            usesSampleInterpolation = true;
        }

        pixelPrologue << "    ";

        if (packedVarying.isStructField())
        {
            pixelPrologue << DecorateVariable(packedVarying.backVarying.parentStructName) << ".";
        }

        pixelPrologue << DecorateVariable(varying.name);

        if (varying.isArray())
        {
            WriteArrayString(pixelPrologue, registerInfo.varyingArrayIndex);
        }

        GLenum transposedType = TransposeMatrixType(varying.type);
        if (VariableRowCount(transposedType) > 1)
        {
            WriteArrayString(pixelPrologue, registerInfo.varyingRowIndex);
        }

        pixelPrologue << " = input.v" << registerIndex;

        switch (VariableColumnCount(transposedType))
        {
            case 1:
                pixelPrologue << ".x";
                break;
            case 2:
                pixelPrologue << ".xy";
                break;
            case 3:
                pixelPrologue << ".xyz";
                break;
            case 4:
                break;
            default:
                UNREACHABLE();
        }
        pixelPrologue << ";\n";
    }

    if (fragmentShaderD3D && fragmentShaderD3D->usesSampleMaskIn)
    {
        // When per-sample shading is active due to the use of a fragment input qualified
        // by sample or due to the use of the gl_SampleID or gl_SamplePosition variables,
        // only the bit for the current sample is set in gl_SampleMaskIn.
        declareSampleID = declareSampleID || usesSampleInterpolation;
        pixelPrologue << "    gl_SampleMaskIn[0] = "
                      << (declareSampleID ? "1 << sampleID" : "sampleMaskIn") << ";\n";
    }

    if (fragmentShader)
    {
        std::string pixelSource = *fragmentShader->translatedSource;

        std::ostringstream pixelMainParametersStream;
        pixelMainParametersStream << "PS_INPUT input";

        if (fragmentShaderD3D->usesFrontFacing)
        {
            pixelMainParametersStream << ", bool isFrontFace : SV_IsFrontFace";
        }

        if (declareSampleID)
        {
            pixelMainParametersStream << ", uint sampleID : SV_SampleIndex";
        }
        else if (fragmentShaderD3D->usesSampleMaskIn)
        {
            pixelMainParametersStream << ", uint sampleMaskIn : SV_Coverage";
        }

        angle::ReplaceSubstring(&pixelSource, std::string(PIXEL_MAIN_PARAMETERS_STUB_STRING),
                                pixelMainParametersStream.str());

        angle::ReplaceSubstring(&pixelSource, std::string(MAIN_PROLOGUE_STUB_STRING),
                                pixelPrologue.str());
        pixelStream << pixelSource;
    }

    (*shaderHLSL)[gl::ShaderType::Vertex]   = vertexStream.str();
    (*shaderHLSL)[gl::ShaderType::Fragment] = pixelStream.str();
}

// static
std::string DynamicHLSL::GenerateGeometryShaderPreamble(const VaryingPacking &varyingPacking,
                                                        const BuiltinVaryingsD3D &builtinsD3D,
                                                        const bool hasMultiviewEnabled,
                                                        const bool selectViewInVS)
{
    std::ostringstream preambleStream;

    const auto &vertexBuiltins = builtinsD3D[gl::ShaderType::Vertex];

    preambleStream << "struct GS_INPUT\n";
    GenerateVaryingLinkHLSL(varyingPacking, vertexBuiltins, FragDepthUsage::Unused, preambleStream);
    preambleStream << "\n"
                      "struct GS_OUTPUT\n";
    GenerateVaryingLinkHLSL(varyingPacking, builtinsD3D[gl::ShaderType::Geometry],
                            FragDepthUsage::Unused, preambleStream);
    preambleStream
        << "\n"
        << "void copyVertex(inout GS_OUTPUT output, GS_INPUT input, GS_INPUT flatinput)\n"
        << "{\n"
        << "    output.gl_Position = input.gl_Position;\n";

    if (vertexBuiltins.glPointSize.enabled)
    {
        preambleStream << "    output.gl_PointSize = input.gl_PointSize;\n";
    }

    if (hasMultiviewEnabled)
    {
        preambleStream << "    output.gl_ViewID_OVR = input.gl_ViewID_OVR;\n";
        if (selectViewInVS)
        {
            ASSERT(builtinsD3D[gl::ShaderType::Geometry].glLayer.enabled);

            // If the view is already selected in the VS, then we just pass gl_Layer to the output.
            preambleStream << "    output.gl_Layer = input.gl_Layer;\n";
        }
    }

    const auto &registerInfos = varyingPacking.getRegisterList();
    for (GLuint registerIndex = 0u; registerIndex < registerInfos.size(); ++registerIndex)
    {
        const PackedVaryingRegister &varyingRegister = registerInfos[registerIndex];
        preambleStream << "    output.v" << registerIndex << " = ";
        if (varyingRegister.packedVarying->interpolation == sh::INTERPOLATION_FLAT)
        {
            preambleStream << "flat";
        }
        preambleStream << "input.v" << registerIndex << "; \n";
    }

    if (vertexBuiltins.glFragCoord.enabled)
    {
        preambleStream << "    output.gl_FragCoord = input.gl_FragCoord;\n";
    }

    // Only write the dx_Position if we aren't using point sprites
    preambleStream << "#ifndef ANGLE_POINT_SPRITE_SHADER\n"
                   << "    output.dx_Position = input.dx_Position;\n"
                   << "#endif  // ANGLE_POINT_SPRITE_SHADER\n"
                   << "}\n";

    if (hasMultiviewEnabled && !selectViewInVS)
    {
        ASSERT(builtinsD3D[gl::ShaderType::Geometry].glLayer.enabled);

        preambleStream << "\n"
                       << "void selectView(inout GS_OUTPUT output, GS_INPUT input)\n"
                       << "{\n"
                       << "    output.gl_Layer = input.gl_ViewID_OVR;\n"
                       << "}\n";
    }

    return preambleStream.str();
}

// static
std::string DynamicHLSL::GenerateGeometryShaderHLSL(const gl::Caps &caps,
                                                    gl::PrimitiveMode primitiveType,
                                                    const bool useViewScale,
                                                    const bool hasMultiviewEnabled,
                                                    const bool selectViewInVS,
                                                    const bool pointSpriteEmulation,
                                                    const std::string &preambleString)
{
    std::stringstream shaderStream;

    const bool pointSprites = (primitiveType == gl::PrimitiveMode::Points) && pointSpriteEmulation;
    const bool usesPointCoord = preambleString.find("gl_PointCoord") != std::string::npos;

    const char *inputPT  = nullptr;
    const char *outputPT = nullptr;
    int inputSize        = 0;
    int maxVertexOutput  = 0;

    switch (primitiveType)
    {
        case gl::PrimitiveMode::Points:
            inputPT   = "point";
            inputSize = 1;

            if (pointSprites)
            {
                outputPT        = "Triangle";
                maxVertexOutput = 4;
            }
            else
            {
                outputPT        = "Point";
                maxVertexOutput = 1;
            }

            break;

        case gl::PrimitiveMode::Lines:
        case gl::PrimitiveMode::LineStrip:
        case gl::PrimitiveMode::LineLoop:
            inputPT         = "line";
            outputPT        = "Line";
            inputSize       = 2;
            maxVertexOutput = 2;
            break;

        case gl::PrimitiveMode::Triangles:
        case gl::PrimitiveMode::TriangleStrip:
        case gl::PrimitiveMode::TriangleFan:
            inputPT         = "triangle";
            outputPT        = "Triangle";
            inputSize       = 3;
            maxVertexOutput = 3;
            break;

        default:
            UNREACHABLE();
            break;
    }

    if (pointSprites || hasMultiviewEnabled)
    {
        shaderStream << "cbuffer DriverConstants : register(b0)\n"
                        "{\n";

        if (pointSprites)
        {
            shaderStream << "    float4 dx_ViewCoords : packoffset(c1);\n";
            if (useViewScale)
            {
                shaderStream << "    float2 dx_ViewScale : packoffset(c3.z);\n";
            }
        }

        shaderStream << "};\n\n";
    }

    if (pointSprites)
    {
        shaderStream << "#define ANGLE_POINT_SPRITE_SHADER\n"
                        "\n"
                        "static float2 pointSpriteCorners[] = \n"
                        "{\n"
                        "    float2( 0.5f, -0.5f),\n"
                        "    float2( 0.5f,  0.5f),\n"
                        "    float2(-0.5f, -0.5f),\n"
                        "    float2(-0.5f,  0.5f)\n"
                        "};\n"
                        "\n"
                        "static float2 pointSpriteTexcoords[] = \n"
                        "{\n"
                        "    float2(1.0f, 1.0f),\n"
                        "    float2(1.0f, 0.0f),\n"
                        "    float2(0.0f, 1.0f),\n"
                        "    float2(0.0f, 0.0f)\n"
                        "};\n"
                        "\n"
                        "static float minPointSize = "
                     << static_cast<int>(caps.minAliasedPointSize)
                     << ".0f;\n"
                        "static float maxPointSize = "
                     << static_cast<int>(caps.maxAliasedPointSize) << ".0f;\n"
                     << "\n";
    }

    shaderStream << preambleString << "\n"
                 << "[maxvertexcount(" << maxVertexOutput << ")]\n"
                 << "void main(" << inputPT << " GS_INPUT input[" << inputSize << "], ";

    if (primitiveType == gl::PrimitiveMode::TriangleStrip)
    {
        shaderStream << "uint primitiveID : SV_PrimitiveID, ";
    }

    shaderStream << " inout " << outputPT << "Stream<GS_OUTPUT> outStream)\n"
                 << "{\n"
                 << "    GS_OUTPUT output = (GS_OUTPUT)0;\n";

    if (primitiveType == gl::PrimitiveMode::TriangleStrip)
    {
        shaderStream << "    uint lastVertexIndex = (primitiveID % 2 == 0 ? 2 : 1);\n";
    }
    else
    {
        shaderStream << "    uint lastVertexIndex = " << (inputSize - 1) << ";\n";
    }

    for (int vertexIndex = 0; vertexIndex < inputSize; ++vertexIndex)
    {
        shaderStream << "    copyVertex(output, input[" << vertexIndex
                     << "], input[lastVertexIndex]);\n";
        if (hasMultiviewEnabled && !selectViewInVS)
        {
            shaderStream << "   selectView(output, input[" << vertexIndex << "]);\n";
        }
        if (!pointSprites)
        {
            ASSERT(inputSize == maxVertexOutput);
            shaderStream << "    outStream.Append(output);\n";
        }
    }

    if (pointSprites)
    {
        shaderStream << "\n"
                        "    float4 dx_Position = input[0].dx_Position;\n"
                        "    float gl_PointSize = clamp(input[0].gl_PointSize, minPointSize, "
                        "maxPointSize);\n"
                        "    float2 viewportScale = float2(1.0f / dx_ViewCoords.x, 1.0f / "
                        "dx_ViewCoords.y) * dx_Position.w;\n";

        for (int corner = 0; corner < 4; corner++)
        {
            if (useViewScale)
            {
                shaderStream << "    \n"
                                "    output.dx_Position = dx_Position + float4(1.0f, "
                                "-dx_ViewScale.y, 1.0f, 1.0f)"
                                "        * float4(pointSpriteCorners["
                             << corner << "] * viewportScale * gl_PointSize, 0.0f, 0.0f);\n";
            }
            else
            {
                shaderStream << "\n"
                                "    output.dx_Position = dx_Position + float4(pointSpriteCorners["
                             << corner << "] * viewportScale * gl_PointSize, 0.0f, 0.0f);\n";
            }

            if (usesPointCoord)
            {
                shaderStream << "    output.gl_PointCoord = pointSpriteTexcoords[" << corner
                             << "];\n";
            }

            shaderStream << "    outStream.Append(output);\n";
        }
    }

    shaderStream << "    \n"
                    "    outStream.RestartStrip();\n"
                    "}\n";

    return shaderStream.str();
}

// static
void DynamicHLSL::GenerateAttributeConversionHLSL(angle::FormatID vertexFormatID,
                                                  const gl::ProgramInput &shaderAttrib,
                                                  std::ostringstream &outStream)
{
    // Matrix
    if (IsMatrixType(shaderAttrib.getType()))
    {
        outStream << "transpose(input." << DecorateVariable(shaderAttrib.name) << ")";
        return;
    }

    GLenum shaderComponentType           = VariableComponentType(shaderAttrib.getType());
    int shaderComponentCount             = VariableComponentCount(shaderAttrib.getType());
    const gl::VertexFormat &vertexFormat = gl::GetVertexFormatFromID(vertexFormatID);

    // Perform integer to float conversion (if necessary)
    if (shaderComponentType == GL_FLOAT && vertexFormat.type != GL_FLOAT)
    {
        // TODO: normalization for 32-bit integer formats
        ASSERT(!vertexFormat.normalized && !vertexFormat.pureInteger);
        outStream << "float" << shaderComponentCount << "(input."
                  << DecorateVariable(shaderAttrib.name) << ")";
        return;
    }

    // No conversion necessary
    outStream << "input." << DecorateVariable(shaderAttrib.name);
}

// static
void DynamicHLSL::GetPixelShaderOutputKey(RendererD3D *renderer,
                                          const gl::Caps &caps,
                                          const gl::Version &clientVersion,
                                          const gl::ProgramExecutable &executable,
                                          const ProgramD3DMetadata &metadata,
                                          std::vector<PixelShaderOutputVariable> *outPixelShaderKey)
{
    // Two cases when writing to gl_FragColor and using ESSL 1.0:
    // - with a 3.0 context, the output color is copied to channel 0
    // - with a 2.0 context, the output color is broadcast to all channels
    bool broadcast                      = metadata.usesBroadcast(clientVersion);
    const unsigned int numRenderTargets = (broadcast || metadata.usesMultipleFragmentOuts()
                                               ? static_cast<unsigned int>(caps.maxDrawBuffers)
                                               : 1);

    if (!metadata.usesCustomOutVars())
    {
        for (unsigned int renderTargetIndex = 0; renderTargetIndex < numRenderTargets;
             renderTargetIndex++)
        {
            PixelShaderOutputVariable outputKeyVariable;
            outputKeyVariable.type = GL_FLOAT_VEC4;
            outputKeyVariable.name = "gl_Color" + Str(renderTargetIndex);
            outputKeyVariable.source =
                broadcast ? "gl_Color[0]" : "gl_Color[" + Str(renderTargetIndex) + "]";
            outputKeyVariable.outputLocation = renderTargetIndex;

            outPixelShaderKey->push_back(outputKeyVariable);
        }

        if (metadata.usesSecondaryColor())
        {
            for (unsigned int secondaryIndex = 0; secondaryIndex < caps.maxDualSourceDrawBuffers;
                 secondaryIndex++)
            {
                PixelShaderOutputVariable outputKeyVariable;
                outputKeyVariable.type           = GL_FLOAT_VEC4;
                outputKeyVariable.name           = "gl_SecondaryColor" + Str(secondaryIndex);
                outputKeyVariable.source         = "gl_SecondaryColor[" + Str(secondaryIndex) + "]";
                outputKeyVariable.outputLocation = secondaryIndex;
                outputKeyVariable.outputIndex    = 1;

                outPixelShaderKey->push_back(outputKeyVariable);
            }
        }
    }
    else
    {
        const gl::SharedCompiledShaderState &fragmentShader = metadata.getFragmentShader();

        if (!fragmentShader)
        {
            return;
        }

        const auto &shaderOutputVars = fragmentShader->activeOutputVariables;

        for (size_t outputLocationIndex = 0u;
             outputLocationIndex < executable.getOutputLocations().size(); ++outputLocationIndex)
        {
            const VariableLocation &outputLocation =
                executable.getOutputLocations().at(outputLocationIndex);
            if (!outputLocation.used())
            {
                continue;
            }
            const sh::ShaderVariable &outputVariable = shaderOutputVars[outputLocation.index];
            const std::string &variableName          = "out_" + outputVariable.name;

            // Fragment outputs can't be arrays of arrays. ESSL 3.10 section 4.3.6.
            const std::string &elementString =
                (outputVariable.isArray() ? Str(outputLocation.arrayIndex) : "");

            ASSERT(outputVariable.active);

            PixelShaderOutputVariable outputKeyVariable;
            outputKeyVariable.type = outputVariable.type;
            outputKeyVariable.name = variableName + elementString;
            outputKeyVariable.source =
                variableName +
                (outputVariable.isArray() ? ArrayString(outputLocation.arrayIndex) : "");
            outputKeyVariable.outputLocation = outputLocationIndex;

            outPixelShaderKey->push_back(outputKeyVariable);
        }

        // Now generate any secondary outputs...
        for (size_t outputLocationIndex = 0u;
             outputLocationIndex < executable.getSecondaryOutputLocations().size();
             ++outputLocationIndex)
        {
            const VariableLocation &outputLocation =
                executable.getSecondaryOutputLocations().at(outputLocationIndex);
            if (!outputLocation.used())
            {
                continue;
            }
            const sh::ShaderVariable &outputVariable = shaderOutputVars[outputLocation.index];
            const std::string &variableName          = "out_" + outputVariable.name;

            // Fragment outputs can't be arrays of arrays. ESSL 3.10 section 4.3.6.
            const std::string &elementString =
                (outputVariable.isArray() ? Str(outputLocation.arrayIndex) : "");

            ASSERT(outputVariable.active);

            PixelShaderOutputVariable outputKeyVariable;
            outputKeyVariable.type = outputVariable.type;
            outputKeyVariable.name = variableName + elementString;
            outputKeyVariable.source =
                variableName +
                (outputVariable.isArray() ? ArrayString(outputLocation.arrayIndex) : "");
            outputKeyVariable.outputLocation = outputLocationIndex;
            outputKeyVariable.outputIndex    = 1;

            outPixelShaderKey->push_back(outputKeyVariable);
        }
    }
}

// BuiltinVarying Implementation.
BuiltinVarying::BuiltinVarying() : enabled(false), indexOrSize(0), systemValue(false) {}

std::string BuiltinVarying::str() const
{
    return (systemValue ? semantic : (semantic + Str(indexOrSize)));
}

void BuiltinVarying::enableSystem(const std::string &systemValueSemantic)
{
    enabled     = true;
    semantic    = systemValueSemantic;
    systemValue = true;
}

void BuiltinVarying::enableSystem(const std::string &systemValueSemantic, unsigned int sizeVal)
{
    enabled     = true;
    semantic    = systemValueSemantic;
    systemValue = true;
    indexOrSize = sizeVal;
}

void BuiltinVarying::enable(const std::string &semanticVal, unsigned int indexVal)
{
    enabled     = true;
    semantic    = semanticVal;
    indexOrSize = indexVal;
}

// BuiltinVaryingsD3D Implementation.
BuiltinVaryingsD3D::BuiltinVaryingsD3D(const ProgramD3DMetadata &metadata,
                                       const VaryingPacking &packing)
{
    updateBuiltins(gl::ShaderType::Vertex, metadata, packing);
    updateBuiltins(gl::ShaderType::Fragment, metadata, packing);
    updateBuiltins(gl::ShaderType::Geometry, metadata, packing);
    // Some builtins need to be the same in vertex and pixel shaders - input struct needs to be a
    // prefix of output struct.
    ASSERT(mBuiltinInfo[gl::ShaderType::Vertex].glPosition.enabled ==
           mBuiltinInfo[gl::ShaderType::Fragment].glPosition.enabled);
    ASSERT(mBuiltinInfo[gl::ShaderType::Vertex].glFragCoord.enabled ==
           mBuiltinInfo[gl::ShaderType::Fragment].glFragCoord.enabled);
    ASSERT(mBuiltinInfo[gl::ShaderType::Vertex].glPointCoord.enabled ==
           mBuiltinInfo[gl::ShaderType::Fragment].glPointCoord.enabled);
    ASSERT(mBuiltinInfo[gl::ShaderType::Vertex].glPointSize.enabled ==
           mBuiltinInfo[gl::ShaderType::Fragment].glPointSize.enabled);
    ASSERT(mBuiltinInfo[gl::ShaderType::Vertex].glViewIDOVR.enabled ==
           mBuiltinInfo[gl::ShaderType::Fragment].glViewIDOVR.enabled);
}

BuiltinVaryingsD3D::~BuiltinVaryingsD3D() = default;

void BuiltinVaryingsD3D::updateBuiltins(gl::ShaderType shaderType,
                                        const ProgramD3DMetadata &metadata,
                                        const VaryingPacking &packing)
{
    const std::string userSemantic = "TEXCOORD";

    // Note that when enabling builtins only for specific shader stages, the code needs to ensure
    // that the input struct of the shader stage is a prefix of the output struct of the previous
    // stage.

    unsigned int reservedSemanticIndex = packing.getMaxSemanticIndex();

    BuiltinInfo *builtins = &mBuiltinInfo[shaderType];

    builtins->dxPosition.enableSystem("SV_Position");

    if (metadata.usesTransformFeedbackGLPosition())
    {
        builtins->glPosition.enable(userSemantic, reservedSemanticIndex++);
    }

    if (metadata.getClipDistanceArraySize())
    {
        builtins->glClipDistance.enableSystem("SV_ClipDistance",
                                              metadata.getClipDistanceArraySize());
    }

    if (metadata.getCullDistanceArraySize())
    {
        builtins->glCullDistance.enableSystem("SV_CullDistance",
                                              metadata.getCullDistanceArraySize());
    }

    if (metadata.usesFragCoord())
    {
        builtins->glFragCoord.enable(userSemantic, reservedSemanticIndex++);
    }

    if (shaderType == gl::ShaderType::Vertex ? metadata.addsPointCoordToVertexShader()
                                             : metadata.usesPointCoord())
    {
        // In D3D11 we manually compute gl_PointCoord in the GS.
        builtins->glPointCoord.enable(userSemantic, reservedSemanticIndex++);
    }

    if (metadata.hasMultiviewEnabled())
    {
        // Although it is possible to compute gl_ViewID_OVR from the value of
        // SV_RenderTargetArrayIndex, it is easier and cleaner to always pass it as a varying.
        builtins->glViewIDOVR.enable(userSemantic, reservedSemanticIndex++);

        if ((shaderType == gl::ShaderType::Vertex && metadata.canSelectViewInVertexShader()) ||
            shaderType == gl::ShaderType::Geometry)
        {
            builtins->glLayer.enableSystem("SV_RenderTargetArrayIndex");
        }
    }

    if (metadata.usesSystemValuePointSize())
    {
        builtins->glPointSize.enableSystem("PSIZE");
    }
}

}  // namespace rx
