// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "msd_img_buffer.h"

std::unique_ptr<MsdImgBuffer>
MsdImgBuffer::Import(uint32_t handle)
{
	auto platform_buf = magma::PlatformBuffer::Import(handle);
	if (!platform_buf)
		return DRETP(nullptr, "MsdImgBuffer::Create: Could not create platform buffer from token");

	return std::unique_ptr<MsdImgBuffer>(new MsdImgBuffer(std::move(platform_buf)));
}

std::unique_ptr<MsdImgBuffer>
MsdImgBuffer::Create(uint64_t size, const char* name)
{
	auto platform_buf = magma::PlatformBuffer::Create(size, name);
	if (!platform_buf)
		return DRETP(nullptr, "MsdImgBuffer::Create: Could not create platform buffer from size");

	return std::unique_ptr<MsdImgBuffer>(new MsdImgBuffer(std::move(platform_buf)));
}

MsdImgBuffer::MsdImgBuffer(std::unique_ptr<magma::PlatformBuffer> platform_buf) : platform_buf_(std::move(platform_buf)) {}

MsdImgBuffer::~MsdImgBuffer() {}


//////////////////////////////////////////////////////////////////////////////

msd_buffer_t*
msd_buffer_import(uint32_t handle)
{
	auto buffer = MsdImgBuffer::Import(handle);
	if (!buffer)
		return DRETP(nullptr, "msd_buffer_import failed");
	return new MsdImgAbiBuffer(std::move(buffer));
}

void
msd_buffer_destroy(msd_buffer_t* buf)
{
	delete MsdImgAbiBuffer::cast(buf);
}
