xref: /aosp_15_r20/external/skia/src/gpu/ganesh/mock/GrMockCaps.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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