blob: f428a0fb73cdc9d5d78f9ca7ab3aa0f53ef410d7 [file] [log] [blame]
robertphillips76948d42016-05-04 12:47:41 -07001/*
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
csmartdaltonf9635992016-08-10 11:09:07 -070010#include "GrCaps.h"
Robert Phillipsf2361d22016-10-25 14:20:06 -040011#include "GrRenderTargetOpList.h"
Robert Phillipsc7635fa2016-10-28 13:25:24 -040012#include "GrRenderTargetPriv.h"
Robert Phillipsf2361d22016-10-25 14:20:06 -040013#include "GrTextureProvider.h"
Robert Phillips84a81202016-11-04 11:59:10 -040014#include "GrTextureRenderTargetProxy.h"
robertphillips76948d42016-05-04 12:47:41 -070015
csmartdaltonf9635992016-08-10 11:09:07 -070016// 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)
Robert Phillipsc7635fa2016-10-28 13:25:24 -040022 , fFlags(GrRenderTarget::Flags::kNone) {
csmartdaltonf9635992016-08-10 11:09:07 -070023 // 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) {
Robert Phillipsc7635fa2016-10-28 13:25:24 -040026 fFlags |= GrRenderTarget::Flags::kMixedSampled;
csmartdaltonf9635992016-08-10 11:09:07 -070027 }
28 if (caps.maxWindowRectangles() > 0) {
Robert Phillipsc7635fa2016-10-28 13:25:24 -040029 fFlags |= GrRenderTarget::Flags::kWindowRectsSupport;
csmartdaltonf9635992016-08-10 11:09:07 -070030 }
31}
32
33// Wrapped version
Robert Phillipsabacf092016-11-02 10:23:32 -040034GrRenderTargetProxy::GrRenderTargetProxy(sk_sp<GrRenderTarget> rt)
Robert Phillipsc7635fa2016-10-28 13:25:24 -040035 : INHERITED(std::move(rt), SkBackingFit::kExact)
36 , fFlags(fTarget->asRenderTarget()->renderTargetPriv().flags()) {
robertphillips76948d42016-05-04 12:47:41 -070037}
38
39GrRenderTarget* GrRenderTargetProxy::instantiate(GrTextureProvider* texProvider) {
Leon Scroggins7d7d7d12016-11-07 21:26:31 +000040 if (fTarget) {
41 return fTarget->asRenderTarget();
42 }
robertphillips76948d42016-05-04 12:47:41 -070043
Leon Scroggins7d7d7d12016-11-07 21:26:31 +000044 // TODO: it would be nice to not have to copy the desc here
45 GrSurfaceDesc desc = fDesc;
46 desc.fFlags |= GrSurfaceFlags::kRenderTarget_GrSurfaceFlag;
47
48 if (SkBackingFit::kApprox == fFit) {
49 fTarget = texProvider->createApproxTexture(desc);
50 } else {
51 fTarget = texProvider->createTexture(desc, fBudgeted);
52 }
53 if (!fTarget) {
robertphillips76948d42016-05-04 12:47:41 -070054 return nullptr;
55 }
56
Leon Scroggins7d7d7d12016-11-07 21:26:31 +000057#ifdef SK_DEBUG
58 if (kInvalidGpuMemorySize != this->getRawGpuMemorySize_debugOnly()) {
59 SkASSERT(fTarget->gpuMemorySize() <= this->getRawGpuMemorySize_debugOnly());
60 }
61#endif
robertphillips76948d42016-05-04 12:47:41 -070062
Leon Scroggins7d7d7d12016-11-07 21:26:31 +000063 // Check that our a priori computation matched the ultimate reality
64 SkASSERT(fFlags == fTarget->asRenderTarget()->renderTargetPriv().flags());
65
66 return fTarget->asRenderTarget();
robertphillips76948d42016-05-04 12:47:41 -070067}
68
Robert Phillipsc7635fa2016-10-28 13:25:24 -040069
70#ifdef SK_DEBUG
71void GrRenderTargetProxy::validate(GrContext* context) const {
72 if (fTarget) {
73 SkASSERT(fTarget->getContext() == context);
74 }
75
76 INHERITED::validate();
77}
78#endif
79
Robert Phillips8bc06d02016-11-01 17:28:40 -040080size_t GrRenderTargetProxy::onGpuMemorySize() const {
81 if (fTarget) {
82 return fTarget->gpuMemorySize();
83 }
84
Robert Phillips8bc06d02016-11-01 17:28:40 -040085 // TODO: do we have enough information to improve this worst case estimate?
Robert Phillipsd6214d42016-11-07 08:23:48 -050086 return GrSurface::ComputeSize(fDesc, fDesc.fSampleCnt+1, false);
Robert Phillips8bc06d02016-11-01 17:28:40 -040087}
88
robertphillips76948d42016-05-04 12:47:41 -070089sk_sp<GrRenderTargetProxy> GrRenderTargetProxy::Make(const GrCaps& caps,
90 const GrSurfaceDesc& desc,
91 SkBackingFit fit,
92 SkBudgeted budgeted) {
Robert Phillips84a81202016-11-04 11:59:10 -040093 // We know anything we instantiate later from this deferred path will be
94 // both texturable and renderable
95 return GrTextureRenderTargetProxy::Make(caps, desc, fit, budgeted);
robertphillips76948d42016-05-04 12:47:41 -070096}
97
Robert Phillipsabacf092016-11-02 10:23:32 -040098sk_sp<GrRenderTargetProxy> GrRenderTargetProxy::Make(sk_sp<GrRenderTarget> rt) {
Robert Phillips84a81202016-11-04 11:59:10 -040099 if (rt->asTexture()) {
100 return GrTextureRenderTargetProxy::Make(std::move(rt));
101 }
102
103 // Not texturable
Robert Phillipsabacf092016-11-02 10:23:32 -0400104 return sk_sp<GrRenderTargetProxy>(new GrRenderTargetProxy(rt));
robertphillips76948d42016-05-04 12:47:41 -0700105}
106