@@ -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