blob: 400c55708df52d6b0045a0f2cf838b0fb7d0f810 [file] [edit]
// Copyright 2020 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.
#ifndef LIB_SYSMEM_VERSION_SYSMEM_VERSION_H_
#define LIB_SYSMEM_VERSION_SYSMEM_VERSION_H_
#include <fuchsia/sysmem/c/fidl.h>
#include <fuchsia/sysmem/llcpp/fidl.h>
#include <fuchsia/sysmem2/llcpp/fidl.h>
namespace sysmem {
namespace internal {
// Can be replaced with std::type_identity<> when C++20.
template <typename T>
struct TypeIdentity {
using type = T;
};
template <typename T>
using TypeIdentity_t = typename TypeIdentity<T>::type;
// UnderlyingTypeOrType<T>::type gets std::underlying_type<T>::type if T is an enum, or T otherwise.
template <typename T, typename Enable = void>
struct UnderlyingTypeOrType : TypeIdentity<T> {};
template <typename T>
struct UnderlyingTypeOrType<T, typename std::enable_if<std::is_enum<T>::value>::type>
: std::underlying_type<T> {};
template <typename T>
using UnderlyingTypeOrType_t = typename UnderlyingTypeOrType<T>::type;
} // namespace internal
///////////////////////
// V2 Copy/Move from V1
///////////////////////
// We provide copy when the v1 Layout=Simple struct has MaxNumHandles == 0.
// We provide move when the v1 Layout=Simple struct has MaxNumHandles != 0.
// When we provide move, we only provide move from llcpp, not from FIDL C.
//
// See fidl_struct.h's TakeAsLlcpp() for a way to convert from FIDL C to llcpp first.
[[nodiscard]] llcpp::fuchsia::sysmem2::PixelFormat::Builder V2CopyFromV1PixelFormat(
fidl::Allocator* allocator, const llcpp::fuchsia::sysmem::PixelFormat& v1);
[[nodiscard]] llcpp::fuchsia::sysmem2::PixelFormat::Builder V2CopyFromV1PixelFormat(
fidl::Allocator* allocator, const fuchsia_sysmem_PixelFormat& v1);
[[nodiscard]] llcpp::fuchsia::sysmem2::ColorSpace::Builder V2CopyFromV1ColorSpace(
fidl::Allocator* allocator, const llcpp::fuchsia::sysmem::ColorSpace& v1);
[[nodiscard]] llcpp::fuchsia::sysmem2::ColorSpace::Builder V2CopyFromV1ColorSpace(
fidl::Allocator* allocator, const fuchsia_sysmem_ColorSpace& v1);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::ImageFormatConstraints::Builder>
V2CopyFromV1ImageFormatConstraints(fidl::Allocator* allocator,
const llcpp::fuchsia::sysmem::ImageFormatConstraints& v1);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::ImageFormatConstraints::Builder>
V2CopyFromV1ImageFormatConstraints(fidl::Allocator* allocator,
const fuchsia_sysmem_ImageFormatConstraints& v1);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::BufferUsage::Builder> V2CopyFromV1BufferUsage(
fidl::Allocator* allocator, const llcpp::fuchsia::sysmem::BufferUsage& v1);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::BufferUsage::Builder> V2CopyFromV1BufferUsage(
fidl::Allocator* allocator, const fuchsia_sysmem_BufferUsage& v1);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::BufferMemoryConstraints::Builder>
V2CopyFromV1BufferMemoryConstraints(fidl::Allocator* allocator,
const llcpp::fuchsia::sysmem::BufferMemoryConstraints& v1);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::BufferMemoryConstraints::Builder>
V2CopyFromV1BufferMemoryConstraints(fidl::Allocator* allocator,
const fuchsia_sysmem_BufferMemoryConstraints& v1);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::BufferCollectionConstraints::Builder>
V2CopyFromV1BufferCollectionConstraints(
fidl::Allocator* allocator, const llcpp::fuchsia::sysmem::BufferCollectionConstraints* v1,
const llcpp::fuchsia::sysmem::BufferCollectionConstraintsAuxBuffers* aux_buffers_v1);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::BufferCollectionConstraints::Builder>
V2CopyFromV1BufferCollectionConstraints(
fidl::Allocator* allocator, const fuchsia_sysmem_BufferCollectionConstraints* v1,
const fuchsia_sysmem_BufferCollectionConstraintsAuxBuffers* aux_buffers_v1);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::ImageFormat::Builder> V2CopyFromV1ImageFormat(
fidl::Allocator* allocator, const llcpp::fuchsia::sysmem::ImageFormat_2& v1);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::ImageFormat::Builder> V2CopyFromV1ImageFormat(
fidl::Allocator* allocator, const fuchsia_sysmem_ImageFormat_2& v1);
[[nodiscard]] llcpp::fuchsia::sysmem2::BufferMemorySettings::Builder
V2CopyFromV1BufferMemorySettings(fidl::Allocator* allocator,
const llcpp::fuchsia::sysmem::BufferMemorySettings& v1);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::SingleBufferSettings::Builder>
V2CopyFromV1SingleBufferSettings(fidl::Allocator* allocator,
const llcpp::fuchsia::sysmem::SingleBufferSettings& v1);
[[nodiscard]] llcpp::fuchsia::sysmem2::VmoBuffer::Builder V2MoveFromV1VmoBuffer(
fidl::Allocator* allocator, llcpp::fuchsia::sysmem::VmoBuffer&& to_move_v1);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::BufferCollectionInfo::Builder>
V2MoveFromV1BufferCollectionInfo(fidl::Allocator* allocator,
llcpp::fuchsia::sysmem::BufferCollectionInfo_2&& to_move_v1);
///////////////////////
// V1 Copy/Move from V2
///////////////////////
// TODO(dustingreen): Also accept all the v2 Table::Builder(s).
[[nodiscard]] fit::result<
std::pair<std::optional<llcpp::fuchsia::sysmem::BufferCollectionConstraints>,
std::optional<llcpp::fuchsia::sysmem::BufferCollectionConstraintsAuxBuffers>>>
V1CopyFromV2BufferCollectionConstraints(
const llcpp::fuchsia::sysmem2::BufferCollectionConstraints& v2);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem::BufferMemoryConstraints>
V1CopyFromV2BufferMemoryConstraints(const llcpp::fuchsia::sysmem2::BufferMemoryConstraints& v2);
[[nodiscard]] llcpp::fuchsia::sysmem::BufferUsage V1CopyFromV2BufferUsage(
const llcpp::fuchsia::sysmem2::BufferUsage& v2);
[[nodiscard]] llcpp::fuchsia::sysmem::BufferMemorySettings V1CopyFromV2BufferMemorySettings(
const llcpp::fuchsia::sysmem2::BufferMemorySettings& v2);
[[nodiscard]] llcpp::fuchsia::sysmem::PixelFormat V1CopyFromV2PixelFormat(
const llcpp::fuchsia::sysmem2::PixelFormat& v2);
[[nodiscard]] llcpp::fuchsia::sysmem::ColorSpace V1CopyFromV2ColorSpace(
const llcpp::fuchsia::sysmem2::ColorSpace& v2);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem::ImageFormatConstraints>
V1CopyFromV2ImageFormatConstraints(const llcpp::fuchsia::sysmem2::ImageFormatConstraints& v2);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem::ImageFormat_2> V1CopyFromV2ImageFormat(
llcpp::fuchsia::sysmem2::ImageFormat& v2);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem::SingleBufferSettings>
V1CopyFromV2SingleBufferSettings(const llcpp::fuchsia::sysmem2::SingleBufferSettings& v2);
[[nodiscard]] llcpp::fuchsia::sysmem::VmoBuffer V1MoveFromV2VmoBuffer(
llcpp::fuchsia::sysmem2::VmoBuffer&& to_move_v2);
[[nodiscard]] llcpp::fuchsia::sysmem::VmoBuffer V1AuxBuffersMoveFromV2VmoBuffer(
llcpp::fuchsia::sysmem2::VmoBuffer&& to_move_v2);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem::BufferCollectionInfo_2>
V1MoveFromV2BufferCollectionInfo(llcpp::fuchsia::sysmem2::BufferCollectionInfo&& to_move_v2);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem::BufferCollectionInfo_2>
V1AuxBuffersMoveFromV2BufferCollectionInfo(
llcpp::fuchsia::sysmem2::BufferCollectionInfo&& to_move_v2);
///////////
// V2 Clone
///////////
[[nodiscard]] llcpp::fuchsia::sysmem2::PixelFormat::Builder V2ClonePixelFormat(
fidl::Allocator* allocator, const llcpp::fuchsia::sysmem2::PixelFormat& src);
[[nodiscard]] llcpp::fuchsia::sysmem2::ColorSpace::Builder V2CloneColorSpace(
fidl::Allocator* allocator, const llcpp::fuchsia::sysmem2::ColorSpace& src);
[[nodiscard]] llcpp::fuchsia::sysmem2::BufferMemorySettings::Builder V2CloneBufferMemorySettings(
fidl::Allocator* allocator, const llcpp::fuchsia::sysmem2::BufferMemorySettings& src);
[[nodiscard]] llcpp::fuchsia::sysmem2::ImageFormatConstraints::Builder
V2CloneImageFormatConstraints(fidl::Allocator* allocator,
const llcpp::fuchsia::sysmem2::ImageFormatConstraints& src);
[[nodiscard]] llcpp::fuchsia::sysmem2::SingleBufferSettings::Builder V2CloneSingleBufferSettings(
fidl::Allocator* allocator, const llcpp::fuchsia::sysmem2::SingleBufferSettings& src);
[[nodiscard]] llcpp::fuchsia::sysmem2::SingleBufferSettings::Builder
V2CloneSingleBufferSettingsBuilder(
fidl::Allocator* allocator, const llcpp::fuchsia::sysmem2::SingleBufferSettings::Builder& src);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::VmoBuffer::Builder, zx_status_t>
V2CloneVmoBuffer(fidl::Allocator* allocator, const llcpp::fuchsia::sysmem2::VmoBuffer& src,
uint32_t vmo_rights_mask, uint32_t aux_vmo_rights_mask);
[[nodiscard]] fit::result<llcpp::fuchsia::sysmem2::BufferCollectionInfo::Builder, zx_status_t>
V2CloneBufferCollectionInfo(fidl::Allocator* allocator,
const llcpp::fuchsia::sysmem2::BufferCollectionInfo& src,
uint32_t vmo_rights_mask, uint32_t aux_vmo_rights_mask);
[[nodiscard]] llcpp::fuchsia::sysmem2::CoherencyDomainSupport::Builder
V2CloneCoherencyDomainSuppoort(fidl::Allocator* allocator,
const llcpp::fuchsia::sysmem2::CoherencyDomainSupport& src);
[[nodiscard]] llcpp::fuchsia::sysmem2::HeapProperties::Builder V2CloneHeapProperties(
fidl::Allocator* allocator, const llcpp::fuchsia::sysmem2::HeapProperties& src);
} // namespace sysmem
#endif // LIB_SYSMEM_VERSION_SYSMEM_VERSION_H_