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