36#if !defined(SK_ENABLE_OPTIMIZE_SIZE)
38#ifndef GR_AA_TESSELLATOR_MAX_VERB_COUNT
39#define GR_AA_TESSELLATOR_MAX_VERB_COUNT 10
62 TessInfo
info { numVertices, isLinear, tol };
69 const TessInfo*
info =
static_cast<const TessInfo*
>(data->data());
71 return info->fIsLinear ||
info->fTolerance < 3.0f * tol;
75bool is_newer_better(
SkData* incumbent,
SkData* challenger) {
76 const TessInfo* i =
static_cast<const TessInfo*
>(incumbent->
data());
77 const TessInfo* c =
static_cast<const TessInfo*
>(challenger->
data());
79 if (i->fIsLinear || i->fTolerance <= c->fTolerance) {
90 : fMsg(
key, contextUniqueID,
true) {}
103 : fResourceProvider(resourceProvider)
104 , fCanMapVB(canMapVB) {
108 ~StaticVertexAllocator()
override {
109 SkASSERT(!fLockStride && !fVertices && !fVertexBuffer && !fVertexData);
113 void*
lock(
size_t stride,
int eagerCount)
override {
114 SkASSERT(!fLockStride && !fVertices && !fVertexBuffer && !fVertexData);
117 size_t size = eagerCount * stride;
118 fVertexBuffer = fResourceProvider->createBuffer(size,
122 if (!fVertexBuffer) {
126 fVertices = fVertexBuffer->map();
132 fLockStride = stride;
136 void unlock(
int actualCount)
override {
137 SkASSERT(fLockStride && fVertices && fVertexBuffer && !fVertexData);
140 fVertexBuffer->unmap();
142 fVertexBuffer->updateData(fVertices,
144 actualCount*fLockStride,
150 actualCount, fLockStride);
157 SkASSERT(!fLockStride && !fVertices && !fVertexBuffer && fVertexData);
159 return std::move(fVertexData);
167 void* fVertices =
nullptr;
168 size_t fLockStride = 0;
185 return Helper::FactoryHelper<TriangulatingPathOp>(context, std::move(
paint), shape,
186 viewMatrix, devClipBounds, aaType,
190 const char*
name()
const override {
return "TriangulatingPathOp"; }
208 , fHelper(processorSet, aaType, stencilSettings)
212 , fDevClipBounds(devClipBounds)
237 SkASSERT(!fShape.style().applies());
239 fShape.asPath(&path);
245 const SkIRect& devClipBounds) {
250 static constexpr int kClipBoundsCnt =
sizeof(devClipBounds) /
sizeof(uint32_t);
257 memcpy(&builder[shapeKeyDataCnt], &devClipBounds,
sizeof(devClipBounds));
259 memset(&builder[shapeKeyDataCnt], 0,
sizeof(devClipBounds));
276 if (!viewMatrix.
invert(&vmi)) {
291 auto threadSafeCache =
target->threadSafeCache();
294 CreateKey(&
key, fShape, fDevClipBounds);
300 auto [cachedVerts, data] = threadSafeCache->findVertsWithData(
key);
301 if (cachedVerts && cache_match(data.get(), tol)) {
302 fVertexData = std::move(cachedVerts);
307 if (!fVertexData->gpuBuffer()) {
318 fVertexData->setGpuBuffer(std::move(
buffer));
321 fMesh = CreateMesh(
target, fVertexData->refGpuBuffer(), 0, fVertexData->numVertices());
326 StaticVertexAllocator allocator(rp, canMapVB);
329 int vertexCount = Triangulate(&allocator,
fViewMatrix, fShape, fDevClipBounds, tol,
331 if (vertexCount == 0) {
335 fVertexData = allocator.detachVertexData();
337 key.setCustomData(create_data(vertexCount, isLinear, tol));
339 auto [tmpV, tmpD] = threadSafeCache->addVertsWithData(
key, fVertexData, is_newer_better);
340 if (tmpV != fVertexData) {
348 fShape.addGenIDChangeListener(
349 sk_make_sp<UniqueKeyInvalidator>(
key,
target->contextUniqueID()));
352 fMesh = CreateMesh(
target, fVertexData->refGpuBuffer(), 0, fVertexData->numVertices());
358 SkPath path = this->getPath();
359 if (path.isEmpty()) {
369 if (vertexCount == 0) {
372 fMesh = CreateMesh(
target, std::move(vertexBuffer), firstVertex, vertexCount);
380 bool usesMSAASurface,
391 ? LocalCoords::kUsePosition_Type
392 : LocalCoords::kUnused_Type;
396 coverageType = Coverage::kAttributeTweakAlpha_Type;
398 coverageType = Coverage::kAttribute_Type;
401 coverageType = Coverage::kSolid_Type;
416 auto vertexStride =
sizeof(
SkPoint);
418 vertexStride +=
sizeof(float);
428 std::move(appliedClip), dstProxyView,
430 renderPassXferBarriers, colorLoadOp);
442 renderPassXferBarriers, colorLoadOp);
453 CreateKey(&
key, fShape, fDevClipBounds);
458 auto [cachedVerts, data] = threadSafeViewCache->findVertsWithData(
key);
459 if (cachedVerts && cache_match(data.get(), tol)) {
460 fVertexData = std::move(cachedVerts);
467 int vertexCount = Triangulate(&allocator,
fViewMatrix, fShape, fDevClipBounds, tol,
469 if (vertexCount == 0) {
475 key.setCustomData(create_data(vertexCount, isLinear, tol));
481 auto [tmpV, tmpD] = threadSafeViewCache->addVertsWithData(
key, fVertexData,
483 if (tmpV != fVertexData) {
486 SkASSERT(cache_match(tmpD.get(), tol));
487 fVertexData = std::move(tmpV);
492 fShape.addGenIDChangeListener(
499 this->createAAMesh(
target);
501 this->createNonAAMesh(
target);
509 auto mesh =
target->allocMesh();
510 mesh->set(std::move(vb),
count, firstVertex);
519 if (!fProgramInfo || !fMesh) {
528#if defined(GR_TEST_UTILS)
529 SkString onDumpInfo()
const override {
531 fColor.toBytes_RGBA(), fAntiAlias, fHelper.dumpInfo().c_str());
554#if defined(GR_TEST_UTILS)
556GR_DRAW_OP_TEST_DEFINE(TriangulatingPathOp) {
557 SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random);
558 const SkPath&
path = GrTest::TestPath(random);
560 random->nextU(), random->nextU(), random->nextU(), random->nextU());
561 devClipBounds.
sort();
565 aaType = kAATypes[random->nextULessThan(std::size(kAATypes))];
569 GrTest::TestStyle(random, &style);
572 return TriangulatingPathOp::Make(context, std::move(
paint), shape, viewMatrix, devClipBounds,
573 aaType, GrGetRandomStencil(random, context));
597 if (!
args.fShape->style().isSimpleFill() ||
args.fShape->knownToBeConvex()) {
600 switch (
args.fAAType) {
606 if (!
args.fShape->hasUnstyledKey()) {
614 args.fShape->asPath(&path);
615 if (path.countVerbs() > fMaxVerbCount) {
625 "GrTriangulatingPathRenderer::onDrawPath");
629 *
args.fClipConservativeBounds,
args.fAAType,
args.fUserStencilSettings);
630 args.fSurfaceDrawContext->addDrawOp(
args.fClip, std::move(op));
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
#define GR_AUDIT_TRAIL_AUTO_FRAME(audit_trail, framename)
#define DEFINE_OP_CLASS_ID
GrProcessorAnalysisCoverage
#define TRIANGULATOR_WIREFRAME
std::function< void(GrSurfaceProxy *, skgpu::Mipmapped)> GrVisitProxyFunc
@ kStatic_GrAccessPattern
SK_API void sk_free(void *)
static void * sk_malloc_throw(size_t size)
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
#define INHERITED(method,...)
SK_API SkString static SkString SkStringPrintf()
#define GR_AA_TESSELLATOR_MAX_VERB_COUNT
static int PathToAATriangles(const SkPath &path, SkScalar tolerance, const SkRect &clipBounds, GrEagerVertexAllocator *vertexAllocator)
uint32_t contextID() const
sk_sp< GrThreadSafeCache::VertexData > detachVertexData()
friend class GrSimpleMeshDrawOpHelperWithStencil
virtual FixedFunctionFlags fixedFunctionFlags() const
virtual GrProcessorSet::Analysis finalize(const GrCaps &, const GrAppliedClip *, GrClampType)=0
virtual void unlock(int actualCount)=0
virtual void * lock(size_t stride, int eagerCount)=0
size_t vertexStride() const
virtual GrProgramInfo * programInfo()=0
void createProgramInfo(const GrCaps *caps, SkArenaAlloc *arena, const GrSurfaceProxyView &writeView, bool usesMSAASurface, GrAppliedClip &&appliedClip, const GrDstProxyView &dstProxyView, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp)
virtual void onPrePrepareDraws(GrRecordingContext *, const GrSurfaceProxyView &writeView, GrAppliedClip *, const GrDstProxyView &, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp)
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
static Owner Make(GrRecordingContext *context, Args &&... args)
std::unique_ptr< GrOp > Owner
virtual const char * name() const =0
virtual void visitProxies(const GrVisitProxyFunc &) const
void setBounds(const SkRect &newBounds, HasAABloat aabloat, IsHairline zeroArea)
const GrPipeline & pipeline() const
const GrGeometryProcessor & geomProc() const
void visitFPProxies(const GrVisitProxyFunc &func) const
GrThreadSafeCache * threadSafeCache()
GrRecordingContextPriv priv()
sk_sp< GrGpuBuffer > createBuffer(size_t size, GrGpuBufferType, GrAccessPattern, ZeroInit)
GrProcessorSet::Analysis finalizeProcessors(const GrCaps &caps, const GrAppliedClip *clip, GrClampType clampType, GrProcessorAnalysisCoverage geometryCoverage, GrProcessorAnalysisColor *geometryColor)
void visitProxies(const GrVisitProxyFunc &func) const
GrDrawOp::FixedFunctionFlags fixedFunctionFlags() const
bool usesLocalCoords() const
bool compatibleWithCoverageAsAlpha() const
GrProgramInfo * createProgramInfoWithStencil(const GrCaps *, SkArenaAlloc *, const GrSurfaceProxyView &writeView, bool usesMSAASurface, GrAppliedClip &&, const GrDstProxyView &, GrGeometryProcessor *, GrPrimitiveType, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp)
bool isSimpleFill() const
void asPath(SkPath *out) const
void writeUnstyledKey(uint32_t *key) const
int unstyledKeySize() const
bool inverseFilled() const
const GrStyle & style() const
static sk_sp< VertexData > MakeVertexData(const void *vertices, int vertexCount, size_t vertexSize)
static int PathToTriangles(const SkPath &path, SkScalar tolerance, const SkRect &clipBounds, GrEagerVertexAllocator *vertexAllocator, bool *isLinear)
const void * data() const
static sk_sp< SkData > MakeWithCopy(const void *data, size_t length)
bool invert(SkMatrix *inverse) const
bool mapRect(SkRect *dst, const SkRect &src, SkApplyPerspectiveClip pc=SkApplyPerspectiveClip::kYes) const
static void Post(Message m)
static Domain GenerateDomain()
TriangulatingPathRenderer()
bool onDrawPath(const DrawPathArgs &) override
CanDrawPath onCanDrawPath(const CanDrawPathArgs &) const override
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
static const uint8_t buffer[]
GrGeometryProcessor * Make(SkArenaAlloc *, const Color &, const Coverage &, const LocalCoords &, const SkMatrix &viewMatrix)
GrGeometryProcessor * MakeForDeviceSpace(SkArenaAlloc *, const Color &, const Coverage &, const LocalCoords &, const SkMatrix &viewMatrix)
static const SkScalar kDefaultTolerance
SkScalar scaleToleranceToSrc(SkScalar devTol, const SkMatrix &viewM, const SkRect &pathBounds)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
static constexpr SkIRect MakeLTRB(int32_t l, int32_t t, int32_t r, int32_t b)
static SkRect Make(const SkISize &size)
void join(const SkRect &r)
#define TRACE_EVENT0(category_group, name)