xref: /aosp_15_r20/external/skia/src/gpu/graphite/Surface_Graphite.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2021 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_Surface_Graphite_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_Surface_Graphite_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/image/SkSurface_Base.h"
12*c8dee2aaSAndroid Build Coastguard Worker 
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/SkBackingFit.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ResourceTypes.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/TextureProxyView.h"
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker class Context;
21*c8dee2aaSAndroid Build Coastguard Worker class Device;
22*c8dee2aaSAndroid Build Coastguard Worker class Image;
23*c8dee2aaSAndroid Build Coastguard Worker class Recorder;
24*c8dee2aaSAndroid Build Coastguard Worker class TextureProxy;
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker class Surface final : public SkSurface_Base {
27*c8dee2aaSAndroid Build Coastguard Worker public:
28*c8dee2aaSAndroid Build Coastguard Worker     // Convenience factory to create a Device, instantiate its target proxy and return as a Surface.
29*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<Surface> Make(Recorder* recorder,
30*c8dee2aaSAndroid Build Coastguard Worker                                const SkImageInfo& info,
31*c8dee2aaSAndroid Build Coastguard Worker                                std::string_view label,
32*c8dee2aaSAndroid Build Coastguard Worker                                Budgeted budgeted,
33*c8dee2aaSAndroid Build Coastguard Worker                                Mipmapped mipmapped = Mipmapped::kNo,
34*c8dee2aaSAndroid Build Coastguard Worker                                SkBackingFit backingFit = SkBackingFit::kExact,
35*c8dee2aaSAndroid Build Coastguard Worker                                const SkSurfaceProps* props = nullptr) {
36*c8dee2aaSAndroid Build Coastguard Worker         return Make(recorder, info, std::move(label), budgeted, mipmapped, backingFit, props,
37*c8dee2aaSAndroid Build Coastguard Worker                     LoadOp::kClear, /*registerWithRecorder=*/true);
38*c8dee2aaSAndroid Build Coastguard Worker     }
39*c8dee2aaSAndroid Build Coastguard Worker     // Make a surface that is not registered with the provided recorder. This surface should be
40*c8dee2aaSAndroid Build Coastguard Worker     // short-lived and it must be flushed manually for its draw commands to be recorded. Most
41*c8dee2aaSAndroid Build Coastguard Worker     // scratch surfaces will be budgeted, but if the underlying texture is being returned as a
42*c8dee2aaSAndroid Build Coastguard Worker     // client-owned image, that may not be the case.
43*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<Surface> MakeScratch(Recorder* recorder,
44*c8dee2aaSAndroid Build Coastguard Worker                                       const SkImageInfo& info,
45*c8dee2aaSAndroid Build Coastguard Worker                                       std::string_view label,
46*c8dee2aaSAndroid Build Coastguard Worker                                       Budgeted budgeted = Budgeted::kYes,
47*c8dee2aaSAndroid Build Coastguard Worker                                       Mipmapped mipmapped = Mipmapped::kNo,
48*c8dee2aaSAndroid Build Coastguard Worker                                       SkBackingFit backingFit = SkBackingFit::kApprox) {
49*c8dee2aaSAndroid Build Coastguard Worker         return Make(recorder, info, std::move(label), budgeted, mipmapped, backingFit,
50*c8dee2aaSAndroid Build Coastguard Worker                     /*props=*/nullptr, LoadOp::kDiscard, /*registerWithRecorder=*/false);
51*c8dee2aaSAndroid Build Coastguard Worker     }
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker     Surface(sk_sp<Device>);
54*c8dee2aaSAndroid Build Coastguard Worker     ~Surface() override;
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker     // From SkSurface.h
57*c8dee2aaSAndroid Build Coastguard Worker     SkImageInfo imageInfo() const override;
58*c8dee2aaSAndroid Build Coastguard Worker 
59*c8dee2aaSAndroid Build Coastguard Worker     // From SkSurface_Base.h
type()60*c8dee2aaSAndroid Build Coastguard Worker     SkSurface_Base::Type type() const override { return SkSurface_Base::Type::kGraphite; }
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker     Recorder* onGetRecorder() const override;
63*c8dee2aaSAndroid Build Coastguard Worker     SkCanvas* onNewCanvas() override;
64*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> onNewSurface(const SkImageInfo&) override;
65*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> onNewImageSnapshot(const SkIRect* subset) override;
66*c8dee2aaSAndroid Build Coastguard Worker     void onWritePixels(const SkPixmap&, int x, int y) override;
67*c8dee2aaSAndroid Build Coastguard Worker     void onAsyncRescaleAndReadPixels(const SkImageInfo& info,
68*c8dee2aaSAndroid Build Coastguard Worker                                      SkIRect srcRect,
69*c8dee2aaSAndroid Build Coastguard Worker                                      RescaleGamma rescaleGamma,
70*c8dee2aaSAndroid Build Coastguard Worker                                      RescaleMode rescaleMode,
71*c8dee2aaSAndroid Build Coastguard Worker                                      ReadPixelsCallback callback,
72*c8dee2aaSAndroid Build Coastguard Worker                                      ReadPixelsContext context) override;
73*c8dee2aaSAndroid Build Coastguard Worker     void onAsyncRescaleAndReadPixelsYUV420(SkYUVColorSpace yuvColorSpace,
74*c8dee2aaSAndroid Build Coastguard Worker                                            bool readAlpha,
75*c8dee2aaSAndroid Build Coastguard Worker                                            sk_sp<SkColorSpace> dstColorSpace,
76*c8dee2aaSAndroid Build Coastguard Worker                                            SkIRect srcRect,
77*c8dee2aaSAndroid Build Coastguard Worker                                            SkISize dstSize,
78*c8dee2aaSAndroid Build Coastguard Worker                                            RescaleGamma rescaleGamma,
79*c8dee2aaSAndroid Build Coastguard Worker                                            RescaleMode,
80*c8dee2aaSAndroid Build Coastguard Worker                                            ReadPixelsCallback callback,
81*c8dee2aaSAndroid Build Coastguard Worker                                            ReadPixelsContext context) override;
82*c8dee2aaSAndroid Build Coastguard Worker     bool onCopyOnWrite(ContentChangeMode) override;
83*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const SkCapabilities> onCapabilities() override;
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker     TextureProxyView readSurfaceView() const;
86*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<Image> asImage() const;
87*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<Image> makeImageCopy(const SkIRect* subset, Mipmapped) const;
88*c8dee2aaSAndroid Build Coastguard Worker     TextureProxy* backingTextureProxy() const;
89*c8dee2aaSAndroid Build Coastguard Worker 
90*c8dee2aaSAndroid Build Coastguard Worker private:
91*c8dee2aaSAndroid Build Coastguard Worker     // Regular and scratch surfaces differ by initial clear and if they are registered or not,
92*c8dee2aaSAndroid Build Coastguard Worker     // otherwise are constructed the same.
93*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<Surface> Make(Recorder* recorder,
94*c8dee2aaSAndroid Build Coastguard Worker                                const SkImageInfo&,
95*c8dee2aaSAndroid Build Coastguard Worker                                std::string_view label,
96*c8dee2aaSAndroid Build Coastguard Worker                                Budgeted,
97*c8dee2aaSAndroid Build Coastguard Worker                                Mipmapped,
98*c8dee2aaSAndroid Build Coastguard Worker                                SkBackingFit,
99*c8dee2aaSAndroid Build Coastguard Worker                                const SkSurfaceProps* props,
100*c8dee2aaSAndroid Build Coastguard Worker                                LoadOp initialLoadOp,
101*c8dee2aaSAndroid Build Coastguard Worker                                bool registerWithRecorder);
102*c8dee2aaSAndroid Build Coastguard Worker 
103*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<Device> fDevice;
104*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<Image>  fImageView; // the image object returned by asImage()
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     friend void Flush(SkSurface*);
107*c8dee2aaSAndroid Build Coastguard Worker };
108*c8dee2aaSAndroid Build Coastguard Worker 
109*c8dee2aaSAndroid Build Coastguard Worker // TODO: The long-term for the public API around surfaces and flushing/submitting will likely
110*c8dee2aaSAndroid Build Coastguard Worker // be replaced with explicit control over Recorders and submitting Recordings to the Context
111*c8dee2aaSAndroid Build Coastguard Worker // directly. For now, internal tools often rely on surface/canvas flushing to control what's
112*c8dee2aaSAndroid Build Coastguard Worker // being timed (nanobench or viewer's stats layer), so we flush any pending draws to a DrawPass.
113*c8dee2aaSAndroid Build Coastguard Worker // While this won't measure actual conversion of the task list to backend command buffers, that
114*c8dee2aaSAndroid Build Coastguard Worker // should be fairly negligible since most of the work is handled in DrawPass::Make().
115*c8dee2aaSAndroid Build Coastguard Worker // Additionally flushing pending work here ensures we don't batch across or clear prior recorded
116*c8dee2aaSAndroid Build Coastguard Worker // work when looping in a benchmark, as the controlling code expects.
117*c8dee2aaSAndroid Build Coastguard Worker void Flush(sk_sp<SkSurface> surface);
118*c8dee2aaSAndroid Build Coastguard Worker void Flush(SkSurface* surface);
119*c8dee2aaSAndroid Build Coastguard Worker 
120*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite
121*c8dee2aaSAndroid Build Coastguard Worker 
122*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_Surface_Graphite_DEFINED
123