• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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