| /* |
| * Copyright 2025 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "include/core/SkTypes.h" |
| |
| #if defined(SK_GRAPHITE) |
| #include "include/core/SkRefCnt.h" |
| #include "include/effects/SkRuntimeEffect.h" |
| #include "include/gpu/graphite/GraphiteTypes.h" |
| #include "include/gpu/graphite/PrecompileContext.h" |
| #include "include/gpu/graphite/precompile/PaintOptions.h" |
| #include "include/gpu/graphite/precompile/Precompile.h" |
| #include "include/gpu/graphite/precompile/PrecompileColorFilter.h" |
| #include "include/gpu/graphite/precompile/PrecompileRuntimeEffect.h" |
| #include "include/gpu/graphite/precompile/PrecompileShader.h" |
| |
| #include "tests/graphite/precompile/PaintOptionsBuilder.h" |
| #include "tests/graphite/precompile/PrecompileTestUtils.h" |
| |
| #if defined (SK_VULKAN) |
| #include "include/gpu/graphite/vk/precompile/VulkanPrecompileShader.h" |
| #include "include/gpu/vk/VulkanTypes.h" |
| #endif // SK_VULKAN |
| |
| #include "tests/graphite/precompile/AndroidRuntimeEffectManager.h" |
| |
| using namespace skgpu::graphite; |
| using PrecompileShaders::ImageShaderFlags; |
| |
| using namespace PaintOptionsUtils; |
| using namespace PrecompileTestUtils; |
| |
| // Used in lieu of SkEnumBitMask to avoid adding casts when copying in precompile cases. |
| static constexpr DrawTypeFlags operator|(DrawTypeFlags a, DrawTypeFlags b) { |
| return static_cast<DrawTypeFlags>(static_cast<std::underlying_type<DrawTypeFlags>::type>(a) | |
| static_cast<std::underlying_type<DrawTypeFlags>::type>(b)); |
| } |
| |
| #if defined(SK_VULKAN) |
| namespace { |
| |
| |
| skgpu::VulkanYcbcrConversionInfo ycbcr_info(uint64_t externalFormat, |
| VkSamplerYcbcrModelConversion model, |
| VkSamplerYcbcrRange range, |
| VkChromaLocation location, |
| VkFilter filter = VK_FILTER_LINEAR, |
| bool samplerFilterMustMatchChromaFilter = true, |
| bool supportsLinearFilter = false) { |
| VkComponentMapping components = { VK_COMPONENT_SWIZZLE_IDENTITY, |
| VK_COMPONENT_SWIZZLE_IDENTITY, |
| VK_COMPONENT_SWIZZLE_IDENTITY, |
| VK_COMPONENT_SWIZZLE_IDENTITY }; |
| |
| VkFormatFeatureFlags formatFeatures = 0; |
| if (!samplerFilterMustMatchChromaFilter) { |
| formatFeatures |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT; |
| } |
| if (supportsLinearFilter) { |
| formatFeatures |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT; |
| } |
| |
| return skgpu::VulkanYcbcrConversionInfo(externalFormat, model, range, location, location, |
| filter, /*forceExplicitReconstruction=*/false, |
| components, formatFeatures); |
| } |
| |
| sk_sp<PrecompileShader> vulkan_ycbcr_image_shader(const skgpu::VulkanYcbcrConversionInfo& ycbcrInfo, |
| const SkColorInfo& ci) { |
| return PrecompileShaders::VulkanYCbCrImage(ycbcrInfo, |
| PrecompileShaders::ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| } |
| |
| } // anonymous namespace |
| #endif // SK_VULKAN |
| |
| namespace { |
| |
| sk_sp<PrecompileShader> create_hw_image_precompile_shader() { |
| SkColorInfo ci { kRGBA_8888_SkColorType, |
| kPremul_SkAlphaType, |
| SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, |
| SkNamedGamut::kAdobeRGB) }; |
| |
| return PrecompileShaders::Image(PrecompileShaders::ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| } |
| |
| } // anonymous namespace |
| |
| skgpu::graphite::PaintOptions LinearEffect(sk_sp<SkRuntimeEffect> linearEffect, |
| sk_sp<PrecompileShader> childShader, |
| SkBlendMode blendMode, |
| bool paintColorIsOpaque = true, |
| bool matrixColorFilter = false, |
| bool dither = false, |
| sk_sp<SkColorSpace> cs = nullptr) { |
| PaintOptions paintOptions; |
| sk_sp<PrecompileShader> linearEffectShader = PrecompileRuntimeEffects::MakePrecompileShader( |
| std::move(linearEffect), |
| {{ {{ std::move(childShader) }} }}); |
| if (cs) { |
| linearEffectShader = linearEffectShader->makeWithWorkingColorSpace(nullptr, cs); |
| } |
| paintOptions.setShaders({{ std::move(linearEffectShader) }}); |
| if (matrixColorFilter) { |
| paintOptions.setColorFilters(SKSPAN_INIT_ONE( PrecompileColorFilters::Matrix() )); |
| } |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( blendMode )); |
| paintOptions.setPaintColorIsOpaque(paintColorIsOpaque); |
| paintOptions.setDither(dither); |
| |
| return paintOptions; |
| } |
| |
| // ======================================= |
| // PaintOptions |
| // ======================================= |
| // NOTE: keep in sync with upstream external/skia/tests/graphite/precompile/AndroidPaintOptions.cpp |
| // clang-format off |
| |
| // TODO(b/426601394): Update this to take an SkColorInfo for the input image. |
| // The other MouriMap* precompile paint options should use a linear SkColorInfo |
| // derived from this same input image. |
| skgpu::graphite::PaintOptions MouriMapCrosstalkAndChunk16x16Passthrough( |
| RuntimeEffectManager& effectManager) { |
| SkColorInfo ci { kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr }; |
| sk_sp<PrecompileShader> img = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| |
| sk_sp<PrecompileShader> crosstalk = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kMouriMap_CrossTalkAndChunk16x16Effect), |
| {{ {{ std::move(img) }} }}); |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ std::move(crosstalk) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrc )); |
| return paintOptions; |
| } |
| |
| skgpu::graphite::PaintOptions MouriMapCrosstalkAndChunk16x16Premul( |
| RuntimeEffectManager& effectManager) { |
| // This usage of kUnpremul is non-obvious. It acts to short circuit the identity-colorspace |
| // optimization for runtime effects. In this case, the Pipeline requires a |
| // ColorSpaceTransformPremul instead of the (optimized) Passthrough. |
| SkColorInfo ci { kRGBA_8888_SkColorType, kUnpremul_SkAlphaType, nullptr }; |
| sk_sp<PrecompileShader> img = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| |
| sk_sp<PrecompileShader> crosstalk = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kMouriMap_CrossTalkAndChunk16x16Effect), |
| {{ {{ std::move(img) }} }}); |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ std::move(crosstalk) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrc )); |
| return paintOptions; |
| } |
| |
| skgpu::graphite::PaintOptions MouriMapChunk8x8Effect(RuntimeEffectManager& effectManager) { |
| SkColorInfo ci { kRGBA_F16_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGBLinear() }; |
| sk_sp<PrecompileShader> img = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| |
| sk_sp<PrecompileShader> chunk8x8 = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kMouriMap_Chunk8x8Effect), |
| {{ {{ std::move(img) }} }}); |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ std::move(chunk8x8) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrc )); |
| return paintOptions; |
| } |
| |
| skgpu::graphite::PaintOptions MouriMapBlur(RuntimeEffectManager& effectManager) { |
| SkColorInfo ci { kRGBA_F16_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGBLinear() }; |
| sk_sp<PrecompileShader> img = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| |
| sk_sp<PrecompileShader> blur = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kMouriMap_BlurEffect), |
| {{ {{ std::move(img) }} }}); |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ std::move(blur) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrc )); |
| return paintOptions; |
| } |
| |
| static sk_sp<PrecompileShader> create_tone_map(RuntimeEffectManager& effectManager) { |
| SkColorInfo ci { kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr }; |
| sk_sp<PrecompileShader> input = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| |
| SkColorInfo luxCI { kRGBA_F16_SkColorType, |
| kPremul_SkAlphaType, |
| SkColorSpace::MakeSRGBLinear() }; |
| sk_sp<PrecompileShader> lux = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &luxCI, 1 }, |
| {}); |
| |
| sk_sp<PrecompileShader> toneMap = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kMouriMap_TonemapEffect), |
| {{ {{ std::move(input) }}, {{ std::move(lux) }} }}); |
| sk_sp<PrecompileShader> inLinear = toneMap->makeWithWorkingColorSpace(luxCI.refColorSpace()); |
| |
| return inLinear; |
| } |
| |
| skgpu::graphite::PaintOptions MouriMapToneMap(RuntimeEffectManager& effectManager) { |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ create_tone_map(effectManager) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrc )); |
| return paintOptions; |
| } |
| |
| skgpu::graphite::PaintOptions GainMap(RuntimeEffectManager& effectManager) { |
| |
| SkColorInfo hdrCI { kRGBA_F16_SkColorType, |
| kPremul_SkAlphaType, |
| SkColorSpace::MakeSRGB() }; |
| sk_sp<PrecompileShader> hdr = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &hdrCI, 1 }, |
| {}); |
| |
| sk_sp<PrecompileShader> gainMap = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kGainmapEffect), |
| {{ {{ create_tone_map(effectManager) }}, {{ std::move(hdr) }} }}); |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ std::move(gainMap) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrc )); |
| return paintOptions; |
| } |
| |
| skgpu::graphite::PaintOptions BoxShadow(RuntimeEffectManager& effectManager) { |
| sk_sp<PrecompileShader> boxShadow = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kBoxShadowEffect)); |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ std::move(boxShadow) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrcOver )); |
| return paintOptions; |
| } |
| |
| skgpu::graphite::PaintOptions BlurFilterMix(RuntimeEffectManager& effectManager) { |
| sk_sp<SkRuntimeEffect> mixEffect = effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kBlurFilter_MixEffect); |
| |
| SkColorInfo ci { kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr }; |
| sk_sp<PrecompileShader> img = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| |
| sk_sp<PrecompileShader> mix = PrecompileRuntimeEffects::MakePrecompileShader( |
| std::move(mixEffect), |
| {{ {{ img }}, {{ img }} }}); |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ std::move(mix) }}); |
| paintOptions.setBlendModes({ SkBlendMode::kSrc, SkBlendMode::kSrcOver }); |
| return paintOptions; |
| } |
| |
| #if defined(SK_VULKAN) |
| |
| PaintOptions ImagePremulYCbCr238Srcover(bool narrow) { |
| PaintOptions paintOptions; |
| |
| // HardwareImage(3: kHoAAO4AAAAAAAAA) |
| const skgpu::VulkanYcbcrConversionInfo ycbcrInfo = ycbcr_info( |
| 238, |
| VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709, |
| narrow ? VK_SAMPLER_YCBCR_RANGE_ITU_NARROW |
| : VK_SAMPLER_YCBCR_RANGE_ITU_FULL, |
| VK_CHROMA_LOCATION_MIDPOINT); |
| const SkColorInfo kRGBA8Premul(kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr); |
| |
| paintOptions.setShaders({{ vulkan_ycbcr_image_shader(ycbcrInfo, kRGBA8Premul) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrcOver )); |
| return paintOptions; |
| } |
| |
| PaintOptions TransparentPaintImagePremulYCbCr238Srcover() { |
| PaintOptions paintOptions; |
| |
| // HardwareImage(3: kHoAAO4AAAAAAAAA) |
| const skgpu::VulkanYcbcrConversionInfo ycbcrInfo = ycbcr_info( |
| 238, |
| VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709, |
| VK_SAMPLER_YCBCR_RANGE_ITU_NARROW, |
| VK_CHROMA_LOCATION_MIDPOINT); |
| const SkColorInfo kRGBA8Premul(kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr); |
| |
| paintOptions.setShaders({{ vulkan_ycbcr_image_shader(ycbcrInfo, kRGBA8Premul) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrcOver )); |
| paintOptions.setPaintColorIsOpaque(false); |
| return paintOptions; |
| } |
| |
| PaintOptions ImagePremulYCbCr240Srcover() { |
| PaintOptions paintOptions; |
| |
| // HardwareImage(3: kHIAAPAAAAAAAAAA) |
| const skgpu::VulkanYcbcrConversionInfo ycbcrInfo = ycbcr_info( |
| 240, |
| VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709, |
| VK_SAMPLER_YCBCR_RANGE_ITU_FULL, |
| VK_CHROMA_LOCATION_MIDPOINT); |
| const SkColorInfo kRGBA8Premul(kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr); |
| |
| paintOptions.setShaders({{ vulkan_ycbcr_image_shader(ycbcrInfo, kRGBA8Premul) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrcOver )); |
| return paintOptions; |
| } |
| |
| PaintOptions TransparentPaintImagePremulYCbCr240Srcover() { |
| PaintOptions paintOptions; |
| |
| // HardwareImage(3: kHIAAPAAAAAAAAAA) |
| const skgpu::VulkanYcbcrConversionInfo ycbcrInfo = ycbcr_info( |
| 240, |
| VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709, |
| VK_SAMPLER_YCBCR_RANGE_ITU_FULL, |
| VK_CHROMA_LOCATION_MIDPOINT); |
| const SkColorInfo kRGBA8Premul(kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr); |
| |
| paintOptions.setShaders({{ vulkan_ycbcr_image_shader(ycbcrInfo, kRGBA8Premul) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrcOver )); |
| paintOptions.setPaintColorIsOpaque(false); |
| return paintOptions; |
| } |
| |
| skgpu::graphite::PaintOptions MouriMapCrosstalkAndChunk16x16YCbCr247( |
| RuntimeEffectManager& effectManager) { |
| PaintOptions paintOptions; |
| |
| // HardwareImage(3: kEwAAPcAAAAAAAAA) |
| const skgpu::VulkanYcbcrConversionInfo ycbcrInfo = ycbcr_info( |
| 247, |
| VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020, |
| VK_SAMPLER_YCBCR_RANGE_ITU_NARROW, |
| VK_CHROMA_LOCATION_COSITED_EVEN); |
| const SkColorInfo kRGBA8PremulPQ(kRGBA_8888_SkColorType, |
| kPremul_SkAlphaType, |
| SkColorSpace::MakeRGB(SkNamedTransferFn::kPQ, |
| SkNamedGamut::kRec2020)); |
| |
| sk_sp<PrecompileShader> img = vulkan_ycbcr_image_shader(ycbcrInfo, kRGBA8PremulPQ); |
| |
| sk_sp<PrecompileShader> crosstalk = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kMouriMap_CrossTalkAndChunk16x16Effect), |
| {{ {{ std::move(img) }} }}); |
| |
| paintOptions.setShaders({{ std::move(crosstalk) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrc )); |
| return paintOptions; |
| } |
| |
| PaintOptions LinearAndLUTEffectImageYCbCr54(RuntimeEffectManager& effectManager) { |
| sk_sp<SkRuntimeEffect> k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader = |
| effectManager.getOrCreateLinearRuntimeEffect({ |
| // DCI-P3 sRGB Extended range |
| /* inputDataspace= */ static_cast<ui::Dataspace>(0x188a0000), |
| /* outputDataspace= */ ui::Dataspace::DISPLAY_P3, // DCI-P3 sRGB Full range |
| /* undoPremultipliedAlpha= */ false, |
| // DCI-P3 gamma 2.2 Full range |
| /* fakeOutputDataspace= */ static_cast<ui::Dataspace>(0x90a0000), |
| /* type= */ shaders::LinearEffect::SkSLType::Shader, |
| }); |
| |
| sk_sp<SkRuntimeEffect> lutEffect = effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kLutEffect); |
| |
| const skgpu::VulkanYcbcrConversionInfo info = ycbcr_info( |
| 54, |
| VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020, |
| VK_SAMPLER_YCBCR_RANGE_ITU_FULL, |
| VK_CHROMA_LOCATION_MIDPOINT, |
| VK_FILTER_NEAREST, |
| /* samplerFilterMustMatchChromaFilter= */ false, |
| /* supportsLinearFilter= */ true); |
| const SkColorInfo kRGBA8PremulPQ(kRGBA_8888_SkColorType, |
| kPremul_SkAlphaType, |
| SkColorSpace::MakeRGB(SkNamedTransferFn::kPQ, |
| SkNamedGamut::kRec2020)); |
| |
| sk_sp<PrecompileShader> ycbcr = vulkan_ycbcr_image_shader(info, kRGBA8PremulPQ); |
| |
| const SkColorInfo kRGBA8PremulColorSpin(kRGBA_8888_SkColorType, |
| kPremul_SkAlphaType, |
| SkColorSpace::MakeSRGB()->makeColorSpin()); |
| |
| sk_sp<PrecompileShader> lutImg = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { kRGBA8PremulColorSpin }, |
| {}); |
| |
| sk_sp<PrecompileShader> lutShader = PrecompileRuntimeEffects::MakePrecompileShader( |
| std::move(lutEffect), |
| {{ {{ std::move(ycbcr) }}, {{ std::move(lutImg) }} }}); |
| |
| sk_sp<SkColorSpace> cs = SkColorSpace::MakeSRGB()->makeColorSpin(); |
| sk_sp<PrecompileShader> wrappedLUTShader = lutShader->makeWithWorkingColorSpace(std::move(cs)); |
| |
| return LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| std::move(wrappedLUTShader), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ false, |
| /* dither= */ true, |
| SkColorSpace::MakeSRGBLinear()); |
| } |
| |
| PaintOptions ImagePremulYCbCr769Srcover(RuntimeEffectManager& effectManager) { |
| PaintOptions paintOptions; |
| |
| const skgpu::VulkanYcbcrConversionInfo info = ycbcr_info( |
| 769, |
| VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709, |
| VK_SAMPLER_YCBCR_RANGE_ITU_FULL, |
| VK_CHROMA_LOCATION_MIDPOINT, |
| VK_FILTER_NEAREST, |
| /* samplerFilterMustMatchChromaFilter= */ false, |
| /* supportsLinearFilter= */ true); |
| const SkColorInfo kRGBA8Premul(kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr); |
| |
| paintOptions.setShaders({{ vulkan_ycbcr_image_shader(info, kRGBA8Premul) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrcOver )); |
| return paintOptions; |
| } |
| |
| PaintOptions LinearEffectImageYCbCr54(RuntimeEffectManager& effectManager) { |
| const sk_sp<SkRuntimeEffect> kBT2020_HLG__UNKNOWN__false__UNKNOWN__Shader = |
| effectManager.getOrCreateLinearRuntimeEffect({ |
| /* inputDataspace= */ ui::Dataspace::BT2020_HLG, |
| /* outputDataspace= */ ui::Dataspace::UNKNOWN, |
| /* undoPremultipliedAlpha= */ false, |
| /* fakeOutputDataspace= */ ui::Dataspace::UNKNOWN, |
| /* type= */ shaders::LinearEffect::SkSLType::Shader, |
| }); |
| |
| const skgpu::VulkanYcbcrConversionInfo info = ycbcr_info( |
| 54, |
| VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020, |
| VK_SAMPLER_YCBCR_RANGE_ITU_FULL, |
| VK_CHROMA_LOCATION_MIDPOINT, |
| VK_FILTER_NEAREST, |
| /* samplerFilterMustMatchChromaFilter= */ false, |
| /* supportsLinearFilter= */ true); |
| const SkColorInfo kRGBA8PremulPQ(kRGBA_8888_SkColorType, |
| kPremul_SkAlphaType, |
| SkColorSpace::MakeRGB(SkNamedTransferFn::kPQ, |
| SkNamedGamut::kRec2020)); |
| |
| sk_sp<PrecompileShader> yuvShader = vulkan_ycbcr_image_shader(info, kRGBA8PremulPQ); |
| |
| return LinearEffect(kBT2020_HLG__UNKNOWN__false__UNKNOWN__Shader, |
| std::move(yuvShader), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ false, |
| /* dither= */ true, |
| SkColorSpace::MakeSRGBLinear()); |
| } |
| |
| #endif // SK_VULKAN |
| |
| |
| skgpu::graphite::PaintOptions EdgeExtensionPassthroughSrcover(RuntimeEffectManager& effectManager) { |
| SkColorInfo ci { kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr }; |
| |
| sk_sp<PrecompileShader> img = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| |
| sk_sp<PrecompileShader> edgeEffect = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kEdgeExtensionEffect), |
| {{ {{ std::move(img) }} }}); |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ std::move(edgeEffect) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrcOver )); |
| return paintOptions; |
| } |
| |
| skgpu::graphite::PaintOptions EdgeExtensionPremulSrcover(RuntimeEffectManager& effectManager) { |
| // This usage of kUnpremul is non-obvious. It acts to short circuit the identity-colorspace |
| // optimization for runtime effects. In this case, the Pipeline requires a |
| // ColorSpaceTransformPremul instead of the (optimized) Passthrough. |
| SkColorInfo ci { kRGBA_8888_SkColorType, kUnpremul_SkAlphaType, nullptr }; |
| |
| sk_sp<PrecompileShader> img = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| |
| sk_sp<PrecompileShader> edgeEffect = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kEdgeExtensionEffect), |
| {{ {{ std::move(img) }} }}); |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ std::move(edgeEffect) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrcOver )); |
| return paintOptions; |
| } |
| |
| |
| |
| skgpu::graphite::PaintOptions TransparentPaintEdgeExtensionPassthroughMatrixCFDitherSrcover( |
| RuntimeEffectManager& effectManager) { |
| SkColorInfo ci { kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr }; |
| sk_sp<PrecompileShader> img = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| |
| sk_sp<PrecompileShader> edgeEffect = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kEdgeExtensionEffect), |
| {{ {{ std::move(img) }} }}); |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ std::move(edgeEffect) }}); |
| paintOptions.setColorFilters({{ PrecompileColorFilters::Matrix() }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrcOver )); |
| paintOptions.setPaintColorIsOpaque(false); |
| paintOptions.setDither(true); |
| |
| return paintOptions; |
| } |
| |
| skgpu::graphite::PaintOptions TransparentPaintEdgeExtensionPassthroughSrcover( |
| RuntimeEffectManager& effectManager) { |
| SkColorInfo ci { kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr }; |
| sk_sp<PrecompileShader> img = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| |
| sk_sp<PrecompileShader> edgeEffect = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kEdgeExtensionEffect), |
| {{ {{ std::move(img) }} }}); |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ std::move(edgeEffect) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrcOver )); |
| paintOptions.setPaintColorIsOpaque(false); |
| |
| return paintOptions; |
| } |
| |
| skgpu::graphite::PaintOptions TransparentPaintEdgeExtensionPremulSrcover( |
| RuntimeEffectManager& effectManager) { |
| // This usage of kUnpremul is non-obvious. It acts to short circuit the identity-colorspace |
| // optimization for runtime effects. In this case, the Pipeline requires a |
| // ColorSpaceTransformPremul instead of the (optimized) Passthrough. |
| SkColorInfo ci { kRGBA_8888_SkColorType, kUnpremul_SkAlphaType, nullptr }; |
| |
| sk_sp<PrecompileShader> img = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic, |
| { &ci, 1 }, |
| {}); |
| |
| sk_sp<PrecompileShader> edgeEffect = PrecompileRuntimeEffects::MakePrecompileShader( |
| effectManager.getKnownRuntimeEffect( |
| RuntimeEffectManager::KnownId::kEdgeExtensionEffect), |
| {{ {{ std::move(img) }} }}); |
| |
| PaintOptions paintOptions; |
| paintOptions.setShaders({{ std::move(edgeEffect) }}); |
| paintOptions.setBlendModes(SKSPAN_INIT_ONE( SkBlendMode::kSrcOver )); |
| paintOptions.setPaintColorIsOpaque(false); |
| |
| return paintOptions; |
| } |
| |
| // clang-format on |
| |
| // ======================================= |
| // RenderPassProperties |
| // ======================================= |
| // NOTE: keep in sync with upstream external/skia/tests/graphite/precompile/AndroidPaintOptions.cpp |
| // clang-format off |
| |
| // Single sampled R w/ just depth |
| const skgpu::graphite::RenderPassProperties kR_1_D { |
| skgpu::graphite::DepthStencilFlags::kDepth, |
| kAlpha_8_SkColorType, |
| /* fDstCS= */ nullptr, |
| /* fRequiresMSAA= */ false |
| }; |
| |
| // Single sampled RGBA w/ just depth |
| const skgpu::graphite::RenderPassProperties kRGBA_1_D { |
| skgpu::graphite::DepthStencilFlags::kDepth, |
| kRGBA_8888_SkColorType, |
| /* fDstCS= */ nullptr, |
| /* fRequiresMSAA= */ false |
| }; |
| |
| // The same as kRGBA_1_D but w/ an SRGB colorSpace |
| const skgpu::graphite::RenderPassProperties kRGBA_1_D_SRGB { |
| skgpu::graphite::DepthStencilFlags::kDepth, |
| kRGBA_8888_SkColorType, |
| SkColorSpace::MakeSRGB(), |
| /* fRequiresMSAA= */ false |
| }; |
| |
| const skgpu::graphite::RenderPassProperties kRGBA_1_D_Linear { |
| skgpu::graphite::DepthStencilFlags::kDepth, |
| kRGBA_8888_SkColorType, |
| SkColorSpace::MakeSRGBLinear(), |
| /* fRequiresMSAA= */ false |
| }; |
| |
| // MSAA RGBA w/ depth and stencil |
| const skgpu::graphite::RenderPassProperties kRGBA_4_DS { |
| skgpu::graphite::DepthStencilFlags::kDepthStencil, |
| kRGBA_8888_SkColorType, |
| /* fDstCS= */ nullptr, |
| /* fRequiresMSAA= */ true |
| }; |
| |
| // The same as kRGBA_4_DS but w/ an SRGB colorSpace |
| const skgpu::graphite::RenderPassProperties kRGBA_4_DS_SRGB { |
| skgpu::graphite::DepthStencilFlags::kDepthStencil, |
| kRGBA_8888_SkColorType, |
| SkColorSpace::MakeSRGB(), |
| /* fRequiresMSAA= */ true |
| }; |
| |
| // Single sampled RGBA16F w/ just depth |
| const skgpu::graphite::RenderPassProperties kRGBA16F_1_D { |
| skgpu::graphite::DepthStencilFlags::kDepth, |
| kRGBA_F16_SkColorType, |
| /* fDstCS= */ nullptr, |
| /* fRequiresMSAA= */ false |
| }; |
| |
| // The same as kRGBA16F_1_D but w/ an SRGB colorSpace |
| const skgpu::graphite::RenderPassProperties kRGBA16F_1_D_SRGB { |
| skgpu::graphite::DepthStencilFlags::kDepth, |
| kRGBA_F16_SkColorType, |
| SkColorSpace::MakeSRGB(), |
| /* fRequiresMSAA= */ false |
| }; |
| |
| // The same as kRGBA16F_1_D but w/ a linear SRGB colorSpace |
| const skgpu::graphite::RenderPassProperties kRGBA16F_1_D_Linear { |
| skgpu::graphite::DepthStencilFlags::kDepth, |
| kRGBA_F16_SkColorType, |
| SkColorSpace::MakeSRGBLinear(), |
| /* fRequiresMSAA= */ false |
| }; |
| |
| // clang-format on |
| |
| const RenderPassProperties kCombo_RGBA_1D_4DS[2] = { kRGBA_1_D, kRGBA_4_DS }; |
| const RenderPassProperties kCombo_RGBA_1D_4DS_SRGB[2] = { kRGBA_1_D_SRGB, kRGBA_4_DS_SRGB }; |
| const RenderPassProperties kCombo_RGBA_1D_SRGB_w16F[2] = { kRGBA_1_D_SRGB, kRGBA16F_1_D_SRGB }; |
| const RenderPassProperties kCombo_RGBA_1D_4DS_16F[3] = { kRGBA_1_D, kRGBA_4_DS, kRGBA16F_1_D }; |
| |
| // ======================================= |
| // DrawTypeFlags |
| // ======================================= |
| // NOTE: keep in sync with upstream external/skia/tests/graphite/precompile/AndroidPaintOptions.cpp |
| // clang-format off |
| |
| constexpr bool kWithAnalyticClip = true; |
| |
| constexpr DrawTypeFlags kRRectAndNonAARect = |
| static_cast<DrawTypeFlags>(DrawTypeFlags::kAnalyticRRect | |
| DrawTypeFlags::kNonAAFillRect); |
| |
| PrecompileSettings linear_and_tonemap(RuntimeEffectManager* effectManager, |
| sk_sp<SkRuntimeEffect> rte) { |
| return { LinearEffect(std::move(rte), |
| create_tone_map(*effectManager), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ false, |
| /* dither= */ false, |
| SkColorSpace::MakeSRGBLinear()), |
| kRRectAndNonAARect, |
| kCombo_RGBA_1D_SRGB_w16F }; |
| } |
| |
| // The 'rrectStyle' flag selects between: |
| // rect with and w/o an analytic clip |
| // rrects |
| // This is to avoid overgenerating rrects w/ analytic clips |
| PrecompileSettings linear_hw_image(sk_sp<SkRuntimeEffect> rte, |
| bool rrectStyle, |
| bool opaquePaint = true) { |
| return { LinearEffect(rte, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ opaquePaint, |
| /* matrixColorFilter= */ false, |
| /* dither= */ false, |
| SkColorSpace::MakeSRGBLinear()), |
| rrectStyle ? DrawTypeFlags::kAnalyticRRect: DrawTypeFlags::kNonAAFillRect, |
| kCombo_RGBA_1D_4DS_SRGB, |
| rrectStyle ? false : kWithAnalyticClip }; |
| } |
| |
| // This is the same as linear_hw_image but with a different color space |
| PrecompileSettings linear_hw_image_srgb(sk_sp<SkRuntimeEffect> rte, |
| bool rrectStyle, |
| bool opaquePaint = true) { |
| return { LinearEffect(rte, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ opaquePaint, |
| /* matrixColorFilter= */ false, |
| /* dither= */ false, |
| SkColorSpace::MakeSRGB()), // note: not MakeSRGBLinear |
| rrectStyle ? DrawTypeFlags::kAnalyticRRect: DrawTypeFlags::kNonAAFillRect, |
| kCombo_RGBA_1D_4DS_SRGB, |
| rrectStyle ? false : kWithAnalyticClip }; |
| } |
| |
| PrecompileSettings linear_hw_image_matrixfilter(sk_sp<SkRuntimeEffect> rte, bool rrectStyle) { |
| return { LinearEffect(rte, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ true, |
| /* dither= */ false, |
| SkColorSpace::MakeSRGBLinear()), |
| rrectStyle ? DrawTypeFlags::kAnalyticRRect: DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D_SRGB, |
| rrectStyle ? false : kWithAnalyticClip }; |
| } |
| |
| // This is the same as linear_hw_image_matrixfilter but with a different color space and dest |
| PrecompileSettings linear_hw_image_matrixfilter_srgb(sk_sp<SkRuntimeEffect> rte, bool rrectStyle) { |
| return { LinearEffect(rte, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ true, |
| /* dither= */ false, |
| SkColorSpace::MakeSRGB()), // note: not MakeSRGBLinear |
| rrectStyle ? DrawTypeFlags::kAnalyticRRect: DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D, |
| rrectStyle ? false : kWithAnalyticClip }; |
| } |
| |
| PrecompileSettings linear_hw_image_matrixfilter_dither(sk_sp<SkRuntimeEffect> rte, bool rrectStyle) { |
| return { LinearEffect(rte, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ true, |
| /* dither= */ true, |
| SkColorSpace::MakeSRGBLinear()), |
| rrectStyle ? DrawTypeFlags::kAnalyticRRect: DrawTypeFlags::kNonAAFillRect, |
| kCombo_RGBA_1D_4DS_SRGB, |
| rrectStyle ? false : kWithAnalyticClip }; |
| } |
| |
| PrecompileSettings linear_solid(sk_sp<SkRuntimeEffect> rte) { |
| return { LinearEffect(rte, |
| PrecompileShaders::Color(), |
| SkBlendMode::kSrc, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ false, |
| /* dither= */ false, |
| SkColorSpace::MakeSRGBLinear()), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }; |
| } |
| |
| // clang-format on |
| |
| void VisitAndroidPrecompileSettings_Old( |
| skgpu::graphite::PrecompileContext* precompileContext, |
| RuntimeEffectManager& effectManager, |
| const std::function<void(skgpu::graphite::PrecompileContext*, |
| const PrecompileSettings&, |
| int index)>& func) { |
| // Easy references to SkRuntimeEffects for various LinearEffects that may be reused in multiple |
| // precompilation scenarios. |
| // clang-format off |
| const auto kUNKNOWN__SRGB__false__UNKNOWN__Shader = |
| effectManager.getOrCreateLinearRuntimeEffect({ |
| /* inputDataspace= */ ui::Dataspace::UNKNOWN, // Default |
| /* outputDataspace= */ ui::Dataspace::SRGB, // (deprecated) sRGB sRGB Full range |
| /* undoPremultipliedAlpha= */ false, |
| /* fakeOutputDataspace= */ ui::Dataspace::UNKNOWN, // Default |
| /* type= */ shaders::LinearEffect::SkSLType::Shader, |
| }); |
| |
| const auto kBT2020_ITU_PQ__DISPLAY_P3__false__0x90a0000__Shader = |
| effectManager.getOrCreateLinearRuntimeEffect({ |
| /* inputDataspace= */ ui::Dataspace::BT2020_ITU_PQ, // BT2020 SMPTE 2084 Limited range |
| /* outputDataspace= */ ui::Dataspace::DISPLAY_P3, // DCI-P3 sRGB Full range |
| /* undoPremultipliedAlpha= */ false, |
| /* fakeOutputDataspace= */ static_cast<ui::Dataspace>(0x90a0000), // DCI-P3 gamma 2.2 Full range |
| /* type= */ shaders::LinearEffect::SkSLType::Shader, |
| }); |
| |
| const auto kBT2020_ITU_PQ__BT2020__false__UNKNOWN__Shader = |
| effectManager.getOrCreateLinearRuntimeEffect({ |
| /* inputDataspace= */ ui::Dataspace::BT2020_ITU_PQ, // BT2020 SMPTE 2084 Limited range |
| /* outputDataspace= */ ui::Dataspace::BT2020, // BT2020 SMPTE_170M Full range |
| /* undoPremultipliedAlpha= */ false, |
| /* fakeOutputDataspace= */ ui::Dataspace::UNKNOWN, // Default |
| /* type= */ shaders::LinearEffect::SkSLType::Shader, |
| }); |
| |
| const auto k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader = |
| effectManager.getOrCreateLinearRuntimeEffect({ |
| /* inputDataspace= */ static_cast<ui::Dataspace>(0x188a0000), // DCI-P3 sRGB Extended range |
| /* outputDataspace= */ ui::Dataspace::DISPLAY_P3, // DCI-P3 sRGB Full range |
| /* undoPremultipliedAlpha= */ false, |
| /* fakeOutputDataspace= */ static_cast<ui::Dataspace>(0x90a0000), // DCI-P3 gamma 2.2 Full range |
| /* type= */ shaders::LinearEffect::SkSLType::Shader, |
| }); |
| |
| const auto kBT2020_HLG__UNKNOWN__false__UNKNOWN__Shader = |
| effectManager.getOrCreateLinearRuntimeEffect({ |
| /* inputDataspace= */ ui::Dataspace::BT2020_HLG, |
| /* outputDataspace= */ ui::Dataspace::UNKNOWN, |
| /* undoPremultipliedAlpha= */ false, |
| /* fakeOutputDataspace= */ ui::Dataspace::UNKNOWN, // Default |
| /* type= */ shaders::LinearEffect::SkSLType::Shader, |
| }); |
| |
| const auto kV0_SRGB__V0_SRGB__true__UNKNOWN__Shader = |
| effectManager.getOrCreateLinearRuntimeEffect({ |
| /* inputDataspace= */ ui::Dataspace::V0_SRGB, |
| /* outputDataspace= */ ui::Dataspace::V0_SRGB, |
| /* undoPremultipliedAlpha= */ true, |
| /* fakeOutputDataspace= */ ui::Dataspace::UNKNOWN, // Default |
| /* type= */ shaders::LinearEffect::SkSLType::Shader, |
| }); |
| |
| const auto k0x188a0000__V0_SRGB__true__0x9010000__Shader = |
| effectManager.getOrCreateLinearRuntimeEffect({ |
| /* inputDataspace= */ static_cast<ui::Dataspace>(0x188a0000), // DCI-P3 sRGB Extended range |
| /* outputDataspace= */ ui::Dataspace::V0_SRGB, |
| /* undoPremultipliedAlpha= */ true, |
| /* fakeOutputDataspace= */ static_cast<ui::Dataspace>(0x9010000), |
| /* type= */ shaders::LinearEffect::SkSLType::Shader, |
| }); |
| |
| #if defined(SK_VULKAN) && defined(SK_BUILD_FOR_ANDROID) |
| const SkColorInfo kRGBA8PremulPQ(kRGBA_8888_SkColorType, |
| kPremul_SkAlphaType, |
| SkColorSpace::MakeRGB(SkNamedTransferFn::kPQ, |
| SkNamedGamut::kRec2020)); |
| #endif |
| |
| // clang-format on |
| |
| // ======================================= |
| // Combinations |
| // ======================================= |
| // NOTE: keep in sync with upstream |
| // external/skia/tests/graphite/precompile/AndroidPaintOptions.cpp |
| // clang-format off |
| |
| // For non-Vulkan configs, these settings cover 126 of the 170 cases in 'kCases'. |
| // They create 153 Pipelines so only modestly over-generate (27 extra Pipelines - 18%). |
| // |
| // For Vulkan configs, the Vulkan-specific PrecompileSettings handle 24 more cases and |
| // add 29 more Pipelines. |
| // |
| // These are sorted into groups based on (first) PaintOptions creation function and |
| // then Render Pass Properties. |
| // This helps observe DrawTypeFlags distributions. |
| const PrecompileSettings precompileCases[] = { |
| // 0: 100% (1/1) handles: 0 |
| { Builder().hwImg(kPremul).srcOver(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA16F_1_D }, |
| |
| // 1: 100% (4/4) handles: 22 23 42 43 |
| { Builder().hwImg(kPremul).srcOver(), |
| kRRectAndNonAARect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| |
| // 2: 100% (2/2) handles: 165 171 |
| { Builder().hwImg(kPremul).srcOver(), |
| kRRectAndNonAARect, |
| kRGBA_4_DS }, |
| |
| // 3: 100% (1/1) handles: 1 |
| { Builder().hwImg(kSRGB).srcOver(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA16F_1_D_SRGB }, |
| |
| // 4: 100% (4/4) handles: 24 44 45 110 |
| { Builder().hwImg(kSRGB).srcOver(), |
| kRRectAndNonAARect, |
| kRGBA_1_D_SRGB, |
| kWithAnalyticClip }, |
| |
| // 5: 100% (4/4) handles: 9 28 95 106 |
| { Builder().transparent().hwImg(kPremul).srcOver(), |
| kRRectAndNonAARect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| |
| // 6: 100% (2/2) handles: 164 166 |
| { Builder().transparent().hwImg(kPremul).srcOver(), |
| kRRectAndNonAARect, |
| kRGBA_4_DS }, |
| |
| // 7: 75% (3/4) handles: 10 29 208 |
| { Builder().transparent().hwImg(kSRGB).srcOver(), |
| kRRectAndNonAARect, |
| kCombo_RGBA_1D_4DS_SRGB }, |
| |
| // 8: 75% (9/12) handles: 56 57 58 89 92 94 172 250 251 |
| { Builder().src().srcOver(), |
| DrawTypeFlags::kNonAAFillRect, |
| kCombo_RGBA_1D_4DS_16F, |
| kWithAnalyticClip }, |
| |
| // 9: 100% (2/2) handles: 27 86 |
| { Builder().srcOver(), |
| DrawTypeFlags::kAnalyticRRect, |
| kCombo_RGBA_1D_4DS }, |
| |
| // 10: 75% (3/4) handles: 19 38 128 |
| { Builder().hwImg(kPremul).matrixCF().srcOver(), |
| kRRectAndNonAARect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| |
| // 11: 75% (3/4) handles: 12 123 124 |
| { Builder().transparent().hwImg(kPremul).matrixCF().srcOver(), |
| kRRectAndNonAARect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| |
| // 12: 100% (1/1) handles: 14 |
| { Builder().transparent().hwImg(kPremul).matrixCF().dither().srcOver(), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_1_D }, |
| |
| // 13: 100% (1/1) handles: 168 |
| { Builder().transparent().hwImg(kPremul).matrixCF().dither().srcOver(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_4_DS }, |
| |
| // 14: 75% (3/4) handles: 16 32 33 |
| { Builder().hwImg(kPremul).matrixCF().dither().srcOver(), |
| kRRectAndNonAARect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| |
| // 15: 100% (1/1) handles: 169 |
| { Builder().hwImg(kPremul).matrixCF().dither().srcOver(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_4_DS }, |
| |
| // 16: 100% (2/2) handles: 15 31 |
| { Builder().transparent().hwImg(kSRGB).matrixCF().dither().srcOver(), |
| kRRectAndNonAARect, |
| kRGBA_1_D_SRGB }, |
| |
| // 17: 75% (3/4) handles: 17 34 35 |
| { Builder().hwImg(kSRGB).matrixCF().dither().srcOver(), |
| kRRectAndNonAARect, |
| kRGBA_1_D_SRGB, |
| kWithAnalyticClip }, |
| |
| // 18: 100% (1/1) handles: 77 |
| { Builder().hwImg(kSRGB).matrixCF().dither().srcOver(), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_4_DS_SRGB }, |
| |
| // 19: 50% (1/2) handles: 37 |
| { Builder().hwImg(kAlphaSRGB).matrixCF().srcOver(), |
| DrawTypeFlags::kNonAAFillRect, |
| kCombo_RGBA_1D_4DS_SRGB }, |
| |
| // 20: 100% (1/1) handles: 100 |
| { Builder().hwImg(kPremul).src(), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_1_D }, |
| |
| // 21: 100% (1/1) handles: 59 |
| { Builder().hwImg(kPremul).src(), |
| DrawTypeFlags::kPerEdgeAAQuad, |
| kRGBA_1_D }, |
| |
| // 22: 100% (1/1) handles: 170 |
| { Builder().hwImg(kPremul).src(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_4_DS }, |
| |
| // TODO(b/426601394): Group these paint option settings into a function that accepts an |
| // input image color space so that the intermediate linear color spaces adapt correctly. |
| // 23: 100% (1/1) handles: 5 |
| { MouriMapBlur(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA16F_1_D_Linear }, |
| |
| // 24: 100% (1/1) handles: 55 |
| { MouriMapToneMap(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D_SRGB }, |
| |
| // 25: 100% (1/1) handles: 7 |
| { MouriMapCrosstalkAndChunk16x16Passthrough(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA16F_1_D_Linear }, |
| |
| // 26: 100% (1/1) handles: 6 |
| { MouriMapChunk8x8Effect(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA16F_1_D_Linear }, |
| |
| // 27: 100% (4/4) handles: 49 99 199 305 |
| { BlurFilterMix(effectManager), |
| kRRectAndNonAARect, |
| kRGBA_1_D }, |
| |
| // These two are solid colors drawn w/ a LinearEffect |
| |
| // 28: 67% (8/12) handles: 78 80 81 83 84 157 159 161 |
| { Builder().srcOver(), |
| DrawTypeFlags::kNonSimpleShape, |
| kRGBA_4_DS }, |
| |
| // Note: this didn't get folded into #2 since the RRect draw isn't appearing w/ a clip |
| // 29: 100% (1/1) handles: 91 |
| { Builder().hwImg(kPremul).srcOver(), |
| DrawTypeFlags::kNonAAFillRect | DrawTypeFlags::kAnalyticClip, |
| kRGBA_4_DS }, |
| |
| // 30: 50% (1/2) handles: 60 |
| { {}, // ignored |
| DrawTypeFlags::kDropShadows, |
| kRGBA_1_D }, |
| |
| // 31: 100% (2/2) handles: 82 85 |
| { {}, // ignored |
| DrawTypeFlags::kDropShadows, |
| kRGBA_4_DS }, |
| |
| // 32: 100% (2/2) handles: 96 112 |
| { EdgeExtensionPremulSrcover(effectManager), |
| kRRectAndNonAARect, |
| kRGBA_1_D }, |
| |
| // 33: 100% (1/1) handles: 126 |
| { TransparentPaintEdgeExtensionPassthroughMatrixCFDitherSrcover(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }, |
| |
| // 34: 100% (1/1) handles: 97 |
| { TransparentPaintEdgeExtensionPassthroughSrcover(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }, |
| |
| // 35: 100% (2/2) handles: 98 211 |
| { TransparentPaintEdgeExtensionPremulSrcover(effectManager), |
| kRRectAndNonAARect, |
| kRGBA_1_D }, |
| |
| // 36: 100% (2/2) handles: 137 13 |
| { EdgeExtensionPassthroughSrcover(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| |
| // 37: 50% (1/2) handles: 101 |
| { Builder().hwImg(kAlpha, kClamp).src(), |
| DrawTypeFlags::kNonAAFillRect, |
| kR_1_D }, |
| |
| // 38: 100% (2/2) handles: 109 129 |
| { Builder().hwImg(kSRGB).matrixCF().srcOver(), |
| kRRectAndNonAARect, |
| kRGBA_1_D_SRGB }, |
| |
| // 39: 100% (1/1) handles: 104 |
| { MouriMapCrosstalkAndChunk16x16Premul(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA16F_1_D_SRGB }, |
| |
| // 40: 100% (2/2) handles: 107 146 |
| { Builder().blend().srcOver(), |
| DrawTypeFlags::kAnalyticRRect, |
| kCombo_RGBA_1D_4DS }, |
| |
| // 41: 100% (1/1) handles: 122 |
| { Builder().blend().srcOver(), |
| DrawTypeFlags::kNonAAFillRect | DrawTypeFlags::kAnalyticClip, |
| kRGBA_1_D }, |
| |
| // 42: 100% (1/1) handles: 117 |
| { Builder().transparent().blend().srcOver(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }, |
| |
| // 43: 100% (1/1) handles: 197 |
| { BoxShadow(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }, |
| |
| // 44: 100% (1/1) handles: 198 |
| { GainMap(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D_Linear }, |
| |
| // 45: 100% (1/1) handles: 202 |
| // Just 52 but for RRects w/o clips |
| { EdgeExtensionPassthroughSrcover(effectManager), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_1_D, }, |
| |
| // 46: 100% (2/2) handles: 30 204 |
| // Just 12 for rects with and w/o clips |
| { Builder().transparent().hwImg(kPremul).matrixCF().dither().srcOver(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D, |
| kWithAnalyticClip}, |
| |
| // 47: 100% (2/2) handles: 41 212 |
| { Builder().hwImg(kPremul).src(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| |
| //------------------------------------------------------------------------------------------ |
| |
| // 48: 100% (1/1) handles: 201 |
| linear_solid(kBT2020_HLG__UNKNOWN__false__UNKNOWN__Shader), |
| |
| //------------------------------------------------------------------------------------------ |
| // 49: 100% (1/1) handles: 265 |
| linear_solid(kBT2020_ITU_PQ__BT2020__false__UNKNOWN__Shader), |
| |
| // 50: 100% (1/1) handles: 54 |
| { LinearEffect(kBT2020_ITU_PQ__BT2020__false__UNKNOWN__Shader, |
| PrecompileShaders::Color(), |
| SkBlendMode::kSrc), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D_SRGB }, |
| |
| //------------------------------------------------------------------------------------------ |
| // k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader |
| |
| // 51: 75% (3/4) handles: 180 227 229 |
| linear_hw_image(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, /* rrectStyle= */ false), |
| |
| // 52: 100% (2/2) handles: 228 230 |
| linear_hw_image(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, /* rrectStyle= */ true), |
| |
| // 53: 75% (3/4) handles: 176 205 234 |
| linear_hw_image(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| /* rrectStyle= */ false, /* opaquePaint= */ false), |
| |
| // 54: 100% (2/2) handles: 231 233 |
| linear_hw_image(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| /* rrectStyle= */ true, /* opaquePaint= */ false), |
| |
| // 55: 100% (1/1) handles: 174 |
| linear_hw_image_matrixfilter(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| /* rrectStyle= */true), |
| |
| // 56: 100% (2/2) handles: 177 255 |
| linear_hw_image_matrixfilter(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| /* rrectStyle= */false), |
| |
| // 57: 100% (1/1) handles: 173 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ false, |
| /* matrixColorFilter= */ true, |
| /* dither= */ false, |
| SkColorSpace::MakeSRGBLinear()), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_1_D_SRGB }, |
| |
| // 58: 50% (2/4) handles: 179 246 |
| linear_hw_image_matrixfilter_dither(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| /* rrectStyle= */ false), |
| // 59: 50% (1/2) handles: 175 |
| linear_hw_image_matrixfilter_dither(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| /* rrectStyle= */ true), |
| |
| // 60: 75% (3/4) handles: 196 209 275 |
| linear_hw_image_srgb(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| /* rrectStyle= */ false), |
| // 61: 50% (1/2) handles: 187 |
| linear_hw_image_srgb(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| /* rrectStyle= */ true), |
| |
| // 62: 75% (3/4) handles: 189 259 260 |
| linear_hw_image_srgb(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| /* rrectStyle= */ false, /* opaquePaint= */ false), |
| // 63: 100% (2/2) handles: 184 261 |
| linear_hw_image_srgb(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| /* rrectStyle= */ true, /* opaquePaint= */ false), |
| |
| // 64: 100% (1/1) handles: 266 |
| linear_solid(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader), |
| |
| // 65: 100% (2/2) handles: 194 195 |
| linear_hw_image_matrixfilter_srgb(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, false), |
| // 66: 100% (1/1) handles: 186 |
| linear_hw_image_matrixfilter_srgb(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, true), |
| |
| // 67: 100% (1/1) handles: 207 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ false, |
| /* matrixColorFilter= */ true, |
| /* dither= */ true, |
| SkColorSpace::MakeSRGBLinear()), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_1_D }, |
| |
| // 68: 50% (1/2) handles: 252 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ false, |
| /* matrixColorFilter= */ true, |
| /* dither= */ true, |
| SkColorSpace::MakeSRGBLinear()), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| |
| // 69: 100% (1/1) handles: 190 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ false, |
| /* matrixColorFilter= */ true, |
| /* dither= */ false, |
| SkColorSpace::MakeSRGB()), // note: not MakeSRGBLinear |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }, |
| |
| // 70: 100% (1/1) handles: 191 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ false, |
| /* matrixColorFilter= */ true, |
| /* dither= */ true, |
| SkColorSpace::MakeSRGB()), // note: not MakeSRGBLinear |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }, |
| |
| // 71: 75% (3/4) handles: 185 192 193 |
| // This is a modified version of 67: |
| // opaque, matrix color filter, dither and analytic clip |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ true, |
| /* dither= */ true, |
| SkColorSpace::MakeSRGB()), // note: not MakeSRGBLinear |
| kRRectAndNonAARect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| |
| // 72: 100% (1/1) handles: 120 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ false), |
| DrawTypeFlags::kNonAAFillRect | DrawTypeFlags::kAnalyticClip, |
| kRGBA_1_D_SRGB }, |
| |
| // 73: 100% (1/1) handles: 131 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ true), |
| DrawTypeFlags::kNonAAFillRect | DrawTypeFlags::kAnalyticClip, |
| kRGBA_1_D_SRGB }, |
| |
| // The next 3 have a RE_LinearEffect and a MatrixFilter along w/ different ancillary |
| // additions |
| // 74: 100% (1/1) handles: 20 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ true, |
| /* dither= */ false), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_1_D_SRGB }, |
| |
| // 75: 100% (1/1) handles: 13 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ false, |
| /* matrixColorFilter= */ true, |
| /* dither= */ false), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_1_D_SRGB }, |
| |
| // 76: 100% (1/1) handles: 18 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ true, |
| /* dither= */ true), // note: null colorspace |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_1_D_SRGB }, |
| |
| // 77: 50% (1/2) handles: 26 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver), |
| DrawTypeFlags::kAnalyticRRect, |
| kCombo_RGBA_1D_4DS_SRGB }, |
| |
| // 78: 100% (2/2) handles: 139 140 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D_SRGB, |
| kWithAnalyticClip }, |
| |
| // 79: 50% (1/2) handles: 11 |
| { LinearEffect(k0x188a0000__DISPLAY_P3__false__0x90a0000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ false), |
| DrawTypeFlags::kAnalyticRRect, |
| kCombo_RGBA_1D_4DS_SRGB }, |
| |
| //------------------------------------------------------------------------------------------ |
| // k0x188a0000__V0_SRGB__true__0x9010000__Shader |
| |
| // 80: 75% (3/4) handles: 222 223 226 |
| linear_hw_image(k0x188a0000__V0_SRGB__true__0x9010000__Shader, /* rrectStyle= */ false), |
| // 81: 50% (1/2) handles: 224 |
| linear_hw_image(k0x188a0000__V0_SRGB__true__0x9010000__Shader, /* rrectStyle= */ true), |
| |
| // 82: 75% (3/4) handles: 235 236 238 |
| linear_hw_image(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| /* rrectStyle= */ false, /* opaquePaint= */ false), |
| // 83: 100% (2/2) handles: 237 239 |
| linear_hw_image(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| /* rrectStyle= */ true, /* opaquePaint= */ false), |
| |
| // 84: 100% (1/1) handles: 210 |
| linear_hw_image_matrixfilter(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| /* rrectStyle= */ true), |
| |
| // 85: 50% (1/2) handles: 258 |
| linear_hw_image_matrixfilter(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| /* rrectStyle= */ false), |
| |
| // No matching labels |
| // linear_hw_image_matrixfilter_dither(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| // /* rrectStyle= */ false), |
| // 86: 50% (1/2) handles: 248 |
| linear_hw_image_matrixfilter_dither(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| /* rrectStyle= */ true), |
| |
| // No matching labels |
| // linear_hw_image_srgb(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| // /* rrectStyle= */ false), |
| // 87: 50% (1/2) handles: 213 |
| linear_hw_image_srgb(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| /* rrectStyle= */ true), |
| |
| // 88: 50% (2/4) handles: 262 263 |
| linear_hw_image_srgb(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| /* rrectStyle= */ false, /* opaquePaint= */ false), |
| // 89: 50% (1/2) handles: 264 |
| linear_hw_image_srgb(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| /* rrectStyle= */ true, /* opaquePaint= */ false), |
| |
| // 90: 100% (1/1) handles: 270(fake) |
| linear_solid(k0x188a0000__V0_SRGB__true__0x9010000__Shader), |
| |
| // 91: 50% (1/2) handles: 272(fake) |
| linear_hw_image_matrixfilter_srgb(k0x188a0000__V0_SRGB__true__0x9010000__Shader, false), |
| // 92: 100% (1/1) handles: 273 |
| linear_hw_image_matrixfilter_srgb(k0x188a0000__V0_SRGB__true__0x9010000__Shader, true), |
| |
| // 93: 100% (1/1) handles: 108 |
| { LinearEffect(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ true, |
| /* dither= */ true), // note: null colorspace |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_1_D_SRGB }, |
| |
| // 94: 100% (1/1) handles: 113 |
| { LinearEffect(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_1_D_SRGB }, |
| |
| //------------------------------------------------------------------------------------------ |
| // kUNKNOWN__SRGB__false__UNKNOWN__Shader |
| |
| // 95: 50% (2/4) handles: 214 215 |
| linear_hw_image(kUNKNOWN__SRGB__false__UNKNOWN__Shader, /* rrectStyle= */ false), |
| // 96: 50% (1/2) handles: 216 |
| linear_hw_image(kUNKNOWN__SRGB__false__UNKNOWN__Shader, /* rrectStyle= */ true), |
| // 66 is in this set for 16F/182 |
| |
| // 97: 50% (2/4) handles: 240 241 |
| linear_hw_image(kUNKNOWN__SRGB__false__UNKNOWN__Shader, |
| /* rrectStyle= */ false, /* opaquePaint= */ false), |
| // 98: 50% (1/2) handles: 242 |
| linear_hw_image(kUNKNOWN__SRGB__false__UNKNOWN__Shader, |
| /* rrectStyle= */ true, /* opaquePaint= */ false), |
| |
| // 99: 100% (1/1) handles: 182 |
| // A linear_hw_image but 16F |
| { LinearEffect(kUNKNOWN__SRGB__false__UNKNOWN__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ false, |
| /* dither= */ false, |
| SkColorSpace::MakeSRGBLinear()), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA16F_1_D_SRGB }, |
| |
| // 100: 75% (3/4) handles: 178 181 188 |
| // This is just 24 wrapped in a very specific LinearEffect |
| linear_and_tonemap(&effectManager, kUNKNOWN__SRGB__false__UNKNOWN__Shader), |
| |
| // 101: 100% (1/1) handles: 203 |
| { LinearEffect(kUNKNOWN__SRGB__false__UNKNOWN__Shader, |
| create_tone_map(effectManager), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ false, |
| /* matrixColorFilter= */ false, |
| /* dither= */ false, |
| SkColorSpace::MakeSRGBLinear()), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }, |
| |
| // 102: 100% (2/2) handles: 2 141 |
| { LinearEffect(kUNKNOWN__SRGB__false__UNKNOWN__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver), |
| DrawTypeFlags::kNonAAFillRect, |
| kCombo_RGBA_1D_SRGB_w16F }, |
| |
| // 103: 100% (1/1) handles: 183 |
| { LinearEffect(kUNKNOWN__SRGB__false__UNKNOWN__Shader, |
| PrecompileShaders::Color(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ false, |
| /* dither= */ false, |
| SkColorSpace::MakeSRGBLinear()), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA16F_1_D_SRGB }, // note: 16F |
| |
| // 104: 100% (1/1) handles: 4 |
| { LinearEffect(kUNKNOWN__SRGB__false__UNKNOWN__Shader, |
| PrecompileShaders::Color(), |
| SkBlendMode::kSrcOver), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA16F_1_D_SRGB }, |
| |
| //------------------------------------------------------------------------------------------ |
| // kV0_SRGB__V0_SRGB__true__UNKNOWN__Shader |
| |
| // 105: 75% (3/4) handles: 217 218 220 |
| linear_hw_image(kV0_SRGB__V0_SRGB__true__UNKNOWN__Shader, /* rrectStyle= */ false), |
| // 106: 50% (1/2) handles: 219 |
| linear_hw_image(kV0_SRGB__V0_SRGB__true__UNKNOWN__Shader, /* rrectStyle= */ true), |
| |
| // 107: 50% (2/4) handles: 243 244(fake) |
| linear_hw_image(kV0_SRGB__V0_SRGB__true__UNKNOWN__Shader, |
| /* rrectStyle= */ false, /* opaquePaint= */ false), |
| // 108: 50% (1/2) handles: 245 |
| linear_hw_image(kV0_SRGB__V0_SRGB__true__UNKNOWN__Shader, |
| /* rrectStyle= */ true, /* opaquePaint= */ false), |
| |
| // 109: 75% (3/4) handles: 206 249 310 |
| linear_and_tonemap(&effectManager, kV0_SRGB__V0_SRGB__true__UNKNOWN__Shader), |
| |
| // 110: 100% (1/1) handles: 254 |
| { LinearEffect(k0x188a0000__V0_SRGB__true__0x9010000__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ false, |
| /* matrixColorFilter= */ true, |
| /* dither= */ true, |
| SkColorSpace::MakeSRGBLinear()), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_1_D_SRGB }, |
| |
| // 111: 100% (1/1) handles: 103 |
| { LinearEffect(kV0_SRGB__V0_SRGB__true__UNKNOWN__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA16F_1_D_SRGB }, |
| |
| // 112: 100% (1/1) handles: 114 |
| { LinearEffect(kV0_SRGB__V0_SRGB__true__UNKNOWN__Shader, |
| create_hw_image_precompile_shader(), |
| SkBlendMode::kSrcOver), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_1_D_SRGB }, |
| |
| //------------------------------------------------------------------------------------------ |
| // kBT2020_ITU_PQ__DISPLAY_P3__false__0x90a0000__Shader |
| |
| // 113: 100% (1/1) handles: 268 |
| linear_solid(kBT2020_ITU_PQ__DISPLAY_P3__false__0x90a0000__Shader), |
| |
| #if defined(SK_VULKAN) && defined(SK_BUILD_FOR_ANDROID) |
| |
| // 238 Full range (kHIAAO4AAAAAAAAA) block ---------------- |
| |
| // (3/4) 134 135 150 |
| { ImagePremulYCbCr238Srcover(/* narrow= */ false), |
| DrawTypeFlags::kNonAAFillRect, |
| kCombo_RGBA_1D_4DS_SRGB, |
| kWithAnalyticClip }, |
| |
| // 238 Narrow range (kHoAAO4AAAAAAAAA) block ---------------- |
| |
| // 75% (3/4) handles 25 47 48 |
| { ImagePremulYCbCr238Srcover(/* narrow= */ true), |
| kRRectAndNonAARect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| |
| // 75% (3/4) handles 93 119 148 |
| { TransparentPaintImagePremulYCbCr238Srcover(), |
| kRRectAndNonAARect, |
| kCombo_RGBA_1D_4DS }, |
| |
| // 100% (1/1) handles 149 |
| { TransparentPaintImagePremulYCbCr238Srcover(), |
| DrawTypeFlags::kNonAAFillRect | DrawTypeFlags::kAnalyticClip, |
| kRGBA_4_DS }, |
| |
| // 100% (2/2) handles 87 88 |
| { ImagePremulYCbCr238Srcover(/* narrow= */ true), |
| kRRectAndNonAARect, |
| kRGBA_4_DS }, |
| |
| // Note: this didn't get folded into the above since the RRect draw isn't appearing w/ a |
| // clip |
| // 100% (1/1) handles 90 |
| { ImagePremulYCbCr238Srcover(/* narrow= */ true), |
| DrawTypeFlags::kNonAAFillRect | DrawTypeFlags::kAnalyticClip, |
| kRGBA_4_DS }, |
| |
| // 240 (kHIAAPAAAAAAAAAA) block ---------------- |
| |
| // 100% (2/2) handles 46 136 |
| { ImagePremulYCbCr240Srcover(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| |
| // 100% (2/2) handles (73) 151 |
| { ImagePremulYCbCr240Srcover(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_4_DS }, |
| |
| // 67% (2/3) handles 67 118 (164) |
| { TransparentPaintImagePremulYCbCr240Srcover(), |
| DrawTypeFlags::kNonAAFillRect, |
| kCombo_RGBA_1D_4DS }, |
| |
| // 247 (kEwAAPcAAAAAAAAA) block ---------------- |
| |
| // 70: 100% (1/1) handles 8 |
| { MouriMapCrosstalkAndChunk16x16YCbCr247(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA16F_1_D_SRGB }, |
| |
| // The next 2 have the same PaintOptions but different destination surfaces |
| |
| // 75% (3/4) handles 21 39 40 |
| { LinearEffect(kBT2020_ITU_PQ__BT2020__false__UNKNOWN__Shader, |
| vulkan_ycbcr_image_shader( |
| ycbcr_info(247, |
| VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020, |
| VK_SAMPLER_YCBCR_RANGE_ITU_NARROW, |
| VK_CHROMA_LOCATION_COSITED_EVEN), |
| kRGBA8PremulPQ), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ false, |
| /* dither= */ true), |
| kRRectAndNonAARect, |
| kRGBA_1_D_SRGB, |
| kWithAnalyticClip }, |
| |
| // 100% (1/1) handles 79 |
| { LinearEffect(kBT2020_ITU_PQ__BT2020__false__UNKNOWN__Shader, |
| vulkan_ycbcr_image_shader( |
| ycbcr_info(247, |
| VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020, |
| VK_SAMPLER_YCBCR_RANGE_ITU_NARROW, |
| VK_CHROMA_LOCATION_COSITED_EVEN), |
| kRGBA8PremulPQ), |
| SkBlendMode::kSrcOver, |
| /* paintColorIsOpaque= */ true, |
| /* matrixColorFilter= */ false, |
| /* dither= */ true), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_4_DS_SRGB }, |
| |
| //---------------- |
| // 100% (1/1) handles: 154 |
| { LinearAndLUTEffectImageYCbCr54(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }, |
| // 100% (1/1) handles: 155 |
| { ImagePremulYCbCr769Srcover(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }, |
| // 100% (1/1) handles: 156 |
| { LinearEffectImageYCbCr54(effectManager), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D_SRGB }, |
| #endif |
| }; |
| |
| for (size_t i = 0; i < std::size(precompileCases); ++i) { |
| func(precompileContext, precompileCases[i], i); |
| } |
| } |
| |
| /* |
| * This set of PaintOptions was generated by finding all the labels that were already |
| * covered by the old set of PaintOptions and then copying over the generating |
| * PaintOptions. Since these PaintOptions were already in the old set it is assumed that the |
| * duplicate labels were from the Protected Context. |
| * |
| * On a Pixel9 this addresses 28 Pipelines while generating 36 (78%) |
| */ |
| void VisitAndroidPrecompileSettings_Protected( |
| skgpu::graphite::PrecompileContext* precompileContext, |
| RuntimeEffectManager& effectManager, |
| const std::function<void(skgpu::graphite::PrecompileContext*, |
| const PrecompileSettings&, |
| int index)>& func) { |
| // The number in parentheses after the label indices following the "handles" keyword is the |
| // index of the label in the old set. |
| const PrecompileSettings precompileCases[] = { |
| // 0: 100% (1/1) handles: 0 (63*) and 105 (63) |
| { Builder().hwImg(kPremul).srcOver(), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_4_DS }, |
| // 1: 100% (1/1) handles: 1 (61*) |
| { Builder().transparent().hwImg(kPremul).srcOver(), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_4_DS }, |
| // 2: 100% (1/1) handles: 4 (71*) and 49 (71) |
| { Builder().hwImg(kPremul).src(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_4_DS }, |
| // 3: 100% (1/1) handles: 5 (86) |
| { Builder().srcOver(), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_4_DS }, |
| // 4: 50% (1/2) handles: 10 (82) -- only need the VerticesRenderStep[TrisColor] version! |
| { {}, // ignored |
| DrawTypeFlags::kDropShadows, |
| kRGBA_4_DS }, |
| // 5: 100% (1/1) handles: 15 (91) |
| { Builder().hwImg(kPremul).srcOver(), |
| DrawTypeFlags::kNonAAFillRect | DrawTypeFlags::kAnalyticClip, |
| kRGBA_4_DS }, |
| // 6: 100% (1/1) handles: 28 (146) |
| { Builder().blend().srcOver(), |
| DrawTypeFlags::kAnalyticRRect, |
| kRGBA_4_DS }, |
| // 7: 50% (1/2) handles: 35 (89) |
| { Builder().srcOver(), |
| DrawTypeFlags::kNonAAFillRect | DrawTypeFlags::kAnalyticClip, |
| kRGBA_4_DS }, |
| // 8: 100% (1/1) handles: 46 (166 - 69*) |
| { Builder().hwImg(kPremul).matrixCF().dither().srcOver(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_4_DS }, |
| // 9: 75% (3/4) handles: 74 (28) 144 (9) 246 (95) |
| { Builder().transparent().hwImg(kPremul).srcOver(), |
| kRRectAndNonAARect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| // 10: 100% (2/2) handles: 85 (99) 192 (49) |
| { BlurFilterMix(effectManager), |
| kRRectAndNonAARect, |
| kRGBA_1_D }, |
| // 11: 100% (2/2) handles: 97 (43) 114 (42) |
| { Builder().hwImg(kPremul).srcOver(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D, |
| kWithAnalyticClip }, |
| // 12: 50% (1/2) handles: 165 (57) |
| { Builder().src().srcOver(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }, |
| // 13: 50% (1/2) handles: 204 (35) |
| { Builder().hwImg(kSRGB).matrixCF().dither().srcOver(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D_SRGB, |
| kWithAnalyticClip }, |
| // 14: 50% (1/2) handles: 228 (60) |
| { {}, // ignored |
| DrawTypeFlags::kDropShadows, |
| kRGBA_1_D }, |
| |
| #if defined(SK_VULKAN) && defined(SK_BUILD_FOR_ANDROID) |
| // 15: 100% (1/1) handles: 2 (46) |
| { ImagePremulYCbCr240Srcover(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }, |
| // 16: 100% (1/1) handles: 7 (67*) |
| { TransparentPaintImagePremulYCbCr240Srcover(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_4_DS }, |
| // 17: 50% (1/2) handles: 12 (148) |
| { TransparentPaintImagePremulYCbCr238Srcover(), |
| DrawTypeFlags::kNonAAFillRect, |
| kCombo_RGBA_1D_4DS }, |
| // 18: 100% (1/1) handles: 22 (87) |
| { ImagePremulYCbCr238Srcover(/* narrow= */ true), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_4_DS }, |
| // 19: 100% (1/1) handles: 34 (151) |
| { ImagePremulYCbCr240Srcover(), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_4_DS }, |
| // 20: 100% (1/1) handles: 130 (90) |
| { ImagePremulYCbCr238Srcover(/* narrow= */ true), |
| DrawTypeFlags::kNonAAFillRect | DrawTypeFlags::kAnalyticClip, |
| kRGBA_4_DS }, |
| // 21: 50% (1/2) handles: 171 (93) |
| { TransparentPaintImagePremulYCbCr238Srcover(), |
| DrawTypeFlags::kAnalyticRRect, |
| kCombo_RGBA_1D_4DS }, |
| // 22: 100% (1/1) handles: 179 (150) |
| { ImagePremulYCbCr238Srcover(/* narrow= */ false), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_4_DS_SRGB }, |
| // 23: 100% (1/1) handles: 217 (47) |
| { ImagePremulYCbCr238Srcover(/* narrow= */ true), |
| DrawTypeFlags::kNonAAFillRect, |
| kRGBA_1_D }, |
| #endif |
| }; |
| |
| for (size_t i = 0; i < std::size(precompileCases); ++i) { |
| func(precompileContext, precompileCases[i], i); |
| } |
| } |
| |
| #endif // SK_GRAPHITE |