diff options
Diffstat (limited to 'cros_gralloc/cros_gralloc_buffer_metadata.h')
-rw-r--r-- | cros_gralloc/cros_gralloc_buffer_metadata.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/cros_gralloc/cros_gralloc_buffer_metadata.h b/cros_gralloc/cros_gralloc_buffer_metadata.h new file mode 100644 index 0000000..361a472 --- /dev/null +++ b/cros_gralloc/cros_gralloc_buffer_metadata.h @@ -0,0 +1,67 @@ +/* + * Copyright 2022 The Chromium OS 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 CROSGRALLOC4METADATA_H +#define CROSGRALLOC4METADATA_H + +#include <optional> +#include <type_traits> + +#include <aidl/android/hardware/graphics/common/BlendMode.h> +#include <aidl/android/hardware/graphics/common/Cta861_3.h> +#include <aidl/android/hardware/graphics/common/Dataspace.h> +#include <aidl/android/hardware/graphics/common/Smpte2086.h> + +#include "cros_gralloc_helpers.h" + +// Simple replacement for std::optional which is not guarenteed to be memory layout +// stable across ABIs. +template <typename T> struct cros_buffer_optional { + + enum class state : uint32_t { VACANT, OCCUPIED }; + + cros_buffer_optional() = default; + + cros_buffer_optional(std::optional<T> v) : occupancy(v ? state::OCCUPIED : state::VACANT) + { + if (v) { + value = *v; + } + } + + std::optional<T> to_std_optional() const + { + return occupancy == state::VACANT ? std::nullopt : std::make_optional(value); + } + + state occupancy = state::VACANT; + T value; +}; + +/* + * The metadata for cros_gralloc_buffer-s that should reside in a shared memory region + * instead of directly in cros_gralloc_handle-s. + * + * Any metadata that is mutable must be stored in this shared memory region as + * cros_gralloc_handle-s can not be tracked and updated across processes. + */ +struct cros_gralloc_buffer_metadata { + /* + * Name is stored in the shared memory metadata to simplify cros_gralloc_handle + * creation. This allows us to keep handles small while avoiding variable sized + * handles. + */ + char name[CROS_GRALLOC_BUFFER_METADATA_MAX_NAME_SIZE]; + aidl::android::hardware::graphics::common::BlendMode blend_mode; + aidl::android::hardware::graphics::common::Dataspace dataspace; + cros_buffer_optional<aidl::android::hardware::graphics::common::Cta861_3> cta861_3; + cros_buffer_optional<aidl::android::hardware::graphics::common::Smpte2086> smpte2086; +}; + +static_assert(std::is_standard_layout_v<cros_gralloc_buffer_metadata>); +static_assert(std::is_trivially_copyable_v<cros_gralloc_buffer_metadata>); + +#endif |