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