bool LocationAllocator::visit_uniform(const string &name, RefPtr<Layout> &layout)
{
- int desc_set = 0;
+ int desc_set = get_layout_value(layout.get(), "set");
int bind_point = get_layout_value(layout.get(), "binding");
if(features.target_api==VULKAN)
{
- desc_set = get_layout_value(layout.get(), "set");
if(desc_set<0 && bind_point>=0)
{
desc_set = 0;
if(desc_set>=0)
uniforms[name].desc_set = desc_set;
}
+ else if(desc_set>=0 && bind_point<0)
+ {
+ auto i = find_member(layout->qualifiers, string("set"), &Layout::Qualifier::name);
+ layout->qualifiers.erase(i);
+ }
if(bind_point>=0)
{
}
+void DepthRangeConverter::apply(Stage &stage, const Features &features)
+{
+ if(stage.type!=Stage::VERTEX || features.target_api==VULKAN)
+ return;
+
+ stage.content.visit(*this);
+}
+
+void DepthRangeConverter::visit(FunctionDeclaration &func)
+{
+ if(func.definition==&func && func.name=="main")
+ {
+ VariableReference *position = new VariableReference;
+ position->name = "gl_Position";
+
+ MemberAccess *z = new MemberAccess;
+ z->left = position;
+ z->member = "z";
+
+ Literal *scale = new Literal;
+ scale->token = "2.0";
+ scale->value = 2.0f;
+
+ BinaryExpression *multiply = new BinaryExpression;
+ multiply->oper = &Operator::get_operator("*", Operator::BINARY);
+ multiply->left = z;
+ multiply->right = scale;
+
+ MemberAccess *w = new MemberAccess;
+ w->left = position->clone();
+ w->member = "w";
+
+ BinaryExpression *subtract = new BinaryExpression;
+ subtract->oper = &Operator::get_operator("-", Operator::BINARY);
+ subtract->left = multiply;
+ subtract->right = w;
+
+ Assignment *assign = new Assignment;
+ assign->oper = &Operator::get_operator("=", Operator::BINARY);
+ assign->left = z->clone();
+ assign->right = subtract;
+
+ ExpressionStatement *statement = new ExpressionStatement;
+ statement->expression = assign;
+
+ func.body.body.push_back(statement);
+ }
+}
+
+
void PrecisionConverter::apply(Stage &s)
{
stage = &s;
bool QualifierConverter::supports_uniform_location() const
{
if(features.target_api==VULKAN)
- return true;
+ return false;
else if(features.target_api==OPENGL_ES)
return check_version(Version(3, 10));
else if(check_version(Version(4, 30)))