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