Mangled WHLSL names don't need to allocate Strings
[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 public:
54     virtual ~EntryPointScaffolding() = default;
55
56     virtual String helperTypes() = 0;
57     virtual String signature(MangledFunctionName) = 0;
58     virtual String unpack() = 0;
59     virtual String pack(MangledVariableName existingVariableName, MangledVariableName) = 0;
60
61     Vector<MangledVariableName>& parameterVariables() { return m_parameterVariables; }
62
63 protected:
64     EntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName);
65
66     String resourceHelperTypes();
67     Optional<String> resourceSignature();
68     Optional<String> builtInsSignature();
69
70     String mangledInputPath(Vector<String>& path);
71     String mangledOutputPath(Vector<String>& path);
72     String unpackResourcesAndNamedBuiltIns();
73
74     AST::FunctionDefinition& m_functionDefinition;
75     Intrinsics& m_intrinsics;
76     TypeNamer& m_typeNamer;
77     EntryPointItems& m_entryPointItems;
78     HashMap<Binding*, size_t>& m_resourceMap;
79     Layout& m_layout;
80     std::function<MangledVariableName()> m_generateNextVariableName;
81
82     struct LengthInformation {
83         MangledStructureElementName elementName;
84         MangledVariableName temporaryName;
85         unsigned index;
86     };
87     struct NamedBinding {
88         MangledStructureElementName elementName;
89         unsigned index;
90         Optional<LengthInformation> lengthInformation;
91     };
92     struct NamedBindGroup {
93         MangledTypeName structName;
94         MangledVariableName variableName;
95         Vector<NamedBinding> namedBindings;
96         unsigned argumentBufferIndex;
97     };
98     Vector<NamedBindGroup> m_namedBindGroups; // Parallel to m_layout
99
100     struct NamedBuiltIn {
101         size_t indexInEntryPointItems;
102         MangledVariableName variableName;
103     };
104     Vector<NamedBuiltIn> m_namedBuiltIns;
105
106     Vector<MangledVariableName> m_parameterVariables;
107 };
108
109 class VertexEntryPointScaffolding : public EntryPointScaffolding {
110 public:
111     VertexEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<VertexAttribute*, size_t>& matchedVertexAttributes);
112     virtual ~VertexEntryPointScaffolding() = default;
113
114     String helperTypes() override;
115     String signature(MangledFunctionName) override;
116     String unpack() override;
117     String pack(MangledVariableName existingVariableName, MangledVariableName) override;
118
119 private:
120     HashMap<VertexAttribute*, size_t>& m_matchedVertexAttributes;
121     MangledTypeName m_stageInStructName;
122     MangledTypeName m_returnStructName;
123     MangledVariableName m_stageInParameterName;
124
125     struct NamedStageIn {
126         size_t indexInEntryPointItems;
127         MangledStructureElementName elementName;
128         unsigned attributeIndex;
129     };
130     Vector<NamedStageIn> m_namedStageIns;
131
132     struct NamedOutput {
133         MangledStructureElementName elementName;
134         MangledOrNativeTypeName internalTypeName;
135     };
136     Vector<NamedOutput> m_namedOutputs;
137 };
138
139 class FragmentEntryPointScaffolding : public EntryPointScaffolding {
140 public:
141     FragmentEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<AttachmentDescriptor*, size_t>& matchedColorAttachments);
142     virtual ~FragmentEntryPointScaffolding() = default;
143
144     String helperTypes() override;
145     String signature(MangledFunctionName) override;
146     String unpack() override;
147     String pack(MangledVariableName existingVariableName, MangledVariableName) override;
148
149 private:
150     MangledTypeName m_stageInStructName;
151     MangledTypeName m_returnStructName;
152     MangledVariableName m_stageInParameterName;
153
154     struct NamedStageIn {
155         size_t indexInEntryPointItems;
156         MangledStructureElementName elementName;
157         unsigned attributeIndex;
158     };
159     Vector<NamedStageIn> m_namedStageIns;
160
161     struct NamedOutput {
162         MangledStructureElementName elementName;
163         MangledOrNativeTypeName internalTypeName;
164     };
165     Vector<NamedOutput> m_namedOutputs;
166 };
167
168 class ComputeEntryPointScaffolding : public EntryPointScaffolding {
169 public:
170     ComputeEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName);
171     virtual ~ComputeEntryPointScaffolding() = default;
172
173     String helperTypes() override;
174     String signature(MangledFunctionName) override;
175     String unpack() override;
176     String pack(MangledVariableName existingVariableName, MangledVariableName) override;
177 };
178
179 }
180
181 }
182
183 }
184
185 #endif