1 /*
2 * Copyright 2016 Google Inc.
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 "GrSurfaceContext.h"
9
10 #include "GrContextPriv.h"
11 #include "GrDrawingManager.h"
12 #include "GrOpList.h"
13 #include "SkGr.h"
14
15 #include "../private/GrAuditTrail.h"
16
17 #define ASSERT_SINGLE_OWNER \
18 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(this->singleOwner());)
19 #define RETURN_FALSE_IF_ABANDONED if (this->drawingManager()->wasAbandoned()) { return false; }
20
21 // In MDB mode the reffing of the 'getLastOpList' call's result allows in-progress
22 // GrOpLists to be picked up and added to by renderTargetContexts lower in the call
23 // stack. When this occurs with a closed GrOpList, a new one will be allocated
24 // when the renderTargetContext attempts to use it (via getOpList).
GrSurfaceContext(GrContext * context,GrDrawingManager * drawingMgr,GrPixelConfig config,sk_sp<SkColorSpace> colorSpace,GrAuditTrail * auditTrail,GrSingleOwner * singleOwner)25 GrSurfaceContext::GrSurfaceContext(GrContext* context,
26 GrDrawingManager* drawingMgr,
27 GrPixelConfig config,
28 sk_sp<SkColorSpace> colorSpace,
29 GrAuditTrail* auditTrail,
30 GrSingleOwner* singleOwner)
31 : fContext(context)
32 , fAuditTrail(auditTrail)
33 , fColorSpaceInfo(std::move(colorSpace), config)
34 , fDrawingManager(drawingMgr)
35 #ifdef SK_DEBUG
36 , fSingleOwner(singleOwner)
37 #endif
38 {
39 }
40
readPixels(const SkImageInfo & dstInfo,void * dstBuffer,size_t dstRowBytes,int x,int y,uint32_t flags)41 bool GrSurfaceContext::readPixels(const SkImageInfo& dstInfo, void* dstBuffer,
42 size_t dstRowBytes, int x, int y, uint32_t flags) {
43 ASSERT_SINGLE_OWNER
44 RETURN_FALSE_IF_ABANDONED
45 SkDEBUGCODE(this->validate();)
46 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrSurfaceContext::readPixels");
47
48 // TODO: teach GrRenderTarget to take ImageInfo directly to specify the src pixels
49 GrPixelConfig config = SkImageInfo2GrPixelConfig(dstInfo, *fContext->caps());
50 if (kUnknown_GrPixelConfig == config) {
51 return false;
52 }
53
54 // TODO: this seems to duplicate code in SkImage_Gpu::onReadPixels
55 if (kUnpremul_SkAlphaType == dstInfo.alphaType()) {
56 flags |= GrContextPriv::kUnpremul_PixelOpsFlag;
57 }
58
59 return fContext->contextPriv().readSurfacePixels(this, x, y,
60 dstInfo.width(), dstInfo.height(), config,
61 dstInfo.colorSpace(),
62 dstBuffer, dstRowBytes, flags);
63 }
64
writePixels(const SkImageInfo & srcInfo,const void * srcBuffer,size_t srcRowBytes,int x,int y,uint32_t flags)65 bool GrSurfaceContext::writePixels(const SkImageInfo& srcInfo, const void* srcBuffer,
66 size_t srcRowBytes, int x, int y, uint32_t flags) {
67 ASSERT_SINGLE_OWNER
68 RETURN_FALSE_IF_ABANDONED
69 SkDEBUGCODE(this->validate();)
70 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrSurfaceContext::writePixels");
71
72 // TODO: teach GrRenderTarget to take ImageInfo directly to specify the src pixels
73 GrPixelConfig config = SkImageInfo2GrPixelConfig(srcInfo, *fContext->caps());
74 if (kUnknown_GrPixelConfig == config) {
75 return false;
76 }
77 if (kUnpremul_SkAlphaType == srcInfo.alphaType()) {
78 flags |= GrContextPriv::kUnpremul_PixelOpsFlag;
79 }
80
81 return fContext->contextPriv().writeSurfacePixels(this, x, y,
82 srcInfo.width(), srcInfo.height(),
83 config, srcInfo.colorSpace(),
84 srcBuffer, srcRowBytes, flags);
85 }
86
copy(GrSurfaceProxy * src,const SkIRect & srcRect,const SkIPoint & dstPoint)87 bool GrSurfaceContext::copy(GrSurfaceProxy* src, const SkIRect& srcRect, const SkIPoint& dstPoint) {
88 ASSERT_SINGLE_OWNER
89 RETURN_FALSE_IF_ABANDONED
90 SkDEBUGCODE(this->validate();)
91 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrSurfaceContext::onCopy");
92
93 return this->getOpList()->copySurface(*fContext->caps(),
94 this->asSurfaceProxy(), src, srcRect, dstPoint);
95 }
96