| // 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. | |
| #ifndef FLUTTER_SHELL_PLATFORM_FUCHSIA_FLUTTER_SURFACE_PRODUCER_H_ | |
| #define FLUTTER_SHELL_PLATFORM_FUCHSIA_FLUTTER_SURFACE_PRODUCER_H_ | |
| #include <fuchsia/ui/composition/cpp/fidl.h> | |
| #include <lib/zx/event.h> | |
| #include <functional> | |
| #include <memory> | |
| #include <vector> | |
| #include "third_party/skia/include/core/SkSize.h" | |
| #include "third_party/skia/include/core/SkSurface.h" | |
| #include "third_party/skia/include/gpu/GrDirectContext.h" | |
| namespace flutter_runner { | |
| using ReleaseImageCallback = std::function<void()>; | |
| // This represents an abstract notion of a "rendering surface", which is a | |
| // destination for pixels drawn by some rendering engine. In this case, the | |
| // rendering engine is Skia combined with one of its rendering backends. | |
| // | |
| // In addition to allowing Skia-based drawing via `GetSkiaSurface`, this | |
| // rendering surface can be shared with Scenic via `SetImageId`, | |
| // `GetBufferCollectionImportToken`, `GetAcquireFene`, and `GetReleaseFence`. | |
| class SurfaceProducerSurface { | |
| public: | |
| virtual ~SurfaceProducerSurface() = default; | |
| virtual bool IsValid() const = 0; | |
| virtual SkISize GetSize() const = 0; | |
| virtual void SetImageId(uint32_t image_id) = 0; | |
| virtual uint32_t GetImageId() = 0; | |
| virtual sk_sp<SkSurface> GetSkiaSurface() const = 0; | |
| virtual fuchsia::ui::composition::BufferCollectionImportToken | |
| GetBufferCollectionImportToken() = 0; | |
| virtual zx::event GetAcquireFence() = 0; | |
| virtual zx::event GetReleaseFence() = 0; | |
| virtual void SetReleaseImageCallback( | |
| ReleaseImageCallback release_image_callback) = 0; | |
| virtual size_t AdvanceAndGetAge() = 0; | |
| virtual bool FlushSessionAcquireAndReleaseEvents() = 0; | |
| virtual void SignalWritesFinished( | |
| const std::function<void(void)>& on_writes_committed) = 0; | |
| }; | |
| // This represents an abstract notion of "surface producer", which serves as a | |
| // source for `SurfaceProducerSurface`s. Produces surfaces should be returned | |
| // to this `SurfaceProducer` via `SubmitSurfaces`, at which point they will be | |
| // shared with Scenic. | |
| class SurfaceProducer { | |
| public: | |
| virtual ~SurfaceProducer() = default; | |
| virtual GrDirectContext* gr_context() const = 0; | |
| virtual std::unique_ptr<SurfaceProducerSurface> ProduceOffscreenSurface( | |
| const SkISize& size) = 0; | |
| virtual std::unique_ptr<SurfaceProducerSurface> ProduceSurface( | |
| const SkISize& size) = 0; | |
| virtual void SubmitSurfaces( | |
| std::vector<std::unique_ptr<SurfaceProducerSurface>> surfaces) = 0; | |
| }; | |
| } // namespace flutter_runner | |
| #endif // FLUTTER_SHELL_PLATFORM_FUCHSIA_FLUTTER_SURFACE_PRODUCER_H_ |