blob: a9a56e18c4cc184e9ca3a085fed59b7057de5ece [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
8#include "GrTextureRenderTargetProxy.h"
9
10// Deferred version
Robert Phillipsc787e492017-02-28 11:26:32 -050011// This class is virtually derived from GrSurfaceProxy (via both GrTextureProxy and
Robert Phillips84a81202016-11-04 11:59:10 -040012// GrRenderTargetProxy) so its constructor must be explicitly called.
13GrTextureRenderTargetProxy::GrTextureRenderTargetProxy(const GrCaps& caps,
14 const GrSurfaceDesc& desc,
15 SkBackingFit fit,
Robert Phillipsc787e492017-02-28 11:26:32 -050016 SkBudgeted budgeted,
17 uint32_t flags)
18 : GrSurfaceProxy(desc, fit, budgeted, flags)
19 // for now textures w/ data are always wrapped
Robert Phillipsc4f0a822017-06-13 08:11:36 -040020 , GrTextureProxy(desc, fit, budgeted, nullptr, 0, flags)
Robert Phillipsc787e492017-02-28 11:26:32 -050021 , GrRenderTargetProxy(caps, desc, fit, budgeted, flags) {
Robert Phillips84a81202016-11-04 11:59:10 -040022}
23
24// Wrapped version
Robert Phillipsc787e492017-02-28 11:26:32 -050025// This class is virtually derived from GrSurfaceProxy (via both GrTextureProxy and
Robert Phillips84a81202016-11-04 11:59:10 -040026// GrRenderTargetProxy) so its constructor must be explicitly called.
Robert Phillips96be9df2017-07-21 14:17:45 +000027GrTextureRenderTargetProxy::GrTextureRenderTargetProxy(sk_sp<GrSurface> surf)
28 : GrSurfaceProxy(surf, SkBackingFit::kExact)
29 , GrTextureProxy(surf)
30 , GrRenderTargetProxy(surf) {
Robert Phillips37430132016-11-09 06:50:43 -050031 SkASSERT(surf->asTexture());
32 SkASSERT(surf->asRenderTarget());
Robert Phillips84a81202016-11-04 11:59:10 -040033}
34
Brian Salomonbb5711a2017-05-17 13:49:59 -040035size_t GrTextureRenderTargetProxy::onUninstantiatedGpuMemorySize() const {
36 int colorSamplesPerPixel = this->numColorSamples() + 1;
37
38 static const bool kHasMipMaps = true;
39 // TODO: add tracking of mipmap state to improve the estimate. We track whether we are created
40 // with mip maps but not whether a texture read from the proxy will lazily generate mip maps.
Robert Phillips84a81202016-11-04 11:59:10 -040041
42 // TODO: do we have enough information to improve this worst case estimate?
Brian Salomonbb5711a2017-05-17 13:49:59 -040043 return GrSurface::ComputeSize(fConfig, fWidth, fHeight, colorSamplesPerPixel, kHasMipMaps,
44 SkBackingFit::kApprox == fFit);
Robert Phillips84a81202016-11-04 11:59:10 -040045}
46
Robert Phillipseee4d6e2017-06-05 09:26:07 -040047bool GrTextureRenderTargetProxy::instantiate(GrResourceProvider* resourceProvider) {
Brian Salomonbb5711a2017-05-17 13:49:59 -040048 static constexpr GrSurfaceFlags kFlags = kRenderTarget_GrSurfaceFlag;
49
Robert Phillipseee4d6e2017-06-05 09:26:07 -040050 if (!this->instantiateImpl(resourceProvider, this->numStencilSamples(), kFlags,
51 this->isMipMapped(), this->mipColorMode())) {
52 return false;
Brian Salomonbb5711a2017-05-17 13:49:59 -040053 }
Robert Phillipseee4d6e2017-06-05 09:26:07 -040054 SkASSERT(fTarget->asRenderTarget());
55 SkASSERT(fTarget->asTexture());
Brian Salomonbb5711a2017-05-17 13:49:59 -040056
Robert Phillipseee4d6e2017-06-05 09:26:07 -040057 return true;
Brian Salomonbb5711a2017-05-17 13:49:59 -040058}
Robert Phillips5af44de2017-07-18 14:49:38 -040059
60sk_sp<GrSurface> GrTextureRenderTargetProxy::createSurface(
61 GrResourceProvider* resourceProvider) const {
62 static constexpr GrSurfaceFlags kFlags = kRenderTarget_GrSurfaceFlag;
63
64 sk_sp<GrSurface> surface = this->createSurfaceImpl(resourceProvider, this->numStencilSamples(),
65 kFlags, this->isMipMapped(),
66 this->mipColorMode());
67 if (!surface) {
68 return nullptr;
69 }
70 SkASSERT(surface->asRenderTarget());
71 SkASSERT(surface->asTexture());
72
73 return surface;
74}
75