CGHLSLRuntime.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. //===----- CGMSHLSLRuntime.h - Interface to HLSL Runtime ----------------===//
  2. ///////////////////////////////////////////////////////////////////////////////
  3. // //
  4. // CGHLSLRuntime.h //
  5. // Copyright (C) Microsoft Corporation. All rights reserved. //
  6. // This file is distributed under the University of Illinois Open Source //
  7. // License. See LICENSE.TXT for details. //
  8. // //
  9. // This provides a class for HLSL code generation. //
  10. //
  11. ///////////////////////////////////////////////////////////////////////////////
  12. #pragma once
  13. #include <functional>
  14. #include <llvm/ADT/SmallVector.h> // HLSL Change
  15. namespace llvm {
  16. class Function;
  17. class Value;
  18. class Constant;
  19. class TerminatorInst;
  20. class GlobalVariable;
  21. class Type;
  22. class BasicBlock;
  23. class BranchInst;
  24. class SwitchInst;
  25. template <typename T> class ArrayRef;
  26. }
  27. namespace clang {
  28. class Decl;
  29. class QualType;
  30. class ExtVectorType;
  31. class ASTContext;
  32. class FunctionDecl;
  33. class CallExpr;
  34. class InitListExpr;
  35. class Expr;
  36. class Stmt;
  37. class Attr;
  38. class VarDecl;
  39. class HLSLRootSignatureAttr;
  40. namespace CodeGen {
  41. class CodeGenModule;
  42. class ReturnValueSlot;
  43. class CodeGenFunction;
  44. class RValue;
  45. class LValue;
  46. class CGHLSLRuntime {
  47. protected:
  48. CodeGenModule &CGM;
  49. llvm::SmallVector<llvm::BranchInst*, 16> m_DxBreaks;
  50. public:
  51. CGHLSLRuntime(CodeGenModule &CGM) : CGM(CGM) {}
  52. virtual ~CGHLSLRuntime();
  53. virtual void addResource(Decl *D) = 0;
  54. virtual void addSubobject(Decl *D) = 0;
  55. virtual void FinishCodeGen() = 0;
  56. virtual RValue EmitHLSLBuiltinCallExpr(CodeGenFunction &CGF,
  57. const FunctionDecl *FD,
  58. const CallExpr *E,
  59. ReturnValueSlot ReturnValue) = 0;
  60. // Is E is a c++ init list not a hlsl init list which only match size.
  61. virtual bool IsTrivalInitListExpr(CodeGenFunction &CGF, InitListExpr *E) = 0;
  62. virtual llvm::Value *EmitHLSLInitListExpr(CodeGenFunction &CGF, InitListExpr *E,
  63. // The destPtr when emiting aggregate init, for normal case, it will be null.
  64. llvm::Value *DestPtr) = 0;
  65. virtual llvm::Constant *EmitHLSLConstInitListExpr(CodeGenModule &CGM, InitListExpr *E) = 0;
  66. virtual void EmitHLSLOutParamConversionInit(
  67. CodeGenFunction &CGF, const FunctionDecl *FD, const CallExpr *E,
  68. llvm::SmallVector<LValue, 8> &castArgList,
  69. llvm::SmallVector<const Stmt *, 8> &argList,
  70. llvm::SmallVector<LValue, 8> &lifetimeCleanupList,
  71. const std::function<void(const VarDecl *, llvm::Value *)> &TmpArgMap) = 0;
  72. virtual void EmitHLSLOutParamConversionCopyBack(
  73. CodeGenFunction &CGF, llvm::SmallVector<LValue, 8> &castArgList,
  74. llvm::SmallVector<LValue, 8> &lifetimeCleanupList) = 0;
  75. virtual void MarkRetTemp(CodeGenFunction &CGF, llvm::Value *V,
  76. clang::QualType QaulTy) = 0;
  77. virtual void MarkCallArgumentTemp(CodeGenFunction &CGF, llvm::Value *V,
  78. clang::QualType QaulTy) = 0;
  79. virtual llvm::Value *EmitHLSLMatrixOperationCall(CodeGenFunction &CGF, const clang::Expr *E, llvm::Type *RetType,
  80. llvm::ArrayRef<llvm::Value*> paramList) = 0;
  81. virtual void EmitHLSLDiscard(CodeGenFunction &CGF) = 0;
  82. virtual llvm::BranchInst *EmitHLSLCondBreak(CodeGenFunction &CGF, llvm::Function *F, llvm::BasicBlock *DestBB, llvm::BasicBlock *AltBB) = 0;
  83. // For [] on matrix
  84. virtual llvm::Value *EmitHLSLMatrixSubscript(CodeGenFunction &CGF,
  85. llvm::Type *RetType,
  86. llvm::Value *Ptr, llvm::Value *Idx,
  87. clang::QualType Ty) = 0;
  88. // For ._m on matrix
  89. virtual llvm::Value *EmitHLSLMatrixElement(CodeGenFunction &CGF,
  90. llvm::Type *RetType,
  91. llvm::ArrayRef<llvm::Value*> paramList,
  92. clang::QualType Ty) = 0;
  93. virtual llvm::Value *EmitHLSLMatrixLoad(CodeGenFunction &CGF,
  94. llvm::Value *Ptr,
  95. clang::QualType Ty) = 0;
  96. virtual void EmitHLSLMatrixStore(CodeGenFunction &CGF, llvm::Value *Val,
  97. llvm::Value *DestPtr,
  98. clang::QualType Ty) = 0;
  99. virtual void EmitHLSLAggregateCopy(CodeGenFunction &CGF, llvm::Value *SrcPtr,
  100. llvm::Value *DestPtr,
  101. clang::QualType Ty) = 0;
  102. virtual void EmitHLSLAggregateStore(CodeGenFunction &CGF, llvm::Value *Val,
  103. llvm::Value *DestPtr,
  104. clang::QualType Ty) = 0;
  105. virtual void EmitHLSLFlatConversion(CodeGenFunction &CGF, llvm::Value *Val,
  106. llvm::Value *DestPtr,
  107. clang::QualType Ty, clang::QualType SrcTy) = 0;
  108. virtual void EmitHLSLFlatConversionAggregateCopy(CodeGenFunction &CGF, llvm::Value *SrcPtr,
  109. clang::QualType SrcTy,
  110. llvm::Value *DestPtr,
  111. clang::QualType DestTy) = 0;
  112. virtual llvm::Value *EmitHLSLLiteralCast(CodeGenFunction &CGF, llvm::Value *Src, clang::QualType SrcType,
  113. clang::QualType DstType) = 0;
  114. virtual void AddHLSLFunctionInfo(llvm::Function *, const FunctionDecl *FD) = 0;
  115. virtual void EmitHLSLFunctionProlog(llvm::Function *, const FunctionDecl *FD) = 0;
  116. virtual void AddControlFlowHint(CodeGenFunction &CGF, const Stmt &S, llvm::TerminatorInst *TI, llvm::ArrayRef<const Attr *> Attrs) = 0;
  117. virtual void FinishAutoVar(CodeGenFunction &CGF, const VarDecl &D,
  118. llvm::Value *V) = 0;
  119. virtual void MarkIfStmt(CodeGenFunction &CGF, llvm::BasicBlock *endIfBB) = 0;
  120. virtual void MarkSwitchStmt(CodeGenFunction &CGF,
  121. llvm::SwitchInst *switchInst,
  122. llvm::BasicBlock *endSwitch) = 0;
  123. virtual void MarkReturnStmt(CodeGenFunction &CGF,
  124. llvm::BasicBlock *bbWithRet) = 0;
  125. virtual void MarkLoopStmt(CodeGenFunction &CGF,
  126. llvm::BasicBlock *loopContinue,
  127. llvm::BasicBlock *loopExit) = 0;
  128. virtual void MarkScopeEnd(CodeGenFunction &CGF) = 0;
  129. virtual bool NeedHLSLMartrixCastForStoreOp(const clang::Decl* TD,
  130. llvm::SmallVector<llvm::Value*, 16>& IRCallArgs) = 0;
  131. virtual void EmitHLSLMartrixCastForStoreOp(CodeGenFunction& CGF,
  132. llvm::SmallVector<llvm::Value*, 16>& IRCallArgs,
  133. llvm::SmallVector<clang::QualType, 16>& ArgTys) = 0;
  134. };
  135. /// Create an instance of a HLSL runtime class.
  136. CGHLSLRuntime *CreateMSHLSLRuntime(CodeGenModule &CGM);
  137. }
  138. }