Coverage Report

Created: 2024-05-20 07:14

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