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