Hash :
2caf7ffd
Author :
Date :
2020-03-23T12:12:42
Address a TODO for instance uniform block This patch resolves one TODO that Support to translate instance uniform block containing only a large array member to Structured buffer on D3D backend when necessary. Bug: angleproject:4205 Change-Id: If2cd6cf633080820ea33e52269d7d86cd587c9ee Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2114912 Commit-Queue: Xinghua Cao <xinghua.cao@intel.com> Reviewed-by: Jiajia Qin <jiajia.qin@intel.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
//
// Copyright 2014 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.
//
// ResourcesHLSL.h:
// Methods for GLSL to HLSL translation for uniforms and interface blocks.
//
#ifndef COMPILER_TRANSLATOR_RESOURCESHLSL_H_
#define COMPILER_TRANSLATOR_RESOURCESHLSL_H_
#include "compiler/translator/OutputHLSL.h"
#include "compiler/translator/UtilsHLSL.h"
namespace sh
{
class ImmutableString;
class StructureHLSL;
class TSymbolTable;
class ResourcesHLSL : angle::NonCopyable
{
public:
ResourcesHLSL(StructureHLSL *structureHLSL,
ShShaderOutput outputType,
ShCompileOptions compileOptions,
const std::vector<ShaderVariable> &uniforms,
unsigned int firstUniformRegister);
void reserveUniformRegisters(unsigned int registerCount);
void reserveUniformBlockRegisters(unsigned int registerCount);
void uniformsHeader(TInfoSinkBase &out,
ShShaderOutput outputType,
const ReferencedVariables &referencedUniforms,
TSymbolTable *symbolTable);
// Must be called after uniformsHeader
void samplerMetadataUniforms(TInfoSinkBase &out, unsigned int regIndex);
unsigned int getSamplerCount() const { return mSamplerCount; }
void imageMetadataUniforms(TInfoSinkBase &out, unsigned int regIndex);
TString uniformBlocksHeader(const ReferencedInterfaceBlocks &referencedInterfaceBlocks);
TString shaderStorageBlocksHeader(const ReferencedInterfaceBlocks &referencedInterfaceBlocks);
// Used for direct index references
static TString InterfaceBlockInstanceString(const ImmutableString &instanceName,
unsigned int arrayIndex);
const std::map<std::string, unsigned int> &getShaderStorageBlockRegisterMap() const
{
return mShaderStorageBlockRegisterMap;
}
const std::map<std::string, unsigned int> &getUniformBlockRegisterMap() const
{
return mUniformBlockRegisterMap;
}
const std::map<std::string, bool> &getUniformBlockUseStructuredBufferMap() const
{
return mUniformBlockUseStructuredBufferMap;
}
const std::map<std::string, unsigned int> &getUniformRegisterMap() const
{
return mUniformRegisterMap;
}
unsigned int getReadonlyImage2DRegisterIndex() const { return mReadonlyImage2DRegisterIndex; }
unsigned int getImage2DRegisterIndex() const { return mImage2DRegisterIndex; }
bool shouldTranslateUniformBlockToStructuredBuffer(const TInterfaceBlock &interfaceBlock);
private:
TString uniformBlockString(const TInterfaceBlock &interfaceBlock,
const TVariable *instanceVariable,
unsigned int registerIndex,
unsigned int arrayIndex);
TString uniformBlockWithOneLargeArrayMemberString(const TInterfaceBlock &interfaceBlock,
const TVariable *instanceVariable,
unsigned int registerIndex,
unsigned int arrayIndex);
TString shaderStorageBlockString(const TInterfaceBlock &interfaceBlock,
const TVariable *instanceVariable,
unsigned int registerIndex,
unsigned int arrayIndex);
TString uniformBlockMembersString(const TInterfaceBlock &interfaceBlock,
TLayoutBlockStorage blockStorage);
TString uniformBlockStructString(const TInterfaceBlock &interfaceBlock);
const ShaderVariable *findUniformByName(const ImmutableString &name) const;
void outputHLSL4_0_FL9_3Sampler(TInfoSinkBase &out,
const TType &type,
const TVariable &variable,
const unsigned int registerIndex);
void outputUniform(TInfoSinkBase &out,
const TType &type,
const TVariable &variable,
const unsigned int registerIndex);
void outputAtomicCounterBuffer(TInfoSinkBase &out,
const int binding,
const unsigned int registerIndex);
// Returns the uniform's register index
unsigned int assignUniformRegister(const TType &type,
const ImmutableString &name,
unsigned int *outRegisterCount);
unsigned int assignSamplerInStructUniformRegister(const TType &type,
const TString &name,
unsigned int *outRegisterCount);
void outputHLSLSamplerUniformGroup(
TInfoSinkBase &out,
const HLSLTextureGroup textureGroup,
const TVector<const TVariable *> &group,
const TMap<const TVariable *, TString> &samplerInStructSymbolsToAPINames,
unsigned int *groupTextureRegisterIndex);
void outputHLSLImageUniformIndices(TInfoSinkBase &out,
const TVector<const TVariable *> &group,
unsigned int imageArrayIndex,
unsigned int *groupRegisterCount);
void outputHLSLReadonlyImageUniformGroup(TInfoSinkBase &out,
const HLSLTextureGroup textureGroup,
const TVector<const TVariable *> &group,
unsigned int *groupTextureRegisterIndex);
void outputHLSLImageUniformGroup(TInfoSinkBase &out,
const HLSLRWTextureGroup textureGroup,
const TVector<const TVariable *> &group,
unsigned int *groupTextureRegisterIndex);
unsigned int mUniformRegister;
unsigned int mUniformBlockRegister;
unsigned int mSRVRegister;
unsigned int mUAVRegister;
unsigned int mSamplerCount;
unsigned int mReadonlyImageCount;
unsigned int mImageCount;
StructureHLSL *mStructureHLSL;
ShShaderOutput mOutputType;
ShCompileOptions mCompileOptions;
const std::vector<ShaderVariable> &mUniforms;
std::map<std::string, unsigned int> mUniformBlockRegisterMap;
std::map<std::string, unsigned int> mShaderStorageBlockRegisterMap;
std::map<std::string, unsigned int> mUniformRegisterMap;
std::map<std::string, bool> mUniformBlockUseStructuredBufferMap;
unsigned int mReadonlyImage2DRegisterIndex;
unsigned int mImage2DRegisterIndex;
};
} // namespace sh
#endif // COMPILER_TRANSLATOR_RESOURCESHLSL_H_