14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
2b1f45b701f20ba4b45484f98fc9e0ca6b6239dd6Nicolas Capens// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
34f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file.
54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
74f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#ifndef COMPILER_OUTPUTHLSL_H_
84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#define COMPILER_OUTPUTHLSL_H_
94f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
104e89d233e5f83ad7de85f010d8e6e39706ef1830alokp@chromium.org#include <list>
114e89d233e5f83ad7de85f010d8e6e39706ef1830alokp@chromium.org#include <set>
12652468c48502fffb8f25a8dbc97f93ed61498de4daniel@transgaming.com#include <map>
13652468c48502fffb8f25a8dbc97f93ed61498de4daniel@transgaming.com
14f26ddae9acc05461792c8b1b6b35444ddf209de8shannon.woods%transgaming.com@gtempaccount.com#include <GLES3/gl3.h>
15652468c48502fffb8f25a8dbc97f93ed61498de4daniel@transgaming.com#include <GLES2/gl2.h>
164e89d233e5f83ad7de85f010d8e6e39706ef1830alokp@chromium.org
1717732823f9c21bdba9cc51ffaceb545ce3857a8cGeoff Lang#include "compiler/translator/intermediate.h"
186b9cb25980022d0c792d858bc6f6500c00a6c29dJamie Madill#include "compiler/translator/ParseContext.h"
19834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill#include "common/shadervars.h"
204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comnamespace sh
224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
23f8f8f362f6c1c9bf9f72c6d094327ed6dc274665daniel@transgaming.comclass UnfoldShortCircuit;
24b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com
254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comclass OutputHLSL : public TIntermTraverser
264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com  public:
2818b4c4b56a1a31e1b1c9fccf01f1ffd46504ead9shannon.woods%transgaming.com@gtempaccount.com    OutputHLSL(TParseContext &context, const ShBuiltInResources& resources, ShShaderOutput outputType);
29b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com    ~OutputHLSL();
304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
31950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    void output();
32950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com
33b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com    TInfoSinkBase &getBodyStream();
34834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    const std::vector<gl::Uniform> &getUniforms();
35834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    const std::vector<gl::InterfaceBlock> &getInterfaceBlocks() const;
36834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    const std::vector<gl::Attribute> &getOutputVariables() const;
37834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    const std::vector<gl::Attribute> &getAttributes() const;
38834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    const std::vector<gl::Varying> &getVaryings() const;
39b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com
40a2a95e7c9bf6150361a92ba59c3f7cee29daf967daniel@transgaming.com    TString typeString(const TType &type);
41fb256be9650d869c9df366505e11de2af86dbee5shannon.woods@transgaming.com    TString textureString(const TType &type);
42cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens    TString samplerString(const TType &type);
431886fd4f172fb5b2c8e87372ac0de361f14935a5shannon.woods%transgaming.com@gtempaccount.com    TString interpolationString(TQualifier qualifier);
4498493ddc137922a6ce5c8b22ffde0ed2a1fa2b3dJamie Madill    TString structureString(const TStructure &structure, bool useHLSLRowMajorPacking, bool useStd140Packing);
4598493ddc137922a6ce5c8b22ffde0ed2a1fa2b3dJamie Madill    TString structureTypeName(const TStructure &structure, bool useHLSLRowMajorPacking, bool useStd140Packing);
46b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com    static TString qualifierString(TQualifier qualifier);
47b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com    static TString arrayString(const TType &type);
48b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com    static TString initializer(const TType &type);
49c72c6416819435fd34ddc265b2df66f0a4289aa1daniel@transgaming.com    static TString decorate(const TString &string);                      // Prepends an underscore to avoid naming clashes
506575602ea68a323f4255c5c968f94c6830ae68a0apatrick@chromium.org    static TString decorateUniform(const TString &string, const TType &type);
5198493ddc137922a6ce5c8b22ffde0ed2a1fa2b3dJamie Madill    static TString decorateField(const TString &string, const TStructure &structure);
52b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com
53950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com  protected:
544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    void header();
554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
56950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    // Visit AST nodes and output their code to the body stream
574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    void visitSymbol(TIntermSymbol*);
589093114b5502f732727aac41e456d0cfbc092c5aJamie Madill    void visitRaw(TIntermRaw*);
594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    void visitConstantUnion(TIntermConstantUnion*);
604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool visitBinary(Visit visit, TIntermBinary*);
614f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool visitUnary(Visit visit, TIntermUnary*);
624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool visitSelection(Visit visit, TIntermSelection*);
634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool visitAggregate(Visit visit, TIntermAggregate*);
644f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool visitLoop(Visit visit, TIntermLoop*);
654f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool visitBranch(Visit visit, TIntermBranch*);
664f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
6744fffeef7176523d4f1cbf01e2c059f74f99764ddaniel@transgaming.com    void traverseStatements(TIntermNode *node);
68b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com    bool isSingleStatement(TIntermNode *node);
694a35ef2d4d1839d6fa008fd8471ebc25f1d2b665daniel@transgaming.com    bool handleExcessiveLoop(TIntermLoop *node);
7067de6d6c6d33179fd0a8da65b5f629c29095cabbdaniel@transgaming.com    void outputTriplet(Visit visit, const TString &preString, const TString &inString, const TString &postString);
710f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    void outputLineDirective(int line);
72005c73922fdfeb1593b1e3ffd25f825d883d9c84daniel@transgaming.com    TString argumentString(const TIntermSymbol *symbol);
730b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com    int vectorSize(const TType &type) const;
744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
7567de6d6c6d33179fd0a8da65b5f629c29095cabbdaniel@transgaming.com    void addConstructor(const TType &type, const TString &name, const TIntermSequence *parameters);
76a54da4e5a1e9f987e9ce2f09c03fe0a4c7f3b552daniel@transgaming.com    const ConstantUnion *writeConstantUnion(const TType &type, const ConstantUnion *constUnion);
776369186708281a8e97b1d0e81198a192bc725dd2daniel@transgaming.com
78bfa91f47c6fc2fb1853f80319118434c1097086dJamie Madill    TString structNameString(const TStructure &structure);
79a2a95e7c9bf6150361a92ba59c3f7cee29daf967daniel@transgaming.com
80950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    TParseContext &mContext;
81b73964e328243021db10ecd98e3e124e82522c43shannon.woods@transgaming.com    const ShShaderOutput mOutputType;
82f8f8f362f6c1c9bf9f72c6d094327ed6dc274665daniel@transgaming.com    UnfoldShortCircuit *mUnfoldShortCircuit;
83f9ef107fefddd1778f72ec3de8514c1c330dce97daniel@transgaming.com    bool mInsideFunction;
84950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com
85950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    // Output streams
86950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    TInfoSinkBase mHeader;
87950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    TInfoSinkBase mBody;
88950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    TInfoSinkBase mFooter;
89d91cfe7e3c01a557fb1c0dc8bf0655c8a5b1d34bdaniel@transgaming.com
908803b85f6ea4d2dcc8bf04ce3bbc4d52fd469659daniel@transgaming.com    typedef std::map<TString, TIntermSymbol*> ReferencedSymbols;
918803b85f6ea4d2dcc8bf04ce3bbc4d52fd469659daniel@transgaming.com    ReferencedSymbols mReferencedUniforms;
924a643ae4fa6ec736ebe2693552aed80bcc316904shannonwoods@chromium.org    ReferencedSymbols mReferencedInterfaceBlocks;
938803b85f6ea4d2dcc8bf04ce3bbc4d52fd469659daniel@transgaming.com    ReferencedSymbols mReferencedAttributes;
948803b85f6ea4d2dcc8bf04ce3bbc4d52fd469659daniel@transgaming.com    ReferencedSymbols mReferencedVaryings;
9546131a3832c3478c1e0b48dbf6284799f3f86f04Jamie Madill    ReferencedSymbols mReferencedOutputVariables;
9686f7c9df3768b5d2e27be6e0b40c42259038e228daniel@transgaming.com
97e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens    struct TextureFunction
98e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens    {
9975fb4752d3849b4d5517e4c3e83f8266d327834bNicolas Capens        enum Method
100e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        {
10175fb4752d3849b4d5517e4c3e83f8266d327834bNicolas Capens            IMPLICIT,   // Mipmap LOD determined implicitly (standard lookup)
102e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens            BIAS,
103e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens            LOD,
10475fb4752d3849b4d5517e4c3e83f8266d327834bNicolas Capens            LOD0,
10584cfa1240c5037ff849bcaf7226d0e2a21ce7628Nicolas Capens            LOD0BIAS,
106fc01454b2edbed476b82fb319ae06117b70719f8Nicolas Capens            SIZE,   // textureSize()
107d11d549f84aa5804363c83fe4af8e7ceec140f41Nicolas Capens            FETCH,
108d11d549f84aa5804363c83fe4af8e7ceec140f41Nicolas Capens            GRAD
109e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        };
110e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens
111e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        TBasicType sampler;
112e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        int coords;
113e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        bool proj;
114b1f45b701f20ba4b45484f98fc9e0ca6b6239dd6Nicolas Capens        bool offset;
11575fb4752d3849b4d5517e4c3e83f8266d327834bNicolas Capens        Method method;
116e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens
117e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        TString name() const;
118e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens
119e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        bool operator<(const TextureFunction &rhs) const;
120e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens    };
121e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens
122e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens    typedef std::set<TextureFunction> TextureFunctionSet;
123e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens
124d91cfe7e3c01a557fb1c0dc8bf0655c8a5b1d34bdaniel@transgaming.com    // Parameters determining what goes in the header output
125e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens    TextureFunctionSet mUsesTexture;
126aa8b5cfffb9b4f6d188f712f8e17a23f3707b2d2shannon.woods%transgaming.com@gtempaccount.com    bool mUsesFragColor;
127aa8b5cfffb9b4f6d188f712f8e17a23f3707b2d2shannon.woods%transgaming.com@gtempaccount.com    bool mUsesFragData;
128d7c9810183ab27a3c39f28f38428475f1c0c018ddaniel@transgaming.com    bool mUsesDepthRange;
1294af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    bool mUsesFragCoord;
1304af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    bool mUsesPointCoord;
1314af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    bool mUsesFrontFacing;
1324af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    bool mUsesPointSize;
1332aeb26a4f6e21a923415eb00499795b63a17ef76Jamie Madill    bool mUsesFragDepth;
134d7c9810183ab27a3c39f28f38428475f1c0c018ddaniel@transgaming.com    bool mUsesXor;
135d7c9810183ab27a3c39f28f38428475f1c0c018ddaniel@transgaming.com    bool mUsesMod1;
1364229f59f29b6f9134f07d4880e1573bdd0135773daniel@transgaming.com    bool mUsesMod2v;
1374229f59f29b6f9134f07d4880e1573bdd0135773daniel@transgaming.com    bool mUsesMod2f;
1384229f59f29b6f9134f07d4880e1573bdd0135773daniel@transgaming.com    bool mUsesMod3v;
1394229f59f29b6f9134f07d4880e1573bdd0135773daniel@transgaming.com    bool mUsesMod3f;
1404229f59f29b6f9134f07d4880e1573bdd0135773daniel@transgaming.com    bool mUsesMod4v;
1414229f59f29b6f9134f07d4880e1573bdd0135773daniel@transgaming.com    bool mUsesMod4f;
1420bbb031dc8f797a92efc3dcf758758fde5a9aceedaniel@transgaming.com    bool mUsesFaceforward1;
1430bbb031dc8f797a92efc3dcf758758fde5a9aceedaniel@transgaming.com    bool mUsesFaceforward2;
1440bbb031dc8f797a92efc3dcf758758fde5a9aceedaniel@transgaming.com    bool mUsesFaceforward3;
1450bbb031dc8f797a92efc3dcf758758fde5a9aceedaniel@transgaming.com    bool mUsesFaceforward4;
14635342dc427d7230847e8b06dbb063c5752ddd13fdaniel@transgaming.com    bool mUsesAtan2_1;
14735342dc427d7230847e8b06dbb063c5752ddd13fdaniel@transgaming.com    bool mUsesAtan2_2;
14835342dc427d7230847e8b06dbb063c5752ddd13fdaniel@transgaming.com    bool mUsesAtan2_3;
14935342dc427d7230847e8b06dbb063c5752ddd13fdaniel@transgaming.com    bool mUsesAtan2_4;
1503c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    bool mUsesDiscardRewriting;
151655fe36e254e7f11e79a4fad4febd5d768194c35Nicolas Capens    bool mUsesNestedBreak;
152005c73922fdfeb1593b1e3ffd25f825d883d9c84daniel@transgaming.com
153aa8b5cfffb9b4f6d188f712f8e17a23f3707b2d2shannon.woods%transgaming.com@gtempaccount.com    int mNumRenderTargets;
154aa8b5cfffb9b4f6d188f712f8e17a23f3707b2d2shannon.woods%transgaming.com@gtempaccount.com
155a2a95e7c9bf6150361a92ba59c3f7cee29daf967daniel@transgaming.com    typedef std::set<TString> Constructors;
156a2a95e7c9bf6150361a92ba59c3f7cee29daf967daniel@transgaming.com    Constructors mConstructors;
1576369186708281a8e97b1d0e81198a192bc725dd2daniel@transgaming.com
158a2a95e7c9bf6150361a92ba59c3f7cee29daf967daniel@transgaming.com    typedef std::set<TString> StructNames;
159a2a95e7c9bf6150361a92ba59c3f7cee29daf967daniel@transgaming.com    StructNames mStructNames;
1606369186708281a8e97b1d0e81198a192bc725dd2daniel@transgaming.com
161a2a95e7c9bf6150361a92ba59c3f7cee29daf967daniel@transgaming.com    typedef std::list<TString> StructDeclarations;
162a2a95e7c9bf6150361a92ba59c3f7cee29daf967daniel@transgaming.com    StructDeclarations mStructDeclarations;
1636369186708281a8e97b1d0e81198a192bc725dd2daniel@transgaming.com
164b6ef8f11de1a1c3359aa7c78b82be0dd550b1c5edaniel@transgaming.com    int mUniqueIndex;   // For creating unique names
16589431aa5ad22a82566bdd4f60465d43bc4f5cf13daniel@transgaming.com
16689431aa5ad22a82566bdd4f60465d43bc4f5cf13daniel@transgaming.com    bool mContainsLoopDiscontinuity;
16789431aa5ad22a82566bdd4f60465d43bc4f5cf13daniel@transgaming.com    bool mOutputLod0Function;
168e11100ce03a9555ab59dd8913f0002e41b07965cdaniel@transgaming.com    bool mInsideDiscontinuousLoop;
169655fe36e254e7f11e79a4fad4febd5d768194c35Nicolas Capens    int mNestedLoopDepth;
170e9b3f60a1fce262cb1f94db7f7fe4475b4bbab47daniel@transgaming.com
171e9b3f60a1fce262cb1f94db7f7fe4475b4bbab47daniel@transgaming.com    TIntermSymbol *mExcessiveLoopIndex;
172652468c48502fffb8f25a8dbc97f93ed61498de4daniel@transgaming.com
173652468c48502fffb8f25a8dbc97f93ed61498de4daniel@transgaming.com    int mUniformRegister;
1744a643ae4fa6ec736ebe2693552aed80bcc316904shannonwoods@chromium.org    int mInterfaceBlockRegister;
175652468c48502fffb8f25a8dbc97f93ed61498de4daniel@transgaming.com    int mSamplerRegister;
176574d9dd0ad5e9edabd895f5eecaa7e04c06d0e87Jamie Madill    int mPaddingCounter;
177652468c48502fffb8f25a8dbc97f93ed61498de4daniel@transgaming.com
178652468c48502fffb8f25a8dbc97f93ed61498de4daniel@transgaming.com    TString registerString(TIntermSymbol *operand);
179652468c48502fffb8f25a8dbc97f93ed61498de4daniel@transgaming.com    int samplerRegister(TIntermSymbol *sampler);
180652468c48502fffb8f25a8dbc97f93ed61498de4daniel@transgaming.com    int uniformRegister(TIntermSymbol *uniform);
181834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    void declareInterfaceBlockField(const TType &type, const TString &name, std::vector<gl::InterfaceBlockField>& output);
182834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    gl::Uniform declareUniformToList(const TType &type, const TString &name, int registerIndex, std::vector<gl::Uniform>& output);
183f4d9feff26b463102001c10a3dbd84b7b538d049daniel@transgaming.com    void declareUniform(const TType &type, const TString &name, int index);
184834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    void declareVaryingToList(const TType &type, TQualifier baseTypeQualifier, const TString &name, std::vector<gl::Varying>& fieldsOut);
1854430b0d31979d8c3993f8da50c2ca84974ebb1fdshannonwoods@chromium.org
186c2141fb314ecb6aa36861de57b7744649e51ea1bJamie Madill    // Returns the uniform's register index
187c2141fb314ecb6aa36861de57b7744649e51ea1bJamie Madill    int declareUniformAndAssignRegister(const TType &type, const TString &name);
188c2141fb314ecb6aa36861de57b7744649e51ea1bJamie Madill
18998493ddc137922a6ce5c8b22ffde0ed2a1fa2b3dJamie Madill    TString interfaceBlockFieldString(const TInterfaceBlock &interfaceBlock, const TField &field);
190e429ab712f027bb4729a1748c0abe8d971dbca1ashannonwoods@chromium.org    TString decoratePrivate(const TString &privateText);
19198493ddc137922a6ce5c8b22ffde0ed2a1fa2b3dJamie Madill    TString interfaceBlockStructNameString(const TInterfaceBlock &interfaceBlockType);
19298493ddc137922a6ce5c8b22ffde0ed2a1fa2b3dJamie Madill    TString interfaceBlockInstanceString(const TInterfaceBlock& interfaceBlock, unsigned int arrayIndex);
19398493ddc137922a6ce5c8b22ffde0ed2a1fa2b3dJamie Madill    TString interfaceBlockFieldTypeString(const TField &field, TLayoutBlockStorage blockStorage);
19498493ddc137922a6ce5c8b22ffde0ed2a1fa2b3dJamie Madill    TString interfaceBlockFieldString(const TInterfaceBlock &interfaceBlock, TLayoutBlockStorage blockStorage);
19598493ddc137922a6ce5c8b22ffde0ed2a1fa2b3dJamie Madill    TString interfaceBlockStructString(const TInterfaceBlock &interfaceBlock);
19698493ddc137922a6ce5c8b22ffde0ed2a1fa2b3dJamie Madill    TString interfaceBlockString(const TInterfaceBlock &interfaceBlock, unsigned int registerIndex, unsigned int arrayIndex);
197574d9dd0ad5e9edabd895f5eecaa7e04c06d0e87Jamie Madill    TString std140PrePaddingString(const TType &type, int *elementIndex);
198e4075c9c8be9c7b7616dcb60d6453e40e5f87d4aJamie Madill    TString std140PostPaddingString(const TType &type, bool useHLSLRowMajorPacking);
19998493ddc137922a6ce5c8b22ffde0ed2a1fa2b3dJamie Madill    TString structInitializerString(int indent, const TStructure &structure, const TString &rhsStructName);
2006f273e3a08ecbb4e59ae6cd7ea857114464b8e6eshannon.woods%transgaming.com@gtempaccount.com
201f4d9feff26b463102001c10a3dbd84b7b538d049daniel@transgaming.com    static GLenum glVariableType(const TType &type);
202fe3c0ef057a5ba7c6f942c2d399e90efb6a2d81fshannon.woods@transgaming.com    static GLenum glVariablePrecision(const TType &type);
2036f273e3a08ecbb4e59ae6cd7ea857114464b8e6eshannon.woods%transgaming.com@gtempaccount.com    static bool isVaryingIn(TQualifier qualifier);
2046f273e3a08ecbb4e59ae6cd7ea857114464b8e6eshannon.woods%transgaming.com@gtempaccount.com    static bool isVaryingOut(TQualifier qualifier);
2056f273e3a08ecbb4e59ae6cd7ea857114464b8e6eshannon.woods%transgaming.com@gtempaccount.com    static bool isVarying(TQualifier qualifier);
206f4d9feff26b463102001c10a3dbd84b7b538d049daniel@transgaming.com
207834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    std::vector<gl::Uniform> mActiveUniforms;
208834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    std::vector<gl::InterfaceBlock> mActiveInterfaceBlocks;
209834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    std::vector<gl::Attribute> mActiveOutputVariables;
210834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    std::vector<gl::Attribute> mActiveAttributes;
211834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    std::vector<gl::Varying> mActiveVaryings;
212e4075c9c8be9c7b7616dcb60d6453e40e5f87d4aJamie Madill    std::map<TString, int> mStd140StructElementIndexes;
213570e04d8701e37ce3a4ee485afd0f0c4299ff23dJamie Madill    std::map<TIntermTyped*, TString> mFlaggedStructMappedNames;
214570e04d8701e37ce3a4ee485afd0f0c4299ff23dJamie Madill    std::map<TIntermTyped*, TString> mFlaggedStructOriginalNames;
215570e04d8701e37ce3a4ee485afd0f0c4299ff23dJamie Madill
216570e04d8701e37ce3a4ee485afd0f0c4299ff23dJamie Madill    void makeFlaggedStructMaps(const std::vector<TIntermTyped *> &flaggedStructs);
2174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com};
2184f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
2194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
2204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#endif   // COMPILER_OUTPUTHLSL_H_
221