GrRenderTargetProxy.cpp revision 2411c1112e7b3cb0126143e4c0a731aff7876dce
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 "GrRenderTargetProxy.h"
9
10#include "GrCaps.h"
11#include "GrGpuResourcePriv.h"
12#include "GrRenderTargetOpList.h"
13#include "GrRenderTargetPriv.h"
14#include "GrTextureProvider.h"
15#include "GrTextureRenderTargetProxy.h"
16
17// Deferred version
18// TODO: we can probably munge the 'desc' in both the wrapped and deferred
19// cases to make the sampleConfig/numSamples stuff more rational.
20GrRenderTargetProxy::GrRenderTargetProxy(const GrCaps& caps, const GrSurfaceDesc& desc,
21                                         SkBackingFit fit, SkBudgeted budgeted)
22    : INHERITED(desc, fit, budgeted)
23    , fFlags(GrRenderTarget::Flags::kNone) {
24    // Since we know the newly created render target will be internal, we are able to precompute
25    // what the flags will ultimately end up being.
26    if (caps.usesMixedSamples() && fDesc.fSampleCnt > 0) {
27        fFlags |= GrRenderTarget::Flags::kMixedSampled;
28    }
29    if (caps.maxWindowRectangles() > 0) {
30        fFlags |= GrRenderTarget::Flags::kWindowRectsSupport;
31    }
32}
33
34// Wrapped version
35GrRenderTargetProxy::GrRenderTargetProxy(sk_sp<GrSurface> surf)
36    : INHERITED(std::move(surf), SkBackingFit::kExact)
37    , fFlags(fTarget->asRenderTarget()->renderTargetPriv().flags()) {
38}
39
40int GrRenderTargetProxy::maxWindowRectangles(const GrCaps& caps) const {
41    return (fFlags & GrRenderTarget::Flags::kWindowRectsSupport) ? caps.maxWindowRectangles() : 0;
42}
43
44GrRenderTarget* GrRenderTargetProxy::instantiate(GrTextureProvider* texProvider) {
45    SkASSERT(fDesc.fFlags & GrSurfaceFlags::kRenderTarget_GrSurfaceFlag);
46
47    GrSurface* surf = INHERITED::instantiate(texProvider);
48    if (!surf || !surf->asRenderTarget()) {
49        return nullptr;
50    }
51
52    // Check that our a priori computation matched the ultimate reality
53    SkASSERT(fFlags == surf->asRenderTarget()->renderTargetPriv().flags());
54
55    return surf->asRenderTarget();
56}
57
58size_t GrRenderTargetProxy::onGpuMemorySize() const {
59    if (fTarget) {
60        return fTarget->gpuMemorySize();
61    }
62
63    // TODO: do we have enough information to improve this worst case estimate?
64    return GrSurface::ComputeSize(fDesc, fDesc.fSampleCnt+1, false, SkBackingFit::kApprox == fFit);
65}
66
67bool GrRenderTargetProxy::refsWrappedObjects() const {
68    if (!fTarget) {
69        return false;
70    }
71
72    return fTarget->resourcePriv().refsWrappedObjects();
73}
74