CGHLSLRuntime.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. template <typename T> class ArrayRef;
  25. }
  26. namespace clang {
  27. class Decl;
  28. class QualType;
  29. class ExtVectorType;
  30. class ASTContext;
  31. class FunctionDecl;
  32. class CallExpr;
  33. class InitListExpr;
  34. class Expr;
  35. class Stmt;
  36. class Attr;
  37. class VarDecl;
  38. class HLSLRootSignatureAttr;
  39. namespace CodeGen {
  40. class CodeGenModule;
  41. class ReturnValueSlot;
  42. class CodeGenFunction;
  43. class RValue;
  44. class LValue;
  45. class CGHLSLRuntime {
  46. protected:
  47. CodeGenModule &CGM;
  48. llvm::SmallVector<llvm::BranchInst*, 16> m_DxBreaks;
  49. public:
  50. CGHLSLRuntime(CodeGenModule &CGM) : CGM(CGM) {}
  51. virtual ~CGHLSLRuntime();
  52. virtual void addResource(Decl *D) = 0;
  53. virtual void addSubobject(Decl *D) = 0;
  54. virtual void FinishCodeGen() = 0;
  55. virtual RValue EmitHLSLBuiltinCallExpr(CodeGenFunction &CGF,
  56. const FunctionDecl *FD,
  57. const CallExpr *E,
  58. ReturnValueSlot ReturnValue) = 0;
  59. // Is E is a c++ init list not a hlsl init list which only match size.
  60. virtual bool IsTrivalInitListExpr(CodeGenFunction &CGF, InitListExpr *E) = 0;
  61. virtual llvm::Value *EmitHLSLInitListExpr(CodeGenFunction &CGF, InitListExpr *E,
  62. // The destPtr when emiting aggregate init, for normal case, it will be null.
  63. llvm::Value *DestPtr) = 0;
  64. virtual llvm::Constant *EmitHLSLConstInitListExpr(CodeGenModule &CGM, InitListExpr *E) = 0;
  65. virtual void EmitHLSLOutParamConversionInit(
  66. CodeGenFunction &CGF, const FunctionDecl *FD, const CallExpr *E,
  67. llvm::SmallVector<LValue, 8> &castArgList,
  68. llvm::SmallVector<const Stmt *, 8> &argList,
  69. const std::function<void(const VarDecl *, llvm::Value *)> &TmpArgMap) = 0;
  70. virtual void EmitHLSLOutParamConversionCopyBack(
  71. CodeGenFunction &CGF, llvm::SmallVector<LValue, 8> &castArgList) = 0;
  72. virtual void MarkRetTemp(CodeGenFunction &CGF, llvm::Value *V,
  73. clang::QualType QaulTy) = 0;
  74. virtual llvm::Value *EmitHLSLMatrixOperationCall(CodeGenFunction &CGF, const clang::Expr *E, llvm::Type *RetType,
  75. llvm::ArrayRef<llvm::Value*> paramList) = 0;
  76. virtual void EmitHLSLDiscard(CodeGenFunction &CGF) = 0;
  77. virtual void EmitHLSLCondBreak(CodeGenFunction &CGF, llvm::Function *F, llvm::BasicBlock *DestBB, llvm::BasicBlock *AltBB) = 0;
  78. // For [] on matrix
  79. virtual llvm::Value *EmitHLSLMatrixSubscript(CodeGenFunction &CGF,
  80. llvm::Type *RetType,
  81. llvm::Value *Ptr, llvm::Value *Idx,
  82. clang::QualType Ty) = 0;
  83. // For ._m on matrix
  84. virtual llvm::Value *EmitHLSLMatrixElement(CodeGenFunction &CGF,
  85. llvm::Type *RetType,
  86. llvm::ArrayRef<llvm::Value*> paramList,
  87. clang::QualType Ty) = 0;
  88. virtual llvm::Value *EmitHLSLMatrixLoad(CodeGenFunction &CGF,
  89. llvm::Value *Ptr,
  90. clang::QualType Ty) = 0;
  91. virtual void EmitHLSLMatrixStore(CodeGenFunction &CGF, llvm::Value *Val,
  92. llvm::Value *DestPtr,
  93. clang::QualType Ty) = 0;
  94. virtual void EmitHLSLAggregateCopy(CodeGenFunction &CGF, llvm::Value *SrcPtr,
  95. llvm::Value *DestPtr,
  96. clang::QualType Ty) = 0;
  97. virtual void EmitHLSLAggregateStore(CodeGenFunction &CGF, llvm::Value *Val,
  98. llvm::Value *DestPtr,
  99. clang::QualType Ty) = 0;
  100. virtual void EmitHLSLFlatConversion(CodeGenFunction &CGF, llvm::Value *Val,
  101. llvm::Value *DestPtr,
  102. clang::QualType Ty, clang::QualType SrcTy) = 0;
  103. virtual void EmitHLSLFlatConversionAggregateCopy(CodeGenFunction &CGF, llvm::Value *SrcPtr,
  104. clang::QualType SrcTy,
  105. llvm::Value *DestPtr,
  106. clang::QualType DestTy) = 0;
  107. virtual void EmitHLSLRootSignature(CodeGenFunction &CGF,
  108. clang::HLSLRootSignatureAttr *RSA,
  109. llvm::Function *Fn) = 0;
  110. virtual llvm::Value *EmitHLSLLiteralCast(CodeGenFunction &CGF, llvm::Value *Src, clang::QualType SrcType,
  111. clang::QualType DstType) = 0;
  112. virtual void AddHLSLFunctionInfo(llvm::Function *, const FunctionDecl *FD) = 0;
  113. virtual void EmitHLSLFunctionProlog(llvm::Function *, const FunctionDecl *FD) = 0;
  114. virtual void AddControlFlowHint(CodeGenFunction &CGF, const Stmt &S, llvm::TerminatorInst *TI, llvm::ArrayRef<const Attr *> Attrs) = 0;
  115. virtual void FinishAutoVar(CodeGenFunction &CGF, const VarDecl &D, llvm::Value *V) = 0;
  116. };
  117. /// Create an instance of a HLSL runtime class.
  118. CGHLSLRuntime *CreateMSHLSLRuntime(CodeGenModule &CGM);
  119. }
  120. }