stage = &s;
features = f;
s.content.visit(*this);
+
+ Node *global_err_node = 0;
+ auto i = s.functions.find("main()");
+ if(i!=s.functions.end())
+ global_err_node = i->second;
+ else
+ {
+ for(auto j=s.content.body.begin(); (!global_err_node && j!=s.content.body.end()); ++j)
+ if((*j)->source>0)
+ global_err_node = j->get();
+ }
+
+ if(s.type==Stage::GEOMETRY)
+ {
+ if(!have_input_primitive)
+ error(*global_err_node, "No primitive type qualifier found on input");
+ if(!have_output_primitive)
+ error(*global_err_node, "No primitive type qualifier found on output");
+ if(!have_output_vertex_count)
+ error(*global_err_node, "No vertex count qualifier found on output");
+ }
}
const char *DeclarationValidator::describe_variable(ScopeType scope)
{
allowed = (stage->type==Stage::GEOMETRY && iface_layout && (iface_layout->interface=="in" || iface_layout->interface=="out"));
value = false;
+ if(allowed)
+ {
+ if(iface_layout->interface=="in")
+ have_input_primitive = true;
+ else if(iface_layout->interface=="out")
+ have_output_primitive = true;
+ }
}
else if(q.name=="lines" || q.name=="lines_adjacency" || q.name=="triangles" || q.name=="triangles_adjacency")
{
allowed = (stage->type==Stage::GEOMETRY && iface_layout && iface_layout->interface=="in");
value = false;
+ if(allowed)
+ have_input_primitive = true;
}
else if(q.name=="line_strip" || q.name=="triangle_strip")
{
allowed = (stage->type==Stage::GEOMETRY && iface_layout && iface_layout->interface=="out");
value = false;
+ if(allowed)
+ have_output_primitive = true;
}
else if(q.name=="invocations")
allowed = (stage->type==Stage::GEOMETRY && iface_layout && iface_layout->interface=="in");
else if(q.name=="max_vertices")
+ {
allowed = (stage->type==Stage::GEOMETRY && iface_layout && iface_layout->interface=="out");
+ if(allowed)
+ have_output_vertex_count = true;
+ }
else if(q.name=="std140" || q.name=="std430")
{
allowed = (iface_block && !variable && iface_block->interface=="uniform");
InterfaceLayout *iface_layout = 0;
VariableDeclaration *iface_block = 0;
VariableDeclaration *variable = 0;
+ bool have_input_primitive = false;
+ bool have_output_primitive = false;
+ bool have_output_vertex_count = false;
public:
void apply(Stage &, const Features &);
--- /dev/null
+#pragma MSP stage(vertex)
+layout(location=0) in vec4 position;
+void main()
+{
+ gl_Position = position;
+}
+
+#pragma MSP stage(geometry)
+void main()
+{
+ for(int i=0; i<3; ++i)
+ {
+ passthrough[i];
+ EmitVertex();
+ }
+}
+
+/* Expected error:
+<test>:9: No primitive type qualifier found on input
+<test>:9: No primitive type qualifier found on output
+<test>:9: No vertex count qualifier found on output
+*/