Skip to content

Commit

Permalink
Allow passing non-variable constant to const function param in shaders
Browse files Browse the repository at this point in the history
  • Loading branch information
Chaosus committed Nov 19, 2021
1 parent 0deccc5 commit f4c0e90
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 17 deletions.
18 changes: 12 additions & 6 deletions drivers/gles3/shader_compiler_gles3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,13 @@ static String _prestr(SL::DataPrecision p_pres) {
return "";
}

static String _constr(bool p_is_const) {
if (p_is_const) {
return "const ";
}
return "";
}

static String _qualstr(SL::ArgumentQualifier p_qual) {
switch (p_qual) {
case SL::ARGUMENT_QUALIFIER_IN:
Expand Down Expand Up @@ -246,9 +253,10 @@ void ShaderCompilerGLES3::_dump_function_deps(SL::ShaderNode *p_node, const Stri
header += "(";

for (int i = 0; i < fnode->arguments.size(); i++) {
if (i > 0)
if (i > 0) {
header += ", ";

}
header += _constr(fnode->arguments[i].is_const);
header += _qualstr(fnode->arguments[i].qualifier);
header += _prestr(fnode->arguments[i].precision);
header += _typestr(fnode->arguments[i].type);
Expand Down Expand Up @@ -365,7 +373,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener

for (int i = 0; i < snode->vconstants.size(); i++) {
String gcode;
gcode += "const ";
gcode += _constr(true);
gcode += _prestr(snode->vconstants[i].precision);
gcode += _typestr(snode->vconstants[i].type);
gcode += " " + _mkid(String(snode->vconstants[i].name));
Expand Down Expand Up @@ -446,9 +454,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener
SL::VariableDeclarationNode *var_dec_node = (SL::VariableDeclarationNode *)p_node;

StringBuffer<> declaration;
if (var_dec_node->is_const) {
declaration += "const ";
}
declaration += _constr(var_dec_node->is_const);
declaration += _prestr(var_dec_node->precision);
declaration += _typestr(var_dec_node->datatype);

Expand Down
21 changes: 11 additions & 10 deletions servers/rendering/renderer_rd/shader_compiler_rd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,13 @@ static String _prestr(SL::DataPrecision p_pres, bool p_force_highp = false) {
return "";
}

static String _constr(bool p_is_const) {
if (p_is_const) {
return "const ";
}
return "";
}

static String _qualstr(SL::ArgumentQualifier p_qual) {
switch (p_qual) {
case SL::ARGUMENT_QUALIFIER_IN:
Expand Down Expand Up @@ -417,9 +424,7 @@ void ShaderCompilerRD::_dump_function_deps(const SL::ShaderNode *p_node, const S
if (i > 0) {
header += ", ";
}
if (fnode->arguments[i].is_const) {
header += "const ";
}
header += _constr(fnode->arguments[i].is_const);
if (fnode->arguments[i].type == SL::TYPE_STRUCT) {
header += _qualstr(fnode->arguments[i].qualifier) + _mkid(fnode->arguments[i].type_str) + " " + _mkid(fnode->arguments[i].name);
} else {
Expand Down Expand Up @@ -791,7 +796,7 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge
for (int i = 0; i < pnode->vconstants.size(); i++) {
const SL::ShaderNode::Constant &cnode = pnode->vconstants[i];
String gcode;
gcode += "const ";
gcode += _constr(true);
gcode += _prestr(cnode.precision, ShaderLanguage::is_float_type(cnode.type));
if (cnode.type == SL::TYPE_STRUCT) {
gcode += _mkid(cnode.type_str);
Expand Down Expand Up @@ -875,9 +880,7 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge
SL::VariableDeclarationNode *vdnode = (SL::VariableDeclarationNode *)p_node;

String declaration;
if (vdnode->is_const) {
declaration += "const ";
}
declaration += _constr(vdnode->is_const);
if (vdnode->datatype == SL::TYPE_STRUCT) {
declaration += _mkid(vdnode->struct_name);
} else {
Expand Down Expand Up @@ -997,9 +1000,7 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge
case SL::Node::TYPE_ARRAY_DECLARATION: {
SL::ArrayDeclarationNode *adnode = (SL::ArrayDeclarationNode *)p_node;
String declaration;
if (adnode->is_const) {
declaration += "const ";
}
declaration += _constr(adnode->is_const);
if (adnode->datatype == SL::TYPE_STRUCT) {
declaration += _mkid(adnode->struct_name);
} else {
Expand Down
4 changes: 3 additions & 1 deletion servers/rendering/shader_language.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4920,7 +4920,9 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
bool error = false;
Node *n = func->arguments[argidx];
if (n->type == Node::TYPE_CONSTANT || n->type == Node::TYPE_OPERATOR) {
error = true;
if (!call_function->arguments[i].is_const) {
error = true;
}
} else if (n->type == Node::TYPE_ARRAY) {
ArrayNode *an = static_cast<ArrayNode *>(n);
if (an->call_expression != nullptr || an->is_const) {
Expand Down

0 comments on commit f4c0e90

Please sign in to comment.