Added GrSurfaceContext and GrTextureContext
This lets copy-to-texture to be treated like copy-to-rt.
To match current behavior, though, copies to texture are
still executed immediately (forcing a flush).
Once MDB is enabled, copies to texture will be deferred.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=5093
Change-Id: Icc0ce5435507a5f0a237c22eedef879824952367
Reviewed-on: https://skia-review.googlesource.com/5093
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 1a5ee20..7b789bd 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -14,7 +14,9 @@
#include "GrResourceProvider.h"
#include "GrRenderTargetProxy.h"
#include "GrSoftwarePathRenderer.h"
+#include "GrSurfaceContext.h"
#include "GrSurfacePriv.h"
+#include "GrTextureContext.h"
#include "SkConfig8888.h"
#include "SkGrPriv.h"
@@ -557,31 +559,23 @@
return false;
}
- if (!dst->asRenderTarget()) {
- SkIRect clippedSrcRect;
- SkIPoint clippedDstPoint;
- if (!GrCopySurfaceBatch::ClipSrcRectAndDstPoint(dst, src, srcRect, dstPoint,
- &clippedSrcRect, &clippedDstPoint)) {
- return false;
- }
- // If we don't have an RT for the dst then we won't have a GrRenderTargetContext to insert
- // the copy surface into. In the future we plan to have a more limited Context type
- // (GrCopyContext?) that has the subset of GrRenderTargetContext operations that should be
- // allowed on textures that aren't render targets.
- // For now we just flush any writes to the src and issue an immediate copy to the dst.
- src->flushWrites();
- return fGpu->copySurface(dst, src, clippedSrcRect, clippedDstPoint);
- }
- sk_sp<GrRenderTargetContext> renderTargetContext(
- this->contextPriv().makeWrappedRenderTargetContext(sk_ref_sp(dst->asRenderTarget()),
- nullptr));
- if (!renderTargetContext) {
+#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 (!renderTargetContext->copySurface(src, srcRect, dstPoint)) {
+ if (!surfaceContext->copySurface(src, srcRect, dstPoint)) {
return false;
}
+
return true;
}
@@ -633,6 +627,19 @@
surfaceProps);
}
+sk_sp<GrSurfaceContext> GrContextPriv::makeWrappedSurfaceContext(sk_sp<GrSurface> surface) {
+ ASSERT_SINGLE_OWNER_PRIV
+
+ sk_sp<GrSurfaceProxy> proxy(GrSurfaceProxy::MakeWrapped(std::move(surface)));
+
+ if (proxy->asRenderTargetProxy()) {
+ return this->drawingManager()->makeRenderTargetContext(std::move(proxy), nullptr, nullptr);
+ } else {
+ SkASSERT(proxy->asTextureProxy());
+ return this->drawingManager()->makeTextureContext(std::move(proxy));
+ }
+}
+
sk_sp<GrRenderTargetContext> GrContextPriv::makeBackendTextureRenderTargetContext(
const GrBackendTextureDesc& desc,
sk_sp<SkColorSpace> colorSpace,