blob: 54886255813c04d59654c3b204f0a0b5126f9cae [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"
Greg Daniel849dce12018-04-24 14:32:53 -040015#include "GrSurfacePriv.h"
Robert Phillips84a81202016-11-04 11:59:10 -040016#include "GrTextureRenderTargetProxy.h"
Brian Salomonbb5711a2017-05-17 13:49:59 -040017#include "SkMathPriv.h"
robertphillips76948d42016-05-04 12:47:41 -070018
csmartdaltonf9635992016-08-10 11:09:07 -070019// Deferred version
20// TODO: we can probably munge the 'desc' in both the wrapped and deferred
21// cases to make the sampleConfig/numSamples stuff more rational.
22GrRenderTargetProxy::GrRenderTargetProxy(const GrCaps& caps, const GrSurfaceDesc& desc,
Brian Salomon2a4f9832018-03-03 22:43:43 -050023 GrSurfaceOrigin origin, SkBackingFit fit,
Robert Phillipsfe0253f2018-03-16 16:47:25 -040024 SkBudgeted budgeted, GrInternalSurfaceFlags surfaceFlags)
25 : INHERITED(desc, origin, fit, budgeted, surfaceFlags)
Brian Salomonbb5711a2017-05-17 13:49:59 -040026 , fSampleCnt(desc.fSampleCnt)
Robert Phillipsfe0253f2018-03-16 16:47:25 -040027 , fNeedsStencil(false) {
csmartdaltonf9635992016-08-10 11:09:07 -070028 // Since we know the newly created render target will be internal, we are able to precompute
29 // what the flags will ultimately end up being.
Brian Salomonbdecacf2018-02-02 20:32:49 -050030 if (caps.usesMixedSamples() && fSampleCnt > 1) {
Robert Phillipsfe0253f2018-03-16 16:47:25 -040031 this->setHasMixedSamples();
csmartdaltonf9635992016-08-10 11:09:07 -070032 }
Jim Van Verth6a40abc2017-11-02 16:56:09 +000033 if (caps.maxWindowRectangles() > 0) {
Robert Phillipsfe0253f2018-03-16 16:47:25 -040034 this->setSupportsWindowRects();
csmartdaltonf9635992016-08-10 11:09:07 -070035 }
36}
37
Chris Dalton706a6ff2017-11-29 22:01:06 -070038// Lazy-callback version
Greg Daniel65fa8ca2018-01-10 17:06:31 -050039GrRenderTargetProxy::GrRenderTargetProxy(LazyInstantiateCallback&& callback,
Brian Salomon2a4f9832018-03-03 22:43:43 -050040 LazyInstantiationType lazyType, const GrSurfaceDesc& desc,
41 GrSurfaceOrigin origin, SkBackingFit fit,
Robert Phillipsfe0253f2018-03-16 16:47:25 -040042 SkBudgeted budgeted, GrInternalSurfaceFlags surfaceFlags)
43 : INHERITED(std::move(callback), lazyType, desc, origin, fit, budgeted, surfaceFlags)
Greg Daniel65fa8ca2018-01-10 17:06:31 -050044 , fSampleCnt(desc.fSampleCnt)
Robert Phillipsfe0253f2018-03-16 16:47:25 -040045 , fNeedsStencil(false) {
Greg Daniel65fa8ca2018-01-10 17:06:31 -050046 SkASSERT(SkToBool(kRenderTarget_GrSurfaceFlag & desc.fFlags));
Chris Dalton706a6ff2017-11-29 22:01:06 -070047}
48
csmartdaltonf9635992016-08-10 11:09:07 -070049// Wrapped version
Robert Phillips066f0202017-07-25 10:16:35 -040050GrRenderTargetProxy::GrRenderTargetProxy(sk_sp<GrSurface> surf, GrSurfaceOrigin origin)
Chris Dalton706a6ff2017-11-29 22:01:06 -070051 : INHERITED(std::move(surf), origin, SkBackingFit::kExact)
52 , fSampleCnt(fTarget->asRenderTarget()->numStencilSamples())
Robert Phillipsfe0253f2018-03-16 16:47:25 -040053 , fNeedsStencil(false) {
Robert Phillipsc4f0a822017-06-13 08:11:36 -040054}
robertphillips76948d42016-05-04 12:47:41 -070055
Robert Phillipsec2249f2016-11-09 08:54:35 -050056int GrRenderTargetProxy::maxWindowRectangles(const GrCaps& caps) const {
Robert Phillipsfe0253f2018-03-16 16:47:25 -040057 return this->supportsWindowRects() ? caps.maxWindowRectangles() : 0;
Robert Phillipsec2249f2016-11-09 08:54:35 -050058}
59
Robert Phillipseee4d6e2017-06-05 09:26:07 -040060bool GrRenderTargetProxy::instantiate(GrResourceProvider* resourceProvider) {
Greg Daniel0a375db2018-02-01 12:21:39 -050061 if (LazyState::kNot != this->lazyInstantiationState()) {
62 return false;
63 }
Robert Phillipsfe0253f2018-03-16 16:47:25 -040064 static constexpr GrSurfaceDescFlags kDescFlags = kRenderTarget_GrSurfaceFlag;
robertphillips76948d42016-05-04 12:47:41 -070065
Robert Phillipsfe0253f2018-03-16 16:47:25 -040066 if (!this->instantiateImpl(resourceProvider, fSampleCnt, fNeedsStencil, kDescFlags,
Greg Danield2d8e922018-02-12 12:07:39 -050067 GrMipMapped::kNo, nullptr)) {
Robert Phillipseee4d6e2017-06-05 09:26:07 -040068 return false;
robertphillips76948d42016-05-04 12:47:41 -070069 }
Robert Phillipseee4d6e2017-06-05 09:26:07 -040070 SkASSERT(fTarget->asRenderTarget());
Greg Daniele252f082017-10-23 16:05:23 -040071 SkASSERT(!fTarget->asTexture());
Robert Phillipseee4d6e2017-06-05 09:26:07 -040072 return true;
robertphillips76948d42016-05-04 12:47:41 -070073}
74
Robert Phillips5af44de2017-07-18 14:49:38 -040075sk_sp<GrSurface> GrRenderTargetProxy::createSurface(GrResourceProvider* resourceProvider) const {
Robert Phillipsfe0253f2018-03-16 16:47:25 -040076 static constexpr GrSurfaceDescFlags kDescFlags = kRenderTarget_GrSurfaceFlag;
Robert Phillips5af44de2017-07-18 14:49:38 -040077
Robert Phillips65048132017-08-10 08:44:49 -040078 sk_sp<GrSurface> surface = this->createSurfaceImpl(resourceProvider, fSampleCnt, fNeedsStencil,
Robert Phillipsfe0253f2018-03-16 16:47:25 -040079 kDescFlags, GrMipMapped::kNo);
Robert Phillips5af44de2017-07-18 14:49:38 -040080 if (!surface) {
81 return nullptr;
82 }
83 SkASSERT(surface->asRenderTarget());
Greg Daniele252f082017-10-23 16:05:23 -040084 SkASSERT(!surface->asTexture());
Robert Phillips5af44de2017-07-18 14:49:38 -040085 return surface;
86}
87
Brian Salomonbb5711a2017-05-17 13:49:59 -040088size_t GrRenderTargetProxy::onUninstantiatedGpuMemorySize() const {
Brian Salomonbdecacf2018-02-02 20:32:49 -050089 int colorSamplesPerPixel = this->numColorSamples();
90 if (colorSamplesPerPixel > 1) {
91 // Add one for the resolve buffer.
92 ++colorSamplesPerPixel;
93 }
Greg Daniele252f082017-10-23 16:05:23 -040094
Robert Phillips8bc06d02016-11-01 17:28:40 -040095 // TODO: do we have enough information to improve this worst case estimate?
Chris Dalton706a6ff2017-11-29 22:01:06 -070096 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
97 colorSamplesPerPixel, GrMipMapped::kNo, !this->priv().isExact());
Robert Phillips8bc06d02016-11-01 17:28:40 -040098}
99
Robert Phillipse2f7d182016-12-15 09:23:05 -0500100bool GrRenderTargetProxy::refsWrappedObjects() const {
101 if (!fTarget) {
102 return false;
103 }
104
105 return fTarget->resourcePriv().refsWrappedObjects();
106}
Robert Phillipse8fabb22018-02-04 14:33:21 -0500107
108#ifdef SK_DEBUG
Greg Daniel849dce12018-04-24 14:32:53 -0400109void GrRenderTargetProxy::onValidateSurface(const GrSurface* surface) {
Robert Phillipse8fabb22018-02-04 14:33:21 -0500110 SkASSERT(!surface->asTexture());
111
112 // Anything that is checked here should be duplicated in GrTextureRenderTargetProxy's version
113 SkASSERT(surface->asRenderTarget());
114 SkASSERT(surface->asRenderTarget()->numStencilSamples() == this->numStencilSamples());
Greg Daniel849dce12018-04-24 14:32:53 -0400115
Greg Daniela070ed72018-04-26 16:31:38 -0400116 GrInternalSurfaceFlags proxyFlags = fSurfaceFlags;
117 GrInternalSurfaceFlags surfaceFlags = surface->surfacePriv().flags();
118 SkASSERT((proxyFlags & GrInternalSurfaceFlags::kRenderTargetMask) ==
119 (surfaceFlags & GrInternalSurfaceFlags::kRenderTargetMask));
Robert Phillipse8fabb22018-02-04 14:33:21 -0500120}
121#endif