xref: /aosp_15_r20/external/skia/include/gpu/ganesh/SkSurfaceGanesh.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 SkSurfaceGanesh_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkSurfaceGanesh_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAPI.h"
16*c8dee2aaSAndroid Build Coastguard Worker 
17*c8dee2aaSAndroid Build Coastguard Worker class GrBackendRenderTarget;
18*c8dee2aaSAndroid Build Coastguard Worker class GrBackendTexture;
19*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext;
20*c8dee2aaSAndroid Build Coastguard Worker class SkColorSpace;
21*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceCharacterization;
22*c8dee2aaSAndroid Build Coastguard Worker class SkSurfaceProps;
23*c8dee2aaSAndroid Build Coastguard Worker enum SkColorType : int;
24*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu {
25*c8dee2aaSAndroid Build Coastguard Worker enum class Budgeted : bool;
26*c8dee2aaSAndroid Build Coastguard Worker }
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker namespace SkSurfaces {
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker /** Caller data passed to RenderTarget/TextureReleaseProc; may be nullptr. */
31*c8dee2aaSAndroid Build Coastguard Worker using ReleaseContext = void*;
32*c8dee2aaSAndroid Build Coastguard Worker 
33*c8dee2aaSAndroid Build Coastguard Worker /** User function called when supplied render target may be deleted. */
34*c8dee2aaSAndroid Build Coastguard Worker using RenderTargetReleaseProc = void (*)(ReleaseContext);
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker /** User function called when supplied texture may be deleted. */
37*c8dee2aaSAndroid Build Coastguard Worker using TextureReleaseProc = void (*)(ReleaseContext);
38*c8dee2aaSAndroid Build Coastguard Worker 
39*c8dee2aaSAndroid Build Coastguard Worker /** Returns SkSurface on GPU indicated by context. Allocates memory for
40*c8dee2aaSAndroid Build Coastguard Worker     pixels, based on the width, height, and SkColorType in SkImageInfo.  budgeted
41*c8dee2aaSAndroid Build Coastguard Worker     selects whether allocation for pixels is tracked by context. imageInfo
42*c8dee2aaSAndroid Build Coastguard Worker     describes the pixel format in SkColorType, and transparency in
43*c8dee2aaSAndroid Build Coastguard Worker     SkAlphaType, and color matching in SkColorSpace.
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker     sampleCount requests the number of samples per pixel.
46*c8dee2aaSAndroid Build Coastguard Worker     Pass zero to disable multi-sample anti-aliasing.  The request is rounded
47*c8dee2aaSAndroid Build Coastguard Worker     up to the next supported count, or rounded down if it is larger than the
48*c8dee2aaSAndroid Build Coastguard Worker     maximum supported count.
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker     surfaceOrigin pins either the top-left or the bottom-left corner to the origin.
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker     shouldCreateWithMips hints that SkImage returned by makeImageSnapshot() is mip map.
53*c8dee2aaSAndroid Build Coastguard Worker 
54*c8dee2aaSAndroid Build Coastguard Worker     @param context               GPU context
55*c8dee2aaSAndroid Build Coastguard Worker     @param imageInfo             width, height, SkColorType, SkAlphaType, SkColorSpace;
56*c8dee2aaSAndroid Build Coastguard Worker                                  width, or height, or both, may be zero
57*c8dee2aaSAndroid Build Coastguard Worker     @param sampleCount           samples per pixel, or 0 to disable full scene anti-aliasing
58*c8dee2aaSAndroid Build Coastguard Worker     @param surfaceOrigin         How to align the pixel data.
59*c8dee2aaSAndroid Build Coastguard Worker     @param surfaceProps          LCD striping orientation and setting for device independent
60*c8dee2aaSAndroid Build Coastguard Worker                                  fonts; may be nullptr
61*c8dee2aaSAndroid Build Coastguard Worker     @param shouldCreateWithMips  hint that SkSurface will host mip map images
62*c8dee2aaSAndroid Build Coastguard Worker     @return                      SkSurface if all parameters are valid; otherwise, nullptr
63*c8dee2aaSAndroid Build Coastguard Worker */
64*c8dee2aaSAndroid Build Coastguard Worker SK_API sk_sp<SkSurface> RenderTarget(GrRecordingContext* context,
65*c8dee2aaSAndroid Build Coastguard Worker                                      skgpu::Budgeted budgeted,
66*c8dee2aaSAndroid Build Coastguard Worker                                      const SkImageInfo& imageInfo,
67*c8dee2aaSAndroid Build Coastguard Worker                                      int sampleCount,
68*c8dee2aaSAndroid Build Coastguard Worker                                      GrSurfaceOrigin surfaceOrigin,
69*c8dee2aaSAndroid Build Coastguard Worker                                      const SkSurfaceProps* surfaceProps,
70*c8dee2aaSAndroid Build Coastguard Worker                                      bool shouldCreateWithMips = false,
71*c8dee2aaSAndroid Build Coastguard Worker                                      bool isProtected = false);
RenderTarget(GrRecordingContext * context,skgpu::Budgeted budgeted,const SkImageInfo & imageInfo,int sampleCount,const SkSurfaceProps * surfaceProps)72*c8dee2aaSAndroid Build Coastguard Worker inline sk_sp<SkSurface> RenderTarget(GrRecordingContext* context,
73*c8dee2aaSAndroid Build Coastguard Worker                                      skgpu::Budgeted budgeted,
74*c8dee2aaSAndroid Build Coastguard Worker                                      const SkImageInfo& imageInfo,
75*c8dee2aaSAndroid Build Coastguard Worker                                      int sampleCount,
76*c8dee2aaSAndroid Build Coastguard Worker                                      const SkSurfaceProps* surfaceProps) {
77*c8dee2aaSAndroid Build Coastguard Worker     return RenderTarget(
78*c8dee2aaSAndroid Build Coastguard Worker             context, budgeted, imageInfo, sampleCount, kBottomLeft_GrSurfaceOrigin, surfaceProps);
79*c8dee2aaSAndroid Build Coastguard Worker }
RenderTarget(GrRecordingContext * context,skgpu::Budgeted budgeted,const SkImageInfo & imageInfo)80*c8dee2aaSAndroid Build Coastguard Worker inline sk_sp<SkSurface> RenderTarget(GrRecordingContext* context,
81*c8dee2aaSAndroid Build Coastguard Worker                                      skgpu::Budgeted budgeted,
82*c8dee2aaSAndroid Build Coastguard Worker                                      const SkImageInfo& imageInfo) {
83*c8dee2aaSAndroid Build Coastguard Worker     if (!imageInfo.width() || !imageInfo.height()) {
84*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
85*c8dee2aaSAndroid Build Coastguard Worker     }
86*c8dee2aaSAndroid Build Coastguard Worker     return RenderTarget(context, budgeted, imageInfo, 0, kBottomLeft_GrSurfaceOrigin, nullptr);
87*c8dee2aaSAndroid Build Coastguard Worker }
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker /** Returns SkSurface on GPU indicated by context that is compatible with the provided
90*c8dee2aaSAndroid Build Coastguard Worker     characterization. budgeted selects whether allocation for pixels is tracked by context.
91*c8dee2aaSAndroid Build Coastguard Worker 
92*c8dee2aaSAndroid Build Coastguard Worker     @param context           GPU context
93*c8dee2aaSAndroid Build Coastguard Worker     @param characterization  description of the desired SkSurface
94*c8dee2aaSAndroid Build Coastguard Worker     @return                  SkSurface if all parameters are valid; otherwise, nullptr
95*c8dee2aaSAndroid Build Coastguard Worker */
96*c8dee2aaSAndroid Build Coastguard Worker SK_API sk_sp<SkSurface> RenderTarget(GrRecordingContext* context,
97*c8dee2aaSAndroid Build Coastguard Worker                                      const GrSurfaceCharacterization& characterization,
98*c8dee2aaSAndroid Build Coastguard Worker                                      skgpu::Budgeted budgeted);
99*c8dee2aaSAndroid Build Coastguard Worker 
100*c8dee2aaSAndroid Build Coastguard Worker /** Wraps a GPU-backed texture into SkSurface. Caller must ensure the texture is
101*c8dee2aaSAndroid Build Coastguard Worker     valid for the lifetime of returned SkSurface. If sampleCnt greater than zero,
102*c8dee2aaSAndroid Build Coastguard Worker     creates an intermediate MSAA SkSurface which is used for drawing backendTexture.
103*c8dee2aaSAndroid Build Coastguard Worker 
104*c8dee2aaSAndroid Build Coastguard Worker     SkSurface is returned if all parameters are valid. backendTexture is valid if
105*c8dee2aaSAndroid Build Coastguard Worker     its pixel configuration agrees with colorSpace and context; for instance, if
106*c8dee2aaSAndroid Build Coastguard Worker     backendTexture has an sRGB configuration, then context must support sRGB,
107*c8dee2aaSAndroid Build Coastguard Worker     and colorSpace must be present. Further, backendTexture width and height must
108*c8dee2aaSAndroid Build Coastguard Worker     not exceed context capabilities, and the context must be able to support
109*c8dee2aaSAndroid Build Coastguard Worker     back-end textures.
110*c8dee2aaSAndroid Build Coastguard Worker 
111*c8dee2aaSAndroid Build Coastguard Worker     Upon success textureReleaseProc is called when it is safe to delete the texture in the
112*c8dee2aaSAndroid Build Coastguard Worker     backend API (accounting only for use of the texture by this surface). If SkSurface creation
113*c8dee2aaSAndroid Build Coastguard Worker     fails textureReleaseProc is called before this function returns.
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker     @param context             GPU context
116*c8dee2aaSAndroid Build Coastguard Worker     @param backendTexture      texture residing on GPU
117*c8dee2aaSAndroid Build Coastguard Worker     @param sampleCnt           samples per pixel, or 0 to disable full scene anti-aliasing
118*c8dee2aaSAndroid Build Coastguard Worker     @param colorSpace          range of colors; may be nullptr
119*c8dee2aaSAndroid Build Coastguard Worker     @param surfaceProps        LCD striping orientation and setting for device independent
120*c8dee2aaSAndroid Build Coastguard Worker                                fonts; may be nullptr
121*c8dee2aaSAndroid Build Coastguard Worker     @param textureReleaseProc  function called when texture can be released
122*c8dee2aaSAndroid Build Coastguard Worker     @param releaseContext      state passed to textureReleaseProc
123*c8dee2aaSAndroid Build Coastguard Worker     @return                    SkSurface if all parameters are valid; otherwise, nullptr
124*c8dee2aaSAndroid Build Coastguard Worker */
125*c8dee2aaSAndroid Build Coastguard Worker SK_API sk_sp<SkSurface> WrapBackendTexture(GrRecordingContext* context,
126*c8dee2aaSAndroid Build Coastguard Worker                                            const GrBackendTexture& backendTexture,
127*c8dee2aaSAndroid Build Coastguard Worker                                            GrSurfaceOrigin origin,
128*c8dee2aaSAndroid Build Coastguard Worker                                            int sampleCnt,
129*c8dee2aaSAndroid Build Coastguard Worker                                            SkColorType colorType,
130*c8dee2aaSAndroid Build Coastguard Worker                                            sk_sp<SkColorSpace> colorSpace,
131*c8dee2aaSAndroid Build Coastguard Worker                                            const SkSurfaceProps* surfaceProps,
132*c8dee2aaSAndroid Build Coastguard Worker                                            TextureReleaseProc textureReleaseProc = nullptr,
133*c8dee2aaSAndroid Build Coastguard Worker                                            ReleaseContext releaseContext = nullptr);
134*c8dee2aaSAndroid Build Coastguard Worker 
135*c8dee2aaSAndroid Build Coastguard Worker /** Wraps a GPU-backed buffer into SkSurface. Caller must ensure backendRenderTarget
136*c8dee2aaSAndroid Build Coastguard Worker     is valid for the lifetime of returned SkSurface.
137*c8dee2aaSAndroid Build Coastguard Worker 
138*c8dee2aaSAndroid Build Coastguard Worker     SkSurface is returned if all parameters are valid. backendRenderTarget is valid if
139*c8dee2aaSAndroid Build Coastguard Worker     its pixel configuration agrees with colorSpace and context; for instance, if
140*c8dee2aaSAndroid Build Coastguard Worker     backendRenderTarget has an sRGB configuration, then context must support sRGB,
141*c8dee2aaSAndroid Build Coastguard Worker     and colorSpace must be present. Further, backendRenderTarget width and height must
142*c8dee2aaSAndroid Build Coastguard Worker     not exceed context capabilities, and the context must be able to support
143*c8dee2aaSAndroid Build Coastguard Worker     back-end render targets.
144*c8dee2aaSAndroid Build Coastguard Worker 
145*c8dee2aaSAndroid Build Coastguard Worker     Upon success releaseProc is called when it is safe to delete the render target in the
146*c8dee2aaSAndroid Build Coastguard Worker     backend API (accounting only for use of the render target by this surface). If SkSurface
147*c8dee2aaSAndroid Build Coastguard Worker     creation fails releaseProc is called before this function returns.
148*c8dee2aaSAndroid Build Coastguard Worker 
149*c8dee2aaSAndroid Build Coastguard Worker     @param context                  GPU context
150*c8dee2aaSAndroid Build Coastguard Worker     @param backendRenderTarget      GPU intermediate memory buffer
151*c8dee2aaSAndroid Build Coastguard Worker     @param colorSpace               range of colors
152*c8dee2aaSAndroid Build Coastguard Worker     @param surfaceProps             LCD striping orientation and setting for device independent
153*c8dee2aaSAndroid Build Coastguard Worker                                     fonts; may be nullptr
154*c8dee2aaSAndroid Build Coastguard Worker     @param releaseProc              function called when backendRenderTarget can be released
155*c8dee2aaSAndroid Build Coastguard Worker     @param releaseContext           state passed to releaseProc
156*c8dee2aaSAndroid Build Coastguard Worker     @return                         SkSurface if all parameters are valid; otherwise, nullptr
157*c8dee2aaSAndroid Build Coastguard Worker */
158*c8dee2aaSAndroid Build Coastguard Worker SK_API sk_sp<SkSurface> WrapBackendRenderTarget(GrRecordingContext* context,
159*c8dee2aaSAndroid Build Coastguard Worker                                                 const GrBackendRenderTarget& backendRenderTarget,
160*c8dee2aaSAndroid Build Coastguard Worker                                                 GrSurfaceOrigin origin,
161*c8dee2aaSAndroid Build Coastguard Worker                                                 SkColorType colorType,
162*c8dee2aaSAndroid Build Coastguard Worker                                                 sk_sp<SkColorSpace> colorSpace,
163*c8dee2aaSAndroid Build Coastguard Worker                                                 const SkSurfaceProps* surfaceProps,
164*c8dee2aaSAndroid Build Coastguard Worker                                                 RenderTargetReleaseProc releaseProc = nullptr,
165*c8dee2aaSAndroid Build Coastguard Worker                                                 ReleaseContext releaseContext = nullptr);
166*c8dee2aaSAndroid Build Coastguard Worker 
167*c8dee2aaSAndroid Build Coastguard Worker using BackendHandleAccess = SkSurface::BackendHandleAccess;
168*c8dee2aaSAndroid Build Coastguard Worker 
169*c8dee2aaSAndroid Build Coastguard Worker /** Retrieves the back-end texture. If SkSurface has no back-end texture, an invalid
170*c8dee2aaSAndroid Build Coastguard Worker     object is returned. Call GrBackendTexture::isValid to determine if the result
171*c8dee2aaSAndroid Build Coastguard Worker     is valid.
172*c8dee2aaSAndroid Build Coastguard Worker 
173*c8dee2aaSAndroid Build Coastguard Worker     The returned GrBackendTexture should be discarded if the SkSurface is drawn to or deleted.
174*c8dee2aaSAndroid Build Coastguard Worker 
175*c8dee2aaSAndroid Build Coastguard Worker     @return                     GPU texture reference; invalid on failure
176*c8dee2aaSAndroid Build Coastguard Worker */
177*c8dee2aaSAndroid Build Coastguard Worker SK_API GrBackendTexture GetBackendTexture(SkSurface*, BackendHandleAccess);
178*c8dee2aaSAndroid Build Coastguard Worker 
179*c8dee2aaSAndroid Build Coastguard Worker /** Retrieves the back-end render target. If SkSurface has no back-end render target, an invalid
180*c8dee2aaSAndroid Build Coastguard Worker     object is returned. Call GrBackendRenderTarget::isValid to determine if the result
181*c8dee2aaSAndroid Build Coastguard Worker     is valid.
182*c8dee2aaSAndroid Build Coastguard Worker 
183*c8dee2aaSAndroid Build Coastguard Worker     The returned GrBackendRenderTarget should be discarded if the SkSurface is drawn to
184*c8dee2aaSAndroid Build Coastguard Worker     or deleted.
185*c8dee2aaSAndroid Build Coastguard Worker 
186*c8dee2aaSAndroid Build Coastguard Worker     @return                     GPU render target reference; invalid on failure
187*c8dee2aaSAndroid Build Coastguard Worker */
188*c8dee2aaSAndroid Build Coastguard Worker SK_API GrBackendRenderTarget GetBackendRenderTarget(SkSurface*, BackendHandleAccess);
189*c8dee2aaSAndroid Build Coastguard Worker 
190*c8dee2aaSAndroid Build Coastguard Worker /** If a surface is a Ganesh-backed surface, is being drawn with MSAA, and there is a resolve
191*c8dee2aaSAndroid Build Coastguard Worker     texture, this call will insert a resolve command into the stream of gpu commands. In order
192*c8dee2aaSAndroid Build Coastguard Worker     for the resolve to actually have an effect, the work still needs to be flushed and submitted
193*c8dee2aaSAndroid Build Coastguard Worker     to the GPU after recording the resolve command. If a resolve is not supported or the
194*c8dee2aaSAndroid Build Coastguard Worker     SkSurface has no dirty work to resolve, then this call is a no-op.
195*c8dee2aaSAndroid Build Coastguard Worker 
196*c8dee2aaSAndroid Build Coastguard Worker     This call is most useful when the SkSurface is created by wrapping a single sampled gpu
197*c8dee2aaSAndroid Build Coastguard Worker     texture, but asking Skia to render with MSAA. If the client wants to use the wrapped texture
198*c8dee2aaSAndroid Build Coastguard Worker     outside of Skia, the only way to trigger a resolve is either to call this command or use
199*c8dee2aaSAndroid Build Coastguard Worker     GrDirectContext::flush.
200*c8dee2aaSAndroid Build Coastguard Worker  */
201*c8dee2aaSAndroid Build Coastguard Worker SK_API void ResolveMSAA(SkSurface* surface);
ResolveMSAA(const sk_sp<SkSurface> & surface)202*c8dee2aaSAndroid Build Coastguard Worker inline void ResolveMSAA(const sk_sp<SkSurface>& surface) {
203*c8dee2aaSAndroid Build Coastguard Worker     return ResolveMSAA(surface.get());
204*c8dee2aaSAndroid Build Coastguard Worker }
205*c8dee2aaSAndroid Build Coastguard Worker 
206*c8dee2aaSAndroid Build Coastguard Worker }  // namespace SkSurfaces
207*c8dee2aaSAndroid Build Coastguard Worker 
208*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh {
209*c8dee2aaSAndroid Build Coastguard Worker // Clients should strive to call GrDirectContext::flush directly. However, there exist some
210*c8dee2aaSAndroid Build Coastguard Worker // places where the GrDirectContext is hard to find, these helpers allow for the flushing of the
211*c8dee2aaSAndroid Build Coastguard Worker // provided surface. This is a no-op if the surface is nullptr or not GPU backed.
212*c8dee2aaSAndroid Build Coastguard Worker SK_API GrSemaphoresSubmitted Flush(sk_sp<SkSurface>);
213*c8dee2aaSAndroid Build Coastguard Worker SK_API GrSemaphoresSubmitted Flush(SkSurface*);
214*c8dee2aaSAndroid Build Coastguard Worker SK_API void FlushAndSubmit(sk_sp<SkSurface>);
215*c8dee2aaSAndroid Build Coastguard Worker SK_API void FlushAndSubmit(SkSurface*);
216*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu::ganesh
217*c8dee2aaSAndroid Build Coastguard Worker 
218*c8dee2aaSAndroid Build Coastguard Worker #endif
219