1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2020 Google LLC
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#ifndef SurfaceFillContext_v1_DEFINED
9cb93a386Sopenharmony_ci#define SurfaceFillContext_v1_DEFINED
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ci#include "include/core/SkSize.h"
12cb93a386Sopenharmony_ci#include "include/private/GrTypesPriv.h"
13cb93a386Sopenharmony_ci#include "src/gpu/GrImageInfo.h"
14cb93a386Sopenharmony_ci#include "src/gpu/GrSwizzle.h"
15cb93a386Sopenharmony_ci#include "src/gpu/SurfaceFillContext.h"
16cb93a386Sopenharmony_ci#include "src/gpu/ops/OpsTask.h"
17cb93a386Sopenharmony_ci
18cb93a386Sopenharmony_ci#include <array>
19cb93a386Sopenharmony_ci#include <tuple>
20cb93a386Sopenharmony_ci
21cb93a386Sopenharmony_ciclass GrFragmentProcessor;
22cb93a386Sopenharmony_ciclass GrImageContext;
23cb93a386Sopenharmony_ciclass GrOp;
24cb93a386Sopenharmony_ciclass GrBackendFormat;
25cb93a386Sopenharmony_ciclass GrRecordingContext;
26cb93a386Sopenharmony_ciclass GrSurfaceProxyView;
27cb93a386Sopenharmony_ciclass SkColorSpace;
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_cinamespace skgpu::v1 {
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_ciclass SurfaceFillContext : public skgpu::SurfaceFillContext {
32cb93a386Sopenharmony_cipublic:
33cb93a386Sopenharmony_ci    SurfaceFillContext(GrRecordingContext*,
34cb93a386Sopenharmony_ci                       GrSurfaceProxyView readView,
35cb93a386Sopenharmony_ci                       GrSurfaceProxyView writeView,
36cb93a386Sopenharmony_ci                       const GrColorInfo&,
37cb93a386Sopenharmony_ci                       bool flushTimeOpsTask = false);
38cb93a386Sopenharmony_ci
39cb93a386Sopenharmony_ci    void discard() override;
40cb93a386Sopenharmony_ci
41cb93a386Sopenharmony_ci    void fillRectWithFP(const SkIRect& dstRect, std::unique_ptr<GrFragmentProcessor> fp) override;
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_ci    bool blitTexture(GrSurfaceProxyView view,
44cb93a386Sopenharmony_ci                     const SkIRect& srcRect,
45cb93a386Sopenharmony_ci                     const SkIPoint& dstPoint) override;
46cb93a386Sopenharmony_ci
47cb93a386Sopenharmony_ci    OpsTask* getOpsTask();
48cb93a386Sopenharmony_ci    sk_sp<GrRenderTask> refRenderTask() override;
49cb93a386Sopenharmony_ci
50cb93a386Sopenharmony_ci    int numSamples() const { return this->asRenderTargetProxy()->numSamples(); }
51cb93a386Sopenharmony_ci    bool wrapsVkSecondaryCB() const { return this->asRenderTargetProxy()->wrapsVkSecondaryCB(); }
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_ci    SkArenaAlloc* arenaAlloc() { return this->arenas()->arenaAlloc(); }
54cb93a386Sopenharmony_ci    GrSubRunAllocator* subRunAlloc() { return this->arenas()->subRunAlloc(); }
55cb93a386Sopenharmony_ci
56cb93a386Sopenharmony_ci#if GR_TEST_UTILS
57cb93a386Sopenharmony_ci    OpsTask* testingOnly_PeekLastOpsTask() { return fOpsTask.get(); }
58cb93a386Sopenharmony_ci#endif
59cb93a386Sopenharmony_ci
60cb93a386Sopenharmony_ci    const GrSurfaceProxyView& writeSurfaceView() const { return fWriteView; }
61cb93a386Sopenharmony_ci
62cb93a386Sopenharmony_ciprotected:
63cb93a386Sopenharmony_ci    /**
64cb93a386Sopenharmony_ci     * Creates a constant color paint for a clear, using src-over if possible to improve batching.
65cb93a386Sopenharmony_ci     */
66cb93a386Sopenharmony_ci    static void ClearToGrPaint(std::array<float, 4> color, GrPaint* paint);
67cb93a386Sopenharmony_ci
68cb93a386Sopenharmony_ci    void addOp(GrOp::Owner);
69cb93a386Sopenharmony_ci
70cb93a386Sopenharmony_ci    OpsTask* replaceOpsTask();
71cb93a386Sopenharmony_ci
72cb93a386Sopenharmony_ciprivate:
73cb93a386Sopenharmony_ci    sk_sp<GrArenas> arenas() { return fWriteView.proxy()->asRenderTargetProxy()->arenas(); }
74cb93a386Sopenharmony_ci
75cb93a386Sopenharmony_ci    /** Override to be notified in subclass before the current ops task is replaced. */
76cb93a386Sopenharmony_ci    virtual void willReplaceOpsTask(OpsTask* prevTask, OpsTask* nextTask) {}
77cb93a386Sopenharmony_ci
78cb93a386Sopenharmony_ci    /**
79cb93a386Sopenharmony_ci     * Override to be called to participate in the decision to discard all previous ops if a
80cb93a386Sopenharmony_ci     * fullscreen clear occurs.
81cb93a386Sopenharmony_ci     */
82cb93a386Sopenharmony_ci    virtual OpsTask::CanDiscardPreviousOps canDiscardPreviousOpsOnFullClear() const {
83cb93a386Sopenharmony_ci        return OpsTask::CanDiscardPreviousOps::kYes;
84cb93a386Sopenharmony_ci    }
85cb93a386Sopenharmony_ci
86cb93a386Sopenharmony_ci    void internalClear(const SkIRect* scissor,
87cb93a386Sopenharmony_ci                       std::array<float, 4> color,
88cb93a386Sopenharmony_ci                       bool upgradePartialToFull = false) override;
89cb93a386Sopenharmony_ci
90cb93a386Sopenharmony_ci    void addDrawOp(GrOp::Owner);
91cb93a386Sopenharmony_ci
92cb93a386Sopenharmony_ci    SkDEBUGCODE(void onValidate() const override;)
93cb93a386Sopenharmony_ci
94cb93a386Sopenharmony_ci    // The OpsTask can be closed by some other surface context that has picked it up. For this
95cb93a386Sopenharmony_ci    // reason, the OpsTask should only ever be accessed via 'getOpsTask'.
96cb93a386Sopenharmony_ci    sk_sp<OpsTask> fOpsTask;
97cb93a386Sopenharmony_ci
98cb93a386Sopenharmony_ci    bool fFlushTimeOpsTask;
99cb93a386Sopenharmony_ci
100cb93a386Sopenharmony_ci    using INHERITED = skgpu::SurfaceFillContext;
101cb93a386Sopenharmony_ci};
102cb93a386Sopenharmony_ci
103cb93a386Sopenharmony_ci} // namespace skgpu::v1
104cb93a386Sopenharmony_ci
105cb93a386Sopenharmony_ci#endif // SurfaceFillContext_v1_DEFINED
106