blob: 3eba942b0c96449beffdc1120b6a88b1679b642d [file] [log] [blame]
/*
* 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