1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2018 Google Inc.
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 "include/core/SkBitmap.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurfaceProps.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/AtlasTypes.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/SkBackingFit.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDeferredUpload.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDrawOpAtlas.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDstProxyView.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrOnFlushResourceProvider.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrOpFlushState.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrXferProcessor.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SurfaceDrawContext.h"
36*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/AtlasTextOp.h"
37*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrOp.h"
38*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/text/GrAtlasManager.h"
39*c8dee2aaSAndroid Build Coastguard Worker #include "tests/CtsEnforcement.h"
40*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
41*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h"
42*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ganesh/AtlasTextOpTools.h"
43*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ganesh/GrAtlasTools.h"
44*c8dee2aaSAndroid Build Coastguard Worker
45*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
46*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
47*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
48*c8dee2aaSAndroid Build Coastguard Worker
49*c8dee2aaSAndroid Build Coastguard Worker class GrResourceProvider;
50*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions;
51*c8dee2aaSAndroid Build Coastguard Worker
52*c8dee2aaSAndroid Build Coastguard Worker using namespace skgpu::ganesh;
53*c8dee2aaSAndroid Build Coastguard Worker using MaskFormat = skgpu::MaskFormat;
54*c8dee2aaSAndroid Build Coastguard Worker
55*c8dee2aaSAndroid Build Coastguard Worker
56*c8dee2aaSAndroid Build Coastguard Worker namespace {
57*c8dee2aaSAndroid Build Coastguard Worker const int kNumPlots = 2;
58*c8dee2aaSAndroid Build Coastguard Worker const int kPlotSize = 32;
59*c8dee2aaSAndroid Build Coastguard Worker const int kAtlasSize = kNumPlots * kPlotSize;
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Worker class AssertOnEvict : public skgpu::PlotEvictionCallback {
62*c8dee2aaSAndroid Build Coastguard Worker public:
evict(skgpu::PlotLocator)63*c8dee2aaSAndroid Build Coastguard Worker void evict(skgpu::PlotLocator) override {
64*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(0); // The unit test shouldn't exercise this code path
65*c8dee2aaSAndroid Build Coastguard Worker }
66*c8dee2aaSAndroid Build Coastguard Worker };
67*c8dee2aaSAndroid Build Coastguard Worker
check(skiatest::Reporter * r,GrDrawOpAtlas * atlas,uint32_t expectedActive,int expectedAlloced)68*c8dee2aaSAndroid Build Coastguard Worker void check(skiatest::Reporter* r, GrDrawOpAtlas* atlas,
69*c8dee2aaSAndroid Build Coastguard Worker uint32_t expectedActive, int expectedAlloced) {
70*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, atlas->numActivePages() == expectedActive);
71*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, GrDrawOpAtlasTools::NumAllocated(atlas) == expectedAlloced);
72*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, atlas->maxPages() == skgpu::PlotLocator::kMaxMultitexturePages);
73*c8dee2aaSAndroid Build Coastguard Worker }
74*c8dee2aaSAndroid Build Coastguard Worker
fill_plot(GrDrawOpAtlas * atlas,GrResourceProvider * resourceProvider,GrDeferredUploadTarget * target,skgpu::AtlasLocator * atlasLocator,int alpha)75*c8dee2aaSAndroid Build Coastguard Worker bool fill_plot(GrDrawOpAtlas* atlas,
76*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* resourceProvider,
77*c8dee2aaSAndroid Build Coastguard Worker GrDeferredUploadTarget* target,
78*c8dee2aaSAndroid Build Coastguard Worker skgpu::AtlasLocator* atlasLocator,
79*c8dee2aaSAndroid Build Coastguard Worker int alpha) {
80*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo ii = SkImageInfo::MakeA8(kPlotSize, kPlotSize);
81*c8dee2aaSAndroid Build Coastguard Worker
82*c8dee2aaSAndroid Build Coastguard Worker SkBitmap data;
83*c8dee2aaSAndroid Build Coastguard Worker data.allocPixels(ii);
84*c8dee2aaSAndroid Build Coastguard Worker data.eraseARGB(alpha, 0, 0, 0);
85*c8dee2aaSAndroid Build Coastguard Worker
86*c8dee2aaSAndroid Build Coastguard Worker GrDrawOpAtlas::ErrorCode code;
87*c8dee2aaSAndroid Build Coastguard Worker code = atlas->addToAtlas(resourceProvider, target, kPlotSize, kPlotSize,
88*c8dee2aaSAndroid Build Coastguard Worker data.getAddr(0, 0), atlasLocator);
89*c8dee2aaSAndroid Build Coastguard Worker return GrDrawOpAtlas::ErrorCode::kSucceeded == code;
90*c8dee2aaSAndroid Build Coastguard Worker }
91*c8dee2aaSAndroid Build Coastguard Worker } // anonymous namespace
92*c8dee2aaSAndroid Build Coastguard Worker
93*c8dee2aaSAndroid Build Coastguard Worker // Can't be in anonymous namespace because it needs friend access to TokenTracker
94*c8dee2aaSAndroid Build Coastguard Worker class TestingUploadTarget : public GrDeferredUploadTarget {
95*c8dee2aaSAndroid Build Coastguard Worker public:
TestingUploadTarget()96*c8dee2aaSAndroid Build Coastguard Worker TestingUploadTarget() { }
97*c8dee2aaSAndroid Build Coastguard Worker
tokenTracker()98*c8dee2aaSAndroid Build Coastguard Worker const skgpu::TokenTracker* tokenTracker() final { return &fTokenTracker; }
writeableTokenTracker()99*c8dee2aaSAndroid Build Coastguard Worker skgpu::TokenTracker* writeableTokenTracker() { return &fTokenTracker; }
100*c8dee2aaSAndroid Build Coastguard Worker
addInlineUpload(GrDeferredTextureUploadFn &&)101*c8dee2aaSAndroid Build Coastguard Worker skgpu::AtlasToken addInlineUpload(GrDeferredTextureUploadFn&&) final {
102*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(0); // this test shouldn't invoke this code path
103*c8dee2aaSAndroid Build Coastguard Worker return fTokenTracker.nextDrawToken();
104*c8dee2aaSAndroid Build Coastguard Worker }
105*c8dee2aaSAndroid Build Coastguard Worker
addASAPUpload(GrDeferredTextureUploadFn && upload)106*c8dee2aaSAndroid Build Coastguard Worker skgpu::AtlasToken addASAPUpload(GrDeferredTextureUploadFn&& upload) final {
107*c8dee2aaSAndroid Build Coastguard Worker return fTokenTracker.nextFlushToken();
108*c8dee2aaSAndroid Build Coastguard Worker }
109*c8dee2aaSAndroid Build Coastguard Worker
issueDrawToken()110*c8dee2aaSAndroid Build Coastguard Worker void issueDrawToken() { fTokenTracker.issueDrawToken(); }
issueFlushToken()111*c8dee2aaSAndroid Build Coastguard Worker void issueFlushToken() { fTokenTracker.issueFlushToken(); }
112*c8dee2aaSAndroid Build Coastguard Worker
113*c8dee2aaSAndroid Build Coastguard Worker private:
114*c8dee2aaSAndroid Build Coastguard Worker skgpu::TokenTracker fTokenTracker;
115*c8dee2aaSAndroid Build Coastguard Worker
116*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GrDeferredUploadTarget;
117*c8dee2aaSAndroid Build Coastguard Worker };
118*c8dee2aaSAndroid Build Coastguard Worker
119*c8dee2aaSAndroid Build Coastguard Worker // This is a basic DrawOpAtlas test. It simply verifies that multitexture atlases correctly
120*c8dee2aaSAndroid Build Coastguard Worker // add and remove pages. Note that this is simulating flush-time behavior.
DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(BasicDrawOpAtlas,reporter,ctxInfo,CtsEnforcement::kApiLevel_T)121*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(BasicDrawOpAtlas,
122*c8dee2aaSAndroid Build Coastguard Worker reporter,
123*c8dee2aaSAndroid Build Coastguard Worker ctxInfo,
124*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kApiLevel_T) {
125*c8dee2aaSAndroid Build Coastguard Worker auto context = ctxInfo.directContext();
126*c8dee2aaSAndroid Build Coastguard Worker auto proxyProvider = context->priv().proxyProvider();
127*c8dee2aaSAndroid Build Coastguard Worker auto resourceProvider = context->priv().resourceProvider();
128*c8dee2aaSAndroid Build Coastguard Worker auto drawingManager = context->priv().drawingManager();
129*c8dee2aaSAndroid Build Coastguard Worker const GrCaps* caps = context->priv().caps();
130*c8dee2aaSAndroid Build Coastguard Worker
131*c8dee2aaSAndroid Build Coastguard Worker GrOnFlushResourceProvider onFlushResourceProvider(drawingManager);
132*c8dee2aaSAndroid Build Coastguard Worker TestingUploadTarget uploadTarget;
133*c8dee2aaSAndroid Build Coastguard Worker
134*c8dee2aaSAndroid Build Coastguard Worker GrColorType atlasColorType = GrColorType::kAlpha_8;
135*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat format = caps->getDefaultBackendFormat(atlasColorType,
136*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kNo);
137*c8dee2aaSAndroid Build Coastguard Worker
138*c8dee2aaSAndroid Build Coastguard Worker AssertOnEvict evictor;
139*c8dee2aaSAndroid Build Coastguard Worker skgpu::AtlasGenerationCounter counter;
140*c8dee2aaSAndroid Build Coastguard Worker
141*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrDrawOpAtlas> atlas = GrDrawOpAtlas::Make(
142*c8dee2aaSAndroid Build Coastguard Worker proxyProvider,
143*c8dee2aaSAndroid Build Coastguard Worker format,
144*c8dee2aaSAndroid Build Coastguard Worker GrColorTypeToSkColorType(atlasColorType),
145*c8dee2aaSAndroid Build Coastguard Worker GrColorTypeBytesPerPixel(atlasColorType),
146*c8dee2aaSAndroid Build Coastguard Worker kAtlasSize, kAtlasSize,
147*c8dee2aaSAndroid Build Coastguard Worker kAtlasSize/kNumPlots, kAtlasSize/kNumPlots,
148*c8dee2aaSAndroid Build Coastguard Worker &counter,
149*c8dee2aaSAndroid Build Coastguard Worker GrDrawOpAtlas::AllowMultitexturing::kYes,
150*c8dee2aaSAndroid Build Coastguard Worker &evictor,
151*c8dee2aaSAndroid Build Coastguard Worker /*label=*/"BasicDrawOpAtlasTest");
152*c8dee2aaSAndroid Build Coastguard Worker check(reporter, atlas.get(), 0, 0);
153*c8dee2aaSAndroid Build Coastguard Worker
154*c8dee2aaSAndroid Build Coastguard Worker // Fill up the first level
155*c8dee2aaSAndroid Build Coastguard Worker skgpu::AtlasLocator atlasLocators[kNumPlots * kNumPlots];
156*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kNumPlots * kNumPlots; ++i) {
157*c8dee2aaSAndroid Build Coastguard Worker bool result = fill_plot(
158*c8dee2aaSAndroid Build Coastguard Worker atlas.get(), resourceProvider, &uploadTarget, &atlasLocators[i], i * 32);
159*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, result);
160*c8dee2aaSAndroid Build Coastguard Worker check(reporter, atlas.get(), 1, 1);
161*c8dee2aaSAndroid Build Coastguard Worker }
162*c8dee2aaSAndroid Build Coastguard Worker
163*c8dee2aaSAndroid Build Coastguard Worker atlas->instantiate(&onFlushResourceProvider);
164*c8dee2aaSAndroid Build Coastguard Worker check(reporter, atlas.get(), 1, 1);
165*c8dee2aaSAndroid Build Coastguard Worker
166*c8dee2aaSAndroid Build Coastguard Worker // Force allocation of a second level
167*c8dee2aaSAndroid Build Coastguard Worker skgpu::AtlasLocator atlasLocator;
168*c8dee2aaSAndroid Build Coastguard Worker bool result = fill_plot(atlas.get(), resourceProvider, &uploadTarget, &atlasLocator, 4 * 32);
169*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, result);
170*c8dee2aaSAndroid Build Coastguard Worker check(reporter, atlas.get(), 2, 2);
171*c8dee2aaSAndroid Build Coastguard Worker
172*c8dee2aaSAndroid Build Coastguard Worker // Simulate a lot of draws using only the first plot. The last texture should be compacted.
173*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 512; ++i) {
174*c8dee2aaSAndroid Build Coastguard Worker atlas->setLastUseToken(atlasLocators[0], uploadTarget.tokenTracker()->nextDrawToken());
175*c8dee2aaSAndroid Build Coastguard Worker uploadTarget.issueDrawToken();
176*c8dee2aaSAndroid Build Coastguard Worker uploadTarget.issueFlushToken();
177*c8dee2aaSAndroid Build Coastguard Worker atlas->compact(uploadTarget.tokenTracker()->nextFlushToken());
178*c8dee2aaSAndroid Build Coastguard Worker }
179*c8dee2aaSAndroid Build Coastguard Worker
180*c8dee2aaSAndroid Build Coastguard Worker check(reporter, atlas.get(), 1, 1);
181*c8dee2aaSAndroid Build Coastguard Worker }
182*c8dee2aaSAndroid Build Coastguard Worker
183*c8dee2aaSAndroid Build Coastguard Worker // This test verifies that the AtlasTextOp::onPrepare method correctly handles a failure
184*c8dee2aaSAndroid Build Coastguard Worker // when allocating an atlas page.
DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(GrAtlasTextOpPreparation,reporter,ctxInfo,CtsEnforcement::kApiLevel_T)185*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(GrAtlasTextOpPreparation,
186*c8dee2aaSAndroid Build Coastguard Worker reporter,
187*c8dee2aaSAndroid Build Coastguard Worker ctxInfo,
188*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kApiLevel_T) {
189*c8dee2aaSAndroid Build Coastguard Worker auto dContext = ctxInfo.directContext();
190*c8dee2aaSAndroid Build Coastguard Worker
191*c8dee2aaSAndroid Build Coastguard Worker auto gpu = dContext->priv().getGpu();
192*c8dee2aaSAndroid Build Coastguard Worker auto resourceProvider = dContext->priv().resourceProvider();
193*c8dee2aaSAndroid Build Coastguard Worker
194*c8dee2aaSAndroid Build Coastguard Worker auto sdc = skgpu::ganesh::SurfaceDrawContext::Make(dContext,
195*c8dee2aaSAndroid Build Coastguard Worker GrColorType::kRGBA_8888,
196*c8dee2aaSAndroid Build Coastguard Worker nullptr,
197*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit::kApprox,
198*c8dee2aaSAndroid Build Coastguard Worker {32, 32},
199*c8dee2aaSAndroid Build Coastguard Worker SkSurfaceProps(),
200*c8dee2aaSAndroid Build Coastguard Worker /*label=*/"AtlasTextOpPreparation");
201*c8dee2aaSAndroid Build Coastguard Worker
202*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
203*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(SK_ColorRED);
204*c8dee2aaSAndroid Build Coastguard Worker
205*c8dee2aaSAndroid Build Coastguard Worker SkFont font = ToolUtils::DefaultFont();
206*c8dee2aaSAndroid Build Coastguard Worker font.setEdging(SkFont::Edging::kAlias);
207*c8dee2aaSAndroid Build Coastguard Worker
208*c8dee2aaSAndroid Build Coastguard Worker const char* text = "a";
209*c8dee2aaSAndroid Build Coastguard Worker
210*c8dee2aaSAndroid Build Coastguard Worker GrOp::Owner op =
211*c8dee2aaSAndroid Build Coastguard Worker AtlasTextOpTools::CreateOp(sdc.get(), paint, font, SkMatrix::I(), text, 16, 16);
212*c8dee2aaSAndroid Build Coastguard Worker if (!op) {
213*c8dee2aaSAndroid Build Coastguard Worker return;
214*c8dee2aaSAndroid Build Coastguard Worker }
215*c8dee2aaSAndroid Build Coastguard Worker
216*c8dee2aaSAndroid Build Coastguard Worker auto atlasTextOp = (AtlasTextOp*)op.get();
217*c8dee2aaSAndroid Build Coastguard Worker atlasTextOp->finalize(*dContext->priv().caps(), nullptr, GrClampType::kAuto);
218*c8dee2aaSAndroid Build Coastguard Worker
219*c8dee2aaSAndroid Build Coastguard Worker TestingUploadTarget uploadTarget;
220*c8dee2aaSAndroid Build Coastguard Worker
221*c8dee2aaSAndroid Build Coastguard Worker GrOpFlushState flushState(gpu, resourceProvider, uploadTarget.writeableTokenTracker());
222*c8dee2aaSAndroid Build Coastguard Worker
223*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView surfaceView = sdc->writeSurfaceView();
224*c8dee2aaSAndroid Build Coastguard Worker GrOpFlushState::OpArgs opArgs(op.get(),
225*c8dee2aaSAndroid Build Coastguard Worker surfaceView,
226*c8dee2aaSAndroid Build Coastguard Worker false /*usesMSAASurface*/,
227*c8dee2aaSAndroid Build Coastguard Worker nullptr,
228*c8dee2aaSAndroid Build Coastguard Worker GrDstProxyView(),
229*c8dee2aaSAndroid Build Coastguard Worker GrXferBarrierFlags::kNone,
230*c8dee2aaSAndroid Build Coastguard Worker GrLoadOp::kLoad);
231*c8dee2aaSAndroid Build Coastguard Worker
232*c8dee2aaSAndroid Build Coastguard Worker // Modify the atlas manager so it can't allocate any pages. This will force a failure
233*c8dee2aaSAndroid Build Coastguard Worker // in the preparation of the text op
234*c8dee2aaSAndroid Build Coastguard Worker auto atlasManager = dContext->priv().getAtlasManager();
235*c8dee2aaSAndroid Build Coastguard Worker unsigned int numProxies;
236*c8dee2aaSAndroid Build Coastguard Worker atlasManager->getViews(MaskFormat::kA8, &numProxies);
237*c8dee2aaSAndroid Build Coastguard Worker GrAtlasManagerTools::SetMaxPages(atlasManager, 0);
238*c8dee2aaSAndroid Build Coastguard Worker
239*c8dee2aaSAndroid Build Coastguard Worker flushState.setOpArgs(&opArgs);
240*c8dee2aaSAndroid Build Coastguard Worker op->prepare(&flushState);
241*c8dee2aaSAndroid Build Coastguard Worker flushState.setOpArgs(nullptr);
242*c8dee2aaSAndroid Build Coastguard Worker }
243*c8dee2aaSAndroid Build Coastguard Worker
244*c8dee2aaSAndroid Build Coastguard Worker namespace {
test_atlas_config(skiatest::Reporter * reporter,int maxTextureSize,size_t maxBytes,MaskFormat maskFormat,SkISize expectedDimensions,SkISize expectedPlotDimensions)245*c8dee2aaSAndroid Build Coastguard Worker void test_atlas_config(skiatest::Reporter* reporter, int maxTextureSize, size_t maxBytes,
246*c8dee2aaSAndroid Build Coastguard Worker MaskFormat maskFormat, SkISize expectedDimensions,
247*c8dee2aaSAndroid Build Coastguard Worker SkISize expectedPlotDimensions) {
248*c8dee2aaSAndroid Build Coastguard Worker GrDrawOpAtlasConfig config(maxTextureSize, maxBytes);
249*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, config.atlasDimensions(maskFormat) == expectedDimensions);
250*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, config.plotDimensions(maskFormat) == expectedPlotDimensions);
251*c8dee2aaSAndroid Build Coastguard Worker }
252*c8dee2aaSAndroid Build Coastguard Worker } // anonymous namespace
253*c8dee2aaSAndroid Build Coastguard Worker
DEF_GANESH_TEST(GrDrawOpAtlasConfig_Basic,reporter,options,CtsEnforcement::kApiLevel_T)254*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(GrDrawOpAtlasConfig_Basic, reporter, options, CtsEnforcement::kApiLevel_T) {
255*c8dee2aaSAndroid Build Coastguard Worker // 1/4 MB
256*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 256 * 1024, MaskFormat::kARGB,
257*c8dee2aaSAndroid Build Coastguard Worker { 256, 256 }, { 256, 256 });
258*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 256 * 1024, MaskFormat::kA8,
259*c8dee2aaSAndroid Build Coastguard Worker { 512, 512 }, { 256, 256 });
260*c8dee2aaSAndroid Build Coastguard Worker // 1/2 MB
261*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 512 * 1024, MaskFormat::kARGB,
262*c8dee2aaSAndroid Build Coastguard Worker { 512, 256 }, { 256, 256 });
263*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 512 * 1024, MaskFormat::kA8,
264*c8dee2aaSAndroid Build Coastguard Worker { 1024, 512 }, { 256, 256 });
265*c8dee2aaSAndroid Build Coastguard Worker // 1 MB
266*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 1024 * 1024, MaskFormat::kARGB,
267*c8dee2aaSAndroid Build Coastguard Worker { 512, 512 }, { 256, 256 });
268*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 1024 * 1024, MaskFormat::kA8,
269*c8dee2aaSAndroid Build Coastguard Worker { 1024, 1024 }, { 256, 256 });
270*c8dee2aaSAndroid Build Coastguard Worker // 2 MB
271*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 2 * 1024 * 1024, MaskFormat::kARGB,
272*c8dee2aaSAndroid Build Coastguard Worker { 1024, 512 }, { 256, 256 });
273*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 2 * 1024 * 1024, MaskFormat::kA8,
274*c8dee2aaSAndroid Build Coastguard Worker { 2048, 1024 }, { 512, 256 });
275*c8dee2aaSAndroid Build Coastguard Worker // 4 MB
276*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 4 * 1024 * 1024, MaskFormat::kARGB,
277*c8dee2aaSAndroid Build Coastguard Worker { 1024, 1024 }, { 256, 256 });
278*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 4 * 1024 * 1024, MaskFormat::kA8,
279*c8dee2aaSAndroid Build Coastguard Worker { 2048, 2048 }, { 512, 512 });
280*c8dee2aaSAndroid Build Coastguard Worker // 8 MB
281*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 8 * 1024 * 1024, MaskFormat::kARGB,
282*c8dee2aaSAndroid Build Coastguard Worker { 2048, 1024 }, { 256, 256 });
283*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 8 * 1024 * 1024, MaskFormat::kA8,
284*c8dee2aaSAndroid Build Coastguard Worker { 2048, 2048 }, { 512, 512 });
285*c8dee2aaSAndroid Build Coastguard Worker // 16 MB (should be same as 8 MB)
286*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 16 * 1024 * 1024, MaskFormat::kARGB,
287*c8dee2aaSAndroid Build Coastguard Worker { 2048, 1024 }, { 256, 256 });
288*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 16 * 1024 * 1024, MaskFormat::kA8,
289*c8dee2aaSAndroid Build Coastguard Worker { 2048, 2048 }, { 512, 512 });
290*c8dee2aaSAndroid Build Coastguard Worker
291*c8dee2aaSAndroid Build Coastguard Worker // 4MB, restricted texture size
292*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 1024, 8 * 1024 * 1024, MaskFormat::kARGB,
293*c8dee2aaSAndroid Build Coastguard Worker { 1024, 1024 }, { 256, 256 });
294*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 1024, 8 * 1024 * 1024, MaskFormat::kA8,
295*c8dee2aaSAndroid Build Coastguard Worker { 1024, 1024 }, { 256, 256 });
296*c8dee2aaSAndroid Build Coastguard Worker
297*c8dee2aaSAndroid Build Coastguard Worker // 3 MB (should be same as 2 MB)
298*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 3 * 1024 * 1024, MaskFormat::kARGB,
299*c8dee2aaSAndroid Build Coastguard Worker { 1024, 512 }, { 256, 256 });
300*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 3 * 1024 * 1024, MaskFormat::kA8,
301*c8dee2aaSAndroid Build Coastguard Worker { 2048, 1024 }, { 512, 256 });
302*c8dee2aaSAndroid Build Coastguard Worker
303*c8dee2aaSAndroid Build Coastguard Worker // minimum size
304*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 0, MaskFormat::kARGB,
305*c8dee2aaSAndroid Build Coastguard Worker { 256, 256 }, { 256, 256 });
306*c8dee2aaSAndroid Build Coastguard Worker test_atlas_config(reporter, 65536, 0, MaskFormat::kA8,
307*c8dee2aaSAndroid Build Coastguard Worker { 512, 512 }, { 256, 256 });
308*c8dee2aaSAndroid Build Coastguard Worker }
309