Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Classes | Public Member Functions | List of all members
skgpu::graphite::ShaderCodeDictionary Class Reference

#include <ShaderCodeDictionary.h>

Public Member Functions

 ShaderCodeDictionary ()
 
UniquePaintParamsID findOrCreate (PaintParamsKeyBuilder *) SK_EXCLUDES(fSpinLock)
 
PaintParamsKey lookup (UniquePaintParamsID) const SK_EXCLUDES(fSpinLock)
 
SkString idToString (UniquePaintParamsID id) const
 
SkSpan< const UniformgetUniforms (BuiltInCodeSnippetID) const
 
SkEnumBitMask< SnippetRequirementFlagsgetSnippetRequirementFlags (BuiltInCodeSnippetID id) const
 
const ShaderSnippetgetEntry (int codeSnippetID) const SK_EXCLUDES(fSpinLock)
 
const ShaderSnippetgetEntry (BuiltInCodeSnippetID codeSnippetID) const SK_EXCLUDES(fSpinLock)
 
int findOrCreateRuntimeEffectSnippet (const SkRuntimeEffect *effect)
 

Detailed Description

Definition at line 224 of file ShaderCodeDictionary.h.

Constructor & Destructor Documentation

◆ ShaderCodeDictionary()

skgpu::graphite::ShaderCodeDictionary::ShaderCodeDictionary ( )

Definition at line 1627 of file ShaderCodeDictionary.cpp.

