xref: /aosp_15_r20/external/skia/src/gpu/ganesh/gl/GrGLCaps.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2012 Google Inc.
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 
8*c8dee2aaSAndroid Build Coastguard Worker 
9*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrGLCaps_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker #define GrGLCaps_DEFINED
11*c8dee2aaSAndroid Build Coastguard Worker 
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLBackendSurface.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLTypes.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTDArray.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProgramDesc.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLTypesPriv.h"
23*c8dee2aaSAndroid Build Coastguard Worker 
24*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
25*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
26*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker class GrGLContextInfo;
29*c8dee2aaSAndroid Build Coastguard Worker class GrProgramInfo;
30*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTarget;
31*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTargetProxy;
32*c8dee2aaSAndroid Build Coastguard Worker class GrSurface;
33*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy;
34*c8dee2aaSAndroid Build Coastguard Worker class SkJSONWriter;
35*c8dee2aaSAndroid Build Coastguard Worker enum class SkTextureCompressionType;
36*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions;
37*c8dee2aaSAndroid Build Coastguard Worker struct GrGLInterface;
38*c8dee2aaSAndroid Build Coastguard Worker struct GrShaderCaps;
39*c8dee2aaSAndroid Build Coastguard Worker struct SkIRect;
40*c8dee2aaSAndroid Build Coastguard Worker struct SkRect;
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker namespace GrTest { struct TestFormatColorTypeCombination; }
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker /**
45*c8dee2aaSAndroid Build Coastguard Worker  * Stores some capabilities of a GL context. Most are determined by the GL
46*c8dee2aaSAndroid Build Coastguard Worker  * version and the extensions string. It also tracks formats that have passed
47*c8dee2aaSAndroid Build Coastguard Worker  * the FBO completeness test.
48*c8dee2aaSAndroid Build Coastguard Worker  */
49*c8dee2aaSAndroid Build Coastguard Worker class GrGLCaps : public GrCaps {
50*c8dee2aaSAndroid Build Coastguard Worker public:
51*c8dee2aaSAndroid Build Coastguard Worker     /**
52*c8dee2aaSAndroid Build Coastguard Worker      * The type of MSAA for FBOs supported. Different extensions have different
53*c8dee2aaSAndroid Build Coastguard Worker      * semantics of how / when a resolve is performed.
54*c8dee2aaSAndroid Build Coastguard Worker      */
55*c8dee2aaSAndroid Build Coastguard Worker     enum MSFBOType {
56*c8dee2aaSAndroid Build Coastguard Worker         /**
57*c8dee2aaSAndroid Build Coastguard Worker          * no support for MSAA FBOs
58*c8dee2aaSAndroid Build Coastguard Worker          */
59*c8dee2aaSAndroid Build Coastguard Worker         kNone_MSFBOType = 0,
60*c8dee2aaSAndroid Build Coastguard Worker         /**
61*c8dee2aaSAndroid Build Coastguard Worker          * OpenGL 3.0+, OpenGL ES 3.0+, GL_ARB_framebuffer_object,
62*c8dee2aaSAndroid Build Coastguard Worker          * GL_CHROMIUM_framebuffer_multisample, GL_ANGLE_framebuffer_multisample,
63*c8dee2aaSAndroid Build Coastguard Worker          * or GL_EXT_framebuffer_multisample
64*c8dee2aaSAndroid Build Coastguard Worker          */
65*c8dee2aaSAndroid Build Coastguard Worker         kStandard_MSFBOType,
66*c8dee2aaSAndroid Build Coastguard Worker         /**
67*c8dee2aaSAndroid Build Coastguard Worker          * GL_APPLE_framebuffer_multisample ES extension
68*c8dee2aaSAndroid Build Coastguard Worker          */
69*c8dee2aaSAndroid Build Coastguard Worker         kES_Apple_MSFBOType,
70*c8dee2aaSAndroid Build Coastguard Worker         /**
71*c8dee2aaSAndroid Build Coastguard Worker          * GL_IMG_multisampled_render_to_texture. This variation does not have MSAA renderbuffers.
72*c8dee2aaSAndroid Build Coastguard Worker          * Instead the texture is multisampled when bound to the FBO and then resolved automatically
73*c8dee2aaSAndroid Build Coastguard Worker          * when read. It also defines an alternate value for GL_MAX_SAMPLES (which we call
74*c8dee2aaSAndroid Build Coastguard Worker          * GR_GL_MAX_SAMPLES_IMG).
75*c8dee2aaSAndroid Build Coastguard Worker          */
76*c8dee2aaSAndroid Build Coastguard Worker         kES_IMG_MsToTexture_MSFBOType,
77*c8dee2aaSAndroid Build Coastguard Worker         /**
78*c8dee2aaSAndroid Build Coastguard Worker          * GL_EXT_multisampled_render_to_texture. Same as the IMG one above but uses the standard
79*c8dee2aaSAndroid Build Coastguard Worker          * GL_MAX_SAMPLES value.
80*c8dee2aaSAndroid Build Coastguard Worker          */
81*c8dee2aaSAndroid Build Coastguard Worker         kES_EXT_MsToTexture_MSFBOType,
82*c8dee2aaSAndroid Build Coastguard Worker     };
83*c8dee2aaSAndroid Build Coastguard Worker 
84*c8dee2aaSAndroid Build Coastguard Worker     enum BlitFramebufferFlags {
85*c8dee2aaSAndroid Build Coastguard Worker         kNoSupport_BlitFramebufferFlag                    = 1 << 0,
86*c8dee2aaSAndroid Build Coastguard Worker         kNoScalingOrMirroring_BlitFramebufferFlag         = 1 << 1,
87*c8dee2aaSAndroid Build Coastguard Worker         kResolveMustBeFull_BlitFrambufferFlag             = 1 << 2,
88*c8dee2aaSAndroid Build Coastguard Worker         kNoMSAADst_BlitFramebufferFlag                    = 1 << 3,
89*c8dee2aaSAndroid Build Coastguard Worker         kNoFormatConversion_BlitFramebufferFlag           = 1 << 4,
90*c8dee2aaSAndroid Build Coastguard Worker         kNoFormatConversionForMSAASrc_BlitFramebufferFlag = 1 << 5,
91*c8dee2aaSAndroid Build Coastguard Worker         kRectsMustMatchForMSAASrc_BlitFramebufferFlag     = 1 << 6,
92*c8dee2aaSAndroid Build Coastguard Worker     };
93*c8dee2aaSAndroid Build Coastguard Worker 
94*c8dee2aaSAndroid Build Coastguard Worker     enum InvalidateFBType {
95*c8dee2aaSAndroid Build Coastguard Worker         kNone_InvalidateFBType,
96*c8dee2aaSAndroid Build Coastguard Worker         kDiscard_InvalidateFBType,     //<! glDiscardFramebuffer()
97*c8dee2aaSAndroid Build Coastguard Worker         kInvalidate_InvalidateFBType,  //<! glInvalidateFramebuffer()
98*c8dee2aaSAndroid Build Coastguard Worker     };
99*c8dee2aaSAndroid Build Coastguard Worker 
100*c8dee2aaSAndroid Build Coastguard Worker     enum class InvalidateBufferType {
101*c8dee2aaSAndroid Build Coastguard Worker         kNone,
102*c8dee2aaSAndroid Build Coastguard Worker         kNullData,   // Call glBufferData with a null data pointer.
103*c8dee2aaSAndroid Build Coastguard Worker         kInvalidate  // glInvalidateBufferData
104*c8dee2aaSAndroid Build Coastguard Worker     };
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     enum MapBufferType {
107*c8dee2aaSAndroid Build Coastguard Worker         kNone_MapBufferType,
108*c8dee2aaSAndroid Build Coastguard Worker         kMapBuffer_MapBufferType,       // glMapBuffer()
109*c8dee2aaSAndroid Build Coastguard Worker         kMapBufferRange_MapBufferType,  // glMapBufferRange()
110*c8dee2aaSAndroid Build Coastguard Worker         kChromium_MapBufferType,        // GL_CHROMIUM_map_sub
111*c8dee2aaSAndroid Build Coastguard Worker     };
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker     enum class TransferBufferType {
114*c8dee2aaSAndroid Build Coastguard Worker         kNone,
115*c8dee2aaSAndroid Build Coastguard Worker         kNV_PBO,    // NV_pixel_buffer_object
116*c8dee2aaSAndroid Build Coastguard Worker         kARB_PBO,   // ARB_pixel_buffer_object
117*c8dee2aaSAndroid Build Coastguard Worker         kChromium,  // CHROMIUM_pixel_transfer_buffer_object
118*c8dee2aaSAndroid Build Coastguard Worker     };
119*c8dee2aaSAndroid Build Coastguard Worker 
120*c8dee2aaSAndroid Build Coastguard Worker     enum class FenceType {
121*c8dee2aaSAndroid Build Coastguard Worker         kNone,
122*c8dee2aaSAndroid Build Coastguard Worker         kSyncObject,
123*c8dee2aaSAndroid Build Coastguard Worker         kNVFence
124*c8dee2aaSAndroid Build Coastguard Worker     };
125*c8dee2aaSAndroid Build Coastguard Worker 
126*c8dee2aaSAndroid Build Coastguard Worker     enum class MultiDrawType {
127*c8dee2aaSAndroid Build Coastguard Worker         kNone,
128*c8dee2aaSAndroid Build Coastguard Worker         kMultiDrawIndirect,  // ARB_multi_draw_indirect, EXT_multi_draw_indirect, or GL 4.3 core.
129*c8dee2aaSAndroid Build Coastguard Worker         kANGLEOrWebGL  // ANGLE_base_vertex_base_instance or
130*c8dee2aaSAndroid Build Coastguard Worker                        // WEBGL_draw_instanced_base_vertex_base_instance
131*c8dee2aaSAndroid Build Coastguard Worker     };
132*c8dee2aaSAndroid Build Coastguard Worker 
133*c8dee2aaSAndroid Build Coastguard Worker     enum class RegenerateMipmapType {
134*c8dee2aaSAndroid Build Coastguard Worker         kBaseLevel,
135*c8dee2aaSAndroid Build Coastguard Worker         kBasePlusMaxLevel,
136*c8dee2aaSAndroid Build Coastguard Worker         kBasePlusSync
137*c8dee2aaSAndroid Build Coastguard Worker     };
138*c8dee2aaSAndroid Build Coastguard Worker 
139*c8dee2aaSAndroid Build Coastguard Worker     enum class TimerQueryType {
140*c8dee2aaSAndroid Build Coastguard Worker         kNone,
141*c8dee2aaSAndroid Build Coastguard Worker         kRegular,
142*c8dee2aaSAndroid Build Coastguard Worker         kDisjoint,
143*c8dee2aaSAndroid Build Coastguard Worker     };
144*c8dee2aaSAndroid Build Coastguard Worker 
145*c8dee2aaSAndroid Build Coastguard Worker     /**
146*c8dee2aaSAndroid Build Coastguard Worker      * Initializes the GrGLCaps to the set of features supported in the current
147*c8dee2aaSAndroid Build Coastguard Worker      * OpenGL context accessible via ctxInfo.
148*c8dee2aaSAndroid Build Coastguard Worker      */
149*c8dee2aaSAndroid Build Coastguard Worker     GrGLCaps(const GrContextOptions& contextOptions, const GrGLContextInfo& ctxInfo,
150*c8dee2aaSAndroid Build Coastguard Worker              const GrGLInterface* glInterface);
151*c8dee2aaSAndroid Build Coastguard Worker 
152*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatSRGB(const GrBackendFormat&) const override;
153*c8dee2aaSAndroid Build Coastguard Worker 
154*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatTexturable(const GrBackendFormat&, GrTextureType) const override;
155*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatTexturable(GrGLFormat) const;
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatAsColorTypeRenderable(GrColorType ct, const GrBackendFormat& format,
158*c8dee2aaSAndroid Build Coastguard Worker                                        int sampleCount = 1) const override;
159*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatRenderable(const GrBackendFormat& format, int sampleCount) const override;
isFormatRenderable(GrGLFormat format,int sampleCount)160*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatRenderable(GrGLFormat format, int sampleCount) const {
161*c8dee2aaSAndroid Build Coastguard Worker         return sampleCount <= this->maxRenderTargetSampleCount(format);
162*c8dee2aaSAndroid Build Coastguard Worker     }
163*c8dee2aaSAndroid Build Coastguard Worker 
getRenderTargetSampleCount(int requestedCount,const GrBackendFormat & format)164*c8dee2aaSAndroid Build Coastguard Worker     int getRenderTargetSampleCount(int requestedCount,
165*c8dee2aaSAndroid Build Coastguard Worker                                    const GrBackendFormat& format) const override {
166*c8dee2aaSAndroid Build Coastguard Worker         return this->getRenderTargetSampleCount(requestedCount,
167*c8dee2aaSAndroid Build Coastguard Worker                                                 GrBackendFormats::AsGLFormat(format));
168*c8dee2aaSAndroid Build Coastguard Worker     }
169*c8dee2aaSAndroid Build Coastguard Worker     int getRenderTargetSampleCount(int requestedCount, GrGLFormat) const;
170*c8dee2aaSAndroid Build Coastguard Worker 
maxRenderTargetSampleCount(const GrBackendFormat & format)171*c8dee2aaSAndroid Build Coastguard Worker     int maxRenderTargetSampleCount(const GrBackendFormat& format) const override {
172*c8dee2aaSAndroid Build Coastguard Worker         return this->maxRenderTargetSampleCount(GrBackendFormats::AsGLFormat(format));
173*c8dee2aaSAndroid Build Coastguard Worker     }
174*c8dee2aaSAndroid Build Coastguard Worker     int maxRenderTargetSampleCount(GrGLFormat) const;
175*c8dee2aaSAndroid Build Coastguard Worker 
maxTextureMaxAnisotropy()176*c8dee2aaSAndroid Build Coastguard Worker     float maxTextureMaxAnisotropy() const { return fMaxTextureMaxAnisotropy; }
177*c8dee2aaSAndroid Build Coastguard Worker 
178*c8dee2aaSAndroid Build Coastguard Worker     bool isFormatCopyable(const GrBackendFormat&) const override;
179*c8dee2aaSAndroid Build Coastguard Worker 
180*c8dee2aaSAndroid Build Coastguard Worker     bool canFormatBeFBOColorAttachment(GrGLFormat) const;
181*c8dee2aaSAndroid Build Coastguard Worker 
getFormatFromColorType(GrColorType colorType)182*c8dee2aaSAndroid Build Coastguard Worker     GrGLFormat getFormatFromColorType(GrColorType colorType) const {
183*c8dee2aaSAndroid Build Coastguard Worker         int idx = static_cast<int>(colorType);
184*c8dee2aaSAndroid Build Coastguard Worker         return fColorTypeToFormatTable[idx];
185*c8dee2aaSAndroid Build Coastguard Worker     }
186*c8dee2aaSAndroid Build Coastguard Worker 
187*c8dee2aaSAndroid Build Coastguard Worker     /**
188*c8dee2aaSAndroid Build Coastguard Worker      * Gets the internal format to use with glTexImage...() and glTexStorage...(). May be sized or
189*c8dee2aaSAndroid Build Coastguard Worker      * base depending upon the GL. Not applicable to compressed textures.
190*c8dee2aaSAndroid Build Coastguard Worker      */
getTexImageOrStorageInternalFormat(GrGLFormat format)191*c8dee2aaSAndroid Build Coastguard Worker     GrGLenum getTexImageOrStorageInternalFormat(GrGLFormat format) const {
192*c8dee2aaSAndroid Build Coastguard Worker         return this->getFormatInfo(format).fInternalFormatForTexImageOrStorage;
193*c8dee2aaSAndroid Build Coastguard Worker     }
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker     /**
196*c8dee2aaSAndroid Build Coastguard Worker      * Gets the external format and type to pass to glTexImage2D with nullptr to create an
197*c8dee2aaSAndroid Build Coastguard Worker      * uninitialized texture. See getTexImageOrStorageInternalFormat() for the internal format.
198*c8dee2aaSAndroid Build Coastguard Worker      */
199*c8dee2aaSAndroid Build Coastguard Worker     void getTexImageExternalFormatAndType(GrGLFormat surfaceFormat, GrGLenum* externalFormat,
200*c8dee2aaSAndroid Build Coastguard Worker                                           GrGLenum* externalType) const;
201*c8dee2aaSAndroid Build Coastguard Worker 
202*c8dee2aaSAndroid Build Coastguard Worker     /**
203*c8dee2aaSAndroid Build Coastguard Worker      * Given a src data color type and a color type interpretation for a texture of a given format
204*c8dee2aaSAndroid Build Coastguard Worker      * this provides the external GL format and type to use with glTexSubImage2d. The color types
205*c8dee2aaSAndroid Build Coastguard Worker      * should originate from supportedWritePixelsColorType().
206*c8dee2aaSAndroid Build Coastguard Worker      */
207*c8dee2aaSAndroid Build Coastguard Worker     void getTexSubImageExternalFormatAndType(GrGLFormat surfaceFormat, GrColorType surfaceColorType,
208*c8dee2aaSAndroid Build Coastguard Worker                                              GrColorType memoryColorType, GrGLenum* externalFormat,
209*c8dee2aaSAndroid Build Coastguard Worker                                              GrGLenum* externalType) const;
210*c8dee2aaSAndroid Build Coastguard Worker 
211*c8dee2aaSAndroid Build Coastguard Worker     /**
212*c8dee2aaSAndroid Build Coastguard Worker      * Gets the external format, type, and bytes per pixel to use when uploading solid color data
213*c8dee2aaSAndroid Build Coastguard Worker      * via glTexSubImage...() to clear the texture at creation.
214*c8dee2aaSAndroid Build Coastguard Worker      */
215*c8dee2aaSAndroid Build Coastguard Worker     void getTexSubImageDefaultFormatTypeAndColorType(GrGLFormat format,
216*c8dee2aaSAndroid Build Coastguard Worker                                                      GrGLenum* externalFormat,
217*c8dee2aaSAndroid Build Coastguard Worker                                                      GrGLenum* externalType,
218*c8dee2aaSAndroid Build Coastguard Worker                                                      GrColorType* colorType) const;
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker     void getReadPixelsFormat(GrGLFormat surfaceFormat, GrColorType surfaceColorType,
221*c8dee2aaSAndroid Build Coastguard Worker                              GrColorType memoryColorType, GrGLenum* externalFormat,
222*c8dee2aaSAndroid Build Coastguard Worker                              GrGLenum* externalType) const;
223*c8dee2aaSAndroid Build Coastguard Worker 
224*c8dee2aaSAndroid Build Coastguard Worker     /**
225*c8dee2aaSAndroid Build Coastguard Worker     * Gets an array of legal stencil formats. These formats are not guaranteed
226*c8dee2aaSAndroid Build Coastguard Worker     * to be supported by the driver but are legal GLenum names given the GL
227*c8dee2aaSAndroid Build Coastguard Worker     * version and extensions supported.
228*c8dee2aaSAndroid Build Coastguard Worker     */
stencilFormats()229*c8dee2aaSAndroid Build Coastguard Worker     const skia_private::TArray<GrGLFormat, true>& stencilFormats() const {
230*c8dee2aaSAndroid Build Coastguard Worker         return fStencilFormats;
231*c8dee2aaSAndroid Build Coastguard Worker     }
232*c8dee2aaSAndroid Build Coastguard Worker 
233*c8dee2aaSAndroid Build Coastguard Worker     bool formatSupportsTexStorage(GrGLFormat) const;
234*c8dee2aaSAndroid Build Coastguard Worker 
235*c8dee2aaSAndroid Build Coastguard Worker     /**
236*c8dee2aaSAndroid Build Coastguard Worker      * Would it be useful to check GL_IMPLEMENTATION_READ_FORMAT and _TYPE for this format to
237*c8dee2aaSAndroid Build Coastguard Worker      * detect more efficient glReadPixels arguments?
238*c8dee2aaSAndroid Build Coastguard Worker      */
239*c8dee2aaSAndroid Build Coastguard Worker     bool shouldQueryImplementationReadSupport(GrGLFormat format) const;
240*c8dee2aaSAndroid Build Coastguard Worker 
241*c8dee2aaSAndroid Build Coastguard Worker     /**
242*c8dee2aaSAndroid Build Coastguard Worker      * Let caps know the result of GL_IMPLEMENTATION_READ_FORMAT and _TYPE query for a format
243*c8dee2aaSAndroid Build Coastguard Worker      * to update supported glReadPixels arguments.
244*c8dee2aaSAndroid Build Coastguard Worker      */
245*c8dee2aaSAndroid Build Coastguard Worker     void didQueryImplementationReadSupport(GrGLFormat format,
246*c8dee2aaSAndroid Build Coastguard Worker                                            GrGLenum readFormat,
247*c8dee2aaSAndroid Build Coastguard Worker                                            GrGLenum readType) const;
248*c8dee2aaSAndroid Build Coastguard Worker 
249*c8dee2aaSAndroid Build Coastguard Worker     /**
250*c8dee2aaSAndroid Build Coastguard Worker      * Gets the internal format to use with glRenderbufferStorageMultisample...(). May be sized or
251*c8dee2aaSAndroid Build Coastguard Worker      * base depending upon the GL. Not applicable to compressed textures.
252*c8dee2aaSAndroid Build Coastguard Worker      */
getRenderbufferInternalFormat(GrGLFormat format)253*c8dee2aaSAndroid Build Coastguard Worker     GrGLenum getRenderbufferInternalFormat(GrGLFormat format) const {
254*c8dee2aaSAndroid Build Coastguard Worker         return this->getFormatInfo(format).fInternalFormatForRenderbuffer;
255*c8dee2aaSAndroid Build Coastguard Worker     }
256*c8dee2aaSAndroid Build Coastguard Worker 
257*c8dee2aaSAndroid Build Coastguard Worker     /**
258*c8dee2aaSAndroid Build Coastguard Worker      * Gets the default external type to use with glTex[Sub]Image... when the data pointer is null.
259*c8dee2aaSAndroid Build Coastguard Worker      */
getFormatDefaultExternalType(GrGLFormat format)260*c8dee2aaSAndroid Build Coastguard Worker     GrGLenum getFormatDefaultExternalType(GrGLFormat format) const {
261*c8dee2aaSAndroid Build Coastguard Worker         return this->getFormatInfo(format).fDefaultExternalType;
262*c8dee2aaSAndroid Build Coastguard Worker     }
263*c8dee2aaSAndroid Build Coastguard Worker 
264*c8dee2aaSAndroid Build Coastguard Worker     /**
265*c8dee2aaSAndroid Build Coastguard Worker      * Has a stencil format index been found for the format (or we've found that no format works).
266*c8dee2aaSAndroid Build Coastguard Worker      */
hasStencilFormatBeenDeterminedForFormat(GrGLFormat format)267*c8dee2aaSAndroid Build Coastguard Worker     bool hasStencilFormatBeenDeterminedForFormat(GrGLFormat format) const {
268*c8dee2aaSAndroid Build Coastguard Worker         return this->getFormatInfo(format).fStencilFormatIndex != FormatInfo::kUnknown_StencilIndex;
269*c8dee2aaSAndroid Build Coastguard Worker     }
270*c8dee2aaSAndroid Build Coastguard Worker 
271*c8dee2aaSAndroid Build Coastguard Worker     /**
272*c8dee2aaSAndroid Build Coastguard Worker      * Gets the stencil format index for the format. This assumes
273*c8dee2aaSAndroid Build Coastguard Worker      * hasStencilFormatBeenDeterminedForFormat has already been checked. Returns a value < 0 if
274*c8dee2aaSAndroid Build Coastguard Worker      * no stencil format is supported with the format. Otherwise, returned index refers to the array
275*c8dee2aaSAndroid Build Coastguard Worker      * returned by stencilFormats().
276*c8dee2aaSAndroid Build Coastguard Worker      */
getStencilFormatIndexForFormat(GrGLFormat format)277*c8dee2aaSAndroid Build Coastguard Worker     int getStencilFormatIndexForFormat(GrGLFormat format) const {
278*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(this->hasStencilFormatBeenDeterminedForFormat(format));
279*c8dee2aaSAndroid Build Coastguard Worker         return this->getFormatInfo(format).fStencilFormatIndex;
280*c8dee2aaSAndroid Build Coastguard Worker     }
281*c8dee2aaSAndroid Build Coastguard Worker 
282*c8dee2aaSAndroid Build Coastguard Worker     /**
283*c8dee2aaSAndroid Build Coastguard Worker      * If index is >= 0 this records an index into stencilFormats() as the best stencil format for
284*c8dee2aaSAndroid Build Coastguard Worker      * the format. If < 0 it records that the format has no supported stencil format index.
285*c8dee2aaSAndroid Build Coastguard Worker      */
286*c8dee2aaSAndroid Build Coastguard Worker     void setStencilFormatIndexForFormat(GrGLFormat, int index);
287*c8dee2aaSAndroid Build Coastguard Worker 
288*c8dee2aaSAndroid Build Coastguard Worker     /**
289*c8dee2aaSAndroid Build Coastguard Worker      * Reports the type of MSAA FBO support.
290*c8dee2aaSAndroid Build Coastguard Worker      */
msFBOType()291*c8dee2aaSAndroid Build Coastguard Worker     MSFBOType msFBOType() const { return fMSFBOType; }
292*c8dee2aaSAndroid Build Coastguard Worker 
293*c8dee2aaSAndroid Build Coastguard Worker     /**
294*c8dee2aaSAndroid Build Coastguard Worker      * Does the preferred MSAA FBO extension have MSAA renderbuffers?
295*c8dee2aaSAndroid Build Coastguard Worker      */
usesMSAARenderBuffers()296*c8dee2aaSAndroid Build Coastguard Worker     bool usesMSAARenderBuffers() const {
297*c8dee2aaSAndroid Build Coastguard Worker         return kNone_MSFBOType != fMSFBOType &&
298*c8dee2aaSAndroid Build Coastguard Worker                kES_IMG_MsToTexture_MSFBOType != fMSFBOType &&
299*c8dee2aaSAndroid Build Coastguard Worker                kES_EXT_MsToTexture_MSFBOType != fMSFBOType;
300*c8dee2aaSAndroid Build Coastguard Worker     }
301*c8dee2aaSAndroid Build Coastguard Worker 
302*c8dee2aaSAndroid Build Coastguard Worker     /**
303*c8dee2aaSAndroid Build Coastguard Worker      * Is it unsupported to only resolve a sub-rectangle of a framebuffer?
304*c8dee2aaSAndroid Build Coastguard Worker      */
framebufferResolvesMustBeFullSize()305*c8dee2aaSAndroid Build Coastguard Worker     bool framebufferResolvesMustBeFullSize() const {
306*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fMSFBOType != kNone_MSFBOType);
307*c8dee2aaSAndroid Build Coastguard Worker         return fMSFBOType == kES_Apple_MSFBOType ||
308*c8dee2aaSAndroid Build Coastguard Worker                (fBlitFramebufferFlags & kResolveMustBeFull_BlitFrambufferFlag);
309*c8dee2aaSAndroid Build Coastguard Worker     }
310*c8dee2aaSAndroid Build Coastguard Worker 
311*c8dee2aaSAndroid Build Coastguard Worker     /**
312*c8dee2aaSAndroid Build Coastguard Worker      * Can we resolve a single-sample framebuffer into an MSAA framebuffer?
313*c8dee2aaSAndroid Build Coastguard Worker      */
canResolveSingleToMSAA()314*c8dee2aaSAndroid Build Coastguard Worker     bool canResolveSingleToMSAA() const {
315*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fMSFBOType != kNone_MSFBOType);
316*c8dee2aaSAndroid Build Coastguard Worker         return fMSFBOType != kES_Apple_MSFBOType &&
317*c8dee2aaSAndroid Build Coastguard Worker                !(fBlitFramebufferFlags & GrGLCaps::kNoMSAADst_BlitFramebufferFlag);
318*c8dee2aaSAndroid Build Coastguard Worker     }
319*c8dee2aaSAndroid Build Coastguard Worker 
320*c8dee2aaSAndroid Build Coastguard Worker     /**
321*c8dee2aaSAndroid Build Coastguard Worker      * Is the MSAA FBO extension one where the texture is multisampled when bound to an FBO and
322*c8dee2aaSAndroid Build Coastguard Worker      * then implicitly resolved when read.
323*c8dee2aaSAndroid Build Coastguard Worker      */
usesImplicitMSAAResolve()324*c8dee2aaSAndroid Build Coastguard Worker     bool usesImplicitMSAAResolve() const {
325*c8dee2aaSAndroid Build Coastguard Worker         return kES_IMG_MsToTexture_MSFBOType == fMSFBOType ||
326*c8dee2aaSAndroid Build Coastguard Worker                kES_EXT_MsToTexture_MSFBOType == fMSFBOType;
327*c8dee2aaSAndroid Build Coastguard Worker     }
328*c8dee2aaSAndroid Build Coastguard Worker 
invalidateFBType()329*c8dee2aaSAndroid Build Coastguard Worker     InvalidateFBType invalidateFBType() const { return fInvalidateFBType; }
330*c8dee2aaSAndroid Build Coastguard Worker 
331*c8dee2aaSAndroid Build Coastguard Worker     /// What type of buffer mapping is supported?
mapBufferType()332*c8dee2aaSAndroid Build Coastguard Worker     MapBufferType mapBufferType() const { return fMapBufferType; }
333*c8dee2aaSAndroid Build Coastguard Worker 
334*c8dee2aaSAndroid Build Coastguard Worker     /// What type of transfer buffer is supported?
transferBufferType()335*c8dee2aaSAndroid Build Coastguard Worker     TransferBufferType transferBufferType() const { return fTransferBufferType; }
336*c8dee2aaSAndroid Build Coastguard Worker 
337*c8dee2aaSAndroid Build Coastguard Worker     /** Supports using GrGLsync. */
fenceSyncSupport()338*c8dee2aaSAndroid Build Coastguard Worker     bool fenceSyncSupport() const { return fFenceSyncSupport; }
339*c8dee2aaSAndroid Build Coastguard Worker 
340*c8dee2aaSAndroid Build Coastguard Worker     /// How is GrGLsync implemented?
fenceType()341*c8dee2aaSAndroid Build Coastguard Worker     FenceType fenceType() const { return fFenceType; }
342*c8dee2aaSAndroid Build Coastguard Worker 
343*c8dee2aaSAndroid Build Coastguard Worker     /// What type of timer queries are supported
timerQueryType()344*c8dee2aaSAndroid Build Coastguard Worker     TimerQueryType timerQueryType() const { return fTimerQueryType; }
345*c8dee2aaSAndroid Build Coastguard Worker 
346*c8dee2aaSAndroid Build Coastguard Worker     /// How are multi draws implemented (if at all)?
multiDrawType()347*c8dee2aaSAndroid Build Coastguard Worker     MultiDrawType multiDrawType() const { return fMultiDrawType; }
348*c8dee2aaSAndroid Build Coastguard Worker 
349*c8dee2aaSAndroid Build Coastguard Worker     /// How is restricting sampled miplevels in onRegenerateMipmapLevels implemented?
regenerateMipmapType()350*c8dee2aaSAndroid Build Coastguard Worker     RegenerateMipmapType regenerateMipmapType() const { return fRegenerateMipmapType; }
351*c8dee2aaSAndroid Build Coastguard Worker 
352*c8dee2aaSAndroid Build Coastguard Worker     /// The maximum number of fragment uniform vectors (GLES has min. 16).
maxFragmentUniformVectors()353*c8dee2aaSAndroid Build Coastguard Worker     int maxFragmentUniformVectors() const { return fMaxFragmentUniformVectors; }
354*c8dee2aaSAndroid Build Coastguard Worker 
355*c8dee2aaSAndroid Build Coastguard Worker     /// Is there support for GL_PACK_REVERSE_ROW_ORDER
packFlipYSupport()356*c8dee2aaSAndroid Build Coastguard Worker     bool packFlipYSupport() const { return fPackFlipYSupport; }
357*c8dee2aaSAndroid Build Coastguard Worker 
358*c8dee2aaSAndroid Build Coastguard Worker     /// Is there support for texture parameter GL_TEXTURE_USAGE
textureUsageSupport()359*c8dee2aaSAndroid Build Coastguard Worker     bool textureUsageSupport() const { return fTextureUsageSupport; }
360*c8dee2aaSAndroid Build Coastguard Worker 
361*c8dee2aaSAndroid Build Coastguard Worker     /// Is GL_ARB_IMAGING supported
imagingSupport()362*c8dee2aaSAndroid Build Coastguard Worker     bool imagingSupport() const { return fImagingSupport; }
363*c8dee2aaSAndroid Build Coastguard Worker 
364*c8dee2aaSAndroid Build Coastguard Worker     /// Is there support for Vertex Array Objects?
vertexArrayObjectSupport()365*c8dee2aaSAndroid Build Coastguard Worker     bool vertexArrayObjectSupport() const { return fVertexArrayObjectSupport; }
366*c8dee2aaSAndroid Build Coastguard Worker 
367*c8dee2aaSAndroid Build Coastguard Worker     /// Is there support for GL_KHR_debug?
debugSupport()368*c8dee2aaSAndroid Build Coastguard Worker     bool debugSupport() const { return fDebugSupport; }
369*c8dee2aaSAndroid Build Coastguard Worker 
370*c8dee2aaSAndroid Build Coastguard Worker     /// Is there support for ES2 compatability?
ES2CompatibilitySupport()371*c8dee2aaSAndroid Build Coastguard Worker     bool ES2CompatibilitySupport() const { return fES2CompatibilitySupport; }
372*c8dee2aaSAndroid Build Coastguard Worker 
373*c8dee2aaSAndroid Build Coastguard Worker     // Should OpenGL Protectedness handling be Vulkan-like
strictProtectedness()374*c8dee2aaSAndroid Build Coastguard Worker     bool strictProtectedness() const { return fStrictProtectedness; }
375*c8dee2aaSAndroid Build Coastguard Worker 
376*c8dee2aaSAndroid Build Coastguard Worker     /// Is there support for glDrawRangeElements?
drawRangeElementsSupport()377*c8dee2aaSAndroid Build Coastguard Worker     bool drawRangeElementsSupport() const { return fDrawRangeElementsSupport; }
378*c8dee2aaSAndroid Build Coastguard Worker 
379*c8dee2aaSAndroid Build Coastguard Worker     /// Are the glDraw*Base(VertexBase)Instance methods, and baseInstance fields in indirect draw
380*c8dee2aaSAndroid Build Coastguard Worker     //commands supported?
baseVertexBaseInstanceSupport()381*c8dee2aaSAndroid Build Coastguard Worker     bool baseVertexBaseInstanceSupport() const { return fBaseVertexBaseInstanceSupport; }
382*c8dee2aaSAndroid Build Coastguard Worker 
383*c8dee2aaSAndroid Build Coastguard Worker     SurfaceReadPixelsSupport surfaceSupportsReadPixels(const GrSurface*) const override;
384*c8dee2aaSAndroid Build Coastguard Worker 
385*c8dee2aaSAndroid Build Coastguard Worker     SupportedWrite supportedWritePixelsColorType(GrColorType surfaceColorType,
386*c8dee2aaSAndroid Build Coastguard Worker                                                  const GrBackendFormat& surfaceFormat,
387*c8dee2aaSAndroid Build Coastguard Worker                                                  GrColorType srcColorType) const override;
388*c8dee2aaSAndroid Build Coastguard Worker 
isCoreProfile()389*c8dee2aaSAndroid Build Coastguard Worker     bool isCoreProfile() const { return fIsCoreProfile; }
390*c8dee2aaSAndroid Build Coastguard Worker 
bindFragDataLocationSupport()391*c8dee2aaSAndroid Build Coastguard Worker     bool bindFragDataLocationSupport() const { return fBindFragDataLocationSupport; }
392*c8dee2aaSAndroid Build Coastguard Worker 
bindUniformLocationSupport()393*c8dee2aaSAndroid Build Coastguard Worker     bool bindUniformLocationSupport() const { return fBindUniformLocationSupport; }
394*c8dee2aaSAndroid Build Coastguard Worker 
395*c8dee2aaSAndroid Build Coastguard Worker     /// Are textures with GL_TEXTURE_RECTANGLE type supported.
rectangleTextureSupport()396*c8dee2aaSAndroid Build Coastguard Worker     bool rectangleTextureSupport() const { return fRectangleTextureSupport; }
397*c8dee2aaSAndroid Build Coastguard Worker 
398*c8dee2aaSAndroid Build Coastguard Worker     /// Can set the BASE and MAX mip map level.
mipmapLevelControlSupport()399*c8dee2aaSAndroid Build Coastguard Worker     bool mipmapLevelControlSupport() const { return fMipmapLevelControlSupport; }
400*c8dee2aaSAndroid Build Coastguard Worker 
401*c8dee2aaSAndroid Build Coastguard Worker     /// Can set the MIN/MAX LOD value.
mipmapLodControlSupport()402*c8dee2aaSAndroid Build Coastguard Worker     bool mipmapLodControlSupport() const { return fMipmapLodControlSupport; }
403*c8dee2aaSAndroid Build Coastguard Worker 
doManualMipmapping()404*c8dee2aaSAndroid Build Coastguard Worker     bool doManualMipmapping() const { return fDoManualMipmapping; }
405*c8dee2aaSAndroid Build Coastguard Worker 
406*c8dee2aaSAndroid Build Coastguard Worker     void onDumpJSON(SkJSONWriter*) const override;
407*c8dee2aaSAndroid Build Coastguard Worker 
invalidateBufferType()408*c8dee2aaSAndroid Build Coastguard Worker     InvalidateBufferType invalidateBufferType() const { return fInvalidateBufferType; }
409*c8dee2aaSAndroid Build Coastguard Worker 
410*c8dee2aaSAndroid Build Coastguard Worker     // Certain Intel GPUs on Mac fail to clear if the glClearColor is made up of only 1s and 0s.
clearToBoundaryValuesIsBroken()411*c8dee2aaSAndroid Build Coastguard Worker     bool clearToBoundaryValuesIsBroken() const { return fClearToBoundaryValuesIsBroken; }
412*c8dee2aaSAndroid Build Coastguard Worker 
413*c8dee2aaSAndroid Build Coastguard Worker     /// glClearTex(Sub)Image support
clearTextureSupport()414*c8dee2aaSAndroid Build Coastguard Worker     bool clearTextureSupport() const { return fClearTextureSupport; }
415*c8dee2aaSAndroid Build Coastguard Worker 
416*c8dee2aaSAndroid Build Coastguard Worker     // Adreno/MSAA drops a draw on the imagefiltersbase GM if the base vertex param to
417*c8dee2aaSAndroid Build Coastguard Worker     // glDrawArrays is nonzero.
418*c8dee2aaSAndroid Build Coastguard Worker     // https://bugs.chromium.org/p/skia/issues/detail?id=6650
drawArraysBaseVertexIsBroken()419*c8dee2aaSAndroid Build Coastguard Worker     bool drawArraysBaseVertexIsBroken() const { return fDrawArraysBaseVertexIsBroken; }
420*c8dee2aaSAndroid Build Coastguard Worker 
421*c8dee2aaSAndroid Build Coastguard Worker     // If true then we must use an intermediate surface to perform partial updates to unorm textures
422*c8dee2aaSAndroid Build Coastguard Worker     // that have ever been bound to a FBO.
disallowTexSubImageForUnormConfigTexturesEverBoundToFBO()423*c8dee2aaSAndroid Build Coastguard Worker     bool disallowTexSubImageForUnormConfigTexturesEverBoundToFBO() const {
424*c8dee2aaSAndroid Build Coastguard Worker         return fDisallowTexSubImageForUnormConfigTexturesEverBoundToFBO;
425*c8dee2aaSAndroid Build Coastguard Worker     }
426*c8dee2aaSAndroid Build Coastguard Worker 
427*c8dee2aaSAndroid Build Coastguard Worker     // Use an intermediate surface to write pixels (full or partial overwrite) to into a texture
428*c8dee2aaSAndroid Build Coastguard Worker     // that is bound to an FBO.
useDrawInsteadOfAllRenderTargetWrites()429*c8dee2aaSAndroid Build Coastguard Worker     bool useDrawInsteadOfAllRenderTargetWrites() const {
430*c8dee2aaSAndroid Build Coastguard Worker         return fUseDrawInsteadOfAllRenderTargetWrites;
431*c8dee2aaSAndroid Build Coastguard Worker     }
432*c8dee2aaSAndroid Build Coastguard Worker 
433*c8dee2aaSAndroid Build Coastguard Worker     // At least some Adreno 3xx drivers draw lines incorrectly after drawing non-lines. Toggling
434*c8dee2aaSAndroid Build Coastguard Worker     // face culling on and off seems to resolve this.
requiresCullFaceEnableDisableWhenDrawingLinesAfterNonLines()435*c8dee2aaSAndroid Build Coastguard Worker     bool requiresCullFaceEnableDisableWhenDrawingLinesAfterNonLines() const {
436*c8dee2aaSAndroid Build Coastguard Worker         return fRequiresCullFaceEnableDisableWhenDrawingLinesAfterNonLines;
437*c8dee2aaSAndroid Build Coastguard Worker     }
438*c8dee2aaSAndroid Build Coastguard Worker 
439*c8dee2aaSAndroid Build Coastguard Worker     // Older Android versions seem to have an issue with setting GL_TEXTURE_BASE_LEVEL or
440*c8dee2aaSAndroid Build Coastguard Worker     // GL_TEXTURE_MAX_LEVEL for GL_TEXTURE_EXTERNAL_OES textures.
dontSetBaseOrMaxLevelForExternalTextures()441*c8dee2aaSAndroid Build Coastguard Worker     bool dontSetBaseOrMaxLevelForExternalTextures() const {
442*c8dee2aaSAndroid Build Coastguard Worker         return fDontSetBaseOrMaxLevelForExternalTextures;
443*c8dee2aaSAndroid Build Coastguard Worker     }
444*c8dee2aaSAndroid Build Coastguard Worker 
445*c8dee2aaSAndroid Build Coastguard Worker     // PowerVRGX6250 drops every pixel if we modify the sample mask while color writes are disabled.
neverDisableColorWrites()446*c8dee2aaSAndroid Build Coastguard Worker     bool neverDisableColorWrites() const { return fNeverDisableColorWrites; }
447*c8dee2aaSAndroid Build Coastguard Worker 
448*c8dee2aaSAndroid Build Coastguard Worker     // Texture parameters must be used to enable MIP mapping even when a sampler object is used.
mustSetAnyTexParameterToEnableMipmapping()449*c8dee2aaSAndroid Build Coastguard Worker     bool mustSetAnyTexParameterToEnableMipmapping() const {
450*c8dee2aaSAndroid Build Coastguard Worker         return fMustSetAnyTexParameterToEnableMipmapping;
451*c8dee2aaSAndroid Build Coastguard Worker     }
452*c8dee2aaSAndroid Build Coastguard Worker 
453*c8dee2aaSAndroid Build Coastguard Worker     // Whether we must reset the blend function to not reference src2 when disabling blending after
454*c8dee2aaSAndroid Build Coastguard Worker     // previously referencing src2.
mustResetBlendFuncBetweenDualSourceAndDisable()455*c8dee2aaSAndroid Build Coastguard Worker     bool mustResetBlendFuncBetweenDualSourceAndDisable() const {
456*c8dee2aaSAndroid Build Coastguard Worker         return fMustResetBlendFuncBetweenDualSourceAndDisable;
457*c8dee2aaSAndroid Build Coastguard Worker     }
458*c8dee2aaSAndroid Build Coastguard Worker 
459*c8dee2aaSAndroid Build Coastguard Worker     // Before changing the sample count of a texture bound to an FBO with
460*c8dee2aaSAndroid Build Coastguard Worker     // glFramebufferTexture2DMultisample() temporarily bind texture 0 to avoid corruption int the
461*c8dee2aaSAndroid Build Coastguard Worker     // texture contents.
bindTexture0WhenChangingTextureFBOMultisampleCount()462*c8dee2aaSAndroid Build Coastguard Worker     bool bindTexture0WhenChangingTextureFBOMultisampleCount() const {
463*c8dee2aaSAndroid Build Coastguard Worker         return fBindTexture0WhenChangingTextureFBOMultisampleCount;
464*c8dee2aaSAndroid Build Coastguard Worker     }
465*c8dee2aaSAndroid Build Coastguard Worker 
466*c8dee2aaSAndroid Build Coastguard Worker     // After using glCheckFramebufferStatus() bind 0 to the color attachment and then rebind the
467*c8dee2aaSAndroid Build Coastguard Worker     // original color attachment.
rebindColorAttachmentAfterCheckFramebufferStatus()468*c8dee2aaSAndroid Build Coastguard Worker     bool rebindColorAttachmentAfterCheckFramebufferStatus() const {
469*c8dee2aaSAndroid Build Coastguard Worker         return fRebindColorAttachmentAfterCheckFramebufferStatus;
470*c8dee2aaSAndroid Build Coastguard Worker     }
471*c8dee2aaSAndroid Build Coastguard Worker 
472*c8dee2aaSAndroid Build Coastguard Worker     // During writePixels, call glFlush() before issuing glTexSubImage2D().
flushBeforeWritePixels()473*c8dee2aaSAndroid Build Coastguard Worker     bool flushBeforeWritePixels() const {
474*c8dee2aaSAndroid Build Coastguard Worker         return fFlushBeforeWritePixels;
475*c8dee2aaSAndroid Build Coastguard Worker     }
476*c8dee2aaSAndroid Build Coastguard Worker 
477*c8dee2aaSAndroid Build Coastguard Worker     // Returns the observed maximum number of instances the driver can handle in a single draw call
478*c8dee2aaSAndroid Build Coastguard Worker     // without crashing, or 'pendingInstanceCount' if this workaround is not necessary.
479*c8dee2aaSAndroid Build Coastguard Worker     // NOTE: the return value may be larger than pendingInstanceCount.
maxInstancesPerDrawWithoutCrashing(int pendingInstanceCount)480*c8dee2aaSAndroid Build Coastguard Worker     int maxInstancesPerDrawWithoutCrashing(int pendingInstanceCount) const {
481*c8dee2aaSAndroid Build Coastguard Worker         return (fMaxInstancesPerDrawWithoutCrashing)
482*c8dee2aaSAndroid Build Coastguard Worker                 ? fMaxInstancesPerDrawWithoutCrashing : pendingInstanceCount;
483*c8dee2aaSAndroid Build Coastguard Worker     }
484*c8dee2aaSAndroid Build Coastguard Worker 
485*c8dee2aaSAndroid Build Coastguard Worker     bool canCopyTexSubImage(GrGLFormat dstFormat, bool dstHasMSAARenderBuffer,
486*c8dee2aaSAndroid Build Coastguard Worker                             const GrTextureType* dstTypeIfTexture,
487*c8dee2aaSAndroid Build Coastguard Worker                             GrGLFormat srcFormat, bool srcHasMSAARenderBuffer,
488*c8dee2aaSAndroid Build Coastguard Worker                             const GrTextureType* srcTypeIfTexture) const;
489*c8dee2aaSAndroid Build Coastguard Worker     bool canCopyAsBlit(GrGLFormat dstFormat, int dstSampleCnt,
490*c8dee2aaSAndroid Build Coastguard Worker                        const GrTextureType* dstTypeIfTexture,
491*c8dee2aaSAndroid Build Coastguard Worker                        GrGLFormat srcFormat, int srcSampleCnt,
492*c8dee2aaSAndroid Build Coastguard Worker                        const GrTextureType* srcTypeIfTexture,
493*c8dee2aaSAndroid Build Coastguard Worker                        const SkRect& srcBounds, bool srcBoundsExact,
494*c8dee2aaSAndroid Build Coastguard Worker                        const SkIRect& srcRect, const SkIRect& dstRect) const;
495*c8dee2aaSAndroid Build Coastguard Worker     bool canCopyAsDraw(GrGLFormat dstFormat, bool srcIsTexturable, bool scalingCopy) const;
496*c8dee2aaSAndroid Build Coastguard Worker 
497*c8dee2aaSAndroid Build Coastguard Worker     DstCopyRestrictions getDstCopyRestrictions(const GrRenderTargetProxy* src,
498*c8dee2aaSAndroid Build Coastguard Worker                                                GrColorType) const override;
499*c8dee2aaSAndroid Build Coastguard Worker 
programBinarySupport()500*c8dee2aaSAndroid Build Coastguard Worker     bool programBinarySupport() const { return fProgramBinarySupport; }
programParameterSupport()501*c8dee2aaSAndroid Build Coastguard Worker     bool programParameterSupport() const { return fProgramParameterSupport; }
502*c8dee2aaSAndroid Build Coastguard Worker     bool programBinaryFormatIsValid(GrGLenum binaryFormat) const;
503*c8dee2aaSAndroid Build Coastguard Worker 
504*c8dee2aaSAndroid Build Coastguard Worker     /** Are sampler objects available in this GL? */
samplerObjectSupport()505*c8dee2aaSAndroid Build Coastguard Worker     bool samplerObjectSupport() const { return fSamplerObjectSupport; }
506*c8dee2aaSAndroid Build Coastguard Worker 
507*c8dee2aaSAndroid Build Coastguard Worker     /**
508*c8dee2aaSAndroid Build Coastguard Worker      * Are we using sampler objects in favor of texture parameters? (This will only be true if
509*c8dee2aaSAndroid Build Coastguard Worker      * samplerObjectSupport()).
510*c8dee2aaSAndroid Build Coastguard Worker      */
useSamplerObjects()511*c8dee2aaSAndroid Build Coastguard Worker     bool useSamplerObjects() const { return fUseSamplerObjects; }
512*c8dee2aaSAndroid Build Coastguard Worker 
textureSwizzleSupport()513*c8dee2aaSAndroid Build Coastguard Worker     bool textureSwizzleSupport() const { return fTextureSwizzleSupport; }
514*c8dee2aaSAndroid Build Coastguard Worker 
tiledRenderingSupport()515*c8dee2aaSAndroid Build Coastguard Worker     bool tiledRenderingSupport() const { return fTiledRenderingSupport; }
516*c8dee2aaSAndroid Build Coastguard Worker 
fbFetchRequiresEnablePerSample()517*c8dee2aaSAndroid Build Coastguard Worker     bool fbFetchRequiresEnablePerSample() const { return fFBFetchRequiresEnablePerSample; }
518*c8dee2aaSAndroid Build Coastguard Worker 
519*c8dee2aaSAndroid Build Coastguard Worker     /* Is there support for enabling/disabling sRGB writes for sRGB-capable color buffers? */
srgbWriteControl()520*c8dee2aaSAndroid Build Coastguard Worker     bool srgbWriteControl() const { return fSRGBWriteControl; }
521*c8dee2aaSAndroid Build Coastguard Worker 
522*c8dee2aaSAndroid Build Coastguard Worker     /**
523*c8dee2aaSAndroid Build Coastguard Worker      * Skip checks for GL errors and framebuffer completeness. Note that this does not skip
524*c8dee2aaSAndroid Build Coastguard Worker      *  checking shader compilation and program linking status.
525*c8dee2aaSAndroid Build Coastguard Worker      */
skipErrorChecks()526*c8dee2aaSAndroid Build Coastguard Worker     bool skipErrorChecks() const { return fSkipErrorChecks; }
527*c8dee2aaSAndroid Build Coastguard Worker 
clientCanDisableMultisample()528*c8dee2aaSAndroid Build Coastguard Worker     bool clientCanDisableMultisample() const { return fClientCanDisableMultisample; }
529*c8dee2aaSAndroid Build Coastguard Worker 
530*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat getBackendFormatFromCompressionType(SkTextureCompressionType) const override;
531*c8dee2aaSAndroid Build Coastguard Worker 
532*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Swizzle getWriteSwizzle(const GrBackendFormat&, GrColorType) const override;
533*c8dee2aaSAndroid Build Coastguard Worker 
534*c8dee2aaSAndroid Build Coastguard Worker     uint64_t computeFormatKey(const GrBackendFormat&) const override;
535*c8dee2aaSAndroid Build Coastguard Worker 
536*c8dee2aaSAndroid Build Coastguard Worker     GrProgramDesc makeDesc(GrRenderTarget*,
537*c8dee2aaSAndroid Build Coastguard Worker                            const GrProgramInfo&,
538*c8dee2aaSAndroid Build Coastguard Worker                            ProgramDescOverrideFlags) const override;
539*c8dee2aaSAndroid Build Coastguard Worker 
540*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
standard()541*c8dee2aaSAndroid Build Coastguard Worker     GrGLStandard standard() const { return fStandard; }
542*c8dee2aaSAndroid Build Coastguard Worker 
543*c8dee2aaSAndroid Build Coastguard Worker     std::vector<GrTest::TestFormatColorTypeCombination> getTestingCombinations() const override;
544*c8dee2aaSAndroid Build Coastguard Worker #endif
545*c8dee2aaSAndroid Build Coastguard Worker 
546*c8dee2aaSAndroid Build Coastguard Worker private:
547*c8dee2aaSAndroid Build Coastguard Worker     enum ExternalFormatUsage {
548*c8dee2aaSAndroid Build Coastguard Worker         kTexImage_ExternalFormatUsage,
549*c8dee2aaSAndroid Build Coastguard Worker         kReadPixels_ExternalFormatUsage,
550*c8dee2aaSAndroid Build Coastguard Worker     };
551*c8dee2aaSAndroid Build Coastguard Worker     void getExternalFormat(GrGLFormat surfaceFormat, GrColorType surfaceColorType,
552*c8dee2aaSAndroid Build Coastguard Worker                            GrColorType memoryColorType, ExternalFormatUsage usage,
553*c8dee2aaSAndroid Build Coastguard Worker                            GrGLenum* externalFormat, GrGLenum* externalType) const;
554*c8dee2aaSAndroid Build Coastguard Worker 
555*c8dee2aaSAndroid Build Coastguard Worker     void init(const GrContextOptions&, const GrGLContextInfo&, const GrGLInterface*);
556*c8dee2aaSAndroid Build Coastguard Worker     void initGLSL(const GrGLContextInfo&, const GrGLInterface*);
557*c8dee2aaSAndroid Build Coastguard Worker 
558*c8dee2aaSAndroid Build Coastguard Worker     struct FormatWorkarounds {
559*c8dee2aaSAndroid Build Coastguard Worker         bool fDisableSRGBRenderWithMSAAForMacAMD = false;
560*c8dee2aaSAndroid Build Coastguard Worker         bool fDisableRGBA16FTexStorageForCrBug1008003 = false;
561*c8dee2aaSAndroid Build Coastguard Worker         bool fDisableBGRATextureStorageForIntelWindowsES = false;
562*c8dee2aaSAndroid Build Coastguard Worker         bool fDisableLuminance16F = false;
563*c8dee2aaSAndroid Build Coastguard Worker         bool fDisableTexStorage = false;
564*c8dee2aaSAndroid Build Coastguard Worker         bool fDisallowDirectRG8ReadPixels = false;
565*c8dee2aaSAndroid Build Coastguard Worker         bool fDisallowBGRA8ReadPixels = false;
566*c8dee2aaSAndroid Build Coastguard Worker         bool fDisallowR8ForPowerVRSGX54x = false;
567*c8dee2aaSAndroid Build Coastguard Worker         bool fDisallowUnorm16Transfers = false;
568*c8dee2aaSAndroid Build Coastguard Worker         bool fDisallowTextureUnorm16 = false;
569*c8dee2aaSAndroid Build Coastguard Worker         bool fDisallowETC2Compression = false;
570*c8dee2aaSAndroid Build Coastguard Worker     };
571*c8dee2aaSAndroid Build Coastguard Worker 
572*c8dee2aaSAndroid Build Coastguard Worker     void applyDriverCorrectnessWorkarounds(const GrGLContextInfo&, const GrContextOptions&,
573*c8dee2aaSAndroid Build Coastguard Worker                                            const GrGLInterface*,
574*c8dee2aaSAndroid Build Coastguard Worker                                            GrShaderCaps*, FormatWorkarounds*);
575*c8dee2aaSAndroid Build Coastguard Worker 
576*c8dee2aaSAndroid Build Coastguard Worker     void onApplyOptionsOverrides(const GrContextOptions& options) override;
577*c8dee2aaSAndroid Build Coastguard Worker 
578*c8dee2aaSAndroid Build Coastguard Worker     bool onIsWindowRectanglesSupportedForRT(const GrBackendRenderTarget&) const override;
579*c8dee2aaSAndroid Build Coastguard Worker 
580*c8dee2aaSAndroid Build Coastguard Worker     void initFSAASupport(const GrContextOptions& contextOptions, const GrGLContextInfo&,
581*c8dee2aaSAndroid Build Coastguard Worker                          const GrGLInterface*);
582*c8dee2aaSAndroid Build Coastguard Worker     void initBlendEqationSupport(const GrGLContextInfo&);
583*c8dee2aaSAndroid Build Coastguard Worker     void initStencilSupport(const GrGLContextInfo&);
584*c8dee2aaSAndroid Build Coastguard Worker     // This must be called after initFSAASupport().
585*c8dee2aaSAndroid Build Coastguard Worker     void initFormatTable(const GrGLContextInfo&, const GrGLInterface*, const FormatWorkarounds&);
586*c8dee2aaSAndroid Build Coastguard Worker     void setupSampleCounts(const GrGLContextInfo&, const GrGLInterface*);
587*c8dee2aaSAndroid Build Coastguard Worker     bool onSurfaceSupportsWritePixels(const GrSurface*) const override;
588*c8dee2aaSAndroid Build Coastguard Worker     bool onCanCopySurface(const GrSurfaceProxy* dst, const SkIRect& dstRect,
589*c8dee2aaSAndroid Build Coastguard Worker                           const GrSurfaceProxy* src, const SkIRect& srcRect) const override;
590*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat onGetDefaultBackendFormat(GrColorType) const override;
591*c8dee2aaSAndroid Build Coastguard Worker     bool onAreColorTypeAndFormatCompatible(GrColorType, const GrBackendFormat&) const override;
592*c8dee2aaSAndroid Build Coastguard Worker 
593*c8dee2aaSAndroid Build Coastguard Worker     SupportedRead onSupportedReadPixelsColorType(GrColorType, const GrBackendFormat&,
594*c8dee2aaSAndroid Build Coastguard Worker                                                  GrColorType) const override;
595*c8dee2aaSAndroid Build Coastguard Worker 
596*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Swizzle onGetReadSwizzle(const GrBackendFormat&, GrColorType) const override;
597*c8dee2aaSAndroid Build Coastguard Worker 
598*c8dee2aaSAndroid Build Coastguard Worker     GrDstSampleFlags onGetDstSampleFlagsForProxy(const GrRenderTargetProxy*) const override;
599*c8dee2aaSAndroid Build Coastguard Worker 
600*c8dee2aaSAndroid Build Coastguard Worker     bool onSupportsDynamicMSAA(const GrRenderTargetProxy*) const override;
601*c8dee2aaSAndroid Build Coastguard Worker 
602*c8dee2aaSAndroid Build Coastguard Worker     GrGLStandard fStandard = kNone_GrGLStandard;
603*c8dee2aaSAndroid Build Coastguard Worker 
604*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<GrGLFormat, true> fStencilFormats;
605*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<GrGLenum, true> fProgramBinaryFormats;
606*c8dee2aaSAndroid Build Coastguard Worker 
607*c8dee2aaSAndroid Build Coastguard Worker     int fMaxFragmentUniformVectors = 0;
608*c8dee2aaSAndroid Build Coastguard Worker     float fMaxTextureMaxAnisotropy = 1.f;
609*c8dee2aaSAndroid Build Coastguard Worker 
610*c8dee2aaSAndroid Build Coastguard Worker     MSFBOType            fMSFBOType            = kNone_MSFBOType;
611*c8dee2aaSAndroid Build Coastguard Worker     InvalidateFBType     fInvalidateFBType     = kNone_InvalidateFBType;
612*c8dee2aaSAndroid Build Coastguard Worker     InvalidateBufferType fInvalidateBufferType = InvalidateBufferType::kNone;
613*c8dee2aaSAndroid Build Coastguard Worker     MapBufferType        fMapBufferType        = kNone_MapBufferType;
614*c8dee2aaSAndroid Build Coastguard Worker     TransferBufferType   fTransferBufferType   = TransferBufferType::kNone;
615*c8dee2aaSAndroid Build Coastguard Worker     FenceType            fFenceType            = FenceType::kNone;
616*c8dee2aaSAndroid Build Coastguard Worker     TimerQueryType       fTimerQueryType       = TimerQueryType::kNone;
617*c8dee2aaSAndroid Build Coastguard Worker     MultiDrawType        fMultiDrawType        = MultiDrawType::kNone;
618*c8dee2aaSAndroid Build Coastguard Worker     RegenerateMipmapType fRegenerateMipmapType = RegenerateMipmapType::kBaseLevel;
619*c8dee2aaSAndroid Build Coastguard Worker 
620*c8dee2aaSAndroid Build Coastguard Worker     bool fPackFlipYSupport : 1;
621*c8dee2aaSAndroid Build Coastguard Worker     bool fTextureUsageSupport : 1;
622*c8dee2aaSAndroid Build Coastguard Worker     bool fImagingSupport  : 1;
623*c8dee2aaSAndroid Build Coastguard Worker     bool fVertexArrayObjectSupport : 1;
624*c8dee2aaSAndroid Build Coastguard Worker     bool fDebugSupport : 1;
625*c8dee2aaSAndroid Build Coastguard Worker     bool fES2CompatibilitySupport : 1;
626*c8dee2aaSAndroid Build Coastguard Worker     bool fStrictProtectedness     : 1;
627*c8dee2aaSAndroid Build Coastguard Worker     bool fDrawRangeElementsSupport : 1;
628*c8dee2aaSAndroid Build Coastguard Worker     bool fBaseVertexBaseInstanceSupport : 1;
629*c8dee2aaSAndroid Build Coastguard Worker     bool fIsCoreProfile : 1;
630*c8dee2aaSAndroid Build Coastguard Worker     bool fBindFragDataLocationSupport : 1;
631*c8dee2aaSAndroid Build Coastguard Worker     bool fBindUniformLocationSupport : 1;
632*c8dee2aaSAndroid Build Coastguard Worker     bool fRectangleTextureSupport : 1;
633*c8dee2aaSAndroid Build Coastguard Worker     bool fMipmapLevelControlSupport : 1;
634*c8dee2aaSAndroid Build Coastguard Worker     bool fMipmapLodControlSupport : 1;
635*c8dee2aaSAndroid Build Coastguard Worker     bool fClearTextureSupport : 1;
636*c8dee2aaSAndroid Build Coastguard Worker     bool fProgramBinarySupport : 1;
637*c8dee2aaSAndroid Build Coastguard Worker     bool fProgramParameterSupport : 1;
638*c8dee2aaSAndroid Build Coastguard Worker     bool fSamplerObjectSupport : 1;
639*c8dee2aaSAndroid Build Coastguard Worker     bool fUseSamplerObjects : 1;
640*c8dee2aaSAndroid Build Coastguard Worker     bool fTextureSwizzleSupport : 1;
641*c8dee2aaSAndroid Build Coastguard Worker     bool fTiledRenderingSupport : 1;
642*c8dee2aaSAndroid Build Coastguard Worker     bool fFenceSyncSupport : 1;
643*c8dee2aaSAndroid Build Coastguard Worker     bool fFBFetchRequiresEnablePerSample : 1;
644*c8dee2aaSAndroid Build Coastguard Worker     bool fSRGBWriteControl : 1;
645*c8dee2aaSAndroid Build Coastguard Worker     bool fSkipErrorChecks : 1;
646*c8dee2aaSAndroid Build Coastguard Worker     bool fClientCanDisableMultisample : 1;
647*c8dee2aaSAndroid Build Coastguard Worker 
648*c8dee2aaSAndroid Build Coastguard Worker     // Driver workarounds
649*c8dee2aaSAndroid Build Coastguard Worker     bool fDoManualMipmapping : 1;
650*c8dee2aaSAndroid Build Coastguard Worker     bool fClearToBoundaryValuesIsBroken : 1;
651*c8dee2aaSAndroid Build Coastguard Worker     bool fDrawArraysBaseVertexIsBroken : 1;
652*c8dee2aaSAndroid Build Coastguard Worker     bool fDisallowTexSubImageForUnormConfigTexturesEverBoundToFBO : 1;
653*c8dee2aaSAndroid Build Coastguard Worker     bool fUseDrawInsteadOfAllRenderTargetWrites : 1;
654*c8dee2aaSAndroid Build Coastguard Worker     bool fRequiresCullFaceEnableDisableWhenDrawingLinesAfterNonLines : 1;
655*c8dee2aaSAndroid Build Coastguard Worker     bool fDontSetBaseOrMaxLevelForExternalTextures : 1;
656*c8dee2aaSAndroid Build Coastguard Worker     bool fNeverDisableColorWrites : 1;
657*c8dee2aaSAndroid Build Coastguard Worker     bool fMustSetAnyTexParameterToEnableMipmapping : 1;
658*c8dee2aaSAndroid Build Coastguard Worker     bool fAllowBGRA8CopyTexSubImage : 1;
659*c8dee2aaSAndroid Build Coastguard Worker     bool fAllowSRGBCopyTexSubImage : 1;
660*c8dee2aaSAndroid Build Coastguard Worker     bool fDisallowDynamicMSAA : 1;
661*c8dee2aaSAndroid Build Coastguard Worker     bool fMustResetBlendFuncBetweenDualSourceAndDisable : 1;
662*c8dee2aaSAndroid Build Coastguard Worker     bool fBindTexture0WhenChangingTextureFBOMultisampleCount : 1;
663*c8dee2aaSAndroid Build Coastguard Worker     bool fRebindColorAttachmentAfterCheckFramebufferStatus : 1;
664*c8dee2aaSAndroid Build Coastguard Worker     bool fFlushBeforeWritePixels : 1;
665*c8dee2aaSAndroid Build Coastguard Worker     bool fDisableScalingCopyAsDraws : 1;
666*c8dee2aaSAndroid Build Coastguard Worker     bool fPadRG88TransferAlignment : 1;
667*c8dee2aaSAndroid Build Coastguard Worker     int fMaxInstancesPerDrawWithoutCrashing = 0;
668*c8dee2aaSAndroid Build Coastguard Worker 
669*c8dee2aaSAndroid Build Coastguard Worker     uint32_t fBlitFramebufferFlags = kNoSupport_BlitFramebufferFlag;
670*c8dee2aaSAndroid Build Coastguard Worker 
671*c8dee2aaSAndroid Build Coastguard Worker     struct ReadPixelsFormat {
ReadPixelsFormatReadPixelsFormat672*c8dee2aaSAndroid Build Coastguard Worker         ReadPixelsFormat() : fFormat(0), fType(0) {}
673*c8dee2aaSAndroid Build Coastguard Worker         GrGLenum fFormat;
674*c8dee2aaSAndroid Build Coastguard Worker         GrGLenum fType;
675*c8dee2aaSAndroid Build Coastguard Worker     };
676*c8dee2aaSAndroid Build Coastguard Worker 
677*c8dee2aaSAndroid Build Coastguard Worker     /** Number type of the components (with out considering number of bits.) */
678*c8dee2aaSAndroid Build Coastguard Worker     enum class FormatType {
679*c8dee2aaSAndroid Build Coastguard Worker         kUnknown,
680*c8dee2aaSAndroid Build Coastguard Worker         kNormalizedFixedPoint,
681*c8dee2aaSAndroid Build Coastguard Worker         kFloat,
682*c8dee2aaSAndroid Build Coastguard Worker     };
683*c8dee2aaSAndroid Build Coastguard Worker 
684*c8dee2aaSAndroid Build Coastguard Worker     // ColorTypeInfo for a specific format
685*c8dee2aaSAndroid Build Coastguard Worker     struct ColorTypeInfo {
686*c8dee2aaSAndroid Build Coastguard Worker         GrColorType fColorType = GrColorType::kUnknown;
687*c8dee2aaSAndroid Build Coastguard Worker         enum {
688*c8dee2aaSAndroid Build Coastguard Worker             kUploadData_Flag = 0x1,
689*c8dee2aaSAndroid Build Coastguard Worker             // Does Ganesh itself support rendering to this colorType & format pair. Renderability
690*c8dee2aaSAndroid Build Coastguard Worker             // still additionally depends on if the format can be an FBO color attachment.
691*c8dee2aaSAndroid Build Coastguard Worker             kRenderable_Flag = 0x2,
692*c8dee2aaSAndroid Build Coastguard Worker         };
693*c8dee2aaSAndroid Build Coastguard Worker         uint32_t fFlags = 0;
694*c8dee2aaSAndroid Build Coastguard Worker 
695*c8dee2aaSAndroid Build Coastguard Worker         skgpu::Swizzle fReadSwizzle;
696*c8dee2aaSAndroid Build Coastguard Worker         skgpu::Swizzle fWriteSwizzle;
697*c8dee2aaSAndroid Build Coastguard Worker 
698*c8dee2aaSAndroid Build Coastguard Worker         struct ExternalIOFormats {
699*c8dee2aaSAndroid Build Coastguard Worker             GrColorType fColorType = GrColorType::kUnknown;
700*c8dee2aaSAndroid Build Coastguard Worker 
701*c8dee2aaSAndroid Build Coastguard Worker             /** The external format and type are to be used when uploading/downloading data using
702*c8dee2aaSAndroid Build Coastguard Worker                 data of fColorType and uploading to a texture of a given GrGLFormat and its
703*c8dee2aaSAndroid Build Coastguard Worker                 intended GrColorType. The fExternalTexImageFormat is the format to use for TexImage
704*c8dee2aaSAndroid Build Coastguard Worker                 calls. The fExternalReadFormat is used when calling ReadPixels. If either is zero
705*c8dee2aaSAndroid Build Coastguard Worker                 that signals that either TexImage or ReadPixels is not supported for the combination
706*c8dee2aaSAndroid Build Coastguard Worker                 of format and color types. */
707*c8dee2aaSAndroid Build Coastguard Worker             GrGLenum fExternalType = 0;
708*c8dee2aaSAndroid Build Coastguard Worker             GrGLenum fExternalTexImageFormat = 0;
709*c8dee2aaSAndroid Build Coastguard Worker             GrGLenum fExternalReadFormat = 0;
710*c8dee2aaSAndroid Build Coastguard Worker             /**
711*c8dee2aaSAndroid Build Coastguard Worker              * Must check whether GL_IMPLEMENTATION_COLOR_READ_FORMAT and _TYPE match
712*c8dee2aaSAndroid Build Coastguard Worker              * fExternalReadFormat and fExternalType before using with glReadPixels.
713*c8dee2aaSAndroid Build Coastguard Worker              */
714*c8dee2aaSAndroid Build Coastguard Worker             bool fRequiresImplementationReadQuery = false;
715*c8dee2aaSAndroid Build Coastguard Worker         };
716*c8dee2aaSAndroid Build Coastguard Worker 
externalFormatColorTypeInfo717*c8dee2aaSAndroid Build Coastguard Worker         GrGLenum externalFormat(GrColorType externalColorType, ExternalFormatUsage usage,
718*c8dee2aaSAndroid Build Coastguard Worker                                 bool haveQueriedImplementationReadFormat) const {
719*c8dee2aaSAndroid Build Coastguard Worker             for (int i = 0; i < fExternalIOFormatCount; ++i) {
720*c8dee2aaSAndroid Build Coastguard Worker                 if (fExternalIOFormats[i].fColorType == externalColorType) {
721*c8dee2aaSAndroid Build Coastguard Worker                     if (usage == kTexImage_ExternalFormatUsage) {
722*c8dee2aaSAndroid Build Coastguard Worker                         return fExternalIOFormats[i].fExternalTexImageFormat;
723*c8dee2aaSAndroid Build Coastguard Worker                     } else {
724*c8dee2aaSAndroid Build Coastguard Worker                         SkASSERT(usage == kReadPixels_ExternalFormatUsage);
725*c8dee2aaSAndroid Build Coastguard Worker                         if (!haveQueriedImplementationReadFormat &&
726*c8dee2aaSAndroid Build Coastguard Worker                             fExternalIOFormats[i].fRequiresImplementationReadQuery) {
727*c8dee2aaSAndroid Build Coastguard Worker                             return 0;
728*c8dee2aaSAndroid Build Coastguard Worker                         }
729*c8dee2aaSAndroid Build Coastguard Worker                         return fExternalIOFormats[i].fExternalReadFormat;
730*c8dee2aaSAndroid Build Coastguard Worker                     }
731*c8dee2aaSAndroid Build Coastguard Worker                 }
732*c8dee2aaSAndroid Build Coastguard Worker             }
733*c8dee2aaSAndroid Build Coastguard Worker             return 0;
734*c8dee2aaSAndroid Build Coastguard Worker         }
735*c8dee2aaSAndroid Build Coastguard Worker 
externalTypeColorTypeInfo736*c8dee2aaSAndroid Build Coastguard Worker         GrGLenum externalType(GrColorType externalColorType) const {
737*c8dee2aaSAndroid Build Coastguard Worker             for (int i = 0; i < fExternalIOFormatCount; ++i) {
738*c8dee2aaSAndroid Build Coastguard Worker                 if (fExternalIOFormats[i].fColorType == externalColorType) {
739*c8dee2aaSAndroid Build Coastguard Worker                     return fExternalIOFormats[i].fExternalType;
740*c8dee2aaSAndroid Build Coastguard Worker                 }
741*c8dee2aaSAndroid Build Coastguard Worker             }
742*c8dee2aaSAndroid Build Coastguard Worker             return 0;
743*c8dee2aaSAndroid Build Coastguard Worker         }
744*c8dee2aaSAndroid Build Coastguard Worker 
745*c8dee2aaSAndroid Build Coastguard Worker         std::unique_ptr<ExternalIOFormats[]> fExternalIOFormats;
746*c8dee2aaSAndroid Build Coastguard Worker         int fExternalIOFormatCount = 0;
747*c8dee2aaSAndroid Build Coastguard Worker     };
748*c8dee2aaSAndroid Build Coastguard Worker 
749*c8dee2aaSAndroid Build Coastguard Worker     struct FormatInfo {
colorTypeFlagsFormatInfo750*c8dee2aaSAndroid Build Coastguard Worker         uint32_t colorTypeFlags(GrColorType colorType) const {
751*c8dee2aaSAndroid Build Coastguard Worker             for (int i = 0; i < fColorTypeInfoCount; ++i) {
752*c8dee2aaSAndroid Build Coastguard Worker                 if (fColorTypeInfos[i].fColorType == colorType) {
753*c8dee2aaSAndroid Build Coastguard Worker                     return fColorTypeInfos[i].fFlags;
754*c8dee2aaSAndroid Build Coastguard Worker                 }
755*c8dee2aaSAndroid Build Coastguard Worker             }
756*c8dee2aaSAndroid Build Coastguard Worker             return 0;
757*c8dee2aaSAndroid Build Coastguard Worker         }
758*c8dee2aaSAndroid Build Coastguard Worker 
externalFormatFormatInfo759*c8dee2aaSAndroid Build Coastguard Worker         GrGLenum externalFormat(GrColorType surfaceColorType, GrColorType externalColorType,
760*c8dee2aaSAndroid Build Coastguard Worker                                 ExternalFormatUsage usage) const {
761*c8dee2aaSAndroid Build Coastguard Worker             for (int i = 0; i < fColorTypeInfoCount; ++i) {
762*c8dee2aaSAndroid Build Coastguard Worker                 if (fColorTypeInfos[i].fColorType == surfaceColorType) {
763*c8dee2aaSAndroid Build Coastguard Worker                     return fColorTypeInfos[i].externalFormat(externalColorType, usage,
764*c8dee2aaSAndroid Build Coastguard Worker                                                              fHaveQueriedImplementationReadSupport);
765*c8dee2aaSAndroid Build Coastguard Worker                 }
766*c8dee2aaSAndroid Build Coastguard Worker             }
767*c8dee2aaSAndroid Build Coastguard Worker             return 0;
768*c8dee2aaSAndroid Build Coastguard Worker         }
769*c8dee2aaSAndroid Build Coastguard Worker 
externalTypeFormatInfo770*c8dee2aaSAndroid Build Coastguard Worker         GrGLenum externalType(GrColorType surfaceColorType, GrColorType externalColorType) const {
771*c8dee2aaSAndroid Build Coastguard Worker             for (int i = 0; i < fColorTypeInfoCount; ++i) {
772*c8dee2aaSAndroid Build Coastguard Worker                 if (fColorTypeInfos[i].fColorType == surfaceColorType) {
773*c8dee2aaSAndroid Build Coastguard Worker                     return fColorTypeInfos[i].externalType(externalColorType);
774*c8dee2aaSAndroid Build Coastguard Worker                 }
775*c8dee2aaSAndroid Build Coastguard Worker             }
776*c8dee2aaSAndroid Build Coastguard Worker             return 0;
777*c8dee2aaSAndroid Build Coastguard Worker         }
778*c8dee2aaSAndroid Build Coastguard Worker 
779*c8dee2aaSAndroid Build Coastguard Worker         enum {
780*c8dee2aaSAndroid Build Coastguard Worker             kTexturable_Flag                 = 0x01,
781*c8dee2aaSAndroid Build Coastguard Worker             /** kFBOColorAttachment means that even if the format cannot be a GrRenderTarget, we can
782*c8dee2aaSAndroid Build Coastguard Worker                 still attach it to a FBO for blitting or reading pixels. */
783*c8dee2aaSAndroid Build Coastguard Worker             kFBOColorAttachment_Flag         = 0x02,
784*c8dee2aaSAndroid Build Coastguard Worker             kFBOColorAttachmentWithMSAA_Flag = 0x04,
785*c8dee2aaSAndroid Build Coastguard Worker             kUseTexStorage_Flag              = 0x08,
786*c8dee2aaSAndroid Build Coastguard Worker             /**
787*c8dee2aaSAndroid Build Coastguard Worker              * Are pixel buffer objects supported in/out of this format? Ignored if PBOs are not
788*c8dee2aaSAndroid Build Coastguard Worker              * supported at all.
789*c8dee2aaSAndroid Build Coastguard Worker              */
790*c8dee2aaSAndroid Build Coastguard Worker             kTransfers_Flag                  = 0x10,
791*c8dee2aaSAndroid Build Coastguard Worker         };
792*c8dee2aaSAndroid Build Coastguard Worker         uint32_t fFlags = 0;
793*c8dee2aaSAndroid Build Coastguard Worker 
794*c8dee2aaSAndroid Build Coastguard Worker         FormatType fFormatType = FormatType::kUnknown;
795*c8dee2aaSAndroid Build Coastguard Worker 
796*c8dee2aaSAndroid Build Coastguard Worker         // Not defined for uncompressed formats. Passed to glCompressedTexImage...
797*c8dee2aaSAndroid Build Coastguard Worker         GrGLenum fCompressedInternalFormat = 0;
798*c8dee2aaSAndroid Build Coastguard Worker 
799*c8dee2aaSAndroid Build Coastguard Worker         // Value to uses as the "internalformat" argument to glTexImage or glTexStorage. It is
800*c8dee2aaSAndroid Build Coastguard Worker         // initialized in coordination with the presence/absence of the kUseTexStorage flag. In
801*c8dee2aaSAndroid Build Coastguard Worker         // other words, it is only guaranteed to be compatible with glTexImage if the flag is not
802*c8dee2aaSAndroid Build Coastguard Worker         // set and or with glTexStorage if the flag is set.
803*c8dee2aaSAndroid Build Coastguard Worker         GrGLenum fInternalFormatForTexImageOrStorage = 0;
804*c8dee2aaSAndroid Build Coastguard Worker 
805*c8dee2aaSAndroid Build Coastguard Worker         // Value to uses as the "internalformat" argument to glRenderbufferStorageMultisample...
806*c8dee2aaSAndroid Build Coastguard Worker         GrGLenum fInternalFormatForRenderbuffer = 0;
807*c8dee2aaSAndroid Build Coastguard Worker 
808*c8dee2aaSAndroid Build Coastguard Worker         // Default values to use along with fInternalFormatForTexImageOrStorage for function
809*c8dee2aaSAndroid Build Coastguard Worker         // glTexImage2D when not input providing data (passing nullptr) or when clearing it by
810*c8dee2aaSAndroid Build Coastguard Worker         // uploading a block of solid color data. Not defined for compressed formats.
811*c8dee2aaSAndroid Build Coastguard Worker         GrGLenum fDefaultExternalFormat = 0;
812*c8dee2aaSAndroid Build Coastguard Worker         GrGLenum fDefaultExternalType = 0;
813*c8dee2aaSAndroid Build Coastguard Worker         // When the above two values are used to initialize a texture by uploading cleared data to
814*c8dee2aaSAndroid Build Coastguard Worker         // it the data should be of this color type.
815*c8dee2aaSAndroid Build Coastguard Worker         GrColorType fDefaultColorType = GrColorType::kUnknown;
816*c8dee2aaSAndroid Build Coastguard Worker 
817*c8dee2aaSAndroid Build Coastguard Worker         bool fHaveQueriedImplementationReadSupport = false;
818*c8dee2aaSAndroid Build Coastguard Worker 
819*c8dee2aaSAndroid Build Coastguard Worker         // This indicates that a stencil format has not yet been determined for the config.
820*c8dee2aaSAndroid Build Coastguard Worker         static constexpr int kUnknown_StencilIndex = -1;
821*c8dee2aaSAndroid Build Coastguard Worker         // This indicates that there is no supported stencil format for the config.
822*c8dee2aaSAndroid Build Coastguard Worker         static constexpr int kUnsupported_StencilFormatIndex = -2;
823*c8dee2aaSAndroid Build Coastguard Worker 
824*c8dee2aaSAndroid Build Coastguard Worker         // Index fStencilFormats.
825*c8dee2aaSAndroid Build Coastguard Worker         int fStencilFormatIndex = kUnknown_StencilIndex;
826*c8dee2aaSAndroid Build Coastguard Worker 
827*c8dee2aaSAndroid Build Coastguard Worker         SkTDArray<int> fColorSampleCounts;
828*c8dee2aaSAndroid Build Coastguard Worker 
829*c8dee2aaSAndroid Build Coastguard Worker         std::unique_ptr<ColorTypeInfo[]> fColorTypeInfos;
830*c8dee2aaSAndroid Build Coastguard Worker         int fColorTypeInfoCount = 0;
831*c8dee2aaSAndroid Build Coastguard Worker     };
832*c8dee2aaSAndroid Build Coastguard Worker 
833*c8dee2aaSAndroid Build Coastguard Worker     FormatInfo fFormatTable[kGrGLColorFormatCount];
834*c8dee2aaSAndroid Build Coastguard Worker 
getFormatInfo(GrGLFormat format)835*c8dee2aaSAndroid Build Coastguard Worker     FormatInfo& getFormatInfo(GrGLFormat format) { return fFormatTable[static_cast<int>(format)]; }
getFormatInfo(GrGLFormat format)836*c8dee2aaSAndroid Build Coastguard Worker     const FormatInfo& getFormatInfo(GrGLFormat format) const {
837*c8dee2aaSAndroid Build Coastguard Worker         return fFormatTable[static_cast<int>(format)];
838*c8dee2aaSAndroid Build Coastguard Worker     }
839*c8dee2aaSAndroid Build Coastguard Worker 
840*c8dee2aaSAndroid Build Coastguard Worker     GrGLFormat fColorTypeToFormatTable[kGrColorTypeCnt];
841*c8dee2aaSAndroid Build Coastguard Worker     void setColorTypeFormat(GrColorType, GrGLFormat);
842*c8dee2aaSAndroid Build Coastguard Worker 
843*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = GrCaps;
844*c8dee2aaSAndroid Build Coastguard Worker };
845*c8dee2aaSAndroid Build Coastguard Worker 
846*c8dee2aaSAndroid Build Coastguard Worker #endif
847