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
14f51639a4d10c6b31a813a8154ed2c489cc7e55f3Jamie Madill#include "angle_gl.h"
1513cfd276d32eec0cf180a96e51c027cce6e9f5f8Jamie Madill
16b1a85f48a6cb63c32e884a9dea86b1ca7275bf7cJamie Madill#include "compiler/translator/IntermNode.h"
176b9cb25980022d0c792d858bc6f6500c00a6c29dJamie Madill#include "compiler/translator/ParseContext.h"
184f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comnamespace sh
204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
21f8f8f362f6c1c9bf9f72c6d094327ed6dc274665daniel@transgaming.comclass UnfoldShortCircuit;
228daaba15060826625bfa8ee6ae5fd21a2a0d70f8Jamie Madillclass StructureHLSL;
23f91ce8117c128d93c7cf931834e367bdfa6892b8Jamie Madillclass UniformHLSL;
24f91ce8117c128d93c7cf931834e367bdfa6892b8Jamie Madill
25f91ce8117c128d93c7cf931834e367bdfa6892b8Jamie Madilltypedef std::map<TString, TIntermSymbol*> ReferencedSymbols;
26b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com
274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comclass OutputHLSL : public TIntermTraverser
284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{
294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com  public:
3054ad4f8174593fe4854a9ef5952d4b02f1a82e35Jamie Madill    OutputHLSL(TParseContext &context, TranslatorHLSL *parentTranslator);
31b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com    ~OutputHLSL();
324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
33950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    void output();
34950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com
35b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com    TInfoSinkBase &getBodyStream();
36b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com
374e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill    const std::map<std::string, unsigned int> &getInterfaceBlockRegisterMap() const;
389fe25e9eaafd8de2e4890cfb926c678ab6e4abb8Jamie Madill    const std::map<std::string, unsigned int> &getUniformRegisterMap() const;
394e1fd41255ab4ce8b2cd745033f385c3e8bd9e7aJamie Madill
40b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com    static TString initializer(const TType &type);
41b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com
42950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com  protected:
434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    void header();
444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
45950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    // Visit AST nodes and output their code to the body stream
464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    void visitSymbol(TIntermSymbol*);
474cfb1e890ac39201145316ad8f3196d456283389Jamie Madill    void visitRaw(TIntermRaw*);
484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    void visitConstantUnion(TIntermConstantUnion*);
494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool visitBinary(Visit visit, TIntermBinary*);
504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool visitUnary(Visit visit, TIntermUnary*);
514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool visitSelection(Visit visit, TIntermSelection*);
524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool visitAggregate(Visit visit, TIntermAggregate*);
534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool visitLoop(Visit visit, TIntermLoop*);
544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com    bool visitBranch(Visit visit, TIntermBranch*);
554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
5644fffeef7176523d4f1cbf01e2c059f74f99764ddaniel@transgaming.com    void traverseStatements(TIntermNode *node);
57b587598cb8771d0da8ed94ddbbd9dc038117ce59daniel@transgaming.com    bool isSingleStatement(TIntermNode *node);
584a35ef2d4d1839d6fa008fd8471ebc25f1d2b665daniel@transgaming.com    bool handleExcessiveLoop(TIntermLoop *node);
5967de6d6c6d33179fd0a8da65b5f629c29095cabbdaniel@transgaming.com    void outputTriplet(Visit visit, const TString &preString, const TString &inString, const TString &postString);
600f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org    void outputLineDirective(int line);
61005c73922fdfeb1593b1e3ffd25f825d883d9c84daniel@transgaming.com    TString argumentString(const TIntermSymbol *symbol);
620b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com    int vectorSize(const TType &type) const;
634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
641af18dc97fe62bd5f9933179b7f79632261ed3d5Nicolas Capens    void outputConstructor(Visit visit, const TType &type, const TString &name, const TIntermSequence *parameters);
65a54da4e5a1e9f987e9ce2f09c03fe0a4c7f3b552daniel@transgaming.com    const ConstantUnion *writeConstantUnion(const TType &type, const ConstantUnion *constUnion);
666369186708281a8e97b1d0e81198a192bc725dd2daniel@transgaming.com
67950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    TParseContext &mContext;
68b73964e328243021db10ecd98e3e124e82522c43shannon.woods@transgaming.com    const ShShaderOutput mOutputType;
69f8f8f362f6c1c9bf9f72c6d094327ed6dc274665daniel@transgaming.com    UnfoldShortCircuit *mUnfoldShortCircuit;
70f9ef107fefddd1778f72ec3de8514c1c330dce97daniel@transgaming.com    bool mInsideFunction;
71950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com
72950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    // Output streams
73950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    TInfoSinkBase mHeader;
74950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    TInfoSinkBase mBody;
75950f993b889937fe22d9481143cdb83cb729b772daniel@transgaming.com    TInfoSinkBase mFooter;
76d91cfe7e3c01a557fb1c0dc8bf0655c8a5b1d34bdaniel@transgaming.com
778803b85f6ea4d2dcc8bf04ce3bbc4d52fd469659daniel@transgaming.com    ReferencedSymbols mReferencedUniforms;
784a643ae4fa6ec736ebe2693552aed80bcc316904shannonwoods@chromium.org    ReferencedSymbols mReferencedInterfaceBlocks;
798803b85f6ea4d2dcc8bf04ce3bbc4d52fd469659daniel@transgaming.com    ReferencedSymbols mReferencedAttributes;
808803b85f6ea4d2dcc8bf04ce3bbc4d52fd469659daniel@transgaming.com    ReferencedSymbols mReferencedVaryings;
8146131a3832c3478c1e0b48dbf6284799f3f86f04Jamie Madill    ReferencedSymbols mReferencedOutputVariables;
8286f7c9df3768b5d2e27be6e0b40c42259038e228daniel@transgaming.com
838daaba15060826625bfa8ee6ae5fd21a2a0d70f8Jamie Madill    StructureHLSL *mStructureHLSL;
84f91ce8117c128d93c7cf931834e367bdfa6892b8Jamie Madill    UniformHLSL *mUniformHLSL;
858daaba15060826625bfa8ee6ae5fd21a2a0d70f8Jamie Madill
86e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens    struct TextureFunction
87e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens    {
8875fb4752d3849b4d5517e4c3e83f8266d327834bNicolas Capens        enum Method
89e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        {
9075fb4752d3849b4d5517e4c3e83f8266d327834bNicolas Capens            IMPLICIT,   // Mipmap LOD determined implicitly (standard lookup)
91e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens            BIAS,
92e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens            LOD,
9375fb4752d3849b4d5517e4c3e83f8266d327834bNicolas Capens            LOD0,
9484cfa1240c5037ff849bcaf7226d0e2a21ce7628Nicolas Capens            LOD0BIAS,
95fc01454b2edbed476b82fb319ae06117b70719f8Nicolas Capens            SIZE,   // textureSize()
96d11d549f84aa5804363c83fe4af8e7ceec140f41Nicolas Capens            FETCH,
97d11d549f84aa5804363c83fe4af8e7ceec140f41Nicolas Capens            GRAD
98e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        };
99e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens
100e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        TBasicType sampler;
101e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        int coords;
102e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        bool proj;
103b1f45b701f20ba4b45484f98fc9e0ca6b6239dd6Nicolas Capens        bool offset;
10475fb4752d3849b4d5517e4c3e83f8266d327834bNicolas Capens        Method method;
105e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens
106e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        TString name() const;
107e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens
108e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens        bool operator<(const TextureFunction &rhs) const;
109e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens    };
110e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens
111e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens    typedef std::set<TextureFunction> TextureFunctionSet;
112e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens
113d91cfe7e3c01a557fb1c0dc8bf0655c8a5b1d34bdaniel@transgaming.com    // Parameters determining what goes in the header output
114e0ba27a28ad621c56f7ce5b514ad0fa2da9ab760Nicolas Capens    TextureFunctionSet mUsesTexture;
115aa8b5cfffb9b4f6d188f712f8e17a23f3707b2d2shannon.woods%transgaming.com@gtempaccount.com    bool mUsesFragColor;
116aa8b5cfffb9b4f6d188f712f8e17a23f3707b2d2shannon.woods%transgaming.com@gtempaccount.com    bool mUsesFragData;
117d7c9810183ab27a3c39f28f38428475f1c0c018ddaniel@transgaming.com    bool mUsesDepthRange;
1184af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    bool mUsesFragCoord;
1194af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    bool mUsesPointCoord;
1204af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    bool mUsesFrontFacing;
1214af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    bool mUsesPointSize;
1222aeb26a4f6e21a923415eb00499795b63a17ef76Jamie Madill    bool mUsesFragDepth;
123d7c9810183ab27a3c39f28f38428475f1c0c018ddaniel@transgaming.com    bool mUsesXor;
124d7c9810183ab27a3c39f28f38428475f1c0c018ddaniel@transgaming.com    bool mUsesMod1;
1254229f59f29b6f9134f07d4880e1573bdd0135773daniel@transgaming.com    bool mUsesMod2v;
1264229f59f29b6f9134f07d4880e1573bdd0135773daniel@transgaming.com    bool mUsesMod2f;
1274229f59f29b6f9134f07d4880e1573bdd0135773daniel@transgaming.com    bool mUsesMod3v;
1284229f59f29b6f9134f07d4880e1573bdd0135773daniel@transgaming.com    bool mUsesMod3f;
1294229f59f29b6f9134f07d4880e1573bdd0135773daniel@transgaming.com    bool mUsesMod4v;
1304229f59f29b6f9134f07d4880e1573bdd0135773daniel@transgaming.com    bool mUsesMod4f;
1310bbb031dc8f797a92efc3dcf758758fde5a9aceedaniel@transgaming.com    bool mUsesFaceforward1;
1320bbb031dc8f797a92efc3dcf758758fde5a9aceedaniel@transgaming.com    bool mUsesFaceforward2;
1330bbb031dc8f797a92efc3dcf758758fde5a9aceedaniel@transgaming.com    bool mUsesFaceforward3;
1340bbb031dc8f797a92efc3dcf758758fde5a9aceedaniel@transgaming.com    bool mUsesFaceforward4;
13535342dc427d7230847e8b06dbb063c5752ddd13fdaniel@transgaming.com    bool mUsesAtan2_1;
13635342dc427d7230847e8b06dbb063c5752ddd13fdaniel@transgaming.com    bool mUsesAtan2_2;
13735342dc427d7230847e8b06dbb063c5752ddd13fdaniel@transgaming.com    bool mUsesAtan2_3;
13835342dc427d7230847e8b06dbb063c5752ddd13fdaniel@transgaming.com    bool mUsesAtan2_4;
1393c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    bool mUsesDiscardRewriting;
140655fe36e254e7f11e79a4fad4febd5d768194c35Nicolas Capens    bool mUsesNestedBreak;
141005c73922fdfeb1593b1e3ffd25f825d883d9c84daniel@transgaming.com
142aa8b5cfffb9b4f6d188f712f8e17a23f3707b2d2shannon.woods%transgaming.com@gtempaccount.com    int mNumRenderTargets;
143aa8b5cfffb9b4f6d188f712f8e17a23f3707b2d2shannon.woods%transgaming.com@gtempaccount.com
144b6ef8f11de1a1c3359aa7c78b82be0dd550b1c5edaniel@transgaming.com    int mUniqueIndex;   // For creating unique names
14589431aa5ad22a82566bdd4f60465d43bc4f5cf13daniel@transgaming.com
14689431aa5ad22a82566bdd4f60465d43bc4f5cf13daniel@transgaming.com    bool mContainsLoopDiscontinuity;
14789431aa5ad22a82566bdd4f60465d43bc4f5cf13daniel@transgaming.com    bool mOutputLod0Function;
148e11100ce03a9555ab59dd8913f0002e41b07965cdaniel@transgaming.com    bool mInsideDiscontinuousLoop;
149655fe36e254e7f11e79a4fad4febd5d768194c35Nicolas Capens    int mNestedLoopDepth;
150e9b3f60a1fce262cb1f94db7f7fe4475b4bbab47daniel@transgaming.com
151e9b3f60a1fce262cb1f94db7f7fe4475b4bbab47daniel@transgaming.com    TIntermSymbol *mExcessiveLoopIndex;
152652468c48502fffb8f25a8dbc97f93ed61498de4daniel@transgaming.com
15398493ddc137922a6ce5c8b22ffde0ed2a1fa2b3dJamie Madill    TString structInitializerString(int indent, const TStructure &structure, const TString &rhsStructName);
154f4d9feff26b463102001c10a3dbd84b7b538d049daniel@transgaming.com
155570e04d8701e37ce3a4ee485afd0f0c4299ff23dJamie Madill    std::map<TIntermTyped*, TString> mFlaggedStructMappedNames;
156570e04d8701e37ce3a4ee485afd0f0c4299ff23dJamie Madill    std::map<TIntermTyped*, TString> mFlaggedStructOriginalNames;
157570e04d8701e37ce3a4ee485afd0f0c4299ff23dJamie Madill
158570e04d8701e37ce3a4ee485afd0f0c4299ff23dJamie Madill    void makeFlaggedStructMaps(const std::vector<TIntermTyped *> &flaggedStructs);
1594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com};
1608daaba15060826625bfa8ee6ae5fd21a2a0d70f8Jamie Madill
1614f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com}
1624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
1634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#endif   // COMPILER_OUTPUTHLSL_H_
164