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