blob: e0dbe8fbc57ffe9216f967c4d7a27dce89bb0da9 [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"
Brian Salomonbb5711a2017-05-17 13:49:59 -040016#include "SkMathPriv.h"
robertphillips76948d42016-05-04 12:47:41 -070017
csmartdaltonf9635992016-08-10 11:09:07 -070018// Deferred version
19// TODO: we can probably munge the 'desc' in both the wrapped and deferred
20// cases to make the sampleConfig/numSamples stuff more rational.
21GrRenderTargetProxy::GrRenderTargetProxy(const GrCaps& caps, const GrSurfaceDesc& desc,
Robert Phillipsc787e492017-02-28 11:26:32 -050022 SkBackingFit fit, SkBudgeted budgeted, uint32_t flags)
Brian Salomonbb5711a2017-05-17 13:49:59 -040023 : INHERITED(desc, fit, budgeted, flags)
24 , fSampleCnt(desc.fSampleCnt)
Robert Phillips65048132017-08-10 08:44:49 -040025 , fNeedsStencil(false)
Robert Phillipsc4f0a822017-06-13 08:11:36 -040026 , fRenderTargetFlags(GrRenderTargetFlags::kNone) {
csmartdaltonf9635992016-08-10 11:09:07 -070027 // Since we know the newly created render target will be internal, we are able to precompute
28 // what the flags will ultimately end up being.
Brian Salomonbdecacf2018-02-02 20:32:49 -050029 if (caps.usesMixedSamples() && fSampleCnt > 1) {
Robert Phillipsc4f0a822017-06-13 08:11:36 -040030 fRenderTargetFlags |= GrRenderTargetFlags::kMixedSampled;
csmartdaltonf9635992016-08-10 11:09:07 -070031 }
Jim Van Verth6a40abc2017-11-02 16:56:09 +000032 if (caps.maxWindowRectangles() > 0) {
Robert Phillipsc4f0a822017-06-13 08:11:36 -040033 fRenderTargetFlags |= GrRenderTargetFlags::kWindowRectsSupport;
csmartdaltonf9635992016-08-10 11:09:07 -070034 }
35}
36
Chris Dalton706a6ff2017-11-29 22:01:06 -070037// Lazy-callback version
Greg Daniel65fa8ca2018-01-10 17:06:31 -050038GrRenderTargetProxy::GrRenderTargetProxy(LazyInstantiateCallback&& callback,
Greg Daniel457469c2018-02-08 15:05:44 -050039 LazyInstantiationType lazyType,
Greg Daniel65fa8ca2018-01-10 17:06:31 -050040 const GrSurfaceDesc& desc,
41 SkBackingFit fit, SkBudgeted budgeted,
Greg Daniel2a303902018-02-20 10:25:54 -050042 uint32_t flags,
43 GrRenderTargetFlags renderTargetFlags)
Greg Daniel457469c2018-02-08 15:05:44 -050044 : INHERITED(std::move(callback), lazyType, desc, fit, budgeted, flags)
Greg Daniel65fa8ca2018-01-10 17:06:31 -050045 , fSampleCnt(desc.fSampleCnt)
Chris Dalton706a6ff2017-11-29 22:01:06 -070046 , fNeedsStencil(false)
Greg Daniel2a303902018-02-20 10:25:54 -050047 , fRenderTargetFlags(renderTargetFlags) {
Greg Daniel65fa8ca2018-01-10 17:06:31 -050048 SkASSERT(SkToBool(kRenderTarget_GrSurfaceFlag & desc.fFlags));
Chris Dalton706a6ff2017-11-29 22:01:06 -070049}
50
csmartdaltonf9635992016-08-10 11:09:07 -070051// Wrapped version
Robert Phillips066f0202017-07-25 10:16:35 -040052GrRenderTargetProxy::GrRenderTargetProxy(sk_sp<GrSurface> surf, GrSurfaceOrigin origin)
Chris Dalton706a6ff2017-11-29 22:01:06 -070053 : INHERITED(std::move(surf), origin, SkBackingFit::kExact)
54 , fSampleCnt(fTarget->asRenderTarget()->numStencilSamples())
55 , fNeedsStencil(false)
56 , fRenderTargetFlags(fTarget->asRenderTarget()->renderTargetPriv().flags()) {
Robert Phillipsc4f0a822017-06-13 08:11:36 -040057}
robertphillips76948d42016-05-04 12:47:41 -070058
Robert Phillipsec2249f2016-11-09 08:54:35 -050059int GrRenderTargetProxy::maxWindowRectangles(const GrCaps& caps) const {
Robert Phillipsc4f0a822017-06-13 08:11:36 -040060 return (fRenderTargetFlags & GrRenderTargetFlags::kWindowRectsSupport)
Brian Salomondac5f6b2017-02-28 16:11:04 -050061 ? caps.maxWindowRectangles()
62 : 0;
Robert Phillipsec2249f2016-11-09 08:54:35 -050063}
64
Robert Phillipseee4d6e2017-06-05 09:26:07 -040065bool GrRenderTargetProxy::instantiate(GrResourceProvider* resourceProvider) {
Greg Daniel0a375db2018-02-01 12:21:39 -050066 if (LazyState::kNot != this->lazyInstantiationState()) {
67 return false;
68 }
Brian Salomonbb5711a2017-05-17 13:49:59 -040069 static constexpr GrSurfaceFlags kFlags = kRenderTarget_GrSurfaceFlag;
robertphillips76948d42016-05-04 12:47:41 -070070
Robert Phillips65048132017-08-10 08:44:49 -040071 if (!this->instantiateImpl(resourceProvider, fSampleCnt, fNeedsStencil, kFlags,
Greg Danield2d8e922018-02-12 12:07:39 -050072 GrMipMapped::kNo, nullptr)) {
Robert Phillipseee4d6e2017-06-05 09:26:07 -040073 return false;
robertphillips76948d42016-05-04 12:47:41 -070074 }
Robert Phillipseee4d6e2017-06-05 09:26:07 -040075 SkASSERT(fTarget->asRenderTarget());
Greg Daniele252f082017-10-23 16:05:23 -040076 SkASSERT(!fTarget->asTexture());
Leon Scroggins7d7d7d12016-11-07 21:26:31 +000077 // Check that our a priori computation matched the ultimate reality
Robert Phillipseee4d6e2017-06-05 09:26:07 -040078 SkASSERT(fRenderTargetFlags == fTarget->asRenderTarget()->renderTargetPriv().flags());
Leon Scroggins7d7d7d12016-11-07 21:26:31 +000079
Robert Phillipseee4d6e2017-06-05 09:26:07 -040080 return true;
robertphillips76948d42016-05-04 12:47:41 -070081}
82
Robert Phillips5af44de2017-07-18 14:49:38 -040083sk_sp<GrSurface> GrRenderTargetProxy::createSurface(GrResourceProvider* resourceProvider) const {
84 static constexpr GrSurfaceFlags kFlags = kRenderTarget_GrSurfaceFlag;
85
Robert Phillips65048132017-08-10 08:44:49 -040086 sk_sp<GrSurface> surface = this->createSurfaceImpl(resourceProvider, fSampleCnt, fNeedsStencil,
Greg Danield2d8e922018-02-12 12:07:39 -050087 kFlags, GrMipMapped::kNo);
Robert Phillips5af44de2017-07-18 14:49:38 -040088 if (!surface) {
89 return nullptr;
90 }
91 SkASSERT(surface->asRenderTarget());
Greg Daniele252f082017-10-23 16:05:23 -040092 SkASSERT(!surface->asTexture());
Robert Phillips5af44de2017-07-18 14:49:38 -040093 // Check that our a priori computation matched the ultimate reality
94 SkASSERT(fRenderTargetFlags == surface->asRenderTarget()->renderTargetPriv().flags());
95
96 return surface;
97}
98
Brian Salomonbb5711a2017-05-17 13:49:59 -040099size_t GrRenderTargetProxy::onUninstantiatedGpuMemorySize() const {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500100 int colorSamplesPerPixel = this->numColorSamples();
101 if (colorSamplesPerPixel > 1) {
102 // Add one for the resolve buffer.
103 ++colorSamplesPerPixel;
104 }
Greg Daniele252f082017-10-23 16:05:23 -0400105
Robert Phillips8bc06d02016-11-01 17:28:40 -0400106 // TODO: do we have enough information to improve this worst case estimate?
Chris Dalton706a6ff2017-11-29 22:01:06 -0700107 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
108 colorSamplesPerPixel, GrMipMapped::kNo, !this->priv().isExact());
Robert Phillips8bc06d02016-11-01 17:28:40 -0400109}
110
Robert Phillipse2f7d182016-12-15 09:23:05 -0500111bool GrRenderTargetProxy::refsWrappedObjects() const {
112 if (!fTarget) {
113 return false;
114 }
115
116 return fTarget->resourcePriv().refsWrappedObjects();
117}
Robert Phillipse8fabb22018-02-04 14:33:21 -0500118
119#ifdef SK_DEBUG
120void GrRenderTargetProxy::validateLazySurface(const GrSurface* surface) {
121 SkASSERT(!surface->asTexture());
122
123 // Anything that is checked here should be duplicated in GrTextureRenderTargetProxy's version
124 SkASSERT(surface->asRenderTarget());
125 SkASSERT(surface->asRenderTarget()->numStencilSamples() == this->numStencilSamples());
126}
127#endif