xref: /aosp_15_r20/external/skia/src/gpu/ganesh/gl/GrGLBackendSurface.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2023 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLBackendSurface.h"
8*c8dee2aaSAndroid Build Coastguard Worker 
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTextureCompressionType.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLTypes.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBackendSurfacePriv.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLBackendSurfacePriv.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLDefines.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLTypesPriv.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLUtil.h"
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker #include <algorithm>
24*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
25*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
26*c8dee2aaSAndroid Build Coastguard Worker #include <string>
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker class GrGLBackendFormatData final : public GrBackendFormatData {
29*c8dee2aaSAndroid Build Coastguard Worker public:
GrGLBackendFormatData(GrGLenum format)30*c8dee2aaSAndroid Build Coastguard Worker     GrGLBackendFormatData(GrGLenum format) : fGLFormat(format) {}
31*c8dee2aaSAndroid Build Coastguard Worker 
asEnum() const32*c8dee2aaSAndroid Build Coastguard Worker     GrGLenum asEnum() const { return fGLFormat; }
33*c8dee2aaSAndroid Build Coastguard Worker 
34*c8dee2aaSAndroid Build Coastguard Worker private:
compressionType() const35*c8dee2aaSAndroid Build Coastguard Worker     SkTextureCompressionType compressionType() const override {
36*c8dee2aaSAndroid Build Coastguard Worker         switch (GrGLFormatFromGLEnum(fGLFormat)) {
37*c8dee2aaSAndroid Build Coastguard Worker             case GrGLFormat::kCOMPRESSED_ETC1_RGB8:
38*c8dee2aaSAndroid Build Coastguard Worker             case GrGLFormat::kCOMPRESSED_RGB8_ETC2:
39*c8dee2aaSAndroid Build Coastguard Worker                 return SkTextureCompressionType::kETC2_RGB8_UNORM;
40*c8dee2aaSAndroid Build Coastguard Worker             case GrGLFormat::kCOMPRESSED_RGB8_BC1:
41*c8dee2aaSAndroid Build Coastguard Worker                 return SkTextureCompressionType::kBC1_RGB8_UNORM;
42*c8dee2aaSAndroid Build Coastguard Worker             case GrGLFormat::kCOMPRESSED_RGBA8_BC1:
43*c8dee2aaSAndroid Build Coastguard Worker                 return SkTextureCompressionType::kBC1_RGBA8_UNORM;
44*c8dee2aaSAndroid Build Coastguard Worker             default:
45*c8dee2aaSAndroid Build Coastguard Worker                 return SkTextureCompressionType::kNone;
46*c8dee2aaSAndroid Build Coastguard Worker         }
47*c8dee2aaSAndroid Build Coastguard Worker     }
48*c8dee2aaSAndroid Build Coastguard Worker 
bytesPerBlock() const49*c8dee2aaSAndroid Build Coastguard Worker     size_t bytesPerBlock() const override {
50*c8dee2aaSAndroid Build Coastguard Worker         return GrGLFormatBytesPerBlock(GrGLFormatFromGLEnum(fGLFormat));
51*c8dee2aaSAndroid Build Coastguard Worker     }
52*c8dee2aaSAndroid Build Coastguard Worker 
stencilBits() const53*c8dee2aaSAndroid Build Coastguard Worker     int stencilBits() const override {
54*c8dee2aaSAndroid Build Coastguard Worker         return GrGLFormatStencilBits(GrGLFormatFromGLEnum(fGLFormat));
55*c8dee2aaSAndroid Build Coastguard Worker     }
56*c8dee2aaSAndroid Build Coastguard Worker 
channelMask() const57*c8dee2aaSAndroid Build Coastguard Worker     uint32_t channelMask() const override {
58*c8dee2aaSAndroid Build Coastguard Worker         return GrGLFormatChannels(GrGLFormatFromGLEnum(fGLFormat));
59*c8dee2aaSAndroid Build Coastguard Worker     }
60*c8dee2aaSAndroid Build Coastguard Worker 
desc() const61*c8dee2aaSAndroid Build Coastguard Worker     GrColorFormatDesc desc() const override {
62*c8dee2aaSAndroid Build Coastguard Worker         return GrGLFormatDesc(GrGLFormatFromGLEnum(fGLFormat));
63*c8dee2aaSAndroid Build Coastguard Worker     }
64*c8dee2aaSAndroid Build Coastguard Worker 
equal(const GrBackendFormatData * that) const65*c8dee2aaSAndroid Build Coastguard Worker     bool equal(const GrBackendFormatData* that) const override {
66*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(!that || that->type() == GrBackendApi::kOpenGL);
67*c8dee2aaSAndroid Build Coastguard Worker         if (auto otherGL = static_cast<const GrGLBackendFormatData*>(that)) {
68*c8dee2aaSAndroid Build Coastguard Worker             return fGLFormat == otherGL->fGLFormat;
69*c8dee2aaSAndroid Build Coastguard Worker         }
70*c8dee2aaSAndroid Build Coastguard Worker         return false;
71*c8dee2aaSAndroid Build Coastguard Worker     }
72*c8dee2aaSAndroid Build Coastguard Worker 
toString() const73*c8dee2aaSAndroid Build Coastguard Worker     std::string toString() const override {
74*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DEBUG) || defined(GPU_TEST_UTILS)
75*c8dee2aaSAndroid Build Coastguard Worker         return GrGLFormatToStr(fGLFormat);
76*c8dee2aaSAndroid Build Coastguard Worker #else
77*c8dee2aaSAndroid Build Coastguard Worker         return "";
78*c8dee2aaSAndroid Build Coastguard Worker #endif
79*c8dee2aaSAndroid Build Coastguard Worker     }
80*c8dee2aaSAndroid Build Coastguard Worker 
copyTo(AnyFormatData & formatData) const81*c8dee2aaSAndroid Build Coastguard Worker     void copyTo(AnyFormatData& formatData) const override {
82*c8dee2aaSAndroid Build Coastguard Worker         formatData.emplace<GrGLBackendFormatData>(fGLFormat);
83*c8dee2aaSAndroid Build Coastguard Worker     }
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DEBUG)
type() const86*c8dee2aaSAndroid Build Coastguard Worker     GrBackendApi type() const override { return GrBackendApi::kOpenGL; }
87*c8dee2aaSAndroid Build Coastguard Worker #endif
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker     GrGLenum fGLFormat;  // the sized, internal format of the GL resource
90*c8dee2aaSAndroid Build Coastguard Worker };
91*c8dee2aaSAndroid Build Coastguard Worker 
gl_target_to_gr_target(GrGLenum target)92*c8dee2aaSAndroid Build Coastguard Worker static GrTextureType gl_target_to_gr_target(GrGLenum target) {
93*c8dee2aaSAndroid Build Coastguard Worker     switch (target) {
94*c8dee2aaSAndroid Build Coastguard Worker         case GR_GL_TEXTURE_NONE:
95*c8dee2aaSAndroid Build Coastguard Worker             return GrTextureType::kNone;
96*c8dee2aaSAndroid Build Coastguard Worker         case GR_GL_TEXTURE_2D:
97*c8dee2aaSAndroid Build Coastguard Worker             return GrTextureType::k2D;
98*c8dee2aaSAndroid Build Coastguard Worker         case GR_GL_TEXTURE_RECTANGLE:
99*c8dee2aaSAndroid Build Coastguard Worker             return GrTextureType::kRectangle;
100*c8dee2aaSAndroid Build Coastguard Worker         case GR_GL_TEXTURE_EXTERNAL:
101*c8dee2aaSAndroid Build Coastguard Worker             return GrTextureType::kExternal;
102*c8dee2aaSAndroid Build Coastguard Worker         default:
103*c8dee2aaSAndroid Build Coastguard Worker             SkUNREACHABLE;
104*c8dee2aaSAndroid Build Coastguard Worker     }
105*c8dee2aaSAndroid Build Coastguard Worker }
106*c8dee2aaSAndroid Build Coastguard Worker 
get_and_cast_data(const GrBackendFormat & format)107*c8dee2aaSAndroid Build Coastguard Worker static const GrGLBackendFormatData* get_and_cast_data(const GrBackendFormat& format) {
108*c8dee2aaSAndroid Build Coastguard Worker     auto data = GrBackendSurfacePriv::GetBackendData(format);
109*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!data || data->type() == GrBackendApi::kOpenGL);
110*c8dee2aaSAndroid Build Coastguard Worker     return static_cast<const GrGLBackendFormatData*>(data);
111*c8dee2aaSAndroid Build Coastguard Worker }
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker namespace GrBackendFormats {
MakeGL(GrGLenum format,GrGLenum target)114*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat MakeGL(GrGLenum format, GrGLenum target) {
115*c8dee2aaSAndroid Build Coastguard Worker     return GrBackendSurfacePriv::MakeGrBackendFormat(
116*c8dee2aaSAndroid Build Coastguard Worker             gl_target_to_gr_target(target), GrBackendApi::kOpenGL, GrGLBackendFormatData(format));
117*c8dee2aaSAndroid Build Coastguard Worker }
118*c8dee2aaSAndroid Build Coastguard Worker 
AsGLFormat(const GrBackendFormat & format)119*c8dee2aaSAndroid Build Coastguard Worker GrGLFormat AsGLFormat(const GrBackendFormat& format) {
120*c8dee2aaSAndroid Build Coastguard Worker     if (format.isValid() && format.backend() == GrBackendApi::kOpenGL) {
121*c8dee2aaSAndroid Build Coastguard Worker         const GrGLBackendFormatData* data = get_and_cast_data(format);
122*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(data);
123*c8dee2aaSAndroid Build Coastguard Worker         return GrGLFormatFromGLEnum(data->asEnum());
124*c8dee2aaSAndroid Build Coastguard Worker     }
125*c8dee2aaSAndroid Build Coastguard Worker     return GrGLFormat::kUnknown;
126*c8dee2aaSAndroid Build Coastguard Worker }
127*c8dee2aaSAndroid Build Coastguard Worker 
AsGLFormatEnum(const GrBackendFormat & format)128*c8dee2aaSAndroid Build Coastguard Worker GrGLenum AsGLFormatEnum(const GrBackendFormat& format) {
129*c8dee2aaSAndroid Build Coastguard Worker     if (format.isValid() && format.backend() == GrBackendApi::kOpenGL) {
130*c8dee2aaSAndroid Build Coastguard Worker         const GrGLBackendFormatData* data = get_and_cast_data(format);
131*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(data);
132*c8dee2aaSAndroid Build Coastguard Worker         return data->asEnum();
133*c8dee2aaSAndroid Build Coastguard Worker     }
134*c8dee2aaSAndroid Build Coastguard Worker     return 0;
135*c8dee2aaSAndroid Build Coastguard Worker }
136*c8dee2aaSAndroid Build Coastguard Worker }  // namespace GrBackendFormats
137*c8dee2aaSAndroid Build Coastguard Worker 
GrGLBackendTextureData(const GrGLTextureInfo & info,sk_sp<GrGLTextureParameters> params)138*c8dee2aaSAndroid Build Coastguard Worker GrGLBackendTextureData::GrGLBackendTextureData(const GrGLTextureInfo& info,
139*c8dee2aaSAndroid Build Coastguard Worker                                                sk_sp<GrGLTextureParameters> params)
140*c8dee2aaSAndroid Build Coastguard Worker         : fGLInfo(info, params) {}
141*c8dee2aaSAndroid Build Coastguard Worker 
copyTo(AnyTextureData & textureData) const142*c8dee2aaSAndroid Build Coastguard Worker void GrGLBackendTextureData::copyTo(AnyTextureData& textureData) const {
143*c8dee2aaSAndroid Build Coastguard Worker     textureData.emplace<GrGLBackendTextureData>(fGLInfo.info(), fGLInfo.refParameters());
144*c8dee2aaSAndroid Build Coastguard Worker }
145*c8dee2aaSAndroid Build Coastguard Worker 
isProtected() const146*c8dee2aaSAndroid Build Coastguard Worker bool GrGLBackendTextureData::isProtected() const { return fGLInfo.isProtected(); }
147*c8dee2aaSAndroid Build Coastguard Worker 
equal(const GrBackendTextureData * that) const148*c8dee2aaSAndroid Build Coastguard Worker bool GrGLBackendTextureData::equal(const GrBackendTextureData* that) const {
149*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!that || that->type() == GrBackendApi::kOpenGL);
150*c8dee2aaSAndroid Build Coastguard Worker     if (auto otherGL = static_cast<const GrGLBackendTextureData*>(that)) {
151*c8dee2aaSAndroid Build Coastguard Worker         return fGLInfo.info() == otherGL->fGLInfo.info();
152*c8dee2aaSAndroid Build Coastguard Worker     }
153*c8dee2aaSAndroid Build Coastguard Worker     return false;
154*c8dee2aaSAndroid Build Coastguard Worker }
155*c8dee2aaSAndroid Build Coastguard Worker 
isSameTexture(const GrBackendTextureData * that) const156*c8dee2aaSAndroid Build Coastguard Worker bool GrGLBackendTextureData::isSameTexture(const GrBackendTextureData* that) const {
157*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!that || that->type() == GrBackendApi::kOpenGL);
158*c8dee2aaSAndroid Build Coastguard Worker     if (auto otherGL = static_cast<const GrGLBackendTextureData*>(that)) {
159*c8dee2aaSAndroid Build Coastguard Worker         return fGLInfo.info().fID == otherGL->fGLInfo.info().fID;
160*c8dee2aaSAndroid Build Coastguard Worker     }
161*c8dee2aaSAndroid Build Coastguard Worker     return false;
162*c8dee2aaSAndroid Build Coastguard Worker }
163*c8dee2aaSAndroid Build Coastguard Worker 
getBackendFormat() const164*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat GrGLBackendTextureData::getBackendFormat() const {
165*c8dee2aaSAndroid Build Coastguard Worker     return GrBackendFormats::MakeGL(fGLInfo.info().fFormat, fGLInfo.info().fTarget);
166*c8dee2aaSAndroid Build Coastguard Worker }
167*c8dee2aaSAndroid Build Coastguard Worker 
get_and_cast_data(const GrBackendTexture & texture)168*c8dee2aaSAndroid Build Coastguard Worker static const GrGLBackendTextureData* get_and_cast_data(const GrBackendTexture& texture) {
169*c8dee2aaSAndroid Build Coastguard Worker     auto data = GrBackendSurfacePriv::GetBackendData(texture);
170*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!data || data->type() == GrBackendApi::kOpenGL);
171*c8dee2aaSAndroid Build Coastguard Worker     return static_cast<const GrGLBackendTextureData*>(data);
172*c8dee2aaSAndroid Build Coastguard Worker }
173*c8dee2aaSAndroid Build Coastguard Worker 
get_and_cast_data(GrBackendTexture * texture)174*c8dee2aaSAndroid Build Coastguard Worker static GrGLBackendTextureData* get_and_cast_data(GrBackendTexture* texture) {
175*c8dee2aaSAndroid Build Coastguard Worker     auto data = GrBackendSurfacePriv::GetBackendData(texture);
176*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!data || data->type() == GrBackendApi::kOpenGL);
177*c8dee2aaSAndroid Build Coastguard Worker     return static_cast<GrGLBackendTextureData*>(data);
178*c8dee2aaSAndroid Build Coastguard Worker }
179*c8dee2aaSAndroid Build Coastguard Worker 
180*c8dee2aaSAndroid Build Coastguard Worker namespace GrBackendTextures {
MakeGL(int width,int height,skgpu::Mipmapped mipped,const GrGLTextureInfo & glInfo,std::string_view label)181*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture MakeGL(int width,
182*c8dee2aaSAndroid Build Coastguard Worker                         int height,
183*c8dee2aaSAndroid Build Coastguard Worker                         skgpu::Mipmapped mipped,
184*c8dee2aaSAndroid Build Coastguard Worker                         const GrGLTextureInfo& glInfo,
185*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view label) {
186*c8dee2aaSAndroid Build Coastguard Worker     auto tex = GrBackendSurfacePriv::MakeGrBackendTexture(
187*c8dee2aaSAndroid Build Coastguard Worker             width,
188*c8dee2aaSAndroid Build Coastguard Worker             height,
189*c8dee2aaSAndroid Build Coastguard Worker             label,
190*c8dee2aaSAndroid Build Coastguard Worker             mipped,
191*c8dee2aaSAndroid Build Coastguard Worker             GrBackendApi::kOpenGL,
192*c8dee2aaSAndroid Build Coastguard Worker             gl_target_to_gr_target(glInfo.fTarget),
193*c8dee2aaSAndroid Build Coastguard Worker             GrGLBackendTextureData(glInfo, sk_make_sp<GrGLTextureParameters>()));
194*c8dee2aaSAndroid Build Coastguard Worker     // Make no assumptions about client's texture's parameters.
195*c8dee2aaSAndroid Build Coastguard Worker     GLTextureParametersModified(&tex);
196*c8dee2aaSAndroid Build Coastguard Worker     return tex;
197*c8dee2aaSAndroid Build Coastguard Worker }
198*c8dee2aaSAndroid Build Coastguard Worker 
MakeGL(int width,int height,skgpu::Mipmapped mipped,const GrGLTextureInfo & glInfo,sk_sp<GrGLTextureParameters> params,std::string_view label)199*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture MakeGL(int width,
200*c8dee2aaSAndroid Build Coastguard Worker                         int height,
201*c8dee2aaSAndroid Build Coastguard Worker                         skgpu::Mipmapped mipped,
202*c8dee2aaSAndroid Build Coastguard Worker                         const GrGLTextureInfo& glInfo,
203*c8dee2aaSAndroid Build Coastguard Worker                         sk_sp<GrGLTextureParameters> params,
204*c8dee2aaSAndroid Build Coastguard Worker                         std::string_view label) {
205*c8dee2aaSAndroid Build Coastguard Worker     return GrBackendSurfacePriv::MakeGrBackendTexture(width,
206*c8dee2aaSAndroid Build Coastguard Worker                                                       height,
207*c8dee2aaSAndroid Build Coastguard Worker                                                       label,
208*c8dee2aaSAndroid Build Coastguard Worker                                                       mipped,
209*c8dee2aaSAndroid Build Coastguard Worker                                                       GrBackendApi::kOpenGL,
210*c8dee2aaSAndroid Build Coastguard Worker                                                       gl_target_to_gr_target(glInfo.fTarget),
211*c8dee2aaSAndroid Build Coastguard Worker                                                       GrGLBackendTextureData(glInfo, params));
212*c8dee2aaSAndroid Build Coastguard Worker }
213*c8dee2aaSAndroid Build Coastguard Worker 
GetGLTextureInfo(const GrBackendTexture & tex,GrGLTextureInfo * outInfo)214*c8dee2aaSAndroid Build Coastguard Worker bool GetGLTextureInfo(const GrBackendTexture& tex, GrGLTextureInfo* outInfo) {
215*c8dee2aaSAndroid Build Coastguard Worker     if (!tex.isValid() || tex.backend() != GrBackendApi::kOpenGL) {
216*c8dee2aaSAndroid Build Coastguard Worker         return false;
217*c8dee2aaSAndroid Build Coastguard Worker     }
218*c8dee2aaSAndroid Build Coastguard Worker     const GrGLBackendTextureData* data = get_and_cast_data(tex);
219*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(data);
220*c8dee2aaSAndroid Build Coastguard Worker     *outInfo = data->info().info();
221*c8dee2aaSAndroid Build Coastguard Worker     return true;
222*c8dee2aaSAndroid Build Coastguard Worker }
223*c8dee2aaSAndroid Build Coastguard Worker 
GLTextureParametersModified(GrBackendTexture * tex)224*c8dee2aaSAndroid Build Coastguard Worker void GLTextureParametersModified(GrBackendTexture* tex) {
225*c8dee2aaSAndroid Build Coastguard Worker     if (tex && tex->isValid() && tex->backend() == GrBackendApi::kOpenGL) {
226*c8dee2aaSAndroid Build Coastguard Worker         GrGLBackendTextureData* data = get_and_cast_data(tex);
227*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(data);
228*c8dee2aaSAndroid Build Coastguard Worker         data->info().parameters()->invalidate();
229*c8dee2aaSAndroid Build Coastguard Worker     }
230*c8dee2aaSAndroid Build Coastguard Worker }
231*c8dee2aaSAndroid Build Coastguard Worker }  // namespace GrBackendTextures
232*c8dee2aaSAndroid Build Coastguard Worker 
233*c8dee2aaSAndroid Build Coastguard Worker class GrGLBackendRenderTargetData final : public GrBackendRenderTargetData {
234*c8dee2aaSAndroid Build Coastguard Worker public:
GrGLBackendRenderTargetData(GrGLFramebufferInfo info)235*c8dee2aaSAndroid Build Coastguard Worker     GrGLBackendRenderTargetData(GrGLFramebufferInfo info) : fGLInfo(info) {}
236*c8dee2aaSAndroid Build Coastguard Worker 
info() const237*c8dee2aaSAndroid Build Coastguard Worker     GrGLFramebufferInfo info() const { return fGLInfo; }
238*c8dee2aaSAndroid Build Coastguard Worker 
239*c8dee2aaSAndroid Build Coastguard Worker private:
getBackendFormat() const240*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat getBackendFormat() const override {
241*c8dee2aaSAndroid Build Coastguard Worker         return GrBackendFormats::MakeGL(fGLInfo.fFormat, GR_GL_TEXTURE_NONE);
242*c8dee2aaSAndroid Build Coastguard Worker     }
243*c8dee2aaSAndroid Build Coastguard Worker 
isProtected() const244*c8dee2aaSAndroid Build Coastguard Worker     bool isProtected() const override { return fGLInfo.isProtected(); }
245*c8dee2aaSAndroid Build Coastguard Worker 
equal(const GrBackendRenderTargetData * that) const246*c8dee2aaSAndroid Build Coastguard Worker     bool equal(const GrBackendRenderTargetData* that) const override {
247*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(!that || that->type() == GrBackendApi::kOpenGL);
248*c8dee2aaSAndroid Build Coastguard Worker         if (auto otherGL = static_cast<const GrGLBackendRenderTargetData*>(that)) {
249*c8dee2aaSAndroid Build Coastguard Worker             return fGLInfo == otherGL->fGLInfo;
250*c8dee2aaSAndroid Build Coastguard Worker         }
251*c8dee2aaSAndroid Build Coastguard Worker         return false;
252*c8dee2aaSAndroid Build Coastguard Worker     }
253*c8dee2aaSAndroid Build Coastguard Worker 
copyTo(AnyRenderTargetData & rtData) const254*c8dee2aaSAndroid Build Coastguard Worker     void copyTo(AnyRenderTargetData& rtData) const override {
255*c8dee2aaSAndroid Build Coastguard Worker         rtData.emplace<GrGLBackendRenderTargetData>(fGLInfo);
256*c8dee2aaSAndroid Build Coastguard Worker     }
257*c8dee2aaSAndroid Build Coastguard Worker 
258*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DEBUG)
type() const259*c8dee2aaSAndroid Build Coastguard Worker     GrBackendApi type() const override { return GrBackendApi::kOpenGL; }
260*c8dee2aaSAndroid Build Coastguard Worker #endif
261*c8dee2aaSAndroid Build Coastguard Worker 
262*c8dee2aaSAndroid Build Coastguard Worker     GrGLFramebufferInfo fGLInfo;
263*c8dee2aaSAndroid Build Coastguard Worker };
264*c8dee2aaSAndroid Build Coastguard Worker 
get_and_cast_data(const GrBackendRenderTarget & rt)265*c8dee2aaSAndroid Build Coastguard Worker static const GrGLBackendRenderTargetData* get_and_cast_data(const GrBackendRenderTarget& rt) {
266*c8dee2aaSAndroid Build Coastguard Worker     auto data = GrBackendSurfacePriv::GetBackendData(rt);
267*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!data || data->type() == GrBackendApi::kOpenGL);
268*c8dee2aaSAndroid Build Coastguard Worker     return static_cast<const GrGLBackendRenderTargetData*>(data);
269*c8dee2aaSAndroid Build Coastguard Worker }
270*c8dee2aaSAndroid Build Coastguard Worker 
271*c8dee2aaSAndroid Build Coastguard Worker namespace GrBackendRenderTargets {
272*c8dee2aaSAndroid Build Coastguard Worker // The GrGLTextureInfo must have a valid fFormat. If wrapping in an SkSurface we require the
273*c8dee2aaSAndroid Build Coastguard Worker // stencil bits to be either 0, 8 or 16.
MakeGL(int width,int height,int sampleCnt,int stencilBits,const GrGLFramebufferInfo & glInfo)274*c8dee2aaSAndroid Build Coastguard Worker GrBackendRenderTarget MakeGL(
275*c8dee2aaSAndroid Build Coastguard Worker         int width, int height, int sampleCnt, int stencilBits, const GrGLFramebufferInfo& glInfo) {
276*c8dee2aaSAndroid Build Coastguard Worker     return GrBackendSurfacePriv::MakeGrBackendRenderTarget(width,
277*c8dee2aaSAndroid Build Coastguard Worker                                                            height,
278*c8dee2aaSAndroid Build Coastguard Worker                                                            std::max(1, sampleCnt),
279*c8dee2aaSAndroid Build Coastguard Worker                                                            stencilBits,
280*c8dee2aaSAndroid Build Coastguard Worker                                                            GrBackendApi::kOpenGL,
281*c8dee2aaSAndroid Build Coastguard Worker                                                            /*framebufferOnly=*/false,
282*c8dee2aaSAndroid Build Coastguard Worker                                                            GrGLBackendRenderTargetData(glInfo));
283*c8dee2aaSAndroid Build Coastguard Worker }
284*c8dee2aaSAndroid Build Coastguard Worker 
GetGLFramebufferInfo(const GrBackendRenderTarget & rt,GrGLFramebufferInfo * outInfo)285*c8dee2aaSAndroid Build Coastguard Worker bool GetGLFramebufferInfo(const GrBackendRenderTarget& rt, GrGLFramebufferInfo* outInfo) {
286*c8dee2aaSAndroid Build Coastguard Worker     if (!rt.isValid() || rt.backend() != GrBackendApi::kOpenGL) {
287*c8dee2aaSAndroid Build Coastguard Worker         return false;
288*c8dee2aaSAndroid Build Coastguard Worker     }
289*c8dee2aaSAndroid Build Coastguard Worker     const GrGLBackendRenderTargetData* data = get_and_cast_data(rt);
290*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(data);
291*c8dee2aaSAndroid Build Coastguard Worker     *outInfo = data->info();
292*c8dee2aaSAndroid Build Coastguard Worker     return true;
293*c8dee2aaSAndroid Build Coastguard Worker }
294*c8dee2aaSAndroid Build Coastguard Worker 
295*c8dee2aaSAndroid Build Coastguard Worker }  // namespace GrBackendRenderTargets
296