blob: 1aa8fbc039083e1d2544276bd594b2399504834b [file] [log] [blame]
/*
* Copyright 2025 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_graphite_precompile_PrecompileImageShader_DEFINED
#define skgpu_graphite_precompile_PrecompileImageShader_DEFINED
#include "include/gpu/graphite/precompile/PrecompileShader.h"
#include "src/core/SkColorSpacePriv.h"
#include "src/gpu/graphite/ResourceTypes.h"
namespace skgpu::graphite {
class PrecompileImageShader final : public PrecompileShader {
public:
PrecompileImageShader(SkEnumBitMask<PrecompileShaders::ImageShaderFlags> flags,
SkSpan<const SkColorInfo> colorInfos,
SkSpan<const SkTileMode> tileModes,
bool raw);
void setImmutableSamplerInfo(const ImmutableSamplerInfo& samplerInfo);
private:
friend class PrecompileYUVImageShader; // for NonAlphaOnlyDefaultColorInfos
// In addition to the tile mode options provided by the client, we can precompile two additional
// sampling/tiling variants: hardware-tiled and cubic sampling (which always uses the most
// generic tiling shader).
inline static constexpr int kExtraNumSamplingTilingCombos = 2;
inline static constexpr int kCubicSampled = 1;
inline static constexpr int kHWTiled = 0;
// These color info objects are defined assuming an sRGB destination.
// Most specialized color space transform shader, no actual color space handling.
static SkColorInfo DefaultColorInfoPremul() {
return { kRGBA_8888_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGB() };
}
// sRGB-to-sRGB specialized color space transform shader.
static SkColorInfo DefaultColorInfoSRGB() {
return { kRGBA_8888_SkColorType, kPremul_SkAlphaType,
sk_srgb_singleton()->makeColorSpin() };
}
// Most general color space transform shader.
static SkColorInfo DefaultColorInfoGeneral() {
return { kRGBA_8888_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGBLinear() };
}
// Alpha-only, most general color space transform shader.
static SkColorInfo DefaultColorInfoAlphaOnly() {
return { kAlpha_8_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGBLinear() };
}
// A fixed list of SkColorInfos that will trigger each possible combination of alpha-only
// handling and color space transform variants, when drawn to an sRGB destination.
static std::vector<SkColorInfo> DefaultColorInfos() {
return { DefaultColorInfoPremul(), DefaultColorInfoSRGB(), DefaultColorInfoGeneral(),
DefaultColorInfoAlphaOnly() };
}
// A fixed list of SkColorInfos that will trigger each color space transform shader variant when
// drawn to an sRGB destination.
static std::vector<SkColorInfo> NonAlphaOnlyDefaultColorInfos() {
return { DefaultColorInfoPremul(), DefaultColorInfoSRGB(), DefaultColorInfoGeneral() };
}
// A fixed list of SkColorInfos that will trigger each color space transform shader variant
// possible from a raw image draw. The general shader is still required if the image is
// alpha-only, because the read swizzle is implemented as a gamut transformation.
static std::vector<SkColorInfo> RawImageDefaultColorInfos() {
return { DefaultColorInfoPremul(), DefaultColorInfoAlphaOnly() };
}
const int fNumExtraSamplingTilingCombos;
const std::vector<SkColorInfo> fColorInfos;
const std::vector<SkTileMode> fTileModes;
// If true, use the destination color space from the KeyContext provided to addToKey.
// This is true if and only if the client has provided a list of color infos. Otherwise, we
// always use an sRGB destination per the default SkColorInfo lists defined above.
const bool fUseDstColorSpace;
// Whether this precompiles raw image shaders.
const bool fRaw;
ImmutableSamplerInfo fImmutableSamplerInfo;
int numIntrinsicCombinations() const override;
void addToKey(const KeyContext& keyContext,
PaintParamsKeyBuilder* builder,
PipelineDataGatherer* gatherer,
int desiredCombination) const override;
};
} // namespace skgpu::graphite
#endif // skgpu_graphite_precompile_PrecompileImageShader_DEFINED