xref: /aosp_15_r20/external/skia/include/gpu/graphite/Surface.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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