]> git.tdb.fi Git - libs/gl.git/blob - source/glsl/reflect.cpp
Make function dependency collection its own visitor class
[libs/gl.git] / source / glsl / reflect.cpp
1 #include "reflect.h"
2
3 using namespace std;
4
5 namespace Msp {
6 namespace GL {
7 namespace SL {
8
9 LocationCounter::LocationCounter():
10         r_count(0)
11 { }
12
13 void LocationCounter::visit(BasicTypeDeclaration &basic)
14 {
15         r_count = basic.kind==BasicTypeDeclaration::MATRIX ? basic.size>>16 : 1;
16 }
17
18 void LocationCounter::visit(ImageTypeDeclaration &)
19 {
20         r_count = 1;
21 }
22
23 void LocationCounter::visit(StructDeclaration &strct)
24 {
25         unsigned total = 0;
26         for(NodeList<Statement>::const_iterator i=strct.members.body.begin(); i!=strct.members.body.end(); ++i)
27         {
28                 r_count = 1;
29                 (*i)->visit(*this);
30                 total += r_count;
31         }
32         r_count = total;
33 }
34
35 void LocationCounter::visit(VariableDeclaration &var)
36 {
37         r_count = 1;
38         if(var.type_declaration)
39                 var.type_declaration->visit(*this);
40         if(var.array)
41                 if(const Literal *literal = dynamic_cast<const Literal *>(var.array_size.get()))
42                         if(literal->value.check_type<int>())
43                                 r_count *= literal->value.value<int>();
44 }
45
46
47 set<Node *> DependencyCollector::apply(FunctionDeclaration &func)
48 {
49         func.visit(*this);
50         return dependencies;
51 }
52
53 void DependencyCollector::visit(VariableReference &var)
54 {
55         if(var.declaration && !locals.count(var.declaration))
56         {
57                 dependencies.insert(var.declaration);
58                 var.declaration->visit(*this);
59         }
60 }
61
62 void DependencyCollector::visit(InterfaceBlockReference &iface)
63 {
64         if(iface.declaration)
65         {
66                 dependencies.insert(iface.declaration);
67                 iface.declaration->visit(*this);
68         }
69 }
70
71 void DependencyCollector::visit(FunctionCall &call)
72 {
73         if(call.declaration)
74                 dependencies.insert(call.declaration);
75         TraversingVisitor::visit(call);
76 }
77
78 void DependencyCollector::visit(VariableDeclaration &var)
79 {
80         locals.insert(&var);
81         if(var.type_declaration)
82         {
83                 dependencies.insert(var.type_declaration);
84                 var.type_declaration->visit(*this);
85         }
86
87         TraversingVisitor::visit(var);
88 }
89
90 } // namespace SL
91 } // namespace GL
92 } // namespace Msp