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_HLSL_RESOURCESHLSL_H_ 11 #define COMPILER_TRANSLATOR_HLSL_RESOURCESHLSL_H_ 12 13 #include "compiler/translator/hlsl/OutputHLSL.h" 14 #include "compiler/translator/hlsl/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<ShaderVariable> &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( 42 const ReferencedInterfaceBlocks &referencedInterfaceBlocks, 43 const std::map<int, const TInterfaceBlock *> &uniformBlockOptimizedMap); 44 void allocateShaderStorageBlockRegisters( 45 const ReferencedInterfaceBlocks &referencedInterfaceBlocks); 46 TString shaderStorageBlocksHeader(const ReferencedInterfaceBlocks &referencedInterfaceBlocks); 47 48 // Used for direct index references 49 static TString InterfaceBlockInstanceString(const ImmutableString &instanceName, 50 unsigned int arrayIndex); 51 getShaderStorageBlockRegisterMap()52 const std::map<std::string, unsigned int> &getShaderStorageBlockRegisterMap() const 53 { 54 return mShaderStorageBlockRegisterMap; 55 } 56 getUniformBlockRegisterMap()57 const std::map<std::string, unsigned int> &getUniformBlockRegisterMap() const 58 { 59 return mUniformBlockRegisterMap; 60 } 61 getUniformBlockUseStructuredBufferMap()62 const std::map<std::string, bool> &getUniformBlockUseStructuredBufferMap() const 63 { 64 return mUniformBlockUseStructuredBufferMap; 65 } 66 getUniformRegisterMap()67 const std::map<std::string, unsigned int> &getUniformRegisterMap() const 68 { 69 return mUniformRegisterMap; 70 } 71 getReadonlyImage2DRegisterIndex()72 unsigned int getReadonlyImage2DRegisterIndex() const { return mReadonlyImage2DRegisterIndex; } getImage2DRegisterIndex()73 unsigned int getImage2DRegisterIndex() const { return mImage2DRegisterIndex; } hasImages()74 bool hasImages() const { return mReadonlyImageCount > 0 || mImageCount > 0; } 75 76 private: 77 TString uniformBlockString(const TInterfaceBlock &interfaceBlock, 78 const TVariable *instanceVariable, 79 unsigned int registerIndex, 80 unsigned int arrayIndex); 81 TString uniformBlockWithOneLargeArrayMemberString(const TInterfaceBlock &interfaceBlock, 82 const TVariable *instanceVariable, 83 unsigned int registerIndex, 84 unsigned int arrayIndex); 85 86 TString shaderStorageBlockString(const TInterfaceBlock &interfaceBlock, 87 const TVariable *instanceVariable, 88 unsigned int registerIndex, 89 unsigned int arrayIndex); 90 TString uniformBlockMembersString(const TInterfaceBlock &interfaceBlock, 91 TLayoutBlockStorage blockStorage); 92 TString uniformBlockStructString(const TInterfaceBlock &interfaceBlock); 93 const ShaderVariable *findUniformByName(const ImmutableString &name) const; 94 95 void outputHLSL4_0_FL9_3Sampler(TInfoSinkBase &out, 96 const TType &type, 97 const TVariable &variable, 98 const unsigned int registerIndex); 99 void outputUniform(TInfoSinkBase &out, 100 const TType &type, 101 const TVariable &variable, 102 const unsigned int registerIndex); 103 void outputAtomicCounterBuffer(TInfoSinkBase &out, 104 const int binding, 105 const unsigned int registerIndex); 106 107 // Returns the uniform's register index 108 unsigned int assignUniformRegister(const TType &type, 109 const ImmutableString &name, 110 unsigned int *outRegisterCount); 111 unsigned int assignSamplerInStructUniformRegister(const TType &type, 112 const TString &name, 113 unsigned int *outRegisterCount); 114 115 void outputHLSLSamplerUniformGroup( 116 TInfoSinkBase &out, 117 const HLSLTextureGroup textureGroup, 118 const TVector<const TVariable *> &group, 119 const TMap<const TVariable *, TString> &samplerInStructSymbolsToAPINames, 120 unsigned int *groupTextureRegisterIndex); 121 122 void outputHLSLImageUniformIndices(TInfoSinkBase &out, 123 const TVector<const TVariable *> &group, 124 unsigned int imageArrayIndex, 125 unsigned int *groupRegisterCount); 126 void outputHLSLReadonlyImageUniformGroup(TInfoSinkBase &out, 127 const HLSLTextureGroup textureGroup, 128 const TVector<const TVariable *> &group, 129 unsigned int *groupTextureRegisterIndex); 130 void outputHLSLImageUniformGroup(TInfoSinkBase &out, 131 const HLSLRWTextureGroup textureGroup, 132 const TVector<const TVariable *> &group, 133 unsigned int *groupTextureRegisterIndex); 134 135 unsigned int mUniformRegister; 136 unsigned int mUniformBlockRegister; 137 unsigned int mSRVRegister; 138 unsigned int mUAVRegister; 139 unsigned int mSamplerCount; 140 unsigned int mReadonlyImageCount = 0; 141 unsigned int mImageCount = 0; 142 StructureHLSL *mStructureHLSL; 143 ShShaderOutput mOutputType; 144 145 const std::vector<ShaderVariable> &mUniforms; 146 std::map<std::string, unsigned int> mUniformBlockRegisterMap; 147 std::map<std::string, unsigned int> mShaderStorageBlockRegisterMap; 148 std::map<std::string, unsigned int> mUniformRegisterMap; 149 std::map<std::string, bool> mUniformBlockUseStructuredBufferMap; 150 unsigned int mReadonlyImage2DRegisterIndex; 151 unsigned int mImage2DRegisterIndex; 152 }; 153 } // namespace sh 154 155 #endif // COMPILER_TRANSLATOR_HLSL_RESOURCESHLSL_H_ 156