xref: /freebsd-src/contrib/llvm-project/clang/lib/CodeGen/CGHLSLRuntime.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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 
18bdd1243dSDimitry Andric #include "llvm/IR/IRBuilder.h"
19bdd1243dSDimitry Andric 
20bdd1243dSDimitry Andric #include "clang/Basic/HLSLRuntime.h"
21bdd1243dSDimitry Andric 
22bdd1243dSDimitry Andric #include "llvm/ADT/SmallVector.h"
23bdd1243dSDimitry Andric #include "llvm/ADT/StringRef.h"
24bdd1243dSDimitry Andric #include "llvm/Frontend/HLSL/HLSLResource.h"
25bdd1243dSDimitry Andric 
26bdd1243dSDimitry Andric #include <optional>
27bdd1243dSDimitry Andric #include <vector>
28bdd1243dSDimitry Andric 
29bdd1243dSDimitry Andric namespace llvm {
30bdd1243dSDimitry Andric class GlobalVariable;
31bdd1243dSDimitry Andric class Function;
32bdd1243dSDimitry Andric class StructType;
33bdd1243dSDimitry Andric } // namespace llvm
34bdd1243dSDimitry Andric 
3581ad6265SDimitry Andric namespace clang {
36bdd1243dSDimitry Andric class VarDecl;
37bdd1243dSDimitry Andric class ParmVarDecl;
38bdd1243dSDimitry Andric class HLSLBufferDecl;
39bdd1243dSDimitry Andric class HLSLResourceBindingAttr;
40bdd1243dSDimitry Andric class Type;
41bdd1243dSDimitry Andric class DeclContext;
42bdd1243dSDimitry Andric 
43bdd1243dSDimitry Andric class FunctionDecl;
4481ad6265SDimitry Andric 
4581ad6265SDimitry Andric namespace CodeGen {
4681ad6265SDimitry Andric 
4781ad6265SDimitry Andric class CodeGenModule;
4881ad6265SDimitry Andric 
4981ad6265SDimitry Andric class CGHLSLRuntime {
50bdd1243dSDimitry Andric public:
51bdd1243dSDimitry Andric   struct BufferResBinding {
52bdd1243dSDimitry Andric     // The ID like 2 in register(b2, space1).
53bdd1243dSDimitry Andric     std::optional<unsigned> Reg;
54bdd1243dSDimitry Andric     // The Space like 1 is register(b2, space1).
55bdd1243dSDimitry Andric     // Default value is 0.
56bdd1243dSDimitry Andric     unsigned Space;
57bdd1243dSDimitry Andric     BufferResBinding(HLSLResourceBindingAttr *Attr);
58bdd1243dSDimitry Andric   };
59bdd1243dSDimitry Andric   struct Buffer {
60bdd1243dSDimitry Andric     Buffer(const HLSLBufferDecl *D);
61bdd1243dSDimitry Andric     llvm::StringRef Name;
62bdd1243dSDimitry Andric     // IsCBuffer - Whether the buffer is a cbuffer (and not a tbuffer).
63bdd1243dSDimitry Andric     bool IsCBuffer;
64bdd1243dSDimitry Andric     BufferResBinding Binding;
65bdd1243dSDimitry Andric     // Global variable and offset for each constant.
66bdd1243dSDimitry Andric     std::vector<std::pair<llvm::GlobalVariable *, unsigned>> Constants;
67bdd1243dSDimitry Andric     llvm::StructType *LayoutStruct = nullptr;
68bdd1243dSDimitry Andric   };
69bdd1243dSDimitry Andric 
7081ad6265SDimitry Andric protected:
7181ad6265SDimitry Andric   CodeGenModule &CGM;
7281ad6265SDimitry Andric 
73bdd1243dSDimitry Andric   llvm::Value *emitInputSemantic(llvm::IRBuilder<> &B, const ParmVarDecl &D,
74bdd1243dSDimitry Andric                                  llvm::Type *Ty);
75bdd1243dSDimitry Andric 
7681ad6265SDimitry Andric public:
7781ad6265SDimitry Andric   CGHLSLRuntime(CodeGenModule &CGM) : CGM(CGM) {}
7881ad6265SDimitry Andric   virtual ~CGHLSLRuntime() {}
7981ad6265SDimitry Andric 
80bdd1243dSDimitry Andric   void annotateHLSLResource(const VarDecl *D, llvm::GlobalVariable *GV);
81bdd1243dSDimitry Andric   void generateGlobalCtorDtorCalls();
82bdd1243dSDimitry Andric 
83bdd1243dSDimitry Andric   void addBuffer(const HLSLBufferDecl *D);
8481ad6265SDimitry Andric   void finishCodeGen();
85bdd1243dSDimitry Andric 
86bdd1243dSDimitry Andric   void setHLSLEntryAttributes(const FunctionDecl *FD, llvm::Function *Fn);
87bdd1243dSDimitry Andric 
88bdd1243dSDimitry Andric   void emitEntryFunction(const FunctionDecl *FD, llvm::Function *Fn);
89bdd1243dSDimitry Andric   void setHLSLFunctionAttributes(llvm::Function *, const FunctionDecl *);
90bdd1243dSDimitry Andric 
91bdd1243dSDimitry Andric private:
92bdd1243dSDimitry Andric   void addBufferResourceAnnotation(llvm::GlobalVariable *GV,
93bdd1243dSDimitry Andric                                    llvm::StringRef TyName,
94bdd1243dSDimitry Andric                                    llvm::hlsl::ResourceClass RC,
95*5f757f3fSDimitry Andric                                    llvm::hlsl::ResourceKind RK, bool IsROV,
96bdd1243dSDimitry Andric                                    BufferResBinding &Binding);
97bdd1243dSDimitry Andric   void addConstant(VarDecl *D, Buffer &CB);
98bdd1243dSDimitry Andric   void addBufferDecls(const DeclContext *DC, Buffer &CB);
99bdd1243dSDimitry Andric   llvm::SmallVector<Buffer> Buffers;
10081ad6265SDimitry Andric };
10181ad6265SDimitry Andric 
10281ad6265SDimitry Andric } // namespace CodeGen
10381ad6265SDimitry Andric } // namespace clang
10481ad6265SDimitry Andric 
10581ad6265SDimitry Andric #endif
106