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