#pragma once #include "kompute/Core.hpp" #define KP_MAX_DIM_SIZE 1 namespace kp { class Tensor { public: enum class TensorTypes { eDevice = 0, eStaging = 1, eStorage = 2, }; Tensor(); Tensor(std::vector data, TensorTypes tensorType = TensorTypes::eDevice); ~Tensor(); void init(std::shared_ptr physicalDevice, std::shared_ptr device, std::shared_ptr commandBuffer); // Create functions void createBuffer(); // Getter functions std::vector data(); uint32_t size(); std::array shape(); TensorTypes tensorType(); bool isInit(); // Setters void setData(const std::vector& data); // Record functions void recordCopyFrom(std::shared_ptr copyFromTensor); // TODO: Explore simplifying by infering pipeline stage flag bits from // access flag bits (as seems to be superset) void recordBufferMemoryBarrier(vk::AccessFlagBits srcAccessMask, vk::AccessFlagBits dstAccessMask, vk::PipelineStageFlagBits srcStageMask, vk::PipelineStageFlagBits dstStageMask); // Util functions vk::DescriptorBufferInfo constructDescriptorBufferInfo(); void mapDataFromHostMemory(); void mapDataIntoHostMemory(); private: std::shared_ptr mPhysicalDevice; std::shared_ptr mDevice; std::shared_ptr mCommandBuffer; std::shared_ptr mBuffer; bool mFreeBuffer; std::shared_ptr mMemory; bool mFreeMemory; std::vector mData; TensorTypes mTensorType = TensorTypes::eDevice; std::array mShape; // TODO: Only 1D supported bool mIsInit = false; // uint32_t mDataType; // Private util functions vk::BufferUsageFlags getBufferUsageFlags(); vk::MemoryPropertyFlags getMemoryPropertyFlags(); uint64_t memorySize(); }; } // End namespace kp