Index: src/gpu/GrContext.cpp |
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp |
index 078cfbdb2ccf1eff54ecdec7065264c9e2f32bcf..94ad9644bc67394fd1558e7094753a0f06009e80 100644 |
--- a/src/gpu/GrContext.cpp |
+++ b/src/gpu/GrContext.cpp |
@@ -6,6 +6,7 @@ |
*/ |
#include "GrContext.h" |
+#include "GrContextPriv.h" |
#include "GrContextOptions.h" |
#include "GrDrawingManager.h" |
#include "GrDrawContext.h" |
@@ -25,6 +26,8 @@ |
#define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == this) |
#define ASSERT_SINGLE_OWNER \ |
SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(&fSingleOwner);) |
+#define ASSERT_SINGLE_OWNER_PRIV \ |
+ SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(&fContext->fSingleOwner);) |
#define RETURN_IF_ABANDONED if (fDrawingManager->wasAbandoned()) { return; } |
#define RETURN_FALSE_IF_ABANDONED if (fDrawingManager->wasAbandoned()) { return false; } |
#define RETURN_NULL_IF_ABANDONED if (fDrawingManager->wasAbandoned()) { return nullptr; } |
@@ -360,7 +363,9 @@ bool GrContext::writeSurfacePixels(GrSurface* surface, |
// TODO: Need to decide the semantics of this function for color spaces. Do we support |
// conversion from a passed-in color space? For now, specifying nullptr means that this |
// path will do no conversion, so it will match the behavior of the non-draw path. |
- sk_sp<GrDrawContext> drawContext(this->makeDrawContext(sk_ref_sp(renderTarget), nullptr)); |
+ sk_sp<GrDrawContext> drawContext(this->contextPriv().makeWrappedDrawContext( |
+ sk_ref_sp(renderTarget), |
+ nullptr)); |
if (!drawContext) { |
return false; |
} |
@@ -568,7 +573,9 @@ bool GrContext::copySurface(GrSurface* dst, GrSurface* src, const SkIRect& srcRe |
src->flushWrites(); |
return fGpu->copySurface(dst, src, clippedSrcRect, clippedDstPoint); |
} |
- sk_sp<GrDrawContext> drawContext(this->makeDrawContext(sk_ref_sp(dst->asRenderTarget()), nullptr)); |
+ sk_sp<GrDrawContext> drawContext(this->contextPriv().makeWrappedDrawContext( |
+ sk_ref_sp(dst->asRenderTarget()), |
+ nullptr)); |
if (!drawContext) { |
return false; |
} |
@@ -606,12 +613,59 @@ int GrContext::getRecommendedSampleCount(GrPixelConfig config, |
return chosenSampleCount <= fGpu->caps()->maxSampleCount() ? chosenSampleCount : 0; |
} |
+sk_sp<GrDrawContext> GrContextPriv::makeWrappedDrawContext(sk_sp<GrRenderTarget> rt, |
+ sk_sp<SkColorSpace> colorSpace, |
+ const SkSurfaceProps* surfaceProps) { |
+ ASSERT_SINGLE_OWNER_PRIV |
+ return fContext->drawingManager()->drawContext(std::move(rt), std::move(colorSpace), |
+ surfaceProps); |
+} |
-sk_sp<GrDrawContext> GrContext::makeDrawContext(sk_sp<GrRenderTarget> rt, |
- sk_sp<SkColorSpace> colorSpace, |
- const SkSurfaceProps* surfaceProps) { |
- ASSERT_SINGLE_OWNER |
- return fDrawingManager->drawContext(std::move(rt), std::move(colorSpace), surfaceProps); |
+sk_sp<GrDrawContext> GrContextPriv::makeBackendTextureDrawContext(const GrBackendTextureDesc& desc, |
+ sk_sp<SkColorSpace> colorSpace, |
+ const SkSurfaceProps* props, |
+ GrWrapOwnership ownership) { |
+ ASSERT_SINGLE_OWNER_PRIV |
+ SkASSERT(desc.fFlags & kRenderTarget_GrBackendTextureFlag); |
+ |
+ sk_sp<GrSurface> surface(fContext->textureProvider()->wrapBackendTexture(desc, ownership)); |
+ if (!surface) { |
+ return nullptr; |
+ } |
+ |
+ return fContext->drawingManager()->drawContext(sk_ref_sp(surface->asRenderTarget()), |
+ std::move(colorSpace), props); |
+} |
+ |
+sk_sp<GrDrawContext> GrContextPriv::makeBackendRenderTargetDrawContext( |
+ const GrBackendRenderTargetDesc& desc, |
+ sk_sp<SkColorSpace> colorSpace, |
+ const SkSurfaceProps* surfaceProps) { |
+ ASSERT_SINGLE_OWNER_PRIV |
+ |
+ sk_sp<GrRenderTarget> rt(fContext->textureProvider()->wrapBackendRenderTarget(desc)); |
+ if (!rt) { |
+ return nullptr; |
+ } |
+ |
+ return fContext->drawingManager()->drawContext(std::move(rt), std::move(colorSpace), |
+ surfaceProps); |
+} |
+ |
+sk_sp<GrDrawContext> GrContextPriv::makeBackendTextureAsRenderTargetDrawContext( |
+ const GrBackendTextureDesc& desc, |
+ sk_sp<SkColorSpace> colorSpace, |
+ const SkSurfaceProps* surfaceProps) { |
+ ASSERT_SINGLE_OWNER_PRIV |
+ SkASSERT(desc.fFlags & kRenderTarget_GrBackendTextureFlag); |
+ |
+ sk_sp<GrSurface> surface(fContext->resourceProvider()->wrapBackendTextureAsRenderTarget(desc)); |
+ if (!surface) { |
+ return nullptr; |
+ } |
+ |
+ return fContext->drawingManager()->drawContext(sk_ref_sp(surface->asRenderTarget()), |
+ std::move(colorSpace), surfaceProps); |
} |
sk_sp<GrDrawContext> GrContext::makeDrawContext(SkBackingFit fit, |
@@ -640,7 +694,8 @@ sk_sp<GrDrawContext> GrContext::makeDrawContext(SkBackingFit fit, |
return nullptr; |
} |
- sk_sp<GrDrawContext> drawContext(this->makeDrawContext(sk_ref_sp(tex->asRenderTarget()), |
+ sk_sp<GrDrawContext> drawContext(this->contextPriv().makeWrappedDrawContext( |
+ sk_ref_sp(tex->asRenderTarget()), |
std::move(colorSpace), surfaceProps)); |
if (!drawContext) { |
return nullptr; |