blob: 56d6d7de6a5892871ac8e42931df30262afeb81b [file] [log] [blame]
Brian Osman45580d32016-11-23 09:37:01 -05001/*
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"
Robert Phillipsa90aa2b2017-04-10 08:19:26 -04009
10#include "GrContextPriv.h"
Robert Phillips2de8cfa2017-06-28 10:33:41 -040011#include "GrDrawingManager.h"
12#include "GrOpList.h"
Robert Phillipsa90aa2b2017-04-10 08:19:26 -040013#include "SkGr.h"
Brian Osman45580d32016-11-23 09:37:01 -050014
15#include "../private/GrAuditTrail.h"
16
Robert Phillips2de8cfa2017-06-28 10:33:41 -040017#define ASSERT_SINGLE_OWNER \
18 SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(this->singleOwner());)
19#define RETURN_FALSE_IF_ABANDONED if (this->drawingManager()->wasAbandoned()) { return false; }
Brian Osman45580d32016-11-23 09:37:01 -050020
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).
25GrSurfaceContext::GrSurfaceContext(GrContext* context,
Robert Phillips72152832017-01-25 17:31:35 -050026 GrDrawingManager* drawingMgr,
Brian Salomonf3569f02017-10-24 12:52:33 -040027 GrPixelConfig config,
Robert Phillips2c862492017-01-18 10:08:39 -050028 sk_sp<SkColorSpace> colorSpace,
Brian Osman45580d32016-11-23 09:37:01 -050029 GrAuditTrail* auditTrail,
30 GrSingleOwner* singleOwner)
Brian Salomonf3569f02017-10-24 12:52:33 -040031 : fContext(context)
32 , fAuditTrail(auditTrail)
33 , fColorSpaceInfo(std::move(colorSpace), config)
34 , fDrawingManager(drawingMgr)
Brian Osman45580d32016-11-23 09:37:01 -050035#ifdef SK_DEBUG
Brian Salomonf3569f02017-10-24 12:52:33 -040036 , fSingleOwner(singleOwner)
Brian Osman45580d32016-11-23 09:37:01 -050037#endif
Robert Phillipsa90aa2b2017-04-10 08:19:26 -040038{
Brian Salomon366093f2018-02-13 09:25:22 -050039 // We never should have a sRGB pixel config with a non-SRGB gamma color space.
40 SkASSERT(!GrPixelConfigIsSRGB(config) ||
41 (fColorSpaceInfo.colorSpace() && fColorSpaceInfo.colorSpace()->gammaCloseToSRGB()));
Robert Phillipsa90aa2b2017-04-10 08:19:26 -040042}
43
44bool GrSurfaceContext::readPixels(const SkImageInfo& dstInfo, void* dstBuffer,
45 size_t dstRowBytes, int x, int y, uint32_t flags) {
Robert Phillips2de8cfa2017-06-28 10:33:41 -040046 ASSERT_SINGLE_OWNER
47 RETURN_FALSE_IF_ABANDONED
48 SkDEBUGCODE(this->validate();)
49 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrSurfaceContext::readPixels");
50
Robert Phillipsa90aa2b2017-04-10 08:19:26 -040051 // TODO: this seems to duplicate code in SkImage_Gpu::onReadPixels
Brian Salomon5fba7ad2018-03-22 10:01:16 -040052 if (kUnpremul_SkAlphaType == dstInfo.alphaType() &&
53 !GrPixelConfigIsOpaque(this->asSurfaceProxy()->config())) {
Robert Phillipsa90aa2b2017-04-10 08:19:26 -040054 flags |= GrContextPriv::kUnpremul_PixelOpsFlag;
55 }
Brian Salomonc320b152018-02-20 14:05:36 -050056 auto colorType = SkColorTypeToGrColorType(dstInfo.colorType());
57 if (GrColorType::kUnknown == colorType) {
58 return false;
59 }
60 return fContext->contextPriv().readSurfacePixels(this, x, y, dstInfo.width(), dstInfo.height(),
61 colorType, dstInfo.colorSpace(), dstBuffer,
62 dstRowBytes, flags);
Robert Phillipsa90aa2b2017-04-10 08:19:26 -040063}
64
65bool GrSurfaceContext::writePixels(const SkImageInfo& srcInfo, const void* srcBuffer,
66 size_t srcRowBytes, int x, int y, uint32_t flags) {
Robert Phillips2de8cfa2017-06-28 10:33:41 -040067 ASSERT_SINGLE_OWNER
68 RETURN_FALSE_IF_ABANDONED
69 SkDEBUGCODE(this->validate();)
70 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrSurfaceContext::writePixels");
71
Robert Phillipsa90aa2b2017-04-10 08:19:26 -040072 if (kUnpremul_SkAlphaType == srcInfo.alphaType()) {
73 flags |= GrContextPriv::kUnpremul_PixelOpsFlag;
74 }
Brian Salomonc320b152018-02-20 14:05:36 -050075 auto colorType = SkColorTypeToGrColorType(srcInfo.colorType());
76 if (GrColorType::kUnknown == colorType) {
77 return false;
78 }
79 return fContext->contextPriv().writeSurfacePixels(this, x, y, srcInfo.width(), srcInfo.height(),
80 colorType, srcInfo.colorSpace(), srcBuffer,
81 srcRowBytes, flags);
Brian Osman45580d32016-11-23 09:37:01 -050082}
Robert Phillips2de8cfa2017-06-28 10:33:41 -040083
84bool GrSurfaceContext::copy(GrSurfaceProxy* src, const SkIRect& srcRect, const SkIPoint& dstPoint) {
85 ASSERT_SINGLE_OWNER
86 RETURN_FALSE_IF_ABANDONED
87 SkDEBUGCODE(this->validate();)
Greg Daniel25af6712018-04-25 10:44:38 -040088 GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrSurfaceContext::copy");
89
90 if (!fContext->caps()->canCopySurface(this->asSurfaceProxy(), src, srcRect, dstPoint)) {
91 return false;
92 }
Robert Phillips2de8cfa2017-06-28 10:33:41 -040093
94 return this->getOpList()->copySurface(*fContext->caps(),
95 this->asSurfaceProxy(), src, srcRect, dstPoint);
96}