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 
9 #ifndef GrGLTexture_DEFINED
10 #define GrGLTexture_DEFINED
11 
12 #include "GrGpu.h"
13 #include "GrTexture.h"
14 #include "GrGLUtil.h"
15 
16 class GrGLGpu;
17 
18 class GrGLTexture : public GrTexture {
19 public:
20     struct TexParams {
21         GrGLenum fMinFilter;
22         GrGLenum fMagFilter;
23         GrGLenum fWrapS;
24         GrGLenum fWrapT;
25         GrGLenum fMaxMipMapLevel;
26         GrGLenum fSwizzleRGBA[4];
27         GrGLenum fSRGBDecode;
invalidateTexParams28         void invalidate() { memset(this, 0xff, sizeof(TexParams)); }
29     };
30 
31     struct IDDesc {
32         GrGLTextureInfo             fInfo;
33         GrBackendObjectOwnership    fOwnership;
34     };
35     GrGLTexture(GrGLGpu*, SkBudgeted, const GrSurfaceDesc&, const IDDesc&);
36     GrGLTexture(GrGLGpu*, SkBudgeted, const GrSurfaceDesc&, const IDDesc&,
37                 bool wasMipMapDataProvided);
38 
39     GrBackendObject getTextureHandle() const override;
40 
textureParamsModified()41     void textureParamsModified() override { fTexParams.invalidate(); }
42 
43     // These functions are used to track the texture parameters associated with the texture.
getCachedTexParams(GrGpu::ResetTimestamp * timestamp)44     const TexParams& getCachedTexParams(GrGpu::ResetTimestamp* timestamp) const {
45         *timestamp = fTexParamsTimestamp;
46         return fTexParams;
47     }
48 
setCachedTexParams(const TexParams & texParams,GrGpu::ResetTimestamp timestamp)49     void setCachedTexParams(const TexParams& texParams,
50                             GrGpu::ResetTimestamp timestamp) {
51         fTexParams = texParams;
52         fTexParamsTimestamp = timestamp;
53     }
54 
textureID()55     GrGLuint textureID() const { return fInfo.fID; }
56 
target()57     GrGLenum target() const { return fInfo.fTarget; }
58 
59     static sk_sp<GrGLTexture> MakeWrapped(GrGLGpu*, const GrSurfaceDesc&, const IDDesc&);
60 protected:
61     // Constructor for subclasses.
62     GrGLTexture(GrGLGpu*, const GrSurfaceDesc&, const IDDesc&, bool wasMipMapDataProvided);
63 
64     enum Wrapped { kWrapped };
65     // Constructor for instances wrapping backend objects.
66     GrGLTexture(GrGLGpu*, Wrapped, const GrSurfaceDesc&, const IDDesc&);
67 
68     void init(const GrSurfaceDesc&, const IDDesc&);
69 
70     void onAbandon() override;
71     void onRelease() override;
72     void setMemoryBacking(SkTraceMemoryDump* traceMemoryDump,
73                           const SkString& dumpName) const override;
74     std::unique_ptr<GrExternalTextureData> detachBackendTexture() override;
75 
76 private:
77     TexParams                       fTexParams;
78     GrGpu::ResetTimestamp           fTexParamsTimestamp;
79     // Holds the texture target and ID. A pointer to this may be shared to external clients for
80     // direct interaction with the GL object.
81     GrGLTextureInfo                 fInfo;
82     GrBackendObjectOwnership        fTextureIDOwnership;
83 
84     typedef GrTexture INHERITED;
85 };
86 
87 #endif
88