blob: d567f2a5c43551c1630444a19a0192b3cae585e7 [file] [log] [blame]
// 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 <lib/magma/magma_sysmem.h>
#include <lib/magma/platform/platform_sysmem_connection.h>
#include <lib/magma/util/macros.h>
#include <lib/magma/util/short_macros.h>
magma_status_t magma_sysmem_connection_import(magma_handle_t channel,
magma_sysmem_connection_t* connection_out) {
auto platform_connection = magma_sysmem::PlatformSysmemConnection::Import(channel);
if (!platform_connection) {
return DRET_MSG(MAGMA_STATUS_INTERNAL_ERROR, "Failed to create sysmem connection");
}
*connection_out = reinterpret_cast<magma_sysmem_connection_t>(platform_connection.release());
return MAGMA_STATUS_OK;
}
void magma_sysmem_connection_release(magma_sysmem_connection_t connection) {
delete reinterpret_cast<magma_sysmem::PlatformSysmemConnection*>(connection);
}
magma_status_t magma_sysmem_connection_allocate_buffer(magma_sysmem_connection_t connection,
uint32_t flags, uint64_t size,
magma_handle_t* buffer_handle_out) {
std::unique_ptr<magma::PlatformBuffer> buffer;
auto sysmem_connection = reinterpret_cast<magma_sysmem::PlatformSysmemConnection*>(connection);
magma_status_t result;
result = sysmem_connection->AllocateBuffer(flags, size, &buffer);
if (result != MAGMA_STATUS_OK) {
return DRET_MSG(result, "AllocateBuffer failed: %d", result);
}
if (!buffer->duplicate_handle(buffer_handle_out)) {
return DRET_MSG(MAGMA_STATUS_INTERNAL_ERROR, "duplicate_handle failed");
}
return MAGMA_STATUS_OK;
}
void magma_collection_info_release(magma_collection_info_t collection_info) {
delete reinterpret_cast<magma_sysmem::PlatformBufferDescription*>(collection_info);
}
// |image_planes_out| must be an array with MAGMA_MAX_IMAGE_PLANES elements.
magma_status_t magma_collection_info_get_plane_info_with_size(
magma_collection_info_t collection_info, uint32_t width, uint32_t height,
magma_image_plane_t* image_planes_out) {
if (!collection_info) {
return DRET_MSG(MAGMA_STATUS_INVALID_ARGS, "Null collection_info");
}
auto buffer_collection_info =
reinterpret_cast<magma_sysmem::PlatformBufferDescription*>(collection_info);
if (!buffer_collection_info->GetPlanes(width, height, image_planes_out)) {
return DRET(MAGMA_STATUS_INVALID_ARGS);
}
return MAGMA_STATUS_OK;
}
magma_status_t magma_collection_info_get_format(magma_collection_info_t collection_info,
uint32_t* format_out) {
if (!collection_info) {
return DRET_MSG(MAGMA_STATUS_INVALID_ARGS, "Null collection_info");
}
auto buffer_collection_info =
reinterpret_cast<magma_sysmem::PlatformBufferDescription*>(collection_info);
*format_out = buffer_collection_info->format();
return MAGMA_STATUS_OK;
}
magma_status_t magma_collection_info_get_format_modifier(magma_collection_info_t collection_info,
magma_bool_t* has_format_modifier_out,
uint64_t* format_modifier_out) {
if (!collection_info) {
return DRET_MSG(MAGMA_STATUS_INVALID_ARGS, "Null collection_info");
}
auto buffer_collection_info =
reinterpret_cast<magma_sysmem::PlatformBufferDescription*>(collection_info);
*has_format_modifier_out = buffer_collection_info->has_format_modifier();
*format_modifier_out = buffer_collection_info->format_modifier();
return MAGMA_STATUS_OK;
}
magma_status_t magma_collection_info_get_color_space(magma_collection_info_t collection_info,
uint32_t* color_space_out) {
auto buffer_collection_info =
reinterpret_cast<magma_sysmem::PlatformBufferDescription*>(collection_info);
auto result = buffer_collection_info->GetColorSpace(color_space_out);
return DRET(result ? MAGMA_STATUS_OK : MAGMA_STATUS_INVALID_ARGS);
}
magma_status_t magma_collection_info_get_coherency_domain(magma_collection_info_t collection_info,
uint32_t* coherency_domain_out) {
if (!collection_info) {
return DRET_MSG(MAGMA_STATUS_INVALID_ARGS, "Null collection_info");
}
auto buffer_collection_info =
reinterpret_cast<magma_sysmem::PlatformBufferDescription*>(collection_info);
*coherency_domain_out = buffer_collection_info->coherency_domain();
return MAGMA_STATUS_OK;
}
magma_status_t magma_collection_info_get_buffer_count(magma_collection_info_t collection_info,
uint32_t* count_out) {
if (!collection_info) {
return DRET_MSG(MAGMA_STATUS_INVALID_ARGS, "Null collection_info");
}
auto buffer_collection_info =
reinterpret_cast<magma_sysmem::PlatformBufferDescription*>(collection_info);
*count_out = buffer_collection_info->count();
return MAGMA_STATUS_OK;
}
magma_status_t magma_collection_info_get_is_secure(magma_collection_info_t collection_info,
magma_bool_t* is_secure_out) {
if (!collection_info) {
return DRET_MSG(MAGMA_STATUS_INVALID_ARGS, "Null collection_info");
}
auto buffer_collection_info =
reinterpret_cast<magma_sysmem::PlatformBufferDescription*>(collection_info);
*is_secure_out = buffer_collection_info->is_secure();
return MAGMA_STATUS_OK;
}
magma_status_t magma_sysmem_connection_import_buffer_collection(
magma_sysmem_connection_t connection, magma_handle_t handle,
magma_buffer_collection_t* collection_out) {
auto sysmem_connection = reinterpret_cast<magma_sysmem::PlatformSysmemConnection*>(connection);
if (!handle) {
magma::Status status = sysmem_connection->CreateBufferCollectionToken(&handle);
if (!status.ok()) {
return DRET(status.get());
}
}
std::unique_ptr<magma_sysmem::PlatformBufferCollection> buffer_collection;
magma::Status status = sysmem_connection->ImportBufferCollection(handle, &buffer_collection);
if (!status.ok())
return status.get();
*collection_out = reinterpret_cast<magma_buffer_collection_t>(buffer_collection.release());
return MAGMA_STATUS_OK;
}
void magma_buffer_collection_release2(magma_buffer_collection_t collection) {
delete reinterpret_cast<magma_sysmem::PlatformBufferCollection*>(collection);
}
magma_status_t magma_sysmem_connection_create_buffer_constraints(
magma_sysmem_connection_t connection,
const magma_buffer_format_constraints_t* buffer_constraints_in,
magma_sysmem_buffer_constraints_t* constraints_out) {
auto sysmem_connection = reinterpret_cast<magma_sysmem::PlatformSysmemConnection*>(connection);
std::unique_ptr<magma_sysmem::PlatformBufferConstraints> buffer_constraints;
magma::Status status =
sysmem_connection->CreateBufferConstraints(buffer_constraints_in, &buffer_constraints);
if (!status.ok())
return status.get();
*constraints_out =
reinterpret_cast<magma_sysmem_buffer_constraints_t>(buffer_constraints.release());
return MAGMA_STATUS_OK;
}
magma_status_t magma_buffer_constraints_set_format2(
magma_sysmem_buffer_constraints_t constraints, uint32_t index,
const magma_image_format_constraints_t* format_constraints) {
auto buffer_constraints = reinterpret_cast<magma_sysmem::PlatformBufferConstraints*>(constraints);
return buffer_constraints->SetImageFormatConstraints(index, format_constraints).get();
}
magma_status_t magma_buffer_constraints_set_colorspaces2(
magma_sysmem_buffer_constraints_t constraints, uint32_t index, uint32_t color_space_count,
const uint32_t* color_spaces) {
auto buffer_constraints = reinterpret_cast<magma_sysmem::PlatformBufferConstraints*>(constraints);
return buffer_constraints->SetColorSpaces(index, color_space_count, color_spaces).get();
}
void magma_buffer_constraints_release2(magma_sysmem_buffer_constraints_t constraints) {
delete reinterpret_cast<magma_sysmem::PlatformBufferConstraints*>(constraints);
}
magma_status_t magma_buffer_collection_set_constraints2(
magma_buffer_collection_t collection, magma_sysmem_buffer_constraints_t constraints) {
auto buffer_collection = reinterpret_cast<magma_sysmem::PlatformBufferCollection*>(collection);
auto buffer_constraints = reinterpret_cast<magma_sysmem::PlatformBufferConstraints*>(constraints);
return buffer_collection->SetConstraints(buffer_constraints).get();
}
magma_status_t magma_buffer_collection_get_collection_info(
magma_buffer_collection_t collection, magma_collection_info_t* collection_info_out) {
auto buffer_collection = reinterpret_cast<magma_sysmem::PlatformBufferCollection*>(collection);
std::unique_ptr<magma_sysmem::PlatformBufferDescription> collection_info;
magma::Status status = buffer_collection->GetBufferDescription(&collection_info);
if (!status.ok()) {
return DRET_MSG(status.get(), "GetBufferDescription failed");
}
*collection_info_out = reinterpret_cast<magma_collection_info_t>(collection_info.release());
return MAGMA_STATUS_OK;
}
magma_status_t magma_buffer_collection_get_buffer_handle(magma_buffer_collection_t collection,
uint32_t index,
magma_handle_t* buffer_handle_out,
uint32_t* vmo_offset_out) {
auto buffer_collection = reinterpret_cast<magma_sysmem::PlatformBufferCollection*>(collection);
return buffer_collection->GetBufferHandle(index, buffer_handle_out, vmo_offset_out).get();
}
magma_status_t magma_collection_info_get_format_index(magma_collection_info_t collection_info,
magma_sysmem_buffer_constraints_t constraints,
magma_bool_t* format_valid_out,
uint32_t format_valid_count) {
auto buffer_collection_info =
reinterpret_cast<magma_sysmem::PlatformBufferDescription*>(collection_info);
auto buffer_constraints = reinterpret_cast<magma_sysmem::PlatformBufferConstraints*>(constraints);
if (!buffer_collection_info->GetFormatIndex(buffer_constraints, format_valid_out,
format_valid_count))
return DRET(MAGMA_STATUS_INTERNAL_ERROR);
return MAGMA_STATUS_OK;
}