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 "SkColorSpace_Base.h" 14 #include "SkGr.h" 15 16 #include "../private/GrAuditTrail.h" 17 18 #define ASSERT_SINGLE_OWNER \ 19 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(this->singleOwner());) 20 #define RETURN_FALSE_IF_ABANDONED if (this->drawingManager()->wasAbandoned()) { return false; } 21 22 // In MDB mode the reffing of the 'getLastOpList' call's result allows in-progress 23 // GrOpLists to be picked up and added to by renderTargetContexts lower in the call 24 // stack. When this occurs with a closed GrOpList, a new one will be allocated 25 // when the renderTargetContext attempts to use it (via getOpList). 26 GrSurfaceContext::GrSurfaceContext(GrContext* context, 27 GrDrawingManager* drawingMgr, 28 sk_sp<SkColorSpace> colorSpace, 29 GrAuditTrail* auditTrail, 30 GrSingleOwner* singleOwner) 31 : fContext(context) 32 , fColorSpace(std::move(colorSpace)) 33 , fAuditTrail(auditTrail) 34 , fDrawingManager(drawingMgr) 35 #ifdef SK_DEBUG 36 , fSingleOwner(singleOwner) 37 #endif 38 { 39 } 40 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 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 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