mirror of
https://github.com/godotengine/godot.git
synced 2024-11-24 13:12:42 +00:00
Merge pull request #93590 from Chaosus/shader_custom_func_discard
Some checks are pending
🔗 GHA / 📊 Static checks (push) Waiting to run
🔗 GHA / 🤖 Android (push) Blocked by required conditions
🔗 GHA / 🍏 iOS (push) Blocked by required conditions
🔗 GHA / 🐧 Linux (push) Blocked by required conditions
🔗 GHA / 🍎 macOS (push) Blocked by required conditions
🔗 GHA / 🏁 Windows (push) Blocked by required conditions
🔗 GHA / 🌐 Web (push) Blocked by required conditions
🔗 GHA / 🪲 Godot CPP (push) Blocked by required conditions
Some checks are pending
🔗 GHA / 📊 Static checks (push) Waiting to run
🔗 GHA / 🤖 Android (push) Blocked by required conditions
🔗 GHA / 🍏 iOS (push) Blocked by required conditions
🔗 GHA / 🐧 Linux (push) Blocked by required conditions
🔗 GHA / 🍎 macOS (push) Blocked by required conditions
🔗 GHA / 🏁 Windows (push) Blocked by required conditions
🔗 GHA / 🌐 Web (push) Blocked by required conditions
🔗 GHA / 🪲 Godot CPP (push) Blocked by required conditions
Allow usage of `discard` inside custom shader functions
This commit is contained in:
commit
ff9fb0abea
@ -356,7 +356,7 @@ const ShaderLanguage::KeyWord ShaderLanguage::keyword_list[] = {
|
|||||||
{ TK_CF_BREAK, "break", CF_BLOCK, {}, {} },
|
{ TK_CF_BREAK, "break", CF_BLOCK, {}, {} },
|
||||||
{ TK_CF_CONTINUE, "continue", CF_BLOCK, {}, {} },
|
{ TK_CF_CONTINUE, "continue", CF_BLOCK, {}, {} },
|
||||||
{ TK_CF_RETURN, "return", CF_BLOCK, {}, {} },
|
{ TK_CF_RETURN, "return", CF_BLOCK, {}, {} },
|
||||||
{ TK_CF_DISCARD, "discard", CF_BLOCK, { "particles", "sky", "fog" }, { "fragment" } },
|
{ TK_CF_DISCARD, "discard", CF_BLOCK, { "particles", "sky", "fog" }, { "vertex" } },
|
||||||
|
|
||||||
// function specifier keywords
|
// function specifier keywords
|
||||||
|
|
||||||
@ -8599,6 +8599,11 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun
|
|||||||
block = block->parent_block;
|
block = block->parent_block;
|
||||||
}
|
}
|
||||||
} else if (tk.type == TK_CF_DISCARD) {
|
} else if (tk.type == TK_CF_DISCARD) {
|
||||||
|
if (!is_discard_supported) {
|
||||||
|
_set_error(vformat(RTR("Use of '%s' is not supported for the '%s' shader type."), "discard", shader_type_identifier));
|
||||||
|
return ERR_PARSE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
//check return type
|
//check return type
|
||||||
BlockNode *b = p_block;
|
BlockNode *b = p_block;
|
||||||
while (b && !b->parent_function) {
|
while (b && !b->parent_function) {
|
||||||
@ -8610,7 +8615,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!b->parent_function->can_discard) {
|
if (!b->parent_function->can_discard) {
|
||||||
_set_error(vformat(RTR("Use of '%s' is not allowed here."), "discard"));
|
_set_error(vformat(RTR("'%s' cannot be used within the '%s' processor function."), "discard", b->parent_function->name));
|
||||||
return ERR_PARSE_ERROR;
|
return ERR_PARSE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8619,6 +8624,9 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun
|
|||||||
|
|
||||||
pos = _get_tkpos();
|
pos = _get_tkpos();
|
||||||
tk = _get_token();
|
tk = _get_token();
|
||||||
|
|
||||||
|
calls_info[b->parent_function->name].uses_restricted_items.push_back(Pair<StringName, CallInfo::Item>("discard", CallInfo::Item(CallInfo::Item::ITEM_TYPE_BUILTIN, pos)));
|
||||||
|
|
||||||
if (tk.type != TK_SEMICOLON) {
|
if (tk.type != TK_SEMICOLON) {
|
||||||
_set_expected_after_error(";", "discard");
|
_set_expected_after_error(";", "discard");
|
||||||
return ERR_PARSE_ERROR;
|
return ERR_PARSE_ERROR;
|
||||||
@ -8856,7 +8864,9 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
|
|||||||
ShaderNode::Uniform::Scope uniform_scope = ShaderNode::Uniform::SCOPE_LOCAL;
|
ShaderNode::Uniform::Scope uniform_scope = ShaderNode::Uniform::SCOPE_LOCAL;
|
||||||
|
|
||||||
stages = &p_functions;
|
stages = &p_functions;
|
||||||
is_supported_frag_only_funcs = shader_type_identifier == "canvas_item" || shader_type_identifier == "spatial" || shader_type_identifier == "sky";
|
|
||||||
|
is_discard_supported = shader_type_identifier == "canvas_item" || shader_type_identifier == "spatial";
|
||||||
|
is_supported_frag_only_funcs = is_discard_supported || shader_type_identifier == "sky";
|
||||||
|
|
||||||
const FunctionInfo &constants = p_functions.has("constants") ? p_functions["constants"] : FunctionInfo();
|
const FunctionInfo &constants = p_functions.has("constants") ? p_functions["constants"] : FunctionInfo();
|
||||||
|
|
||||||
@ -10350,6 +10360,8 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
|
|||||||
|
|
||||||
if (p_functions.has(name)) {
|
if (p_functions.has(name)) {
|
||||||
func_node->can_discard = p_functions[name].can_discard;
|
func_node->can_discard = p_functions[name].can_discard;
|
||||||
|
} else {
|
||||||
|
func_node->can_discard = is_discard_supported; // Allow use it for custom functions (in supported shader types).
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!function_overload_count.has(name)) {
|
if (!function_overload_count.has(name)) {
|
||||||
@ -10940,10 +10952,7 @@ Error ShaderLanguage::complete(const String &p_code, const ShaderCompileInfo &p_
|
|||||||
break; // Ignore hint keywords (parsed below).
|
break; // Ignore hint keywords (parsed below).
|
||||||
}
|
}
|
||||||
if (keyword_list[i].flags & keyword_completion_context) {
|
if (keyword_list[i].flags & keyword_completion_context) {
|
||||||
if (keyword_list[i].excluded_shader_types.has(shader_type_identifier)) {
|
if (keyword_list[i].excluded_shader_types.has(shader_type_identifier) || keyword_list[i].excluded_functions.has(current_function)) {
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!keyword_list[i].functions.is_empty() && !keyword_list[i].functions.has(current_function)) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ScriptLanguage::CodeCompletionOption option(keyword_list[i].text, ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT);
|
ScriptLanguage::CodeCompletionOption option(keyword_list[i].text, ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT);
|
||||||
|
@ -935,7 +935,7 @@ private:
|
|||||||
const char *text;
|
const char *text;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
const Vector<String> excluded_shader_types;
|
const Vector<String> excluded_shader_types;
|
||||||
const Vector<String> functions;
|
const Vector<String> excluded_functions;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const KeyWord keyword_list[];
|
static const KeyWord keyword_list[];
|
||||||
@ -1151,6 +1151,7 @@ private:
|
|||||||
|
|
||||||
const HashMap<StringName, FunctionInfo> *stages = nullptr;
|
const HashMap<StringName, FunctionInfo> *stages = nullptr;
|
||||||
bool is_supported_frag_only_funcs = false;
|
bool is_supported_frag_only_funcs = false;
|
||||||
|
bool is_discard_supported = false;
|
||||||
|
|
||||||
bool _get_completable_identifier(BlockNode *p_block, CompletionType p_type, StringName &identifier);
|
bool _get_completable_identifier(BlockNode *p_block, CompletionType p_type, StringName &identifier);
|
||||||
static const BuiltinFuncDef builtin_func_defs[];
|
static const BuiltinFuncDef builtin_func_defs[];
|
||||||
|
Loading…
Reference in New Issue
Block a user