diff options
author | robertphillips <robertphillips@google.com> | 2016-05-03 05:06:29 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-05-03 05:06:29 -0700 |
commit | de5bf0cfeca908b81a28cc50065f7bc2da3d2fd1 (patch) | |
tree | e208e4b36c04587300639bfaf50ff21799c4a1a3 /src/gpu/GrRenderTargetProxy.cpp | |
parent | 1cb00e42bff455e23f6883bf09680438fa631224 (diff) |
Add Gr*Proxy classes
This isn't wired in anywhere yet.
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1937553002
Review-Url: https://codereview.chromium.org/1937553002
Diffstat (limited to 'src/gpu/GrRenderTargetProxy.cpp')
-rw-r--r-- | src/gpu/GrRenderTargetProxy.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/gpu/GrRenderTargetProxy.cpp b/src/gpu/GrRenderTargetProxy.cpp new file mode 100644 index 0000000000..8d821c3c1d --- /dev/null +++ b/src/gpu/GrRenderTargetProxy.cpp @@ -0,0 +1,77 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "GrRenderTargetProxy.h" + +#include "GrDrawTarget.h" +#include "GrGpuResourcePriv.h" +#include "GrRenderTargetPriv.h" + +GrRenderTargetProxy::GrRenderTargetProxy(sk_sp<GrRenderTarget> rt) + : INHERITED(rt->desc(), SkBackingFit::kExact, rt->resourcePriv().isBudgeted()) + , fTarget(std::move(rt)) + , fSampleConfig(fTarget->renderTargetPriv().sampleConfig()) + , fLastDrawTarget(nullptr) { +} + +GrRenderTargetProxy::~GrRenderTargetProxy() { + if (fLastDrawTarget) { + fLastDrawTarget->clearRT(); + } + SkSafeUnref(fLastDrawTarget); +} + +GrRenderTarget* GrRenderTargetProxy::instantiate(GrTextureProvider* texProvider) { + if (fTarget) { + return fTarget.get(); + } + + // TODO: it would be nice to not have to copy the desc here + GrSurfaceDesc desc = fDesc; + desc.fFlags |= GrSurfaceFlags::kRenderTarget_GrSurfaceFlag; + + sk_sp<GrTexture> tex; + if (SkBackingFit::kApprox == fFit) { + tex.reset(texProvider->createApproxTexture(desc)); + } else { + tex.reset(texProvider->createTexture(desc, fBudgeted)); + } + if (!tex || !tex->asRenderTarget()) { + return nullptr; + } + + fTarget.reset(tex->asRenderTarget()); + + // Check that our a priori computation matched the ultimate reality + SkASSERT(fSampleConfig == fTarget->renderTargetPriv().sampleConfig()); + + return fTarget.get(); +} + +void GrRenderTargetProxy::setLastDrawTarget(GrDrawTarget* dt) { + if (fLastDrawTarget) { + // The non-MDB world never closes so we can't check this condition +#ifdef ENABLE_MDB + SkASSERT(fLastDrawTarget->isClosed()); +#endif + fLastDrawTarget->clearRT(); + } + + SkRefCnt_SafeAssign(fLastDrawTarget, dt); +} + +sk_sp<GrRenderTargetProxy> GrRenderTargetProxy::Make(const GrCaps& caps, + const GrSurfaceDesc& desc, + SkBackingFit fit, + SkBudgeted budgeted) { + return sk_sp<GrRenderTargetProxy>(new GrRenderTargetProxy(caps, desc, fit, budgeted)); +} + +sk_sp<GrRenderTargetProxy> GrRenderTargetProxy::Make(sk_sp<GrRenderTarget> rt) { + return sk_sp<GrRenderTargetProxy>(new GrRenderTargetProxy(rt)); +} + |