xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrGpu.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2011 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 GrGpu_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrGpu_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuBuffer.h"  // IWYU pragma: keep
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrOpsRenderPass.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrXferProcessor.h"
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker #include <array>
28*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
29*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
30*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
31*c8dee2aaSAndroid Build Coastguard Worker #include <optional>
32*c8dee2aaSAndroid Build Coastguard Worker #include <string_view>
33*c8dee2aaSAndroid Build Coastguard Worker 
34*c8dee2aaSAndroid Build Coastguard Worker class GrAttachment;
35*c8dee2aaSAndroid Build Coastguard Worker class GrBackendSemaphore;
36*c8dee2aaSAndroid Build Coastguard Worker class GrDirectContext;
37*c8dee2aaSAndroid Build Coastguard Worker class GrGLContext;
38*c8dee2aaSAndroid Build Coastguard Worker class GrProgramDesc;
39*c8dee2aaSAndroid Build Coastguard Worker class GrProgramInfo;
40*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTarget;
41*c8dee2aaSAndroid Build Coastguard Worker class GrRingBuffer;
42*c8dee2aaSAndroid Build Coastguard Worker class GrSemaphore;
43*c8dee2aaSAndroid Build Coastguard Worker class GrStagingBufferManager;
44*c8dee2aaSAndroid Build Coastguard Worker class GrSurface;
45*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy;
46*c8dee2aaSAndroid Build Coastguard Worker class GrTexture;
47*c8dee2aaSAndroid Build Coastguard Worker class GrThreadSafePipelineBuilder;
48*c8dee2aaSAndroid Build Coastguard Worker class SkJSONWriter;
49*c8dee2aaSAndroid Build Coastguard Worker class SkString;
50*c8dee2aaSAndroid Build Coastguard Worker enum class SkTextureCompressionType;
51*c8dee2aaSAndroid Build Coastguard Worker struct GrVkDrawableInfo;
52*c8dee2aaSAndroid Build Coastguard Worker struct SkISize;
53*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo;
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker namespace SkSurfaces {
56*c8dee2aaSAndroid Build Coastguard Worker enum class BackendSurfaceAccess;
57*c8dee2aaSAndroid Build Coastguard Worker }
58*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu {
59*c8dee2aaSAndroid Build Coastguard Worker class AutoCallback;
60*c8dee2aaSAndroid Build Coastguard Worker class MutableTextureState;
61*c8dee2aaSAndroid Build Coastguard Worker class RefCntedCallback;
62*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu
63*c8dee2aaSAndroid Build Coastguard Worker 
64*c8dee2aaSAndroid Build Coastguard Worker // This is sufficient for the GL implementation (which is all we have now). It can become a
65*c8dee2aaSAndroid Build Coastguard Worker // "Backend" SkAnySubclass type to cover other backends in the future.
66*c8dee2aaSAndroid Build Coastguard Worker struct GrTimerQuery {
67*c8dee2aaSAndroid Build Coastguard Worker     uint32_t query;
68*c8dee2aaSAndroid Build Coastguard Worker };
69*c8dee2aaSAndroid Build Coastguard Worker 
70*c8dee2aaSAndroid Build Coastguard Worker class GrGpu {
71*c8dee2aaSAndroid Build Coastguard Worker public:
72*c8dee2aaSAndroid Build Coastguard Worker     GrGpu(GrDirectContext* direct);
73*c8dee2aaSAndroid Build Coastguard Worker     virtual ~GrGpu();
74*c8dee2aaSAndroid Build Coastguard Worker 
getContext()75*c8dee2aaSAndroid Build Coastguard Worker     GrDirectContext* getContext() { return fContext; }
getContext()76*c8dee2aaSAndroid Build Coastguard Worker     const GrDirectContext* getContext() const { return fContext; }
77*c8dee2aaSAndroid Build Coastguard Worker 
78*c8dee2aaSAndroid Build Coastguard Worker     /**
79*c8dee2aaSAndroid Build Coastguard Worker      * Gets the capabilities of the draw target.
80*c8dee2aaSAndroid Build Coastguard Worker      */
caps()81*c8dee2aaSAndroid Build Coastguard Worker     const GrCaps* caps() const { return fCaps.get(); }
refCaps()82*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const GrCaps> refCaps() const { return fCaps; }
83*c8dee2aaSAndroid Build Coastguard Worker 
stagingBufferManager()84*c8dee2aaSAndroid Build Coastguard Worker     virtual GrStagingBufferManager* stagingBufferManager() { return nullptr; }
85*c8dee2aaSAndroid Build Coastguard Worker 
uniformsRingBuffer()86*c8dee2aaSAndroid Build Coastguard Worker     virtual GrRingBuffer* uniformsRingBuffer() { return nullptr; }
87*c8dee2aaSAndroid Build Coastguard Worker 
88*c8dee2aaSAndroid Build Coastguard Worker     enum class DisconnectType {
89*c8dee2aaSAndroid Build Coastguard Worker         // No cleanup should be attempted, immediately cease making backend API calls
90*c8dee2aaSAndroid Build Coastguard Worker         kAbandon,
91*c8dee2aaSAndroid Build Coastguard Worker         // Free allocated resources (not known by GrResourceCache) before returning and
92*c8dee2aaSAndroid Build Coastguard Worker         // ensure no backend backend 3D API calls will be made after disconnect() returns.
93*c8dee2aaSAndroid Build Coastguard Worker         kCleanup,
94*c8dee2aaSAndroid Build Coastguard Worker     };
95*c8dee2aaSAndroid Build Coastguard Worker 
96*c8dee2aaSAndroid Build Coastguard Worker     // Called by context when the underlying backend context is already or will be destroyed
97*c8dee2aaSAndroid Build Coastguard Worker     // before GrDirectContext.
98*c8dee2aaSAndroid Build Coastguard Worker     virtual void disconnect(DisconnectType);
99*c8dee2aaSAndroid Build Coastguard Worker 
100*c8dee2aaSAndroid Build Coastguard Worker     virtual GrThreadSafePipelineBuilder* pipelineBuilder() = 0;
101*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<GrThreadSafePipelineBuilder> refPipelineBuilder() = 0;
102*c8dee2aaSAndroid Build Coastguard Worker 
103*c8dee2aaSAndroid Build Coastguard Worker     // Called by GrDirectContext::isContextLost. Returns true if the backend Gpu object has gotten
104*c8dee2aaSAndroid Build Coastguard Worker     // into an unrecoverable, lost state.
isDeviceLost()105*c8dee2aaSAndroid Build Coastguard Worker     virtual bool isDeviceLost() const { return false; }
106*c8dee2aaSAndroid Build Coastguard Worker 
107*c8dee2aaSAndroid Build Coastguard Worker     /**
108*c8dee2aaSAndroid Build Coastguard Worker      * The GrGpu object normally assumes that no outsider is setting state
109*c8dee2aaSAndroid Build Coastguard Worker      * within the underlying 3D API's context/device/whatever. This call informs
110*c8dee2aaSAndroid Build Coastguard Worker      * the GrGpu that the state was modified and it shouldn't make assumptions
111*c8dee2aaSAndroid Build Coastguard Worker      * about the state.
112*c8dee2aaSAndroid Build Coastguard Worker      */
113*c8dee2aaSAndroid Build Coastguard Worker     void markContextDirty(uint32_t state = kAll_GrBackendState) { fResetBits |= state; }
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker     /**
116*c8dee2aaSAndroid Build Coastguard Worker      * Creates a texture object. If renderable is kYes then the returned texture can
117*c8dee2aaSAndroid Build Coastguard Worker      * be used as a render target by calling GrTexture::asRenderTarget(). Not all
118*c8dee2aaSAndroid Build Coastguard Worker      * pixel configs can be used as render targets. Support for configs as textures
119*c8dee2aaSAndroid Build Coastguard Worker      * or render targets can be checked using GrCaps.
120*c8dee2aaSAndroid Build Coastguard Worker      *
121*c8dee2aaSAndroid Build Coastguard Worker      * @param dimensions     dimensions of the texture to be created.
122*c8dee2aaSAndroid Build Coastguard Worker      * @param format         the format for the texture (not currently used).
123*c8dee2aaSAndroid Build Coastguard Worker      * @param renderable     should the resulting texture be renderable
124*c8dee2aaSAndroid Build Coastguard Worker      * @param renderTargetSampleCnt The number of samples to use for rendering if renderable is
125*c8dee2aaSAndroid Build Coastguard Worker      *                       kYes. If renderable is kNo then this must be 1.
126*c8dee2aaSAndroid Build Coastguard Worker      * @param budgeted       does this texture count against the resource cache budget?
127*c8dee2aaSAndroid Build Coastguard Worker      * @param isProtected    should the texture be created as protected.
128*c8dee2aaSAndroid Build Coastguard Worker      * @param texels         array of mipmap levels containing texel data to load.
129*c8dee2aaSAndroid Build Coastguard Worker      *                       If level i has pixels then it is assumed that its dimensions are
130*c8dee2aaSAndroid Build Coastguard Worker      *                       max(1, floor(dimensions.fWidth / 2)) by
131*c8dee2aaSAndroid Build Coastguard Worker      *                       max(1, floor(dimensions.fHeight / 2)).
132*c8dee2aaSAndroid Build Coastguard Worker      *                       If texels[i].fPixels == nullptr for all i <= mipLevelCount or
133*c8dee2aaSAndroid Build Coastguard Worker      *                       mipLevelCount is 0 then the texture's contents are uninitialized.
134*c8dee2aaSAndroid Build Coastguard Worker      *                       If a level has non-null pixels, its row bytes must be a multiple of the
135*c8dee2aaSAndroid Build Coastguard Worker      *                       config's bytes-per-pixel. The row bytes must be tight to the
136*c8dee2aaSAndroid Build Coastguard Worker      *                       level width if !caps->writePixelsRowBytesSupport().
137*c8dee2aaSAndroid Build Coastguard Worker      *                       If mipLevelCount > 1 and texels[i].fPixels != nullptr for any i > 0
138*c8dee2aaSAndroid Build Coastguard Worker      *                       then all levels must have non-null pixels. All levels must have
139*c8dee2aaSAndroid Build Coastguard Worker      *                       non-null pixels if GrCaps::createTextureMustSpecifyAllLevels() is true.
140*c8dee2aaSAndroid Build Coastguard Worker      * @param textureColorType The color type interpretation of the texture for the purpose of
141*c8dee2aaSAndroid Build Coastguard Worker      *                       of uploading texel data.
142*c8dee2aaSAndroid Build Coastguard Worker      * @param srcColorType   The color type of data in texels[].
143*c8dee2aaSAndroid Build Coastguard Worker      * @param texelLevelCount the number of levels in 'texels'. May be 0, 1, or
144*c8dee2aaSAndroid Build Coastguard Worker      *                       floor(max((log2(dimensions.fWidth), log2(dimensions.fHeight)))). It
145*c8dee2aaSAndroid Build Coastguard Worker      *                       must be the latter if GrCaps::createTextureMustSpecifyAllLevels() is
146*c8dee2aaSAndroid Build Coastguard Worker      *                       true.
147*c8dee2aaSAndroid Build Coastguard Worker      * @return  The texture object if successful, otherwise nullptr.
148*c8dee2aaSAndroid Build Coastguard Worker      */
149*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> createTexture(SkISize dimensions,
150*c8dee2aaSAndroid Build Coastguard Worker                                    const GrBackendFormat& format,
151*c8dee2aaSAndroid Build Coastguard Worker                                    GrTextureType textureType,
152*c8dee2aaSAndroid Build Coastguard Worker                                    GrRenderable renderable,
153*c8dee2aaSAndroid Build Coastguard Worker                                    int renderTargetSampleCnt,
154*c8dee2aaSAndroid Build Coastguard Worker                                    skgpu::Budgeted budgeted,
155*c8dee2aaSAndroid Build Coastguard Worker                                    GrProtected isProtected,
156*c8dee2aaSAndroid Build Coastguard Worker                                    GrColorType textureColorType,
157*c8dee2aaSAndroid Build Coastguard Worker                                    GrColorType srcColorType,
158*c8dee2aaSAndroid Build Coastguard Worker                                    const GrMipLevel texels[],
159*c8dee2aaSAndroid Build Coastguard Worker                                    int texelLevelCount,
160*c8dee2aaSAndroid Build Coastguard Worker                                    std::string_view label);
161*c8dee2aaSAndroid Build Coastguard Worker 
162*c8dee2aaSAndroid Build Coastguard Worker     /**
163*c8dee2aaSAndroid Build Coastguard Worker      * Simplified createTexture() interface for when there is no initial texel data to upload.
164*c8dee2aaSAndroid Build Coastguard Worker      */
165*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> createTexture(SkISize dimensions,
166*c8dee2aaSAndroid Build Coastguard Worker                                    const GrBackendFormat& format,
167*c8dee2aaSAndroid Build Coastguard Worker                                    GrTextureType textureType,
168*c8dee2aaSAndroid Build Coastguard Worker                                    GrRenderable renderable,
169*c8dee2aaSAndroid Build Coastguard Worker                                    int renderTargetSampleCnt,
170*c8dee2aaSAndroid Build Coastguard Worker                                    skgpu::Mipmapped mipmapped,
171*c8dee2aaSAndroid Build Coastguard Worker                                    skgpu::Budgeted budgeted,
172*c8dee2aaSAndroid Build Coastguard Worker                                    GrProtected isProtected,
173*c8dee2aaSAndroid Build Coastguard Worker                                    std::string_view label);
174*c8dee2aaSAndroid Build Coastguard Worker 
175*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> createCompressedTexture(SkISize dimensions,
176*c8dee2aaSAndroid Build Coastguard Worker                                              const GrBackendFormat& format,
177*c8dee2aaSAndroid Build Coastguard Worker                                              skgpu::Budgeted budgeted,
178*c8dee2aaSAndroid Build Coastguard Worker                                              skgpu::Mipmapped mipmapped,
179*c8dee2aaSAndroid Build Coastguard Worker                                              GrProtected isProtected,
180*c8dee2aaSAndroid Build Coastguard Worker                                              const void* data,
181*c8dee2aaSAndroid Build Coastguard Worker                                              size_t dataSize);
182*c8dee2aaSAndroid Build Coastguard Worker 
183*c8dee2aaSAndroid Build Coastguard Worker     /**
184*c8dee2aaSAndroid Build Coastguard Worker      * Implements GrResourceProvider::wrapBackendTexture
185*c8dee2aaSAndroid Build Coastguard Worker      */
186*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> wrapBackendTexture(const GrBackendTexture&,
187*c8dee2aaSAndroid Build Coastguard Worker                                         GrWrapOwnership,
188*c8dee2aaSAndroid Build Coastguard Worker                                         GrWrapCacheable,
189*c8dee2aaSAndroid Build Coastguard Worker                                         GrIOType);
190*c8dee2aaSAndroid Build Coastguard Worker 
191*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> wrapCompressedBackendTexture(const GrBackendTexture&,
192*c8dee2aaSAndroid Build Coastguard Worker                                                   GrWrapOwnership,
193*c8dee2aaSAndroid Build Coastguard Worker                                                   GrWrapCacheable);
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker     /**
196*c8dee2aaSAndroid Build Coastguard Worker      * Implements GrResourceProvider::wrapRenderableBackendTexture
197*c8dee2aaSAndroid Build Coastguard Worker      */
198*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> wrapRenderableBackendTexture(const GrBackendTexture&,
199*c8dee2aaSAndroid Build Coastguard Worker                                                   int sampleCnt,
200*c8dee2aaSAndroid Build Coastguard Worker                                                   GrWrapOwnership,
201*c8dee2aaSAndroid Build Coastguard Worker                                                   GrWrapCacheable);
202*c8dee2aaSAndroid Build Coastguard Worker 
203*c8dee2aaSAndroid Build Coastguard Worker     /**
204*c8dee2aaSAndroid Build Coastguard Worker      * Implements GrResourceProvider::wrapBackendRenderTarget
205*c8dee2aaSAndroid Build Coastguard Worker      */
206*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrRenderTarget> wrapBackendRenderTarget(const GrBackendRenderTarget&);
207*c8dee2aaSAndroid Build Coastguard Worker 
208*c8dee2aaSAndroid Build Coastguard Worker     /**
209*c8dee2aaSAndroid Build Coastguard Worker      * Implements GrResourceProvider::wrapVulkanSecondaryCBAsRenderTarget
210*c8dee2aaSAndroid Build Coastguard Worker      */
211*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrRenderTarget> wrapVulkanSecondaryCBAsRenderTarget(const SkImageInfo&,
212*c8dee2aaSAndroid Build Coastguard Worker                                                               const GrVkDrawableInfo&);
213*c8dee2aaSAndroid Build Coastguard Worker 
214*c8dee2aaSAndroid Build Coastguard Worker     /**
215*c8dee2aaSAndroid Build Coastguard Worker      * Creates a buffer in GPU memory. For a client-side buffer use GrBuffer::CreateCPUBacked.
216*c8dee2aaSAndroid Build Coastguard Worker      *
217*c8dee2aaSAndroid Build Coastguard Worker      * @param size            size of buffer to create.
218*c8dee2aaSAndroid Build Coastguard Worker      * @param intendedType    hint to the graphics subsystem about what the buffer will be used for.
219*c8dee2aaSAndroid Build Coastguard Worker      * @param accessPattern   hint to the graphics subsystem about how the data will be accessed.
220*c8dee2aaSAndroid Build Coastguard Worker      *
221*c8dee2aaSAndroid Build Coastguard Worker      * @return the buffer if successful, otherwise nullptr.
222*c8dee2aaSAndroid Build Coastguard Worker      */
223*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrGpuBuffer> createBuffer(size_t size,
224*c8dee2aaSAndroid Build Coastguard Worker                                     GrGpuBufferType intendedType,
225*c8dee2aaSAndroid Build Coastguard Worker                                     GrAccessPattern accessPattern);
226*c8dee2aaSAndroid Build Coastguard Worker 
227*c8dee2aaSAndroid Build Coastguard Worker     /**
228*c8dee2aaSAndroid Build Coastguard Worker      * Resolves MSAA. The resolveRect must already be in the native destination space.
229*c8dee2aaSAndroid Build Coastguard Worker      */
230*c8dee2aaSAndroid Build Coastguard Worker     void resolveRenderTarget(GrRenderTarget*, const SkIRect& resolveRect);
231*c8dee2aaSAndroid Build Coastguard Worker 
232*c8dee2aaSAndroid Build Coastguard Worker     /**
233*c8dee2aaSAndroid Build Coastguard Worker      * Uses the base of the texture to recompute the contents of the other levels.
234*c8dee2aaSAndroid Build Coastguard Worker      */
235*c8dee2aaSAndroid Build Coastguard Worker     bool regenerateMipMapLevels(GrTexture*);
236*c8dee2aaSAndroid Build Coastguard Worker 
237*c8dee2aaSAndroid Build Coastguard Worker     /**
238*c8dee2aaSAndroid Build Coastguard Worker      * If the backend API has stateful texture bindings, this resets them back to defaults.
239*c8dee2aaSAndroid Build Coastguard Worker      */
240*c8dee2aaSAndroid Build Coastguard Worker     void resetTextureBindings();
241*c8dee2aaSAndroid Build Coastguard Worker 
242*c8dee2aaSAndroid Build Coastguard Worker     /**
243*c8dee2aaSAndroid Build Coastguard Worker      * Reads a rectangle of pixels from a render target. No sRGB/linear conversions are performed.
244*c8dee2aaSAndroid Build Coastguard Worker      *
245*c8dee2aaSAndroid Build Coastguard Worker      * @param surface           the surface to read from
246*c8dee2aaSAndroid Build Coastguard Worker      * @param rect              the rectangle of pixels to read
247*c8dee2aaSAndroid Build Coastguard Worker      * @param surfaceColorType  the color type for this use of the surface.
248*c8dee2aaSAndroid Build Coastguard Worker      * @param dstColorType      the color type of the destination buffer.
249*c8dee2aaSAndroid Build Coastguard Worker      * @param buffer            memory to read the rectangle into.
250*c8dee2aaSAndroid Build Coastguard Worker      * @param rowBytes          the number of bytes between consecutive rows. Must be a multiple of
251*c8dee2aaSAndroid Build Coastguard Worker      *                          dstColorType's bytes-per-pixel. Must be tight to width if
252*c8dee2aaSAndroid Build Coastguard Worker      *                          !caps->readPixelsRowBytesSupport().
253*c8dee2aaSAndroid Build Coastguard Worker      *
254*c8dee2aaSAndroid Build Coastguard Worker      * @return true if the read succeeded, false if not. The read can fail
255*c8dee2aaSAndroid Build Coastguard Worker      *              because of the surface doesn't support reading, the color type
256*c8dee2aaSAndroid Build Coastguard Worker      *              is not allowed for the format of the surface or if the rectangle
257*c8dee2aaSAndroid Build Coastguard Worker      *              read is not contained in the surface.
258*c8dee2aaSAndroid Build Coastguard Worker      */
259*c8dee2aaSAndroid Build Coastguard Worker     bool readPixels(GrSurface* surface,
260*c8dee2aaSAndroid Build Coastguard Worker                     SkIRect rect,
261*c8dee2aaSAndroid Build Coastguard Worker                     GrColorType surfaceColorType,
262*c8dee2aaSAndroid Build Coastguard Worker                     GrColorType dstColorType,
263*c8dee2aaSAndroid Build Coastguard Worker                     void* buffer,
264*c8dee2aaSAndroid Build Coastguard Worker                     size_t rowBytes);
265*c8dee2aaSAndroid Build Coastguard Worker 
266*c8dee2aaSAndroid Build Coastguard Worker     /**
267*c8dee2aaSAndroid Build Coastguard Worker      * Updates the pixels in a rectangle of a surface.  No sRGB/linear conversions are performed.
268*c8dee2aaSAndroid Build Coastguard Worker      *
269*c8dee2aaSAndroid Build Coastguard Worker      * @param surface            the surface to write to.
270*c8dee2aaSAndroid Build Coastguard Worker      * @param rect               the rectangle of pixels to overwrite
271*c8dee2aaSAndroid Build Coastguard Worker      * @param surfaceColorType   the color type for this use of the surface.
272*c8dee2aaSAndroid Build Coastguard Worker      * @param srcColorType       the color type of the source buffer.
273*c8dee2aaSAndroid Build Coastguard Worker      * @param texels             array of mipmap levels containing texture data. Row bytes must be a
274*c8dee2aaSAndroid Build Coastguard Worker      *                           multiple of srcColorType's bytes-per-pixel. Must be tight to level
275*c8dee2aaSAndroid Build Coastguard Worker      *                           width if !caps->writePixelsRowBytesSupport().
276*c8dee2aaSAndroid Build Coastguard Worker      * @param mipLevelCount      number of levels in 'texels'
277*c8dee2aaSAndroid Build Coastguard Worker      * @param prepForTexSampling After doing write pixels should the surface be prepared for texture
278*c8dee2aaSAndroid Build Coastguard Worker      *                           sampling. This is currently only used by Vulkan for inline uploads
279*c8dee2aaSAndroid Build Coastguard Worker      *                           to set that layout back to sampled after doing the upload. Inline
280*c8dee2aaSAndroid Build Coastguard Worker      *                           uploads currently can happen between draws in a single op so it is
281*c8dee2aaSAndroid Build Coastguard Worker      *                           not trivial to break up the OpsTask into two tasks when we see
282*c8dee2aaSAndroid Build Coastguard Worker      *                           an inline upload. However, once we are able to support doing that
283*c8dee2aaSAndroid Build Coastguard Worker      *                           we can remove this parameter.
284*c8dee2aaSAndroid Build Coastguard Worker      *
285*c8dee2aaSAndroid Build Coastguard Worker      * @return true if the write succeeded, false if not. The read can fail
286*c8dee2aaSAndroid Build Coastguard Worker      *              because of the surface doesn't support writing (e.g. read only),
287*c8dee2aaSAndroid Build Coastguard Worker      *              the color type is not allowed for the format of the surface or
288*c8dee2aaSAndroid Build Coastguard Worker      *              if the rectangle written is not contained in the surface.
289*c8dee2aaSAndroid Build Coastguard Worker      */
290*c8dee2aaSAndroid Build Coastguard Worker     bool writePixels(GrSurface* surface,
291*c8dee2aaSAndroid Build Coastguard Worker                      SkIRect rect,
292*c8dee2aaSAndroid Build Coastguard Worker                      GrColorType surfaceColorType,
293*c8dee2aaSAndroid Build Coastguard Worker                      GrColorType srcColorType,
294*c8dee2aaSAndroid Build Coastguard Worker                      const GrMipLevel texels[],
295*c8dee2aaSAndroid Build Coastguard Worker                      int mipLevelCount,
296*c8dee2aaSAndroid Build Coastguard Worker                      bool prepForTexSampling = false);
297*c8dee2aaSAndroid Build Coastguard Worker 
298*c8dee2aaSAndroid Build Coastguard Worker     /**
299*c8dee2aaSAndroid Build Coastguard Worker      * Helper for the case of a single level.
300*c8dee2aaSAndroid Build Coastguard Worker      */
301*c8dee2aaSAndroid Build Coastguard Worker     bool writePixels(GrSurface* surface,
302*c8dee2aaSAndroid Build Coastguard Worker                      SkIRect rect,
303*c8dee2aaSAndroid Build Coastguard Worker                      GrColorType surfaceColorType,
304*c8dee2aaSAndroid Build Coastguard Worker                      GrColorType srcColorType,
305*c8dee2aaSAndroid Build Coastguard Worker                      const void* buffer,
306*c8dee2aaSAndroid Build Coastguard Worker                      size_t rowBytes,
307*c8dee2aaSAndroid Build Coastguard Worker                      bool prepForTexSampling = false) {
308*c8dee2aaSAndroid Build Coastguard Worker         GrMipLevel mipLevel = {buffer, rowBytes, nullptr};
309*c8dee2aaSAndroid Build Coastguard Worker         return this->writePixels(surface,
310*c8dee2aaSAndroid Build Coastguard Worker                                  rect,
311*c8dee2aaSAndroid Build Coastguard Worker                                  surfaceColorType,
312*c8dee2aaSAndroid Build Coastguard Worker                                  srcColorType,
313*c8dee2aaSAndroid Build Coastguard Worker                                  &mipLevel,
314*c8dee2aaSAndroid Build Coastguard Worker                                  1,
315*c8dee2aaSAndroid Build Coastguard Worker                                  prepForTexSampling);
316*c8dee2aaSAndroid Build Coastguard Worker     }
317*c8dee2aaSAndroid Build Coastguard Worker 
318*c8dee2aaSAndroid Build Coastguard Worker     /**
319*c8dee2aaSAndroid Build Coastguard Worker      * Transfer bytes from one GPU buffer to another. The src buffer must have type kXferCpuToGpu
320*c8dee2aaSAndroid Build Coastguard Worker      * and the dst buffer must not. Neither buffer may currently be mapped. The offsets and size
321*c8dee2aaSAndroid Build Coastguard Worker      * must be aligned to GrCaps::transferFromBufferToBufferAlignment.
322*c8dee2aaSAndroid Build Coastguard Worker      *
323*c8dee2aaSAndroid Build Coastguard Worker      * @param src        the buffer to read from
324*c8dee2aaSAndroid Build Coastguard Worker      * @param srcOffset  the aligned offset at the src at which the transfer begins.
325*c8dee2aaSAndroid Build Coastguard Worker      * @param dst        the buffer to write to
326*c8dee2aaSAndroid Build Coastguard Worker      * @param dstOffset  the aligned offset in the dst at which the transfer begins
327*c8dee2aaSAndroid Build Coastguard Worker      * @param size       the aligned number of bytes to transfer;
328*c8dee2aaSAndroid Build Coastguard Worker      */
329*c8dee2aaSAndroid Build Coastguard Worker     bool transferFromBufferToBuffer(sk_sp<GrGpuBuffer> src,
330*c8dee2aaSAndroid Build Coastguard Worker                                     size_t srcOffset,
331*c8dee2aaSAndroid Build Coastguard Worker                                     sk_sp<GrGpuBuffer> dst,
332*c8dee2aaSAndroid Build Coastguard Worker                                     size_t dstOffset,
333*c8dee2aaSAndroid Build Coastguard Worker                                     size_t size);
334*c8dee2aaSAndroid Build Coastguard Worker 
335*c8dee2aaSAndroid Build Coastguard Worker     /**
336*c8dee2aaSAndroid Build Coastguard Worker      * Updates the pixels in a rectangle of a texture using a buffer. If the texture is MIP mapped,
337*c8dee2aaSAndroid Build Coastguard Worker      * the base level is written to.
338*c8dee2aaSAndroid Build Coastguard Worker      *
339*c8dee2aaSAndroid Build Coastguard Worker      * @param texture          the texture to write to.
340*c8dee2aaSAndroid Build Coastguard Worker      * @param rect             the rectangle of pixels in the texture to overwrite
341*c8dee2aaSAndroid Build Coastguard Worker      * @param textureColorType the color type for this use of the surface.
342*c8dee2aaSAndroid Build Coastguard Worker      * @param bufferColorType  the color type of the transfer buffer's pixel data
343*c8dee2aaSAndroid Build Coastguard Worker      * @param transferBuffer   GrBuffer to read pixels from (type must be "kXferCpuToGpu")
344*c8dee2aaSAndroid Build Coastguard Worker      * @param offset           offset from the start of the buffer
345*c8dee2aaSAndroid Build Coastguard Worker      * @param rowBytes         number of bytes between consecutive rows in the buffer. Must be a
346*c8dee2aaSAndroid Build Coastguard Worker      *                         multiple of bufferColorType's bytes-per-pixel. Must be tight to
347*c8dee2aaSAndroid Build Coastguard Worker      *                         rect.width() if !caps->writePixelsRowBytesSupport().
348*c8dee2aaSAndroid Build Coastguard Worker      */
349*c8dee2aaSAndroid Build Coastguard Worker     bool transferPixelsTo(GrTexture* texture,
350*c8dee2aaSAndroid Build Coastguard Worker                           SkIRect rect,
351*c8dee2aaSAndroid Build Coastguard Worker                           GrColorType textureColorType,
352*c8dee2aaSAndroid Build Coastguard Worker                           GrColorType bufferColorType,
353*c8dee2aaSAndroid Build Coastguard Worker                           sk_sp<GrGpuBuffer> transferBuffer,
354*c8dee2aaSAndroid Build Coastguard Worker                           size_t offset,
355*c8dee2aaSAndroid Build Coastguard Worker                           size_t rowBytes);
356*c8dee2aaSAndroid Build Coastguard Worker 
357*c8dee2aaSAndroid Build Coastguard Worker     /**
358*c8dee2aaSAndroid Build Coastguard Worker      * Reads the pixels from a rectangle of a surface into a buffer. Use
359*c8dee2aaSAndroid Build Coastguard Worker      * GrCaps::SupportedRead::fOffsetAlignmentForTransferBuffer to determine the requirements for
360*c8dee2aaSAndroid Build Coastguard Worker      * the buffer offset alignment. If the surface is a MIP mapped texture, the base level is read.
361*c8dee2aaSAndroid Build Coastguard Worker      *
362*c8dee2aaSAndroid Build Coastguard Worker      * If successful the row bytes in the buffer is always:
363*c8dee2aaSAndroid Build Coastguard Worker      *   GrColorTypeBytesPerPixel(bufferColorType) * rect.width()
364*c8dee2aaSAndroid Build Coastguard Worker      *
365*c8dee2aaSAndroid Build Coastguard Worker      * Asserts that the caller has passed a properly aligned offset and that the buffer is
366*c8dee2aaSAndroid Build Coastguard Worker      * large enough to hold the result
367*c8dee2aaSAndroid Build Coastguard Worker      *
368*c8dee2aaSAndroid Build Coastguard Worker      * @param surface          the surface to read from.
369*c8dee2aaSAndroid Build Coastguard Worker      * @param rect             the rectangle of pixels to read
370*c8dee2aaSAndroid Build Coastguard Worker      * @param surfaceColorType the color type for this use of the surface.
371*c8dee2aaSAndroid Build Coastguard Worker      * @param bufferColorType  the color type of the transfer buffer's pixel data
372*c8dee2aaSAndroid Build Coastguard Worker      * @param transferBuffer   GrBuffer to write pixels to (type must be "kXferGpuToCpu")
373*c8dee2aaSAndroid Build Coastguard Worker      * @param offset           offset from the start of the buffer
374*c8dee2aaSAndroid Build Coastguard Worker      */
375*c8dee2aaSAndroid Build Coastguard Worker     bool transferPixelsFrom(GrSurface* surface,
376*c8dee2aaSAndroid Build Coastguard Worker                             SkIRect rect,
377*c8dee2aaSAndroid Build Coastguard Worker                             GrColorType surfaceColorType,
378*c8dee2aaSAndroid Build Coastguard Worker                             GrColorType bufferColorType,
379*c8dee2aaSAndroid Build Coastguard Worker                             sk_sp<GrGpuBuffer> transferBuffer,
380*c8dee2aaSAndroid Build Coastguard Worker                             size_t offset);
381*c8dee2aaSAndroid Build Coastguard Worker 
382*c8dee2aaSAndroid Build Coastguard Worker     // Called to perform a surface to surface copy. Fallbacks to issuing a draw from the src to dst
383*c8dee2aaSAndroid Build Coastguard Worker     // take place at higher levels and this function implement faster copy paths. The src and dst
384*c8dee2aaSAndroid Build Coastguard Worker     // rects are pre-clipped. The src rect and dst rect are guaranteed to be within the
385*c8dee2aaSAndroid Build Coastguard Worker     // src/dst bounds and non-empty. They must also be in their exact device space coords, including
386*c8dee2aaSAndroid Build Coastguard Worker     // already being transformed for origin if need be. If canDiscardOutsideDstRect is set to true
387*c8dee2aaSAndroid Build Coastguard Worker     // then we don't need to preserve any data on the dst surface outside of the copy.
388*c8dee2aaSAndroid Build Coastguard Worker     //
389*c8dee2aaSAndroid Build Coastguard Worker     // Backends may or may not support src and dst rects with differing dimensions. This can assume
390*c8dee2aaSAndroid Build Coastguard Worker     // that GrCaps.canCopySurface() returned true for these surfaces and rects.
391*c8dee2aaSAndroid Build Coastguard Worker     bool copySurface(GrSurface* dst, const SkIRect& dstRect,
392*c8dee2aaSAndroid Build Coastguard Worker                      GrSurface* src, const SkIRect& srcRect,
393*c8dee2aaSAndroid Build Coastguard Worker                      GrSamplerState::Filter filter);
394*c8dee2aaSAndroid Build Coastguard Worker 
395*c8dee2aaSAndroid Build Coastguard Worker     // Returns a GrOpsRenderPass which OpsTasks send draw commands to instead of directly
396*c8dee2aaSAndroid Build Coastguard Worker     // to the Gpu object. The 'bounds' rect is the content rect of the renderTarget.
397*c8dee2aaSAndroid Build Coastguard Worker     // If a 'stencil' is provided it will be the one bound to 'renderTarget'. If one is not
398*c8dee2aaSAndroid Build Coastguard Worker     // provided but 'renderTarget' has a stencil buffer then that is a signal that the
399*c8dee2aaSAndroid Build Coastguard Worker     // render target's stencil buffer should be ignored.
400*c8dee2aaSAndroid Build Coastguard Worker     GrOpsRenderPass* getOpsRenderPass(
401*c8dee2aaSAndroid Build Coastguard Worker             GrRenderTarget* renderTarget,
402*c8dee2aaSAndroid Build Coastguard Worker             bool useMSAASurface,
403*c8dee2aaSAndroid Build Coastguard Worker             GrAttachment* stencil,
404*c8dee2aaSAndroid Build Coastguard Worker             GrSurfaceOrigin,
405*c8dee2aaSAndroid Build Coastguard Worker             const SkIRect& bounds,
406*c8dee2aaSAndroid Build Coastguard Worker             const GrOpsRenderPass::LoadAndStoreInfo&,
407*c8dee2aaSAndroid Build Coastguard Worker             const GrOpsRenderPass::StencilLoadAndStoreInfo&,
408*c8dee2aaSAndroid Build Coastguard Worker             const skia_private::TArray<GrSurfaceProxy*, true>& sampledProxies,
409*c8dee2aaSAndroid Build Coastguard Worker             GrXferBarrierFlags renderPassXferBarriers);
410*c8dee2aaSAndroid Build Coastguard Worker 
411*c8dee2aaSAndroid Build Coastguard Worker     // Called by GrDrawingManager when flushing.
412*c8dee2aaSAndroid Build Coastguard Worker     // Provides a hook for post-flush actions (e.g. Vulkan command buffer submits). This will also
413*c8dee2aaSAndroid Build Coastguard Worker     // insert any numSemaphore semaphores on the gpu and set the backendSemaphores to match the
414*c8dee2aaSAndroid Build Coastguard Worker     // inserted semaphores.
415*c8dee2aaSAndroid Build Coastguard Worker     void executeFlushInfo(SkSpan<GrSurfaceProxy*>,
416*c8dee2aaSAndroid Build Coastguard Worker                           SkSurfaces::BackendSurfaceAccess access,
417*c8dee2aaSAndroid Build Coastguard Worker                           const GrFlushInfo&,
418*c8dee2aaSAndroid Build Coastguard Worker                           std::optional<GrTimerQuery> timerQuery,
419*c8dee2aaSAndroid Build Coastguard Worker                           const skgpu::MutableTextureState* newState);
420*c8dee2aaSAndroid Build Coastguard Worker 
421*c8dee2aaSAndroid Build Coastguard Worker     // Called before render tasks are executed during a flush.
willExecute()422*c8dee2aaSAndroid Build Coastguard Worker     virtual void willExecute() {}
423*c8dee2aaSAndroid Build Coastguard Worker 
submitToGpu()424*c8dee2aaSAndroid Build Coastguard Worker     bool submitToGpu() {
425*c8dee2aaSAndroid Build Coastguard Worker         return this->submitToGpu(GrSubmitInfo());
426*c8dee2aaSAndroid Build Coastguard Worker     }
427*c8dee2aaSAndroid Build Coastguard Worker     bool submitToGpu(const GrSubmitInfo& info);
428*c8dee2aaSAndroid Build Coastguard Worker 
429*c8dee2aaSAndroid Build Coastguard Worker     virtual void submit(GrOpsRenderPass*) = 0;
430*c8dee2aaSAndroid Build Coastguard Worker 
431*c8dee2aaSAndroid Build Coastguard Worker     [[nodiscard]] virtual std::unique_ptr<GrSemaphore> makeSemaphore(bool isOwned = true) = 0;
432*c8dee2aaSAndroid Build Coastguard Worker     virtual std::unique_ptr<GrSemaphore> wrapBackendSemaphore(const GrBackendSemaphore&,
433*c8dee2aaSAndroid Build Coastguard Worker                                                               GrSemaphoreWrapType,
434*c8dee2aaSAndroid Build Coastguard Worker                                                               GrWrapOwnership) = 0;
435*c8dee2aaSAndroid Build Coastguard Worker     virtual void insertSemaphore(GrSemaphore* semaphore) = 0;
436*c8dee2aaSAndroid Build Coastguard Worker     virtual void waitSemaphore(GrSemaphore* semaphore) = 0;
437*c8dee2aaSAndroid Build Coastguard Worker 
startTimerQuery()438*c8dee2aaSAndroid Build Coastguard Worker     virtual std::optional<GrTimerQuery> startTimerQuery() { return {}; }
439*c8dee2aaSAndroid Build Coastguard Worker 
440*c8dee2aaSAndroid Build Coastguard Worker     virtual void addFinishedCallback(skgpu::AutoCallback, std::optional<GrTimerQuery> = {}) = 0;
441*c8dee2aaSAndroid Build Coastguard Worker     virtual void checkFinishedCallbacks() = 0;
442*c8dee2aaSAndroid Build Coastguard Worker     virtual void finishOutstandingGpuWork() = 0;
443*c8dee2aaSAndroid Build Coastguard Worker 
444*c8dee2aaSAndroid Build Coastguard Worker     // NOLINTNEXTLINE(performance-unnecessary-value-param)
takeOwnershipOfBuffer(sk_sp<GrGpuBuffer>)445*c8dee2aaSAndroid Build Coastguard Worker     virtual void takeOwnershipOfBuffer(sk_sp<GrGpuBuffer>) {}
446*c8dee2aaSAndroid Build Coastguard Worker 
447*c8dee2aaSAndroid Build Coastguard Worker     /**
448*c8dee2aaSAndroid Build Coastguard Worker      * Checks if we detected an OOM from the underlying 3D API and if so returns true and resets
449*c8dee2aaSAndroid Build Coastguard Worker      * the internal OOM state to false. Otherwise, returns false.
450*c8dee2aaSAndroid Build Coastguard Worker      */
451*c8dee2aaSAndroid Build Coastguard Worker     bool checkAndResetOOMed();
452*c8dee2aaSAndroid Build Coastguard Worker 
453*c8dee2aaSAndroid Build Coastguard Worker     /**
454*c8dee2aaSAndroid Build Coastguard Worker      *  Put this texture in a safe and known state for use across multiple contexts. Depending on
455*c8dee2aaSAndroid Build Coastguard Worker      *  the backend, this may return a GrSemaphore. If so, other contexts should wait on that
456*c8dee2aaSAndroid Build Coastguard Worker      *  semaphore before using this texture.
457*c8dee2aaSAndroid Build Coastguard Worker      */
458*c8dee2aaSAndroid Build Coastguard Worker     virtual std::unique_ptr<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) = 0;
459*c8dee2aaSAndroid Build Coastguard Worker 
460*c8dee2aaSAndroid Build Coastguard Worker     /**
461*c8dee2aaSAndroid Build Coastguard Worker      * Frees any backend specific objects that are not currently in use by the GPU. This is called
462*c8dee2aaSAndroid Build Coastguard Worker      * when the client is trying to free up as much GPU memory as possible. We will not release
463*c8dee2aaSAndroid Build Coastguard Worker      * resources connected to programs/pipelines since the cost to recreate those is significantly
464*c8dee2aaSAndroid Build Coastguard Worker      * higher that other resources.
465*c8dee2aaSAndroid Build Coastguard Worker      */
releaseUnlockedBackendObjects()466*c8dee2aaSAndroid Build Coastguard Worker     virtual void releaseUnlockedBackendObjects() {}
467*c8dee2aaSAndroid Build Coastguard Worker 
468*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
469*c8dee2aaSAndroid Build Coastguard Worker     // Debugging and Stats
470*c8dee2aaSAndroid Build Coastguard Worker 
471*c8dee2aaSAndroid Build Coastguard Worker     class Stats {
472*c8dee2aaSAndroid Build Coastguard Worker     public:
473*c8dee2aaSAndroid Build Coastguard Worker #if GR_GPU_STATS
474*c8dee2aaSAndroid Build Coastguard Worker         Stats() = default;
475*c8dee2aaSAndroid Build Coastguard Worker 
reset()476*c8dee2aaSAndroid Build Coastguard Worker         void reset() { *this = {}; }
477*c8dee2aaSAndroid Build Coastguard Worker 
textureCreates()478*c8dee2aaSAndroid Build Coastguard Worker         int textureCreates() const { return fTextureCreates; }
incTextureCreates()479*c8dee2aaSAndroid Build Coastguard Worker         void incTextureCreates() { fTextureCreates++; }
480*c8dee2aaSAndroid Build Coastguard Worker 
textureUploads()481*c8dee2aaSAndroid Build Coastguard Worker         int textureUploads() const { return fTextureUploads; }
incTextureUploads()482*c8dee2aaSAndroid Build Coastguard Worker         void incTextureUploads() { fTextureUploads++; }
483*c8dee2aaSAndroid Build Coastguard Worker 
transfersToTexture()484*c8dee2aaSAndroid Build Coastguard Worker         int transfersToTexture() const { return fTransfersToTexture; }
incTransfersToTexture()485*c8dee2aaSAndroid Build Coastguard Worker         void incTransfersToTexture() { fTransfersToTexture++; }
486*c8dee2aaSAndroid Build Coastguard Worker 
transfersFromSurface()487*c8dee2aaSAndroid Build Coastguard Worker         int transfersFromSurface() const { return fTransfersFromSurface; }
incTransfersFromSurface()488*c8dee2aaSAndroid Build Coastguard Worker         void incTransfersFromSurface() { fTransfersFromSurface++; }
489*c8dee2aaSAndroid Build Coastguard Worker 
incBufferTransfers()490*c8dee2aaSAndroid Build Coastguard Worker         void incBufferTransfers() { fBufferTransfers++; }
bufferTransfers()491*c8dee2aaSAndroid Build Coastguard Worker         int bufferTransfers() const { return fBufferTransfers; }
492*c8dee2aaSAndroid Build Coastguard Worker 
stencilAttachmentCreates()493*c8dee2aaSAndroid Build Coastguard Worker         int stencilAttachmentCreates() const { return fStencilAttachmentCreates; }
incStencilAttachmentCreates()494*c8dee2aaSAndroid Build Coastguard Worker         void incStencilAttachmentCreates() { fStencilAttachmentCreates++; }
495*c8dee2aaSAndroid Build Coastguard Worker 
msaaAttachmentCreates()496*c8dee2aaSAndroid Build Coastguard Worker         int msaaAttachmentCreates() const { return fMSAAAttachmentCreates; }
incMSAAAttachmentCreates()497*c8dee2aaSAndroid Build Coastguard Worker         void incMSAAAttachmentCreates() { fMSAAAttachmentCreates++; }
498*c8dee2aaSAndroid Build Coastguard Worker 
numDraws()499*c8dee2aaSAndroid Build Coastguard Worker         int numDraws() const { return fNumDraws; }
incNumDraws()500*c8dee2aaSAndroid Build Coastguard Worker         void incNumDraws() { fNumDraws++; }
501*c8dee2aaSAndroid Build Coastguard Worker 
numFailedDraws()502*c8dee2aaSAndroid Build Coastguard Worker         int numFailedDraws() const { return fNumFailedDraws; }
incNumFailedDraws()503*c8dee2aaSAndroid Build Coastguard Worker         void incNumFailedDraws() { ++fNumFailedDraws; }
504*c8dee2aaSAndroid Build Coastguard Worker 
numSubmitToGpus()505*c8dee2aaSAndroid Build Coastguard Worker         int numSubmitToGpus() const { return fNumSubmitToGpus; }
incNumSubmitToGpus()506*c8dee2aaSAndroid Build Coastguard Worker         void incNumSubmitToGpus() { ++fNumSubmitToGpus; }
507*c8dee2aaSAndroid Build Coastguard Worker 
numScratchTexturesReused()508*c8dee2aaSAndroid Build Coastguard Worker         int numScratchTexturesReused() const { return fNumScratchTexturesReused; }
incNumScratchTexturesReused()509*c8dee2aaSAndroid Build Coastguard Worker         void incNumScratchTexturesReused() { ++fNumScratchTexturesReused; }
510*c8dee2aaSAndroid Build Coastguard Worker 
numScratchMSAAAttachmentsReused()511*c8dee2aaSAndroid Build Coastguard Worker         int numScratchMSAAAttachmentsReused() const { return fNumScratchMSAAAttachmentsReused; }
incNumScratchMSAAAttachmentsReused()512*c8dee2aaSAndroid Build Coastguard Worker         void incNumScratchMSAAAttachmentsReused() { ++fNumScratchMSAAAttachmentsReused; }
513*c8dee2aaSAndroid Build Coastguard Worker 
renderPasses()514*c8dee2aaSAndroid Build Coastguard Worker         int renderPasses() const { return fRenderPasses; }
incRenderPasses()515*c8dee2aaSAndroid Build Coastguard Worker         void incRenderPasses() { fRenderPasses++; }
516*c8dee2aaSAndroid Build Coastguard Worker 
numReorderedDAGsOverBudget()517*c8dee2aaSAndroid Build Coastguard Worker         int numReorderedDAGsOverBudget() const { return fNumReorderedDAGsOverBudget; }
incNumReorderedDAGsOverBudget()518*c8dee2aaSAndroid Build Coastguard Worker         void incNumReorderedDAGsOverBudget() { fNumReorderedDAGsOverBudget++; }
519*c8dee2aaSAndroid Build Coastguard Worker 
520*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
521*c8dee2aaSAndroid Build Coastguard Worker         void dump(SkString*);
522*c8dee2aaSAndroid Build Coastguard Worker         void dumpKeyValuePairs(
523*c8dee2aaSAndroid Build Coastguard Worker                 skia_private::TArray<SkString>* keys, skia_private::TArray<double>* values);
524*c8dee2aaSAndroid Build Coastguard Worker #endif
525*c8dee2aaSAndroid Build Coastguard Worker     private:
526*c8dee2aaSAndroid Build Coastguard Worker         int fTextureCreates = 0;
527*c8dee2aaSAndroid Build Coastguard Worker         int fTextureUploads = 0;
528*c8dee2aaSAndroid Build Coastguard Worker         int fTransfersToTexture = 0;
529*c8dee2aaSAndroid Build Coastguard Worker         int fTransfersFromSurface = 0;
530*c8dee2aaSAndroid Build Coastguard Worker         int fBufferTransfers = 0;
531*c8dee2aaSAndroid Build Coastguard Worker         int fStencilAttachmentCreates = 0;
532*c8dee2aaSAndroid Build Coastguard Worker         int fMSAAAttachmentCreates = 0;
533*c8dee2aaSAndroid Build Coastguard Worker         int fNumDraws = 0;
534*c8dee2aaSAndroid Build Coastguard Worker         int fNumFailedDraws = 0;
535*c8dee2aaSAndroid Build Coastguard Worker         int fNumSubmitToGpus = 0;
536*c8dee2aaSAndroid Build Coastguard Worker         int fNumScratchTexturesReused = 0;
537*c8dee2aaSAndroid Build Coastguard Worker         int fNumScratchMSAAAttachmentsReused = 0;
538*c8dee2aaSAndroid Build Coastguard Worker         int fRenderPasses = 0;
539*c8dee2aaSAndroid Build Coastguard Worker         int fNumReorderedDAGsOverBudget = 0;
540*c8dee2aaSAndroid Build Coastguard Worker 
541*c8dee2aaSAndroid Build Coastguard Worker #else  // !GR_GPU_STATS
542*c8dee2aaSAndroid Build Coastguard Worker 
543*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
544*c8dee2aaSAndroid Build Coastguard Worker         void dump(SkString*) {}
545*c8dee2aaSAndroid Build Coastguard Worker         void dumpKeyValuePairs(skia_private::TArray<SkString>*, skia_private::TArray<double>*) {}
546*c8dee2aaSAndroid Build Coastguard Worker #endif
547*c8dee2aaSAndroid Build Coastguard Worker         void incTextureCreates() {}
548*c8dee2aaSAndroid Build Coastguard Worker         void incTextureUploads() {}
549*c8dee2aaSAndroid Build Coastguard Worker         void incTransfersToTexture() {}
550*c8dee2aaSAndroid Build Coastguard Worker         void incBufferTransfers() {}
551*c8dee2aaSAndroid Build Coastguard Worker         void incTransfersFromSurface() {}
552*c8dee2aaSAndroid Build Coastguard Worker         void incStencilAttachmentCreates() {}
553*c8dee2aaSAndroid Build Coastguard Worker         void incMSAAAttachmentCreates() {}
554*c8dee2aaSAndroid Build Coastguard Worker         void incNumDraws() {}
555*c8dee2aaSAndroid Build Coastguard Worker         void incNumFailedDraws() {}
556*c8dee2aaSAndroid Build Coastguard Worker         void incNumSubmitToGpus() {}
557*c8dee2aaSAndroid Build Coastguard Worker         void incNumScratchTexturesReused() {}
558*c8dee2aaSAndroid Build Coastguard Worker         void incNumScratchMSAAAttachmentsReused() {}
559*c8dee2aaSAndroid Build Coastguard Worker         void incRenderPasses() {}
560*c8dee2aaSAndroid Build Coastguard Worker         void incNumReorderedDAGsOverBudget() {}
561*c8dee2aaSAndroid Build Coastguard Worker #endif
562*c8dee2aaSAndroid Build Coastguard Worker     };
563*c8dee2aaSAndroid Build Coastguard Worker 
stats()564*c8dee2aaSAndroid Build Coastguard Worker     Stats* stats() { return &fStats; }
565*c8dee2aaSAndroid Build Coastguard Worker     void dumpJSON(SkJSONWriter*) const;
566*c8dee2aaSAndroid Build Coastguard Worker 
567*c8dee2aaSAndroid Build Coastguard Worker 
568*c8dee2aaSAndroid Build Coastguard Worker     /**
569*c8dee2aaSAndroid Build Coastguard Worker      * Creates a texture directly in the backend API without wrapping it in a GrTexture.
570*c8dee2aaSAndroid Build Coastguard Worker      * Must be matched with a call to deleteBackendTexture().
571*c8dee2aaSAndroid Build Coastguard Worker      *
572*c8dee2aaSAndroid Build Coastguard Worker      * If data is null the texture is uninitialized.
573*c8dee2aaSAndroid Build Coastguard Worker      *
574*c8dee2aaSAndroid Build Coastguard Worker      * If data represents a color then all texture levels are cleared to that color.
575*c8dee2aaSAndroid Build Coastguard Worker      *
576*c8dee2aaSAndroid Build Coastguard Worker      * If data represents pixmaps then it must have a either one pixmap or, if mipmapping
577*c8dee2aaSAndroid Build Coastguard Worker      * is specified, a complete MIP hierarchy of pixmaps. Additionally, if provided, the mip
578*c8dee2aaSAndroid Build Coastguard Worker      * levels must be sized correctly according to the MIP sizes implied by dimensions. They
579*c8dee2aaSAndroid Build Coastguard Worker      * must all have the same color type and that color type must be compatible with the
580*c8dee2aaSAndroid Build Coastguard Worker      * texture format.
581*c8dee2aaSAndroid Build Coastguard Worker      */
582*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture createBackendTexture(SkISize dimensions,
583*c8dee2aaSAndroid Build Coastguard Worker                                           const GrBackendFormat&,
584*c8dee2aaSAndroid Build Coastguard Worker                                           GrRenderable,
585*c8dee2aaSAndroid Build Coastguard Worker                                           skgpu::Mipmapped,
586*c8dee2aaSAndroid Build Coastguard Worker                                           GrProtected,
587*c8dee2aaSAndroid Build Coastguard Worker                                           std::string_view label);
588*c8dee2aaSAndroid Build Coastguard Worker 
589*c8dee2aaSAndroid Build Coastguard Worker     bool clearBackendTexture(const GrBackendTexture&,
590*c8dee2aaSAndroid Build Coastguard Worker                              sk_sp<skgpu::RefCntedCallback> finishedCallback,
591*c8dee2aaSAndroid Build Coastguard Worker                              std::array<float, 4> color);
592*c8dee2aaSAndroid Build Coastguard Worker 
593*c8dee2aaSAndroid Build Coastguard Worker     /**
594*c8dee2aaSAndroid Build Coastguard Worker      * Same as the createBackendTexture case except compressed backend textures can
595*c8dee2aaSAndroid Build Coastguard Worker      * never be renderable.
596*c8dee2aaSAndroid Build Coastguard Worker      */
597*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture createCompressedBackendTexture(SkISize dimensions,
598*c8dee2aaSAndroid Build Coastguard Worker                                                     const GrBackendFormat&,
599*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Mipmapped,
600*c8dee2aaSAndroid Build Coastguard Worker                                                     GrProtected);
601*c8dee2aaSAndroid Build Coastguard Worker 
602*c8dee2aaSAndroid Build Coastguard Worker     bool updateCompressedBackendTexture(const GrBackendTexture&,
603*c8dee2aaSAndroid Build Coastguard Worker                                         sk_sp<skgpu::RefCntedCallback> finishedCallback,
604*c8dee2aaSAndroid Build Coastguard Worker                                         const void* data,
605*c8dee2aaSAndroid Build Coastguard Worker                                         size_t length);
606*c8dee2aaSAndroid Build Coastguard Worker 
setBackendTextureState(const GrBackendTexture &,const skgpu::MutableTextureState &,skgpu::MutableTextureState * previousState,sk_sp<skgpu::RefCntedCallback> finishedCallback)607*c8dee2aaSAndroid Build Coastguard Worker     virtual bool setBackendTextureState(const GrBackendTexture&,
608*c8dee2aaSAndroid Build Coastguard Worker                                         const skgpu::MutableTextureState&,
609*c8dee2aaSAndroid Build Coastguard Worker                                         skgpu::MutableTextureState* previousState,
610*c8dee2aaSAndroid Build Coastguard Worker                                         // NOLINTNEXTLINE(performance-unnecessary-value-param)
611*c8dee2aaSAndroid Build Coastguard Worker                                         sk_sp<skgpu::RefCntedCallback> finishedCallback) {
612*c8dee2aaSAndroid Build Coastguard Worker         return false;
613*c8dee2aaSAndroid Build Coastguard Worker     }
614*c8dee2aaSAndroid Build Coastguard Worker 
setBackendRenderTargetState(const GrBackendRenderTarget &,const skgpu::MutableTextureState &,skgpu::MutableTextureState * previousState,sk_sp<skgpu::RefCntedCallback> finishedCallback)615*c8dee2aaSAndroid Build Coastguard Worker     virtual bool setBackendRenderTargetState(const GrBackendRenderTarget&,
616*c8dee2aaSAndroid Build Coastguard Worker                                              const skgpu::MutableTextureState&,
617*c8dee2aaSAndroid Build Coastguard Worker                                              skgpu::MutableTextureState* previousState,
618*c8dee2aaSAndroid Build Coastguard Worker                                             // NOLINTNEXTLINE(performance-unnecessary-value-param)
619*c8dee2aaSAndroid Build Coastguard Worker                                              sk_sp<skgpu::RefCntedCallback> finishedCallback) {
620*c8dee2aaSAndroid Build Coastguard Worker         return false;
621*c8dee2aaSAndroid Build Coastguard Worker     }
622*c8dee2aaSAndroid Build Coastguard Worker 
623*c8dee2aaSAndroid Build Coastguard Worker     /**
624*c8dee2aaSAndroid Build Coastguard Worker      * Frees a texture created by createBackendTexture(). If ownership of the backend
625*c8dee2aaSAndroid Build Coastguard Worker      * texture has been transferred to a context using adopt semantics this should not be called.
626*c8dee2aaSAndroid Build Coastguard Worker      */
627*c8dee2aaSAndroid Build Coastguard Worker     virtual void deleteBackendTexture(const GrBackendTexture&) = 0;
628*c8dee2aaSAndroid Build Coastguard Worker 
629*c8dee2aaSAndroid Build Coastguard Worker     /**
630*c8dee2aaSAndroid Build Coastguard Worker      * In this case we have a program descriptor and a program info but no render target.
631*c8dee2aaSAndroid Build Coastguard Worker      */
632*c8dee2aaSAndroid Build Coastguard Worker     virtual bool compile(const GrProgramDesc&, const GrProgramInfo&) = 0;
633*c8dee2aaSAndroid Build Coastguard Worker 
precompileShader(const SkData & key,const SkData & data)634*c8dee2aaSAndroid Build Coastguard Worker     virtual bool precompileShader(const SkData& key, const SkData& data) { return false; }
635*c8dee2aaSAndroid Build Coastguard Worker 
636*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
637*c8dee2aaSAndroid Build Coastguard Worker     /** Check a handle represents an actual texture in the backend API that has not been freed. */
638*c8dee2aaSAndroid Build Coastguard Worker     virtual bool isTestingOnlyBackendTexture(const GrBackendTexture&) const = 0;
639*c8dee2aaSAndroid Build Coastguard Worker 
640*c8dee2aaSAndroid Build Coastguard Worker     /**
641*c8dee2aaSAndroid Build Coastguard Worker      * Creates a GrBackendRenderTarget that can be wrapped using
642*c8dee2aaSAndroid Build Coastguard Worker      * SkSurfaces::WrapBackendRenderTarget. Ideally this is a non-textureable allocation to
643*c8dee2aaSAndroid Build Coastguard Worker      * differentiate from testing with SkSurfaces::WrapBackendTexture. When sampleCnt > 1 this
644*c8dee2aaSAndroid Build Coastguard Worker      * is used to test client wrapped allocations with MSAA where Skia does not allocate a separate
645*c8dee2aaSAndroid Build Coastguard Worker      * buffer for resolving. If the color is non-null the backing store should be cleared to the
646*c8dee2aaSAndroid Build Coastguard Worker      * passed in color.
647*c8dee2aaSAndroid Build Coastguard Worker      */
648*c8dee2aaSAndroid Build Coastguard Worker     virtual GrBackendRenderTarget createTestingOnlyBackendRenderTarget(
649*c8dee2aaSAndroid Build Coastguard Worker             SkISize dimensions,
650*c8dee2aaSAndroid Build Coastguard Worker             GrColorType,
651*c8dee2aaSAndroid Build Coastguard Worker             int sampleCount = 1,
652*c8dee2aaSAndroid Build Coastguard Worker             GrProtected = GrProtected::kNo) = 0;
653*c8dee2aaSAndroid Build Coastguard Worker 
654*c8dee2aaSAndroid Build Coastguard Worker     /**
655*c8dee2aaSAndroid Build Coastguard Worker      * Deletes a GrBackendRenderTarget allocated with the above. Synchronization to make this safe
656*c8dee2aaSAndroid Build Coastguard Worker      * is up to the caller.
657*c8dee2aaSAndroid Build Coastguard Worker      */
658*c8dee2aaSAndroid Build Coastguard Worker     virtual void deleteTestingOnlyBackendRenderTarget(const GrBackendRenderTarget&) = 0;
659*c8dee2aaSAndroid Build Coastguard Worker 
660*c8dee2aaSAndroid Build Coastguard Worker     // This is only to be used in GL-specific tests.
glContextForTesting()661*c8dee2aaSAndroid Build Coastguard Worker     virtual const GrGLContext* glContextForTesting() const { return nullptr; }
662*c8dee2aaSAndroid Build Coastguard Worker 
663*c8dee2aaSAndroid Build Coastguard Worker     // This is only to be used by testing code
resetShaderCacheForTesting()664*c8dee2aaSAndroid Build Coastguard Worker     virtual void resetShaderCacheForTesting() const {}
665*c8dee2aaSAndroid Build Coastguard Worker 
666*c8dee2aaSAndroid Build Coastguard Worker     /**
667*c8dee2aaSAndroid Build Coastguard Worker      * Inserted as a pair around a block of code to do a GPU frame capture.
668*c8dee2aaSAndroid Build Coastguard Worker      * Currently only works with the Metal backend.
669*c8dee2aaSAndroid Build Coastguard Worker      */
testingOnly_startCapture()670*c8dee2aaSAndroid Build Coastguard Worker     virtual void testingOnly_startCapture() {}
testingOnly_stopCapture()671*c8dee2aaSAndroid Build Coastguard Worker     virtual void testingOnly_stopCapture() {}
672*c8dee2aaSAndroid Build Coastguard Worker #endif
673*c8dee2aaSAndroid Build Coastguard Worker 
674*c8dee2aaSAndroid Build Coastguard Worker     // width and height may be larger than rt (if underlying API allows it).
675*c8dee2aaSAndroid Build Coastguard Worker     // Returns nullptr if compatible sb could not be created, otherwise the caller owns the ref on
676*c8dee2aaSAndroid Build Coastguard Worker     // the GrAttachment.
677*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<GrAttachment> makeStencilAttachment(const GrBackendFormat& colorFormat,
678*c8dee2aaSAndroid Build Coastguard Worker                                                       SkISize dimensions,
679*c8dee2aaSAndroid Build Coastguard Worker                                                       int numStencilSamples) = 0;
680*c8dee2aaSAndroid Build Coastguard Worker 
681*c8dee2aaSAndroid Build Coastguard Worker     virtual GrBackendFormat getPreferredStencilFormat(const GrBackendFormat&) = 0;
682*c8dee2aaSAndroid Build Coastguard Worker 
683*c8dee2aaSAndroid Build Coastguard Worker     // Creates an MSAA surface to be used as an MSAA attachment on a framebuffer.
684*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<GrAttachment> makeMSAAAttachment(SkISize dimensions,
685*c8dee2aaSAndroid Build Coastguard Worker                                                    const GrBackendFormat& format,
686*c8dee2aaSAndroid Build Coastguard Worker                                                    int numSamples,
687*c8dee2aaSAndroid Build Coastguard Worker                                                    GrProtected isProtected,
688*c8dee2aaSAndroid Build Coastguard Worker                                                    GrMemoryless isMemoryless) = 0;
689*c8dee2aaSAndroid Build Coastguard Worker 
handleDirtyContext()690*c8dee2aaSAndroid Build Coastguard Worker     void handleDirtyContext() {
691*c8dee2aaSAndroid Build Coastguard Worker         if (fResetBits) {
692*c8dee2aaSAndroid Build Coastguard Worker             this->resetContext();
693*c8dee2aaSAndroid Build Coastguard Worker         }
694*c8dee2aaSAndroid Build Coastguard Worker     }
695*c8dee2aaSAndroid Build Coastguard Worker 
storeVkPipelineCacheData()696*c8dee2aaSAndroid Build Coastguard Worker     virtual void storeVkPipelineCacheData() {}
697*c8dee2aaSAndroid Build Coastguard Worker 
698*c8dee2aaSAndroid Build Coastguard Worker     // Called before certain draws in order to guarantee coherent results from dst reads.
699*c8dee2aaSAndroid Build Coastguard Worker     virtual void xferBarrier(GrRenderTarget*, GrXferBarrierType) = 0;
700*c8dee2aaSAndroid Build Coastguard Worker 
701*c8dee2aaSAndroid Build Coastguard Worker protected:
702*c8dee2aaSAndroid Build Coastguard Worker     static bool CompressedDataIsCorrect(SkISize dimensions,
703*c8dee2aaSAndroid Build Coastguard Worker                                         SkTextureCompressionType,
704*c8dee2aaSAndroid Build Coastguard Worker                                         skgpu::Mipmapped,
705*c8dee2aaSAndroid Build Coastguard Worker                                         const void* data,
706*c8dee2aaSAndroid Build Coastguard Worker                                         size_t length);
707*c8dee2aaSAndroid Build Coastguard Worker 
708*c8dee2aaSAndroid Build Coastguard Worker     // If the surface is a texture this marks its mipmaps as dirty.
709*c8dee2aaSAndroid Build Coastguard Worker     void didWriteToSurface(GrSurface* surface,
710*c8dee2aaSAndroid Build Coastguard Worker                            GrSurfaceOrigin origin,
711*c8dee2aaSAndroid Build Coastguard Worker                            const SkIRect* bounds,
712*c8dee2aaSAndroid Build Coastguard Worker                            uint32_t mipLevels = 1) const;
713*c8dee2aaSAndroid Build Coastguard Worker 
setOOMed()714*c8dee2aaSAndroid Build Coastguard Worker     void setOOMed() { fOOMed = true; }
715*c8dee2aaSAndroid Build Coastguard Worker 
716*c8dee2aaSAndroid Build Coastguard Worker     Stats                            fStats;
717*c8dee2aaSAndroid Build Coastguard Worker 
718*c8dee2aaSAndroid Build Coastguard Worker     // Subclass must call this to initialize caps in its constructor.
719*c8dee2aaSAndroid Build Coastguard Worker     void initCaps(sk_sp<const GrCaps> caps);
720*c8dee2aaSAndroid Build Coastguard Worker 
721*c8dee2aaSAndroid Build Coastguard Worker private:
endTimerQuery(const GrTimerQuery &)722*c8dee2aaSAndroid Build Coastguard Worker     virtual void endTimerQuery(const GrTimerQuery&) { SK_ABORT("timer query not supported."); }
723*c8dee2aaSAndroid Build Coastguard Worker 
724*c8dee2aaSAndroid Build Coastguard Worker     virtual GrBackendTexture onCreateBackendTexture(SkISize dimensions,
725*c8dee2aaSAndroid Build Coastguard Worker                                                     const GrBackendFormat&,
726*c8dee2aaSAndroid Build Coastguard Worker                                                     GrRenderable,
727*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Mipmapped,
728*c8dee2aaSAndroid Build Coastguard Worker                                                     GrProtected,
729*c8dee2aaSAndroid Build Coastguard Worker                                                     std::string_view label) = 0;
730*c8dee2aaSAndroid Build Coastguard Worker 
731*c8dee2aaSAndroid Build Coastguard Worker     virtual GrBackendTexture onCreateCompressedBackendTexture(SkISize dimensions,
732*c8dee2aaSAndroid Build Coastguard Worker                                                               const GrBackendFormat&,
733*c8dee2aaSAndroid Build Coastguard Worker                                                               skgpu::Mipmapped,
734*c8dee2aaSAndroid Build Coastguard Worker                                                               GrProtected) = 0;
735*c8dee2aaSAndroid Build Coastguard Worker 
736*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onClearBackendTexture(const GrBackendTexture&,
737*c8dee2aaSAndroid Build Coastguard Worker                                        sk_sp<skgpu::RefCntedCallback> finishedCallback,
738*c8dee2aaSAndroid Build Coastguard Worker                                        std::array<float, 4> color) = 0;
739*c8dee2aaSAndroid Build Coastguard Worker 
740*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onUpdateCompressedBackendTexture(const GrBackendTexture&,
741*c8dee2aaSAndroid Build Coastguard Worker                                                   sk_sp<skgpu::RefCntedCallback> finishedCallback,
742*c8dee2aaSAndroid Build Coastguard Worker                                                   const void* data,
743*c8dee2aaSAndroid Build Coastguard Worker                                                   size_t length) = 0;
744*c8dee2aaSAndroid Build Coastguard Worker 
745*c8dee2aaSAndroid Build Coastguard Worker     // called when the 3D context state is unknown. Subclass should emit any
746*c8dee2aaSAndroid Build Coastguard Worker     // assumed 3D context state and dirty any state cache.
onResetContext(uint32_t resetBits)747*c8dee2aaSAndroid Build Coastguard Worker     virtual void onResetContext(uint32_t resetBits) {}
748*c8dee2aaSAndroid Build Coastguard Worker 
749*c8dee2aaSAndroid Build Coastguard Worker     // Implementation of resetTextureBindings.
onResetTextureBindings()750*c8dee2aaSAndroid Build Coastguard Worker     virtual void onResetTextureBindings() {}
751*c8dee2aaSAndroid Build Coastguard Worker 
752*c8dee2aaSAndroid Build Coastguard Worker     // overridden by backend-specific derived class to create objects.
753*c8dee2aaSAndroid Build Coastguard Worker     // Texture size, renderablility, format support, sample count will have already been validated
754*c8dee2aaSAndroid Build Coastguard Worker     // in base class before onCreateTexture is called.
755*c8dee2aaSAndroid Build Coastguard Worker     // If the ith bit is set in levelClearMask then the ith MIP level should be cleared.
756*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<GrTexture> onCreateTexture(SkISize dimensions,
757*c8dee2aaSAndroid Build Coastguard Worker                                              const GrBackendFormat&,
758*c8dee2aaSAndroid Build Coastguard Worker                                              GrRenderable,
759*c8dee2aaSAndroid Build Coastguard Worker                                              int renderTargetSampleCnt,
760*c8dee2aaSAndroid Build Coastguard Worker                                              skgpu::Budgeted,
761*c8dee2aaSAndroid Build Coastguard Worker                                              GrProtected,
762*c8dee2aaSAndroid Build Coastguard Worker                                              int mipLevelCoont,
763*c8dee2aaSAndroid Build Coastguard Worker                                              uint32_t levelClearMask,
764*c8dee2aaSAndroid Build Coastguard Worker                                              std::string_view label) = 0;
765*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<GrTexture> onCreateCompressedTexture(SkISize dimensions,
766*c8dee2aaSAndroid Build Coastguard Worker                                                        const GrBackendFormat&,
767*c8dee2aaSAndroid Build Coastguard Worker                                                        skgpu::Budgeted,
768*c8dee2aaSAndroid Build Coastguard Worker                                                        skgpu::Mipmapped,
769*c8dee2aaSAndroid Build Coastguard Worker                                                        GrProtected,
770*c8dee2aaSAndroid Build Coastguard Worker                                                        const void* data,
771*c8dee2aaSAndroid Build Coastguard Worker                                                        size_t dataSize) = 0;
772*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&,
773*c8dee2aaSAndroid Build Coastguard Worker                                                   GrWrapOwnership,
774*c8dee2aaSAndroid Build Coastguard Worker                                                   GrWrapCacheable,
775*c8dee2aaSAndroid Build Coastguard Worker                                                   GrIOType) = 0;
776*c8dee2aaSAndroid Build Coastguard Worker 
777*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<GrTexture> onWrapCompressedBackendTexture(const GrBackendTexture&,
778*c8dee2aaSAndroid Build Coastguard Worker                                                             GrWrapOwnership,
779*c8dee2aaSAndroid Build Coastguard Worker                                                             GrWrapCacheable) = 0;
780*c8dee2aaSAndroid Build Coastguard Worker 
781*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<GrTexture> onWrapRenderableBackendTexture(const GrBackendTexture&,
782*c8dee2aaSAndroid Build Coastguard Worker                                                             int sampleCnt,
783*c8dee2aaSAndroid Build Coastguard Worker                                                             GrWrapOwnership,
784*c8dee2aaSAndroid Build Coastguard Worker                                                             GrWrapCacheable) = 0;
785*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&) = 0;
786*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<GrRenderTarget> onWrapVulkanSecondaryCBAsRenderTarget(const SkImageInfo&,
787*c8dee2aaSAndroid Build Coastguard Worker                                                                         const GrVkDrawableInfo&);
788*c8dee2aaSAndroid Build Coastguard Worker 
789*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<GrGpuBuffer> onCreateBuffer(size_t size,
790*c8dee2aaSAndroid Build Coastguard Worker                                               GrGpuBufferType intendedType,
791*c8dee2aaSAndroid Build Coastguard Worker                                               GrAccessPattern) = 0;
792*c8dee2aaSAndroid Build Coastguard Worker 
793*c8dee2aaSAndroid Build Coastguard Worker     // overridden by backend-specific derived class to perform the surface read
794*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onReadPixels(GrSurface*,
795*c8dee2aaSAndroid Build Coastguard Worker                               SkIRect,
796*c8dee2aaSAndroid Build Coastguard Worker                               GrColorType surfaceColorType,
797*c8dee2aaSAndroid Build Coastguard Worker                               GrColorType dstColorType,
798*c8dee2aaSAndroid Build Coastguard Worker                               void*,
799*c8dee2aaSAndroid Build Coastguard Worker                               size_t rowBytes) = 0;
800*c8dee2aaSAndroid Build Coastguard Worker 
801*c8dee2aaSAndroid Build Coastguard Worker     // overridden by backend-specific derived class to perform the surface write
802*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onWritePixels(GrSurface*,
803*c8dee2aaSAndroid Build Coastguard Worker                                SkIRect,
804*c8dee2aaSAndroid Build Coastguard Worker                                GrColorType surfaceColorType,
805*c8dee2aaSAndroid Build Coastguard Worker                                GrColorType srcColorType,
806*c8dee2aaSAndroid Build Coastguard Worker                                const GrMipLevel[],
807*c8dee2aaSAndroid Build Coastguard Worker                                int mipLevelCount,
808*c8dee2aaSAndroid Build Coastguard Worker                                bool prepForTexSampling) = 0;
809*c8dee2aaSAndroid Build Coastguard Worker 
810*c8dee2aaSAndroid Build Coastguard Worker     // overridden by backend-specific derived class to perform the buffer transfer
811*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onTransferFromBufferToBuffer(sk_sp<GrGpuBuffer> src,
812*c8dee2aaSAndroid Build Coastguard Worker                                               size_t srcOffset,
813*c8dee2aaSAndroid Build Coastguard Worker                                               sk_sp<GrGpuBuffer> dst,
814*c8dee2aaSAndroid Build Coastguard Worker                                               size_t dstOffset,
815*c8dee2aaSAndroid Build Coastguard Worker                                               size_t size) = 0;
816*c8dee2aaSAndroid Build Coastguard Worker 
817*c8dee2aaSAndroid Build Coastguard Worker     // overridden by backend-specific derived class to perform the texture transfer
818*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onTransferPixelsTo(GrTexture*,
819*c8dee2aaSAndroid Build Coastguard Worker                                     SkIRect,
820*c8dee2aaSAndroid Build Coastguard Worker                                     GrColorType textureColorType,
821*c8dee2aaSAndroid Build Coastguard Worker                                     GrColorType bufferColorType,
822*c8dee2aaSAndroid Build Coastguard Worker                                     sk_sp<GrGpuBuffer> transferBuffer,
823*c8dee2aaSAndroid Build Coastguard Worker                                     size_t offset,
824*c8dee2aaSAndroid Build Coastguard Worker                                     size_t rowBytes) = 0;
825*c8dee2aaSAndroid Build Coastguard Worker 
826*c8dee2aaSAndroid Build Coastguard Worker     // overridden by backend-specific derived class to perform the surface transfer
827*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onTransferPixelsFrom(GrSurface*,
828*c8dee2aaSAndroid Build Coastguard Worker                                       SkIRect,
829*c8dee2aaSAndroid Build Coastguard Worker                                       GrColorType surfaceColorType,
830*c8dee2aaSAndroid Build Coastguard Worker                                       GrColorType bufferColorType,
831*c8dee2aaSAndroid Build Coastguard Worker                                       sk_sp<GrGpuBuffer> transferBuffer,
832*c8dee2aaSAndroid Build Coastguard Worker                                       size_t offset) = 0;
833*c8dee2aaSAndroid Build Coastguard Worker 
834*c8dee2aaSAndroid Build Coastguard Worker     // overridden by backend-specific derived class to perform the resolve
835*c8dee2aaSAndroid Build Coastguard Worker     virtual void onResolveRenderTarget(GrRenderTarget* target, const SkIRect& resolveRect) = 0;
836*c8dee2aaSAndroid Build Coastguard Worker 
837*c8dee2aaSAndroid Build Coastguard Worker     // overridden by backend specific derived class to perform mip map level regeneration.
838*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onRegenerateMipMapLevels(GrTexture*) = 0;
839*c8dee2aaSAndroid Build Coastguard Worker 
840*c8dee2aaSAndroid Build Coastguard Worker     // overridden by backend specific derived class to perform the copy surface
841*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onCopySurface(GrSurface* dst, const SkIRect& dstRect,
842*c8dee2aaSAndroid Build Coastguard Worker                                GrSurface* src, const SkIRect& srcRect,
843*c8dee2aaSAndroid Build Coastguard Worker                                GrSamplerState::Filter) = 0;
844*c8dee2aaSAndroid Build Coastguard Worker 
845*c8dee2aaSAndroid Build Coastguard Worker     virtual GrOpsRenderPass* onGetOpsRenderPass(
846*c8dee2aaSAndroid Build Coastguard Worker             GrRenderTarget* renderTarget,
847*c8dee2aaSAndroid Build Coastguard Worker             bool useMSAASurface,
848*c8dee2aaSAndroid Build Coastguard Worker             GrAttachment* stencil,
849*c8dee2aaSAndroid Build Coastguard Worker             GrSurfaceOrigin,
850*c8dee2aaSAndroid Build Coastguard Worker             const SkIRect& bounds,
851*c8dee2aaSAndroid Build Coastguard Worker             const GrOpsRenderPass::LoadAndStoreInfo&,
852*c8dee2aaSAndroid Build Coastguard Worker             const GrOpsRenderPass::StencilLoadAndStoreInfo&,
853*c8dee2aaSAndroid Build Coastguard Worker             const skia_private::TArray<GrSurfaceProxy*, true>& sampledProxies,
854*c8dee2aaSAndroid Build Coastguard Worker             GrXferBarrierFlags renderPassXferBarriers) = 0;
855*c8dee2aaSAndroid Build Coastguard Worker 
prepareSurfacesForBackendAccessAndStateUpdates(SkSpan<GrSurfaceProxy * > proxies,SkSurfaces::BackendSurfaceAccess access,const skgpu::MutableTextureState * newState)856*c8dee2aaSAndroid Build Coastguard Worker     virtual void prepareSurfacesForBackendAccessAndStateUpdates(
857*c8dee2aaSAndroid Build Coastguard Worker             SkSpan<GrSurfaceProxy*> proxies,
858*c8dee2aaSAndroid Build Coastguard Worker             SkSurfaces::BackendSurfaceAccess access,
859*c8dee2aaSAndroid Build Coastguard Worker             const skgpu::MutableTextureState* newState) {}
860*c8dee2aaSAndroid Build Coastguard Worker 
861*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onSubmitToGpu(const GrSubmitInfo& info) = 0;
862*c8dee2aaSAndroid Build Coastguard Worker 
863*c8dee2aaSAndroid Build Coastguard Worker     void reportSubmitHistograms();
onReportSubmitHistograms()864*c8dee2aaSAndroid Build Coastguard Worker     virtual void onReportSubmitHistograms() {}
865*c8dee2aaSAndroid Build Coastguard Worker 
866*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_ENABLE_DUMP_GPU
onDumpJSON(SkJSONWriter *)867*c8dee2aaSAndroid Build Coastguard Worker     virtual void onDumpJSON(SkJSONWriter*) const {}
868*c8dee2aaSAndroid Build Coastguard Worker #endif
869*c8dee2aaSAndroid Build Coastguard Worker 
870*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> createTextureCommon(SkISize,
871*c8dee2aaSAndroid Build Coastguard Worker                                          const GrBackendFormat&,
872*c8dee2aaSAndroid Build Coastguard Worker                                          GrTextureType textureType,
873*c8dee2aaSAndroid Build Coastguard Worker                                          GrRenderable,
874*c8dee2aaSAndroid Build Coastguard Worker                                          int renderTargetSampleCnt,
875*c8dee2aaSAndroid Build Coastguard Worker                                          skgpu::Budgeted,
876*c8dee2aaSAndroid Build Coastguard Worker                                          GrProtected,
877*c8dee2aaSAndroid Build Coastguard Worker                                          int mipLevelCnt,
878*c8dee2aaSAndroid Build Coastguard Worker                                          uint32_t levelClearMask,
879*c8dee2aaSAndroid Build Coastguard Worker                                          std::string_view label);
880*c8dee2aaSAndroid Build Coastguard Worker 
resetContext()881*c8dee2aaSAndroid Build Coastguard Worker     void resetContext() {
882*c8dee2aaSAndroid Build Coastguard Worker         this->onResetContext(fResetBits);
883*c8dee2aaSAndroid Build Coastguard Worker         fResetBits = 0;
884*c8dee2aaSAndroid Build Coastguard Worker     }
885*c8dee2aaSAndroid Build Coastguard Worker 
886*c8dee2aaSAndroid Build Coastguard Worker     void callSubmittedProcs(bool success);
887*c8dee2aaSAndroid Build Coastguard Worker 
888*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const GrCaps>             fCaps;
889*c8dee2aaSAndroid Build Coastguard Worker 
890*c8dee2aaSAndroid Build Coastguard Worker     uint32_t fResetBits;
891*c8dee2aaSAndroid Build Coastguard Worker     // The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu.
892*c8dee2aaSAndroid Build Coastguard Worker     GrDirectContext* fContext;
893*c8dee2aaSAndroid Build Coastguard Worker 
894*c8dee2aaSAndroid Build Coastguard Worker     struct SubmittedProc {
SubmittedProcSubmittedProc895*c8dee2aaSAndroid Build Coastguard Worker         SubmittedProc(GrGpuSubmittedProc proc, GrGpuSubmittedContext context)
896*c8dee2aaSAndroid Build Coastguard Worker                 : fProc(proc), fContext(context) {}
897*c8dee2aaSAndroid Build Coastguard Worker 
898*c8dee2aaSAndroid Build Coastguard Worker         GrGpuSubmittedProc fProc;
899*c8dee2aaSAndroid Build Coastguard Worker         GrGpuSubmittedContext fContext;
900*c8dee2aaSAndroid Build Coastguard Worker     };
901*c8dee2aaSAndroid Build Coastguard Worker     skia_private::STArray<4, SubmittedProc> fSubmittedProcs;
902*c8dee2aaSAndroid Build Coastguard Worker 
903*c8dee2aaSAndroid Build Coastguard Worker     bool fOOMed = false;
904*c8dee2aaSAndroid Build Coastguard Worker 
905*c8dee2aaSAndroid Build Coastguard Worker #if SK_HISTOGRAMS_ENABLED
906*c8dee2aaSAndroid Build Coastguard Worker     int fCurrentSubmitRenderPassCount = 0;
907*c8dee2aaSAndroid Build Coastguard Worker #endif
908*c8dee2aaSAndroid Build Coastguard Worker 
909*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkRefCnt;
910*c8dee2aaSAndroid Build Coastguard Worker };
911*c8dee2aaSAndroid Build Coastguard Worker 
912*c8dee2aaSAndroid Build Coastguard Worker #endif
913