xref: /aosp_15_r20/external/skia/src/gpu/graphite/DrawContext.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_DrawContext_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_DrawContext_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurfaceProps.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
15*c8dee2aaSAndroid Build Coastguard Worker 
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DrawList.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DrawOrder.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DrawTypes.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ResourceTypes.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/TextureProxyView.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/task/UploadTask.h"
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker class SkPixmap;
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
28*c8dee2aaSAndroid Build Coastguard Worker 
29*c8dee2aaSAndroid Build Coastguard Worker class Geometry;
30*c8dee2aaSAndroid Build Coastguard Worker class Recorder;
31*c8dee2aaSAndroid Build Coastguard Worker class Transform;
32*c8dee2aaSAndroid Build Coastguard Worker 
33*c8dee2aaSAndroid Build Coastguard Worker class Caps;
34*c8dee2aaSAndroid Build Coastguard Worker class ComputePathAtlas;
35*c8dee2aaSAndroid Build Coastguard Worker class DrawTask;
36*c8dee2aaSAndroid Build Coastguard Worker class PathAtlas;
37*c8dee2aaSAndroid Build Coastguard Worker class Task;
38*c8dee2aaSAndroid Build Coastguard Worker class TextureProxy;
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker /**
41*c8dee2aaSAndroid Build Coastguard Worker  * DrawContext records draw commands into a specific Surface, via a general task graph
42*c8dee2aaSAndroid Build Coastguard Worker  * representing GPU work and their inter-dependencies.
43*c8dee2aaSAndroid Build Coastguard Worker  */
44*c8dee2aaSAndroid Build Coastguard Worker class DrawContext final : public SkRefCnt {
45*c8dee2aaSAndroid Build Coastguard Worker public:
46*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<DrawContext> Make(const Caps* caps,
47*c8dee2aaSAndroid Build Coastguard Worker                                    sk_sp<TextureProxy> target,
48*c8dee2aaSAndroid Build Coastguard Worker                                    SkISize deviceSize,
49*c8dee2aaSAndroid Build Coastguard Worker                                    const SkColorInfo&,
50*c8dee2aaSAndroid Build Coastguard Worker                                    const SkSurfaceProps&);
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker     ~DrawContext() override;
53*c8dee2aaSAndroid Build Coastguard Worker 
imageInfo()54*c8dee2aaSAndroid Build Coastguard Worker     const SkImageInfo& imageInfo() const { return fImageInfo;    }
colorInfo()55*c8dee2aaSAndroid Build Coastguard Worker     const SkColorInfo& colorInfo() const { return fImageInfo.colorInfo(); }
target()56*c8dee2aaSAndroid Build Coastguard Worker     TextureProxy* target()                { return fTarget.get(); }
target()57*c8dee2aaSAndroid Build Coastguard Worker     const TextureProxy* target()    const { return fTarget.get(); }
refTarget()58*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<TextureProxy> refTarget() const { return fTarget; }
59*c8dee2aaSAndroid Build Coastguard Worker 
60*c8dee2aaSAndroid Build Coastguard Worker     // May be null if the target is not texturable.
readSurfaceView()61*c8dee2aaSAndroid Build Coastguard Worker     const TextureProxyView& readSurfaceView() const { return fReadView; }
62*c8dee2aaSAndroid Build Coastguard Worker 
surfaceProps()63*c8dee2aaSAndroid Build Coastguard Worker     const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; }
64*c8dee2aaSAndroid Build Coastguard Worker 
pendingRenderSteps()65*c8dee2aaSAndroid Build Coastguard Worker     int pendingRenderSteps() const { return fPendingDraws->renderStepCount(); }
66*c8dee2aaSAndroid Build Coastguard Worker 
67*c8dee2aaSAndroid Build Coastguard Worker     void clear(const SkColor4f& clearColor);
68*c8dee2aaSAndroid Build Coastguard Worker     void discard();
69*c8dee2aaSAndroid Build Coastguard Worker 
70*c8dee2aaSAndroid Build Coastguard Worker     void recordDraw(const Renderer* renderer,
71*c8dee2aaSAndroid Build Coastguard Worker                     const Transform& localToDevice,
72*c8dee2aaSAndroid Build Coastguard Worker                     const Geometry& geometry,
73*c8dee2aaSAndroid Build Coastguard Worker                     const Clip& clip,
74*c8dee2aaSAndroid Build Coastguard Worker                     DrawOrder ordering,
75*c8dee2aaSAndroid Build Coastguard Worker                     const PaintParams* paint,
76*c8dee2aaSAndroid Build Coastguard Worker                     const StrokeStyle* stroke);
77*c8dee2aaSAndroid Build Coastguard Worker 
78*c8dee2aaSAndroid Build Coastguard Worker     bool recordUpload(Recorder* recorder,
79*c8dee2aaSAndroid Build Coastguard Worker                       sk_sp<TextureProxy> targetProxy,
80*c8dee2aaSAndroid Build Coastguard Worker                       const SkColorInfo& srcColorInfo,
81*c8dee2aaSAndroid Build Coastguard Worker                       const SkColorInfo& dstColorInfo,
82*c8dee2aaSAndroid Build Coastguard Worker                       const std::vector<MipLevel>& levels,
83*c8dee2aaSAndroid Build Coastguard Worker                       const SkIRect& dstRect,
84*c8dee2aaSAndroid Build Coastguard Worker                       std::unique_ptr<ConditionalUploadContext>);
85*c8dee2aaSAndroid Build Coastguard Worker 
86*c8dee2aaSAndroid Build Coastguard Worker     // Add a Task that will be executed *before* any of the pending draws and uploads are
87*c8dee2aaSAndroid Build Coastguard Worker     // executed as part of the next flush(). Dependency
88*c8dee2aaSAndroid Build Coastguard Worker     void recordDependency(sk_sp<Task>);
89*c8dee2aaSAndroid Build Coastguard Worker 
90*c8dee2aaSAndroid Build Coastguard Worker     // Returns the transient path atlas that uses compute to accumulate coverage masks for atlas
91*c8dee2aaSAndroid Build Coastguard Worker     // draws recorded to this SDC. The atlas gets created lazily upon request. Returns nullptr
92*c8dee2aaSAndroid Build Coastguard Worker     // if compute path generation is not supported.
93*c8dee2aaSAndroid Build Coastguard Worker     PathAtlas* getComputePathAtlas(Recorder*);
94*c8dee2aaSAndroid Build Coastguard Worker 
95*c8dee2aaSAndroid Build Coastguard Worker     // Moves all accumulated pending recorded operations (draws and uploads), and any other
96*c8dee2aaSAndroid Build Coastguard Worker     // dependent tasks into the DrawTask currently being built.
97*c8dee2aaSAndroid Build Coastguard Worker     void flush(Recorder*);
98*c8dee2aaSAndroid Build Coastguard Worker 
99*c8dee2aaSAndroid Build Coastguard Worker     // Flushes (if needed) and completes the current DrawTask, returning it to the caller.
100*c8dee2aaSAndroid Build Coastguard Worker     // Subsequent recorded operations will be added to a new DrawTask.
101*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<Task> snapDrawTask(Recorder*);
102*c8dee2aaSAndroid Build Coastguard Worker 
103*c8dee2aaSAndroid Build Coastguard Worker private:
104*c8dee2aaSAndroid Build Coastguard Worker     DrawContext(const Caps*, sk_sp<TextureProxy>, const SkImageInfo&, const SkSurfaceProps&);
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<TextureProxy> fTarget;
107*c8dee2aaSAndroid Build Coastguard Worker     TextureProxyView fReadView;
108*c8dee2aaSAndroid Build Coastguard Worker     SkImageInfo fImageInfo;
109*c8dee2aaSAndroid Build Coastguard Worker     const SkSurfaceProps fSurfaceProps;
110*c8dee2aaSAndroid Build Coastguard Worker 
111*c8dee2aaSAndroid Build Coastguard Worker     // The in-progress DrawTask that will be snapped and returned when some external requirement
112*c8dee2aaSAndroid Build Coastguard Worker     // must depend on the contents of this DrawContext's target. As higher-level Skia operations
113*c8dee2aaSAndroid Build Coastguard Worker     // are recorded, it can be necessary to flush pending draws and uploads into the task list.
114*c8dee2aaSAndroid Build Coastguard Worker     // This provides a place to reset scratch textures or buffers as their previous state will have
115*c8dee2aaSAndroid Build Coastguard Worker     // been consumed by the flushed tasks rendering to this DrawContext's target.
116*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<DrawTask> fCurrentDrawTask;
117*c8dee2aaSAndroid Build Coastguard Worker 
118*c8dee2aaSAndroid Build Coastguard Worker     // Stores the most immediately recorded draws and uploads into the DrawContext's target. These
119*c8dee2aaSAndroid Build Coastguard Worker     // are collected outside of the DrawTask so that encoder switches can be minimized when
120*c8dee2aaSAndroid Build Coastguard Worker     // flushing.
121*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<DrawList> fPendingDraws;
122*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<UploadList> fPendingUploads;
123*c8dee2aaSAndroid Build Coastguard Worker     // Load and store information for the current pending draws.
124*c8dee2aaSAndroid Build Coastguard Worker     LoadOp fPendingLoadOp = LoadOp::kLoad;
125*c8dee2aaSAndroid Build Coastguard Worker     StoreOp fPendingStoreOp = StoreOp::kStore;
126*c8dee2aaSAndroid Build Coastguard Worker     std::array<float, 4> fPendingClearColor = { 0, 0, 0, 0 };
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker     // Accumulates atlas coverage masks generated by compute dispatches that are required by one or
129*c8dee2aaSAndroid Build Coastguard Worker     // more entries in `fPendingDraws`. When pending draws are snapped into a new DrawPass, a
130*c8dee2aaSAndroid Build Coastguard Worker     // compute dispatch group gets recorded which schedules the accumulated masks to get drawn into
131*c8dee2aaSAndroid Build Coastguard Worker     // an atlas texture. The accumulated masks are then cleared which frees up the atlas for
132*c8dee2aaSAndroid Build Coastguard Worker     // future draws.
133*c8dee2aaSAndroid Build Coastguard Worker     //
134*c8dee2aaSAndroid Build Coastguard Worker     // TODO: Currently every PathAtlas contains a single texture. If multiple snapped draw
135*c8dee2aaSAndroid Build Coastguard Worker     // passes resulted in multiple ComputePathAtlas dispatch groups, the later dispatches would
136*c8dee2aaSAndroid Build Coastguard Worker     // overwrite the atlas texture since all compute tasks are scheduled before render tasks. This
137*c8dee2aaSAndroid Build Coastguard Worker     // is currently not an issue since there is only one DrawPass per flush but we may want to
138*c8dee2aaSAndroid Build Coastguard Worker     // either support one atlas texture per DrawPass or record the dispatches once per
139*c8dee2aaSAndroid Build Coastguard Worker     // RenderPassTask rather than DrawPass.
140*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<ComputePathAtlas> fComputePathAtlas;
141*c8dee2aaSAndroid Build Coastguard Worker };
142*c8dee2aaSAndroid Build Coastguard Worker 
143*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite
144*c8dee2aaSAndroid Build Coastguard Worker 
145*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_DrawContext_DEFINED
146