| // |
| // Copyright 2017 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. |
| // |
| // ImageFunctionHLSL: Class for writing implementations of ESSL image functions into HLSL output. |
| // |
| |
| #ifndef COMPILER_TRANSLATOR_IMAGEFUNCTIONHLSL_H_ |
| #define COMPILER_TRANSLATOR_IMAGEFUNCTIONHLSL_H_ |
| |
| #include <set> |
| |
| #include "GLSLANG/ShaderLang.h" |
| #include "compiler/translator/BaseTypes.h" |
| #include "compiler/translator/Common.h" |
| #include "compiler/translator/InfoSink.h" |
| #include "compiler/translator/Types.h" |
| |
| namespace sh |
| { |
| |
| class ImageFunctionHLSL final : angle::NonCopyable |
| { |
| public: |
| // Returns the name of the image function implementation to caller. |
| // The name that's passed in is the name of the GLSL image function that it should implement. |
| ImmutableString useImageFunction(const ImmutableString &name, |
| const TBasicType &type, |
| TLayoutImageInternalFormat imageInternalFormat, |
| bool readonly); |
| |
| void imageFunctionHeader(TInfoSinkBase &out); |
| const std::set<std::string> &getUsedImage2DFunctionNames() const |
| { |
| return mUsedImage2DFunctionNames; |
| } |
| |
| private: |
| struct ImageFunction |
| { |
| // See ESSL 3.10.4 section 8.12 for reference about what the different methods below do. |
| enum class Method |
| { |
| SIZE, |
| LOAD, |
| STORE |
| }; |
| |
| enum class DataType |
| { |
| NONE, |
| FLOAT4, |
| UINT4, |
| INT4, |
| UNORM_FLOAT4, |
| SNORM_FLOAT4 |
| }; |
| |
| ImmutableString name() const; |
| |
| bool operator<(const ImageFunction &rhs) const; |
| |
| DataType getDataType(TLayoutImageInternalFormat format) const; |
| |
| const char *getReturnType() const; |
| |
| TBasicType image; |
| TLayoutImageInternalFormat imageInternalFormat; |
| bool readonly; |
| Method method; |
| DataType type; |
| }; |
| |
| static ImmutableString GetImageReference(TInfoSinkBase &out, |
| const ImageFunctionHLSL::ImageFunction &imageFunction); |
| static void OutputImageFunctionArgumentList( |
| TInfoSinkBase &out, |
| const ImageFunctionHLSL::ImageFunction &imageFunction); |
| static void OutputImageSizeFunctionBody(TInfoSinkBase &out, |
| const ImageFunctionHLSL::ImageFunction &imageFunction, |
| const ImmutableString &imageReference); |
| static void OutputImageLoadFunctionBody(TInfoSinkBase &out, |
| const ImageFunctionHLSL::ImageFunction &imageFunction, |
| const ImmutableString &imageReference); |
| static void OutputImageStoreFunctionBody(TInfoSinkBase &out, |
| const ImageFunctionHLSL::ImageFunction &imageFunction, |
| const ImmutableString &imageReference); |
| using ImageFunctionSet = std::set<ImageFunction>; |
| ImageFunctionSet mUsesImage; |
| std::set<std::string> mUsedImage2DFunctionNames; |
| }; |
| |
| } // namespace sh |
| |
| #endif // COMPILER_TRANSLATOR_IMAGEFUNCTIONHLSL_H_ |