| /* |
| * vk_memory.h - Vulkan memory |
| * |
| * Copyright (c) 2018 Intel Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * Author: Wind Yuan <[email protected]> |
| */ |
| |
| #ifndef XCAM_VK_MEMORY_H |
| #define XCAM_VK_MEMORY_H |
| |
| #include <vulkan/vulkan_std.h> |
| |
| #define XCAM_VK_MAX_COMPONENTS 4 |
| |
| namespace XCam { |
| |
| struct VKBufInfo { |
| uint32_t format; |
| uint32_t width; |
| uint32_t height; |
| uint32_t aligned_width; |
| uint32_t aligned_height; |
| uint32_t size; |
| uint32_t strides[XCAM_VK_MAX_COMPONENTS]; |
| uint32_t offsets[XCAM_VK_MAX_COMPONENTS]; |
| uint32_t slice_size[XCAM_VK_MAX_COMPONENTS]; |
| |
| VKBufInfo (); |
| bool operator == (const VKBufInfo &info) const; |
| }; |
| |
| class VKDevice; |
| |
| class VKMemory |
| { |
| public: |
| virtual ~VKMemory (); |
| void *map (VkDeviceSize size = VK_WHOLE_SIZE, VkDeviceSize offset = 0); |
| void unmap (); |
| |
| protected: |
| explicit VKMemory ( |
| const SmartPtr<VKDevice> dev, VkDeviceMemory id, |
| uint32_t size, VkMemoryPropertyFlags mem_prop); |
| VkDeviceMemory get_mem_id () const { |
| return _mem_id; |
| } |
| |
| private: |
| XCAM_DEAD_COPY (VKMemory); |
| |
| protected: |
| const SmartPtr<VKDevice> _dev; |
| VkDeviceMemory _mem_id; |
| VkMemoryPropertyFlags _mem_prop; |
| uint32_t _size; |
| void *_mapped_ptr; |
| }; |
| |
| class VKBuffer |
| : public VKMemory |
| { |
| public: |
| ~VKBuffer (); |
| |
| // usage can be VK_BUFFER_USAGE_STORAGE_BUFFER_BIT or VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |
| static SmartPtr<VKBuffer> |
| create_buffer ( |
| const SmartPtr<VKDevice> dev, |
| VkBufferUsageFlags usage, |
| uint32_t size, void *data = NULL, |
| VkMemoryPropertyFlags mem_prop = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); |
| |
| VkBuffer get_buf_id () const { |
| return _buffer_id; |
| } |
| VkBufferUsageFlags get_usage_flags () const { |
| return _usage_flags; |
| } |
| VkMemoryPropertyFlags get_mem_flags () const { |
| return _prop_flags; |
| } |
| |
| void set_buf_info (const VKBufInfo &info) { |
| _buf_info = info; |
| } |
| const VKBufInfo &get_buf_info () const { |
| return _buf_info; |
| } |
| |
| private: |
| explicit VKBuffer ( |
| const SmartPtr<VKDevice> dev, VkBuffer buf_id, |
| VkDeviceMemory mem_id, uint32_t size, |
| VkBufferUsageFlags usage, VkMemoryPropertyFlags prop); |
| XCamReturn bind (); |
| |
| private: |
| XCAM_DEAD_COPY (VKBuffer); |
| |
| private: |
| VkBuffer _buffer_id; |
| VkBufferUsageFlags _usage_flags; |
| VkMemoryPropertyFlags _prop_flags; |
| VKBufInfo _buf_info; |
| }; |
| |
| struct VKBufDesc { |
| SmartPtr<VKBuffer> buf; |
| VkDescriptorBufferInfo desc_info; |
| |
| VKBufDesc (); |
| VKBufDesc (const SmartPtr<VKBuffer> &buffer, NV12PlaneIdx plane); |
| VKBufDesc (const SmartPtr<VKBuffer> &buffer, uint32_t offset = 0, size_t size = VK_WHOLE_SIZE); |
| }; |
| |
| typedef std::vector<SmartPtr<VKBuffer>> VKBufferArray; |
| |
| } |
| |
| #endif //XCAM_VK_MEMORY_H |