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