X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Ffinalize.cpp;h=87e185024f3175c669a639dd14032b04e0cee79e;hp=85a6b07adf8f00591348ed63d744299e8567ab39;hb=HEAD;hpb=6425fd2ec9c7e1e13c3afa7a79a9a2442d9e5c50 diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index 85a6b07a..469cb92d 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -75,7 +75,12 @@ void LocationAllocator::apply(Module &module, const Features &f, bool a) for(VariableDeclaration *b: unbound_blocks) bind_uniform(b->layout, b->block_declaration->block_name, features.uniform_binding_range); for(VariableDeclaration *t: unbound_textures) - bind_uniform(t->layout, t->name, features.texture_binding_range); + { + const TypeDeclaration *base_type = get_ultimate_base_type(t->type_declaration); + unsigned range = (static_cast(base_type)->sampled ? + features.texture_binding_range : features.storage_texture_binding_range); + bind_uniform(t->layout, t->name, range); + } } void LocationAllocator::apply(Stage &stage) @@ -86,6 +91,8 @@ void LocationAllocator::apply(Stage &stage) stage.content.visit(*this); allocate_locations("in"); + if(stage.type==Stage::VERTEX) + swap(used_locations["in"], used_vertex_attribs); allocate_locations("out"); } @@ -116,6 +123,8 @@ void LocationAllocator::allocate_locations(const string &iface) if(!alloc_new) continue; + bool flat = ((*i)->interpolation=="flat" || ((*i)->linked_declaration && (*i)->linked_declaration->interpolation=="flat")); + set &used = used_locations[(*i)->interface]; unsigned size = LocationCounter().apply(**i); @@ -123,7 +132,7 @@ void LocationAllocator::allocate_locations(const string &iface) { int blocking = -1; for(unsigned j=0; j &expr) bool StructuralFeatureConverter::supports_stage(Stage::Type st) const { - if(st==Stage::GEOMETRY) + if(st==Stage::TESS_CONTROL || st==Stage::TESS_EVAL) + { + if(features.target_api==OPENGL_ES) + return check_version(Version(3, 20)); + else + return check_version(Version(4, 0)); + } + else if(st==Stage::GEOMETRY) { if(features.target_api==OPENGL_ES) return check_version(Version(3, 20)); else return check_version(Version(1, 50)); } + else if(st==Stage::COMPUTE) + { + if(features.target_api==OPENGL_ES) + return check_version(Version(3, 10)); + else + return check_version(Version(4, 30)); + } else return true; }