c4bc7a4b553e93934d04aef66251a2b2a11e411a
[WebKit-https.git] / Source / WebCore / Modules / webgpu / WHLSL / Metal / WHLSLTypeNamer.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 "WHLSLVisitor.h"
31 #include <wtf/HashMap.h>
32 #include <wtf/text/StringConcatenate.h>
33 #include <wtf/text/StringConcatenateNumbers.h>
34 #include <wtf/text/WTFString.h>
35
36 namespace WebCore {
37
38 namespace WHLSL {
39
40 namespace AST {
41
42 class EnumerationDefinition;
43 class EnumerationMember;
44 class NamedType;
45 class NativeTypeDeclaration;
46 class StructureDefinition;
47 class TypeDefinition;
48 class UnnamedType;
49
50 }
51
52 class Program;
53
54 namespace Metal {
55
56 class BaseTypeNameNode;
57
58 class TypeNamer : private Visitor {
59 public:
60     TypeNamer(Program&);
61     virtual ~TypeNamer();
62
63     String metalTypes();
64
65     // Must be called after calling metalTypes().
66     String mangledNameForType(AST::NativeTypeDeclaration&);
67     String mangledNameForType(AST::UnnamedType&);
68     String mangledNameForType(AST::NamedType&);
69     String mangledNameForEnumerationMember(AST::EnumerationMember&);
70     String mangledNameForStructureElement(AST::StructureElement&);
71
72     String generateNextTypeName()
73     {
74         return makeString("type", m_typeCount++);
75     }
76
77     String generateNextStructureElementName()
78     {
79         return makeString("structureElement", m_structureElementCount++);
80     }
81
82 private:
83     void visit(AST::UnnamedType&) override;
84     void visit(AST::EnumerationDefinition&) override;
85     void visit(AST::NativeTypeDeclaration&) override;
86     void visit(AST::StructureDefinition&) override;
87     void visit(AST::TypeDefinition&) override;
88     void visit(AST::Expression&) override;
89     void visit(AST::CallExpression&) override;
90
91     String generateNextEnumerationMemberName()
92     {
93         return makeString("enumerationMember", m_enumerationMemberCount++);
94     }
95
96     void emitNamedTypeDefinition(AST::NamedType&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);
97     void emitUnnamedTypeDefinition(BaseTypeNameNode&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);
98     void emitAllUnnamedTypeDefinitions(Vector<UniqueRef<BaseTypeNameNode>>&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);
99     String metalTypeDeclarations();
100     String metalTypeDefinitions();
101
102     UniqueRef<BaseTypeNameNode> createNameNode(AST::UnnamedType&, BaseTypeNameNode* parent);
103     BaseTypeNameNode* insert(AST::UnnamedType&, Vector<UniqueRef<BaseTypeNameNode>>&);
104
105     Program& m_program;
106     Vector<UniqueRef<BaseTypeNameNode>> m_trie;
107     HashMap<AST::UnnamedType*, BaseTypeNameNode*> m_unnamedTypeMapping;
108     HashMap<AST::NamedType*, String> m_namedTypeMapping;
109     HashMap<AST::NamedType*, Vector<std::reference_wrapper<BaseTypeNameNode>>> m_dependencyGraph;
110     HashMap<AST::EnumerationMember*, String> m_enumerationMemberMapping;
111     HashMap<AST::StructureElement*, String> m_structureElementMapping;
112     unsigned m_typeCount { 0 };
113     unsigned m_enumerationMemberCount { 0 };
114     unsigned m_structureElementCount { 0 };
115 };
116
117 } // namespace Metal
118
119 } // namespace WHLSL
120
121 } // namespace WebCore
122
123 #endif