File: flatland_surface_canvas.h

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (116 lines) | stat: -rw-r--r-- 3,740 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_OZONE_PLATFORM_FLATLAND_FLATLAND_SURFACE_CANVAS_H_
#define UI_OZONE_PLATFORM_FLATLAND_FLATLAND_SURFACE_CANVAS_H_

#include "base/memory/raw_ptr.h"
#include "base/memory/shared_memory_mapping.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h"
#include "third_party/skia/include/core/SkRegion.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "ui/gfx/geometry/size.h"
#include "ui/ozone/platform/flatland/flatland_connection.h"
#include "ui/ozone/public/surface_ozone_canvas.h"

namespace mojo {
class PlatformHandle;
}

namespace ui {

// SurfaceOzoneCanvas implementation for FlatlandWindow.
class FlatlandSurfaceCanvas : public SurfaceOzoneCanvas {
 public:
  FlatlandSurfaceCanvas(
      fuchsia::sysmem2::Allocator_Sync* sysmem_allocator,
      fuchsia::ui::composition::Allocator* flatland_allocator);

  FlatlandSurfaceCanvas(const FlatlandSurfaceCanvas&) = delete;
  FlatlandSurfaceCanvas& operator=(const FlatlandSurfaceCanvas&) = delete;

  ~FlatlandSurfaceCanvas() override;

  mojo::PlatformHandle CreateView();

  // SurfaceOzoneCanvas implementation.
  void ResizeCanvas(const gfx::Size& viewport_size, float scale) override;
  SkCanvas* GetCanvas() override;
  void PresentCanvas(const gfx::Rect& damage) override;
  std::unique_ptr<gfx::VSyncProvider> CreateVSyncProvider() override;

 private:
  // Use 3 buffers for optimal performance. One for the current visible frame,
  // one for the next frame to be displayed, one to render the following frame.
  static const size_t kNumBuffers = 3;

  struct Frame {
    Frame();
    ~Frame();

    // Sets the `vmo` to use for this frame.
    void InitializeBuffer(fuchsia::sysmem2::VmoBuffer vmo,
                          gfx::Size size,
                          size_t stride);

    // Reset the state and release the buffer.
    void Reset();

    // Copies pixels covered by |dirty_region| from another |frame|.
    void CopyDirtyRegionFrom(const Frame& frame);

    bool is_empty() { return !surface; }

    // Shared memory for the buffer.
    base::WritableSharedMemoryMapping memory_mapping;

    // SkSurface that wraps |memory_mapping|.
    sk_sp<SkSurface> surface;

    fuchsia::ui::composition::ContentId image_id = {};

    // Fence that will be released by Scenic when it stops using this frame.
    zx::event release_fence;

    // The region of the frame that's not up-to-date.
    SkRegion dirty_region;
  };

  class VSyncProviderImpl;

  void FinalizeBufferAllocation();
  void OnFramePresented(base::TimeTicks actual_presentation_time,
                        base::TimeDelta future_presentation_interval);

  void OnFlatlandError(fuchsia::ui::composition::FlatlandError error);

  const raw_ptr<fuchsia::sysmem2::Allocator_Sync> sysmem_allocator_;
  const raw_ptr<fuchsia::ui::composition::Allocator> flatland_allocator_;

  FlatlandConnection flatland_;

  Frame frames_[kNumBuffers];

  // Buffer index in |frames_| for the frame that's currently being rendered.
  size_t current_frame_ = 0;

  // View size in device pixels.
  gfx::Size viewport_size_;

  fuchsia::ui::composition::ParentViewportWatcherPtr parent_viewport_watcher_;
  fuchsia::ui::composition::TransformId root_transform_id_;

  // Pending buffer collection for the buffers.
  fuchsia::sysmem2::BufferCollectionSyncPtr buffer_collection_;
  fuchsia::ui::composition::BufferCollectionImportToken import_token_;

  base::WeakPtr<VSyncProviderImpl> vsync_provider_;

  THREAD_CHECKER(thread_checker_);
};

}  // namespace ui

#endif  // UI_OZONE_PLATFORM_FLATLAND_FLATLAND_SURFACE_CANVAS_H_