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