@@ -836,6 +836,50 @@ void vTensor::BufferMetadata::update(
836836 numel = utils::safe_downcast<uint32_t >(src_numel);
837837}
838838
839+ vTensor::TextureMetadata::TextureMetadata (
840+ const std::vector<int64_t >& src_sizes,
841+ const TextureLimits& src_logical_limits,
842+ const std::vector<int64_t >& src_axis_map,
843+ const int32_t src_packed_dim) {
844+ update (src_sizes, src_logical_limits, src_axis_map, src_packed_dim);
845+ }
846+
847+ void vTensor::TextureMetadata::update (
848+ const std::vector<int64_t >& src_sizes,
849+ const TextureLimits& src_logical_limits,
850+ const std::vector<int64_t >& src_axis_map,
851+ const int32_t src_packed_dim) {
852+ // Convert sizes to flipped and unsqueezed format (fixed to 4 dimensions for
853+ // texture)
854+ std::vector<int32_t > fu_sizes =
855+ flip_and_unsqueeze<int32_t >(src_sizes, kTensorSizes , 0 , 4 );
856+
857+ // Copy sizes (up to 4 elements)
858+ for (int i = 0 ; i < 4 ; ++i) {
859+ sizes[i] = fu_sizes.at (i);
860+ }
861+
862+ // Copy logical limits (3 elements)
863+ logical_limits[0 ] =
864+ utils::safe_downcast<int32_t >(src_logical_limits.limits [0 ]);
865+ logical_limits[1 ] =
866+ utils::safe_downcast<int32_t >(src_logical_limits.limits [1 ]);
867+ logical_limits[2 ] =
868+ utils::safe_downcast<int32_t >(src_logical_limits.limits [2 ]);
869+ logical_limits[3 ] = 1u ;
870+
871+ // Copy axis map (up to 4 elements)
872+ for (int i = 0 ; i < 4 && i < src_axis_map.size (); ++i) {
873+ axis_map[i] = utils::safe_downcast<int32_t >(src_axis_map.at (i));
874+ }
875+ // Pad with zeros if axis_map is smaller than 4
876+ for (int i = src_axis_map.size (); i < 4 ; ++i) {
877+ axis_map[i] = 0 ;
878+ }
879+
880+ packed_dim = src_packed_dim;
881+ }
882+
839883vkapi::VulkanImage& vTensor::image (
840884 vkapi::PipelineBarrier& pipeline_barrier,
841885 const vkapi::PipelineStageFlags stage) & {
@@ -948,6 +992,16 @@ const vkapi::BufferBindInfo vTensor::buffer_meta_ubo() {
948992 return vkapi::BufferBindInfo (buffer_meta_.buffer (), 0 , ubo_nbytes);
949993}
950994
995+ const vkapi::BufferBindInfo vTensor::texture_meta_ubo () {
996+ size_t ubo_nbytes = sizeof (TextureMetadata);
997+ if (!texture_meta_.buffer ()) {
998+ TextureLimits limits (logical_limits ());
999+ TextureMetadata data (sizes_, limits, axis_map_, packed_dim_);
1000+ texture_meta_ = ParamsBuffer (storage_->context_ , data);
1001+ }
1002+ return vkapi::BufferBindInfo (texture_meta_.buffer (), 0 , ubo_nbytes);
1003+ }
1004+
9511005VkMemoryRequirements vTensor::get_memory_requirements () const {
9521006 switch (storage_type ()) {
9531007 case utils::kBuffer :
@@ -1031,6 +1085,12 @@ void vTensor::update_metadata() {
10311085 BufferMetadata data (sizes_, dim_order_, strides_, numel_);
10321086 buffer_meta_.update (data);
10331087 }
1088+
1089+ if (texture_meta_.buffer ()) {
1090+ TextureMetadata data (
1091+ sizes_, uniform_data_->logical_limits , axis_map_, packed_dim_);
1092+ texture_meta_.update (data);
1093+ }
10341094}
10351095
10361096void vTensor::check_sizes (const std::vector<int64_t >& sizes) const {
0 commit comments