1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 Google LLC. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrContextOptions.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrRecordingContext.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDrawingManager.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRecordingContextPriv.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE) 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/ContextOptions.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ContextOptionsPriv.h" 21*c8dee2aaSAndroid Build Coastguard Worker #endif 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm { 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker /** 26*c8dee2aaSAndroid Build Coastguard Worker * This test originally ensured that the ccpr path cache preserved fill rules properly. CCPR is gone 27*c8dee2aaSAndroid Build Coastguard Worker * now, but we decided to keep the test. 28*c8dee2aaSAndroid Build Coastguard Worker */ 29*c8dee2aaSAndroid Build Coastguard Worker class ManyPathAtlasesGM : public GM { 30*c8dee2aaSAndroid Build Coastguard Worker public: ManyPathAtlasesGM(int maxAtlasSize)31*c8dee2aaSAndroid Build Coastguard Worker ManyPathAtlasesGM(int maxAtlasSize) : fMaxAtlasSize(maxAtlasSize) {} 32*c8dee2aaSAndroid Build Coastguard Worker private: getName() const33*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { 34*c8dee2aaSAndroid Build Coastguard Worker return SkStringPrintf("manypathatlases_%i", fMaxAtlasSize); 35*c8dee2aaSAndroid Build Coastguard Worker } getISize()36*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(128, 128); } 37*c8dee2aaSAndroid Build Coastguard Worker modifyGrContextOptions(GrContextOptions * ctxOptions)38*c8dee2aaSAndroid Build Coastguard Worker void modifyGrContextOptions(GrContextOptions* ctxOptions) override { 39*c8dee2aaSAndroid Build Coastguard Worker // This will test the case where the atlas runs out of room if fMaxAtlasSize is small. 40*c8dee2aaSAndroid Build Coastguard Worker ctxOptions->fMaxTextureAtlasSize = fMaxAtlasSize; 41*c8dee2aaSAndroid Build Coastguard Worker } 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE) modifyGraphiteContextOptions(skgpu::graphite::ContextOptions * options) const44*c8dee2aaSAndroid Build Coastguard Worker void modifyGraphiteContextOptions(skgpu::graphite::ContextOptions* options) const override { 45*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(options->fOptionsPriv); 46*c8dee2aaSAndroid Build Coastguard Worker options->fOptionsPriv->fMaxTextureAtlasSize = fMaxAtlasSize; 47*c8dee2aaSAndroid Build Coastguard Worker } 48*c8dee2aaSAndroid Build Coastguard Worker #endif 49*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)50*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 51*c8dee2aaSAndroid Build Coastguard Worker canvas->clear(SkColors::kYellow); 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker // Flush the context to make the DAG empty. This will test the case where we try to add an 54*c8dee2aaSAndroid Build Coastguard Worker // atlas task to an empty DAG. 55*c8dee2aaSAndroid Build Coastguard Worker auto dContext = GrAsDirectContext(canvas->recordingContext()); 56*c8dee2aaSAndroid Build Coastguard Worker if (dContext) { 57*c8dee2aaSAndroid Build Coastguard Worker dContext->flush(); 58*c8dee2aaSAndroid Build Coastguard Worker } 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker SkPath clip = SkPath().moveTo(-50, 20) 61*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(-50, -20, 50, -20, 50, 40) 62*c8dee2aaSAndroid Build Coastguard Worker .cubicTo(20, 0, -20, 0, -50, 20); 63*c8dee2aaSAndroid Build Coastguard Worker clip.transform(SkMatrix::Translate(64, 70)); 64*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) { 65*c8dee2aaSAndroid Build Coastguard Worker SkPath rotatedClip = clip; 66*c8dee2aaSAndroid Build Coastguard Worker rotatedClip.transform(SkMatrix::RotateDeg(30 * i + 128, {64, 70})); 67*c8dee2aaSAndroid Build Coastguard Worker rotatedClip.setIsVolatile(true); 68*c8dee2aaSAndroid Build Coastguard Worker canvas->clipPath(rotatedClip, SkClipOp::kDifference, true); 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker SkPath path = SkPath().moveTo(20, 0) 71*c8dee2aaSAndroid Build Coastguard Worker .lineTo(108, 0).cubicTo(108, 20, 108, 20, 128, 20) 72*c8dee2aaSAndroid Build Coastguard Worker .lineTo(128, 108).cubicTo(108, 108, 108, 108, 108, 128) 73*c8dee2aaSAndroid Build Coastguard Worker .lineTo(20, 128).cubicTo(20, 108, 20, 108, 0, 108) 74*c8dee2aaSAndroid Build Coastguard Worker .lineTo(0, 20).cubicTo(20, 20, 20, 20, 20, 0); 75*c8dee2aaSAndroid Build Coastguard Worker path.setIsVolatile(true); 76*c8dee2aaSAndroid Build Coastguard Worker SkPaint teal; 77*c8dee2aaSAndroid Build Coastguard Worker teal.setColor4f({.03f, .91f, .87f, 1}); 78*c8dee2aaSAndroid Build Coastguard Worker teal.setAntiAlias(true); 79*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, teal); 80*c8dee2aaSAndroid Build Coastguard Worker } 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker const int fMaxAtlasSize; 83*c8dee2aaSAndroid Build Coastguard Worker }; 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new ManyPathAtlasesGM(128); ) // Atlas runs out of room. 86*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new ManyPathAtlasesGM(2048); ) // Atlas does not run out of room. 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiagm 89