blob: 38b63355568d170c81bb8de44130a54f961d7fb6 [file] [log] [blame]
// Copyright 2021 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 "src/devices/lib/sysmem/sysmem.h"
namespace sysmem {
static void pixel_format_banjo_from_fidl(const fuchsia_sysmem_PixelFormat& source,
pixel_format_t& destination) {
destination.type = source.type;
destination.has_format_modifier = source.has_format_modifier;
destination.format_modifier = {fuchsia_sysmem_FORMAT_MODIFIER_NONE};
if (source.has_format_modifier) {
destination.format_modifier = {source.format_modifier.value};
}
}
void pixel_format_fidl_from_banjo(const pixel_format_t& source,
fuchsia_sysmem_PixelFormat& destination) {
destination.type = source.type;
destination.has_format_modifier = source.has_format_modifier;
destination.format_modifier = {fuchsia_sysmem_FORMAT_MODIFIER_NONE};
if (source.has_format_modifier) {
destination.format_modifier = {source.format_modifier.value};
}
}
static void vmo_buffer_banjo_from_fidl(const fuchsia_sysmem_VmoBuffer& source,
vmo_buffer_t& destination) {
destination.vmo = source.vmo;
destination.vmo_usable_start = source.vmo_usable_start;
}
static void vmo_buffer_fidl_from_banjo(const vmo_buffer_t& source,
fuchsia_sysmem_VmoBuffer& destination) {
destination.vmo = source.vmo;
destination.vmo_usable_start = source.vmo_usable_start;
}
static void image_format_constraints_banjo_from_fidl(
const fuchsia_sysmem_ImageFormatConstraints& source, image_format_constraints_t& destination) {
pixel_format_banjo_from_fidl(source.pixel_format, destination.pixel_format);
destination.color_spaces_count = source.color_spaces_count;
for (size_t i = 0; i < source.color_spaces_count; i++) {
destination.color_space[i].type = source.color_space[i].type;
}
destination.min_coded_width = source.min_coded_width;
destination.max_coded_width = source.max_coded_width;
destination.min_coded_height = source.min_coded_height;
destination.max_coded_height = source.max_coded_height;
destination.min_bytes_per_row = source.min_bytes_per_row;
destination.max_bytes_per_row = source.max_bytes_per_row;
destination.max_coded_width_times_coded_height = source.max_coded_width_times_coded_height;
destination.layers = source.layers;
destination.coded_width_divisor = source.coded_width_divisor;
destination.coded_height_divisor = source.coded_height_divisor;
destination.bytes_per_row_divisor = source.bytes_per_row_divisor;
destination.start_offset_divisor = source.start_offset_divisor;
destination.display_width_divisor = source.display_width_divisor;
destination.display_height_divisor = source.display_height_divisor;
destination.required_min_coded_width = source.required_min_coded_width;
destination.required_max_coded_width = source.required_max_coded_width;
destination.required_min_coded_height = source.required_min_coded_height;
destination.required_max_coded_height = source.required_max_coded_height;
destination.required_min_bytes_per_row = source.required_min_bytes_per_row;
destination.required_max_bytes_per_row = source.required_max_bytes_per_row;
}
static void image_format_constraints_fidl_from_banjo(
const image_format_constraints_t& source, fuchsia_sysmem_ImageFormatConstraints& destination) {
pixel_format_fidl_from_banjo(source.pixel_format, destination.pixel_format);
destination.color_spaces_count = source.color_spaces_count;
for (size_t i = 0; i < source.color_spaces_count; i++) {
destination.color_space[i].type = source.color_space[i].type;
}
destination.min_coded_width = source.min_coded_width;
destination.max_coded_width = source.max_coded_width;
destination.min_coded_height = source.min_coded_height;
destination.max_coded_height = source.max_coded_height;
destination.min_bytes_per_row = source.min_bytes_per_row;
destination.max_bytes_per_row = source.max_bytes_per_row;
destination.max_coded_width_times_coded_height = source.max_coded_width_times_coded_height;
destination.layers = source.layers;
destination.coded_width_divisor = source.coded_width_divisor;
destination.coded_height_divisor = source.coded_height_divisor;
destination.bytes_per_row_divisor = source.bytes_per_row_divisor;
destination.start_offset_divisor = source.start_offset_divisor;
destination.display_width_divisor = source.display_width_divisor;
destination.display_height_divisor = source.display_height_divisor;
destination.required_min_coded_width = source.required_min_coded_width;
destination.required_max_coded_width = source.required_max_coded_width;
destination.required_min_coded_height = source.required_min_coded_height;
destination.required_max_coded_height = source.required_max_coded_height;
destination.required_min_bytes_per_row = source.required_min_bytes_per_row;
destination.required_max_bytes_per_row = source.required_max_bytes_per_row;
}
static void single_buffer_settings_banjo_from_fidl(
const fuchsia_sysmem_SingleBufferSettings& source, single_buffer_settings_t& destination) {
destination.buffer_settings = {
.size_bytes = source.buffer_settings.size_bytes,
.is_physically_contiguous = source.buffer_settings.is_physically_contiguous,
.is_secure = source.buffer_settings.is_secure,
.coherency_domain = source.buffer_settings.coherency_domain,
.heap = source.buffer_settings.heap,
};
destination.has_image_format_constraints = source.has_image_format_constraints;
if (source.has_image_format_constraints) {
image_format_constraints_banjo_from_fidl(source.image_format_constraints,
destination.image_format_constraints);
}
}
static void single_buffer_settings_fidl_from_banjo(
const single_buffer_settings_t& source, fuchsia_sysmem_SingleBufferSettings& destination) {
destination.buffer_settings = {
.size_bytes = source.buffer_settings.size_bytes,
.is_physically_contiguous = source.buffer_settings.is_physically_contiguous,
.is_secure = source.buffer_settings.is_secure,
.coherency_domain = source.buffer_settings.coherency_domain,
.heap = source.buffer_settings.heap,
};
destination.has_image_format_constraints = source.has_image_format_constraints;
if (source.has_image_format_constraints) {
image_format_constraints_fidl_from_banjo(source.image_format_constraints,
destination.image_format_constraints);
}
}
void image_format_2_banjo_from_fidl(const fuchsia_sysmem_ImageFormat_2& source,
image_format_2_t& destination) {
pixel_format_banjo_from_fidl(source.pixel_format, destination.pixel_format);
destination.coded_width = source.coded_width;
destination.coded_height = source.coded_height;
destination.bytes_per_row = source.bytes_per_row;
destination.display_width = source.display_width;
destination.display_height = source.display_height;
destination.layers = source.layers;
destination.color_space = {source.color_space.type};
destination.has_pixel_aspect_ratio = source.has_pixel_aspect_ratio;
destination.pixel_aspect_ratio_width = source.pixel_aspect_ratio_width;
destination.pixel_aspect_ratio_height = source.pixel_aspect_ratio_height;
}
void image_format_2_fidl_from_banjo(const image_format_2_t& source,
fuchsia_sysmem_ImageFormat_2& destination) {
pixel_format_fidl_from_banjo(source.pixel_format, destination.pixel_format);
destination.coded_width = source.coded_width;
destination.coded_height = source.coded_height;
destination.bytes_per_row = source.bytes_per_row;
destination.display_width = source.display_width;
destination.display_height = source.display_height;
destination.layers = source.layers;
destination.color_space = {source.color_space.type};
destination.has_pixel_aspect_ratio = source.has_pixel_aspect_ratio;
destination.pixel_aspect_ratio_width = source.pixel_aspect_ratio_width;
destination.pixel_aspect_ratio_height = source.pixel_aspect_ratio_height;
}
void buffer_collection_info_2_banjo_from_fidl(const fuchsia_sysmem_BufferCollectionInfo_2& source,
buffer_collection_info_2_t& destination) {
destination.buffer_count = source.buffer_count;
single_buffer_settings_banjo_from_fidl(source.settings, destination.settings);
for (size_t i = 0; i < source.buffer_count; i++) {
vmo_buffer_banjo_from_fidl(source.buffers[i], destination.buffers[i]);
}
}
void buffer_collection_info_2_fidl_from_banjo(const buffer_collection_info_2_t& source,
fuchsia_sysmem_BufferCollectionInfo_2& destination) {
destination.buffer_count = source.buffer_count;
single_buffer_settings_fidl_from_banjo(source.settings, destination.settings);
for (size_t i = 0; i < source.buffer_count; i++) {
vmo_buffer_fidl_from_banjo(source.buffers[i], destination.buffers[i]);
}
}
} // namespace sysmem