1 /*
2 * Copyright 2021 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 #include "src/gpu/GrWritePixelsRenderTask.h"
9
10 #include "src/gpu/GrGpu.h"
11 #include "src/gpu/GrOpFlushState.h"
12 #include "src/gpu/GrResourceAllocator.h"
13
Make(GrDrawingManager * dm,sk_sp<GrSurfaceProxy> dst,SkIRect rect,GrColorType srcColorType,GrColorType dstColorType,const GrMipLevel texels[],int levelCount)14 sk_sp<GrRenderTask> GrWritePixelsTask::Make(GrDrawingManager* dm,
15 sk_sp<GrSurfaceProxy> dst,
16 SkIRect rect,
17 GrColorType srcColorType,
18 GrColorType dstColorType,
19 const GrMipLevel texels[],
20 int levelCount) {
21 return sk_sp<GrRenderTask>(new GrWritePixelsTask(dm,
22 std::move(dst),
23 rect,
24 srcColorType,
25 dstColorType,
26 texels,
27 levelCount));
28 }
29
GrWritePixelsTask(GrDrawingManager * dm,sk_sp<GrSurfaceProxy> dst,SkIRect rect,GrColorType srcColorType,GrColorType dstColorType,const GrMipLevel texels[],int levelCount)30 GrWritePixelsTask::GrWritePixelsTask(GrDrawingManager* dm,
31 sk_sp<GrSurfaceProxy> dst,
32 SkIRect rect,
33 GrColorType srcColorType,
34 GrColorType dstColorType,
35 const GrMipLevel texels[],
36 int levelCount)
37 : fRect(rect)
38 , fSrcColorType(srcColorType)
39 , fDstColorType(dstColorType) {
40 this->addTarget(dm, std::move(dst));
41 fLevels.reset(levelCount);
42 std::copy_n(texels, levelCount, fLevels.get());
43 }
44
gatherProxyIntervals(GrResourceAllocator * alloc) const45 void GrWritePixelsTask::gatherProxyIntervals(GrResourceAllocator* alloc) const {
46 alloc->addInterval(this->target(0), alloc->curOp(), alloc->curOp(),
47 GrResourceAllocator::ActualUse::kYes);
48 alloc->incOps();
49 }
50
onMakeClosed(const GrCaps &,SkIRect * targetUpdateBounds)51 GrRenderTask::ExpectedOutcome GrWritePixelsTask::onMakeClosed(const GrCaps&,
52 SkIRect* targetUpdateBounds) {
53 *targetUpdateBounds = fRect;
54 return ExpectedOutcome::kTargetDirty;
55 }
56
onExecute(GrOpFlushState * flushState)57 bool GrWritePixelsTask::onExecute(GrOpFlushState* flushState) {
58 GrSurfaceProxy* dstProxy = this->target(0);
59 if (!dstProxy->isInstantiated()) {
60 return false;
61 }
62 GrSurface* dstSurface = dstProxy->peekSurface();
63 return flushState->gpu()->writePixels(dstSurface,
64 fRect.fLeft,
65 fRect.fTop,
66 fRect.width(),
67 fRect.height(),
68 fDstColorType,
69 fSrcColorType,
70 fLevels.get(),
71 fLevels.count());
72 }
73