X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Fgenerate.cpp;h=99253fe041463ce01a852f340b967cb744f33a50;hp=e4830ec22aee2340aae79a93711600f415ef89a6;hb=HEAD;hpb=abcd1fa06f9fab27c5934b4069523dd009862b18 diff --git a/source/glsl/generate.cpp b/source/glsl/generate.cpp index e4830ec2..635d9f15 100644 --- a/source/glsl/generate.cpp +++ b/source/glsl/generate.cpp @@ -2,6 +2,7 @@ #include #include #include "generate.h" +#include "reflect.h" using namespace std; @@ -105,11 +106,23 @@ VariableDeclaration *InterfaceGenerator::generate_interface(VariableDeclaration VariableDeclaration* iface_var = new VariableDeclaration; iface_var->sampling = var.sampling; + if(stage->type==Stage::FRAGMENT && iface=="in") + if(BasicTypeDeclaration *basic = dynamic_cast(var.type_declaration)) + if(BasicTypeDeclaration *elem = get_element_type(*basic)) + if(elem->kind==BasicTypeDeclaration::INT) + iface_var->interpolation = "flat"; iface_var->interface = iface; iface_var->type = var.type; iface_var->name = name; - // Geometry shader inputs are always arrays. - if(stage->type==Stage::GEOMETRY) + // Tessellation and geometry inputs may be arrayed. + if(stage->type==Stage::TESS_CONTROL) + // VS out -> TCS in: add | TCS in -> TCS out: unchanged | VS out -> TCS out: add + iface_var->array = (var.array || var.interface!="in"); + else if(stage->type==Stage::TESS_EVAL) + // TCS out -> TES in: unchanged | TES in -> TES out: remove | TCS out -> TES out: remove + iface_var->array = (var.array && iface=="in"); + else if(stage->type==Stage::GEOMETRY) + // VS/TES out -> GS in: add | GS in -> GS out: remove | VS/TES out -> GS out: unchanged iface_var->array = ((var.array && var.interface!="in") || iface=="in"); else iface_var->array = var.array; @@ -339,6 +352,38 @@ void InterfaceGenerator::visit(Passthrough &pass) } +void LayoutDefaulter::apply(Stage &stage) +{ + if(stage.type==Stage::TESS_EVAL) + { + stage.content.visit(*this); + if((need_winding || need_spacing) && in_iface) + { + if(need_winding) + in_iface->layout.qualifiers.emplace_back("ccw"); + if(need_spacing) + in_iface->layout.qualifiers.emplace_back("equal_spacing"); + } + } +} + +void LayoutDefaulter::visit(InterfaceLayout &iface) +{ + if(iface.interface=="in") + { + if(!in_iface) + in_iface = &iface; + for(const Layout::Qualifier &q: iface.layout.qualifiers) + { + if(q.name=="cw" || q.name=="ccw") + need_winding = false; + else if(q.name=="equal_spacing" || q.name=="fractional_even_spacing" || q.name=="fractional_odd_spacing") + need_spacing = false; + } + } +} + + void ArraySizer::apply(Stage &stage) { stage.content.visit(*this);