|
33 | 33 | #include "core/os/os.h"
|
34 | 34 | #include "core/templates/local_vector.h"
|
35 | 35 | #include "servers/rendering/renderer_compositor.h"
|
| 36 | +#include "servers/rendering/rendering_server_globals.h" |
36 | 37 | #include "servers/rendering_server.h"
|
37 | 38 | #include "shader_types.h"
|
38 | 39 |
|
@@ -9111,17 +9112,12 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
|
9111 | 9112 | int prop_index = 0;
|
9112 | 9113 | #ifdef DEBUG_ENABLED
|
9113 | 9114 | uint64_t uniform_buffer_size = 0;
|
9114 |
| - uint64_t max_uniform_buffer_size = 0; |
| 9115 | + uint64_t max_uniform_buffer_size = 65536; |
9115 | 9116 | int uniform_buffer_exceeded_line = -1;
|
9116 |
| - |
9117 |
| - bool check_device_limit_warnings = false; |
9118 |
| - { |
9119 |
| - RenderingDevice *device = RenderingDevice::get_singleton(); |
9120 |
| - if (device != nullptr) { |
9121 |
| - check_device_limit_warnings = check_warnings && HAS_WARNING(ShaderWarning::DEVICE_LIMIT_EXCEEDED_FLAG); |
9122 |
| - |
9123 |
| - max_uniform_buffer_size = device->limit_get(RenderingDevice::LIMIT_MAX_UNIFORM_BUFFER_SIZE); |
9124 |
| - } |
| 9117 | + bool check_device_limit_warnings = check_warnings && HAS_WARNING(ShaderWarning::DEVICE_LIMIT_EXCEEDED_FLAG); |
| 9118 | + // Can be false for internal shaders created in the process of initializing the engine. |
| 9119 | + if (RSG::utilities) { |
| 9120 | + max_uniform_buffer_size = RSG::utilities->get_maximum_uniform_buffer_size(); |
9125 | 9121 | }
|
9126 | 9122 | #endif // DEBUG_ENABLED
|
9127 | 9123 | ShaderNode::Uniform::Scope uniform_scope = ShaderNode::Uniform::SCOPE_LOCAL;
|
@@ -10959,13 +10955,27 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
|
10959 | 10955 |
|
10960 | 10956 | tk = _get_token();
|
10961 | 10957 | }
|
| 10958 | + uint32_t varying_index = base_varying_index; |
| 10959 | + uint32_t max_varyings = 31; |
| 10960 | + // Can be false for internal shaders created in the process of initializing the engine. |
| 10961 | + if (RSG::utilities) { |
| 10962 | + max_varyings = RSG::utilities->get_maximum_shader_varyings(); |
| 10963 | + } |
10962 | 10964 |
|
10963 | 10965 | for (const KeyValue<StringName, ShaderNode::Varying> &kv : shader->varyings) {
|
10964 | 10966 | if (kv.value.stage != ShaderNode::Varying::STAGE_FRAGMENT && (kv.value.type > TYPE_BVEC4 && kv.value.type < TYPE_FLOAT) && kv.value.interpolation != INTERPOLATION_FLAT) {
|
10965 | 10967 | _set_tkpos(kv.value.tkpos);
|
10966 | 10968 | _set_error(vformat(RTR("Varying with integer data type must be declared with `%s` interpolation qualifier."), "flat"));
|
10967 | 10969 | return ERR_PARSE_ERROR;
|
10968 | 10970 | }
|
| 10971 | + |
| 10972 | + if (varying_index + kv.value.get_size() > max_varyings) { |
| 10973 | + _set_tkpos(kv.value.tkpos); |
| 10974 | + _set_error(vformat(RTR("Too many varyings used in shader. %d used. Maximum supported is %d"), varying_index + kv.value.get_size(), max_varyings)); |
| 10975 | + return ERR_PARSE_ERROR; |
| 10976 | + } |
| 10977 | + |
| 10978 | + varying_index += kv.value.get_size(); |
10969 | 10979 | }
|
10970 | 10980 |
|
10971 | 10981 | #ifdef DEBUG_ENABLED
|
@@ -11183,6 +11193,7 @@ Error ShaderLanguage::compile(const String &p_code, const ShaderCompileInfo &p_i
|
11183 | 11193 | global_shader_uniform_get_type_func = p_info.global_shader_uniform_type_func;
|
11184 | 11194 |
|
11185 | 11195 | varying_function_names = p_info.varying_function_names;
|
| 11196 | + base_varying_index = p_info.base_varying_index; |
11186 | 11197 |
|
11187 | 11198 | nodes = nullptr;
|
11188 | 11199 |
|
|
0 commit comments