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