blob: 50d79f44b8b63aab728c49cde75ea2c105c9bc81 [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
robertphillips76948d42016-05-04 12:47:41 -070056 // Check that our a priori computation matched the ultimate reality
Robert Phillipsc7635fa2016-10-28 13:25:24 -040057 SkASSERT(fFlags == fTarget->asRenderTarget()->renderTargetPriv().flags());
robertphillips76948d42016-05-04 12:47:41 -070058
Robert Phillipsc7635fa2016-10-28 13:25:24 -040059 return fTarget->asRenderTarget();
robertphillips76948d42016-05-04 12:47:41 -070060}
61
Robert Phillipsc7635fa2016-10-28 13:25:24 -040062
63#ifdef SK_DEBUG
64void GrRenderTargetProxy::validate(GrContext* context) const {
65 if (fTarget) {
66 SkASSERT(fTarget->getContext() == context);
67 }
68
69 INHERITED::validate();
70}
71#endif
72
robertphillips76948d42016-05-04 12:47:41 -070073sk_sp<GrRenderTargetProxy> GrRenderTargetProxy::Make(const GrCaps& caps,
74 const GrSurfaceDesc& desc,
75 SkBackingFit fit,
76 SkBudgeted budgeted) {
77 return sk_sp<GrRenderTargetProxy>(new GrRenderTargetProxy(caps, desc, fit, budgeted));
78}
79
csmartdaltonf9635992016-08-10 11:09:07 -070080sk_sp<GrRenderTargetProxy> GrRenderTargetProxy::Make(const GrCaps& caps, sk_sp<GrRenderTarget> rt) {
81 return sk_sp<GrRenderTargetProxy>(new GrRenderTargetProxy(caps, rt));
robertphillips76948d42016-05-04 12:47:41 -070082}
83