1627 {
1628 // The 0th index is reserved as invalid
1629 fIDToPaintKey.push_back(PaintParamsKey::Invalid());
1630
1631 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kError] = {
1632 "Error",
1633 { }, // no uniforms
1635 { }, // no samplers
1636 kErrorName,
1637 GenerateDefaultExpression,
1638 GenerateDefaultPreamble,
1640 };
1641 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kPriorOutput] = {
1642 "PassthroughShader",
1643 { }, // no uniforms
1645 { }, // no samplers
1646 kPassthroughShaderName,
1647 GenerateDefaultExpression,
1648 GenerateDefaultPreamble,
1650 };
1651 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kSolidColorShader] = {
1652 "SolidColor",
1653 SkSpan(kSolidShaderUniforms),
1655 { }, // no samplers
1656 kSolidShaderName,
1657 GenerateDefaultExpression,
1658 GenerateDefaultPreamble,
1660 };
1661 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kRGBPaintColor] = {
1662 "RGBPaintColor",
1663 SkSpan(kPaintColorUniforms),
1665 { }, // no samplers
1666 kRGBPaintColorName,
1667 GenerateDefaultExpression,
1668 GenerateDefaultPreamble,
1670 };
1671 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kAlphaOnlyPaintColor] = {
1672 "AlphaOnlyPaintColor",
1673 SkSpan(kPaintColorUniforms),
1675 { }, // no samplers
1676 kAlphaOnlyPaintColorName,
1677 GenerateDefaultExpression,
1678 GenerateDefaultPreamble,
1680 };
1681 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kLinearGradientShader4] = {
1682 "LinearGradient4",
1683 SkSpan(kLinearGradientUniforms4),
1685 { }, // no samplers
1686 kLinearGradient4Name,
1687 GenerateDefaultExpression,
1688 GenerateDefaultPreamble,
1690 };
1691 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kLinearGradientShader8] = {
1692 "LinearGradient8",
1693 SkSpan(kLinearGradientUniforms8),
1695 { }, // no samplers
1696 kLinearGradient8Name,
1697 GenerateDefaultExpression,
1698 GenerateDefaultPreamble,
1700 };
1702 "LinearGradientTexture",
1703 SkSpan(kLinearGradientUniformsTexture),
1705 SkSpan(kTextureGradientTexturesAndSamplers),
1706 kLinearGradientTextureName,
1707 GenerateDefaultExpression,
1708 GenerateDefaultPreamble,
1710 };
1711 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kRadialGradientShader4] = {
1712 "RadialGradient4",
1713 SkSpan(kRadialGradientUniforms4),
1715 { }, // no samplers
1716 kRadialGradient4Name,
1717 GenerateDefaultExpression,
1718 GenerateDefaultPreamble,
1720 };
1721 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kRadialGradientShader8] = {
1722 "RadialGradient8",
1723 SkSpan(kRadialGradientUniforms8),
1725 { }, // no samplers
1726 kRadialGradient8Name,
1727 GenerateDefaultExpression,
1728 GenerateDefaultPreamble,
1730 };
1732 "RadialGradientTexture",
1733 SkSpan(kRadialGradientUniformsTexture),
1735 SkSpan(kTextureGradientTexturesAndSamplers),
1736 kRadialGradientTextureName,
1737 GenerateDefaultExpression,
1738 GenerateDefaultPreamble,
1740 };
1741 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kSweepGradientShader4] = {
1742 "SweepGradient4",
1743 SkSpan(kSweepGradientUniforms4),
1745 { }, // no samplers
1746 kSweepGradient4Name,
1747 GenerateDefaultExpression,
1748 GenerateDefaultPreamble,
1750 };
1751 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kSweepGradientShader8] = {
1752 "SweepGradient8",
1753 SkSpan(kSweepGradientUniforms8),
1755 { }, // no samplers
1756 kSweepGradient8Name,
1757 GenerateDefaultExpression,
1758 GenerateDefaultPreamble,
1760 };
1761 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kSweepGradientShaderTexture] = {
1762 "SweepGradientTexture",
1763 SkSpan(kSweepGradientUniformsTexture),
1765 SkSpan(kTextureGradientTexturesAndSamplers),
1766 kSweepGradientTextureName,
1767 GenerateDefaultExpression,
1768 GenerateDefaultPreamble,
1770 };
1771 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kConicalGradientShader4] = {
1772 "ConicalGradient4",
1773 SkSpan(kConicalGradientUniforms4),
1775 { }, // no samplers
1776 kConicalGradient4Name,
1777 GenerateDefaultExpression,
1778 GenerateDefaultPreamble,
1780 };
1781 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kConicalGradientShader8] = {
1782 "ConicalGradient8",
1783 SkSpan(kConicalGradientUniforms8),
1785 { }, // no samplers
1786 kConicalGradient8Name,
1787 GenerateDefaultExpression,
1788 GenerateDefaultPreamble,
1790 };
1792 "ConicalGradientTexture",
1793 SkSpan(kConicalGradientUniformsTexture),
1795 SkSpan(kTextureGradientTexturesAndSamplers),
1796 kConicalGradientTextureName,
1797 GenerateDefaultExpression,
1798 GenerateDefaultPreamble,
1800 };
1801 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kLocalMatrixShader] = {
1802 "LocalMatrixShader",
1803 SkSpan(kLocalMatrixShaderUniforms),
1806 { }, // no samplers
1807 kLocalMatrixShaderName,
1808 GenerateDefaultExpression,
1809 GenerateLocalMatrixPreamble,
1810 kNumLocalMatrixShaderChildren
1811 };
1812 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kImageShader] = {
1813 "ImageShader",
1814 SkSpan(kImageShaderUniforms),
1816 SkSpan(kISTexturesAndSamplers),
1817 kImageShaderName,
1818 GenerateDefaultExpression,
1819 GenerateDefaultPreamble,
1821 };
1822 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kCubicImageShader] = {
1823 "CubicImageShader",
1824 SkSpan(kCubicImageShaderUniforms),
1826 SkSpan(kISTexturesAndSamplers),
1827 kCubicImageShaderName,
1828 GenerateDefaultExpression,
1829 GenerateDefaultPreamble,
1831 };
1832 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kHWImageShader] = {
1833 "HardwareImageShader",
1834 SkSpan(kHWImageShaderUniforms),
1836 SkSpan(kISTexturesAndSamplers),
1837 kHWImageShaderName,
1838 GenerateDefaultExpression,
1839 GenerateDefaultPreamble,
1841 };
1842 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kYUVImageShader] = {
1843 "YUVImageShader",
1844 SkSpan(kYUVImageShaderUniforms),
1846 SkSpan(kYUVISTexturesAndSamplers),
1847 kYUVImageShaderName,
1848 GenerateDefaultExpression,
1849 GenerateDefaultPreamble,
1851 };
1852 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kCubicYUVImageShader] = {
1853 "CubicYUVImageShader",
1854 SkSpan(kCubicYUVImageShaderUniforms),
1856 SkSpan(kYUVISTexturesAndSamplers),
1857 kCubicYUVImageShaderName,
1858 GenerateDefaultExpression,
1859 GenerateDefaultPreamble,
1861 };
1862 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kCoordClampShader] = {
1863 "CoordClampShader",
1864 SkSpan(kCoordClampShaderUniforms),
1866 { }, // no samplers
1867 kCoordClampShaderName,
1868 GenerateDefaultExpression,
1869 GenerateCoordClampPreamble,
1870 kNumCoordClampShaderChildren
1871 };
1872 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kDitherShader] = {
1873 "DitherShader",
1874 SkSpan(kDitherShaderUniforms),
1876 SkSpan(kDitherTexturesAndSamplers),
1877 kDitherShaderName,
1878 GenerateDefaultExpression,
1879 GenerateDefaultPreamble,
1881 };
1882 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kPerlinNoiseShader] = {
1883 "PerlinNoiseShader",
1884 SkSpan(kPerlinNoiseShaderUniforms),
1886 SkSpan(kPerlinNoiseShaderTexturesAndSamplers),
1887 kPerlinNoiseShaderName,
1888 GenerateDefaultExpression,
1889 GenerateDefaultPreamble,
1891 };
1892 // SkColorFilter snippets
1893 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kMatrixColorFilter] = {
1894 "MatrixColorFilter",
1895 SkSpan(kMatrixColorFilterUniforms),
1897 { }, // no samplers
1898 kMatrixColorFilterName,
1899 GenerateDefaultExpression,
1900 GenerateDefaultPreamble,
1902 };
1903 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kTableColorFilter] = {
1904 "TableColorFilter",
1905 { }, // no uniforms
1907 SkSpan(kTableColorFilterTexturesAndSamplers),
1908 kTableColorFilterName,
1909 GenerateDefaultExpression,
1910 GenerateDefaultPreamble,
1912 };
1913 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kGaussianColorFilter] = {
1914 "GaussianColorFilter",
1915 { }, // no uniforms
1917 { }, // no samplers
1918 kGaussianColorFilterName,
1919 GenerateDefaultExpression,
1920 GenerateDefaultPreamble,
1922 };
1923 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kColorSpaceXformColorFilter] = {
1924 "ColorSpaceTransform",
1925 SkSpan(kColorSpaceTransformUniforms),
1927 { }, // no samplers
1928 kColorSpaceTransformName,
1929 GenerateDefaultExpression,
1930 GenerateDefaultPreamble,
1932 };
1933
1934 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kBlendShader] = {
1935 "BlendShader",
1936 { }, // no uniforms
1938 { }, // no samplers
1939 "BlendShader",
1940 GenerateDefaultExpression,
1941 GenerateBlendShaderPreamble,
1942 kNumBlendShaderChildren
1943 };
1944 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kCoeffBlender] = {
1945 "CoeffBlender",
1946 SkSpan(CoeffBlendderUniforms),
1948 { }, // no samplers
1949 kCoeffBlenderName,
1950 GenerateDefaultExpression,
1951 GenerateDefaultPreamble,
1953 };
1954 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kBlendModeBlender] = {
1955 "BlendModeBlender",
1956 SkSpan(kBlendModeBlenderUniforms),
1958 { }, // no samplers
1959 kBlendModeBlenderName,
1960 GenerateDefaultExpression,
1961 GenerateDefaultPreamble,
1963 };
1964
1965 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kPrimitiveColor] = {
1966 "PrimitiveColor",
1967 { }, // no uniforms
1969 { }, // no samplers
1970 "primitive color", // no static sksl
1971 GeneratePrimitiveColorExpression,
1972 GenerateDefaultPreamble,
1974 };
1975
1976 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kDstReadSample] = {
1977 "DstReadSample",
1978 SkSpan(kDstReadSampleUniforms),
1980 SkSpan(kDstReadSampleTexturesAndSamplers),
1981 "InitSurfaceColor",
1982 GenerateDstReadSampleExpression,
1983 GenerateDstReadSamplePreamble,
1985 };
1986 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kDstReadFetch] = {
1987 "DstReadFetch",
1988 { }, // no uniforms
1990 { }, // no samplers
1991 "InitSurfaceColor",
1992 GenerateDstReadFetchExpression,
1993 GenerateDstReadFetchPreamble,
1995 };
1996
1997 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kClipShader] = {
1998 "ClipShader",
1999 { }, // no uniforms
2001 { }, // no samplers
2002 "clip shader", // no static sksl
2003 GenerateClipShaderExpression,
2004 GenerateClipShaderPreamble,
2005 kNumClipShaderChildren
2006 };
2007
2008 fBuiltInCodeSnippets[(int) BuiltInCodeSnippetID::kCompose] = {
2009 "Compose",
2010 { }, // no uniforms
2012 { }, // no samplers
2013 kComposeName,
2014 GenerateDefaultExpression,
2015 GenerateNestedChildrenPreamble,
2016 kNumComposeChildren
2017 };
2018
2019 // Fixed-function blend mode snippets are all the same, their functionality is entirely defined
2020 // by their unique code snippet IDs.
2021 for (int i = 0; i <= (int) SkBlendMode::kLastCoeffMode; ++i) {
2022 int ffBlendModeID = kFixedFunctionBlendModeIDOffset + i;
2023 fBuiltInCodeSnippets[ffBlendModeID] = {
2024 SkBlendMode_Name(static_cast<SkBlendMode>(i)),
2025 { }, // no uniforms
2028 { }, // no samplers
2029 skgpu::BlendFuncName(static_cast<SkBlendMode>(i)),
2030 GenerateDefaultExpression,
2031 GenerateDefaultPreamble,
2033 };
2034 }
2035}
SK_API const char * SkBlendMode_Name(SkBlendMode blendMode)
SkBlendMode
Definition SkBlendMode.h:38
@ kLastCoeffMode
last porter duff blend mode
Type::kYUV Type::kRGBA() int(0.7 *637)
static constexpr PaintParamsKey Invalid()
static constexpr int kFixedFunctionBlendModeIDOffset
static constexpr int kNoChildren
const char * BlendFuncName(SkBlendMode mode)
Definition Blend.cpp:18

