// // Copyright (c) 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. // // StructureHLSL.h: // Interfaces of methods for HLSL translation of GLSL structures. // #ifndef COMPILER_TRANSLATOR_STRUCTUREHLSL_H_ #define COMPILER_TRANSLATOR_STRUCTUREHLSL_H_ #include "compiler/translator/Common.h" #include "compiler/translator/IntermNode.h" #include <set> class TInfoSinkBase; class TScopeBracket; namespace sh { // This helper class assists structure and interface block definitions in determining // how to pack std140 structs within HLSL's packing rules. class Std140PaddingHelper { public: explicit Std140PaddingHelper(const std::map<TString, int> &structElementIndexes, unsigned int *uniqueCounter); Std140PaddingHelper(const Std140PaddingHelper &other); Std140PaddingHelper &operator=(const Std140PaddingHelper &other); int elementIndex() const { return mElementIndex; } int prePadding(const TType &type); TString prePaddingString(const TType &type); TString postPaddingString(const TType &type, bool useHLSLRowMajorPacking); private: TString next(); unsigned *mPaddingCounter; int mElementIndex; const std::map<TString, int> *mStructElementIndexes; }; class StructureHLSL : angle::NonCopyable { public: StructureHLSL(); // Returns the name of the constructor function. "name" parameter is the name of the type being // constructed. TString addConstructor(const TType &type, const TString &name, const TIntermSequence *parameters); std::string structsHeader() const; TString defineQualified(const TStructure &structure, bool useHLSLRowMajorPacking, bool useStd140Packing); static TString defineNameless(const TStructure &structure); Std140PaddingHelper getPaddingHelper(); private: unsigned mUniquePaddingCounter; std::map<TString, int> mStd140StructElementIndexes; typedef std::set<TString> StructNames; StructNames mStructNames; typedef std::set<TString> Constructors; Constructors mConstructors; typedef std::vector<TString> StructDeclarations; StructDeclarations mStructDeclarations; void storeStd140ElementIndex(const TStructure &structure, bool useHLSLRowMajorPacking); static TString define(const TStructure &structure, bool useHLSLRowMajorPacking, bool useStd140Packing, Std140PaddingHelper *padHelper); }; } #endif // COMPILER_TRANSLATOR_STRUCTUREHLSL_H_