@@ -658,66 +658,77 @@ utils::GPUMemoryLayout vTensor::estimate_memory_layout() const {
658658}
659659
660660const  vkapi::BufferBindInfo vTensor::sizes_ubo () {
661+   const  size_t  size_per_ubo = context ()->adapter_ptr ()->min_ubo_alignment ();
662+   const  size_t  max_ubo_size = kMaxMetadataFieldCount  * size_per_ubo;
661663  if  (!uniforms_.buffer ()) {
662-     uniforms_ = ParamsBuffer (storage_.context_ , kMaxUniformBufferSize );
664+     uniforms_ = ParamsBuffer (storage_.context_ , max_ubo_size,  true );
663665  }
664666  if  (sizes_uniform_offset_ == kUniformOffsetUnset ) {
665667    VK_CHECK_COND (
666-         (uniforms_size_ + kSizePerUniform ) <= kMaxUniformBufferSize ,
668+         (uniforms_size_ + size_per_ubo ) <= max_ubo_size ,
667669        " Uniform data allocation has exceeded Tensor uniform buffer size" 
668670    sizes_uniform_offset_ = uniforms_size_;
669-     uniforms_size_ += kSizePerUniform ;
671+     uniforms_size_ += size_per_ubo ;
670672    uniforms_.update (utils::make_whcn_ivec4 (sizes_), sizes_uniform_offset_);
671673  }
672-   return  vkapi::BufferBindInfo (uniforms_.buffer (), sizes_uniform_offset_);
674+   return  vkapi::BufferBindInfo (
675+       uniforms_.buffer (), sizes_uniform_offset_, size_per_ubo);
673676}
674677
675678const  vkapi::BufferBindInfo vTensor::strides_ubo () {
679+   const  size_t  size_per_ubo = context ()->adapter_ptr ()->min_ubo_alignment ();
680+   const  size_t  max_ubo_size = kMaxMetadataFieldCount  * size_per_ubo;
676681  if  (!uniforms_.buffer ()) {
677-     uniforms_ = ParamsBuffer (storage_.context_ , kMaxUniformBufferSize );
682+     uniforms_ = ParamsBuffer (storage_.context_ , max_ubo_size,  true );
678683  }
679684  if  (unsqueezed_strides_offset_ == kUniformOffsetUnset ) {
680685    VK_CHECK_COND (
681-         (uniforms_size_ + kSizePerUniform ) <= kMaxUniformBufferSize ,
686+         (uniforms_size_ + size_per_ubo ) <= max_ubo_size ,
682687        " Uniform data allocation has exceeded Tensor uniform buffer size" 
683688    unsqueezed_strides_offset_ = uniforms_size_;
684-     uniforms_size_ += kSizePerUniform ;
689+     uniforms_size_ += size_per_ubo ;
685690    uniforms_.update (
686691        utils::make_whcn_ivec4 (unsqueezed_strides_),
687692        unsqueezed_strides_offset_);
688693  }
689-   return  vkapi::BufferBindInfo (uniforms_.buffer (), unsqueezed_strides_offset_);
694+   return  vkapi::BufferBindInfo (
695+       uniforms_.buffer (), unsqueezed_strides_offset_, size_per_ubo);
690696}
691697
692698const  vkapi::BufferBindInfo vTensor::logical_limits_ubo () {
699+   const  size_t  size_per_ubo = context ()->adapter_ptr ()->min_ubo_alignment ();
700+   const  size_t  max_ubo_size = kMaxMetadataFieldCount  * size_per_ubo;
693701  if  (!uniforms_.buffer ()) {
694-     uniforms_ = ParamsBuffer (storage_.context_ , kMaxUniformBufferSize );
702+     uniforms_ = ParamsBuffer (storage_.context_ , max_ubo_size,  true );
695703  }
696704  if  (logical_limits_uniform_offset_ == kUniformOffsetUnset ) {
697705    VK_CHECK_COND (
698-         (uniforms_size_ + kSizePerUniform ) <= kMaxUniformBufferSize ,
706+         (uniforms_size_ + size_per_ubo ) <= max_ubo_size ,
699707        " Uniform data allocation has exceeded Tensor uniform buffer size" 
700708    logical_limits_uniform_offset_ = uniforms_size_;
701-     uniforms_size_ += kSizePerUniform ;
709+     uniforms_size_ += size_per_ubo ;
702710    uniforms_.update (logical_limits (), logical_limits_uniform_offset_);
703711  }
704712  return  vkapi::BufferBindInfo (
705-       uniforms_.buffer (), logical_limits_uniform_offset_);
713+       uniforms_.buffer (), logical_limits_uniform_offset_, size_per_ubo );
706714}
707715
708716const  vkapi::BufferBindInfo vTensor::numel_ubo () {
717+   const  size_t  size_per_ubo = context ()->adapter_ptr ()->min_ubo_alignment ();
718+   const  size_t  max_ubo_size = kMaxMetadataFieldCount  * size_per_ubo;
709719  if  (!uniforms_.buffer ()) {
710-     uniforms_ = ParamsBuffer (storage_.context_ , kMaxUniformBufferSize );
720+     uniforms_ = ParamsBuffer (storage_.context_ , max_ubo_size,  true );
711721  }
712722  if  (numel_uniform_offset_ == kUniformOffsetUnset ) {
713723    VK_CHECK_COND (
714-         (uniforms_size_ + kSizePerUniform ) <= kMaxUniformBufferSize ,
724+         (uniforms_size_ + size_per_ubo ) <= max_ubo_size ,
715725        " Uniform data allocation has exceeded Tensor uniform buffer size" 
716726    numel_uniform_offset_ = uniforms_size_;
717-     uniforms_size_ += kSizePerUniform ;
727+     uniforms_size_ += size_per_ubo ;
718728    uniforms_.update (numel (), numel_uniform_offset_);
719729  }
720-   return  vkapi::BufferBindInfo (uniforms_.buffer (), numel_uniform_offset_);
730+   return  vkapi::BufferBindInfo (
731+       uniforms_.buffer (), numel_uniform_offset_, size_per_ubo);
721732}
722733
723734size_t  vTensor::staging_buffer_numel () const  {
0 commit comments