Member Function Documentation

◆ findOrCreate()

UniquePaintParamsID skgpu::graphite::ShaderCodeDictionary::findOrCreate ( PaintParamsKeyBuilder builder)

Definition at line 480 of file ShaderCodeDictionary.cpp.

480 {
481 AutoLockBuilderAsKey keyView{builder};
482 if (!keyView->isValid()) {
484 }
485
486 SkAutoSpinlock lock{fSpinLock};
487
488 UniquePaintParamsID* existingEntry = fPaintKeyToID.find(*keyView);
489 if (existingEntry) {
490 SkASSERT(fIDToPaintKey[(*existingEntry).asUInt()] == *keyView);
491 return *existingEntry;
492 }
493
494 // Detach from the builder and copy into the arena
495 PaintParamsKey key = keyView->clone(&fArena);
496 UniquePaintParamsID newID{SkTo<uint32_t>(fIDToPaintKey.size())};
497
498 fPaintKeyToID.set(key, newID);
499 fIDToPaintKey.push_back(key);
500 return newID;
501}
#define SkASSERT(cond)
Definition SkAssert.h:116
static UniquePaintParamsID InvalidID()

◆ findOrCreateRuntimeEffectSnippet()

int skgpu::graphite::ShaderCodeDictionary::findOrCreateRuntimeEffectSnippet ( const SkRuntimeEffect effect)

