blob: 25df68b8689e09058ddf0e5aad8a7d3a4405409d [file] [log] [blame]
/*
* 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 <cstdint>
#include <memory>
#include <string_view>
#include <tuple>
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<GrSurfaceProxyView, GrColorType> AsView(
GrRecordingContext*,
const SkImage*,
skgpu::Mipmapped,
GrImageTexGenPolicy = GrImageTexGenPolicy::kDraw);
inline std::tuple<GrSurfaceProxyView, GrColorType> AsView(
GrRecordingContext* ctx,
const sk_sp<const SkImage>& img,
skgpu::Mipmapped mm,
GrImageTexGenPolicy policy = GrImageTexGenPolicy::kDraw) {
return AsView(ctx, img.get(), mm, policy);
}
std::tuple<GrSurfaceProxyView, GrColorType> 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<GrFragmentProcessor> AsFragmentProcessor(GrRecordingContext*,
const SkImage*,
SkSamplingOptions,
const SkTileMode[2],
const SkMatrix&,
const SkRect* subset = nullptr,
const SkRect* domain = nullptr);
inline std::unique_ptr<GrFragmentProcessor> AsFragmentProcessor(GrRecordingContext* ctx,
const sk_sp<const SkImage>& 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<GrFragmentProcessor> 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<Backend> MakeGaneshBackend(sk_sp<GrRecordingContext> context,
GrSurfaceOrigin origin,
const SkSurfaceProps& surfaceProps,
SkColorType colorType);
} // namespace skif
#endif