| // |
| // 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. |
| // |
| // StructureHLSL.h: |
| // HLSL translation of GLSL constructors and 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. |
| TString addStructConstructor(const TStructure &structure); |
| TString addBuiltInConstructor(const TType &type, const TIntermSequence *parameters); |
| |
| static TString defineNameless(const TStructure &structure); |
| void ensureStructDefined(const TStructure &structure); |
| |
| std::string structsHeader() const; |
| |
| Std140PaddingHelper getPaddingHelper(); |
| |
| private: |
| unsigned mUniquePaddingCounter; |
| |
| std::map<TString, int> mStd140StructElementIndexes; |
| |
| struct TStructProperties : public angle::NonCopyable |
| { |
| POOL_ALLOCATOR_NEW_DELETE |
| |
| TStructProperties() {} |
| |
| // Constructor is an empty string in case the struct doesn't have a constructor yet. |
| TString constructor; |
| }; |
| |
| // Map from struct name to struct properties. |
| typedef std::map<TString, TStructProperties *> DefinedStructs; |
| DefinedStructs mDefinedStructs; |
| |
| // Struct declarations need to be kept in a vector instead of having them inside mDefinedStructs |
| // since maintaining the original order is necessary for nested structs. |
| typedef std::vector<TString> StructDeclarations; |
| StructDeclarations mStructDeclarations; |
| |
| typedef std::set<TString> BuiltInConstructors; |
| BuiltInConstructors mBuiltInConstructors; |
| |
| void storeStd140ElementIndex(const TStructure &structure, bool useHLSLRowMajorPacking); |
| TString defineQualified(const TStructure &structure, |
| bool useHLSLRowMajorPacking, |
| bool useStd140Packing); |
| DefinedStructs::iterator defineVariants(const TStructure &structure, const TString &name); |
| }; |
| } // namespace sh |
| |
| #endif // COMPILER_TRANSLATOR_STRUCTUREHLSL_H_ |