1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 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 #ifndef GrMockCaps_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrMockCaps_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTextureCompressionType.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/mock/GrMockTypes.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMath.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/GrShaderCaps.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurface.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h" 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker #include <algorithm> 27*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 28*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 29*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker class GrProgramInfo; 32*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTarget; 33*c8dee2aaSAndroid Build Coastguard Worker namespace GrTest { struct TestFormatColorTypeCombination; } 34*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions; 35*c8dee2aaSAndroid Build Coastguard Worker struct SkIRect; 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker class GrMockCaps : public GrCaps { 38*c8dee2aaSAndroid Build Coastguard Worker public: GrMockCaps(const GrContextOptions & contextOptions,const GrMockOptions & options)39*c8dee2aaSAndroid Build Coastguard Worker GrMockCaps(const GrContextOptions& contextOptions, const GrMockOptions& options) 40*c8dee2aaSAndroid Build Coastguard Worker : INHERITED(contextOptions), fOptions(options) { 41*c8dee2aaSAndroid Build Coastguard Worker fMipmapSupport = options.fMipmapSupport; 42*c8dee2aaSAndroid Build Coastguard Worker fDrawInstancedSupport = options.fDrawInstancedSupport; 43*c8dee2aaSAndroid Build Coastguard Worker fHalfFloatVertexAttributeSupport = options.fHalfFloatVertexAttributeSupport; 44*c8dee2aaSAndroid Build Coastguard Worker fMapBufferFlags = options.fMapBufferFlags; 45*c8dee2aaSAndroid Build Coastguard Worker fBufferMapThreshold = SK_MaxS32; // Overridable in GrContextOptions. 46*c8dee2aaSAndroid Build Coastguard Worker fMaxTextureSize = options.fMaxTextureSize; 47*c8dee2aaSAndroid Build Coastguard Worker fMaxWindowRectangles = options.fMaxWindowRectangles; 48*c8dee2aaSAndroid Build Coastguard Worker fMaxRenderTargetSize = std::min(options.fMaxRenderTargetSize, fMaxTextureSize); 49*c8dee2aaSAndroid Build Coastguard Worker fMaxPreferredRenderTargetSize = fMaxRenderTargetSize; 50*c8dee2aaSAndroid Build Coastguard Worker fMaxVertexAttributes = options.fMaxVertexAttributes; 51*c8dee2aaSAndroid Build Coastguard Worker fSampleLocationsSupport = true; 52*c8dee2aaSAndroid Build Coastguard Worker fSupportsProtectedContent = true; 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker fShaderCaps = std::make_unique<GrShaderCaps>(); 55*c8dee2aaSAndroid Build Coastguard Worker fShaderCaps->fIntegerSupport = options.fIntegerSupport; 56*c8dee2aaSAndroid Build Coastguard Worker fShaderCaps->fFlatInterpolationSupport = options.fFlatInterpolationSupport; 57*c8dee2aaSAndroid Build Coastguard Worker fShaderCaps->fMaxFragmentSamplers = options.fMaxFragmentSamplers; 58*c8dee2aaSAndroid Build Coastguard Worker fShaderCaps->fShaderDerivativeSupport = options.fShaderDerivativeSupport; 59*c8dee2aaSAndroid Build Coastguard Worker fShaderCaps->fDualSourceBlendingSupport = options.fDualSourceBlendingSupport; 60*c8dee2aaSAndroid Build Coastguard Worker fShaderCaps->fSampleMaskSupport = true; 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker this->finishInitialization(contextOptions); 63*c8dee2aaSAndroid Build Coastguard Worker } 64*c8dee2aaSAndroid Build Coastguard Worker isFormatSRGB(const GrBackendFormat & format)65*c8dee2aaSAndroid Build Coastguard Worker bool isFormatSRGB(const GrBackendFormat& format) const override { 66*c8dee2aaSAndroid Build Coastguard Worker SkTextureCompressionType compression = format.asMockCompressionType(); 67*c8dee2aaSAndroid Build Coastguard Worker if (compression != SkTextureCompressionType::kNone) { 68*c8dee2aaSAndroid Build Coastguard Worker return false; 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker auto ct = format.asMockColorType(); 72*c8dee2aaSAndroid Build Coastguard Worker return GrGetColorTypeDesc(ct).encoding() == GrColorTypeEncoding::kSRGBUnorm; 73*c8dee2aaSAndroid Build Coastguard Worker } 74*c8dee2aaSAndroid Build Coastguard Worker isFormatTexturable(const GrBackendFormat & format,GrTextureType)75*c8dee2aaSAndroid Build Coastguard Worker bool isFormatTexturable(const GrBackendFormat& format, GrTextureType) const override { 76*c8dee2aaSAndroid Build Coastguard Worker SkTextureCompressionType compression = format.asMockCompressionType(); 77*c8dee2aaSAndroid Build Coastguard Worker if (compression != SkTextureCompressionType::kNone) { 78*c8dee2aaSAndroid Build Coastguard Worker return fOptions.fCompressedOptions[(int)compression].fTexturable; 79*c8dee2aaSAndroid Build Coastguard Worker } 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker auto index = static_cast<int>(format.asMockColorType()); 82*c8dee2aaSAndroid Build Coastguard Worker return fOptions.fConfigOptions[index].fTexturable; 83*c8dee2aaSAndroid Build Coastguard Worker } 84*c8dee2aaSAndroid Build Coastguard Worker isFormatCopyable(const GrBackendFormat & format)85*c8dee2aaSAndroid Build Coastguard Worker bool isFormatCopyable(const GrBackendFormat& format) const override { 86*c8dee2aaSAndroid Build Coastguard Worker return false; 87*c8dee2aaSAndroid Build Coastguard Worker } 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker bool isFormatAsColorTypeRenderable(GrColorType ct, const GrBackendFormat& format, 90*c8dee2aaSAndroid Build Coastguard Worker int sampleCount = 1) const override { 91*c8dee2aaSAndroid Build Coastguard Worker // Currently we don't allow RGB_888X, RGB_F16F16F16x, or RGB_101010x to 92*c8dee2aaSAndroid Build Coastguard Worker // be renderable because we don't have a way to handle blends that 93*c8dee2aaSAndroid Build Coastguard Worker // reference dst alpha when the values in the dst alpha channel are uninitialized. 94*c8dee2aaSAndroid Build Coastguard Worker if (ct == GrColorType::kRGB_888x || 95*c8dee2aaSAndroid Build Coastguard Worker ct == GrColorType::kRGB_F16F16F16x || 96*c8dee2aaSAndroid Build Coastguard Worker ct == GrColorType::kRGB_101010x) { 97*c8dee2aaSAndroid Build Coastguard Worker return false; 98*c8dee2aaSAndroid Build Coastguard Worker } 99*c8dee2aaSAndroid Build Coastguard Worker return this->isFormatRenderable(format, sampleCount); 100*c8dee2aaSAndroid Build Coastguard Worker } 101*c8dee2aaSAndroid Build Coastguard Worker isFormatRenderable(const GrBackendFormat & format,int sampleCount)102*c8dee2aaSAndroid Build Coastguard Worker bool isFormatRenderable(const GrBackendFormat& format, int sampleCount) const override { 103*c8dee2aaSAndroid Build Coastguard Worker if (format.asMockCompressionType() != SkTextureCompressionType::kNone) { 104*c8dee2aaSAndroid Build Coastguard Worker return false; // compressed formats are never renderable 105*c8dee2aaSAndroid Build Coastguard Worker } 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker return sampleCount <= this->maxRenderTargetSampleCount(format.asMockColorType()); 108*c8dee2aaSAndroid Build Coastguard Worker } 109*c8dee2aaSAndroid Build Coastguard Worker 110*c8dee2aaSAndroid Build Coastguard Worker int getRenderTargetSampleCount(int requestCount, GrColorType) const; 111*c8dee2aaSAndroid Build Coastguard Worker getRenderTargetSampleCount(int requestCount,const GrBackendFormat & format)112*c8dee2aaSAndroid Build Coastguard Worker int getRenderTargetSampleCount(int requestCount, 113*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& format) const override { 114*c8dee2aaSAndroid Build Coastguard Worker SkTextureCompressionType compression = format.asMockCompressionType(); 115*c8dee2aaSAndroid Build Coastguard Worker if (compression != SkTextureCompressionType::kNone) { 116*c8dee2aaSAndroid Build Coastguard Worker return 0; // no compressed format is renderable 117*c8dee2aaSAndroid Build Coastguard Worker } 118*c8dee2aaSAndroid Build Coastguard Worker 119*c8dee2aaSAndroid Build Coastguard Worker return this->getRenderTargetSampleCount(requestCount, format.asMockColorType()); 120*c8dee2aaSAndroid Build Coastguard Worker } 121*c8dee2aaSAndroid Build Coastguard Worker maxRenderTargetSampleCount(GrColorType ct)122*c8dee2aaSAndroid Build Coastguard Worker int maxRenderTargetSampleCount(GrColorType ct) const { 123*c8dee2aaSAndroid Build Coastguard Worker switch (fOptions.fConfigOptions[(int)ct].fRenderability) { 124*c8dee2aaSAndroid Build Coastguard Worker case GrMockOptions::ConfigOptions::Renderability::kNo: 125*c8dee2aaSAndroid Build Coastguard Worker return 0; 126*c8dee2aaSAndroid Build Coastguard Worker case GrMockOptions::ConfigOptions::Renderability::kNonMSAA: 127*c8dee2aaSAndroid Build Coastguard Worker return 1; 128*c8dee2aaSAndroid Build Coastguard Worker case GrMockOptions::ConfigOptions::Renderability::kMSAA: 129*c8dee2aaSAndroid Build Coastguard Worker return kMaxSampleCnt; 130*c8dee2aaSAndroid Build Coastguard Worker } 131*c8dee2aaSAndroid Build Coastguard Worker return 0; 132*c8dee2aaSAndroid Build Coastguard Worker } 133*c8dee2aaSAndroid Build Coastguard Worker maxRenderTargetSampleCount(const GrBackendFormat & format)134*c8dee2aaSAndroid Build Coastguard Worker int maxRenderTargetSampleCount(const GrBackendFormat& format) const override { 135*c8dee2aaSAndroid Build Coastguard Worker SkTextureCompressionType compression = format.asMockCompressionType(); 136*c8dee2aaSAndroid Build Coastguard Worker if (compression != SkTextureCompressionType::kNone) { 137*c8dee2aaSAndroid Build Coastguard Worker return 0; // no compressed format is renderable 138*c8dee2aaSAndroid Build Coastguard Worker } 139*c8dee2aaSAndroid Build Coastguard Worker 140*c8dee2aaSAndroid Build Coastguard Worker return this->maxRenderTargetSampleCount(format.asMockColorType()); 141*c8dee2aaSAndroid Build Coastguard Worker } 142*c8dee2aaSAndroid Build Coastguard Worker supportedWritePixelsColorType(GrColorType surfaceColorType,const GrBackendFormat & surfaceFormat,GrColorType srcColorType)143*c8dee2aaSAndroid Build Coastguard Worker SupportedWrite supportedWritePixelsColorType(GrColorType surfaceColorType, 144*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& surfaceFormat, 145*c8dee2aaSAndroid Build Coastguard Worker GrColorType srcColorType) const override { 146*c8dee2aaSAndroid Build Coastguard Worker return {surfaceColorType, 1}; 147*c8dee2aaSAndroid Build Coastguard Worker } 148*c8dee2aaSAndroid Build Coastguard Worker surfaceSupportsReadPixels(const GrSurface * surface)149*c8dee2aaSAndroid Build Coastguard Worker SurfaceReadPixelsSupport surfaceSupportsReadPixels(const GrSurface* surface) const override { 150*c8dee2aaSAndroid Build Coastguard Worker return surface->isProtected() ? SurfaceReadPixelsSupport::kUnsupported 151*c8dee2aaSAndroid Build Coastguard Worker : SurfaceReadPixelsSupport::kSupported; 152*c8dee2aaSAndroid Build Coastguard Worker } 153*c8dee2aaSAndroid Build Coastguard Worker getBackendFormatFromCompressionType(SkTextureCompressionType)154*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat getBackendFormatFromCompressionType(SkTextureCompressionType) const override { 155*c8dee2aaSAndroid Build Coastguard Worker return {}; 156*c8dee2aaSAndroid Build Coastguard Worker } 157*c8dee2aaSAndroid Build Coastguard Worker getWriteSwizzle(const GrBackendFormat & format,GrColorType ct)158*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle getWriteSwizzle(const GrBackendFormat& format, GrColorType ct) const override { 159*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->areColorTypeAndFormatCompatible(ct, format)); 160*c8dee2aaSAndroid Build Coastguard Worker return skgpu::Swizzle("rgba"); 161*c8dee2aaSAndroid Build Coastguard Worker } 162*c8dee2aaSAndroid Build Coastguard Worker 163*c8dee2aaSAndroid Build Coastguard Worker uint64_t computeFormatKey(const GrBackendFormat&) const override; 164*c8dee2aaSAndroid Build Coastguard Worker 165*c8dee2aaSAndroid Build Coastguard Worker GrProgramDesc makeDesc(GrRenderTarget*, 166*c8dee2aaSAndroid Build Coastguard Worker const GrProgramInfo&, 167*c8dee2aaSAndroid Build Coastguard Worker ProgramDescOverrideFlags) const override; 168*c8dee2aaSAndroid Build Coastguard Worker 169*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) 170*c8dee2aaSAndroid Build Coastguard Worker std::vector<GrTest::TestFormatColorTypeCombination> getTestingCombinations() const override; 171*c8dee2aaSAndroid Build Coastguard Worker #endif 172*c8dee2aaSAndroid Build Coastguard Worker 173*c8dee2aaSAndroid Build Coastguard Worker private: onSurfaceSupportsWritePixels(const GrSurface *)174*c8dee2aaSAndroid Build Coastguard Worker bool onSurfaceSupportsWritePixels(const GrSurface*) const override { return true; } onCanCopySurface(const GrSurfaceProxy * dst,const SkIRect & dstRect,const GrSurfaceProxy * src,const SkIRect & srcRect)175*c8dee2aaSAndroid Build Coastguard Worker bool onCanCopySurface(const GrSurfaceProxy* dst, const SkIRect& dstRect, 176*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxy* src, const SkIRect& srcRect) const override { 177*c8dee2aaSAndroid Build Coastguard Worker if (src->isProtected() == GrProtected::kYes && dst->isProtected() != GrProtected::kYes) { 178*c8dee2aaSAndroid Build Coastguard Worker return false; 179*c8dee2aaSAndroid Build Coastguard Worker } 180*c8dee2aaSAndroid Build Coastguard Worker return true; 181*c8dee2aaSAndroid Build Coastguard Worker } onGetDefaultBackendFormat(GrColorType ct)182*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat onGetDefaultBackendFormat(GrColorType ct) const override { 183*c8dee2aaSAndroid Build Coastguard Worker return GrBackendFormat::MakeMock(ct, SkTextureCompressionType::kNone); 184*c8dee2aaSAndroid Build Coastguard Worker } 185*c8dee2aaSAndroid Build Coastguard Worker onAreColorTypeAndFormatCompatible(GrColorType ct,const GrBackendFormat & format)186*c8dee2aaSAndroid Build Coastguard Worker bool onAreColorTypeAndFormatCompatible(GrColorType ct, 187*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& format) const override { 188*c8dee2aaSAndroid Build Coastguard Worker if (ct == GrColorType::kUnknown) { 189*c8dee2aaSAndroid Build Coastguard Worker return false; 190*c8dee2aaSAndroid Build Coastguard Worker } 191*c8dee2aaSAndroid Build Coastguard Worker 192*c8dee2aaSAndroid Build Coastguard Worker SkTextureCompressionType compression = format.asMockCompressionType(); 193*c8dee2aaSAndroid Build Coastguard Worker if (compression == SkTextureCompressionType::kETC2_RGB8_UNORM || 194*c8dee2aaSAndroid Build Coastguard Worker compression == SkTextureCompressionType::kBC1_RGB8_UNORM) { 195*c8dee2aaSAndroid Build Coastguard Worker return ct == GrColorType::kRGB_888x; // TODO: this may be too restrictive 196*c8dee2aaSAndroid Build Coastguard Worker } 197*c8dee2aaSAndroid Build Coastguard Worker if (compression == SkTextureCompressionType::kBC1_RGBA8_UNORM) { 198*c8dee2aaSAndroid Build Coastguard Worker return ct == GrColorType::kRGBA_8888; 199*c8dee2aaSAndroid Build Coastguard Worker } 200*c8dee2aaSAndroid Build Coastguard Worker 201*c8dee2aaSAndroid Build Coastguard Worker return ct == format.asMockColorType(); 202*c8dee2aaSAndroid Build Coastguard Worker } 203*c8dee2aaSAndroid Build Coastguard Worker onSupportedReadPixelsColorType(GrColorType srcColorType,const GrBackendFormat &,GrColorType)204*c8dee2aaSAndroid Build Coastguard Worker SupportedRead onSupportedReadPixelsColorType(GrColorType srcColorType, const GrBackendFormat&, 205*c8dee2aaSAndroid Build Coastguard Worker GrColorType) const override { 206*c8dee2aaSAndroid Build Coastguard Worker return SupportedRead{srcColorType, 1}; 207*c8dee2aaSAndroid Build Coastguard Worker } 208*c8dee2aaSAndroid Build Coastguard Worker onGetReadSwizzle(const GrBackendFormat & format,GrColorType ct)209*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle onGetReadSwizzle(const GrBackendFormat& format, GrColorType ct) const override { 210*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->areColorTypeAndFormatCompatible(ct, format)); 211*c8dee2aaSAndroid Build Coastguard Worker return skgpu::Swizzle("rgba"); 212*c8dee2aaSAndroid Build Coastguard Worker } 213*c8dee2aaSAndroid Build Coastguard Worker 214*c8dee2aaSAndroid Build Coastguard Worker static const int kMaxSampleCnt = 16; 215*c8dee2aaSAndroid Build Coastguard Worker 216*c8dee2aaSAndroid Build Coastguard Worker GrMockOptions fOptions; 217*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GrCaps; 218*c8dee2aaSAndroid Build Coastguard Worker }; 219*c8dee2aaSAndroid Build Coastguard Worker 220*c8dee2aaSAndroid Build Coastguard Worker #endif 221