blob: fcc5275002afacd6d97d5eb5ba0440e4598f3ab7 [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) {
Robert Phillipseaa86252016-11-08 13:49:39 +000040 SkASSERT(fDesc.fFlags & GrSurfaceFlags::kRenderTarget_GrSurfaceFlag);
robertphillips76948d42016-05-04 12:47:41 -070041
Robert Phillipseaa86252016-11-08 13:49:39 +000042 GrSurface* surf = INHERITED::instantiate(texProvider);
43 if (!surf || !surf->asRenderTarget()) {
robertphillips76948d42016-05-04 12:47:41 -070044 return nullptr;
45 }
46
Leon Scroggins7d7d7d12016-11-07 21:26:31 +000047 // Check that our a priori computation matched the ultimate reality
Robert Phillipseaa86252016-11-08 13:49:39 +000048 SkASSERT(fFlags == surf->asRenderTarget()->renderTargetPriv().flags());
Leon Scroggins7d7d7d12016-11-07 21:26:31 +000049
Robert Phillipseaa86252016-11-08 13:49:39 +000050 return surf->asRenderTarget();
robertphillips76948d42016-05-04 12:47:41 -070051}
52
Robert Phillipsc7635fa2016-10-28 13:25:24 -040053
54#ifdef SK_DEBUG
55void GrRenderTargetProxy::validate(GrContext* context) const {
56 if (fTarget) {
57 SkASSERT(fTarget->getContext() == context);
58 }
59
60 INHERITED::validate();
61}
62#endif
63
Robert Phillips8bc06d02016-11-01 17:28:40 -040064size_t GrRenderTargetProxy::onGpuMemorySize() const {
65 if (fTarget) {
66 return fTarget->gpuMemorySize();
67 }
68
Robert Phillips8bc06d02016-11-01 17:28:40 -040069 // TODO: do we have enough information to improve this worst case estimate?
Robert Phillipsd6214d42016-11-07 08:23:48 -050070 return GrSurface::ComputeSize(fDesc, fDesc.fSampleCnt+1, false);
Robert Phillips8bc06d02016-11-01 17:28:40 -040071}
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) {
Robert Phillips84a81202016-11-04 11:59:10 -040077 // We know anything we instantiate later from this deferred path will be
78 // both texturable and renderable
79 return GrTextureRenderTargetProxy::Make(caps, desc, fit, budgeted);
robertphillips76948d42016-05-04 12:47:41 -070080}
81
Robert Phillipsabacf092016-11-02 10:23:32 -040082sk_sp<GrRenderTargetProxy> GrRenderTargetProxy::Make(sk_sp<GrRenderTarget> rt) {
Robert Phillips84a81202016-11-04 11:59:10 -040083 if (rt->asTexture()) {
84 return GrTextureRenderTargetProxy::Make(std::move(rt));
85 }
86
87 // Not texturable
Robert Phillipsabacf092016-11-02 10:23:32 -040088 return sk_sp<GrRenderTargetProxy>(new GrRenderTargetProxy(rt));
robertphillips76948d42016-05-04 12:47:41 -070089}
90