1 /*
2  * Copyright 2011 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 "GrGLTexture.h"
9 #include "GrGLGpu.h"
10 #include "SkTraceMemoryDump.h"
11 
12 #define GPUGL static_cast<GrGLGpu*>(this->getGpu())
13 #define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X)
14 
15 // Because this class is virtually derived from GrSurface we must explicitly call its constructor.
GrGLTexture(GrGLGpu * gpu,const GrSurfaceDesc & desc,const IDDesc & idDesc)16 GrGLTexture::GrGLTexture(GrGLGpu* gpu, const GrSurfaceDesc& desc, const IDDesc& idDesc)
17     : GrSurface(gpu, idDesc.fLifeCycle, desc)
18     , INHERITED(gpu, idDesc.fLifeCycle, desc) {
19     this->init(desc, idDesc);
20     this->registerWithCache();
21 }
22 
GrGLTexture(GrGLGpu * gpu,const GrSurfaceDesc & desc,const IDDesc & idDesc,Derived)23 GrGLTexture::GrGLTexture(GrGLGpu* gpu, const GrSurfaceDesc& desc, const IDDesc& idDesc, Derived)
24     : GrSurface(gpu, idDesc.fLifeCycle, desc)
25     , INHERITED(gpu, idDesc.fLifeCycle, desc) {
26     this->init(desc, idDesc);
27 }
28 
init(const GrSurfaceDesc & desc,const IDDesc & idDesc)29 void GrGLTexture::init(const GrSurfaceDesc& desc, const IDDesc& idDesc) {
30     SkASSERT(0 != idDesc.fInfo.fID);
31     fTexParams.invalidate();
32     fTexParamsTimestamp = GrGpu::kExpiredTimestamp;
33     fInfo = idDesc.fInfo;
34     fTextureIDLifecycle = idDesc.fLifeCycle;
35 }
36 
onRelease()37 void GrGLTexture::onRelease() {
38     if (fInfo.fID) {
39         if (GrGpuResource::kBorrowed_LifeCycle != fTextureIDLifecycle) {
40             if (this->desc().fTextureStorageAllocator.fDeallocateTextureStorage) {
41                 this->desc().fTextureStorageAllocator.fDeallocateTextureStorage(
42                         this->desc().fTextureStorageAllocator.fCtx,
43                         reinterpret_cast<GrBackendObject>(&fInfo));
44             } else {
45                 GL_CALL(DeleteTextures(1, &fInfo.fID));
46             }
47         }
48         fInfo.fID = 0;
49     }
50     INHERITED::onRelease();
51 }
52 
onAbandon()53 void GrGLTexture::onAbandon() {
54     fInfo.fTarget = 0;
55     fInfo.fID = 0;
56     INHERITED::onAbandon();
57 }
58 
getTextureHandle() const59 GrBackendObject GrGLTexture::getTextureHandle() const {
60 #ifdef SK_IGNORE_GL_TEXTURE_TARGET
61     return static_cast<GrBackendObject>(this->textureID());
62 #else
63     return reinterpret_cast<GrBackendObject>(&fInfo);
64 #endif
65 }
66 
setMemoryBacking(SkTraceMemoryDump * traceMemoryDump,const SkString & dumpName) const67 void GrGLTexture::setMemoryBacking(SkTraceMemoryDump* traceMemoryDump,
68                                    const SkString& dumpName) const {
69     SkString texture_id;
70     texture_id.appendU32(this->textureID());
71     traceMemoryDump->setMemoryBacking(dumpName.c_str(), "gl_texture",
72                                       texture_id.c_str());
73 }
74