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