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<const ImageTypeDeclaration *>(base_type)->sampled ?
+ features.texture_binding_range : features.storage_texture_binding_range);
+ bind_uniform(t->layout, t->name, range);
+ }
}
void LocationAllocator::apply(Stage &stage)
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;
}