blob: 09af6900f992247fa9caad9d7ebfea90993ad941 [file] [log] [blame]
/*
* vk_memory.cpp - 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]>
*/
#include "vk_memory.h"
#include "vk_device.h"
namespace XCam {
VKBufInfo::VKBufInfo ()
: format (V4L2_PIX_FMT_NV12)
, width (0)
, height (0)
, aligned_width (0)
, aligned_height (0)
, size (0)
{
xcam_mem_clear (strides);
xcam_mem_clear (offsets);
xcam_mem_clear (slice_size);
}
VKMemory::VKMemory (
const SmartPtr<VKDevice> dev,
VkDeviceMemory id,
uint32_t size,
VkMemoryPropertyFlags mem_prop)
: _dev (dev)
, _mem_id (id)
, _mem_prop (mem_prop)
, _size (size)
, _mapped_ptr (NULL)
{
XCAM_ASSERT (XCAM_IS_VALID_VK_ID (id));
}
VKMemory::~VKMemory ()
{
if (XCAM_IS_VALID_VK_ID (_mem_id) && _dev.ptr ()) {
_dev->free_mem_id (_mem_id);
}
}
void *
VKMemory::map (VkDeviceSize size, VkDeviceSize offset)
{
if (_mapped_ptr)
return _mapped_ptr;
XCAM_FAIL_RETURN (
ERROR,
xcam_ret_is_ok (_dev->map_mem (_mem_id, size, offset, _mapped_ptr)), NULL,
"VK memory map failed");
return _mapped_ptr;
}
void
VKMemory::unmap ()
{
if (_mapped_ptr) {
_dev->unmap_mem (_mem_id);
_mapped_ptr = NULL;
}
}
VKBuffer::VKBuffer (
const SmartPtr<VKDevice> dev,
VkBuffer buf_id,
VkDeviceMemory mem_id,
uint32_t size,
VkBufferUsageFlags usage,
VkMemoryPropertyFlags prop)
: VKMemory (dev, mem_id, size, prop)
, _buffer_id (buf_id)
, _usage_flags (usage)
, _prop_flags (prop)
{
}
VKBuffer::~VKBuffer ()
{
if (XCAM_IS_VALID_VK_ID (_buffer_id) && _dev.ptr ()) {
_dev->destroy_buf_id (_buffer_id);
}
}
XCamReturn
VKBuffer::bind ()
{
XCAM_ASSERT (XCAM_IS_VALID_VK_ID (_buffer_id));
XCAM_ASSERT (XCAM_IS_VALID_VK_ID (_mem_id));
return _dev->bind_buffer (_buffer_id, _mem_id, 0);
}
SmartPtr<VKBuffer>
VKBuffer::create_buffer (
const SmartPtr<VKDevice> dev,
VkBufferUsageFlags usage,
uint32_t size, void *data,
VkMemoryPropertyFlags mem_prop)
{
XCAM_FAIL_RETURN (
ERROR, dev.ptr () && size, NULL,
"vk create buffer failed because of dev or size errors");
VkBuffer buf_id = dev->create_buf_id (usage, size);
XCAM_FAIL_RETURN (
ERROR, XCAM_IS_VALID_VK_ID (buf_id), NULL,
"vk create buffer failed");
VkDevice dev_id = dev->get_dev_id ();
VkMemoryRequirements mem_reqs;
vkGetBufferMemoryRequirements (dev_id, buf_id, &mem_reqs);
VkDeviceMemory mem_id = dev->allocate_mem_id (mem_reqs.size, mem_prop);
XCAM_FAIL_RETURN (
ERROR, XCAM_IS_VALID_VK_ID (mem_id), NULL,
"vk create buffer failed in mem allocation");
// size == mem_reqs.size or size?
SmartPtr<VKBuffer> buf = new VKBuffer (dev, buf_id, mem_id, size, usage, mem_prop);
XCAM_FAIL_RETURN (
ERROR, xcam_ret_is_ok (buf->bind ()), NULL,
"vk create bufer failed when bind with memory");
if (!data)
return buf;
void *ptr = buf->map ();
XCAM_FAIL_RETURN (
ERROR, ptr, NULL,
"vk create bufer failed when map the buf");
memcpy (ptr, data, size);
buf->unmap ();
return buf;
}
VKBufDesc::VKBufDesc ()
{
xcam_mem_clear (desc_info);
}
VKBufDesc::VKBufDesc (const SmartPtr<VKBuffer> &buffer, NV12PlaneIdx plane)
: buf (buffer)
{
xcam_mem_clear (desc_info);
const VKBufInfo info = buffer->get_buf_info ();
desc_info.buffer = buffer->get_buf_id ();
desc_info.offset = info.offsets[plane];
desc_info.range = info.slice_size[plane];
}
VKBufDesc::VKBufDesc (const SmartPtr<VKBuffer> &buffer, uint32_t offset, size_t size)
: buf (buffer)
{
xcam_mem_clear (desc_info);
desc_info.buffer = buffer->get_buf_id ();
desc_info.offset = offset;
desc_info.range = size;
}
}