@@ -451,11 +451,13 @@ vTensor::vTensor(
451451 unsqueezed_strides_{unsqueeze_strides (strides_, numel_)},
452452 padded_numel_ (utils::multiply_integers(padded_sizes_)),
453453 logical_limits_{{0 , 0 , 0 }},
454+ uniforms_ (),
454455 // 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 ),
459461 // Construct Tensor storage
460462 storage_(
461463 context,
@@ -497,11 +499,13 @@ vTensor::vTensor(
497499 unsqueezed_strides_(),
498500 padded_numel_(utils::multiply_integers(padded_sizes_)),
499501 logical_limits_(),
502+ uniforms_(),
500503 // 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 ),
505509 // Construct Tensor storage
506510 storage_(context, image) {
507511 set_logical_limits (storage_.image_extents_ );
@@ -522,11 +526,13 @@ vTensor::vTensor(vTensor& other)
522526 other.unsqueezed_strides_ .end ()},
523527 padded_numel_ (other.padded_numel_),
524528 logical_limits_{other.logical_limits_ },
529+ uniforms_ (),
525530 // 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 ),
530536 // Copy Tensor storage
531537 storage_(other.storage_) {}
532538
@@ -547,11 +553,13 @@ vTensor::vTensor(
547553 unsqueezed_strides_{unsqueeze_strides (strides_, numel_)},
548554 padded_numel_ (utils::multiply_integers(padded_sizes_)),
549555 logical_limits_(other.logical_limits_),
556+ uniforms_(),
550557 // 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 ),
555563 // Copy Tensor storage
556564 storage_(other.storage_, vkapi::element_size(dtype_) * offset_numel) {
557565 VK_CHECK_COND (
@@ -612,33 +620,66 @@ utils::GPUMemoryLayout vTensor::estimate_memory_layout() const {
612620}
613621
614622const 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 );
618625 }
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_);
620635}
621636
622637const 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_);
626650 }
627- return vkapi::BufferBindInfo (strides_uniform_ .buffer ());
651+ return vkapi::BufferBindInfo (uniforms_ .buffer (), unsqueezed_strides_offset_ );
628652}
629653
630654const 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 );
633657 }
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_);
635668}
636669
637670const 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_);
640681 }
641- return vkapi::BufferBindInfo (numel_uniform_ .buffer ());
682+ return vkapi::BufferBindInfo (uniforms_ .buffer (), numel_uniform_offset_ );
642683}
643684
644685size_t vTensor::staging_buffer_numel () const {
@@ -690,17 +731,19 @@ void vTensor::update_metadata() {
690731 set_logical_limits (
691732 calculate_image_extents (padded_sizes_, axis_map_, packed_dim_));
692733
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_ );
695736 }
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_);
698741 }
699- if (numel_uniform_. buffer () ) {
700- numel_uniform_ .update (numel_);
742+ if (numel_uniform_offset_ != kUniformOffsetUnset ) {
743+ uniforms_ .update (numel_, numel_uniform_offset_ );
701744 }
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_ );
704747 }
705748}
706749
0 commit comments