• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2014 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // ResourcesHLSL.h:
7 //   Methods for GLSL to HLSL translation for uniforms and interface blocks.
8 //
9 
10 #ifndef COMPILER_TRANSLATOR_RESOURCESHLSL_H_
11 #define COMPILER_TRANSLATOR_RESOURCESHLSL_H_
12 
13 #include "compiler/translator/OutputHLSL.h"
14 #include "compiler/translator/UtilsHLSL.h"
15 
16 namespace sh
17 {
18 class ImmutableString;
19 class StructureHLSL;
20 class TSymbolTable;
21 
22 class ResourcesHLSL : angle::NonCopyable
23 {
24   public:
25     ResourcesHLSL(StructureHLSL *structureHLSL,
26                   ShShaderOutput outputType,
27                   const std::vector<Uniform> &uniforms,
28                   unsigned int firstUniformRegister);
29 
30     void reserveUniformRegisters(unsigned int registerCount);
31     void reserveUniformBlockRegisters(unsigned int registerCount);
32     void uniformsHeader(TInfoSinkBase &out,
33                         ShShaderOutput outputType,
34                         const ReferencedVariables &referencedUniforms,
35                         TSymbolTable *symbolTable);
36 
37     // Must be called after uniformsHeader
38     void samplerMetadataUniforms(TInfoSinkBase &out, unsigned int regIndex);
getSamplerCount()39     unsigned int getSamplerCount() const { return mSamplerCount; }
40     void imageMetadataUniforms(TInfoSinkBase &out, unsigned int regIndex);
41     TString uniformBlocksHeader(const ReferencedInterfaceBlocks &referencedInterfaceBlocks);
42     TString shaderStorageBlocksHeader(const ReferencedInterfaceBlocks &referencedInterfaceBlocks);
43 
44     // Used for direct index references
45     static TString InterfaceBlockInstanceString(const ImmutableString &instanceName,
46                                                 unsigned int arrayIndex);
47 
getShaderStorageBlockRegisterMap()48     const std::map<std::string, unsigned int> &getShaderStorageBlockRegisterMap() const
49     {
50         return mShaderStorageBlockRegisterMap;
51     }
52 
getUniformBlockRegisterMap()53     const std::map<std::string, unsigned int> &getUniformBlockRegisterMap() const
54     {
55         return mUniformBlockRegisterMap;
56     }
getUniformRegisterMap()57     const std::map<std::string, unsigned int> &getUniformRegisterMap() const
58     {
59         return mUniformRegisterMap;
60     }
61 
getReadonlyImage2DRegisterIndex()62     unsigned int getReadonlyImage2DRegisterIndex() const { return mReadonlyImage2DRegisterIndex; }
getImage2DRegisterIndex()63     unsigned int getImage2DRegisterIndex() const { return mImage2DRegisterIndex; }
64 
65   private:
66     TString uniformBlockString(const TInterfaceBlock &interfaceBlock,
67                                const TVariable *instanceVariable,
68                                unsigned int registerIndex,
69                                unsigned int arrayIndex);
70 
71     TString shaderStorageBlockString(const TInterfaceBlock &interfaceBlock,
72                                      const TVariable *instanceVariable,
73                                      unsigned int registerIndex,
74                                      unsigned int arrayIndex);
75     TString uniformBlockMembersString(const TInterfaceBlock &interfaceBlock,
76                                       TLayoutBlockStorage blockStorage);
77     TString uniformBlockStructString(const TInterfaceBlock &interfaceBlock);
78     const Uniform *findUniformByName(const ImmutableString &name) const;
79 
80     void outputHLSL4_0_FL9_3Sampler(TInfoSinkBase &out,
81                                     const TType &type,
82                                     const TVariable &variable,
83                                     const unsigned int registerIndex);
84     void outputUniform(TInfoSinkBase &out,
85                        const TType &type,
86                        const TVariable &variable,
87                        const unsigned int registerIndex);
88     void outputAtomicCounterBuffer(TInfoSinkBase &out,
89                                    const int binding,
90                                    const unsigned int registerIndex);
91 
92     // Returns the uniform's register index
93     unsigned int assignUniformRegister(const TType &type,
94                                        const ImmutableString &name,
95                                        unsigned int *outRegisterCount);
96     unsigned int assignSamplerInStructUniformRegister(const TType &type,
97                                                       const TString &name,
98                                                       unsigned int *outRegisterCount);
99 
100     void outputHLSLSamplerUniformGroup(
101         TInfoSinkBase &out,
102         const HLSLTextureGroup textureGroup,
103         const TVector<const TVariable *> &group,
104         const TMap<const TVariable *, TString> &samplerInStructSymbolsToAPINames,
105         unsigned int *groupTextureRegisterIndex);
106 
107     void outputHLSLImageUniformIndices(TInfoSinkBase &out,
108                                        const TVector<const TVariable *> &group,
109                                        unsigned int imageArrayIndex,
110                                        unsigned int *groupRegisterCount);
111     void outputHLSLReadonlyImageUniformGroup(TInfoSinkBase &out,
112                                              const HLSLTextureGroup textureGroup,
113                                              const TVector<const TVariable *> &group,
114                                              unsigned int *groupTextureRegisterIndex);
115     void outputHLSLImageUniformGroup(TInfoSinkBase &out,
116                                      const HLSLRWTextureGroup textureGroup,
117                                      const TVector<const TVariable *> &group,
118                                      unsigned int *groupTextureRegisterIndex);
119 
120     unsigned int mUniformRegister;
121     unsigned int mUniformBlockRegister;
122     unsigned int mTextureRegister;
123     unsigned int mUAVRegister;
124     unsigned int mSamplerCount;
125     unsigned int mReadonlyImageCount;
126     unsigned int mImageCount;
127     StructureHLSL *mStructureHLSL;
128     ShShaderOutput mOutputType;
129 
130     const std::vector<Uniform> &mUniforms;
131     std::map<std::string, unsigned int> mUniformBlockRegisterMap;
132     std::map<std::string, unsigned int> mShaderStorageBlockRegisterMap;
133     std::map<std::string, unsigned int> mUniformRegisterMap;
134     unsigned int mReadonlyImage2DRegisterIndex;
135     unsigned int mImage2DRegisterIndex;
136 };
137 }  // namespace sh
138 
139 #endif  // COMPILER_TRANSLATOR_RESOURCESHLSL_H_
140