blob: 380984871e103a7390f04d9b24e6f216eb01a1e8 [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"
robertphillips76948d42016-05-04 12:47:41 -070014
csmartdaltonf9635992016-08-10 11:09:07 -070015// Deferred version
16// TODO: we can probably munge the 'desc' in both the wrapped and deferred
17// cases to make the sampleConfig/numSamples stuff more rational.
18GrRenderTargetProxy::GrRenderTargetProxy(const GrCaps& caps, const GrSurfaceDesc& desc,
19 SkBackingFit fit, SkBudgeted budgeted)
20 : INHERITED(desc, fit, budgeted)
Robert Phillipsc7635fa2016-10-28 13:25:24 -040021 , fFlags(GrRenderTarget::Flags::kNone) {
csmartdaltonf9635992016-08-10 11:09:07 -070022 // Since we know the newly created render target will be internal, we are able to precompute
23 // what the flags will ultimately end up being.
24 if (caps.usesMixedSamples() && fDesc.fSampleCnt > 0) {
Robert Phillipsc7635fa2016-10-28 13:25:24 -040025 fFlags |= GrRenderTarget::Flags::kMixedSampled;
csmartdaltonf9635992016-08-10 11:09:07 -070026 }
27 if (caps.maxWindowRectangles() > 0) {
Robert Phillipsc7635fa2016-10-28 13:25:24 -040028 fFlags |= GrRenderTarget::Flags::kWindowRectsSupport;
csmartdaltonf9635992016-08-10 11:09:07 -070029 }
30}
31
32// Wrapped version
33GrRenderTargetProxy::GrRenderTargetProxy(const GrCaps& caps, sk_sp<GrRenderTarget> rt)
Robert Phillipsc7635fa2016-10-28 13:25:24 -040034 : INHERITED(std::move(rt), SkBackingFit::kExact)
35 , fFlags(fTarget->asRenderTarget()->renderTargetPriv().flags()) {
robertphillips76948d42016-05-04 12:47:41 -070036}
37
38GrRenderTarget* GrRenderTargetProxy::instantiate(GrTextureProvider* texProvider) {
39 if (fTarget) {
Robert Phillipsc7635fa2016-10-28 13:25:24 -040040 return fTarget->asRenderTarget();
robertphillips76948d42016-05-04 12:47:41 -070041 }
42
43 // TODO: it would be nice to not have to copy the desc here
44 GrSurfaceDesc desc = fDesc;
45 desc.fFlags |= GrSurfaceFlags::kRenderTarget_GrSurfaceFlag;
46
robertphillips76948d42016-05-04 12:47:41 -070047 if (SkBackingFit::kApprox == fFit) {
Robert Phillipsc7635fa2016-10-28 13:25:24 -040048 fTarget = texProvider->createApproxTexture(desc);
robertphillips76948d42016-05-04 12:47:41 -070049 } else {
Robert Phillipsc7635fa2016-10-28 13:25:24 -040050 fTarget = texProvider->createTexture(desc, fBudgeted);
robertphillips76948d42016-05-04 12:47:41 -070051 }
Robert Phillipsc7635fa2016-10-28 13:25:24 -040052 if (!fTarget) {
robertphillips76948d42016-05-04 12:47:41 -070053 return nullptr;
54 }
55
Robert Phillips8bc06d02016-11-01 17:28:40 -040056#ifdef SK_DEBUG
57 if (kInvalidGpuMemorySize != fGpuMemorySize) {
58 SkASSERT(fTarget->gpuMemorySize() <= fGpuMemorySize);
59 }
60#endif
61
robertphillips76948d42016-05-04 12:47:41 -070062 // Check that our a priori computation matched the ultimate reality
Robert Phillipsc7635fa2016-10-28 13:25:24 -040063 SkASSERT(fFlags == fTarget->asRenderTarget()->renderTargetPriv().flags());
robertphillips76948d42016-05-04 12:47:41 -070064
Robert Phillipsc7635fa2016-10-28 13:25:24 -040065 return fTarget->asRenderTarget();
robertphillips76948d42016-05-04 12:47:41 -070066}
67
Robert Phillipsc7635fa2016-10-28 13:25:24 -040068
69#ifdef SK_DEBUG
70void GrRenderTargetProxy::validate(GrContext* context) const {
71 if (fTarget) {
72 SkASSERT(fTarget->getContext() == context);
73 }
74
75 INHERITED::validate();
76}
77#endif
78
Robert Phillips8bc06d02016-11-01 17:28:40 -040079size_t GrRenderTargetProxy::onGpuMemorySize() const {
80 if (fTarget) {
81 return fTarget->gpuMemorySize();
82 }
83
84 SkASSERT(kUnknown_GrPixelConfig != fDesc.fConfig);
85 SkASSERT(!GrPixelConfigIsCompressed(fDesc.fConfig));
86 size_t colorBytes = GrBytesPerPixel(fDesc.fConfig);
87 SkASSERT(colorBytes > 0);
88
89 // TODO: do we have enough information to improve this worst case estimate?
90 return (fDesc.fSampleCnt + 1) * fDesc.fWidth * fDesc.fHeight * colorBytes;
91}
92
robertphillips76948d42016-05-04 12:47:41 -070093sk_sp<GrRenderTargetProxy> GrRenderTargetProxy::Make(const GrCaps& caps,
94 const GrSurfaceDesc& desc,
95 SkBackingFit fit,
96 SkBudgeted budgeted) {
97 return sk_sp<GrRenderTargetProxy>(new GrRenderTargetProxy(caps, desc, fit, budgeted));
98}
99
csmartdaltonf9635992016-08-10 11:09:07 -0700100sk_sp<GrRenderTargetProxy> GrRenderTargetProxy::Make(const GrCaps& caps, sk_sp<GrRenderTarget> rt) {
101 return sk_sp<GrRenderTargetProxy>(new GrRenderTargetProxy(caps, rt));
robertphillips76948d42016-05-04 12:47:41 -0700102}
103