blob: 9899cae386902606c7e7b4c389c16f9b18019449 [file] [log] [blame]
Robert Phillips84a81202016-11-04 11:59:10 -04001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "src/gpu/GrTextureRenderTargetProxy.h"
Robert Phillips84a81202016-11-04 11:59:10 -04009
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "src/gpu/GrCaps.h"
Brian Salomon201cdbb2019-08-14 17:00:30 -040011#include "src/gpu/GrRenderTarget.h"
Chris Dalton3f7932e2019-08-19 00:39:13 -060012#include "src/gpu/GrRenderTargetProxyPriv.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "src/gpu/GrSurfacePriv.h"
14#include "src/gpu/GrSurfaceProxyPriv.h"
Greg Daniel456f9b52020-03-05 19:14:18 +000015#include "src/gpu/GrTexture.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#include "src/gpu/GrTextureProxyPriv.h"
Chris Dalton706a6ff2017-11-29 22:01:06 -070017
Robert Phillips4e105e22020-07-16 09:18:50 -040018#ifdef SK_DEBUG
19#include "include/gpu/GrDirectContext.h"
20#include "src/gpu/GrContextPriv.h"
21#endif
22
Robert Phillips84a81202016-11-04 11:59:10 -040023// Deferred version
Robert Phillipsc787e492017-02-28 11:26:32 -050024// This class is virtually derived from GrSurfaceProxy (via both GrTextureProxy and
Robert Phillips84a81202016-11-04 11:59:10 -040025// GrRenderTargetProxy) so its constructor must be explicitly called.
26GrTextureRenderTargetProxy::GrTextureRenderTargetProxy(const GrCaps& caps,
Greg Daniel4065d452018-11-16 15:43:41 -050027 const GrBackendFormat& format,
Brian Salomona56a7462020-02-07 14:17:25 -050028 SkISize dimensions,
Brian Salomon27b4d8d2019-07-22 14:23:45 -040029 int sampleCnt,
Brian Salomon7e67dca2020-07-21 09:27:25 -040030 GrMipmapped mipMapped,
Brian Salomona6db5102020-07-21 09:56:23 -040031 GrMipmapStatus mipmapStatus,
Robert Phillips84a81202016-11-04 11:59:10 -040032 SkBackingFit fit,
Robert Phillipsc787e492017-02-28 11:26:32 -050033 SkBudgeted budgeted,
Brian Salomone8a766b2019-07-19 14:24:36 -040034 GrProtected isProtected,
Brian Salomonbeb7f522019-08-30 16:19:42 -040035 GrInternalSurfaceFlags surfaceFlags,
Robert Phillipsf10b2a52020-05-15 10:20:04 -040036 UseAllocator useAllocator,
37 GrDDLProvider creatingProvider)
Brian Salomondf1bd6d2020-03-26 20:37:01 -040038 : GrSurfaceProxy(format, dimensions, fit, budgeted, isProtected, surfaceFlags, useAllocator)
Chris Dalton706a6ff2017-11-29 22:01:06 -070039 // for now textures w/ data are always wrapped
Brian Salomondf1bd6d2020-03-26 20:37:01 -040040 , GrRenderTargetProxy(caps, format, dimensions, sampleCnt, fit, budgeted, isProtected,
41 surfaceFlags, useAllocator)
Brian Salomona6db5102020-07-21 09:56:23 -040042 , GrTextureProxy(format, dimensions, mipMapped, mipmapStatus, fit, budgeted, isProtected,
Robert Phillipsf10b2a52020-05-15 10:20:04 -040043 surfaceFlags, useAllocator, creatingProvider) {
Chris Dalton3f7932e2019-08-19 00:39:13 -060044 this->initSurfaceFlags(caps);
45}
Chris Dalton706a6ff2017-11-29 22:01:06 -070046
47// Lazy-callback version
Chris Dalton3f7932e2019-08-19 00:39:13 -060048GrTextureRenderTargetProxy::GrTextureRenderTargetProxy(const GrCaps& caps,
49 LazyInstantiateCallback&& callback,
Greg Daniel4065d452018-11-16 15:43:41 -050050 const GrBackendFormat& format,
Brian Salomona56a7462020-02-07 14:17:25 -050051 SkISize dimensions,
Brian Salomon27b4d8d2019-07-22 14:23:45 -040052 int sampleCnt,
Brian Salomon7e67dca2020-07-21 09:27:25 -040053 GrMipmapped mipMapped,
Brian Salomona6db5102020-07-21 09:56:23 -040054 GrMipmapStatus mipmapStatus,
Greg Daniel65fa8ca2018-01-10 17:06:31 -050055 SkBackingFit fit,
56 SkBudgeted budgeted,
Brian Salomone8a766b2019-07-19 14:24:36 -040057 GrProtected isProtected,
Brian Salomonbeb7f522019-08-30 16:19:42 -040058 GrInternalSurfaceFlags surfaceFlags,
Robert Phillipsf10b2a52020-05-15 10:20:04 -040059 UseAllocator useAllocator,
60 GrDDLProvider creatingProvider)
Brian Salomondf1bd6d2020-03-26 20:37:01 -040061 : GrSurfaceProxy(std::move(callback), format, dimensions, fit, budgeted, isProtected,
62 surfaceFlags, useAllocator)
Chris Dalton706a6ff2017-11-29 22:01:06 -070063 // Since we have virtual inheritance, we initialize GrSurfaceProxy directly. Send null
64 // callbacks to the texture and RT proxies simply to route to the appropriate constructors.
Brian Salomondf1bd6d2020-03-26 20:37:01 -040065 , GrRenderTargetProxy(LazyInstantiateCallback(), format, dimensions, sampleCnt, fit,
66 budgeted, isProtected, surfaceFlags, useAllocator,
Greg Danielbaf8d992019-10-29 14:14:32 -040067 WrapsVkSecondaryCB::kNo)
Brian Salomona6db5102020-07-21 09:56:23 -040068 , GrTextureProxy(LazyInstantiateCallback(), format, dimensions, mipMapped, mipmapStatus,
Robert Phillipsf10b2a52020-05-15 10:20:04 -040069 fit, budgeted, isProtected, surfaceFlags, useAllocator,
70 creatingProvider) {
Chris Dalton3f7932e2019-08-19 00:39:13 -060071 this->initSurfaceFlags(caps);
72}
Robert Phillips84a81202016-11-04 11:59:10 -040073
74// Wrapped version
Robert Phillipsc787e492017-02-28 11:26:32 -050075// This class is virtually derived from GrSurfaceProxy (via both GrTextureProxy and
Robert Phillips84a81202016-11-04 11:59:10 -040076// GrRenderTargetProxy) so its constructor must be explicitly called.
Robert Phillips066f0202017-07-25 10:16:35 -040077GrTextureRenderTargetProxy::GrTextureRenderTargetProxy(sk_sp<GrSurface> surf,
Robert Phillipsf10b2a52020-05-15 10:20:04 -040078 UseAllocator useAllocator,
79 GrDDLProvider creatingProvider)
Brian Salomondf1bd6d2020-03-26 20:37:01 -040080 : GrSurfaceProxy(surf, SkBackingFit::kExact, useAllocator)
81 , GrRenderTargetProxy(surf, useAllocator)
Robert Phillipsf10b2a52020-05-15 10:20:04 -040082 , GrTextureProxy(surf, useAllocator, creatingProvider) {
Robert Phillips37430132016-11-09 06:50:43 -050083 SkASSERT(surf->asTexture());
84 SkASSERT(surf->asRenderTarget());
Chris Dalton3f7932e2019-08-19 00:39:13 -060085 SkASSERT(fSurfaceFlags == fTarget->surfacePriv().flags());
86 SkASSERT((this->numSamples() <= 1 ||
87 fTarget->getContext()->priv().caps()->msaaResolvesAutomatically()) !=
88 this->requiresManualMSAAResolve());
89}
90
91void GrTextureRenderTargetProxy::initSurfaceFlags(const GrCaps& caps) {
Jim Van Verth5fab9092019-11-25 21:23:53 +000092 // FBO 0 should never be wrapped as a texture render target.
93 SkASSERT(!this->rtPriv().glRTFBOIDIs0());
Chris Dalton3f7932e2019-08-19 00:39:13 -060094 if (this->numSamples() > 1 && !caps.msaaResolvesAutomatically()) {
95 // MSAA texture-render-targets always require manual resolve if we are not using a
96 // multisampled-render-to-texture extension.
97 //
98 // NOTE: This is the only instance where we need to set the manual resolve flag on a proxy.
99 // Any other proxies that require manual resolve (e.g., wrapBackendTextureAsRenderTarget())
100 // will be wrapped, and the wrapped version of the GrSurface constructor will automatically
101 // get the manual resolve flag when copying the target GrSurface's flags.
102 fSurfaceFlags |= GrInternalSurfaceFlags::kRequiresManualMSAAResolve;
103 }
Robert Phillips84a81202016-11-04 11:59:10 -0400104}
105
Greg Daniel7fd7a8a2019-10-10 16:10:31 -0400106size_t GrTextureRenderTargetProxy::onUninstantiatedGpuMemorySize(const GrCaps& caps) const {
Chris Dalton6ce447a2019-06-23 18:07:38 -0600107 int colorSamplesPerPixel = this->numSamples();
Brian Salomonbdecacf2018-02-02 20:32:49 -0500108 if (colorSamplesPerPixel > 1) {
109 // Add one to account for the resolve buffer.
Greg Danielf6f7b672018-02-15 13:06:26 -0500110 ++colorSamplesPerPixel;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500111 }
Brian Salomonbb5711a2017-05-17 13:49:59 -0400112
Robert Phillips84a81202016-11-04 11:59:10 -0400113 // TODO: do we have enough information to improve this worst case estimate?
Brian Salomon9f2b86c2019-10-22 10:37:46 -0400114 return GrSurface::ComputeSize(caps, this->backendFormat(), this->dimensions(),
Brian Salomon8c82a872020-07-21 12:09:58 -0400115 colorSamplesPerPixel, this->proxyMipmapped(),
Greg Daniel3b2ebbb2018-02-09 10:49:23 -0500116 !this->priv().isExact());
Robert Phillips84a81202016-11-04 11:59:10 -0400117}
118
Robert Phillips10d17212019-04-24 14:09:10 -0400119bool GrTextureRenderTargetProxy::instantiate(GrResourceProvider* resourceProvider) {
Brian Salomonbeb7f522019-08-30 16:19:42 -0400120 if (this->isLazy()) {
Greg Daniel0a375db2018-02-01 12:21:39 -0500121 return false;
122 }
Brian Salomonbb5711a2017-05-17 13:49:59 -0400123
Robert Phillipsae7d3f32017-09-21 08:26:08 -0400124 const GrUniqueKey& key = this->getUniqueKey();
125
Chris Dalton0b68dda2019-11-07 21:08:03 -0700126 if (!this->instantiateImpl(resourceProvider, this->numSamples(), GrRenderable::kYes,
Brian Salomon8c82a872020-07-21 12:09:58 -0400127 this->mipmapped(), key.isValid() ? &key : nullptr)) {
Robert Phillipseee4d6e2017-06-05 09:26:07 -0400128 return false;
Brian Salomonbb5711a2017-05-17 13:49:59 -0400129 }
Robert Phillipsae7d3f32017-09-21 08:26:08 -0400130 if (key.isValid()) {
131 SkASSERT(key == this->getUniqueKey());
132 }
133
Robert Phillipsb5204762019-06-19 14:12:13 -0400134 SkASSERT(this->peekRenderTarget());
135 SkASSERT(this->peekTexture());
Brian Salomonbb5711a2017-05-17 13:49:59 -0400136
Robert Phillipseee4d6e2017-06-05 09:26:07 -0400137 return true;
Brian Salomonbb5711a2017-05-17 13:49:59 -0400138}
Robert Phillips5af44de2017-07-18 14:49:38 -0400139
140sk_sp<GrSurface> GrTextureRenderTargetProxy::createSurface(
141 GrResourceProvider* resourceProvider) const {
Chris Dalton0b68dda2019-11-07 21:08:03 -0700142 sk_sp<GrSurface> surface = this->createSurfaceImpl(resourceProvider, this->numSamples(),
Brian Salomon8c82a872020-07-21 12:09:58 -0400143 GrRenderable::kYes, this->mipmapped());
Robert Phillips5af44de2017-07-18 14:49:38 -0400144 if (!surface) {
145 return nullptr;
146 }
147 SkASSERT(surface->asRenderTarget());
148 SkASSERT(surface->asTexture());
149
150 return surface;
151}
152
Brian Salomon63410e92020-03-23 18:32:50 -0400153GrSurfaceProxy::LazySurfaceDesc GrTextureRenderTargetProxy::callbackDesc() const {
154 SkISize dims;
155 SkBackingFit fit;
156 if (this->isFullyLazy()) {
157 fit = SkBackingFit::kApprox;
158 dims = {-1, -1};
159 } else {
160 fit = this->isFunctionallyExact() ? SkBackingFit::kExact : SkBackingFit::kApprox;
161 dims = this->dimensions();
162 }
163 return {
164 dims,
165 fit,
166 GrRenderable::kYes,
Brian Salomon8c82a872020-07-21 12:09:58 -0400167 this->mipmapped(),
Brian Salomon63410e92020-03-23 18:32:50 -0400168 this->numSamples(),
169 this->backendFormat(),
170 this->isProtected(),
171 this->isBudgeted(),
172 };
173}
174
Chris Dalton706a6ff2017-11-29 22:01:06 -0700175#ifdef SK_DEBUG
Greg Daniel849dce12018-04-24 14:32:53 -0400176void GrTextureRenderTargetProxy::onValidateSurface(const GrSurface* surface) {
Robert Phillipse8fabb22018-02-04 14:33:21 -0500177 // Anything checked here should also be checking the GrTextureProxy version
178 SkASSERT(surface->asTexture());
Brian Salomon8c82a872020-07-21 12:09:58 -0400179 SkASSERT(GrMipmapped::kNo == this->proxyMipmapped() ||
Brian Salomon4cfae3b2020-07-23 10:33:24 -0400180 GrMipmapped::kYes == surface->asTexture()->mipmapped());
Robert Phillipse8fabb22018-02-04 14:33:21 -0500181
182 // Anything checked here should also be checking the GrRenderTargetProxy version
183 SkASSERT(surface->asRenderTarget());
Chris Dalton6ce447a2019-06-23 18:07:38 -0600184 SkASSERT(surface->asRenderTarget()->numSamples() == this->numSamples());
Greg Daniel849dce12018-04-24 14:32:53 -0400185
Brian Salomon4cfae3b2020-07-23 10:33:24 -0400186 SkASSERT(surface->asTexture()->textureType() == this->textureType());
Brian Salomonc67c31c2018-12-06 10:00:03 -0500187
Greg Daniel849dce12018-04-24 14:32:53 -0400188 GrInternalSurfaceFlags proxyFlags = fSurfaceFlags;
189 GrInternalSurfaceFlags surfaceFlags = surface->surfacePriv().flags();
Brian Salomonc67c31c2018-12-06 10:00:03 -0500190
191 // Only non-RT textures can be read only.
192 SkASSERT(!(proxyFlags & GrInternalSurfaceFlags::kReadOnly));
193 SkASSERT(!(surfaceFlags & GrInternalSurfaceFlags::kReadOnly));
194
Chris Dalton3f7932e2019-08-19 00:39:13 -0600195 SkASSERT(((int)proxyFlags & kGrInternalTextureRenderTargetFlagsMask) ==
196 ((int)surfaceFlags & kGrInternalTextureRenderTargetFlagsMask));
Chris Dalton706a6ff2017-11-29 22:01:06 -0700197}
198#endif
199