1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
// slang-emit-hlsl.h
#ifndef SLANG_EMIT_HLSL_H
#define SLANG_EMIT_HLSL_H
#include "slang-emit-c-like.h"
namespace Slang
{
class HLSLExtensionTracker : public RefObject
{
public:
/// Has any operation been used that requires NVAPI to be included via prelude?
bool m_requiresNVAPI = false;
};
class HLSLSourceEmitter : public CLikeSourceEmitter
{
public:
typedef CLikeSourceEmitter Super;
HLSLSourceEmitter(const Desc& desc)
: Super(desc), m_extensionTracker(new HLSLExtensionTracker)
{
}
virtual RefObject* getExtensionTracker() SLANG_OVERRIDE { return m_extensionTracker; }
const bool* getCachedCapability(CapabilityAtom stage) const
{
return m_capabilityCache.tryGetValue(stage);
}
void addCachedCapability(CapabilityAtom stage, bool value)
{
m_capabilityCache.addIfNotExists(stage, value);
}
protected:
RefPtr<HLSLExtensionTracker> m_extensionTracker;
// Allow caching of capability results for easier lookup.
Dictionary<CapabilityAtom, bool> m_capabilityCache{};
virtual void emitLayoutSemanticsImpl(
IRInst* inst,
char const* uniformSemanticSpelling,
EmitLayoutSemanticOption layoutSemanticOption) SLANG_OVERRIDE;
virtual void emitParameterGroupImpl(IRGlobalParam* varDecl, IRUniformParameterGroupType* type)
SLANG_OVERRIDE;
virtual void emitEntryPointAttributesImpl(
IRFunc* irFunc,
IREntryPointDecoration* entryPointDecor) SLANG_OVERRIDE;
virtual void emitFrontMatterImpl(TargetRequest* targetReq) SLANG_OVERRIDE;
virtual void emitRateQualifiersAndAddressSpaceImpl(IRRate* rate, AddressSpace addressSpace)
SLANG_OVERRIDE;
virtual void emitSemanticsImpl(IRInst* inst, bool allowOffsets) SLANG_OVERRIDE;
virtual void emitSimpleFuncParamImpl(IRParam* param) SLANG_OVERRIDE;
virtual void emitInterpolationModifiersImpl(
IRInst* varInst,
IRType* valueType,
IRVarLayout* layout) SLANG_OVERRIDE;
virtual void emitPackOffsetModifier(
IRInst* varInst,
IRType* valueType,
IRPackOffsetDecoration* decoration) SLANG_OVERRIDE;
virtual void emitMeshShaderModifiersImpl(IRInst* varInst) SLANG_OVERRIDE;
virtual void emitSimpleTypeAndDeclaratorImpl(IRType* type, DeclaratorInfo* declarator)
SLANG_OVERRIDE;
virtual void emitSimpleTypeImpl(IRType* type) SLANG_OVERRIDE;
virtual void emitVectorTypeNameImpl(IRType* elementType, IRIntegerValue elementCount)
SLANG_OVERRIDE;
virtual void emitVarDecorationsImpl(IRInst* varDecl) SLANG_OVERRIDE;
virtual void emitParamTypeModifier(IRType* type) SLANG_OVERRIDE
{
emitMatrixLayoutModifiersImpl(type);
}
virtual bool tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOuterPrec) SLANG_OVERRIDE;
virtual bool tryEmitInstStmtImpl(IRInst* inst) SLANG_OVERRIDE;
virtual void emitSimpleValueImpl(IRInst* inst) SLANG_OVERRIDE;
virtual void emitLoopControlDecorationImpl(IRLoopControlDecoration* decl) SLANG_OVERRIDE;
virtual void emitFuncDecorationImpl(IRDecoration* decoration) SLANG_OVERRIDE;
virtual void emitFuncDecorationsImpl(IRFunc* func) SLANG_OVERRIDE;
virtual void emitSwitchDecorationsImpl(IRSwitch* switchInst) SLANG_OVERRIDE;
virtual void emitIfDecorationsImpl(IRIfElse* ifInst) SLANG_OVERRIDE;
virtual void handleRequiredCapabilitiesImpl(IRInst* inst) SLANG_OVERRIDE;
virtual void emitGlobalInstImpl(IRInst* inst) SLANG_OVERRIDE;
virtual void emitPostKeywordTypeAttributesImpl(IRInst* inst) SLANG_OVERRIDE;
virtual void _emitPrefixTypeAttr(IRAttr* attr) SLANG_OVERRIDE;
// Emit a single `register` semantic, as appropriate for a given resource-type-specific layout
// info Keyword to use in the uniform case (`register` for globals, `packoffset` inside a
// `cbuffer`)
void _emitHLSLRegisterSemantic(
LayoutResourceKind kind,
EmitVarChain* chain,
IRInst* inst,
char const* uniformSemanticSpelling);
// Emit all the `register` semantics that are appropriate for a particular variable layout
void _emitHLSLRegisterSemantics(
EmitVarChain* chain,
IRInst* inst,
char const* uniformSemanticSpelling,
EmitLayoutSemanticOption layoutSemanticOption);
void _emitHLSLRegisterSemantics(
IRVarLayout* varLayout,
IRInst* inst,
char const* uniformSemanticSpelling,
EmitLayoutSemanticOption layoutSemanticOption);
void _emitHLSLParameterGroupFieldLayoutSemantics(EmitVarChain* chain);
void _emitHLSLParameterGroupFieldLayoutSemantics(
IRVarLayout* fieldLayout,
EmitVarChain* inChain);
void _emitHLSLParameterGroup(IRGlobalParam* varDecl, IRUniformParameterGroupType* type);
void _emitHLSLTextureType(IRTextureTypeBase* texType);
void _emitHLSLSubpassInputType(IRSubpassInputType* subpassType);
void _emitHLSLDecorationSingleString(const char* name, IRFunc* entryPoint, IRStringLit* val);
void _emitHLSLDecorationSingleInt(const char* name, IRFunc* entryPoint, IRIntLit* val);
void _emitHLSLDecorationSingleFloat(const char* name, IRFunc* entryPoint, IRFloatLit* val);
void _emitStageAccessSemantic(IRStageAccessDecoration* decoration, const char* name);
};
} // namespace Slang
#endif
|