| // |
| // Copyright 2018 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. |
| // |
| // ShaderStorageBlockOutputHLSL: A traverser to translate a buffer variable of shader storage block |
| // to an offset of RWByteAddressBuffer. |
| // |
| |
| #ifndef COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKOUTPUTHLSL_H_ |
| #define COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKOUTPUTHLSL_H_ |
| |
| #include "compiler/translator/ShaderStorageBlockFunctionHLSL.h" |
| #include "compiler/translator/blocklayout.h" |
| #include "compiler/translator/tree_util/IntermTraverse.h" |
| |
| namespace sh |
| { |
| class ResourcesHLSL; |
| class OutputHLSL; |
| class TSymbolTable; |
| |
| struct TReferencedBlock : angle::NonCopyable |
| { |
| POOL_ALLOCATOR_NEW_DELETE |
| TReferencedBlock(const TInterfaceBlock *block, const TVariable *instanceVariable); |
| const TInterfaceBlock *block; |
| const TVariable *instanceVariable; // May be nullptr if the block is not instanced. |
| }; |
| |
| // Maps from uniqueId to a variable. |
| using ReferencedInterfaceBlocks = std::map<int, const TReferencedBlock *>; |
| |
| // Used to save shader storage block field member information. |
| using BlockMemberInfoMap = std::map<const TField *, BlockMemberInfo>; |
| |
| using ShaderVarToFieldMap = std::map<std::string, const TField *>; |
| |
| class ShaderStorageBlockOutputHLSL : public TIntermTraverser |
| { |
| public: |
| ShaderStorageBlockOutputHLSL(OutputHLSL *outputHLSL, |
| TSymbolTable *symbolTable, |
| ResourcesHLSL *resourcesHLSL, |
| const std::vector<InterfaceBlock> &shaderStorageBlocks); |
| |
| ~ShaderStorageBlockOutputHLSL() override; |
| |
| // This writes part of the function call to store a value to a SSBO to the output stream. After |
| // calling this, ", <stored value>)" should be written to the output stream to complete the |
| // function call. |
| void outputStoreFunctionCallPrefix(TIntermTyped *node); |
| // This writes the function call to load a SSBO value to the output stream. |
| void outputLoadFunctionCall(TIntermTyped *node); |
| // This writes the function call to get the lengh of unsized array member of SSBO. |
| void outputLengthFunctionCall(TIntermTyped *node); |
| // Writes the atomic memory function calls for SSBO. |
| void outputAtomicMemoryFunctionCallPrefix(TIntermTyped *node, TOperator op); |
| |
| void writeShaderStorageBlocksHeader(TInfoSinkBase &out) const; |
| |
| protected: |
| void visitSymbol(TIntermSymbol *) override; |
| void visitConstantUnion(TIntermConstantUnion *) override; |
| bool visitSwizzle(Visit visit, TIntermSwizzle *node) override; |
| bool visitBinary(Visit visit, TIntermBinary *) override; |
| bool visitAggregate(Visit visit, TIntermAggregate *node) override; |
| bool visitTernary(Visit visit, TIntermTernary *) override; |
| bool visitUnary(Visit visit, TIntermUnary *) override; |
| |
| private: |
| void traverseSSBOAccess(TIntermTyped *node, SSBOMethod method); |
| void setMatrixStride(TIntermTyped *node, TLayoutBlockStorage storage, bool rowMajor); |
| bool isEndOfSSBOAccessChain(); |
| void writeEOpIndexDirectOrIndirectOutput(TInfoSinkBase &out, Visit visit, TIntermBinary *node); |
| // Common part in dot operations. |
| void writeDotOperatorOutput(TInfoSinkBase &out, const TField *field); |
| |
| int mMatrixStride; |
| bool mRowMajor; |
| bool mLocationAsTheLastArgument; |
| OutputHLSL *mOutputHLSL; |
| ShaderStorageBlockFunctionHLSL *mSSBOFunctionHLSL; |
| ResourcesHLSL *mResourcesHLSL; |
| ReferencedInterfaceBlocks mReferencedShaderStorageBlocks; |
| |
| BlockMemberInfoMap mBlockMemberInfoMap; |
| const std::vector<InterfaceBlock> &mShaderStorageBlocks; |
| }; |
| } // namespace sh |
| |
| #endif // COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKOUTPUTHLSL_H_ |