Definition at line 1563 of file ShaderCodeDictionary.cpp.

1563 {
1565 if (effect->allowShader()) {
1567 }
1568 if (effect->allowBlender()) {
1570 }
1571
1572 SkAutoSpinlock lock{fSpinLock};
1573
1574 if (int stableKey = SkRuntimeEffectPriv::StableKey(*effect)) {
1577
1578 int index = stableKey - kSkiaKnownRuntimeEffectsStart;
1579
1580 if (!fKnownRuntimeEffectCodeSnippets[index].fExpressionGenerator) {
1581 const char* name = get_known_rte_name(static_cast<StableKey>(stableKey));
1582 fKnownRuntimeEffectCodeSnippets[index] = ShaderSnippet(
1583 name,
1584 this->convertUniforms(effect),
1585 snippetFlags,
1586 /* texturesAndSamplers= */ {},
1587 name,
1588 GenerateRuntimeShaderExpression,
1589 GenerateRuntimeShaderPreamble,
1590 (int)effect->children().size());
1591 }
1592
1593 return stableKey;
1594 }
1595
1596 // Use the combination of {SkSL program hash, uniform size} as our key.
1597 // In the unfortunate event of a hash collision, at least we'll have the right amount of
1598 // uniform data available.
1599 RuntimeEffectKey key;
1600 key.fHash = SkRuntimeEffectPriv::Hash(*effect);
1601 key.fUniformSize = effect->uniformSize();
1602
1603 int32_t* existingCodeSnippetID = fRuntimeEffectMap.find(key);
1604 if (existingCodeSnippetID) {
1605 return *existingCodeSnippetID;
1606 }
1607
1608 // TODO: the memory for user-defined entries could go in the dictionary's arena but that
1609 // would have to be a thread safe allocation since the arena also stores entries for
1610 // 'fHash' and 'fEntryVector'
1611 fUserDefinedCodeSnippets.push_back(
1612 std::make_unique<ShaderSnippet>("RuntimeEffect",
1613 this->convertUniforms(effect),
1614 snippetFlags,
1615 /* texturesAndSamplers= */SkSpan<const TextureAndSampler>(),
1617 GenerateRuntimeShaderExpression,
1618 GenerateRuntimeShaderPreamble,
1619 (int)effect->children().size()));
1620
1621 int newCodeSnippetID = kUnknownRuntimeEffectIDStart + fUserDefinedCodeSnippets.size() - 1;
1622
1623 fRuntimeEffectMap.set(key, newCodeSnippetID);
1624 return newCodeSnippetID;
1625}
static uint32_t StableKey(const SkRuntimeEffect &effect)
static uint32_t Hash(const SkRuntimeEffect &effect)
size_t uniformSize() const
SkSpan< const Child > children() const
bool allowBlender() const
bool allowShader() const
const char * name
Definition fuchsia.cc:50
static constexpr int kUnknownRuntimeEffectIDStart
static constexpr int kSkiaKnownRuntimeEffectsStart
static constexpr char kRuntimeShaderName[]

