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

#include <SDFTextRenderStep.h>

Inheritance diagram for skgpu::graphite::SDFTextRenderStep:
skgpu::graphite::RenderStep

Public Member Functions

 SDFTextRenderStep (bool isLCD)
 
 ~SDFTextRenderStep () override
 
std::string vertexSkSL () const override
 
std::string texturesAndSamplersSkSL (const ResourceBindingRequirements &, int *nextBindingIndex) const override
 
const char * fragmentCoverageSkSL () const override
 
void writeVertices (DrawWriter *, const DrawParams &, skvx::ushort2 ssboIndices) const override
 
void writeUniformsAndTextures (const DrawParams &, PipelineDataGatherer *) const override
 
- Public Member Functions inherited from skgpu::graphite::RenderStep
virtual ~RenderStep ()=default
 
virtual const char * fragmentColorSkSL () const
 
uint32_t uniqueID () const
 
const char * name () const
 
bool requiresMSAA () const
 
bool performsShading () const
 
bool hasTextures () const
 
bool emitsPrimitiveColor () const
 
bool outsetBoundsForAA () const
 
Coverage coverage () const
 
PrimitiveType primitiveType () const
 
size_t vertexStride () const
 
size_t instanceStride () const
 
size_t numUniforms () const
 
size_t numVertexAttributes () const
 
size_t numInstanceAttributes () const
 
SkSpan< const Uniformuniforms () const
 
SkSpan< const AttributevertexAttributes () const
 
SkSpan< const AttributeinstanceAttributes () const
 
SkSpan< const Varyingvaryings () const
 
const DepthStencilSettingsdepthStencilSettings () const
 
SkEnumBitMask< DepthStencilFlagsdepthStencilFlags () const
 

Additional Inherited Members

- Static Public Member Functions inherited from skgpu::graphite::RenderStep
static const char * ssboIndicesAttribute ()
 
static const char * ssboIndicesVarying ()
 
- Protected Types inherited from skgpu::graphite::RenderStep
enum class  Flags : unsigned {
  kNone = 0b0000000 , kRequiresMSAA = 0b0000001 , kPerformsShading = 0b0000010 , kHasTextures = 0b0000100 ,
  kEmitsCoverage = 0b0001000 , kLCDCoverage = 0b0010000 , kEmitsPrimitiveColor = 0b0100000 , kOutsetBoundsForAA = 0b1000000
}
 
- Protected Member Functions inherited from skgpu::graphite::RenderStep
 RenderStep (std::string_view className, std::string_view variantName, SkEnumBitMask< Flags > flags, std::initializer_list< Uniform > uniforms, PrimitiveType primitiveType, DepthStencilSettings depthStencilSettings, SkSpan< const Attribute > vertexAttrs, SkSpan< const Attribute > instanceAttrs, SkSpan< const Varying > varyings={})
 

Detailed Description

Definition at line 17 of file SDFTextRenderStep.h.

Constructor & Destructor Documentation

◆ SDFTextRenderStep()

skgpu::graphite::SDFTextRenderStep::SDFTextRenderStep ( bool  isLCD)

Definition at line 33 of file SDFTextRenderStep.cpp.

34 : RenderStep("SDFTextRenderStep",
35 isLCD ? "565" : "A8",
39 /*uniforms=*/{{"subRunDeviceMatrix", SkSLType::kFloat4x4},
40 {"deviceToLocal", SkSLType::kFloat4x4},
41 {"atlasSizeInv", SkSLType::kFloat2},
42 {"distAdjust", SkSLType::kFloat}},
45 /*vertexAttrs=*/ {},
46 /*instanceAttrs=*/
51 {"strikeToSourceScale", VertexAttribType::kFloat, SkSLType::kFloat},
54 /*varyings=*/
55 {{"unormTexCoords", SkSLType::kFloat2},
56 {"textureCoords", SkSLType::kFloat2},
57 {"texIndex", SkSLType::kFloat}}) {
58 // TODO: store if it's A8 and adjust shader
59}
static bool isLCD(const SkScalerContextRec &rec)
RenderStep(std::string_view className, std::string_view variantName, SkEnumBitMask< Flags > flags, std::initializer_list< Uniform > uniforms, PrimitiveType primitiveType, DepthStencilSettings depthStencilSettings, SkSpan< const Attribute > vertexAttrs, SkSpan< const Attribute > instanceAttrs, SkSpan< const Varying > varyings={})
Definition Renderer.cpp:19
static constexpr DepthStencilSettings kDirectDepthGEqualPass

◆ ~SDFTextRenderStep()

skgpu::graphite::SDFTextRenderStep::~SDFTextRenderStep ( )
override

Definition at line 61 of file SDFTextRenderStep.cpp.

61{}

Member Function Documentation

◆ fragmentCoverageSkSL()

const char * skgpu::graphite::SDFTextRenderStep::fragmentCoverageSkSL ( ) const
overridevirtual

Reimplemented from skgpu::graphite::RenderStep.

Definition at line 93 of file SDFTextRenderStep.cpp.

93 {
94 // The returned SkSL must write its coverage into a 'half4 outputCoverage' variable (defined in
95 // the calling code) with the actual coverage splatted out into all four channels.
96
97 // TODO: To minimize the number of shaders generated this is the full affine shader.
98 // For best performance it may be worth creating the uniform scale shader as well,
99 // as that's the most common case.
100 // TODO: Need to add 565 support.
101 // TODO: Need aliased and possibly sRGB support.
102 static_assert(kNumSDFAtlasTextures == 4);
103 return "outputCoverage = sdf_text_coverage_fn(sample_indexed_atlas(textureCoords, "
104 "int(texIndex), "
105 "sdf_atlas_0, "
106 "sdf_atlas_1, "
107 "sdf_atlas_2, "
108 "sdf_atlas_3).r, "
109 "half(distAdjust), "
110 "unormTexCoords);";
111}

