xref: /aosp_15_r20/external/skia/src/gpu/ganesh/image/GrImageUtils.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 #ifndef GrImageUtils_DEFINED
8*c8dee2aaSAndroid Build Coastguard Worker #define GrImageUtils_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
11*c8dee2aaSAndroid Build Coastguard Worker 
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSamplingOptions.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkYUVAPixmaps.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrFragmentProcessor.h"  // IWYU pragma: keep
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"  // IWYU pragma: keep
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SkGr.h"
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
19*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
20*c8dee2aaSAndroid Build Coastguard Worker #include <string_view>
21*c8dee2aaSAndroid Build Coastguard Worker #include <tuple>
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker class GrCaps;
24*c8dee2aaSAndroid Build Coastguard Worker class GrImageContext;
25*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext;
26*c8dee2aaSAndroid Build Coastguard Worker class SkImage;
27*c8dee2aaSAndroid Build Coastguard Worker class SkImage_Lazy;
28*c8dee2aaSAndroid Build Coastguard Worker class SkImage_Raster;
29*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix;
30*c8dee2aaSAndroid Build Coastguard Worker class SkSurfaceProps;
31*c8dee2aaSAndroid Build Coastguard Worker enum GrSurfaceOrigin : int;
32*c8dee2aaSAndroid Build Coastguard Worker enum SkAlphaType : int;
33*c8dee2aaSAndroid Build Coastguard Worker enum SkColorType : int;
34*c8dee2aaSAndroid Build Coastguard Worker enum class GrColorType;
35*c8dee2aaSAndroid Build Coastguard Worker enum class SkTileMode;
36*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { enum class Mipmapped : bool; }
37*c8dee2aaSAndroid Build Coastguard Worker struct SkRect;
38*c8dee2aaSAndroid Build Coastguard Worker 
39*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh {
40*c8dee2aaSAndroid Build Coastguard Worker // Returns a GrSurfaceProxyView representation of the image, if possible. This also returns
41*c8dee2aaSAndroid Build Coastguard Worker // a color type. This may be different than the image's color type when the image is not
42*c8dee2aaSAndroid Build Coastguard Worker // texture-backed and the capabilities of the GPU require a data type conversion to put
43*c8dee2aaSAndroid Build Coastguard Worker // the data in a texture.
44*c8dee2aaSAndroid Build Coastguard Worker std::tuple<GrSurfaceProxyView, GrColorType> AsView(
45*c8dee2aaSAndroid Build Coastguard Worker         GrRecordingContext*,
46*c8dee2aaSAndroid Build Coastguard Worker         const SkImage*,
47*c8dee2aaSAndroid Build Coastguard Worker         skgpu::Mipmapped,
48*c8dee2aaSAndroid Build Coastguard Worker         GrImageTexGenPolicy = GrImageTexGenPolicy::kDraw);
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker inline std::tuple<GrSurfaceProxyView, GrColorType> AsView(
51*c8dee2aaSAndroid Build Coastguard Worker         GrRecordingContext* ctx,
52*c8dee2aaSAndroid Build Coastguard Worker         const sk_sp<const SkImage>& img,
53*c8dee2aaSAndroid Build Coastguard Worker         skgpu::Mipmapped mm,
54*c8dee2aaSAndroid Build Coastguard Worker         GrImageTexGenPolicy policy = GrImageTexGenPolicy::kDraw) {
55*c8dee2aaSAndroid Build Coastguard Worker     return AsView(ctx, img.get(), mm, policy);
56*c8dee2aaSAndroid Build Coastguard Worker }
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker std::tuple<GrSurfaceProxyView, GrColorType> RasterAsView(
59*c8dee2aaSAndroid Build Coastguard Worker         GrRecordingContext*,
60*c8dee2aaSAndroid Build Coastguard Worker         const SkImage_Raster*,
61*c8dee2aaSAndroid Build Coastguard Worker         skgpu::Mipmapped,
62*c8dee2aaSAndroid Build Coastguard Worker         GrImageTexGenPolicy = GrImageTexGenPolicy::kDraw);
63*c8dee2aaSAndroid Build Coastguard Worker 
64*c8dee2aaSAndroid Build Coastguard Worker // Utility for making a copy of an existing view when the GrImageTexGenPolicy is not kDraw.
65*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView CopyView(GrRecordingContext*,
66*c8dee2aaSAndroid Build Coastguard Worker                             GrSurfaceProxyView src,
67*c8dee2aaSAndroid Build Coastguard Worker                             skgpu::Mipmapped,
68*c8dee2aaSAndroid Build Coastguard Worker                             GrImageTexGenPolicy,
69*c8dee2aaSAndroid Build Coastguard Worker                             std::string_view label);
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker // Returns the texture proxy. CachingHint refers to whether the generator's output should be
72*c8dee2aaSAndroid Build Coastguard Worker // cached in CPU memory. We will always cache the generated texture on success.
73*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView LockTextureProxyView(GrRecordingContext*,
74*c8dee2aaSAndroid Build Coastguard Worker                                         const SkImage_Lazy*,
75*c8dee2aaSAndroid Build Coastguard Worker                                         GrImageTexGenPolicy,
76*c8dee2aaSAndroid Build Coastguard Worker                                         skgpu::Mipmapped);
77*c8dee2aaSAndroid Build Coastguard Worker 
78*c8dee2aaSAndroid Build Coastguard Worker // Returns the GrColorType to use with the GrTextureProxy returned from lockTextureProxy. This
79*c8dee2aaSAndroid Build Coastguard Worker // may be different from the color type on the image in the case where we need up upload CPU
80*c8dee2aaSAndroid Build Coastguard Worker // data to a texture but the GPU doesn't support the format of CPU data. In this case we convert
81*c8dee2aaSAndroid Build Coastguard Worker // the data to RGBA_8888 unorm on the CPU then upload that.
82*c8dee2aaSAndroid Build Coastguard Worker GrColorType ColorTypeOfLockTextureProxy(const GrCaps*, SkColorType);
83*c8dee2aaSAndroid Build Coastguard Worker 
84*c8dee2aaSAndroid Build Coastguard Worker /**
85*c8dee2aaSAndroid Build Coastguard Worker  * Returns a GrFragmentProcessor that can be used with the passed GrRecordingContext to
86*c8dee2aaSAndroid Build Coastguard Worker  * draw the image. SkSamplingOptions indicates the filter and SkTileMode[] indicates the x and
87*c8dee2aaSAndroid Build Coastguard Worker  * y tile modes. The passed matrix is applied to the coordinates before sampling the image.
88*c8dee2aaSAndroid Build Coastguard Worker  * Optional 'subset' indicates whether the tile modes should be applied to a subset of the image
89*c8dee2aaSAndroid Build Coastguard Worker  * Optional 'domain' is a bound on the coordinates of the image that will be required and can be
90*c8dee2aaSAndroid Build Coastguard Worker  * used to optimize the shader if 'subset' is also specified.
91*c8dee2aaSAndroid Build Coastguard Worker  */
92*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> AsFragmentProcessor(GrRecordingContext*,
93*c8dee2aaSAndroid Build Coastguard Worker                                                          const SkImage*,
94*c8dee2aaSAndroid Build Coastguard Worker                                                          SkSamplingOptions,
95*c8dee2aaSAndroid Build Coastguard Worker                                                          const SkTileMode[2],
96*c8dee2aaSAndroid Build Coastguard Worker                                                          const SkMatrix&,
97*c8dee2aaSAndroid Build Coastguard Worker                                                          const SkRect* subset = nullptr,
98*c8dee2aaSAndroid Build Coastguard Worker                                                          const SkRect* domain = nullptr);
99*c8dee2aaSAndroid Build Coastguard Worker 
100*c8dee2aaSAndroid Build Coastguard Worker inline std::unique_ptr<GrFragmentProcessor> AsFragmentProcessor(GrRecordingContext* ctx,
101*c8dee2aaSAndroid Build Coastguard Worker                                                                 const sk_sp<const SkImage>& img,
102*c8dee2aaSAndroid Build Coastguard Worker                                                                 SkSamplingOptions opt,
103*c8dee2aaSAndroid Build Coastguard Worker                                                                 const SkTileMode tm[2],
104*c8dee2aaSAndroid Build Coastguard Worker                                                                 const SkMatrix& m,
105*c8dee2aaSAndroid Build Coastguard Worker                                                                 const SkRect* subset = nullptr,
106*c8dee2aaSAndroid Build Coastguard Worker                                                                 const SkRect* domain = nullptr) {
107*c8dee2aaSAndroid Build Coastguard Worker     return AsFragmentProcessor(ctx, img.get(), opt, tm, m, subset, domain);
108*c8dee2aaSAndroid Build Coastguard Worker }
109*c8dee2aaSAndroid Build Coastguard Worker 
110*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> MakeFragmentProcessorFromView(GrRecordingContext*,
111*c8dee2aaSAndroid Build Coastguard Worker                                                                    GrSurfaceProxyView,
112*c8dee2aaSAndroid Build Coastguard Worker                                                                    SkAlphaType,
113*c8dee2aaSAndroid Build Coastguard Worker                                                                    SkSamplingOptions,
114*c8dee2aaSAndroid Build Coastguard Worker                                                                    const SkTileMode[2],
115*c8dee2aaSAndroid Build Coastguard Worker                                                                    const SkMatrix&,
116*c8dee2aaSAndroid Build Coastguard Worker                                                                    const SkRect* subset,
117*c8dee2aaSAndroid Build Coastguard Worker                                                                    const SkRect* domain);
118*c8dee2aaSAndroid Build Coastguard Worker 
119*c8dee2aaSAndroid Build Coastguard Worker /**
120*c8dee2aaSAndroid Build Coastguard Worker  * Returns input view if it is already mipmapped. Otherwise, attempts to make a mipmapped view
121*c8dee2aaSAndroid Build Coastguard Worker  * with the same contents. If the mipmapped copy is successfully created it will be cached
122*c8dee2aaSAndroid Build Coastguard Worker  * using the image unique ID. A subsequent call with the same unique ID will return the cached
123*c8dee2aaSAndroid Build Coastguard Worker  * view if it has not been purged. The view is cached with a key domain specific to this
124*c8dee2aaSAndroid Build Coastguard Worker  * function.
125*c8dee2aaSAndroid Build Coastguard Worker  */
126*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView FindOrMakeCachedMipmappedView(GrRecordingContext*,
127*c8dee2aaSAndroid Build Coastguard Worker                                                  GrSurfaceProxyView,
128*c8dee2aaSAndroid Build Coastguard Worker                                                  uint32_t imageUniqueID);
129*c8dee2aaSAndroid Build Coastguard Worker 
130*c8dee2aaSAndroid Build Coastguard Worker /** Init based on texture formats supported by the context. */
131*c8dee2aaSAndroid Build Coastguard Worker SkYUVAPixmapInfo::SupportedDataTypes SupportedTextureFormats(const GrImageContext&);
132*c8dee2aaSAndroid Build Coastguard Worker 
133*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu::ganesh
134*c8dee2aaSAndroid Build Coastguard Worker 
135*c8dee2aaSAndroid Build Coastguard Worker namespace skif {
136*c8dee2aaSAndroid Build Coastguard Worker 
137*c8dee2aaSAndroid Build Coastguard Worker class Backend;
138*c8dee2aaSAndroid Build Coastguard Worker 
139*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Backend> MakeGaneshBackend(sk_sp<GrRecordingContext> context,
140*c8dee2aaSAndroid Build Coastguard Worker                                  GrSurfaceOrigin origin,
141*c8dee2aaSAndroid Build Coastguard Worker                                  const SkSurfaceProps& surfaceProps,
142*c8dee2aaSAndroid Build Coastguard Worker                                  SkColorType colorType);
143*c8dee2aaSAndroid Build Coastguard Worker 
144*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skif
145*c8dee2aaSAndroid Build Coastguard Worker 
146*c8dee2aaSAndroid Build Coastguard Worker #endif
147