◆ getEntry() [1/2]

const ShaderSnippet * skgpu::graphite::ShaderCodeDictionary::getEntry ( BuiltInCodeSnippetID  codeSnippetID) const
inline

Definition at line 248 of file ShaderCodeDictionary.h.

248 {
249 return this->getEntry(SkTo<int>(codeSnippetID));
250 }
const ShaderSnippet * getEntry(int codeSnippetID) const SK_EXCLUDES(fSpinLock)

◆ getEntry() [2/2]

const ShaderSnippet * skgpu::graphite::ShaderCodeDictionary::getEntry ( int  codeSnippetID) const

Definition at line 517 of file ShaderCodeDictionary.cpp.

517 {
518 if (codeSnippetID < 0) {
519 return nullptr;
520 }
521
522 if (codeSnippetID < kBuiltInCodeSnippetIDCount) {
523 return &fBuiltInCodeSnippets[codeSnippetID];
524 }
525
526 SkAutoSpinlock lock{fSpinLock};
527
528 if (codeSnippetID >= kSkiaKnownRuntimeEffectsStart &&
530 int knownRTECodeSnippetID = codeSnippetID - kSkiaKnownRuntimeEffectsStart;
531
532 // TODO(b/238759147): if the snippet hasn't been initialized, get the SkRuntimeEffect and
533 // initialize it here
534 SkASSERT(fKnownRuntimeEffectCodeSnippets[knownRTECodeSnippetID].fPreambleGenerator);
535 return &fKnownRuntimeEffectCodeSnippets[knownRTECodeSnippetID];
536 }
537
538 // TODO(b/238759147): handle Android and chrome known runtime effects
539
540 if (codeSnippetID >= kUnknownRuntimeEffectIDStart) {
541 int userDefinedCodeSnippetID = codeSnippetID - kUnknownRuntimeEffectIDStart;
542 if (userDefinedCodeSnippetID < SkTo<int>(fUserDefinedCodeSnippets.size())) {
543 return fUserDefinedCodeSnippets[userDefinedCodeSnippetID].get();
544 }
545 }
546
547 return nullptr;
548}
static constexpr int kBuiltInCodeSnippetIDCount

◆ getSnippetRequirementFlags()

SkEnumBitMask< SnippetRequirementFlags > skgpu::graphite::ShaderCodeDictionary::getSnippetRequirementFlags ( BuiltInCodeSnippetID  id) const
inline

Definition at line 237 of file ShaderCodeDictionary.h.

238 {
239 return fBuiltInCodeSnippets[(int) id].fSnippetRequirementFlags;
240 }

◆ getUniforms()

SkSpan< const Uniform > skgpu::graphite::ShaderCodeDictionary::getUniforms ( BuiltInCodeSnippetID  id) const

Definition at line 513 of file ShaderCodeDictionary.cpp.

513 {
514 return fBuiltInCodeSnippets[(int) id].fUniforms;
515}

◆ idToString()

SkString skgpu::graphite::ShaderCodeDictionary::idToString ( UniquePaintParamsID  id) const
inline

Definition at line 232 of file ShaderCodeDictionary.h.

232 {
233 return this->lookup(id).toString(this);
234 }
SkString toString(const ShaderCodeDictionary *dict) const
PaintParamsKey lookup(UniquePaintParamsID) const SK_EXCLUDES(fSpinLock)

◆ lookup()

PaintParamsKey skgpu::graphite::ShaderCodeDictionary::lookup ( UniquePaintParamsID  codeID) const

Definition at line 503 of file ShaderCodeDictionary.cpp.

503 {
504 if (!codeID.isValid()) {
506 }
507
508 SkAutoSpinlock lock{fSpinLock};
509 SkASSERT(codeID.asUInt() < SkTo<uint32_t>(fIDToPaintKey.size()));
510 return fIDToPaintKey[codeID.asUInt()];
511}

The documentation for this class was generated from the following files: