/* * Copyright 2023 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrImageUtils_DEFINED #define GrImageUtils_DEFINED #include "include/core/SkRefCnt.h" #include "include/core/SkSamplingOptions.h" #include "include/core/SkYUVAPixmaps.h" #include "src/gpu/ganesh/GrFragmentProcessor.h" // IWYU pragma: keep #include "src/gpu/ganesh/GrSurfaceProxyView.h" // IWYU pragma: keep #include "src/gpu/ganesh/SkGr.h" #include #include #include #include class GrCaps; class GrImageContext; class GrRecordingContext; class SkImage; class SkImage_Lazy; class SkImage_Raster; class SkMatrix; class SkSurfaceProps; enum GrSurfaceOrigin : int; enum SkAlphaType : int; enum SkColorType : int; enum class GrColorType; enum class SkTileMode; namespace skgpu { enum class Mipmapped : bool; } struct SkRect; namespace skgpu::ganesh { // Returns a GrSurfaceProxyView representation of the image, if possible. This also returns // a color type. This may be different than the image's color type when the image is not // texture-backed and the capabilities of the GPU require a data type conversion to put // the data in a texture. std::tuple AsView( GrRecordingContext*, const SkImage*, skgpu::Mipmapped, GrImageTexGenPolicy = GrImageTexGenPolicy::kDraw); inline std::tuple AsView( GrRecordingContext* ctx, const sk_sp& img, skgpu::Mipmapped mm, GrImageTexGenPolicy policy = GrImageTexGenPolicy::kDraw) { return AsView(ctx, img.get(), mm, policy); } std::tuple RasterAsView( GrRecordingContext*, const SkImage_Raster*, skgpu::Mipmapped, GrImageTexGenPolicy = GrImageTexGenPolicy::kDraw); // Utility for making a copy of an existing view when the GrImageTexGenPolicy is not kDraw. GrSurfaceProxyView CopyView(GrRecordingContext*, GrSurfaceProxyView src, skgpu::Mipmapped, GrImageTexGenPolicy, std::string_view label); // Returns the texture proxy. CachingHint refers to whether the generator's output should be // cached in CPU memory. We will always cache the generated texture on success. GrSurfaceProxyView LockTextureProxyView(GrRecordingContext*, const SkImage_Lazy*, GrImageTexGenPolicy, skgpu::Mipmapped); // Returns the GrColorType to use with the GrTextureProxy returned from lockTextureProxy. This // may be different from the color type on the image in the case where we need up upload CPU // data to a texture but the GPU doesn't support the format of CPU data. In this case we convert // the data to RGBA_8888 unorm on the CPU then upload that. GrColorType ColorTypeOfLockTextureProxy(const GrCaps*, SkColorType); /** * Returns a GrFragmentProcessor that can be used with the passed GrRecordingContext to * draw the image. SkSamplingOptions indicates the filter and SkTileMode[] indicates the x and * y tile modes. The passed matrix is applied to the coordinates before sampling the image. * Optional 'subset' indicates whether the tile modes should be applied to a subset of the image * Optional 'domain' is a bound on the coordinates of the image that will be required and can be * used to optimize the shader if 'subset' is also specified. */ std::unique_ptr AsFragmentProcessor(GrRecordingContext*, const SkImage*, SkSamplingOptions, const SkTileMode[2], const SkMatrix&, const SkRect* subset = nullptr, const SkRect* domain = nullptr); inline std::unique_ptr AsFragmentProcessor(GrRecordingContext* ctx, const sk_sp& img, SkSamplingOptions opt, const SkTileMode tm[2], const SkMatrix& m, const SkRect* subset = nullptr, const SkRect* domain = nullptr) { return AsFragmentProcessor(ctx, img.get(), opt, tm, m, subset, domain); } std::unique_ptr MakeFragmentProcessorFromView(GrRecordingContext*, GrSurfaceProxyView, SkAlphaType, SkSamplingOptions, const SkTileMode[2], const SkMatrix&, const SkRect* subset, const SkRect* domain); /** * Returns input view if it is already mipmapped. Otherwise, attempts to make a mipmapped view * with the same contents. If the mipmapped copy is successfully created it will be cached * using the image unique ID. A subsequent call with the same unique ID will return the cached * view if it has not been purged. The view is cached with a key domain specific to this * function. */ GrSurfaceProxyView FindOrMakeCachedMipmappedView(GrRecordingContext*, GrSurfaceProxyView, uint32_t imageUniqueID); /** Init based on texture formats supported by the context. */ SkYUVAPixmapInfo::SupportedDataTypes SupportedTextureFormats(const GrImageContext&); } // namespace skgpu::ganesh namespace skif { class Backend; sk_sp MakeGaneshBackend(sk_sp context, GrSurfaceOrigin origin, const SkSurfaceProps& surfaceProps, SkColorType colorType); } // namespace skif #endif