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