Home | History | Annotate | Download | only in gpu
      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