1/*
2 * Copyright 2019 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrWaitRenderTask_DEFINED
9#define GrWaitRenderTask_DEFINED
10
11#include "src/gpu/GrRenderTask.h"
12#include "src/gpu/GrSemaphore.h"
13
14class GrWaitRenderTask final : public GrRenderTask {
15public:
16 GrWaitRenderTask(GrSurfaceProxyView surfaceView,
17 std::unique_ptr<std::unique_ptr<GrSemaphore>[]> semaphores,
18 int numSemaphores)
19 : GrRenderTask()
20 , fSemaphores(std::move(semaphores))
21 , fNumSemaphores(numSemaphores)
22 , fWaitedOn(std::move(surfaceView)) {}
23
24private:
25 bool onIsUsed(GrSurfaceProxy* proxy) const override {
26 return proxy == fWaitedOn.proxy();
27 }
28 void handleInternalAllocationFailure() override {}
29 void gatherProxyIntervals(GrResourceAllocator*) const override;
30
31 ExpectedOutcome onMakeClosed(const GrCaps&, SkIRect*) override {
32 return ExpectedOutcome::kTargetUnchanged;
33 }
34
35 bool onExecute(GrOpFlushState*) override;
36
37#if GR_TEST_UTILS
38 const char* name() const final { return "Wait"; }
39#endif
40#ifdef SK_DEBUG
41 // No non-dst proxies.
42 void visitProxies_debugOnly(const GrOp::VisitProxyFunc& fn) const override {}
43#endif
44 std::unique_ptr<std::unique_ptr<GrSemaphore>[]> fSemaphores;
45 int fNumSemaphores;
46
47 // This field is separate from the main "targets" field on GrRenderTask because this task
48 // does not actually write to the surface and so should not participate in the normal
49 // lastRenderTask tracking that written-to targets do.
50 GrSurfaceProxyView fWaitedOn;
51};
52
53#endif
54