xref: /freebsd-src/contrib/llvm-project/clang/lib/CodeGen/CGHLSLRuntime.h (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
181ad6265SDimitry Andric //===----- CGHLSLRuntime.h - Interface to HLSL Runtimes -----*- C++ -*-===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric //
981ad6265SDimitry Andric // This provides an abstract class for HLSL code generation.  Concrete
1081ad6265SDimitry Andric // subclasses of this implement code generation for specific HLSL
1181ad6265SDimitry Andric // runtime libraries.
1281ad6265SDimitry Andric //
1381ad6265SDimitry Andric //===----------------------------------------------------------------------===//
1481ad6265SDimitry Andric 
1581ad6265SDimitry Andric #ifndef LLVM_CLANG_LIB_CODEGEN_CGHLSLRUNTIME_H
1681ad6265SDimitry Andric #define LLVM_CLANG_LIB_CODEGEN_CGHLSLRUNTIME_H
1781ad6265SDimitry Andric 
18*bdd1243dSDimitry Andric #include "llvm/IR/IRBuilder.h"
19*bdd1243dSDimitry Andric 
20*bdd1243dSDimitry Andric #include "clang/Basic/HLSLRuntime.h"
21*bdd1243dSDimitry Andric 
22*bdd1243dSDimitry Andric #include "llvm/ADT/SmallVector.h"
23*bdd1243dSDimitry Andric #include "llvm/ADT/StringRef.h"
24*bdd1243dSDimitry Andric #include "llvm/Frontend/HLSL/HLSLResource.h"
25*bdd1243dSDimitry Andric 
26*bdd1243dSDimitry Andric #include <optional>
27*bdd1243dSDimitry Andric #include <vector>
28*bdd1243dSDimitry Andric 
29*bdd1243dSDimitry Andric namespace llvm {
30*bdd1243dSDimitry Andric class GlobalVariable;
31*bdd1243dSDimitry Andric class Function;
32*bdd1243dSDimitry Andric class StructType;
33*bdd1243dSDimitry Andric } // namespace llvm
34*bdd1243dSDimitry Andric 
3581ad6265SDimitry Andric namespace clang {
36*bdd1243dSDimitry Andric class VarDecl;
37*bdd1243dSDimitry Andric class ParmVarDecl;
38*bdd1243dSDimitry Andric class HLSLBufferDecl;
39*bdd1243dSDimitry Andric class HLSLResourceBindingAttr;
40*bdd1243dSDimitry Andric class Type;
41*bdd1243dSDimitry Andric class DeclContext;
42*bdd1243dSDimitry Andric 
43*bdd1243dSDimitry Andric class FunctionDecl;
4481ad6265SDimitry Andric 
4581ad6265SDimitry Andric namespace CodeGen {
4681ad6265SDimitry Andric 
4781ad6265SDimitry Andric class CodeGenModule;
4881ad6265SDimitry Andric 
4981ad6265SDimitry Andric class CGHLSLRuntime {
50*bdd1243dSDimitry Andric public:
51*bdd1243dSDimitry Andric   struct BufferResBinding {
52*bdd1243dSDimitry Andric     // The ID like 2 in register(b2, space1).
53*bdd1243dSDimitry Andric     std::optional<unsigned> Reg;
54*bdd1243dSDimitry Andric     // The Space like 1 is register(b2, space1).
55*bdd1243dSDimitry Andric     // Default value is 0.
56*bdd1243dSDimitry Andric     unsigned Space;
57*bdd1243dSDimitry Andric     BufferResBinding(HLSLResourceBindingAttr *Attr);
58*bdd1243dSDimitry Andric   };
59*bdd1243dSDimitry Andric   struct Buffer {
60*bdd1243dSDimitry Andric     Buffer(const HLSLBufferDecl *D);
61*bdd1243dSDimitry Andric     llvm::StringRef Name;
62*bdd1243dSDimitry Andric     // IsCBuffer - Whether the buffer is a cbuffer (and not a tbuffer).
63*bdd1243dSDimitry Andric     bool IsCBuffer;
64*bdd1243dSDimitry Andric     BufferResBinding Binding;
65*bdd1243dSDimitry Andric     // Global variable and offset for each constant.
66*bdd1243dSDimitry Andric     std::vector<std::pair<llvm::GlobalVariable *, unsigned>> Constants;
67*bdd1243dSDimitry Andric     llvm::StructType *LayoutStruct = nullptr;
68*bdd1243dSDimitry Andric   };
69*bdd1243dSDimitry Andric 
7081ad6265SDimitry Andric protected:
7181ad6265SDimitry Andric   CodeGenModule &CGM;
7281ad6265SDimitry Andric 
73*bdd1243dSDimitry Andric   llvm::Value *emitInputSemantic(llvm::IRBuilder<> &B, const ParmVarDecl &D,
74*bdd1243dSDimitry Andric                                  llvm::Type *Ty);
75*bdd1243dSDimitry Andric 
7681ad6265SDimitry Andric public:
7781ad6265SDimitry Andric   CGHLSLRuntime(CodeGenModule &CGM) : CGM(CGM) {}
7881ad6265SDimitry Andric   virtual ~CGHLSLRuntime() {}
7981ad6265SDimitry Andric 
80*bdd1243dSDimitry Andric   void annotateHLSLResource(const VarDecl *D, llvm::GlobalVariable *GV);
81*bdd1243dSDimitry Andric   void generateGlobalCtorDtorCalls();
82*bdd1243dSDimitry Andric 
83*bdd1243dSDimitry Andric   void addBuffer(const HLSLBufferDecl *D);
8481ad6265SDimitry Andric   void finishCodeGen();
85*bdd1243dSDimitry Andric 
86*bdd1243dSDimitry Andric   void setHLSLEntryAttributes(const FunctionDecl *FD, llvm::Function *Fn);
87*bdd1243dSDimitry Andric 
88*bdd1243dSDimitry Andric   void emitEntryFunction(const FunctionDecl *FD, llvm::Function *Fn);
89*bdd1243dSDimitry Andric   void setHLSLFunctionAttributes(llvm::Function *, const FunctionDecl *);
90*bdd1243dSDimitry Andric 
91*bdd1243dSDimitry Andric private:
92*bdd1243dSDimitry Andric   void addBufferResourceAnnotation(llvm::GlobalVariable *GV,
93*bdd1243dSDimitry Andric                                    llvm::StringRef TyName,
94*bdd1243dSDimitry Andric                                    llvm::hlsl::ResourceClass RC,
95*bdd1243dSDimitry Andric                                    llvm::hlsl::ResourceKind RK,
96*bdd1243dSDimitry Andric                                    BufferResBinding &Binding);
97*bdd1243dSDimitry Andric   void addConstant(VarDecl *D, Buffer &CB);
98*bdd1243dSDimitry Andric   void addBufferDecls(const DeclContext *DC, Buffer &CB);
99*bdd1243dSDimitry Andric   llvm::SmallVector<Buffer> Buffers;
10081ad6265SDimitry Andric };
10181ad6265SDimitry Andric 
10281ad6265SDimitry Andric } // namespace CodeGen
10381ad6265SDimitry Andric } // namespace clang
10481ad6265SDimitry Andric 
10581ad6265SDimitry Andric #endif
106