26 class R600TextureIntrinsicsReplacer :
38 void getAdjustmentFromTextureTarget(
unsigned TextureType,
bool hasLOD,
39 unsigned SrcSelect[4],
unsigned CT[4],
40 bool &useShadowVariant) {
52 TEXTURE_SHADOW1D_ARRAY,
53 TEXTURE_SHADOW2D_ARRAY,
56 TEXTURE_2D_ARRAY_MSAA,
58 TEXTURE_SHADOWCUBE_ARRAY
61 switch (TextureType) {
63 useShadowVariant =
false;
70 case TEXTURE_1D_ARRAY:
71 case TEXTURE_2D_ARRAY:
72 case TEXTURE_CUBE_ARRAY:
74 case TEXTURE_2D_ARRAY_MSAA:
75 useShadowVariant =
false;
77 case TEXTURE_SHADOW1D:
78 case TEXTURE_SHADOW2D:
79 case TEXTURE_SHADOWRECT:
80 case TEXTURE_SHADOW1D_ARRAY:
81 case TEXTURE_SHADOW2D_ARRAY:
82 case TEXTURE_SHADOWCUBE:
83 case TEXTURE_SHADOWCUBE_ARRAY:
84 useShadowVariant =
true;
90 if (TextureType == TEXTURE_RECT ||
91 TextureType == TEXTURE_SHADOWRECT) {
96 if (TextureType == TEXTURE_CUBE_ARRAY ||
97 TextureType == TEXTURE_SHADOWCUBE_ARRAY)
100 if (TextureType == TEXTURE_1D_ARRAY ||
101 TextureType == TEXTURE_SHADOW1D_ARRAY) {
102 if (hasLOD && useShadowVariant) {
108 }
else if (TextureType == TEXTURE_2D_ARRAY ||
109 TextureType == TEXTURE_SHADOW2D_ARRAY) {
113 if ((TextureType == TEXTURE_SHADOW1D ||
114 TextureType == TEXTURE_SHADOW2D ||
115 TextureType == TEXTURE_SHADOWRECT ||
116 TextureType == TEXTURE_SHADOW1D_ARRAY) &&
117 !(hasLOD && useShadowVariant))
122 unsigned SrcSelect[4],
Value *Offset[3],
Value *Resource,
123 Value *Sampler,
unsigned CT[4],
Value *Coord) {
132 Value *SwizzledCoord =
133 Builder.CreateShuffleVector(Coord, Coord, SwizzleMask);
158 const char *VanillaInt,
159 const char *ShadowInt) {
164 unsigned TextureType =
167 unsigned SrcSelect[4] = { 0, 1, 2, 3 };
168 unsigned CT[4] = {1, 1, 1, 1};
174 bool useShadowVariant;
176 getAdjustmentFromTextureTarget(TextureType, hasLOD, SrcSelect, CT,
179 ReplaceCallInst(I, FT, useShadowVariant?ShadowInt:VanillaInt, SrcSelect,
180 Offset, ResourceId, SamplerId, CT, Coord);
188 unsigned TextureType =
191 unsigned SrcSelect[4] = { 0, 1, 2, 3 };
192 unsigned CT[4] = {1, 1, 1, 1};
198 bool useShadowVariant;
200 getAdjustmentFromTextureTarget(TextureType,
false, SrcSelect, CT,
203 ReplaceCallInst(I, TexQSign,
"llvm.R600.txf", SrcSelect,
204 Offset, ResourceId, SamplerId, CT, Coord);
208 R600TextureIntrinsicsReplacer():
212 virtual bool doInitialization(
Module &M) {
232 Type *ArgsQType[] = {
248 virtual bool runOnFunction(
Function &F) {
253 virtual const char *getPassName()
const {
254 return "R600 Texture Intrinsics Replacer";
265 if (Name ==
"llvm.AMDGPU.tex") {
266 ReplaceTexIntrinsic(I,
false, TexSign,
"llvm.R600.tex",
"llvm.R600.texc");
269 if (Name ==
"llvm.AMDGPU.txl") {
270 ReplaceTexIntrinsic(I,
true, TexSign,
"llvm.R600.txl",
"llvm.R600.txlc");
273 if (Name ==
"llvm.AMDGPU.txb") {
274 ReplaceTexIntrinsic(I,
true, TexSign,
"llvm.R600.txb",
"llvm.R600.txbc");
277 if (Name ==
"llvm.AMDGPU.txf") {
281 if (Name ==
"llvm.AMDGPU.txq") {
282 ReplaceTexIntrinsic(I,
false, TexQSign,
"llvm.R600.txq",
"llvm.R600.txq");
285 if (Name ==
"llvm.AMDGPU.ddx") {
286 ReplaceTexIntrinsic(I,
false, TexSign,
"llvm.R600.ddx",
"llvm.R600.ddx");
289 if (Name ==
"llvm.AMDGPU.ddy") {
290 ReplaceTexIntrinsic(I,
false, TexSign,
"llvm.R600.ddy",
"llvm.R600.ddy");
302 return new R600TextureIntrinsicsReplacer();
Base class for instruction visitors.
The main container class for the LLVM Intermediate Representation.
enable_if_c<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
Externally visible function.
StringRef getName() const
FunctionPass * createR600TextureIntrinsicsReplacer()
static Type * getFloatTy(LLVMContext &C)
#define llvm_unreachable(msg)
static Constant * get(ArrayRef< Constant * > V)
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
ID
LLVM Calling Convention Representation.
Function does not access memory.
void addFnAttr(Attribute::AttrKind N)
Add function attributes to this function.
static FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
void replaceAllUsesWith(Value *V)
LLVM Constant Representation.
Class for constant integers.
static Constant * get(Type *Ty, uint64_t V, bool isSigned=false)
Function * getCalledFunction() const
Value * getArgOperand(unsigned i) const
static IntegerType * getInt32Ty(LLVMContext &C)
LLVM Value Representation.
static VectorType * get(Type *ElementType, unsigned NumElements)
LLVMContext & getContext() const
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, const Twine &N="", Module *M=0)