68 const std::optional<SkPMColor4f>&
color,
69 bool needsLocalCoords,
71 SkSpan<std::unique_ptr<GrFragmentProcessor>> children) {
72 return arena->
make([&](
void* ptr) {
73 return new (ptr) MeshGP(std::move(spec),
74 std::move(colorSpaceXform),
83 const char*
name()
const override {
return "MeshGP"; }
87 b->add32(ProgramImpl::ComputeMatrixKey(caps,
fViewMatrix),
"view matrix key");
89 SkMeshSpecificationPriv::ColorType::kNone) {
92 for (
const std::unique_ptr<GrFragmentProcessor>&
fp : fChildren) {
94 fp->addToKey(caps,
b);
96 b->addBool(
false,
"null effect");
102 return std::make_unique<Impl>();
111 const auto& mgp = geomProc.
cast<MeshGP>();
112 SetTransform(pdman, shaderCaps, fViewMatrixUniform, mgp.fViewMatrix, &
fViewMatrix);
114 fColorSpaceHelper.setData(pdman, mgp.fColorSpaceXform.get());
116 if (fColorUniform.isValid()) {
117 pdman.
set4fv(fColorUniform, 1, mgp.fColor.vec());
122 SkSpan(fSpecUniformHandles),
123 mgp.fUniforms->
data());
126 for (
size_t index = 0; index < mgp.fChildren.size(); ++index) {
143 MeshCallbacks(Impl*
self,
147 const char* mainName,
152 , fUniformHandler(uniformHandler)
153 , fMainName(mainName)
162 return std::string(var->
name());
166 bool isArray =
false;
167 if (
type->isArray()) {
177 auto it = std::find_if(uniforms.
begin(),
180 return uniform.name == std::string_view(name.c_str(), name.size());
185 UniformHandle* handle = &fSelf->fSpecUniformHandles[handleIdx];
186 if (handle->isValid()) {
187 const GrShaderVar& uniformVar = fUniformHandler->getUniformVariable(*handle);
193 if (uniform.
flags & SkMeshSpecification::Uniform::Flags::kVertex_Flag) {
196 if (uniform.
flags & SkMeshSpecification::Uniform::Flags::kFragment_Flag) {
201 const char* mangledName =
nullptr;
202 *handle = fUniformHandler->addUniformArray(&fGP,
208 return std::string(mangledName);
211 std::string getMangledName(
const char*
name)
override {
212 return std::string(fBuilder->getMangledFunctionName(
name).c_str());
215 std::string getMainName()
override {
return fMainName; }
217 void defineFunction(
const char* decl,
const char* body,
bool isMain)
override {
218 fBuilder->emitFunction(decl, body);
221 void declareFunction(
const char* decl)
override {
222 fBuilder->emitFunctionPrototype(decl);
225 void defineStruct(
const char* definition)
override {
226 fBuilder->definitionAppend(definition);
229 void declareGlobal(
const char* declaration)
override {
230 fBuilder->definitionAppend(declaration);
233 std::string sampleShader(
int index, std::string coords)
override {
241 return fBuilder->getProgramBuilder()->invokeFP(*
fp,
248 std::string sampleColorFilter(
int index, std::string
color)
override {
256 return fBuilder->getProgramBuilder()->invokeFP(*
fp,
263 std::string sampleBlender(
int index, std::string
src, std::string
dst)
override {
271 return fBuilder->getProgramBuilder()->invokeFP(*
fp,
278 std::string toLinearSrgb(std::string
color)
override {
279 SK_ABORT(
"Color transform intrinsics not allowed.");
282 std::string fromLinearSrgb(std::string
Color)
override {
283 SK_ABORT(
"Color transform intrinsics not allowed.");
290 const char* fMainName;
294 void onEmitCode(EmitArgs&
args, GrGPArgs* gpArgs)
override {
295 const MeshGP& mgp =
args.fGeomProc.cast<MeshGP>();
303 fChildImpls.reserve_exact(children.
size());
304 for (
const std::unique_ptr<GrFragmentProcessor>&
fp : children) {
305 fChildImpls.push_back(
fp ?
fp->makeProgramImpl() :
nullptr);
308 SkASSERT(fSpecUniformHandles.empty());
309 fSpecUniformHandles.reserve_exact(mgp.fSpec->uniforms().size());
310 fSpecUniformHandles.push_back_n(mgp.fSpec->uniforms().size());
312 SkMeshSpecificationPriv::ColorType meshColorType =
314 int passthroughLCVaryingIndex =
321 bool needUserFS = (passthroughLCVaryingIndex < 0 && mgp.fNeedsLocalCoords) ||
322 meshColorType != SkMeshSpecificationPriv::ColorType::kNone;
324 if (!needUserFS && !mgp.fNeedsLocalCoords) {
326 passthroughLCVaryingIndex = -1;
338 SkString userVertName = vertBuilder->getMangledFunctionName(
"custom_mesh_vs");
340 MeshCallbacks vsCallbacks(
this,
344 userVertName.
c_str(),
353 vertBuilder->codeAppendf(
"%s attributes;",
354 vsCallbacks.getMangledName(
"Attributes").c_str());
357 SkASSERT(mgp.vertexAttributes().count() == (
int)mgp.fSpec->attributes().size());
358 for (
auto attr : mgp.vertexAttributes()) {
359 vertBuilder->codeAppendf(
"attributes.%s = %s;",
360 mgp.fSpec->attributes()[
i++].name.c_str(),
366 vertBuilder->codeAppendf(
"%s varyings = %s(attributes);",
367 vsCallbacks.getMangledName(
"Varyings").c_str(),
368 userVertName.
c_str());
370 if (passthroughLCVaryingIndex >= 0 &&
372 vertBuilder->codeAppendf(
"float2 local = varyings.%s\n;",
373 specVaryings[passthroughLCVaryingIndex].
name.c_str());
386 for (
size_t i = 0;
i < specVaryings.
size(); ++
i) {
387 const auto& v = specVaryings[
i];
393 varyingHandler->
addVarying(v.name.c_str(), &realVaryings.
back().varying);
394 vertBuilder->codeAppendf(
"%s = varyings.%s;",
395 realVaryings.
back().varying.vsOut(),
397 if (passthroughLCVaryingIndex ==
SkToInt(
i)) {
399 gpArgs->fLocalCoordVar = realVaryings.
back().varying.vsOutVar();
405 vertBuilder->codeAppend(
"float2 pos = varyings.position;");
407 WriteOutputPosition(vertBuilder,
413 &fViewMatrixUniform);
417 int samplerIndex = 0;
418 for (
size_t fpIdx = 0; fpIdx < mgp.fChildren.size(); ++fpIdx) {
427 if (
fp.asTextureEffect()) {
428 static_cast<GrTextureEffect::Impl&>(impl).setSamplerHandle(
429 args.fTexSamplers[samplerIndex++]);
435 args.fFragBuilder->getProgramBuilder()->advanceStage();
436 args.fFragBuilder->getProgramBuilder()->writeFPFunction(*
fp, *impl);
442 fragBuilder->
codeAppendf(
"const half4 %s = half4(1);",
args.fOutputCoverage);
446 MeshCallbacks fsCallbacks(
this,
450 userFragName.
c_str(),
457 const char* uniformColorName =
nullptr;
459 fColorUniform = uniformHandler->
addUniform(
nullptr,
465 if (meshColorType == SkMeshSpecificationPriv::ColorType::kNone) {
467 fragBuilder->
codeAppendf(
"%s = %s;",
args.fOutputColor, uniformColorName);
473 fsCallbacks.getMangledName(
"Varyings").c_str());
474 for (
const auto&
rv : realVaryings) {
475 const auto& v = specVaryings[
rv.specIndex];
483 if (gpArgs->fLocalCoordVar.getType() ==
SkSLType::kVoid && mgp.fNeedsLocalCoords) {
486 local =
"float2 local = ";
488 if (meshColorType == SkMeshSpecificationPriv::ColorType::kNone) {
491 userFragName.
c_str());
493 fColorSpaceHelper.emitCode(uniformHandler,
494 mgp.fColorSpaceXform.get(),
496 if (meshColorType == SkMeshSpecificationPriv::ColorType::kFloat4) {
499 SkASSERT(meshColorType == SkMeshSpecificationPriv::ColorType::kHalf4);
505 userFragName.
c_str());
509 const char*
color = uniformColorName ? uniformColorName :
"half4(color)";
523 UniformHandle fViewMatrixUniform;
524 UniformHandle fColorUniform;
533 const std::optional<SkPMColor4f>&
color,
534 bool needsLocalCoords,
536 SkSpan<std::unique_ptr<GrFragmentProcessor>> children)
538 , fSpec(
std::move(spec))
539 , fUniforms(
std::move(uniforms))
540 , fChildren(children)
542 , fColorSpaceXform(
std::move(colorSpaceXform))
543 , fNeedsLocalCoords(needsLocalCoords) {
545 for (
const auto& srcAttr : fSpec->attributes()) {
546 fAttributes.emplace_back(srcAttr.name.c_str(),
547 attrib_type(srcAttr.type),
551 this->setVertexAttributes(fAttributes.data(), fAttributes.size(), fSpec->stride());
555 for (
const std::unique_ptr<GrFragmentProcessor>&
fp : fChildren) {
564 this->setTextureSamplerCnt(fTextureSamplers.size());
567 const TextureSampler& onTextureSampler(
int index)
const override {
568 return fTextureSamplers[index];
575 std::vector<Attribute> fAttributes;
579 bool fNeedsLocalCoords;
595 TArray<std::unique_ptr<GrFragmentProcessor>> children,
608 const char*
name()
const override {
return "MeshOp"; }
611 for (
const std::unique_ptr<GrFragmentProcessor>&
fp : fChildren) {
635 bool usesMSAASurface,
643#if defined(GR_TEST_UTILS)
644 SkString onDumpInfo()
const override;
661 Mesh(
const Mesh&) =
delete;
664 Mesh& operator=(
const Mesh&) =
delete;
665 Mesh& operator=(Mesh&&) =
delete;
669 bool isFromVertices()
const {
return SkToBool(fVertices); }
673 return fVertices.get();
676 std::tuple<sk_sp<const GrGpuBuffer>,
size_t> gpuVB()
const {
677 if (this->isFromVertices()) {
681 if (!fMeshData.vb->isGaneshBacked()) {
687 return {buf->asGpuBuffer(), fMeshData.voffset};
692 std::tuple<sk_sp<const GrGpuBuffer>,
size_t> gpuIB()
const {
693 if (this->isFromVertices() || !fMeshData.ib) {
696 if (!fMeshData.ib->isGaneshBacked()) {
702 return {buf->asGpuBuffer(), fMeshData.ioffset};
711 int vertexCount()
const {
712 return this->isFromVertices() ? fVertices->priv().vertexCount() : fMeshData.vcount;
715 const uint16_t* indices()
const {
716 if (this->isFromVertices()) {
717 return fVertices->priv().indices();
722 auto data = fMeshData.ib->peek();
726 return SkTAddOffset<const uint16_t>(
data, fMeshData.ioffset);
729 int indexCount()
const {
730 return this->isFromVertices() ? fVertices->priv().indexCount() : fMeshData.icount;
765 bool fIgnoreSpecColor =
false;
782 new (&fMeshData) MeshData();
794 if (fMeshData.vb->peek()) {
795 auto data = SkTAddOffset<const void>(fMeshData.vb->peek(), fMeshData.voffset);
798 fMeshData.voffset = 0;
801 if (fMeshData.ib && fMeshData.ib->peek()) {
802 auto data = SkTAddOffset<const void>(fMeshData.ib->peek(), fMeshData.ioffset);
803 size_t size = fMeshData.icount *
sizeof(uint16_t);
805 fMeshData.ioffset = 0;
814MeshOp::Mesh::Mesh(Mesh&& that) {
815 fVertices = std::move(that.fVertices);
819 new (&that.fMeshData) MeshData();
821 fMeshData = std::move(that.fMeshData);
825MeshOp::Mesh::~Mesh() {
826 if (!this->isFromVertices()) {
827 fMeshData.~MeshData();
835 if (this->isFromVertices()) {
836 int vertexCount = fVertices->priv().vertexCount();
837 for (
int i = 0;
i < vertexCount; ++
i) {
845 SkASSERT(fVertices->priv().hasColors());
846 writer << fVertices->priv().colors()[
i];
848 if (fVertices->priv().hasTexCoords()) {
849 writer << fVertices->priv().texCoords()[
i];
853 const void*
data = fMeshData.vb->peek();
855 auto vdata = SkTAddOffset<const char>(
data, fMeshData.voffset);
864 TArray<std::unique_ptr<GrFragmentProcessor>> children,
869 , fHelper(processorSet, aaType)
870 , fPrimitiveType(primitive_type(
mesh.
mode()))
871 , fColorSpaceXform(
std::move(colorSpaceXform))
880 fChildren = std::move(children);
882 fVertexCount =
fMeshes.back().vertexCount();
883 fIndexCount =
fMeshes.back().indexCount();
891 std::vector<Attribute> attributes;
892 attributes.reserve(3);
896 std::vector<Varying> varyings;
897 attributes.reserve(2);
899 SkString vs(
"Varyings main(const Attributes a) {\nVaryings v;");
905 vs +=
"v.color = a.color;\n";
907 fs +=
"main(const Varyings v, out float4 color) {\n"
908 "color = float4(v.color.bgr*v.color.a, v.color.a);\n";
911 fs +=
"main(const Varyings v) {\n";
917 vs +=
"v.tex = a.tex;\n";
918 fs +=
"return v.tex;\n";
921 fs +=
"return v.position;\n";
923 vs +=
"v.position = a.pos;\nreturn v;\n}";
931 return spec.release();
942 , fHelper(processorSet, aaType)
943 , fColorSpaceXform(
std::move(colorSpaceXform))
972 if (overridePrimitiveType) {
973 fPrimitiveType = *overridePrimitiveType;
987 IsHairline isHairline = IsHairline::kNo;
989 isHairline = IsHairline::kYes;
991 this->setTransformedBounds(vertices->
bounds(),
fViewMatrix, HasAABloat::kNo, isHairline);
995 fVertexCount =
fMeshes.back().vertexCount();
996 fIndexCount =
fMeshes.back().indexCount();
999#if defined(GR_TEST_UTILS)
1000SkString MeshOp::onDumpInfo()
const {
return {}; }
1004 return fHelper.fixedFunctionFlags();
1012 auto result = fHelper.finalizeProcessors(caps,
1018 fIgnoreSpecColor =
true;
1024 std::optional<SkPMColor4f>
color;
1026 color.emplace(fColor);
1035 fHelper.usesLocalCoords(),
1040void MeshOp::onCreateProgramInfo(
const GrCaps* caps,
1043 bool usesMSAASurface,
1048 fProgramInfo = fHelper.createProgramInfo(caps,
1052 std::move(appliedClip),
1054 this->makeGP(arena),
1056 renderPassXferBarriers,
1061 size_t vertexStride = fSpecification->stride();
1064 std::tie(vertexBuffer, firstVertex) =
fMeshes[0].gpuVB();
1066 if (!vertexBuffer) {
1072 SkDebugf(
"Could not allocate vertices.\n");
1078 m.writeVertices(verts, *fSpecification,
transform);
1082 SkASSERT(firstVertex % fSpecification->stride() == 0);
1083 firstVertex /= fSpecification->stride();
1089 std::tie(indexBuffer, firstIndex) =
fMeshes[0].gpuIB();
1090 if (fIndexCount && !indexBuffer) {
1091 uint16_t* indices =
nullptr;
1092 indices =
target->makeIndexSpace(fIndexCount, &indexBuffer, &firstIndex);
1094 SkDebugf(
"Could not allocate indices.\n");
1098 std::copy_n(
fMeshes[0].indices(),
fMeshes[0].indexCount(), indices);
1099 int voffset =
fMeshes[0].vertexCount();
1100 int ioffset =
fMeshes[0].indexCount();
1102 for (
int i = 0;
i <
fMeshes[
m].indexCount(); ++
i) {
1103 indices[ioffset++] =
fMeshes[
m].indices()[
i] + voffset;
1105 voffset +=
fMeshes[
m].vertexCount();
1109 }
else if (indexBuffer) {
1111 SkASSERT(firstIndex %
sizeof(uint16_t) == 0);
1112 firstIndex /=
sizeof(uint16_t);
1116 fMesh =
target->allocMesh();
1125 std::move(vertexBuffer),
1128 fMesh->
set(std::move(vertexBuffer), fVertexCount, firstVertex);
1133 if (!fProgramInfo) {
1134 this->createProgramInfo(flushState);
1137 if (!fProgramInfo || !fMesh) {
1142 for (
const std::unique_ptr<GrFragmentProcessor>&
fp : fChildren) {
1152 geomProcTextures.
data(),
1158 auto that = t->
cast<MeshOp>();
1159 if (!
fMeshes[0].isFromVertices() || !that->fMeshes[0].isFromVertices()) {
1169 return CombineResult::kCannotCombine;
1172 if (fPrimitiveType != that->fPrimitiveType) {
1173 return CombineResult::kCannotCombine;
1176 if (fVertexCount > INT32_MAX - that->fVertexCount) {
1177 return CombineResult::kCannotCombine;
1180 return CombineResult::kCannotCombine;
1182 if (
SkToBool(fIndexCount) && fVertexCount >
SkToInt(UINT16_MAX) - that->fVertexCount) {
1183 return CombineResult::kCannotCombine;
1188 return CombineResult::kCannotCombine;
1192 SkASSERT(fSpecification->uniforms().empty());
1195 return CombineResult::kCannotCombine;
1198 if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
1199 return CombineResult::kCannotCombine;
1205 if (fHelper.usesLocalCoords() && !
fMeshes[0].vertices()->priv().hasTexCoords()) {
1206 return CombineResult::kCannotCombine;
1211 (that->fViewMatrix.isFinite() && that->fViewMatrix.hasPerspective())) {
1212 return CombineResult::kCannotCombine;
1222 fMeshes.move_back_n(that->fMeshes.size(), that->fMeshes.begin());
1224 fIndexCount += that->fIndexCount;
1225 return CombineResult::kMerged;
1235 TArray<std::unique_ptr<GrFragmentProcessor>> children,
1239 return GrSimpleMeshDrawOpHelper::FactoryHelper<MeshOp>(context,
1242 std::move(children),
1244 std::move(colorSpaceXform),
1255 return GrSimpleMeshDrawOpHelper::FactoryHelper<MeshOp>(context,
1257 std::move(vertices),
1258 overridePrimitiveType,
1260 std::move(colorSpaceXform),
SkAssertResult(font.textToGlyphs("Hello", 5, SkTextEncoding::kUTF8, glyphs, std::size(glyphs))==count)
#define DEFINE_OP_CLASS_ID
std::function< void(GrSurfaceProxy *, skgpu::Mipmapped)> GrVisitProxyFunc
static constexpr bool GrIsPrimTypeLines(GrPrimitiveType type)
@ kFloat2_GrVertexAttribType
@ kUByte4_norm_GrVertexAttribType
@ kFloat3_GrVertexAttribType
@ kFloat_GrVertexAttribType
@ kFloat4_GrVertexAttribType
#define SK_ABORT(message,...)
constexpr SkPMColor4f SK_PMColor4fILLEGAL
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
SkMeshSpecification::Attribute Attribute
SkMeshSpecification::Varying Varying
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
#define INHERITED(method,...)
sk_sp< T > sk_ref_sp(T *obj)
SkSpan(Container &&) -> SkSpan< std::remove_pointer_t< decltype(std::data(std::declval< Container >()))> >
constexpr int SkToInt(S x)
static constexpr bool SkToBool(const T &x)
virtual FixedFunctionFlags fixedFunctionFlags() const
virtual GrProcessorSet::Analysis finalize(const GrCaps &, const GrAppliedClip *, GrClampType)=0
friend class GrSimpleMeshDrawOpHelper
void setData(const GrGLSLProgramDataManager &pdman, const GrFragmentProcessor &processor)
void setRuntimeEffectUniforms(SkSpan< const SkRuntimeEffect::Uniform >, SkSpan< const UniformHandle >, SkSpan< const Specialized >, const void *src) const
virtual void set4fv(UniformHandle, int arrayCount, const float v[]) const =0
void appendColorGamutXform(SkString *out, const char *srcColor, GrGLSLColorSpaceXformHelper *colorXformHelper)
SkString getMangledFunctionName(const char *baseName)
void codeAppendf(const char format[],...) SK_PRINTF_LIKE(2
void emitAttributes(const GrGeometryProcessor &)
void addVarying(const char *name, GrGLSLVarying *varying, Interpolation=Interpolation::kInterpolated)
virtual std::unique_ptr< ProgramImpl > makeProgramImpl(const GrShaderCaps &) const =0
virtual void addToKey(const GrShaderCaps &, skgpu::KeyBuilder *) const =0
virtual GrProgramInfo * programInfo()=0
GrMeshDrawOp(uint32_t classID)
virtual void onCreateProgramInfo(const GrCaps *, SkArenaAlloc *, const GrSurfaceProxyView &writeView, bool usesMSAASurface, GrAppliedClip &&, const GrDstProxyView &, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp)=0
virtual void onPrepareDraws(GrMeshDrawTarget *)=0
void drawMesh(const GrSimpleMesh &mesh)
void bindPipelineAndScissorClip(const GrProgramInfo &programInfo, const SkRect &drawBounds)
void bindTextures(const GrGeometryProcessor &geomProc, const GrSurfaceProxy &singleGeomProcTexture, const GrPipeline &pipeline)
virtual void onExecute(GrOpFlushState *, const SkRect &chainBounds)=0
std::unique_ptr< GrOp > Owner
virtual const char * name() const =0
virtual void visitProxies(const GrVisitProxyFunc &) const
virtual CombineResult onCombineIfPossible(GrOp *, SkArenaAlloc *, const GrCaps &)
bool isConstant(SkPMColor4f *color=nullptr) const
virtual const char * name() const =0
const GrPipeline & pipeline() const
const GrGeometryProcessor & geomProc() const
void visitFPProxies(const GrVisitProxyFunc &func) const
const SkString & getName() const
void visitProxies(const GrVisitProxyFunc &func) const
skgpu::Swizzle swizzle() const
skgpu::Mipmapped mipmapped() const
GrSurfaceProxy * proxy() const
const GrBackendFormat & backendFormat() const
const GrSurfaceProxyView & view() const
GrSamplerState samplerState() const
auto make(Ctor &&ctor) -> decltype(ctor(nullptr))
void mapPoints(SkPoint dst[], const SkPoint src[], int count) const
static const SkMatrix & I()
bool hasPerspective() const
static const SkMatrix & InvalidMatrix()
static sk_sp< Base > Make(const void *data, size_t size)
SkSpan< const Uniform > uniforms() const
static Result Make(SkSpan< const Attribute > attributes, size_t vertexStride, SkSpan< const Varying > varyings, const SkString &vs, const SkString &fs)
SkColorSpace * colorSpace() const
VertexBuffer * vertexBuffer() const
size_t vertexCount() const
size_t vertexOffset() const
IndexBuffer * indexBuffer() const
size_t indexCount() const
sk_sp< const SkData > refUniforms() const
size_t indexOffset() const
SkMeshSpecification * spec() const
sk_sp< SkMeshSpecification > refSpec() const
static sk_sp< const SkData > TransformUniforms(SkSpan< const SkRuntimeEffect::Uniform > uniforms, sk_sp< const SkData > originalData, const SkColorSpaceXformSteps &)
std::string_view name() const
const Type & type() const
bool isEffectChild() const
virtual int columns() const
constexpr T * data() const
constexpr T * begin() const
constexpr T * end() const
constexpr size_t size() const
const char * c_str() const
SkVertices::VertexMode mode() const
bool hasTexCoords() const
const SkRect & bounds() const
@ kTriangleStrip_VertexMode
@ kTriangleFan_VertexMode
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
const uint8_t uint32_t uint32_t GError ** error
void ConvertProgram(const Program &program, const char *sampleCoords, const char *inputColor, const char *destColor, Callbacks *callbacks)
std::string printf(const char *fmt,...) SK_PRINTF_LIKE(1
bool type_to_sksltype(const Context &context, const Type &type, SkSLType *outType)
SK_API sk_sp< SkShader > Color(SkColor)
DEF_SWITCHES_START aot vmservice shared library name
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive mode
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
GrOp::Owner Make(GrRecordingContext *context, GrPaint &&paint, sk_sp< SkVertices > vertices, const GrPrimitiveType *overridePrimitiveType, const SkMatrix &viewMatrix, GrAAType aaType, sk_sp< GrColorSpaceXform > colorSpaceXform)
GrOp::Owner Make(GrRecordingContext *context, GrPaint &&paint, const SkMesh &mesh, TArray< std::unique_ptr< GrFragmentProcessor > > children, const SkMatrix &viewMatrix, GrAAType aaType, sk_sp< GrColorSpaceXform > colorSpaceXform)
static SkColor4f transform(SkColor4f c, SkColorSpace *src, SkColorSpace *dst)
void setIndexed(sk_sp< const GrBuffer > indexBuffer, int indexCount, int baseIndex, uint16_t minIndexValue, uint16_t maxIndexValue, GrPrimitiveRestart, sk_sp< const GrBuffer > vertexBuffer, int baseVertex)
void set(sk_sp< const GrBuffer > vertexBuffer, int vertexCount, int baseVertex)
static int PassthroughLocalCoordsVaryingIndex(const SkMeshSpecification &spec)
static bool HasColors(const SkMeshSpecification &spec)
static SkSpan< const Varying > Varyings(const SkMeshSpecification &spec)
static const SkSL::Program * FS(const SkMeshSpecification &spec)
static bool VaryingIsDead(const SkMeshSpecification &spec, int v)
static int Hash(const SkMeshSpecification &spec)
static const SkSL::Program * VS(const SkMeshSpecification &spec)
static ColorType GetColorType(const SkMeshSpecification &spec)
static SkSLType VaryingTypeAsSLType(Varying::Type type)
static SkSLType AttrTypeAsSLType(Attribute::Type type)
std::shared_ptr< Context > fContext
static ArrayDesc< T > Array(const T *array, int count)
std::shared_ptr< const fml::Mapping > data