e5b4c6dff401a10c918f5f79922a28a1d22adf64
[WebKit-https.git] / Source / WebCore / Modules / webgpu / WHLSL / Metal / WHLSLEntryPointScaffolding.h
1 /*
2  * Copyright (C) 2019 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(WEBGPU)
29
30 #include "WHLSLMangledNames.h"
31 #include "WHLSLPipelineDescriptor.h"
32 #include <wtf/HashMap.h>
33 #include <wtf/text/WTFString.h>
34
35 namespace WebCore {
36
37 namespace WHLSL {
38
39 namespace AST {
40
41 class FunctionDefinition;
42
43 }
44
45 struct EntryPointItems;
46 class Intrinsics;
47
48 namespace Metal {
49
50 class TypeNamer;
51
52 class EntryPointScaffolding {
53     WTF_MAKE_FAST_ALLOCATED;
54 public:
55     virtual ~EntryPointScaffolding() = default;
56
57     virtual void emitHelperTypes(StringBuilder&, Indentation<4>) = 0;
58     virtual void emitSignature(StringBuilder&, MangledFunctionName, Indentation<4>) = 0;
59     virtual void emitUnpack(StringBuilder&, Indentation<4>) = 0;
60     virtual void emitPack(StringBuilder&, MangledVariableName existingVariableName, MangledVariableName, Indentation<4>) = 0;
61
62     Vector<MangledVariableName>& parameterVariables() { return m_parameterVariables; }
63
64 protected:
65     EntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName);
66
67     void emitResourceHelperTypes(StringBuilder&, Indentation<4>, ShaderStage);
68
69     enum class IncludePrecedingComma {
70         Yes,
71         No
72     };
73     bool emitResourceSignature(StringBuilder&, IncludePrecedingComma);
74     bool emitBuiltInsSignature(StringBuilder&, IncludePrecedingComma);
75
76     void emitMangledInputPath(StringBuilder&, Vector<String>& path);
77     void emitMangledOutputPath(StringBuilder&, Vector<String>& path);
78     void emitUnpackResourcesAndNamedBuiltIns(StringBuilder&, Indentation<4>);
79
80     AST::FunctionDefinition& m_functionDefinition;
81     Intrinsics& m_intrinsics;
82     TypeNamer& m_typeNamer;
83     EntryPointItems& m_entryPointItems;
84     HashMap<Binding*, size_t>& m_resourceMap;
85     Layout& m_layout;
86     std::function<MangledVariableName()> m_generateNextVariableName;
87
88     struct LengthInformation {
89         MangledStructureElementName elementName;
90         MangledVariableName temporaryName;
91         unsigned index;
92     };
93     struct NamedBinding {
94         MangledStructureElementName elementName;
95         unsigned index;
96         Optional<LengthInformation> lengthInformation;
97     };
98     struct NamedBindGroup {
99         MangledTypeName structName;
100         MangledVariableName variableName;
101         Vector<NamedBinding> namedBindings;
102         unsigned argumentBufferIndex;
103     };
104     Vector<NamedBindGroup> m_namedBindGroups; // Parallel to m_layout
105
106     struct NamedBuiltIn {
107         size_t indexInEntryPointItems;
108         MangledVariableName variableName;
109     };
110     Vector<NamedBuiltIn> m_namedBuiltIns;
111
112     Vector<MangledVariableName> m_parameterVariables;
113 };
114
115 class VertexEntryPointScaffolding final : public EntryPointScaffolding {
116 public:
117     VertexEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<VertexAttribute*, size_t>& matchedVertexAttributes);
118     virtual ~VertexEntryPointScaffolding() = default;
119
120 private:
121     void emitHelperTypes(StringBuilder&, Indentation<4>) override;
122     void emitSignature(StringBuilder&, MangledFunctionName, Indentation<4>) override;
123     void emitUnpack(StringBuilder&, Indentation<4>) override;
124     void emitPack(StringBuilder&, MangledVariableName existingVariableName, MangledVariableName, Indentation<4>) override;
125
126     HashMap<VertexAttribute*, size_t>& m_matchedVertexAttributes;
127     MangledTypeName m_stageInStructName;
128     MangledTypeName m_returnStructName;
129     MangledVariableName m_stageInParameterName;
130
131     struct NamedStageIn {
132         size_t indexInEntryPointItems;
133         MangledStructureElementName elementName;
134         unsigned attributeIndex;
135     };
136     Vector<NamedStageIn> m_namedStageIns;
137
138     struct NamedOutput {
139         MangledStructureElementName elementName;
140         MangledOrNativeTypeName internalTypeName;
141     };
142     Vector<NamedOutput> m_namedOutputs;
143 };
144
145 class FragmentEntryPointScaffolding final : public EntryPointScaffolding {
146 public:
147     FragmentEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<AttachmentDescriptor*, size_t>& matchedColorAttachments);
148     virtual ~FragmentEntryPointScaffolding() = default;
149
150 private:
151     void emitHelperTypes(StringBuilder&, Indentation<4>) override;
152     void emitSignature(StringBuilder&, MangledFunctionName, Indentation<4>) override;
153     void emitUnpack(StringBuilder&, Indentation<4>) override;
154     void emitPack(StringBuilder&, MangledVariableName existingVariableName, MangledVariableName, Indentation<4>) override;
155
156     MangledTypeName m_stageInStructName;
157     MangledTypeName m_returnStructName;
158     MangledVariableName m_stageInParameterName;
159
160     struct NamedStageIn {
161         size_t indexInEntryPointItems;
162         MangledStructureElementName elementName;
163         unsigned attributeIndex;
164     };
165     Vector<NamedStageIn> m_namedStageIns;
166
167     struct NamedOutput {
168         MangledStructureElementName elementName;
169         MangledOrNativeTypeName internalTypeName;
170     };
171     Vector<NamedOutput> m_namedOutputs;
172 };
173
174 class ComputeEntryPointScaffolding final : public EntryPointScaffolding {
175 public:
176     ComputeEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName);
177     virtual ~ComputeEntryPointScaffolding() = default;
178
179 private:
180     void emitHelperTypes(StringBuilder&, Indentation<4>) override;
181     void emitSignature(StringBuilder&, MangledFunctionName, Indentation<4>) override;
182     void emitUnpack(StringBuilder&, Indentation<4>) override;
183     void emitPack(StringBuilder&, MangledVariableName existingVariableName, MangledVariableName, Indentation<4>) override;
184 };
185
186 }
187
188 }
189
190 }
191
192 #endif