Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / WSL / SPIRVVariableAnalyzer.js
1 /*
2  * Copyright (C) 2017 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25 "use strict";
26
27 class SPIRVPrimitiveVariableAnalyzer extends Visitor {
28     constructor(program, typeMap, currentId, currentLocation, startName)
29     {
30         super();
31         this._program = program;
32         this._typeMap = typeMap;
33         this._currentId = currentId;
34         this._currentLocation = currentLocation;
35         this._nameComponents = [];
36         if (startName)
37             this._nameComponents.push(startName);
38         this._result = [];
39     }
40
41     get program()
42     {
43         this._program;
44     }
45
46     get typeMap()
47     {
48         return this._typeMap;
49     }
50
51     get currentId()
52     {
53         return this._currentId;
54     }
55
56     get currentLocation()
57     {
58         return this._currentLocation;
59     }
60
61     get nameComponents()
62     {
63         return this._nameComponents;
64     }
65
66     get result()
67     {
68         return this._result;
69     }
70
71     visitTypeRef(node)
72     {
73         node.type.visit(this);
74     }
75
76     visitNullType(node)
77     {
78         super.visit(this);
79     }
80
81     visitGenericLiteralType(node)
82     {
83         node.type.visit(this);
84     }
85
86     visitNativeType(node)
87     {
88         this.result.push({ name: this.nameComponents.join(""), id: this._currentId++, type: this.typeMap.get(node), location: this._currentLocation++ });
89     }
90
91     visitEnumType(node)
92     {
93         super.visit(this);
94     }
95
96     visitPtrType(node)
97     {
98         // Intentionally blank
99     }
100
101     visitArrayRefType(node)
102     {
103         this.visitNativeType(program.intrinsics.uint32);
104         this.visitNativeType(program.intrinsics.uint32);
105     }
106
107     visitArrayType(node)
108     {
109         for (let i = 0; i < node.numElements.value; ++i) {
110             this.nameComponents.push("[");
111             this.nameComponents.push(i.toString());
112             this.nameComponents.push("]");
113             node.elementType.visit(this);
114             this.nameComponents.pop();
115             this.nameComponents.pop();
116             this.nameComponents.pop();
117         }
118     }
119
120     visitStructType(node)
121     {
122         let builtInStructs = [
123             "struct vec2<> { int32 x; int32 y }",
124             "struct vec2<> { uint32 x; uint32 y; }",
125             "struct vec2<> { float32 x; float32 y; }",
126             "struct vec2<> { float64 x; float64 y; }",
127             "struct vec3<> { int32 x; int32 y; int32 z; }",
128             "struct vec3<> { uint32 x; uint32 y; uint32 z; }",
129             "struct vec3<> { float32 x; float32 y; float32 z; }",
130             "struct vec3<> { float64 x; float64 y; float64 z; }",
131             "struct vec4<> { int32 x; int32 y; int32 z; int32 w; }",
132             "struct vec4<> { uint32 x; uint32 y; uint32 z; uint32 w; }",
133             "struct vec4<> { float32 x; float32 y; float32 z; float32 w; }",
134             "struct vec4<> { float64 x; float64 y; float64 z; float64 w; }"
135         ];
136         for (let builtInStruct of builtInStructs) {
137             if (node.toString() == builtInStruct) {
138                 this.result.push({ name: this.nameComponents.join(""), id: this._currentId++, type: this.typeMap.get(node.toString()).id, location: this._currentLocation++  });
139                 return;
140             }
141         }
142         for (let field of node.fields) {
143             let dotPrefix = this.nameComponents.length > 0;
144             if (dotPrefix)
145                 this.nameComponents.push(".");
146             this.nameComponents.push(field.name);
147             field.visit(this);
148             this.nameComponents.pop();
149             if (dotPrefix)
150                 this.nameComponents.pop();
151         }
152     }
153 }