◆ texturesAndSamplersSkSL()

std::string skgpu::graphite::SDFTextRenderStep::texturesAndSamplersSkSL ( const ResourceBindingRequirements bindingReqs,
int nextBindingIndex 
) const
overridevirtual

Reimplemented from skgpu::graphite::RenderStep.

Definition at line 81 of file SDFTextRenderStep.cpp.

82 {
83 std::string result;
84
85 for (unsigned int i = 0; i < kNumSDFAtlasTextures; ++i) {
86 result += EmitSamplerLayout(bindingReqs, nextBindingIndex);
87 SkSL::String::appendf(&result, " sampler2D sdf_atlas_%u;\n", i);
88 }
89
90 return result;
91}
GAsyncResult * result
std::string void appendf(std::string *str, const char *fmt,...) SK_PRINTF_LIKE(2
std::string EmitSamplerLayout(const ResourceBindingRequirements &bindingReqs, int *binding)

◆ vertexSkSL()

std::string skgpu::graphite::SDFTextRenderStep::vertexSkSL ( ) const
overridevirtual

Implements skgpu::graphite::RenderStep.

Definition at line 63 of file SDFTextRenderStep.cpp.

63 {
64 // Returns the body of a vertex function, which must define a float4 devPosition variable and
65 // must write to an already-defined float2 stepLocalCoords variable.
66 return "texIndex = half(indexAndFlags.x);"
67 "float4 devPosition = text_vertex_fn(float2(sk_VertexID >> 1, sk_VertexID & 1), "
68 "subRunDeviceMatrix, "
69 "deviceToLocal, "
70 "atlasSizeInv, "
71 "float2(size), "
72 "float2(uvPos), "
73 "xyPos, "
74 "strikeToSourceScale, "
75 "depth, "
76 "textureCoords, "
77 "unormTexCoords, "
78 "stepLocalCoords);";
79}

◆ writeUniformsAndTextures()

void skgpu::graphite::SDFTextRenderStep::writeUniformsAndTextures ( const DrawParams params,
PipelineDataGatherer gatherer 
) const
overridevirtual

Implements skgpu::graphite::RenderStep.

Definition at line 126 of file SDFTextRenderStep.cpp.

127 {
128 SkDEBUGCODE(UniformExpectationsValidator uev(gatherer, this->uniforms());)
129
130 const SubRunData& subRunData = params.geometry().subRunData();
131 unsigned int numProxies;
132 Recorder* recorder = subRunData.recorder();
133 const sk_sp<TextureProxy>* proxies =
135 subRunData.subRun()->maskFormat(), &numProxies);
136 SkASSERT(proxies && numProxies > 0);
137
138 // write uniforms
139 gatherer->write(params.transform().matrix()); // subRunDeviceMatrix
140 gatherer->write(subRunData.deviceToLocal());
141 SkV2 atlasDimensionsInverse = {1.f/proxies[0]->dimensions().width(),
142 1.f/proxies[0]->dimensions().height()};
143 gatherer->write(atlasDimensionsInverse);
144
145 // TODO: get this from DistanceFieldAdjustTable and luminance color (set in SubRunData?)
146 float gammaCorrection = 0.f;
147 gatherer->write(gammaCorrection);
148
149 // write textures and samplers
150 const SkSamplingOptions kSamplingOptions(SkFilterMode::kLinear);
151 constexpr SkTileMode kTileModes[2] = { SkTileMode::kClamp, SkTileMode::kClamp };
152 for (unsigned int i = 0; i < numProxies; ++i) {
153 gatherer->add(kSamplingOptions, kTileModes, proxies[i]);
154 }
155 // If the atlas has less than 4 active proxies we still need to set up samplers for the shader.
156 for (unsigned int i = numProxies; i < kNumSDFAtlasTextures; ++i) {
157 gatherer->add(kSamplingOptions, kTileModes, proxies[0]);
158 }
159}
#define SkASSERT(cond)
Definition SkAssert.h:116
#define SkDEBUGCODE(...)
Definition SkDebug.h:23
SkTileMode
Definition SkTileMode.h:13
TextAtlasManager * textAtlasManager() const
AtlasProvider * atlasProvider()
SkSpan< const Uniform > uniforms() const
Definition Renderer.h:143
const sk_sp< TextureProxy > * getProxies(MaskFormat format, unsigned int *numActiveProxies)
const EmbeddedViewParams * params
Definition SkM44.h:19

◆ writeVertices()

void skgpu::graphite::SDFTextRenderStep::writeVertices ( DrawWriter dw,
const DrawParams params,
skvx::ushort2  ssboIndices 
) const
overridevirtual

Implements skgpu::graphite::RenderStep.

Definition at line 113 of file SDFTextRenderStep.cpp.

115 {
116 const SubRunData& subRunData = params.geometry().subRunData();
117 subRunData.subRun()->vertexFiller().fillInstanceData(dw,
118 subRunData.startGlyphIndex(),
119 subRunData.glyphCount(),
120 subRunData.subRun()->instanceFlags(),
121 ssboIndices,
122 subRunData.subRun()->glyphs(),
123 params.order().depthAsFloat());
124}

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