@@ -451,11 +451,13 @@ vTensor::vTensor(
451
451
unsqueezed_strides_{unsqueeze_strides (strides_, numel_)},
452
452
padded_numel_ (utils::multiply_integers(padded_sizes_)),
453
453
logical_limits_{{0 , 0 , 0 }},
454
+ uniforms_ (),
454
455
// Utility Uniform Buffers that can be passed to shaders as arguments
455
- sizes_uniform_ (),
456
- strides_uniform_(),
457
- numel_uniform_(),
458
- logical_limits_uniform_(),
456
+ uniforms_size_(0 ),
457
+ sizes_uniform_offset_(kUniformOffsetUnset ),
458
+ unsqueezed_strides_offset_(kUniformOffsetUnset ),
459
+ numel_uniform_offset_(kUniformOffsetUnset ),
460
+ logical_limits_uniform_offset_(kUniformOffsetUnset ),
459
461
// Construct Tensor storage
460
462
storage_(
461
463
context,
@@ -497,11 +499,13 @@ vTensor::vTensor(
497
499
unsqueezed_strides_(),
498
500
padded_numel_(utils::multiply_integers(padded_sizes_)),
499
501
logical_limits_(),
502
+ uniforms_(),
500
503
// Utility Uniform Buffers that can be passed to shaders as arguments
501
- sizes_uniform_(),
502
- strides_uniform_(),
503
- numel_uniform_(),
504
- logical_limits_uniform_(),
504
+ uniforms_size_(0 ),
505
+ sizes_uniform_offset_(kUniformOffsetUnset ),
506
+ unsqueezed_strides_offset_(kUniformOffsetUnset ),
507
+ numel_uniform_offset_(kUniformOffsetUnset ),
508
+ logical_limits_uniform_offset_(kUniformOffsetUnset ),
505
509
// Construct Tensor storage
506
510
storage_(context, image) {
507
511
set_logical_limits (storage_.image_extents_ );
@@ -522,11 +526,13 @@ vTensor::vTensor(vTensor& other)
522
526
other.unsqueezed_strides_ .end ()},
523
527
padded_numel_ (other.padded_numel_),
524
528
logical_limits_{other.logical_limits_ },
529
+ uniforms_ (),
525
530
// Empty initialize Utility Uniform Buffers
526
- sizes_uniform_ (),
527
- strides_uniform_(),
528
- numel_uniform_(),
529
- logical_limits_uniform_(),
531
+ uniforms_size_(0 ),
532
+ sizes_uniform_offset_(kUniformOffsetUnset ),
533
+ unsqueezed_strides_offset_(kUniformOffsetUnset ),
534
+ numel_uniform_offset_(kUniformOffsetUnset ),
535
+ logical_limits_uniform_offset_(kUniformOffsetUnset ),
530
536
// Copy Tensor storage
531
537
storage_(other.storage_) {}
532
538
@@ -547,11 +553,13 @@ vTensor::vTensor(
547
553
unsqueezed_strides_{unsqueeze_strides (strides_, numel_)},
548
554
padded_numel_ (utils::multiply_integers(padded_sizes_)),
549
555
logical_limits_(other.logical_limits_),
556
+ uniforms_(),
550
557
// Empty initialize Utility Uniform Buffers
551
- sizes_uniform_(),
552
- strides_uniform_(),
553
- numel_uniform_(),
554
- logical_limits_uniform_(),
558
+ uniforms_size_(0 ),
559
+ sizes_uniform_offset_(kUniformOffsetUnset ),
560
+ unsqueezed_strides_offset_(kUniformOffsetUnset ),
561
+ numel_uniform_offset_(kUniformOffsetUnset ),
562
+ logical_limits_uniform_offset_(kUniformOffsetUnset ),
555
563
// Copy Tensor storage
556
564
storage_(other.storage_, vkapi::element_size(dtype_) * offset_numel) {
557
565
VK_CHECK_COND (
@@ -612,33 +620,66 @@ utils::GPUMemoryLayout vTensor::estimate_memory_layout() const {
612
620
}
613
621
614
622
const vkapi::BufferBindInfo vTensor::sizes_ubo () {
615
- if (!sizes_uniform_.buffer ()) {
616
- sizes_uniform_ =
617
- ParamsBuffer (storage_.context_ , utils::make_whcn_ivec4 (sizes_));
623
+ if (!uniforms_.buffer ()) {
624
+ uniforms_ = ParamsBuffer (storage_.context_ , kMaxUniformBufferSize );
618
625
}
619
- return vkapi::BufferBindInfo (sizes_uniform_.buffer ());
626
+ if (sizes_uniform_offset_ == kUniformOffsetUnset ) {
627
+ VK_CHECK_COND (
628
+ (uniforms_size_ + kSizePerUniform ) <= kMaxUniformBufferSize ,
629
+ " Uniform data allocation has exceeded Tensor uniform buffer size" );
630
+ sizes_uniform_offset_ = uniforms_size_;
631
+ uniforms_size_ += kSizePerUniform ;
632
+ uniforms_.update (utils::make_whcn_ivec4 (sizes_), sizes_uniform_offset_);
633
+ }
634
+ return vkapi::BufferBindInfo (uniforms_.buffer (), sizes_uniform_offset_);
620
635
}
621
636
622
637
const vkapi::BufferBindInfo vTensor::strides_ubo () {
623
- if (!strides_uniform_.buffer ()) {
624
- strides_uniform_ = ParamsBuffer (
625
- storage_.context_ , utils::make_whcn_ivec4 (unsqueezed_strides_));
638
+ if (!uniforms_.buffer ()) {
639
+ uniforms_ = ParamsBuffer (storage_.context_ , kMaxUniformBufferSize );
640
+ }
641
+ if (unsqueezed_strides_offset_ == kUniformOffsetUnset ) {
642
+ VK_CHECK_COND (
643
+ (uniforms_size_ + kSizePerUniform ) <= kMaxUniformBufferSize ,
644
+ " Uniform data allocation has exceeded Tensor uniform buffer size" );
645
+ unsqueezed_strides_offset_ = uniforms_size_;
646
+ uniforms_size_ += kSizePerUniform ;
647
+ uniforms_.update (
648
+ utils::make_whcn_ivec4 (unsqueezed_strides_),
649
+ unsqueezed_strides_offset_);
626
650
}
627
- return vkapi::BufferBindInfo (strides_uniform_ .buffer ());
651
+ return vkapi::BufferBindInfo (uniforms_ .buffer (), unsqueezed_strides_offset_ );
628
652
}
629
653
630
654
const vkapi::BufferBindInfo vTensor::logical_limits_ubo () {
631
- if (!logical_limits_uniform_ .buffer ()) {
632
- logical_limits_uniform_ = ParamsBuffer (storage_.context_ , logical_limits_ );
655
+ if (!uniforms_ .buffer ()) {
656
+ uniforms_ = ParamsBuffer (storage_.context_ , kMaxUniformBufferSize );
633
657
}
634
- return vkapi::BufferBindInfo (logical_limits_uniform_.buffer ());
658
+ if (logical_limits_uniform_offset_ == kUniformOffsetUnset ) {
659
+ VK_CHECK_COND (
660
+ (uniforms_size_ + kSizePerUniform ) <= kMaxUniformBufferSize ,
661
+ " Uniform data allocation has exceeded Tensor uniform buffer size" );
662
+ logical_limits_uniform_offset_ = uniforms_size_;
663
+ uniforms_size_ += kSizePerUniform ;
664
+ uniforms_.update (logical_limits_, logical_limits_uniform_offset_);
665
+ }
666
+ return vkapi::BufferBindInfo (
667
+ uniforms_.buffer (), logical_limits_uniform_offset_);
635
668
}
636
669
637
670
const vkapi::BufferBindInfo vTensor::numel_ubo () {
638
- if (!numel_uniform_.buffer ()) {
639
- numel_uniform_ = ParamsBuffer (storage_.context_ , numel_);
671
+ if (!uniforms_.buffer ()) {
672
+ uniforms_ = ParamsBuffer (storage_.context_ , kMaxUniformBufferSize );
673
+ }
674
+ if (numel_uniform_offset_ == kUniformOffsetUnset ) {
675
+ VK_CHECK_COND (
676
+ (uniforms_size_ + kSizePerUniform ) <= kMaxUniformBufferSize ,
677
+ " Uniform data allocation has exceeded Tensor uniform buffer size" );
678
+ numel_uniform_offset_ = uniforms_size_;
679
+ uniforms_size_ += kSizePerUniform ;
680
+ uniforms_.update (numel_, numel_uniform_offset_);
640
681
}
641
- return vkapi::BufferBindInfo (numel_uniform_ .buffer ());
682
+ return vkapi::BufferBindInfo (uniforms_ .buffer (), numel_uniform_offset_ );
642
683
}
643
684
644
685
size_t vTensor::staging_buffer_numel () const {
@@ -690,17 +731,19 @@ void vTensor::update_metadata() {
690
731
set_logical_limits (
691
732
calculate_image_extents (padded_sizes_, axis_map_, packed_dim_));
692
733
693
- if (sizes_uniform_. buffer () ) {
694
- sizes_uniform_ .update (utils::make_whcn_ivec4 (sizes_));
734
+ if (sizes_uniform_offset_ != kUniformOffsetUnset ) {
735
+ uniforms_ .update (utils::make_whcn_ivec4 (sizes_), sizes_uniform_offset_ );
695
736
}
696
- if (strides_uniform_.buffer ()) {
697
- strides_uniform_.update (utils::make_whcn_ivec4 (unsqueezed_strides_));
737
+ if (unsqueezed_strides_offset_ != kUniformOffsetUnset ) {
738
+ uniforms_.update (
739
+ utils::make_whcn_ivec4 (unsqueezed_strides_),
740
+ unsqueezed_strides_offset_);
698
741
}
699
- if (numel_uniform_. buffer () ) {
700
- numel_uniform_ .update (numel_);
742
+ if (numel_uniform_offset_ != kUniformOffsetUnset ) {
743
+ uniforms_ .update (numel_, numel_uniform_offset_ );
701
744
}
702
- if (logical_limits_uniform_. buffer () ) {
703
- logical_limits_uniform_ .update (logical_limits_);
745
+ if (logical_limits_uniform_offset_ != kUniformOffsetUnset ) {
746
+ uniforms_ .update (logical_limits_, logical_limits_uniform_offset_ );
704
747
}
705
748
}
706
749
0 commit comments