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
|
#pragma once
#include "slang-emit-c-like.h"
#include "slang-extension-tracker.h"
namespace Slang
{
class WGSLSourceEmitter : public CLikeSourceEmitter
{
public:
explicit WGSLSourceEmitter(const Desc& desc);
virtual bool isResourceTypeBindless(IRType* type) SLANG_OVERRIDE
{
SLANG_UNUSED(type);
return true;
}
virtual void emitParameterGroupImpl(IRGlobalParam* varDecl, IRUniformParameterGroupType* type)
SLANG_OVERRIDE;
virtual void emitEntryPointAttributesImpl(
IRFunc* irFunc,
IREntryPointDecoration* entryPointDecor) SLANG_OVERRIDE;
virtual void emitSimpleTypeImpl(IRType* type) SLANG_OVERRIDE;
virtual void emitVectorTypeNameImpl(IRType* elementType, IRIntegerValue elementCount)
SLANG_OVERRIDE;
virtual void emitFuncHeaderImpl(IRFunc* func) SLANG_OVERRIDE;
virtual void emitSimpleValueImpl(IRInst* inst) SLANG_OVERRIDE;
virtual bool tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOuterPrec) SLANG_OVERRIDE;
virtual bool tryEmitInstStmtImpl(IRInst* inst) SLANG_OVERRIDE;
virtual void emitSwitchCaseSelectorsImpl(const SwitchRegion::Case* currentCase, bool isDefault)
SLANG_OVERRIDE;
virtual void emitSimpleTypeAndDeclaratorImpl(IRType* type, DeclaratorInfo* declarator)
SLANG_OVERRIDE;
virtual void emitVarKeywordImpl(IRType* type, IRInst* varDecl) SLANG_OVERRIDE;
virtual void emitDeclaratorImpl(DeclaratorInfo* declarator) SLANG_OVERRIDE;
virtual void emitOperandImpl(IRInst* operand, EmitOpInfo const& outerPrec) SLANG_OVERRIDE;
virtual void emitStructDeclarationSeparatorImpl() SLANG_OVERRIDE;
virtual void emitLayoutQualifiersImpl(IRVarLayout* layout) SLANG_OVERRIDE;
virtual void emitSimpleFuncParamImpl(IRParam* param) SLANG_OVERRIDE;
virtual void emitParamTypeImpl(IRType* type, const String& name) SLANG_OVERRIDE;
virtual void _emitType(IRType* type, DeclaratorInfo* declarator) SLANG_OVERRIDE;
virtual void emitFrontMatterImpl(TargetRequest* targetReq) SLANG_OVERRIDE;
virtual void emitSemanticsPrefixImpl(IRInst* inst) SLANG_OVERRIDE;
virtual void emitStructFieldAttributes(
IRStructType* structType,
IRStructField* field,
bool allowOffsetLayout) SLANG_OVERRIDE;
virtual void emitCallArg(IRInst* inst) SLANG_OVERRIDE;
virtual void emitInterpolationModifiersImpl(
IRInst* varInst,
IRType* valueType,
IRVarLayout* layout) SLANG_OVERRIDE;
virtual void emitIntrinsicCallExprImpl(
IRCall* inst,
UnownedStringSlice intrinsicDefinition,
IRInst* intrinsicInst,
EmitOpInfo const& inOuterPrec) SLANG_OVERRIDE;
virtual void emitGlobalParamDefaultVal(IRGlobalParam* varDecl) SLANG_OVERRIDE;
virtual void emitRequireExtension(IRRequireTargetExtension* inst) SLANG_OVERRIDE;
virtual void handleRequiredCapabilitiesImpl(IRInst* inst) SLANG_OVERRIDE;
void emit(const AddressSpace addressSpace);
virtual bool shouldFoldInstIntoUseSites(IRInst* inst) SLANG_OVERRIDE;
virtual RefObject* getExtensionTracker() SLANG_OVERRIDE { return m_extensionTracker; }
private:
bool maybeEmitSystemSemantic(IRInst* inst);
// Emit the matrix type with 'rowCountWGSL' WGSL-rows and 'colCountWGSL' WGSL-columns
void emitMatrixType(
IRType* const elementType,
const IRIntegerValue& rowCountWGSL,
const IRIntegerValue& colCountWGSL);
const char* getWgslImageFormat(IRTextureTypeBase* type);
void _requireExtension(const UnownedStringSlice& name);
bool m_f16ExtensionEnabled = false;
RefPtr<ShaderExtensionTracker> m_extensionTracker;
};
} // namespace Slang
|