blob: c1af8fb7156ecdf92dd8cd270ea4f46886200a0f [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <fuchsia/sysmem/cpp/fidl.h>
#include <fuchsia/ui/composition/cpp/fidl.h>
#include <lib/async/cpp/wait.h>
#include <lib/ui/scenic/cpp/id.h>
#include <lib/ui/scenic/cpp/resources.h>
#include <lib/zx/event.h>
#include <lib/zx/vmo.h>
#include <array>
#include <cstdint>
#include <memory>
#include "flutter/fml/macros.h"
#include "third_party/skia/include/core/SkSize.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "surface_producer.h"
namespace flutter_runner {
class SoftwareSurface final : public SurfaceProducerSurface {
public:
SoftwareSurface(fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator,
fuchsia::ui::composition::AllocatorPtr& flatland_allocator,
scenic::Session* session,
const SkISize& size);
~SoftwareSurface() override;
size_t GetAllocationSize() const { return surface_size_bytes_; }
// |SurfaceProducerSurface|
size_t AdvanceAndGetAge() override;
// |SurfaceProducerSurface|
bool FlushSessionAcquireAndReleaseEvents() override;
// |SurfaceProducerSurface|
bool IsValid() const override;
// |SurfaceProducerSurface|
SkISize GetSize() const override;
// |SurfaceProducerSurface|
void SignalWritesFinished(
const std::function<void(void)>& on_surface_read_finished) override;
// |SurfaceProducerSurface|
void SetImageId(uint32_t image_id) override;
// |SurfaceProducerSurface|
uint32_t GetImageId() override;
// |SurfaceProducerSurface|
sk_sp<SkSurface> GetSkiaSurface() const override;
// |SurfaceProducerSurface|
fuchsia::ui::composition::BufferCollectionImportToken
GetBufferCollectionImportToken() override;
// |SurfaceProducerSurface|
zx::event GetAcquireFence() override;
// |SurfaceProducerSurface|
zx::event GetReleaseFence() override;
// |SurfaceProducerSurface|
void SetReleaseImageCallback(
ReleaseImageCallback release_image_callback) override;
private:
void OnSurfaceReadFinished(async_dispatcher_t* dispatcher,
async::WaitBase* wait,
zx_status_t status,
const zx_packet_signal_t* signal);
bool SetupSkiaSurface(
fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator,
fuchsia::ui::composition::AllocatorPtr& flatland_allocator,
const SkISize& size);
bool CreateFences();
void Reset();
static uint32_t sNextBufferId; // For legacy gfx; counter for `buffer_id_`.
scenic::Session* session_; // Legacy gfx API endpoint.
scenic::ResourceId image_id_{0}; // Legacy gfx image ID.
sk_sp<SkSurface> sk_surface_;
// This is associated with `release_event_` and allows detection of when
// scenic has finished reading from the surface (and thus it is safe to re-use
// for writing).
async::WaitMethod<SoftwareSurface, &SoftwareSurface::OnSurfaceReadFinished>
wait_for_surface_read_finished_;
// Called when scenic has finished reading from the surface, to allow
// `SoftwareSurfaceProducer` to re-use the surface.
std::function<void()> surface_read_finished_callback_;
// Called when the surface is destroyed, to allow
// `FlatlandExternalViewEmbedder` to release the associated Flatland image.
ReleaseImageCallback release_image_callback_;
// Allows Flatland to associate this surface with a Flatland Image.
fuchsia::ui::composition::BufferCollectionImportToken import_token_;
uint32_t buffer_id_{0}; // Legacy gfx version of the import_token_.
zx::event acquire_event_; // Signals to scenic that writing is finished.
zx::event release_event_; // Signalled by scenic that reading is finished.
zx::vmo surface_vmo_; // VMO that is backing the surface memory.
uint32_t surface_size_bytes_; // Size of the surface memory, in bytes.
size_t age_{0}; // Number of frames since surface was last written to.
bool needs_cache_clean_{false};
bool valid_{false};
FML_DISALLOW_COPY_AND_ASSIGN(SoftwareSurface);
};
} // namespace flutter_runner