1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google LLC 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 skgpu_graphite_Surface_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_Surface_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker #include <string_view> 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class SkImage; 18*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo; 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 21*c8dee2aaSAndroid Build Coastguard Worker class BackendTexture; 22*c8dee2aaSAndroid Build Coastguard Worker class Recorder; 23*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker namespace SkSurfaces { 26*c8dee2aaSAndroid Build Coastguard Worker using ReleaseContext = void*; 27*c8dee2aaSAndroid Build Coastguard Worker using TextureReleaseProc = void (*)(ReleaseContext); 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker /** 30*c8dee2aaSAndroid Build Coastguard Worker * The 'AsImage' and 'AsImageCopy' API/entry points are currently only available for 31*c8dee2aaSAndroid Build Coastguard Worker * Graphite. 32*c8dee2aaSAndroid Build Coastguard Worker * 33*c8dee2aaSAndroid Build Coastguard Worker * In this API, SkSurface no longer supports copy-on-write behavior. Instead, when creating 34*c8dee2aaSAndroid Build Coastguard Worker * an image for a surface, the client must explicitly indicate if a copy should be made. 35*c8dee2aaSAndroid Build Coastguard Worker * In both of the below calls the resource backing the surface will never change. 36*c8dee2aaSAndroid Build Coastguard Worker * 37*c8dee2aaSAndroid Build Coastguard Worker * The 'AsImage' entry point has some major ramifications for the mutability of the 38*c8dee2aaSAndroid Build Coastguard Worker * returned SkImage. Since the originating surface and the returned image share the 39*c8dee2aaSAndroid Build Coastguard Worker * same backing, care must be taken by the client to ensure that the contents of the image 40*c8dee2aaSAndroid Build Coastguard Worker * reflect the desired contents when it is consumed by the gpu. 41*c8dee2aaSAndroid Build Coastguard Worker * Note: if the backing GPU buffer isn't textureable this method will return null. Graphite 42*c8dee2aaSAndroid Build Coastguard Worker * will not attempt to make a copy. 43*c8dee2aaSAndroid Build Coastguard Worker * Note: For 'AsImage', the mipmapping of the image will match that of the source surface. 44*c8dee2aaSAndroid Build Coastguard Worker * 45*c8dee2aaSAndroid Build Coastguard Worker * The 'AsImageCopy' entry point allows subsetting and the addition of mipmaps (since 46*c8dee2aaSAndroid Build Coastguard Worker * a copy is already being made). 47*c8dee2aaSAndroid Build Coastguard Worker * 48*c8dee2aaSAndroid Build Coastguard Worker * In Graphite, the legacy API call (i.e., makeImageSnapshot) will just always make a copy. 49*c8dee2aaSAndroid Build Coastguard Worker */ 50*c8dee2aaSAndroid Build Coastguard Worker SK_API sk_sp<SkImage> AsImage(sk_sp<const SkSurface>); 51*c8dee2aaSAndroid Build Coastguard Worker SK_API sk_sp<SkImage> AsImageCopy(sk_sp<const SkSurface>, 52*c8dee2aaSAndroid Build Coastguard Worker const SkIRect* subset = nullptr, 53*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped = skgpu::Mipmapped::kNo); 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker /** 56*c8dee2aaSAndroid Build Coastguard Worker * In Graphite, while clients hold a ref on an SkSurface, the backing gpu object does _not_ 57*c8dee2aaSAndroid Build Coastguard Worker * count against the budget. Once an SkSurface is freed, the backing gpu object may or may 58*c8dee2aaSAndroid Build Coastguard Worker * not become a scratch (i.e., reusable) resource but, if it does, it will be counted against 59*c8dee2aaSAndroid Build Coastguard Worker * the budget. 60*c8dee2aaSAndroid Build Coastguard Worker */ 61*c8dee2aaSAndroid Build Coastguard Worker SK_API sk_sp<SkSurface> RenderTarget(skgpu::graphite::Recorder*, 62*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo& imageInfo, 63*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped = skgpu::Mipmapped::kNo, 64*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps* surfaceProps = nullptr, 65*c8dee2aaSAndroid Build Coastguard Worker std::string_view label = {}); 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker /** 68*c8dee2aaSAndroid Build Coastguard Worker * Wraps a GPU-backed texture in an SkSurface. Depending on the backend gpu API, the caller may 69*c8dee2aaSAndroid Build Coastguard Worker * be required to ensure the texture is valid for the lifetime of the returned SkSurface. The 70*c8dee2aaSAndroid Build Coastguard Worker * required lifetimes for the specific apis are: 71*c8dee2aaSAndroid Build Coastguard Worker * Metal: Skia will call retain on the underlying MTLTexture so the caller can drop it once 72*c8dee2aaSAndroid Build Coastguard Worker * this call returns. 73*c8dee2aaSAndroid Build Coastguard Worker * 74*c8dee2aaSAndroid Build Coastguard Worker * SkSurface is returned if all the parameters are valid. The backendTexture is valid if its 75*c8dee2aaSAndroid Build Coastguard Worker * format agrees with colorSpace and recorder; for instance, if backendTexture has an sRGB 76*c8dee2aaSAndroid Build Coastguard Worker * configuration, then the recorder must support sRGB, and colorSpace must be present. Further, 77*c8dee2aaSAndroid Build Coastguard Worker * backendTexture's width and height must not exceed the recorder's capabilities, and the 78*c8dee2aaSAndroid Build Coastguard Worker * recorder must be able to support the back-end texture. 79*c8dee2aaSAndroid Build Coastguard Worker */ 80*c8dee2aaSAndroid Build Coastguard Worker SK_API sk_sp<SkSurface> WrapBackendTexture(skgpu::graphite::Recorder*, 81*c8dee2aaSAndroid Build Coastguard Worker const skgpu::graphite::BackendTexture&, 82*c8dee2aaSAndroid Build Coastguard Worker SkColorType colorType, 83*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> colorSpace, 84*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps* props, 85*c8dee2aaSAndroid Build Coastguard Worker TextureReleaseProc = nullptr, 86*c8dee2aaSAndroid Build Coastguard Worker ReleaseContext = nullptr, 87*c8dee2aaSAndroid Build Coastguard Worker std::string_view label = {}); 88*c8dee2aaSAndroid Build Coastguard Worker } // namespace SkSurfaces 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_Surface_DEFINED 91