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
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  161
  162
  163
  164
  165
  166
  167
  168
  169
  170
  171
  172
  173
  174
  175
  176
  177
  178
  179
  180
  181
  182
  183
  184
  185
  186
  187
  188
  189
  190
  191
  192
  193
  194
  195

cc / raster / raster_source.h [blame]

// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CC_RASTER_RASTER_SOURCE_H_
#define CC_RASTER_RASTER_SOURCE_H_

#include <stddef.h>

#include <memory>
#include <string>
#include <vector>

#include "base/containers/flat_map.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "cc/cc_export.h"
#include "cc/debug/rendering_stats_instrumentation.h"
#include "cc/layers/recording_source.h"
#include "cc/paint/image_id.h"
#include "cc/paint/scroll_offset_map.h"
#include "gpu/command_buffer/client/raster_interface.h"
#include "third_party/skia/include/core/SkPicture.h"
#include "ui/gfx/color_space.h"

namespace base {
namespace trace_event {
class TracedValue;
}  // namespace trace_event
}  // namespace base

namespace gfx {
class AxisTransform2d;
}  // namespace gfx

namespace cc {
class DisplayItemList;
class ImageProvider;

class CC_EXPORT RasterSource : public base::RefCountedThreadSafe<RasterSource> {
 public:
  struct CC_EXPORT PlaybackSettings {
    PlaybackSettings();
    PlaybackSettings(const PlaybackSettings&);
    PlaybackSettings(PlaybackSettings&&);
    ~PlaybackSettings();

    // If set to true, we should use LCD text.
    bool use_lcd_text = true;

    // Specifies the sample count if MSAA is enabled for this tile.
    int msaa_sample_count = 0;

    // Visible hint, GPU may use it as a hint to schedule raster tasks.
    bool visible = false;

    // The HDR headroom to use when tone mapping content.
    float hdr_headroom = 1.f;

    raw_ptr<ImageProvider> image_provider = nullptr;
    raw_ptr<const ScrollOffsetMap> raster_inducing_scroll_offsets = nullptr;
  };

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

  // This is useful for rastering into tiles. |canvas| is expected to be backed
  // by a tile, with a default state. |raster_transform| will be applied to the
  // display list, rastering the list into the "content space".
  // |canvas_bitmap_rect| defines the extent of the tile in the content space,
  // i.e. contents in the rect will be cropped and translated onto the canvas.
  // |canvas_playback_rect| can be used to replay only part of the recording in,
  // the content space, so only a sub-rect of the tile gets rastered.
  //
  // Note that this should only be called after the image decode controller has
  // been set, which happens during commit.
  void PlaybackToCanvas(SkCanvas* canvas,
                        const gfx::Size& content_size,
                        const gfx::Rect& canvas_bitmap_rect,
                        const gfx::Rect& canvas_playback_rect,
                        const gfx::AxisTransform2d& raster_transform,
                        const PlaybackSettings& settings) const;

  // Returns whether the given rect at given scale is of solid color in
  // this raster source, as well as the solid color value.
  //
  // If max_ops_to_analyze is set, changes the default maximum number of
  // operations to analyze before giving up. Careful: even very simple lists can
  // have more than one operation, so 1 may not be the value you're looking
  // for. For instance, solid color tiles generated for views have 3
  // operations. See comments in TileManager::AssignGpuMemoryToTils() for
  // details.
  bool PerformSolidColorAnalysis(gfx::Rect content_rect,
                                 SkColor4f* color,
                                 int max_ops_to_analyze = 1) const;

  // Returns true iff the whole raster source is of solid color.
  bool IsSolidColor() const;

  // Returns the color of the raster source if it is solid color. The results
  // are unspecified if IsSolidColor returns false.
  SkColor4f GetSolidColor() const;

  // Returns the recorded layer size of this raster source.
  gfx::Size size() const { return size_; }

  // Returns the content size of this raster source at a particular scale.
  gfx::Size GetContentSize(const gfx::Vector2dF& content_scale) const;

  // Return true iff this raster source can raster the given rect in layer
  // space.
  bool IntersectsRect(const gfx::Rect& layer_rect) const;

  // Returns true if this raster source has anything to rasterize.
  bool HasRecordings() const;

  // Valid rectangle in which anything is recorded and can be rastered from.
  gfx::Rect recorded_bounds() const {
    // TODO(crbug.com/41490692): Create tiling for directly composited images
    // based on the recorded bounds.
    return directly_composited_image_info_ ? gfx::Rect(size_)
                                           : recorded_bounds_;
  }

  // Tracing functionality.
  void DidBeginTracing();
  void AsValueInto(base::trace_event::TracedValue* array) const;

  const scoped_refptr<const DisplayItemList>& GetDisplayItemList() const {
    return display_list_;
  }

  float recording_scale_factor() const { return recording_scale_factor_; }

  SkColor4f background_color() const { return background_color_; }

  bool requires_clear() const { return requires_clear_; }

  size_t* max_op_size_hint() { return &max_op_size_hint_; }

  const std::optional<DirectlyCompositedImageInfo>&
  directly_composited_image_info() const {
    return directly_composited_image_info_;
  }

  void set_debug_name(const std::string& name) { debug_name_ = name; }
  const std::string& debug_name() const { return debug_name_; }

 protected:
  // RecordingSource is the only class that can create a raster source.
  friend class RecordingSource;
  friend class base::RefCountedThreadSafe<RasterSource>;

  explicit RasterSource(const RecordingSource& other);
  virtual ~RasterSource();

  void ClearForOpaqueRaster(SkCanvas* raster_canvas,
                            const gfx::AxisTransform2d& raster_transform,
                            const gfx::Size& content_size,
                            const gfx::Rect& canvas_bitmap_rect,
                            const gfx::Rect& canvas_playback_rect) const;

  // Raster the display list of this raster source into the given canvas.
  // Canvas states such as CTM and clip region will be respected.
  // This function will replace pixels in the clip region without blending.
  //
  // Virtual for testing.
  virtual void PlaybackDisplayListToCanvas(
      SkCanvas* canvas,
      const PlaybackSettings& settings) const;

  // The serialized size for the largest op in this RasterSource. This is
  // accessed only on the raster threads with the context lock acquired.
  size_t max_op_size_hint_ =
      gpu::raster::RasterInterface::kDefaultMaxOpSizeHint;

  // These members are const as this raster source may be in use on another
  // thread and so should not be touched after construction.
  const scoped_refptr<const DisplayItemList> display_list_;
  const SkColor4f background_color_;
  const bool requires_clear_;
  const bool is_solid_color_;
  const SkColor4f solid_color_;
  const gfx::Rect recorded_bounds_;
  const gfx::Size size_;
  const int slow_down_raster_scale_factor_for_debug_;
  const float recording_scale_factor_;
  std::optional<DirectlyCompositedImageInfo> directly_composited_image_info_;
  // Used for debugging and tracing.
  std::string debug_name_;
};

}  // namespace cc

#endif  // CC_RASTER_RASTER_SOURCE_H_