| // | |
| // 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 ssbo_access_chain to an offset of | |
| // RWByteAddressBuffer. | |
| // //EOpIndexDirectInterfaceBlock | |
| // ssbo_variable := | |
| // | the name of the SSBO | |
| // | the name of a variable in an SSBO backed interface block | |
| // // EOpIndexInDirect | |
| // // EOpIndexDirect | |
| // ssbo_array_indexing := ssbo_access_chain[expr_no_ssbo] | |
| // // EOpIndexDirectStruct | |
| // ssbo_structure_access := ssbo_access_chain.identifier | |
| // ssbo_access_chain := | |
| // | ssbo_variable | |
| // | ssbo_array_indexing | |
| // | ssbo_structure_access | |
| // | |
| #ifndef COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKFUNCTIONHLSL_H_ | |
| #define COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKFUNCTIONHLSL_H_ | |
| #include <set> | |
| #include "compiler/translator/InfoSink.h" | |
| #include "compiler/translator/Types.h" | |
| namespace sh | |
| { | |
| class TIntermSwizzle; | |
| enum class SSBOMethod | |
| { | |
| LOAD, | |
| STORE, | |
| LENGTH, | |
| ATOMIC_ADD, | |
| ATOMIC_MIN, | |
| ATOMIC_MAX, | |
| ATOMIC_AND, | |
| ATOMIC_OR, | |
| ATOMIC_XOR, | |
| ATOMIC_EXCHANGE, | |
| ATOMIC_COMPSWAP | |
| }; | |
| class ShaderStorageBlockFunctionHLSL final : angle::NonCopyable | |
| { | |
| public: | |
| TString registerShaderStorageBlockFunction(const TType &type, | |
| SSBOMethod method, | |
| TLayoutBlockStorage storage, | |
| bool rowMajor, | |
| int matrixStride, | |
| int unsizedArrayStride, | |
| TIntermSwizzle *node); | |
| void shaderStorageBlockFunctionHeader(TInfoSinkBase &out); | |
| private: | |
| struct ShaderStorageBlockFunction | |
| { | |
| bool operator<(const ShaderStorageBlockFunction &rhs) const; | |
| TString functionName; | |
| TString typeString; | |
| SSBOMethod method; | |
| TType type; | |
| bool rowMajor; | |
| int matrixStride; | |
| int unsizedArrayStride; | |
| TVector<int> swizzleOffsets; | |
| bool isDefaultSwizzle; | |
| }; | |
| static void OutputSSBOLoadFunctionBody(TInfoSinkBase &out, | |
| const ShaderStorageBlockFunction &ssboFunction); | |
| static void OutputSSBOStoreFunctionBody(TInfoSinkBase &out, | |
| const ShaderStorageBlockFunction &ssboFunction); | |
| static void OutputSSBOLengthFunctionBody(TInfoSinkBase &out, int unsizedArrayStride); | |
| static void OutputSSBOAtomicMemoryFunctionBody(TInfoSinkBase &out, | |
| const ShaderStorageBlockFunction &ssboFunction); | |
| using ShaderStorageBlockFunctionSet = std::set<ShaderStorageBlockFunction>; | |
| ShaderStorageBlockFunctionSet mRegisteredShaderStorageBlockFunctions; | |
| }; | |
| } // namespace sh | |
| #endif // COMPILER_TRANSLATOR_SHADERSTORAGEBLOCKFUNCTIONHLSL_H_ |