blob: 44f23d484b7e3412445976c22799557dbbd2e314 [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 Phillipse2f7d182016-12-15 09:23:05 -050011#include "GrGpuResourcePriv.h"
Robert Phillipsf2361d22016-10-25 14:20:06 -040012#include "GrRenderTargetOpList.h"
Robert Phillipsc7635fa2016-10-28 13:25:24 -040013#include "GrRenderTargetPriv.h"
Brian Osman32342f02017-03-04 08:12:46 -050014#include "GrResourceProvider.h"
Robert Phillips84a81202016-11-04 11:59:10 -040015#include "GrTextureRenderTargetProxy.h"
robertphillips76948d42016-05-04 12:47:41 -070016
csmartdaltonf9635992016-08-10 11:09:07 -070017// Deferred version
18// TODO: we can probably munge the 'desc' in both the wrapped and deferred
19// cases to make the sampleConfig/numSamples stuff more rational.
20GrRenderTargetProxy::GrRenderTargetProxy(const GrCaps& caps, const GrSurfaceDesc& desc,
Robert Phillipsc787e492017-02-28 11:26:32 -050021 SkBackingFit fit, SkBudgeted budgeted, uint32_t flags)
22 : INHERITED(desc, fit, budgeted, flags)
Brian Salomondac5f6b2017-02-28 16:11:04 -050023 , fRenderTargetFlags(GrRenderTarget::Flags::kNone) {
csmartdaltonf9635992016-08-10 11:09:07 -070024 // Since we know the newly created render target will be internal, we are able to precompute
25 // what the flags will ultimately end up being.
26 if (caps.usesMixedSamples() && fDesc.fSampleCnt > 0) {
Brian Salomondac5f6b2017-02-28 16:11:04 -050027 fRenderTargetFlags |= GrRenderTarget::Flags::kMixedSampled;
csmartdaltonf9635992016-08-10 11:09:07 -070028 }
29 if (caps.maxWindowRectangles() > 0) {
Brian Salomondac5f6b2017-02-28 16:11:04 -050030 fRenderTargetFlags |= GrRenderTarget::Flags::kWindowRectsSupport;
csmartdaltonf9635992016-08-10 11:09:07 -070031 }
32}
33
34// Wrapped version
Robert Phillips37430132016-11-09 06:50:43 -050035GrRenderTargetProxy::GrRenderTargetProxy(sk_sp<GrSurface> surf)
36 : INHERITED(std::move(surf), SkBackingFit::kExact)
Brian Salomondac5f6b2017-02-28 16:11:04 -050037 , fRenderTargetFlags(fTarget->asRenderTarget()->renderTargetPriv().flags()) {
robertphillips76948d42016-05-04 12:47:41 -070038}
39
Robert Phillipsec2249f2016-11-09 08:54:35 -050040int GrRenderTargetProxy::maxWindowRectangles(const GrCaps& caps) const {
Brian Salomondac5f6b2017-02-28 16:11:04 -050041 return (fRenderTargetFlags & GrRenderTarget::Flags::kWindowRectsSupport)
42 ? caps.maxWindowRectangles()
43 : 0;
Robert Phillipsec2249f2016-11-09 08:54:35 -050044}
45
Brian Osman32342f02017-03-04 08:12:46 -050046GrRenderTarget* GrRenderTargetProxy::instantiate(GrResourceProvider* resourceProvider) {
Robert Phillipseaa86252016-11-08 13:49:39 +000047 SkASSERT(fDesc.fFlags & GrSurfaceFlags::kRenderTarget_GrSurfaceFlag);
robertphillips76948d42016-05-04 12:47:41 -070048
Brian Osman32342f02017-03-04 08:12:46 -050049 GrSurface* surf = INHERITED::instantiate(resourceProvider);
Robert Phillipseaa86252016-11-08 13:49:39 +000050 if (!surf || !surf->asRenderTarget()) {
robertphillips76948d42016-05-04 12:47:41 -070051 return nullptr;
52 }
53
Leon Scroggins7d7d7d12016-11-07 21:26:31 +000054 // Check that our a priori computation matched the ultimate reality
Brian Salomondac5f6b2017-02-28 16:11:04 -050055 SkASSERT(fRenderTargetFlags == surf->asRenderTarget()->renderTargetPriv().flags());
Leon Scroggins7d7d7d12016-11-07 21:26:31 +000056
Robert Phillipseaa86252016-11-08 13:49:39 +000057 return surf->asRenderTarget();
robertphillips76948d42016-05-04 12:47:41 -070058}
59
Robert Phillips8bc06d02016-11-01 17:28:40 -040060size_t GrRenderTargetProxy::onGpuMemorySize() const {
61 if (fTarget) {
62 return fTarget->gpuMemorySize();
63 }
64
Robert Phillips8bc06d02016-11-01 17:28:40 -040065 // TODO: do we have enough information to improve this worst case estimate?
Robert Phillipsb4460882016-11-17 14:43:51 -050066 return GrSurface::ComputeSize(fDesc, fDesc.fSampleCnt+1, false, SkBackingFit::kApprox == fFit);
Robert Phillips8bc06d02016-11-01 17:28:40 -040067}
68
Robert Phillipse2f7d182016-12-15 09:23:05 -050069bool GrRenderTargetProxy::refsWrappedObjects() const {
70 if (!fTarget) {
71 return false;
72 }
73
74 return fTarget->resourcePriv().refsWrappedObjects();
75}