diff options
Diffstat (limited to 'src/gpu/GrContext.cpp')
-rw-r--r-- | src/gpu/GrContext.cpp | 67 |
1 files changed, 38 insertions, 29 deletions
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index 2e66c0c404..ff5b0266e6 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -541,6 +541,43 @@ void GrContext::prepareSurfaceForExternalIO(GrSurface* surface) { fDrawingManager->prepareSurfaceForExternalIO(surface); } +bool GrContext::copySurface(GrSurface* dst, GrSurface* src, const SkIRect& srcRect, + const SkIPoint& dstPoint) { + ASSERT_SINGLE_OWNER + RETURN_FALSE_IF_ABANDONED + GR_AUDIT_TRAIL_AUTO_FRAME(&fAuditTrail, "GrContext::copySurface"); + + if (!src || !dst) { + return false; + } + ASSERT_OWNED_RESOURCE(src); + ASSERT_OWNED_RESOURCE(dst); + + // We don't allow conversion between integer configs and float/fixed configs. + if (GrPixelConfigIsSint(dst->config()) != GrPixelConfigIsSint(src->config())) { + return false; + } + +#ifndef ENABLE_MDB + // We can't yet fully defer copies to textures, so GrTextureContext::copySurface will + // execute the copy immediately. Ensure the data is ready. + src->flushWrites(); +#endif + + sk_sp<GrSurfaceContext> surfaceContext( + this->contextPriv().makeWrappedSurfaceContext(sk_ref_sp(dst))); + + if (!surfaceContext) { + return false; + } + + if (!surfaceContext->copySurface(src, srcRect, dstPoint)) { + return false; + } + + return true; +} + void GrContext::flushSurfaceWrites(GrSurface* surface) { ASSERT_SINGLE_OWNER RETURN_IF_ABANDONED @@ -602,36 +639,8 @@ sk_sp<GrSurfaceContext> GrContextPriv::makeWrappedSurfaceContext(sk_sp<GrSurface } } -sk_sp<GrSurfaceContext> GrContextPriv::makeDeferredSurfaceContext(const GrSurfaceDesc& dstDesc, - SkBudgeted isDstBudgeted) { - - sk_sp<GrSurfaceProxy> proxy = GrSurfaceProxy::MakeDeferred(*fContext->caps(), dstDesc, - SkBackingFit::kExact, isDstBudgeted); - - if (proxy->asRenderTargetProxy()) { - return this->drawingManager()->makeRenderTargetContext(std::move(proxy), nullptr, nullptr); - } else { - SkASSERT(proxy->asTextureProxy()); - return this->drawingManager()->makeTextureContext(std::move(proxy)); - } - - return nullptr; -} - -sk_sp<GrSurfaceContext> GrContextPriv::makeTestSurfaceContext(sk_sp<GrSurfaceProxy> proxy) { - - if (proxy->asRenderTargetProxy()) { - return this->drawingManager()->makeRenderTargetContext(std::move(proxy), nullptr, nullptr); - } else { - SkASSERT(proxy->asTextureProxy()); - return this->drawingManager()->makeTextureContext(std::move(proxy)); - } - - return nullptr; -} - sk_sp<GrRenderTargetContext> GrContextPriv::makeBackendTextureRenderTargetContext( - const GrBackendTextureDesc& desc, + const GrBackendTextureDesc& desc, sk_sp<SkColorSpace> colorSpace, const SkSurfaceProps* props, GrWrapOwnership ownership) { |