+ if(stage->required_features.gl_api==OPENGL_ES2)
+ have_default.insert(prec.type);
+ else
+ nodes_to_remove.insert(&prec);
+}
+
+void PrecisionConverter::visit(VariableDeclaration &var)
+{
+ if(stage->required_features.gl_api!=OPENGL_ES2)
+ {
+ var.precision.clear();
+ return;
+ }
+
+ const char *default_prec = (stage->type==Stage::FRAGMENT ? "mediump" : "highp");
+ const TypeDeclaration *type = var.type_declaration;
+ while(type)
+ {
+ if(dynamic_cast<const ImageTypeDeclaration *>(type))
+ {
+ default_prec = "lowp";
+ break;
+ }
+ else if(const BasicTypeDeclaration *basic = dynamic_cast<const BasicTypeDeclaration *>(type))
+ {
+ if(basic->kind==BasicTypeDeclaration::INT || basic->kind==BasicTypeDeclaration::FLOAT)
+ break;
+ type = basic->base_type;
+ }
+ else
+ return;
+ }
+ if(!type)
+ return;
+
+ if(!have_default.count(type->name))
+ {
+ Precision *prec = new Precision;
+ prec->precision = default_prec;
+ prec->type = type->name;
+ stage->content.body.insert(insert_point, prec);
+
+ have_default.insert(type->name);
+ }