123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- /*
- * Copyright 2011 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #include "src/gpu/GrPathRendererChain.h"
- #include "include/gpu/GrContext.h"
- #include "include/private/GrRecordingContext.h"
- #include "src/gpu/GrCaps.h"
- #include "src/gpu/GrContextPriv.h"
- #include "src/gpu/GrGpu.h"
- #include "src/gpu/GrRecordingContextPriv.h"
- #include "src/gpu/GrShaderCaps.h"
- #include "src/gpu/ccpr/GrCoverageCountingPathRenderer.h"
- #include "src/gpu/ops/GrAAConvexPathRenderer.h"
- #include "src/gpu/ops/GrAAHairLinePathRenderer.h"
- #include "src/gpu/ops/GrAALinearizingConvexPathRenderer.h"
- #include "src/gpu/ops/GrDashLinePathRenderer.h"
- #include "src/gpu/ops/GrDefaultPathRenderer.h"
- #include "src/gpu/ops/GrSmallPathRenderer.h"
- #include "src/gpu/ops/GrStencilAndCoverPathRenderer.h"
- #include "src/gpu/ops/GrTessellatingPathRenderer.h"
- GrPathRendererChain::GrPathRendererChain(GrRecordingContext* context, const Options& options) {
- const GrCaps& caps = *context->priv().caps();
- if (options.fGpuPathRenderers & GpuPathRenderers::kDashLine) {
- fChain.push_back(sk_make_sp<GrDashLinePathRenderer>());
- }
- if (options.fGpuPathRenderers & GpuPathRenderers::kAAConvex) {
- fChain.push_back(sk_make_sp<GrAAConvexPathRenderer>());
- }
- if (options.fGpuPathRenderers & GpuPathRenderers::kCoverageCounting) {
- using AllowCaching = GrCoverageCountingPathRenderer::AllowCaching;
- if (auto ccpr = GrCoverageCountingPathRenderer::CreateIfSupported(
- caps, AllowCaching(options.fAllowPathMaskCaching),
- context->priv().contextID())) {
- fCoverageCountingPathRenderer = ccpr.get();
- context->priv().addOnFlushCallbackObject(fCoverageCountingPathRenderer);
- fChain.push_back(std::move(ccpr));
- }
- }
- if (options.fGpuPathRenderers & GpuPathRenderers::kAAHairline) {
- fChain.push_back(sk_make_sp<GrAAHairLinePathRenderer>());
- }
- if (options.fGpuPathRenderers & GpuPathRenderers::kAALinearizing) {
- fChain.push_back(sk_make_sp<GrAALinearizingConvexPathRenderer>());
- }
- if (options.fGpuPathRenderers & GpuPathRenderers::kSmall) {
- auto spr = sk_make_sp<GrSmallPathRenderer>();
- context->priv().addOnFlushCallbackObject(spr.get());
- fChain.push_back(std::move(spr));
- }
- if (options.fGpuPathRenderers & GpuPathRenderers::kStencilAndCover) {
- auto direct = context->priv().asDirectContext();
- if (direct) {
- auto resourceProvider = direct->priv().resourceProvider();
- sk_sp<GrPathRenderer> pr(
- GrStencilAndCoverPathRenderer::Create(resourceProvider, caps));
- if (pr) {
- fChain.push_back(std::move(pr));
- }
- }
- }
- if (options.fGpuPathRenderers & GpuPathRenderers::kTessellating) {
- fChain.push_back(sk_make_sp<GrTessellatingPathRenderer>());
- }
- // We always include the default path renderer (as well as SW), so we can draw any path
- fChain.push_back(sk_make_sp<GrDefaultPathRenderer>());
- }
- GrPathRenderer* GrPathRendererChain::getPathRenderer(
- const GrPathRenderer::CanDrawPathArgs& args,
- DrawType drawType,
- GrPathRenderer::StencilSupport* stencilSupport) {
- GR_STATIC_ASSERT(GrPathRenderer::kNoSupport_StencilSupport <
- GrPathRenderer::kStencilOnly_StencilSupport);
- GR_STATIC_ASSERT(GrPathRenderer::kStencilOnly_StencilSupport <
- GrPathRenderer::kNoRestriction_StencilSupport);
- GrPathRenderer::StencilSupport minStencilSupport;
- if (DrawType::kStencil == drawType) {
- minStencilSupport = GrPathRenderer::kStencilOnly_StencilSupport;
- } else if (DrawType::kStencilAndColor == drawType) {
- minStencilSupport = GrPathRenderer::kNoRestriction_StencilSupport;
- } else {
- minStencilSupport = GrPathRenderer::kNoSupport_StencilSupport;
- }
- if (minStencilSupport != GrPathRenderer::kNoSupport_StencilSupport) {
- // We don't support (and shouldn't need) stenciling of non-fill paths.
- if (!args.fShape->style().isSimpleFill()) {
- return nullptr;
- }
- }
- GrPathRenderer* bestPathRenderer = nullptr;
- for (const sk_sp<GrPathRenderer>& pr : fChain) {
- GrPathRenderer::StencilSupport support = GrPathRenderer::kNoSupport_StencilSupport;
- if (GrPathRenderer::kNoSupport_StencilSupport != minStencilSupport) {
- support = pr->getStencilSupport(*args.fShape);
- if (support < minStencilSupport) {
- continue;
- }
- }
- GrPathRenderer::CanDrawPath canDrawPath = pr->canDrawPath(args);
- if (GrPathRenderer::CanDrawPath::kNo == canDrawPath) {
- continue;
- }
- if (GrPathRenderer::CanDrawPath::kAsBackup == canDrawPath && bestPathRenderer) {
- continue;
- }
- if (stencilSupport) {
- *stencilSupport = support;
- }
- bestPathRenderer = pr.get();
- if (GrPathRenderer::CanDrawPath::kYes == canDrawPath) {
- break;
- }
- }
- return bestPathRenderer;
- }
|