xref: /aosp_15_r20/external/skia/src/gpu/ganesh/mock/GrMockGpu.cpp (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 #include "src/gpu/ganesh/mock/GrMockGpu.h"
8*c8dee2aaSAndroid Build Coastguard Worker 
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMath.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuBuffer.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTarget.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTexture.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrThreadSafePipelineBuilder.h"  // IWYU pragma: keep
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mock/GrMockAttachment.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mock/GrMockBuffer.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mock/GrMockCaps.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mock/GrMockOpsRenderPass.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/mock/GrMockTexture.h"
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker #include <atomic>
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private;
26*c8dee2aaSAndroid Build Coastguard Worker 
NextInternalTextureID()27*c8dee2aaSAndroid Build Coastguard Worker int GrMockGpu::NextInternalTextureID() {
28*c8dee2aaSAndroid Build Coastguard Worker     static std::atomic<int> nextID{1};
29*c8dee2aaSAndroid Build Coastguard Worker     int id;
30*c8dee2aaSAndroid Build Coastguard Worker     do {
31*c8dee2aaSAndroid Build Coastguard Worker         id = nextID.fetch_add(1, std::memory_order_relaxed);
32*c8dee2aaSAndroid Build Coastguard Worker     } while (0 == id);  // Reserve 0 for an invalid ID.
33*c8dee2aaSAndroid Build Coastguard Worker     return id;
34*c8dee2aaSAndroid Build Coastguard Worker }
35*c8dee2aaSAndroid Build Coastguard Worker 
NextExternalTextureID()36*c8dee2aaSAndroid Build Coastguard Worker int GrMockGpu::NextExternalTextureID() {
37*c8dee2aaSAndroid Build Coastguard Worker     // We use negative ints for the "testing only external textures" so they can easily be
38*c8dee2aaSAndroid Build Coastguard Worker     // identified when debugging.
39*c8dee2aaSAndroid Build Coastguard Worker     static std::atomic<int> nextID{-1};
40*c8dee2aaSAndroid Build Coastguard Worker     return nextID.fetch_add(-1, std::memory_order_relaxed);
41*c8dee2aaSAndroid Build Coastguard Worker }
42*c8dee2aaSAndroid Build Coastguard Worker 
NextInternalRenderTargetID()43*c8dee2aaSAndroid Build Coastguard Worker int GrMockGpu::NextInternalRenderTargetID() {
44*c8dee2aaSAndroid Build Coastguard Worker     // We start off with large numbers to differentiate from texture IDs, even though they're
45*c8dee2aaSAndroid Build Coastguard Worker     // technically in a different space.
46*c8dee2aaSAndroid Build Coastguard Worker     static std::atomic<int> nextID{SK_MaxS32};
47*c8dee2aaSAndroid Build Coastguard Worker     return nextID.fetch_add(-1, std::memory_order_relaxed);
48*c8dee2aaSAndroid Build Coastguard Worker }
49*c8dee2aaSAndroid Build Coastguard Worker 
NextExternalRenderTargetID()50*c8dee2aaSAndroid Build Coastguard Worker int GrMockGpu::NextExternalRenderTargetID() {
51*c8dee2aaSAndroid Build Coastguard Worker     // We use large negative ints for the "testing only external render targets" so they can easily
52*c8dee2aaSAndroid Build Coastguard Worker     // be identified when debugging.
53*c8dee2aaSAndroid Build Coastguard Worker     static std::atomic<int> nextID{SK_MinS32};
54*c8dee2aaSAndroid Build Coastguard Worker     return nextID.fetch_add(1, std::memory_order_relaxed);
55*c8dee2aaSAndroid Build Coastguard Worker }
56*c8dee2aaSAndroid Build Coastguard Worker 
Make(const GrMockOptions * mockOptions,const GrContextOptions & contextOptions,GrDirectContext * direct)57*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrGpu> GrMockGpu::Make(const GrMockOptions* mockOptions,
58*c8dee2aaSAndroid Build Coastguard Worker                                        const GrContextOptions& contextOptions,
59*c8dee2aaSAndroid Build Coastguard Worker                                        GrDirectContext* direct) {
60*c8dee2aaSAndroid Build Coastguard Worker     static const GrMockOptions kDefaultOptions = GrMockOptions();
61*c8dee2aaSAndroid Build Coastguard Worker     if (!mockOptions) {
62*c8dee2aaSAndroid Build Coastguard Worker         mockOptions = &kDefaultOptions;
63*c8dee2aaSAndroid Build Coastguard Worker     }
64*c8dee2aaSAndroid Build Coastguard Worker     return std::unique_ptr<GrGpu>(new GrMockGpu(direct, *mockOptions, contextOptions));
65*c8dee2aaSAndroid Build Coastguard Worker }
66*c8dee2aaSAndroid Build Coastguard Worker 
onGetOpsRenderPass(GrRenderTarget * rt,bool,GrAttachment *,GrSurfaceOrigin origin,const SkIRect & bounds,const GrOpsRenderPass::LoadAndStoreInfo & colorInfo,const GrOpsRenderPass::StencilLoadAndStoreInfo &,const TArray<GrSurfaceProxy *,true> & sampledProxies,GrXferBarrierFlags renderPassXferBarriers)67*c8dee2aaSAndroid Build Coastguard Worker GrOpsRenderPass* GrMockGpu::onGetOpsRenderPass(GrRenderTarget* rt,
68*c8dee2aaSAndroid Build Coastguard Worker                                                bool /*useMSAASurface*/,
69*c8dee2aaSAndroid Build Coastguard Worker                                                GrAttachment*,
70*c8dee2aaSAndroid Build Coastguard Worker                                                GrSurfaceOrigin origin,
71*c8dee2aaSAndroid Build Coastguard Worker                                                const SkIRect& bounds,
72*c8dee2aaSAndroid Build Coastguard Worker                                                const GrOpsRenderPass::LoadAndStoreInfo& colorInfo,
73*c8dee2aaSAndroid Build Coastguard Worker                                                const GrOpsRenderPass::StencilLoadAndStoreInfo&,
74*c8dee2aaSAndroid Build Coastguard Worker                                                const TArray<GrSurfaceProxy*,true>& sampledProxies,
75*c8dee2aaSAndroid Build Coastguard Worker                                                GrXferBarrierFlags renderPassXferBarriers) {
76*c8dee2aaSAndroid Build Coastguard Worker     return new GrMockOpsRenderPass(this, rt, origin, colorInfo);
77*c8dee2aaSAndroid Build Coastguard Worker }
78*c8dee2aaSAndroid Build Coastguard Worker 
submit(GrOpsRenderPass * renderPass)79*c8dee2aaSAndroid Build Coastguard Worker void GrMockGpu::submit(GrOpsRenderPass* renderPass) {
80*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < static_cast<GrMockOpsRenderPass*>(renderPass)->numDraws(); ++i) {
81*c8dee2aaSAndroid Build Coastguard Worker         fStats.incNumDraws();
82*c8dee2aaSAndroid Build Coastguard Worker     }
83*c8dee2aaSAndroid Build Coastguard Worker     delete renderPass;
84*c8dee2aaSAndroid Build Coastguard Worker }
85*c8dee2aaSAndroid Build Coastguard Worker 
GrMockGpu(GrDirectContext * direct,const GrMockOptions & options,const GrContextOptions & contextOptions)86*c8dee2aaSAndroid Build Coastguard Worker GrMockGpu::GrMockGpu(GrDirectContext* direct, const GrMockOptions& options,
87*c8dee2aaSAndroid Build Coastguard Worker                      const GrContextOptions& contextOptions)
88*c8dee2aaSAndroid Build Coastguard Worker         : INHERITED(direct)
89*c8dee2aaSAndroid Build Coastguard Worker         , fMockOptions(options) {
90*c8dee2aaSAndroid Build Coastguard Worker     this->initCaps(sk_make_sp<GrMockCaps>(contextOptions, options));
91*c8dee2aaSAndroid Build Coastguard Worker }
92*c8dee2aaSAndroid Build Coastguard Worker 
~GrMockGpu()93*c8dee2aaSAndroid Build Coastguard Worker GrMockGpu::~GrMockGpu() {}
94*c8dee2aaSAndroid Build Coastguard Worker 
pipelineBuilder()95*c8dee2aaSAndroid Build Coastguard Worker GrThreadSafePipelineBuilder* GrMockGpu::pipelineBuilder() {
96*c8dee2aaSAndroid Build Coastguard Worker     return nullptr;
97*c8dee2aaSAndroid Build Coastguard Worker }
98*c8dee2aaSAndroid Build Coastguard Worker 
refPipelineBuilder()99*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrThreadSafePipelineBuilder> GrMockGpu::refPipelineBuilder() {
100*c8dee2aaSAndroid Build Coastguard Worker     return nullptr;
101*c8dee2aaSAndroid Build Coastguard Worker }
102*c8dee2aaSAndroid Build Coastguard Worker 
onCreateTexture(SkISize dimensions,const GrBackendFormat & format,GrRenderable renderable,int renderTargetSampleCnt,skgpu::Budgeted budgeted,GrProtected isProtected,int mipLevelCount,uint32_t levelClearMask,std::string_view label)103*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTexture> GrMockGpu::onCreateTexture(SkISize dimensions,
104*c8dee2aaSAndroid Build Coastguard Worker                                             const GrBackendFormat& format,
105*c8dee2aaSAndroid Build Coastguard Worker                                             GrRenderable renderable,
106*c8dee2aaSAndroid Build Coastguard Worker                                             int renderTargetSampleCnt,
107*c8dee2aaSAndroid Build Coastguard Worker                                             skgpu::Budgeted budgeted,
108*c8dee2aaSAndroid Build Coastguard Worker                                             GrProtected isProtected,
109*c8dee2aaSAndroid Build Coastguard Worker                                             int mipLevelCount,
110*c8dee2aaSAndroid Build Coastguard Worker                                             uint32_t levelClearMask,
111*c8dee2aaSAndroid Build Coastguard Worker                                             std::string_view label) {
112*c8dee2aaSAndroid Build Coastguard Worker     if (fMockOptions.fFailTextureAllocations) {
113*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
114*c8dee2aaSAndroid Build Coastguard Worker     }
115*c8dee2aaSAndroid Build Coastguard Worker 
116*c8dee2aaSAndroid Build Coastguard Worker     // Compressed formats should go through onCreateCompressedTexture
117*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(format.asMockCompressionType() == SkTextureCompressionType::kNone);
118*c8dee2aaSAndroid Build Coastguard Worker 
119*c8dee2aaSAndroid Build Coastguard Worker     GrColorType ct = format.asMockColorType();
120*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(ct != GrColorType::kUnknown);
121*c8dee2aaSAndroid Build Coastguard Worker 
122*c8dee2aaSAndroid Build Coastguard Worker     GrMipmapStatus mipmapStatus =
123*c8dee2aaSAndroid Build Coastguard Worker             mipLevelCount > 1 ? GrMipmapStatus::kDirty : GrMipmapStatus::kNotAllocated;
124*c8dee2aaSAndroid Build Coastguard Worker     GrMockTextureInfo texInfo(ct, SkTextureCompressionType::kNone, NextInternalTextureID(),
125*c8dee2aaSAndroid Build Coastguard Worker                               isProtected);
126*c8dee2aaSAndroid Build Coastguard Worker     if (renderable == GrRenderable::kYes) {
127*c8dee2aaSAndroid Build Coastguard Worker         GrMockRenderTargetInfo rtInfo(ct, NextInternalRenderTargetID(), isProtected);
128*c8dee2aaSAndroid Build Coastguard Worker         return sk_sp<GrTexture>(new GrMockTextureRenderTarget(this, budgeted, dimensions,
129*c8dee2aaSAndroid Build Coastguard Worker                                                               renderTargetSampleCnt,
130*c8dee2aaSAndroid Build Coastguard Worker                                                               mipmapStatus,
131*c8dee2aaSAndroid Build Coastguard Worker                                                               texInfo,
132*c8dee2aaSAndroid Build Coastguard Worker                                                               rtInfo,
133*c8dee2aaSAndroid Build Coastguard Worker                                                               label));
134*c8dee2aaSAndroid Build Coastguard Worker     }
135*c8dee2aaSAndroid Build Coastguard Worker     return sk_sp<GrTexture>(new GrMockTexture(
136*c8dee2aaSAndroid Build Coastguard Worker             this, budgeted, dimensions, mipmapStatus, texInfo, label));
137*c8dee2aaSAndroid Build Coastguard Worker }
138*c8dee2aaSAndroid Build Coastguard Worker 
139*c8dee2aaSAndroid Build Coastguard Worker // TODO: why no 'isProtected' ?!
onCreateCompressedTexture(SkISize dimensions,const GrBackendFormat & format,skgpu::Budgeted budgeted,skgpu::Mipmapped mipmapped,GrProtected isProtected,const void * data,size_t dataSize)140*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTexture> GrMockGpu::onCreateCompressedTexture(SkISize dimensions,
141*c8dee2aaSAndroid Build Coastguard Worker                                                       const GrBackendFormat& format,
142*c8dee2aaSAndroid Build Coastguard Worker                                                       skgpu::Budgeted budgeted,
143*c8dee2aaSAndroid Build Coastguard Worker                                                       skgpu::Mipmapped mipmapped,
144*c8dee2aaSAndroid Build Coastguard Worker                                                       GrProtected isProtected,
145*c8dee2aaSAndroid Build Coastguard Worker                                                       const void* data,
146*c8dee2aaSAndroid Build Coastguard Worker                                                       size_t dataSize) {
147*c8dee2aaSAndroid Build Coastguard Worker     if (fMockOptions.fFailTextureAllocations) {
148*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
149*c8dee2aaSAndroid Build Coastguard Worker     }
150*c8dee2aaSAndroid Build Coastguard Worker 
151*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
152*c8dee2aaSAndroid Build Coastguard Worker     // Uncompressed formats should go through onCreateTexture
153*c8dee2aaSAndroid Build Coastguard Worker     SkTextureCompressionType compression = format.asMockCompressionType();
154*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(compression != SkTextureCompressionType::kNone);
155*c8dee2aaSAndroid Build Coastguard Worker #endif
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker     GrMipmapStatus mipmapStatus = (mipmapped == skgpu::Mipmapped::kYes)
158*c8dee2aaSAndroid Build Coastguard Worker                                           ? GrMipmapStatus::kValid
159*c8dee2aaSAndroid Build Coastguard Worker                                           : GrMipmapStatus::kNotAllocated;
160*c8dee2aaSAndroid Build Coastguard Worker     GrMockTextureInfo texInfo(GrColorType::kUnknown,
161*c8dee2aaSAndroid Build Coastguard Worker                               format.asMockCompressionType(),
162*c8dee2aaSAndroid Build Coastguard Worker                               NextInternalTextureID(),
163*c8dee2aaSAndroid Build Coastguard Worker                               isProtected);
164*c8dee2aaSAndroid Build Coastguard Worker 
165*c8dee2aaSAndroid Build Coastguard Worker     return sk_sp<GrTexture>(new GrMockTexture(
166*c8dee2aaSAndroid Build Coastguard Worker             this, budgeted, dimensions, mipmapStatus, texInfo,
167*c8dee2aaSAndroid Build Coastguard Worker             /*label=*/"MockGpu_CreateCompressedTexture"));
168*c8dee2aaSAndroid Build Coastguard Worker }
169*c8dee2aaSAndroid Build Coastguard Worker 
onWrapBackendTexture(const GrBackendTexture & tex,GrWrapOwnership ownership,GrWrapCacheable wrapType,GrIOType ioType)170*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTexture> GrMockGpu::onWrapBackendTexture(const GrBackendTexture& tex,
171*c8dee2aaSAndroid Build Coastguard Worker                                                  GrWrapOwnership ownership,
172*c8dee2aaSAndroid Build Coastguard Worker                                                  GrWrapCacheable wrapType,
173*c8dee2aaSAndroid Build Coastguard Worker                                                  GrIOType ioType) {
174*c8dee2aaSAndroid Build Coastguard Worker     GrMockTextureInfo texInfo;
175*c8dee2aaSAndroid Build Coastguard Worker     SkAssertResult(tex.getMockTextureInfo(&texInfo));
176*c8dee2aaSAndroid Build Coastguard Worker 
177*c8dee2aaSAndroid Build Coastguard Worker     SkTextureCompressionType compression = texInfo.compressionType();
178*c8dee2aaSAndroid Build Coastguard Worker     if (compression != SkTextureCompressionType::kNone) {
179*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
180*c8dee2aaSAndroid Build Coastguard Worker     }
181*c8dee2aaSAndroid Build Coastguard Worker 
182*c8dee2aaSAndroid Build Coastguard Worker     GrMipmapStatus mipmapStatus = tex.hasMipmaps() ? GrMipmapStatus::kValid
183*c8dee2aaSAndroid Build Coastguard Worker                                                    : GrMipmapStatus::kNotAllocated;
184*c8dee2aaSAndroid Build Coastguard Worker     return sk_sp<GrTexture>(new GrMockTexture(this,
185*c8dee2aaSAndroid Build Coastguard Worker                                               tex.dimensions(),
186*c8dee2aaSAndroid Build Coastguard Worker                                               mipmapStatus,
187*c8dee2aaSAndroid Build Coastguard Worker                                               texInfo,
188*c8dee2aaSAndroid Build Coastguard Worker                                               wrapType,
189*c8dee2aaSAndroid Build Coastguard Worker                                               ioType,
190*c8dee2aaSAndroid Build Coastguard Worker                                               /*label=*/"MockGpu_WrapBackendTexture"));
191*c8dee2aaSAndroid Build Coastguard Worker }
192*c8dee2aaSAndroid Build Coastguard Worker 
onWrapCompressedBackendTexture(const GrBackendTexture & tex,GrWrapOwnership ownership,GrWrapCacheable wrapType)193*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTexture> GrMockGpu::onWrapCompressedBackendTexture(const GrBackendTexture& tex,
194*c8dee2aaSAndroid Build Coastguard Worker                                                            GrWrapOwnership ownership,
195*c8dee2aaSAndroid Build Coastguard Worker                                                            GrWrapCacheable wrapType) {
196*c8dee2aaSAndroid Build Coastguard Worker     return nullptr;
197*c8dee2aaSAndroid Build Coastguard Worker }
198*c8dee2aaSAndroid Build Coastguard Worker 
onWrapRenderableBackendTexture(const GrBackendTexture & tex,int sampleCnt,GrWrapOwnership ownership,GrWrapCacheable cacheable)199*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTexture> GrMockGpu::onWrapRenderableBackendTexture(const GrBackendTexture& tex,
200*c8dee2aaSAndroid Build Coastguard Worker                                                            int sampleCnt,
201*c8dee2aaSAndroid Build Coastguard Worker                                                            GrWrapOwnership ownership,
202*c8dee2aaSAndroid Build Coastguard Worker                                                            GrWrapCacheable cacheable) {
203*c8dee2aaSAndroid Build Coastguard Worker     GrMockTextureInfo texInfo;
204*c8dee2aaSAndroid Build Coastguard Worker     SkAssertResult(tex.getMockTextureInfo(&texInfo));
205*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(texInfo.compressionType() == SkTextureCompressionType::kNone);
206*c8dee2aaSAndroid Build Coastguard Worker 
207*c8dee2aaSAndroid Build Coastguard Worker     GrMipmapStatus mipmapStatus =
208*c8dee2aaSAndroid Build Coastguard Worker             tex.hasMipmaps() ? GrMipmapStatus::kValid : GrMipmapStatus::kNotAllocated;
209*c8dee2aaSAndroid Build Coastguard Worker 
210*c8dee2aaSAndroid Build Coastguard Worker     // The client gave us the texture ID but we supply the render target ID.
211*c8dee2aaSAndroid Build Coastguard Worker     GrMockRenderTargetInfo rtInfo(texInfo.colorType(), NextInternalRenderTargetID(),
212*c8dee2aaSAndroid Build Coastguard Worker                                   texInfo.getProtected());
213*c8dee2aaSAndroid Build Coastguard Worker 
214*c8dee2aaSAndroid Build Coastguard Worker     return sk_sp<GrTexture>(
215*c8dee2aaSAndroid Build Coastguard Worker             new GrMockTextureRenderTarget(this,
216*c8dee2aaSAndroid Build Coastguard Worker                                           tex.dimensions(),
217*c8dee2aaSAndroid Build Coastguard Worker                                           sampleCnt,
218*c8dee2aaSAndroid Build Coastguard Worker                                           mipmapStatus,
219*c8dee2aaSAndroid Build Coastguard Worker                                           texInfo,
220*c8dee2aaSAndroid Build Coastguard Worker                                           rtInfo,
221*c8dee2aaSAndroid Build Coastguard Worker                                           cacheable,
222*c8dee2aaSAndroid Build Coastguard Worker                                           /*label=*/"MockGpu_WrapRenderableBackendTexture"));
223*c8dee2aaSAndroid Build Coastguard Worker }
224*c8dee2aaSAndroid Build Coastguard Worker 
onWrapBackendRenderTarget(const GrBackendRenderTarget & rt)225*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrRenderTarget> GrMockGpu::onWrapBackendRenderTarget(const GrBackendRenderTarget& rt) {
226*c8dee2aaSAndroid Build Coastguard Worker     GrMockRenderTargetInfo info;
227*c8dee2aaSAndroid Build Coastguard Worker     SkAssertResult(rt.getMockRenderTargetInfo(&info));
228*c8dee2aaSAndroid Build Coastguard Worker 
229*c8dee2aaSAndroid Build Coastguard Worker     return sk_sp<GrRenderTarget>(
230*c8dee2aaSAndroid Build Coastguard Worker             new GrMockRenderTarget(this,
231*c8dee2aaSAndroid Build Coastguard Worker                                    GrMockRenderTarget::kWrapped,
232*c8dee2aaSAndroid Build Coastguard Worker                                    rt.dimensions(),
233*c8dee2aaSAndroid Build Coastguard Worker                                    rt.sampleCnt(),
234*c8dee2aaSAndroid Build Coastguard Worker                                    info,
235*c8dee2aaSAndroid Build Coastguard Worker                                    /*label=*/"MockGpu_WrapBackendRenderTarget"));
236*c8dee2aaSAndroid Build Coastguard Worker }
237*c8dee2aaSAndroid Build Coastguard Worker 
onCreateBuffer(size_t sizeInBytes,GrGpuBufferType type,GrAccessPattern accessPattern)238*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrGpuBuffer> GrMockGpu::onCreateBuffer(size_t sizeInBytes,
239*c8dee2aaSAndroid Build Coastguard Worker                                              GrGpuBufferType type,
240*c8dee2aaSAndroid Build Coastguard Worker                                              GrAccessPattern accessPattern) {
241*c8dee2aaSAndroid Build Coastguard Worker     return sk_sp<GrGpuBuffer>(
242*c8dee2aaSAndroid Build Coastguard Worker             new GrMockBuffer(this, sizeInBytes, type, accessPattern,
243*c8dee2aaSAndroid Build Coastguard Worker                              /*label=*/"MockGpu_CreateBuffer"));
244*c8dee2aaSAndroid Build Coastguard Worker }
245*c8dee2aaSAndroid Build Coastguard Worker 
makeStencilAttachment(const GrBackendFormat &,SkISize dimensions,int numStencilSamples)246*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrAttachment> GrMockGpu::makeStencilAttachment(const GrBackendFormat& /*colorFormat*/,
247*c8dee2aaSAndroid Build Coastguard Worker                                                      SkISize dimensions, int numStencilSamples) {
248*c8dee2aaSAndroid Build Coastguard Worker     fStats.incStencilAttachmentCreates();
249*c8dee2aaSAndroid Build Coastguard Worker     return sk_sp<GrAttachment>(new GrMockAttachment(this,
250*c8dee2aaSAndroid Build Coastguard Worker                                                     dimensions,
251*c8dee2aaSAndroid Build Coastguard Worker                                                     GrAttachment::UsageFlags::kStencilAttachment,
252*c8dee2aaSAndroid Build Coastguard Worker                                                     numStencilSamples,
253*c8dee2aaSAndroid Build Coastguard Worker                                                     /*label=*/"MockGpu_MakeStencilAttachment"));
254*c8dee2aaSAndroid Build Coastguard Worker }
255*c8dee2aaSAndroid Build Coastguard Worker 
onCreateBackendTexture(SkISize dimensions,const GrBackendFormat & format,GrRenderable,skgpu::Mipmapped mipmapped,GrProtected isProtected,std::string_view label)256*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrMockGpu::onCreateBackendTexture(SkISize dimensions,
257*c8dee2aaSAndroid Build Coastguard Worker                                                    const GrBackendFormat& format,
258*c8dee2aaSAndroid Build Coastguard Worker                                                    GrRenderable,
259*c8dee2aaSAndroid Build Coastguard Worker                                                    skgpu::Mipmapped mipmapped,
260*c8dee2aaSAndroid Build Coastguard Worker                                                    GrProtected isProtected,
261*c8dee2aaSAndroid Build Coastguard Worker                                                    std::string_view label) {
262*c8dee2aaSAndroid Build Coastguard Worker     SkTextureCompressionType compression = format.asMockCompressionType();
263*c8dee2aaSAndroid Build Coastguard Worker     if (compression != SkTextureCompressionType::kNone) {
264*c8dee2aaSAndroid Build Coastguard Worker         return {}; // should go through onCreateCompressedBackendTexture
265*c8dee2aaSAndroid Build Coastguard Worker     }
266*c8dee2aaSAndroid Build Coastguard Worker 
267*c8dee2aaSAndroid Build Coastguard Worker     auto colorType = format.asMockColorType();
268*c8dee2aaSAndroid Build Coastguard Worker     if (!this->caps()->isFormatTexturable(format, GrTextureType::k2D)) {
269*c8dee2aaSAndroid Build Coastguard Worker         return GrBackendTexture();  // invalid
270*c8dee2aaSAndroid Build Coastguard Worker     }
271*c8dee2aaSAndroid Build Coastguard Worker 
272*c8dee2aaSAndroid Build Coastguard Worker     GrMockTextureInfo info(colorType, SkTextureCompressionType::kNone, NextExternalTextureID(),
273*c8dee2aaSAndroid Build Coastguard Worker                            isProtected);
274*c8dee2aaSAndroid Build Coastguard Worker 
275*c8dee2aaSAndroid Build Coastguard Worker     fOutstandingTestingOnlyTextureIDs.add(info.id());
276*c8dee2aaSAndroid Build Coastguard Worker     return GrBackendTexture(dimensions.width(), dimensions.height(), mipmapped, info);
277*c8dee2aaSAndroid Build Coastguard Worker }
278*c8dee2aaSAndroid Build Coastguard Worker 
onCreateCompressedBackendTexture(SkISize dimensions,const GrBackendFormat & format,skgpu::Mipmapped mipmapped,GrProtected isProtected)279*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture GrMockGpu::onCreateCompressedBackendTexture(SkISize dimensions,
280*c8dee2aaSAndroid Build Coastguard Worker                                                              const GrBackendFormat& format,
281*c8dee2aaSAndroid Build Coastguard Worker                                                              skgpu::Mipmapped mipmapped,
282*c8dee2aaSAndroid Build Coastguard Worker                                                              GrProtected isProtected) {
283*c8dee2aaSAndroid Build Coastguard Worker     SkTextureCompressionType compression = format.asMockCompressionType();
284*c8dee2aaSAndroid Build Coastguard Worker     if (compression == SkTextureCompressionType::kNone) {
285*c8dee2aaSAndroid Build Coastguard Worker         return {}; // should go through onCreateBackendTexture
286*c8dee2aaSAndroid Build Coastguard Worker     }
287*c8dee2aaSAndroid Build Coastguard Worker 
288*c8dee2aaSAndroid Build Coastguard Worker     if (!this->caps()->isFormatTexturable(format, GrTextureType::k2D)) {
289*c8dee2aaSAndroid Build Coastguard Worker         return {};
290*c8dee2aaSAndroid Build Coastguard Worker     }
291*c8dee2aaSAndroid Build Coastguard Worker 
292*c8dee2aaSAndroid Build Coastguard Worker     GrMockTextureInfo info(GrColorType::kUnknown, compression, NextExternalTextureID(),
293*c8dee2aaSAndroid Build Coastguard Worker                            isProtected);
294*c8dee2aaSAndroid Build Coastguard Worker 
295*c8dee2aaSAndroid Build Coastguard Worker     fOutstandingTestingOnlyTextureIDs.add(info.id());
296*c8dee2aaSAndroid Build Coastguard Worker     return GrBackendTexture(dimensions.width(), dimensions.height(), mipmapped, info);
297*c8dee2aaSAndroid Build Coastguard Worker }
298*c8dee2aaSAndroid Build Coastguard Worker 
deleteBackendTexture(const GrBackendTexture & tex)299*c8dee2aaSAndroid Build Coastguard Worker void GrMockGpu::deleteBackendTexture(const GrBackendTexture& tex) {
300*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(GrBackendApi::kMock == tex.backend());
301*c8dee2aaSAndroid Build Coastguard Worker 
302*c8dee2aaSAndroid Build Coastguard Worker     GrMockTextureInfo info;
303*c8dee2aaSAndroid Build Coastguard Worker     if (tex.getMockTextureInfo(&info)) {
304*c8dee2aaSAndroid Build Coastguard Worker         fOutstandingTestingOnlyTextureIDs.remove(info.id());
305*c8dee2aaSAndroid Build Coastguard Worker     }
306*c8dee2aaSAndroid Build Coastguard Worker }
307*c8dee2aaSAndroid Build Coastguard Worker 
308*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
isTestingOnlyBackendTexture(const GrBackendTexture & tex) const309*c8dee2aaSAndroid Build Coastguard Worker bool GrMockGpu::isTestingOnlyBackendTexture(const GrBackendTexture& tex) const {
310*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(GrBackendApi::kMock == tex.backend());
311*c8dee2aaSAndroid Build Coastguard Worker 
312*c8dee2aaSAndroid Build Coastguard Worker     GrMockTextureInfo info;
313*c8dee2aaSAndroid Build Coastguard Worker     if (!tex.getMockTextureInfo(&info)) {
314*c8dee2aaSAndroid Build Coastguard Worker         return false;
315*c8dee2aaSAndroid Build Coastguard Worker     }
316*c8dee2aaSAndroid Build Coastguard Worker 
317*c8dee2aaSAndroid Build Coastguard Worker     return fOutstandingTestingOnlyTextureIDs.contains(info.id());
318*c8dee2aaSAndroid Build Coastguard Worker }
319*c8dee2aaSAndroid Build Coastguard Worker 
createTestingOnlyBackendRenderTarget(SkISize dimensions,GrColorType colorType,int sampleCnt,GrProtected isProtected)320*c8dee2aaSAndroid Build Coastguard Worker GrBackendRenderTarget GrMockGpu::createTestingOnlyBackendRenderTarget(SkISize dimensions,
321*c8dee2aaSAndroid Build Coastguard Worker                                                                       GrColorType colorType,
322*c8dee2aaSAndroid Build Coastguard Worker                                                                       int sampleCnt,
323*c8dee2aaSAndroid Build Coastguard Worker                                                                       GrProtected isProtected) {
324*c8dee2aaSAndroid Build Coastguard Worker     GrMockRenderTargetInfo info(colorType, NextExternalRenderTargetID(), isProtected);
325*c8dee2aaSAndroid Build Coastguard Worker     static constexpr int kStencilBits = 8;
326*c8dee2aaSAndroid Build Coastguard Worker     return GrBackendRenderTarget(dimensions.width(), dimensions.height(), sampleCnt, kStencilBits,
327*c8dee2aaSAndroid Build Coastguard Worker                                  info);
328*c8dee2aaSAndroid Build Coastguard Worker }
329*c8dee2aaSAndroid Build Coastguard Worker 
deleteTestingOnlyBackendRenderTarget(const GrBackendRenderTarget &)330*c8dee2aaSAndroid Build Coastguard Worker void GrMockGpu::deleteTestingOnlyBackendRenderTarget(const GrBackendRenderTarget&) {}
331*c8dee2aaSAndroid Build Coastguard Worker #endif
332