diff options
author | clayjohn <claynjohn@gmail.com> | 2024-09-10 11:21:37 -0700 |
---|---|---|
committer | clayjohn <claynjohn@gmail.com> | 2024-09-10 12:20:47 -0700 |
commit | 29df5896322c708924c1c2cea3330fe88dface80 (patch) | |
tree | d3c9e49200ed0183c3b4cfe25a532c895d956289 | |
parent | 97ef3c837263099faf02d8ebafd6c77c94d2aaba (diff) | |
download | redot-engine-29df5896322c708924c1c2cea3330fe88dface80.tar.gz |
Implement instance uniforms in Compatibility renderer
-rw-r--r-- | drivers/gles3/rasterizer_scene_gles3.cpp | 1 | ||||
-rw-r--r-- | drivers/gles3/shaders/scene.glsl | 2 | ||||
-rw-r--r-- | drivers/gles3/storage/material_storage.cpp | 1 | ||||
-rw-r--r-- | servers/rendering/shader_compiler.cpp | 4 | ||||
-rw-r--r-- | servers/rendering/shader_language.cpp | 4 |
5 files changed, 6 insertions, 6 deletions
diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 8b6d3e3268..1f9dcc3ee9 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -3453,6 +3453,7 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params, } material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::MODEL_FLAGS, inst->flags_cache, shader->version, instance_variant, spec_constants); + material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::INSTANCE_OFFSET, uint32_t(inst->shader_uniforms_offset), shader->version, instance_variant, spec_constants); if (p_pass_mode == PASS_MODE_MATERIAL) { material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::UV_OFFSET, p_params->uv_offset, shader->version, instance_variant, spec_constants); diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl index 393ba014c6..a4762a4a07 100644 --- a/drivers/gles3/shaders/scene.glsl +++ b/drivers/gles3/shaders/scene.glsl @@ -261,6 +261,7 @@ uniform highp mat4 world_transform; uniform highp vec3 compressed_aabb_position; uniform highp vec3 compressed_aabb_size; uniform highp vec4 uv_scale; +uniform highp uint instance_offset; uniform highp uint model_flags; @@ -965,6 +966,7 @@ ivec2 multiview_uv(ivec2 uv) { uniform highp mat4 world_transform; uniform mediump float opaque_prepass_threshold; uniform highp uint model_flags; +uniform highp uint instance_offset; #if defined(RENDER_MATERIAL) layout(location = 0) out vec4 albedo_output_buffer; diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 7d5af48384..5b3fd8f37c 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -1371,6 +1371,7 @@ MaterialStorage::MaterialStorage() { actions.check_multiview_samplers = RasterizerGLES3::get_singleton()->is_xr_enabled(); actions.global_buffer_array_variable = "global_shader_uniforms"; + actions.instance_uniform_index_variable = "instance_offset"; shaders.compiler_scene.initialize(actions); } diff --git a/servers/rendering/shader_compiler.cpp b/servers/rendering/shader_compiler.cpp index 43703f8656..f979f7ee70 100644 --- a/servers/rendering/shader_compiler.cpp +++ b/servers/rendering/shader_compiler.cpp @@ -949,7 +949,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene code = _get_global_shader_uniform_from_type_and_index(p_default_actions.global_buffer_array_variable, code, u.type); } else if (u.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { //instance variable, index it as such - code = "(" + p_default_actions.instance_uniform_index_variable + "+" + itos(u.instance_index) + ")"; + code = "(" + p_default_actions.instance_uniform_index_variable + "+" + itos(u.instance_index) + "u)"; code = _get_global_shader_uniform_from_type_and_index(p_default_actions.global_buffer_array_variable, code, u.type); } else { //regular uniform, index from UBO @@ -1049,7 +1049,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene code = _get_global_shader_uniform_from_type_and_index(p_default_actions.global_buffer_array_variable, code, u.type); } else if (u.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { //instance variable, index it as such - code = "(" + p_default_actions.instance_uniform_index_variable + "+" + itos(u.instance_index) + ")"; + code = "(" + p_default_actions.instance_uniform_index_variable + "+" + itos(u.instance_index) + "u)"; code = _get_global_shader_uniform_from_type_and_index(p_default_actions.global_buffer_array_variable, code, u.type); } else { //regular uniform, index from UBO diff --git a/servers/rendering/shader_language.cpp b/servers/rendering/shader_language.cpp index 2249cd2010..2f9b1ec7d4 100644 --- a/servers/rendering/shader_language.cpp +++ b/servers/rendering/shader_language.cpp @@ -9049,10 +9049,6 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f _set_error(vformat(RTR("Uniform instances are not yet implemented for '%s' shaders."), shader_type_identifier)); return ERR_PARSE_ERROR; } - if (OS::get_singleton()->get_current_rendering_method() == "gl_compatibility") { - _set_error(RTR("Uniform instances are not supported in gl_compatibility shaders.")); - return ERR_PARSE_ERROR; - } if (uniform_scope == ShaderNode::Uniform::SCOPE_LOCAL) { tk = _get_token(); if (tk.type != TK_UNIFORM) { |