Skip to content

Commit

Permalink
Implemented local shader arrays
Browse files Browse the repository at this point in the history
  • Loading branch information
Chaosus committed Jul 15, 2019
1 parent 7e27da5 commit c373794
Show file tree
Hide file tree
Showing 5 changed files with 1,093 additions and 750 deletions.
74 changes: 74 additions & 0 deletions drivers/gles2/shader_compiler_gles2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,81 @@ String ShaderCompilerGLES2::_dump_node_code(SL::Node *p_node, int p_level, Gener
}
}
} break;
case SL::Node::TYPE_ARRAY_DECLARATION: {

SL::ArrayDeclarationNode *var_dec_node = (SL::ArrayDeclarationNode *)p_node;

StringBuffer<> declaration;

declaration += _prestr(var_dec_node->precision);
declaration += _typestr(var_dec_node->datatype);

for (int i = 0; i < var_dec_node->declarations.size(); i++) {

if (i > 0) {
declaration += ",";
}

declaration += " ";

declaration += _mkid(var_dec_node->declarations[i].name);
declaration += "[";
declaration += itos(var_dec_node->declarations[i].size);
declaration += "]";
}

code += declaration.as_string();
} break;
case SL::Node::TYPE_ARRAY: {
SL::ArrayNode *var_node = (SL::ArrayNode *)p_node;

if (p_assigning && p_actions.write_flag_pointers.has(var_node->name)) {
*p_actions.write_flag_pointers[var_node->name] = true;
}

if (p_default_actions.usage_defines.has(var_node->name) && !used_name_defines.has(var_node->name)) {
String define = p_default_actions.usage_defines[var_node->name];

if (define.begins_with("@")) {
define = p_default_actions.usage_defines[define.substr(1, define.length())];
}

r_gen_code.custom_defines.push_back(define.utf8());
used_name_defines.insert(var_node->name);
}

if (p_actions.usage_flag_pointers.has(var_node->name) && !used_flag_pointers.has(var_node->name)) {
*p_actions.usage_flag_pointers[var_node->name] = true;
used_flag_pointers.insert(var_node->name);
}

if (p_default_actions.renames.has(var_node->name)) {
code += p_default_actions.renames[var_node->name];
} else {
code += _mkid(var_node->name);
}

if (var_node->call_expression != NULL) {
code += ".";
code += _dump_node_code(var_node->call_expression, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
}

if (var_node->index_expression != NULL) {
code += "[";
code += _dump_node_code(var_node->index_expression, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
code += "]";
}

if (var_node->name == time_name) {
if (current_func_name == vertex_name) {
r_gen_code.uses_vertex_time = true;
}
if (current_func_name == fragment_name || current_func_name == light_name) {
r_gen_code.uses_fragment_time = true;
}
}

} break;
case SL::Node::TYPE_CONSTANT: {
SL::ConstantNode *const_node = (SL::ConstantNode *)p_node;

Expand Down
66 changes: 66 additions & 0 deletions drivers/gles3/shader_compiler_gles3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -606,6 +606,72 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener
}
}

} break;
case SL::Node::TYPE_ARRAY_DECLARATION: {

SL::ArrayDeclarationNode *vdnode = (SL::ArrayDeclarationNode *)p_node;

String declaration = _prestr(vdnode->precision) + _typestr(vdnode->datatype);
for (int i = 0; i < vdnode->declarations.size(); i++) {
if (i > 0) {
declaration += ",";
} else {
declaration += " ";
}
declaration += _mkid(vdnode->declarations[i].name);
declaration += "[";
declaration += itos(vdnode->declarations[i].size);
declaration += "]";
}

code += declaration;
} break;
case SL::Node::TYPE_ARRAY: {
SL::ArrayNode *vnode = (SL::ArrayNode *)p_node;

if (p_assigning && p_actions.write_flag_pointers.has(vnode->name)) {
*p_actions.write_flag_pointers[vnode->name] = true;
}

if (p_default_actions.usage_defines.has(vnode->name) && !used_name_defines.has(vnode->name)) {
String define = p_default_actions.usage_defines[vnode->name];
if (define.begins_with("@")) {
define = p_default_actions.usage_defines[define.substr(1, define.length())];
}
r_gen_code.defines.push_back(define.utf8());
used_name_defines.insert(vnode->name);
}

if (p_actions.usage_flag_pointers.has(vnode->name) && !used_flag_pointers.has(vnode->name)) {
*p_actions.usage_flag_pointers[vnode->name] = true;
used_flag_pointers.insert(vnode->name);
}

if (p_default_actions.renames.has(vnode->name))
code = p_default_actions.renames[vnode->name];
else
code = _mkid(vnode->name);

if (vnode->call_expression != NULL) {
code += ".";
code += _dump_node_code(vnode->call_expression, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
}

if (vnode->index_expression != NULL) {
code += "[";
code += _dump_node_code(vnode->index_expression, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
code += "]";
}

if (vnode->name == time_name) {
if (current_func_name == vertex_name) {
r_gen_code.uses_vertex_time = true;
}
if (current_func_name == fragment_name || current_func_name == light_name) {
r_gen_code.uses_fragment_time = true;
}
}

} break;
case SL::Node::TYPE_CONSTANT: {
SL::ConstantNode *cnode = (SL::ConstantNode *)p_node;
Expand Down
7 changes: 7 additions & 0 deletions main/tests/test_shader_lang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,13 @@ static String dump_node_code(SL::Node *p_node, int p_level) {
case SL::Node::TYPE_VARIABLE_DECLARATION: {
// FIXME: Implement
} break;
case SL::Node::TYPE_ARRAY: {
SL::ArrayNode *vnode = (SL::ArrayNode *)p_node;
code = vnode->name;
} break;
case SL::Node::TYPE_ARRAY_DECLARATION: {
// FIXME: Implement
} break;
case SL::Node::TYPE_CONSTANT: {
SL::ConstantNode *cnode = (SL::ConstantNode *)p_node;
return get_constant_text(cnode->datatype, cnode->values);
Expand Down
Loading

0 comments on commit c373794

Please sign in to comment.