Backport latest varying fixes to 3.x
This commit is contained in:
parent
40b57319e2
commit
1e128c80c6
1 changed files with 14 additions and 10 deletions
|
@ -2180,6 +2180,11 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, OperatorNode *p
|
||||||
}
|
}
|
||||||
StringName var_name = static_cast<const VariableNode *>(p_func->arguments[arg_idx + 1])->name;
|
StringName var_name = static_cast<const VariableNode *>(p_func->arguments[arg_idx + 1])->name;
|
||||||
|
|
||||||
|
if (shader->varyings.has(var_name)) {
|
||||||
|
_set_error(vformat("Varyings cannot be passed for '%s' parameter!", "out"));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const BlockNode *b = p_block;
|
const BlockNode *b = p_block;
|
||||||
bool valid = false;
|
bool valid = false;
|
||||||
while (b) {
|
while (b) {
|
||||||
|
@ -2776,8 +2781,8 @@ bool ShaderLanguage::_is_operator_assign(Operator p_op) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ShaderLanguage::_validate_varying_assign(ShaderNode::Varying &p_varying, String *r_message) {
|
bool ShaderLanguage::_validate_varying_assign(ShaderNode::Varying &p_varying, String *r_message) {
|
||||||
if (current_function == String("light")) {
|
if (current_function != String("vertex") && current_function != String("fragment")) {
|
||||||
*r_message = RTR("Varying may not be assigned in the 'light' function.");
|
*r_message = vformat(RTR("Varying may not be assigned in the '%s' function."), current_function);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
switch (p_varying.stage) {
|
switch (p_varying.stage) {
|
||||||
|
@ -2788,12 +2793,15 @@ bool ShaderLanguage::_validate_varying_assign(ShaderNode::Varying &p_varying, St
|
||||||
p_varying.stage = ShaderNode::Varying::STAGE_FRAGMENT;
|
p_varying.stage = ShaderNode::Varying::STAGE_FRAGMENT;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ShaderNode::Varying::STAGE_VERTEX_TO_FRAGMENT:
|
||||||
|
case ShaderNode::Varying::STAGE_VERTEX_TO_LIGHT:
|
||||||
case ShaderNode::Varying::STAGE_VERTEX:
|
case ShaderNode::Varying::STAGE_VERTEX:
|
||||||
if (current_function == String("fragment")) {
|
if (current_function == String("fragment")) {
|
||||||
*r_message = RTR("Varyings which assigned in 'vertex' function may not be reassigned in 'fragment' or 'light'.");
|
*r_message = RTR("Varyings which assigned in 'vertex' function may not be reassigned in 'fragment' or 'light'.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ShaderNode::Varying::STAGE_FRAGMENT_TO_LIGHT:
|
||||||
case ShaderNode::Varying::STAGE_FRAGMENT:
|
case ShaderNode::Varying::STAGE_FRAGMENT:
|
||||||
if (current_function == String("vertex")) {
|
if (current_function == String("vertex")) {
|
||||||
*r_message = RTR("Varyings which assigned in 'fragment' function may not be reassigned in 'vertex' or 'light'.");
|
*r_message = RTR("Varyings which assigned in 'fragment' function may not be reassigned in 'vertex' or 'light'.");
|
||||||
|
@ -3429,6 +3437,10 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
|
||||||
} else if (shader->uniforms.has(varname)) {
|
} else if (shader->uniforms.has(varname)) {
|
||||||
error = true;
|
error = true;
|
||||||
} else {
|
} else {
|
||||||
|
if (shader->varyings.has(varname)) {
|
||||||
|
_set_error(vformat("Varyings cannot be passed for '%s' parameter!", _get_qualifier_str(call_function->arguments[i].qualifier)));
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
if (p_builtin_types.has(varname)) {
|
if (p_builtin_types.has(varname)) {
|
||||||
BuiltInInfo info = p_builtin_types[varname];
|
BuiltInInfo info = p_builtin_types[varname];
|
||||||
if (info.constant) {
|
if (info.constant) {
|
||||||
|
@ -6335,14 +6347,6 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
||||||
tk = _get_token();
|
tk = _get_token();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Map<StringName, ShaderNode::Varying>::Element *E = shader->varyings.front(); E; E = E->next()) {
|
|
||||||
if (E->get().stage == ShaderNode::Varying::STAGE_VERTEX || E->get().stage == ShaderNode::Varying::STAGE_FRAGMENT) {
|
|
||||||
_set_tkpos(E->get().tkpos);
|
|
||||||
_set_error(RTR("Varying must only be used in two different stages, which can be 'vertex' 'fragment' and 'light'"));
|
|
||||||
return ERR_PARSE_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue