blob: acaa1b7748b570e64072988c3ce9dc26064a1ad1 [file] [log] [blame] [edit]
// Copyright 2023 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 SRC_GRAPHICS_DISPLAY_LIB_FAKE_DISPLAY_STACK_IMAGE_INFO_H_
#define SRC_GRAPHICS_DISPLAY_LIB_FAKE_DISPLAY_STACK_IMAGE_INFO_H_
#include <fidl/fuchsia.images2/cpp/wire.h>
#include <fidl/fuchsia.math/cpp/wire.h>
#include <fidl/fuchsia.sysmem2/cpp/wire.h>
#include <lib/zx/result.h>
#include <lib/zx/vmo.h>
#include <cstddef>
#include <memory>
#include <fbl/intrusive_hash_table.h>
#include <fbl/intrusive_single_list.h>
#include "src/graphics/display/lib/api-types/cpp/driver-capture-image-id.h"
#include "src/graphics/display/lib/api-types/cpp/driver-image-id.h"
#include "src/graphics/display/lib/api-types/cpp/image-metadata.h"
namespace fake_display {
struct SysmemBufferInfo {
// Retrieves BufferCollection information from sysmem.
static zx::result<SysmemBufferInfo> GetSysmemMetadata(
fidl::WireSyncClient<fuchsia_sysmem2::BufferCollection>& sysmem_client,
uint32_t buffer_index);
zx::vmo image_vmo;
uint64_t image_vmo_offset;
fuchsia_images2::wire::PixelFormat pixel_format;
fuchsia_images2::wire::PixelFormatModifier pixel_format_modifier;
fuchsia_math::wire::SizeU minimum_size;
uint32_t minimum_bytes_per_row;
fuchsia_sysmem2::wire::CoherencyDomain coherency_domain;
};
class DisplayImageInfo : public fbl::SinglyLinkedListable<std::unique_ptr<DisplayImageInfo>> {
public:
using IdType = display::DriverImageId;
using HashTable = fbl::HashTable<IdType, std::unique_ptr<DisplayImageInfo>>;
DisplayImageInfo(IdType id, display::ImageMetadata metadata, SysmemBufferInfo buffer_info);
~DisplayImageInfo() = default;
// Disallow copy and move.
DisplayImageInfo(const DisplayImageInfo&) = delete;
DisplayImageInfo& operator=(const DisplayImageInfo&) = delete;
DisplayImageInfo(DisplayImageInfo&&) = delete;
DisplayImageInfo& operator=(DisplayImageInfo&&) = delete;
// Trait implementation for fbl::HashTable
HashTable::KeyType GetKey() const;
static size_t GetHash(HashTable::KeyType key);
IdType id() const { return id_; }
const SysmemBufferInfo& sysmem_buffer_info() const { return sysmem_buffer_info_; }
const display::ImageMetadata& metadata() const { return metadata_; }
const zx::vmo& vmo() const { return sysmem_buffer_info_.image_vmo; }
private:
IdType id_;
display::ImageMetadata metadata_;
SysmemBufferInfo sysmem_buffer_info_;
};
class CaptureImageInfo : public fbl::SinglyLinkedListable<std::unique_ptr<CaptureImageInfo>> {
public:
using IdType = display::DriverCaptureImageId;
using HashTable = fbl::HashTable<IdType, std::unique_ptr<CaptureImageInfo>>;
CaptureImageInfo(IdType id, display::ImageMetadata metadata, SysmemBufferInfo buffer_info);
~CaptureImageInfo() = default;
// Disallow copy and move.
CaptureImageInfo(const CaptureImageInfo&) = delete;
CaptureImageInfo& operator=(const CaptureImageInfo&) = delete;
CaptureImageInfo(CaptureImageInfo&&) = delete;
CaptureImageInfo& operator=(CaptureImageInfo&&) = delete;
// Trait implementation for fbl::HashTable
HashTable::KeyType GetKey() const;
static size_t GetHash(HashTable::KeyType key);
IdType id() const { return id_; }
const SysmemBufferInfo& sysmem_buffer_info() const { return sysmem_buffer_info_; }
const display::ImageMetadata& metadata() const { return metadata_; }
const zx::vmo& vmo() const { return sysmem_buffer_info_.image_vmo; }
private:
IdType id_;
display::ImageMetadata metadata_;
SysmemBufferInfo sysmem_buffer_info_;
};
} // namespace fake_display
#endif // SRC_GRAPHICS_DISPLAY_LIB_FAKE_DISPLAY_STACK_IMAGE_INFO_H_