blob: 1bb0e239fdfc0959d84e940d83ff1cbfcd5ab097 [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 Phillips467022b2017-07-21 08:44:46 -040027GrTextureRenderTargetProxy::GrTextureRenderTargetProxy(sk_sp<GrSurface> surf,
28 GrSurfaceOrigin origin)
29 : GrSurfaceProxy(surf, origin, SkBackingFit::kExact)
30 , GrTextureProxy(surf, origin)
31 , GrRenderTargetProxy(surf, origin) {
Robert Phillips37430132016-11-09 06:50:43 -050032 SkASSERT(surf->asTexture());
33 SkASSERT(surf->asRenderTarget());
Robert Phillips84a81202016-11-04 11:59:10 -040034}
35
Brian Salomonbb5711a2017-05-17 13:49:59 -040036size_t GrTextureRenderTargetProxy::onUninstantiatedGpuMemorySize() const {
37 int colorSamplesPerPixel = this->numColorSamples() + 1;
38
39 static const bool kHasMipMaps = true;
40 // TODO: add tracking of mipmap state to improve the estimate. We track whether we are created
41 // with mip maps but not whether a texture read from the proxy will lazily generate mip maps.
Robert Phillips84a81202016-11-04 11:59:10 -040042
43 // TODO: do we have enough information to improve this worst case estimate?
Brian Salomonbb5711a2017-05-17 13:49:59 -040044 return GrSurface::ComputeSize(fConfig, fWidth, fHeight, colorSamplesPerPixel, kHasMipMaps,
45 SkBackingFit::kApprox == fFit);
Robert Phillips84a81202016-11-04 11:59:10 -040046}
47
Robert Phillipseee4d6e2017-06-05 09:26:07 -040048bool GrTextureRenderTargetProxy::instantiate(GrResourceProvider* resourceProvider) {
Brian Salomonbb5711a2017-05-17 13:49:59 -040049 static constexpr GrSurfaceFlags kFlags = kRenderTarget_GrSurfaceFlag;
50
Robert Phillipseee4d6e2017-06-05 09:26:07 -040051 if (!this->instantiateImpl(resourceProvider, this->numStencilSamples(), kFlags,
52 this->isMipMapped(), this->mipColorMode())) {
53 return false;
Brian Salomonbb5711a2017-05-17 13:49:59 -040054 }
Robert Phillipseee4d6e2017-06-05 09:26:07 -040055 SkASSERT(fTarget->asRenderTarget());
56 SkASSERT(fTarget->asTexture());
Brian Salomonbb5711a2017-05-17 13:49:59 -040057
Robert Phillipseee4d6e2017-06-05 09:26:07 -040058 return true;
Brian Salomonbb5711a2017-05-17 13:49:59 -040059}
Robert Phillips5af44de2017-07-18 14:49:38 -040060
61sk_sp<GrSurface> GrTextureRenderTargetProxy::createSurface(
62 GrResourceProvider* resourceProvider) const {
63 static constexpr GrSurfaceFlags kFlags = kRenderTarget_GrSurfaceFlag;
64
65 sk_sp<GrSurface> surface = this->createSurfaceImpl(resourceProvider, this->numStencilSamples(),
66 kFlags, this->isMipMapped(),
67 this->mipColorMode());
68 if (!surface) {
69 return nullptr;
70 }
71 SkASSERT(surface->asRenderTarget());
72 SkASSERT(surface->asTexture());
73
74 return surface;
75}
76