From 37df7ea850df335e416a8387ecefd491f2dbb9a6 Mon Sep 17 00:00:00 2001 From: YimingWu Date: Thu, 17 Jul 2025 15:54:12 +0200 Subject: [PATCH] Fix #137429: GPU: Allow missing attribute in pygpu_shader_attrs_info_get In `pygpu_shader_attrs_info_get`, it tries to check information for all vertex attributes that are added via `VERTEX_IN`, however some drivers will optimize compiled shaders so some vertex attributes that are not used will be removed. This fix makes sure that the input length that is used in `GPU_shader_get_attribute_len` does not exceed actual max binding number. Pull Request: https://projects.blender.org/blender/blender/pulls/137584 --- source/blender/gpu/intern/gpu_shader.cc | 2 +- source/blender/gpu/intern/gpu_shader_interface.hh | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc index 3b11045133c..3876e7592b1 100644 --- a/source/blender/gpu/intern/gpu_shader.cc +++ b/source/blender/gpu/intern/gpu_shader.cc @@ -605,7 +605,7 @@ int GPU_shader_get_sampler_binding(GPUShader *shader, const char *name) uint GPU_shader_get_attribute_len(const GPUShader *shader) { const ShaderInterface *interface = unwrap(shader)->interface; - return interface->attr_len_; + return interface->valid_bindings_get(interface->inputs_, interface->attr_len_); } uint GPU_shader_get_ssbo_input_len(const GPUShader *shader) diff --git a/source/blender/gpu/intern/gpu_shader_interface.hh b/source/blender/gpu/intern/gpu_shader_interface.hh index 9045e1fd849..390773e8301 100644 --- a/source/blender/gpu/intern/gpu_shader_interface.hh +++ b/source/blender/gpu/intern/gpu_shader_interface.hh @@ -144,6 +144,8 @@ class ShaderInterface { return builtin_blocks_[builtin]; } + inline uint valid_bindings_get(const ShaderInput *const inputs, const uint inputs_len) const; + protected: static inline const char *builtin_uniform_name(GPUUniformBuiltin u); static inline const char *builtin_uniform_block_name(GPUUniformBlockBuiltin u); @@ -312,4 +314,17 @@ inline const ShaderInput *ShaderInterface::input_lookup(const ShaderInput *const return nullptr; /* not found */ } +inline uint ShaderInterface::valid_bindings_get(const ShaderInput *const inputs, + const uint inputs_len) const +{ + /* Simple linear search for now. */ + int valid_bindings = 0; + for (int i = inputs_len - 1; i >= 0; i--) { + if (inputs[i].binding > -1) { + valid_bindings++; + } + } + return valid_bindings; +} + } // namespace blender::gpu