X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fvalidate.cpp;h=5a28fcb6abca0ec042dda6f41aff0f5d6067053d;hb=7272d97c23eedb3850661deec964c4a9c96337fe;hp=6151483cbd640d2fcc09c08b5294f69a199e21c3;hpb=2b1dc627491c987b0459226dcb8ac6aadd7ee4d3;p=libs%2Fgl.git diff --git a/source/glsl/validate.cpp b/source/glsl/validate.cpp index 6151483c..5a28fcb6 100644 --- a/source/glsl/validate.cpp +++ b/source/glsl/validate.cpp @@ -39,6 +39,32 @@ void DeclarationValidator::apply(Stage &s, const Features &f) 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"); + } + else if(s.type==Stage::COMPUTE) + { + if(!have_workgroup_size) + error(*global_err_node, "No workgroup size qualifier found"); + } } const char *DeclarationValidator::describe_variable(ScopeType scope) @@ -118,21 +144,36 @@ void DeclarationValidator::visit(Layout &layout) { 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"); @@ -156,6 +197,12 @@ void DeclarationValidator::visit(Layout &layout) allowed = (iface_block && !variable && iface_block->interface=="uniform"); value = false; } + else if(q.name=="local_size_x" || q.name=="local_size_y" || q.name=="local_size_z") + { + allowed = (stage->type==Stage::COMPUTE && iface_layout && iface_layout->interface=="in"); + if(allowed) + have_workgroup_size = true; + } else if(q.name=="rgba32f" || q.name=="rgba16f" || q.name=="rg32f" || q.name=="rg16f" || q.name=="r32f" || q.name=="r16f" || q.name=="rgba16" || q.name=="rgba8" || q.name=="rg16" || q.name=="rg8" || q.name=="r16" || q.name=="r8" || q.name=="rgba16_snorm" || q.name=="rgba8_snorm" || q.name=="rg16_snorm" || q.name=="rg8_snorm" || q.name=="r16_snorm" || q.name=="r8_snorm")