1 /*
2  * Copyright 2015 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 "GrGLTextureRenderTarget.h"
9 #include "GrContext.h"
10 #include "GrContextPriv.h"
11 #include "GrGLGpu.h"
12 #include "GrTexturePriv.h"
13 #include "SkTraceMemoryDump.h"
14 
GrGLTextureRenderTarget(GrGLGpu * gpu,SkBudgeted budgeted,const GrSurfaceDesc & desc,const GrGLTexture::IDDesc & texIDDesc,const GrGLRenderTarget::IDDesc & rtIDDesc,GrMipMapsStatus mipMapsStatus)15 GrGLTextureRenderTarget::GrGLTextureRenderTarget(GrGLGpu* gpu,
16                                                  SkBudgeted budgeted,
17                                                  const GrSurfaceDesc& desc,
18                                                  const GrGLTexture::IDDesc& texIDDesc,
19                                                  const GrGLRenderTarget::IDDesc& rtIDDesc,
20                                                  GrMipMapsStatus mipMapsStatus)
21         : GrSurface(gpu, desc)
22         , GrGLTexture(gpu, desc, texIDDesc, mipMapsStatus)
23         , GrGLRenderTarget(gpu, desc, texIDDesc.fInfo.fFormat, rtIDDesc) {
24     this->registerWithCache(budgeted);
25 }
26 
GrGLTextureRenderTarget(GrGLGpu * gpu,const GrSurfaceDesc & desc,const GrGLTexture::IDDesc & texIDDesc,const GrGLRenderTarget::IDDesc & rtIDDesc,GrWrapCacheable cacheable,GrMipMapsStatus mipMapsStatus)27 GrGLTextureRenderTarget::GrGLTextureRenderTarget(GrGLGpu* gpu,
28                                                  const GrSurfaceDesc& desc,
29                                                  const GrGLTexture::IDDesc& texIDDesc,
30                                                  const GrGLRenderTarget::IDDesc& rtIDDesc,
31                                                  GrWrapCacheable cacheable,
32                                                  GrMipMapsStatus mipMapsStatus)
33         : GrSurface(gpu, desc)
34         , GrGLTexture(gpu, desc, texIDDesc, mipMapsStatus)
35         , GrGLRenderTarget(gpu, desc, texIDDesc.fInfo.fFormat, rtIDDesc) {
36     this->registerWithCacheWrapped(cacheable);
37 }
38 
dumpMemoryStatistics(SkTraceMemoryDump * traceMemoryDump) const39 void GrGLTextureRenderTarget::dumpMemoryStatistics(
40     SkTraceMemoryDump* traceMemoryDump) const {
41 #ifndef SK_BUILD_FOR_ANDROID_FRAMEWORK
42     // Delegate to the base classes
43     GrGLRenderTarget::dumpMemoryStatistics(traceMemoryDump);
44     GrGLTexture::dumpMemoryStatistics(traceMemoryDump);
45 #else
46     SkString resourceName = this->getResourceName();
47     resourceName.append("/texture_renderbuffer");
48     this->dumpMemoryStatisticsPriv(traceMemoryDump, resourceName, "RenderTarget",
49                                    this->gpuMemorySize());
50 #endif
51 }
52 
canAttemptStencilAttachment() const53 bool GrGLTextureRenderTarget::canAttemptStencilAttachment() const {
54     // The RT FBO of GrGLTextureRenderTarget is never created from a
55     // wrapped FBO, so we only care about the flag.
56     return !this->getGpu()->getContext()->priv().caps()->avoidStencilBuffers();
57 }
58 
MakeWrapped(GrGLGpu * gpu,const GrSurfaceDesc & desc,const GrGLTexture::IDDesc & texIDDesc,const GrGLRenderTarget::IDDesc & rtIDDesc,GrWrapCacheable cacheable,GrMipMapsStatus mipMapsStatus)59 sk_sp<GrGLTextureRenderTarget> GrGLTextureRenderTarget::MakeWrapped(
60         GrGLGpu* gpu, const GrSurfaceDesc& desc, const GrGLTexture::IDDesc& texIDDesc,
61         const GrGLRenderTarget::IDDesc& rtIDDesc, GrWrapCacheable cacheable,
62         GrMipMapsStatus mipMapsStatus) {
63     return sk_sp<GrGLTextureRenderTarget>(
64             new GrGLTextureRenderTarget(gpu, desc, texIDDesc, rtIDDesc, cacheable, mipMapsStatus));
65 }
66 
onGpuMemorySize() const67 size_t GrGLTextureRenderTarget::onGpuMemorySize() const {
68     return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
69                                     this->numSamplesOwnedPerPixel(),
70                                     this->texturePriv().mipMapped());
71 }
72