1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 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 "include/gpu/graphite/BackendTexture.h"
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorFilter.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Context.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Image.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Recording.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Surface.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/YUVABackendTextures.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/Caps.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ContextPriv.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/RecordingPriv.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "tools/graphite/GraphiteTestContext.h"
24*c8dee2aaSAndroid Build Coastguard Worker
25*c8dee2aaSAndroid Build Coastguard Worker using namespace skgpu::graphite;
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Worker namespace {
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Worker struct PromiseImageChecker {
30*c8dee2aaSAndroid Build Coastguard Worker PromiseImageChecker() = default;
31*c8dee2aaSAndroid Build Coastguard Worker
checkImageReleased__anon59cb78cf0111::PromiseImageChecker32*c8dee2aaSAndroid Build Coastguard Worker void checkImageReleased(skiatest::Reporter* reporter, int expectedReleaseCnt) {
33*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, expectedReleaseCnt == fImageReleaseCount);
34*c8dee2aaSAndroid Build Coastguard Worker }
35*c8dee2aaSAndroid Build Coastguard Worker
36*c8dee2aaSAndroid Build Coastguard Worker int fImageReleaseCount = 0;
37*c8dee2aaSAndroid Build Coastguard Worker
ImageRelease__anon59cb78cf0111::PromiseImageChecker38*c8dee2aaSAndroid Build Coastguard Worker static void ImageRelease(void* self) {
39*c8dee2aaSAndroid Build Coastguard Worker auto checker = reinterpret_cast<PromiseImageChecker*>(self);
40*c8dee2aaSAndroid Build Coastguard Worker
41*c8dee2aaSAndroid Build Coastguard Worker checker->fImageReleaseCount++;
42*c8dee2aaSAndroid Build Coastguard Worker }
43*c8dee2aaSAndroid Build Coastguard Worker };
44*c8dee2aaSAndroid Build Coastguard Worker
45*c8dee2aaSAndroid Build Coastguard Worker struct PromiseTextureChecker {
46*c8dee2aaSAndroid Build Coastguard Worker PromiseTextureChecker() = default;
47*c8dee2aaSAndroid Build Coastguard Worker
PromiseTextureChecker__anon59cb78cf0111::PromiseTextureChecker48*c8dee2aaSAndroid Build Coastguard Worker explicit PromiseTextureChecker(const BackendTexture& backendTex) {
49*c8dee2aaSAndroid Build Coastguard Worker fBackendTextures[0] = backendTex;
50*c8dee2aaSAndroid Build Coastguard Worker }
51*c8dee2aaSAndroid Build Coastguard Worker
PromiseTextureChecker__anon59cb78cf0111::PromiseTextureChecker52*c8dee2aaSAndroid Build Coastguard Worker explicit PromiseTextureChecker(const BackendTexture& backendTex0,
53*c8dee2aaSAndroid Build Coastguard Worker const BackendTexture& backendTex1)
54*c8dee2aaSAndroid Build Coastguard Worker : fHasTwoBackendTextures(true) {
55*c8dee2aaSAndroid Build Coastguard Worker fBackendTextures[0] = backendTex0;
56*c8dee2aaSAndroid Build Coastguard Worker fBackendTextures[1] = backendTex1;
57*c8dee2aaSAndroid Build Coastguard Worker }
58*c8dee2aaSAndroid Build Coastguard Worker
totalReleaseCount__anon59cb78cf0111::PromiseTextureChecker59*c8dee2aaSAndroid Build Coastguard Worker int totalReleaseCount() const { return fTextureReleaseCounts[0] + fTextureReleaseCounts[1]; }
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Worker bool fHasTwoBackendTextures = false;
62*c8dee2aaSAndroid Build Coastguard Worker BackendTexture fBackendTextures[2];
63*c8dee2aaSAndroid Build Coastguard Worker int fFulfillCount = 0;
64*c8dee2aaSAndroid Build Coastguard Worker int fTextureReleaseCounts[2] = { 0, 0 };
65*c8dee2aaSAndroid Build Coastguard Worker
Fulfill__anon59cb78cf0111::PromiseTextureChecker66*c8dee2aaSAndroid Build Coastguard Worker static std::tuple<BackendTexture, void*> Fulfill(void* self) {
67*c8dee2aaSAndroid Build Coastguard Worker auto checker = reinterpret_cast<PromiseTextureChecker*>(self);
68*c8dee2aaSAndroid Build Coastguard Worker
69*c8dee2aaSAndroid Build Coastguard Worker checker->fFulfillCount++;
70*c8dee2aaSAndroid Build Coastguard Worker
71*c8dee2aaSAndroid Build Coastguard Worker if (checker->fHasTwoBackendTextures) {
72*c8dee2aaSAndroid Build Coastguard Worker int whichToUse = checker->fFulfillCount % 2;
73*c8dee2aaSAndroid Build Coastguard Worker return { checker->fBackendTextures[whichToUse],
74*c8dee2aaSAndroid Build Coastguard Worker &checker->fTextureReleaseCounts[whichToUse] };
75*c8dee2aaSAndroid Build Coastguard Worker } else {
76*c8dee2aaSAndroid Build Coastguard Worker return { checker->fBackendTextures[0], &checker->fTextureReleaseCounts[0] };
77*c8dee2aaSAndroid Build Coastguard Worker }
78*c8dee2aaSAndroid Build Coastguard Worker }
79*c8dee2aaSAndroid Build Coastguard Worker
TextureRelease__anon59cb78cf0111::PromiseTextureChecker80*c8dee2aaSAndroid Build Coastguard Worker static void TextureRelease(void* context) {
81*c8dee2aaSAndroid Build Coastguard Worker int* releaseCount = reinterpret_cast<int*>(context);
82*c8dee2aaSAndroid Build Coastguard Worker
83*c8dee2aaSAndroid Build Coastguard Worker (*releaseCount)++;
84*c8dee2aaSAndroid Build Coastguard Worker }
85*c8dee2aaSAndroid Build Coastguard Worker };
86*c8dee2aaSAndroid Build Coastguard Worker
87*c8dee2aaSAndroid Build Coastguard Worker enum class ReleaseBalanceExpectation {
88*c8dee2aaSAndroid Build Coastguard Worker kBalanced,
89*c8dee2aaSAndroid Build Coastguard Worker kOffByOne, // fulfill calls ahead of release calls by 1
90*c8dee2aaSAndroid Build Coastguard Worker kOffByTwo, // fulfill calls ahead of release calls by 2
91*c8dee2aaSAndroid Build Coastguard Worker kFulfillsOnly, // 'n' fulfill calls, 0 release calls
92*c8dee2aaSAndroid Build Coastguard Worker };
93*c8dee2aaSAndroid Build Coastguard Worker
check_fulfill_and_release_cnts(skiatest::Reporter * reporter,const PromiseImageChecker & promiseImageChecker,const PromiseTextureChecker * promiseTextureCheckers,int expectedFulfillCnt,ReleaseBalanceExpectation releaseBalanceExpectation)94*c8dee2aaSAndroid Build Coastguard Worker void check_fulfill_and_release_cnts(skiatest::Reporter* reporter,
95*c8dee2aaSAndroid Build Coastguard Worker const PromiseImageChecker& promiseImageChecker,
96*c8dee2aaSAndroid Build Coastguard Worker const PromiseTextureChecker* promiseTextureCheckers,
97*c8dee2aaSAndroid Build Coastguard Worker int expectedFulfillCnt,
98*c8dee2aaSAndroid Build Coastguard Worker ReleaseBalanceExpectation releaseBalanceExpectation) {
99*c8dee2aaSAndroid Build Coastguard Worker // If one fulfill fails the following ones won't be called, so we check the max value
100*c8dee2aaSAndroid Build Coastguard Worker int maxFulfillCnt = 0;
101*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) {
102*c8dee2aaSAndroid Build Coastguard Worker maxFulfillCnt = std::max(promiseTextureCheckers[i].fFulfillCount, maxFulfillCnt);
103*c8dee2aaSAndroid Build Coastguard Worker if (!expectedFulfillCnt) {
104*c8dee2aaSAndroid Build Coastguard Worker // Release should only ever be called after Fulfill.
105*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, promiseImageChecker.fImageReleaseCount == 0);
106*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, promiseTextureCheckers[i].totalReleaseCount() == 0);
107*c8dee2aaSAndroid Build Coastguard Worker return;
108*c8dee2aaSAndroid Build Coastguard Worker }
109*c8dee2aaSAndroid Build Coastguard Worker
110*c8dee2aaSAndroid Build Coastguard Worker if (promiseTextureCheckers[i].fFulfillCount) {
111*c8dee2aaSAndroid Build Coastguard Worker int releaseDiff = promiseTextureCheckers[i].fFulfillCount -
112*c8dee2aaSAndroid Build Coastguard Worker promiseTextureCheckers[i].totalReleaseCount();
113*c8dee2aaSAndroid Build Coastguard Worker switch (releaseBalanceExpectation) {
114*c8dee2aaSAndroid Build Coastguard Worker case ReleaseBalanceExpectation::kBalanced:
115*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!releaseDiff);
116*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !releaseDiff);
117*c8dee2aaSAndroid Build Coastguard Worker break;
118*c8dee2aaSAndroid Build Coastguard Worker case ReleaseBalanceExpectation::kOffByOne:
119*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(releaseDiff == 1);
120*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, releaseDiff == 1);
121*c8dee2aaSAndroid Build Coastguard Worker break;
122*c8dee2aaSAndroid Build Coastguard Worker case ReleaseBalanceExpectation::kOffByTwo:
123*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(releaseDiff == 2);
124*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, releaseDiff == 2);
125*c8dee2aaSAndroid Build Coastguard Worker break;
126*c8dee2aaSAndroid Build Coastguard Worker case ReleaseBalanceExpectation::kFulfillsOnly:
127*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, promiseTextureCheckers[i].totalReleaseCount() == 0);
128*c8dee2aaSAndroid Build Coastguard Worker break;
129*c8dee2aaSAndroid Build Coastguard Worker }
130*c8dee2aaSAndroid Build Coastguard Worker }
131*c8dee2aaSAndroid Build Coastguard Worker }
132*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(maxFulfillCnt == expectedFulfillCnt);
133*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, maxFulfillCnt == expectedFulfillCnt);
134*c8dee2aaSAndroid Build Coastguard Worker }
135*c8dee2aaSAndroid Build Coastguard Worker
check_unfulfilled(const PromiseImageChecker & promiseImageChecker,const PromiseTextureChecker * promiseTextureCheckers,skiatest::Reporter * reporter)136*c8dee2aaSAndroid Build Coastguard Worker void check_unfulfilled(const PromiseImageChecker& promiseImageChecker,
137*c8dee2aaSAndroid Build Coastguard Worker const PromiseTextureChecker* promiseTextureCheckers,
138*c8dee2aaSAndroid Build Coastguard Worker skiatest::Reporter* reporter) {
139*c8dee2aaSAndroid Build Coastguard Worker check_fulfill_and_release_cnts(reporter, promiseImageChecker, promiseTextureCheckers,
140*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 0,
141*c8dee2aaSAndroid Build Coastguard Worker ReleaseBalanceExpectation::kBalanced);
142*c8dee2aaSAndroid Build Coastguard Worker }
143*c8dee2aaSAndroid Build Coastguard Worker
check_fulfilled_ahead_by_one(skiatest::Reporter * reporter,const PromiseImageChecker & promiseImageChecker,const PromiseTextureChecker * promiseTextureCheckers,int expectedFulfillCnt)144*c8dee2aaSAndroid Build Coastguard Worker void check_fulfilled_ahead_by_one(skiatest::Reporter* reporter,
145*c8dee2aaSAndroid Build Coastguard Worker const PromiseImageChecker& promiseImageChecker,
146*c8dee2aaSAndroid Build Coastguard Worker const PromiseTextureChecker* promiseTextureCheckers,
147*c8dee2aaSAndroid Build Coastguard Worker int expectedFulfillCnt) {
148*c8dee2aaSAndroid Build Coastguard Worker check_fulfill_and_release_cnts(reporter, promiseImageChecker, promiseTextureCheckers,
149*c8dee2aaSAndroid Build Coastguard Worker expectedFulfillCnt, ReleaseBalanceExpectation::kOffByOne);
150*c8dee2aaSAndroid Build Coastguard Worker }
151*c8dee2aaSAndroid Build Coastguard Worker
check_fulfilled_ahead_by_two(skiatest::Reporter * reporter,const PromiseImageChecker & promiseImageChecker,const PromiseTextureChecker * promiseTextureCheckers,int expectedFulfillCnt)152*c8dee2aaSAndroid Build Coastguard Worker void check_fulfilled_ahead_by_two(skiatest::Reporter* reporter,
153*c8dee2aaSAndroid Build Coastguard Worker const PromiseImageChecker& promiseImageChecker,
154*c8dee2aaSAndroid Build Coastguard Worker const PromiseTextureChecker* promiseTextureCheckers,
155*c8dee2aaSAndroid Build Coastguard Worker int expectedFulfillCnt) {
156*c8dee2aaSAndroid Build Coastguard Worker check_fulfill_and_release_cnts(reporter, promiseImageChecker, promiseTextureCheckers,
157*c8dee2aaSAndroid Build Coastguard Worker expectedFulfillCnt, ReleaseBalanceExpectation::kOffByTwo);
158*c8dee2aaSAndroid Build Coastguard Worker }
159*c8dee2aaSAndroid Build Coastguard Worker
check_all_done(skiatest::Reporter * reporter,const PromiseImageChecker & promiseImageChecker,const PromiseTextureChecker * promiseTextureCheckers,int expectedFulfillCnt)160*c8dee2aaSAndroid Build Coastguard Worker void check_all_done(skiatest::Reporter* reporter,
161*c8dee2aaSAndroid Build Coastguard Worker const PromiseImageChecker& promiseImageChecker,
162*c8dee2aaSAndroid Build Coastguard Worker const PromiseTextureChecker* promiseTextureCheckers,
163*c8dee2aaSAndroid Build Coastguard Worker int expectedFulfillCnt) {
164*c8dee2aaSAndroid Build Coastguard Worker check_fulfill_and_release_cnts(reporter, promiseImageChecker, promiseTextureCheckers,
165*c8dee2aaSAndroid Build Coastguard Worker expectedFulfillCnt, ReleaseBalanceExpectation::kBalanced);
166*c8dee2aaSAndroid Build Coastguard Worker }
167*c8dee2aaSAndroid Build Coastguard Worker
check_fulfills_only(skiatest::Reporter * reporter,const PromiseImageChecker & promiseImageChecker,const PromiseTextureChecker * promiseTextureCheckers,int expectedFulfillCnt)168*c8dee2aaSAndroid Build Coastguard Worker void check_fulfills_only(skiatest::Reporter* reporter,
169*c8dee2aaSAndroid Build Coastguard Worker const PromiseImageChecker& promiseImageChecker,
170*c8dee2aaSAndroid Build Coastguard Worker const PromiseTextureChecker* promiseTextureCheckers,
171*c8dee2aaSAndroid Build Coastguard Worker int expectedFulfillCnt) {
172*c8dee2aaSAndroid Build Coastguard Worker check_fulfill_and_release_cnts(reporter, promiseImageChecker, promiseTextureCheckers,
173*c8dee2aaSAndroid Build Coastguard Worker expectedFulfillCnt, ReleaseBalanceExpectation::kFulfillsOnly);
174*c8dee2aaSAndroid Build Coastguard Worker }
175*c8dee2aaSAndroid Build Coastguard Worker
176*c8dee2aaSAndroid Build Coastguard Worker struct TestCtx {
TestCtx__anon59cb78cf0111::TestCtx177*c8dee2aaSAndroid Build Coastguard Worker TestCtx() {}
178*c8dee2aaSAndroid Build Coastguard Worker
~TestCtx__anon59cb78cf0111::TestCtx179*c8dee2aaSAndroid Build Coastguard Worker ~TestCtx() {
180*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i) {
181*c8dee2aaSAndroid Build Coastguard Worker if (fBackendTextures[i].isValid()) {
182*c8dee2aaSAndroid Build Coastguard Worker fContext->deleteBackendTexture(fBackendTextures[i]);
183*c8dee2aaSAndroid Build Coastguard Worker }
184*c8dee2aaSAndroid Build Coastguard Worker }
185*c8dee2aaSAndroid Build Coastguard Worker }
186*c8dee2aaSAndroid Build Coastguard Worker
187*c8dee2aaSAndroid Build Coastguard Worker Context* fContext;
188*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recorder> fRecorder;
189*c8dee2aaSAndroid Build Coastguard Worker BackendTexture fBackendTextures[8];
190*c8dee2aaSAndroid Build Coastguard Worker PromiseImageChecker fPromiseImageChecker;
191*c8dee2aaSAndroid Build Coastguard Worker SkImages::GraphitePromiseImageContext fImageContext = &fPromiseImageChecker;
192*c8dee2aaSAndroid Build Coastguard Worker PromiseTextureChecker fPromiseTextureCheckers[4];
193*c8dee2aaSAndroid Build Coastguard Worker SkImages::GraphitePromiseTextureFulfillContext fTextureContexts[4] = {
194*c8dee2aaSAndroid Build Coastguard Worker &fPromiseTextureCheckers[0],
195*c8dee2aaSAndroid Build Coastguard Worker &fPromiseTextureCheckers[1],
196*c8dee2aaSAndroid Build Coastguard Worker &fPromiseTextureCheckers[2],
197*c8dee2aaSAndroid Build Coastguard Worker &fPromiseTextureCheckers[3],
198*c8dee2aaSAndroid Build Coastguard Worker };
199*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> fImg;
200*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> fSurface;
201*c8dee2aaSAndroid Build Coastguard Worker };
202*c8dee2aaSAndroid Build Coastguard Worker
setup_test_context(Context * context,skiatest::Reporter * reporter,TestCtx * testCtx,SkISize dimensions,Volatile isVolatile,bool invalidBackendTex)203*c8dee2aaSAndroid Build Coastguard Worker void setup_test_context(Context* context,
204*c8dee2aaSAndroid Build Coastguard Worker skiatest::Reporter* reporter,
205*c8dee2aaSAndroid Build Coastguard Worker TestCtx* testCtx,
206*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions,
207*c8dee2aaSAndroid Build Coastguard Worker Volatile isVolatile,
208*c8dee2aaSAndroid Build Coastguard Worker bool invalidBackendTex) {
209*c8dee2aaSAndroid Build Coastguard Worker testCtx->fContext = context;
210*c8dee2aaSAndroid Build Coastguard Worker
211*c8dee2aaSAndroid Build Coastguard Worker const Caps* caps = context->priv().caps();
212*c8dee2aaSAndroid Build Coastguard Worker
213*c8dee2aaSAndroid Build Coastguard Worker skgpu::Protected isProtected = skgpu::Protected(caps->protectedSupport());
214*c8dee2aaSAndroid Build Coastguard Worker
215*c8dee2aaSAndroid Build Coastguard Worker testCtx->fRecorder = context->makeRecorder();
216*c8dee2aaSAndroid Build Coastguard Worker
217*c8dee2aaSAndroid Build Coastguard Worker testCtx->fPromiseImageChecker = PromiseImageChecker();
218*c8dee2aaSAndroid Build Coastguard Worker
219*c8dee2aaSAndroid Build Coastguard Worker TextureInfo textureInfo[4];
220*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) {
221*c8dee2aaSAndroid Build Coastguard Worker textureInfo[i] = caps->getDefaultSampledTextureInfo(kAlpha_8_SkColorType,
222*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
223*c8dee2aaSAndroid Build Coastguard Worker isProtected,
224*c8dee2aaSAndroid Build Coastguard Worker skgpu::Renderable::kYes);
225*c8dee2aaSAndroid Build Coastguard Worker
226*c8dee2aaSAndroid Build Coastguard Worker if (invalidBackendTex) {
227*c8dee2aaSAndroid Build Coastguard Worker // Having invalid backend textures will invalidate all the fulfill calls
228*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !testCtx->fBackendTextures[i].isValid());
229*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !testCtx->fBackendTextures[i+4].isValid());
230*c8dee2aaSAndroid Build Coastguard Worker } else {
231*c8dee2aaSAndroid Build Coastguard Worker testCtx->fBackendTextures[i] =
232*c8dee2aaSAndroid Build Coastguard Worker testCtx->fRecorder->createBackendTexture(dimensions, textureInfo[i]);
233*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, testCtx->fBackendTextures[i].isValid());
234*c8dee2aaSAndroid Build Coastguard Worker
235*c8dee2aaSAndroid Build Coastguard Worker if (isVolatile == Volatile::kYes) {
236*c8dee2aaSAndroid Build Coastguard Worker testCtx->fBackendTextures[i+4] =
237*c8dee2aaSAndroid Build Coastguard Worker testCtx->fRecorder->createBackendTexture(dimensions, textureInfo[i]);
238*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, testCtx->fBackendTextures[i+4].isValid());
239*c8dee2aaSAndroid Build Coastguard Worker }
240*c8dee2aaSAndroid Build Coastguard Worker }
241*c8dee2aaSAndroid Build Coastguard Worker
242*c8dee2aaSAndroid Build Coastguard Worker if (isVolatile == Volatile::kYes) {
243*c8dee2aaSAndroid Build Coastguard Worker testCtx->fPromiseTextureCheckers[i] =
244*c8dee2aaSAndroid Build Coastguard Worker PromiseTextureChecker(testCtx->fBackendTextures[i],
245*c8dee2aaSAndroid Build Coastguard Worker testCtx->fBackendTextures[i+4]);
246*c8dee2aaSAndroid Build Coastguard Worker } else {
247*c8dee2aaSAndroid Build Coastguard Worker testCtx->fPromiseTextureCheckers[i] =
248*c8dee2aaSAndroid Build Coastguard Worker PromiseTextureChecker(testCtx->fBackendTextures[i]);
249*c8dee2aaSAndroid Build Coastguard Worker }
250*c8dee2aaSAndroid Build Coastguard Worker }
251*c8dee2aaSAndroid Build Coastguard Worker
252*c8dee2aaSAndroid Build Coastguard Worker SkYUVAInfo yuvaInfo(dimensions,
253*c8dee2aaSAndroid Build Coastguard Worker SkYUVAInfo::PlaneConfig::kY_U_V_A,
254*c8dee2aaSAndroid Build Coastguard Worker SkYUVAInfo::Subsampling::k444,
255*c8dee2aaSAndroid Build Coastguard Worker kJPEG_Full_SkYUVColorSpace);
256*c8dee2aaSAndroid Build Coastguard Worker YUVABackendTextureInfo yuvaBackendInfo(testCtx->fRecorder.get(),
257*c8dee2aaSAndroid Build Coastguard Worker yuvaInfo,
258*c8dee2aaSAndroid Build Coastguard Worker textureInfo,
259*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo);
260*c8dee2aaSAndroid Build Coastguard Worker
261*c8dee2aaSAndroid Build Coastguard Worker testCtx->fImg = SkImages::PromiseTextureFromYUVA(testCtx->fRecorder.get(),
262*c8dee2aaSAndroid Build Coastguard Worker yuvaBackendInfo,
263*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeSRGBLinear(),
264*c8dee2aaSAndroid Build Coastguard Worker isVolatile,
265*c8dee2aaSAndroid Build Coastguard Worker PromiseTextureChecker::Fulfill,
266*c8dee2aaSAndroid Build Coastguard Worker PromiseImageChecker::ImageRelease,
267*c8dee2aaSAndroid Build Coastguard Worker PromiseTextureChecker::TextureRelease,
268*c8dee2aaSAndroid Build Coastguard Worker testCtx->fImageContext,
269*c8dee2aaSAndroid Build Coastguard Worker testCtx->fTextureContexts);
270*c8dee2aaSAndroid Build Coastguard Worker
271*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo ii = SkImageInfo::Make(dimensions.fWidth,
272*c8dee2aaSAndroid Build Coastguard Worker dimensions.fHeight,
273*c8dee2aaSAndroid Build Coastguard Worker kRGBA_8888_SkColorType,
274*c8dee2aaSAndroid Build Coastguard Worker kPremul_SkAlphaType);
275*c8dee2aaSAndroid Build Coastguard Worker testCtx->fSurface = SkSurfaces::RenderTarget(testCtx->fRecorder.get(), ii);
276*c8dee2aaSAndroid Build Coastguard Worker }
277*c8dee2aaSAndroid Build Coastguard Worker
278*c8dee2aaSAndroid Build Coastguard Worker } // anonymous namespace
279*c8dee2aaSAndroid Build Coastguard Worker
DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(NonVolatileGraphiteYUVAPromiseImageTest,reporter,context,testGpuContext,true,CtsEnforcement::kApiLevel_V)280*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(NonVolatileGraphiteYUVAPromiseImageTest,
281*c8dee2aaSAndroid Build Coastguard Worker reporter,
282*c8dee2aaSAndroid Build Coastguard Worker context,
283*c8dee2aaSAndroid Build Coastguard Worker testGpuContext,
284*c8dee2aaSAndroid Build Coastguard Worker true,
285*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kApiLevel_V) {
286*c8dee2aaSAndroid Build Coastguard Worker constexpr SkISize kDimensions { 16, 16 };
287*c8dee2aaSAndroid Build Coastguard Worker
288*c8dee2aaSAndroid Build Coastguard Worker TestCtx testContext;
289*c8dee2aaSAndroid Build Coastguard Worker setup_test_context(context, reporter, &testContext,
290*c8dee2aaSAndroid Build Coastguard Worker kDimensions, Volatile::kNo, /* invalidBackendTex= */ false);
291*c8dee2aaSAndroid Build Coastguard Worker
292*c8dee2aaSAndroid Build Coastguard Worker {
293*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
294*c8dee2aaSAndroid Build Coastguard Worker
295*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0);
296*c8dee2aaSAndroid Build Coastguard Worker check_unfulfilled(testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
297*c8dee2aaSAndroid Build Coastguard Worker reporter);
298*c8dee2aaSAndroid Build Coastguard Worker
299*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
300*c8dee2aaSAndroid Build Coastguard Worker check_unfulfilled(testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
301*c8dee2aaSAndroid Build Coastguard Worker reporter); // NVPIs not fulfilled at snap
302*c8dee2aaSAndroid Build Coastguard Worker
303*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, context->insertRecording({ recording.get() }));
304*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
305*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
306*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 1); // NVPIs fulfilled at insert
307*c8dee2aaSAndroid Build Coastguard Worker }
308*c8dee2aaSAndroid Build Coastguard Worker
309*c8dee2aaSAndroid Build Coastguard Worker context->submit(SyncToCpu::kNo);
310*c8dee2aaSAndroid Build Coastguard Worker // testContext.fImg still has a ref so we should not have called TextureRelease.
311*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
312*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
313*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 1);
314*c8dee2aaSAndroid Build Coastguard Worker
315*c8dee2aaSAndroid Build Coastguard Worker testGpuContext->syncedSubmit(context);
316*c8dee2aaSAndroid Build Coastguard Worker
317*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
318*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
319*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 1);
320*c8dee2aaSAndroid Build Coastguard Worker
321*c8dee2aaSAndroid Build Coastguard Worker // Test that more draws and insertions don't refulfill the NVPI
322*c8dee2aaSAndroid Build Coastguard Worker {
323*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
324*c8dee2aaSAndroid Build Coastguard Worker
325*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0);
326*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0);
327*c8dee2aaSAndroid Build Coastguard Worker
328*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
329*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
330*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
331*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 1); // No new fulfill
332*c8dee2aaSAndroid Build Coastguard Worker
333*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, context->insertRecording({ recording.get() }));
334*c8dee2aaSAndroid Build Coastguard Worker // testContext.fImg should still be fulfilled from the first time we inserted a Recording.
335*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
336*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
337*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 1);
338*c8dee2aaSAndroid Build Coastguard Worker }
339*c8dee2aaSAndroid Build Coastguard Worker
340*c8dee2aaSAndroid Build Coastguard Worker testGpuContext->syncedSubmit(context);
341*c8dee2aaSAndroid Build Coastguard Worker
342*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
343*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 1);
344*c8dee2aaSAndroid Build Coastguard Worker
345*c8dee2aaSAndroid Build Coastguard Worker // Test that dropping the SkImage's ref doesn't change anything
346*c8dee2aaSAndroid Build Coastguard Worker {
347*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
348*c8dee2aaSAndroid Build Coastguard Worker
349*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0);
350*c8dee2aaSAndroid Build Coastguard Worker testContext.fImg.reset();
351*c8dee2aaSAndroid Build Coastguard Worker
352*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
353*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
354*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
355*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 1);
356*c8dee2aaSAndroid Build Coastguard Worker
357*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, context->insertRecording({ recording.get() }));
358*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
359*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
360*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 1);
361*c8dee2aaSAndroid Build Coastguard Worker }
362*c8dee2aaSAndroid Build Coastguard Worker
363*c8dee2aaSAndroid Build Coastguard Worker // fImg's proxy is reffed by the recording so, despite fImg being reset earlier,
364*c8dee2aaSAndroid Build Coastguard Worker // the imageRelease callback doesn't occur until the recording is deleted.
365*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseImageChecker.checkImageReleased(reporter, /* expectedReleaseCnt= */ 1);
366*c8dee2aaSAndroid Build Coastguard Worker
367*c8dee2aaSAndroid Build Coastguard Worker // testContext.fImg no longer holds a ref but the last recording is still not submitted.
368*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
369*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 1);
370*c8dee2aaSAndroid Build Coastguard Worker
371*c8dee2aaSAndroid Build Coastguard Worker testGpuContext->syncedSubmit(context);
372*c8dee2aaSAndroid Build Coastguard Worker
373*c8dee2aaSAndroid Build Coastguard Worker // Now TextureRelease should definitely have been called.
374*c8dee2aaSAndroid Build Coastguard Worker check_all_done(reporter, testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
375*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 1);
376*c8dee2aaSAndroid Build Coastguard Worker }
377*c8dee2aaSAndroid Build Coastguard Worker
DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(NonVolatileGraphiteYUVAPromiseImageFulfillFailureTest,reporter,context,testGpuContext,true,CtsEnforcement::kApiLevel_V)378*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(
379*c8dee2aaSAndroid Build Coastguard Worker NonVolatileGraphiteYUVAPromiseImageFulfillFailureTest,
380*c8dee2aaSAndroid Build Coastguard Worker reporter,
381*c8dee2aaSAndroid Build Coastguard Worker context,
382*c8dee2aaSAndroid Build Coastguard Worker testGpuContext,
383*c8dee2aaSAndroid Build Coastguard Worker true,
384*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kApiLevel_V) {
385*c8dee2aaSAndroid Build Coastguard Worker constexpr SkISize kDimensions { 16, 16 };
386*c8dee2aaSAndroid Build Coastguard Worker
387*c8dee2aaSAndroid Build Coastguard Worker TestCtx testContext;
388*c8dee2aaSAndroid Build Coastguard Worker setup_test_context(context, reporter, &testContext,
389*c8dee2aaSAndroid Build Coastguard Worker kDimensions, Volatile::kNo, /* invalidBackendTex= */ true);
390*c8dee2aaSAndroid Build Coastguard Worker
391*c8dee2aaSAndroid Build Coastguard Worker // Draw the image a few different ways.
392*c8dee2aaSAndroid Build Coastguard Worker {
393*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
394*c8dee2aaSAndroid Build Coastguard Worker
395*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0);
396*c8dee2aaSAndroid Build Coastguard Worker check_unfulfilled(testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
397*c8dee2aaSAndroid Build Coastguard Worker reporter);
398*c8dee2aaSAndroid Build Coastguard Worker
399*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
400*c8dee2aaSAndroid Build Coastguard Worker check_unfulfilled(testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
401*c8dee2aaSAndroid Build Coastguard Worker reporter);
402*c8dee2aaSAndroid Build Coastguard Worker
403*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !context->insertRecording({ recording.get() }));
404*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
405*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
406*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 1);
407*c8dee2aaSAndroid Build Coastguard Worker
408*c8dee2aaSAndroid Build Coastguard Worker // Test that reinserting gives uninstantiated PromiseImages a second chance
409*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !context->insertRecording({ recording.get() }));
410*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
411*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 2);
412*c8dee2aaSAndroid Build Coastguard Worker }
413*c8dee2aaSAndroid Build Coastguard Worker
414*c8dee2aaSAndroid Build Coastguard Worker {
415*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
416*c8dee2aaSAndroid Build Coastguard Worker
417*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
418*c8dee2aaSAndroid Build Coastguard Worker paint.setColorFilter(SkColorFilters::LinearToSRGBGamma());
419*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0, SkSamplingOptions(), &paint);
420*c8dee2aaSAndroid Build Coastguard Worker
421*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
422*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
423*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 2);
424*c8dee2aaSAndroid Build Coastguard Worker
425*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !context->insertRecording({ recording.get() }));
426*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
427*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 3);
428*c8dee2aaSAndroid Build Coastguard Worker }
429*c8dee2aaSAndroid Build Coastguard Worker
430*c8dee2aaSAndroid Build Coastguard Worker {
431*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
432*c8dee2aaSAndroid Build Coastguard Worker
433*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkShader> shader = testContext.fImg->makeShader(SkSamplingOptions());
434*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, shader);
435*c8dee2aaSAndroid Build Coastguard Worker
436*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
437*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(std::move(shader));
438*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(SkRect::MakeWH(1, 1), paint);
439*c8dee2aaSAndroid Build Coastguard Worker
440*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
441*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
442*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 3);
443*c8dee2aaSAndroid Build Coastguard Worker
444*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !context->insertRecording({ recording.get() }));
445*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
446*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 4);
447*c8dee2aaSAndroid Build Coastguard Worker }
448*c8dee2aaSAndroid Build Coastguard Worker
449*c8dee2aaSAndroid Build Coastguard Worker testContext.fSurface.reset();
450*c8dee2aaSAndroid Build Coastguard Worker testContext.fImg.reset();
451*c8dee2aaSAndroid Build Coastguard Worker
452*c8dee2aaSAndroid Build Coastguard Worker // Despite fulfill failing 4x, the imageRelease callback still fires
453*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseImageChecker.checkImageReleased(reporter, /* expectedReleaseCnt= */ 1);
454*c8dee2aaSAndroid Build Coastguard Worker
455*c8dee2aaSAndroid Build Coastguard Worker testGpuContext->syncedSubmit(context);
456*c8dee2aaSAndroid Build Coastguard Worker // fulfill should've been called 4x while release should never have been called
457*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
458*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 4);
459*c8dee2aaSAndroid Build Coastguard Worker }
460*c8dee2aaSAndroid Build Coastguard Worker
DEF_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(NonVolatileGraphiteYUVAPromiseImageCreationFailureTest,reporter,context,CtsEnforcement::kApiLevel_V)461*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(NonVolatileGraphiteYUVAPromiseImageCreationFailureTest,
462*c8dee2aaSAndroid Build Coastguard Worker reporter,
463*c8dee2aaSAndroid Build Coastguard Worker context,
464*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kApiLevel_V) {
465*c8dee2aaSAndroid Build Coastguard Worker // Note: these dimensions are invalid and will cause MakeGraphitePromiseTexture to fail
466*c8dee2aaSAndroid Build Coastguard Worker constexpr SkISize kDimensions { 0, 0 };
467*c8dee2aaSAndroid Build Coastguard Worker
468*c8dee2aaSAndroid Build Coastguard Worker TestCtx testContext;
469*c8dee2aaSAndroid Build Coastguard Worker setup_test_context(context, reporter, &testContext,
470*c8dee2aaSAndroid Build Coastguard Worker kDimensions, Volatile::kNo, /* invalidBackendTex= */ true);
471*c8dee2aaSAndroid Build Coastguard Worker
472*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!testContext.fImg);
473*c8dee2aaSAndroid Build Coastguard Worker
474*c8dee2aaSAndroid Build Coastguard Worker // Despite MakeGraphitePromiseTexture failing, ImageRelease is called
475*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, testContext.fPromiseImageChecker.fImageReleaseCount == 1);
476*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) {
477*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, testContext.fPromiseTextureCheckers[i].fFulfillCount == 0);
478*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, testContext.fPromiseTextureCheckers[i].totalReleaseCount() == 0);
479*c8dee2aaSAndroid Build Coastguard Worker }
480*c8dee2aaSAndroid Build Coastguard Worker }
481*c8dee2aaSAndroid Build Coastguard Worker
DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(VolatileGraphiteYUVAPromiseImageTest,reporter,context,testGpuContext,true,CtsEnforcement::kApiLevel_V)482*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(VolatileGraphiteYUVAPromiseImageTest,
483*c8dee2aaSAndroid Build Coastguard Worker reporter,
484*c8dee2aaSAndroid Build Coastguard Worker context,
485*c8dee2aaSAndroid Build Coastguard Worker testGpuContext,
486*c8dee2aaSAndroid Build Coastguard Worker true,
487*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kApiLevel_V) {
488*c8dee2aaSAndroid Build Coastguard Worker constexpr SkISize kDimensions { 16, 16 };
489*c8dee2aaSAndroid Build Coastguard Worker
490*c8dee2aaSAndroid Build Coastguard Worker TestCtx testContext;
491*c8dee2aaSAndroid Build Coastguard Worker setup_test_context(context, reporter, &testContext,
492*c8dee2aaSAndroid Build Coastguard Worker kDimensions, Volatile::kYes, /* invalidBackendTex= */ false);
493*c8dee2aaSAndroid Build Coastguard Worker
494*c8dee2aaSAndroid Build Coastguard Worker {
495*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
496*c8dee2aaSAndroid Build Coastguard Worker
497*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0);
498*c8dee2aaSAndroid Build Coastguard Worker check_unfulfilled(testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
499*c8dee2aaSAndroid Build Coastguard Worker reporter);
500*c8dee2aaSAndroid Build Coastguard Worker
501*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
502*c8dee2aaSAndroid Build Coastguard Worker // Nothing happens at snap time for VPIs
503*c8dee2aaSAndroid Build Coastguard Worker check_unfulfilled(testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
504*c8dee2aaSAndroid Build Coastguard Worker reporter);
505*c8dee2aaSAndroid Build Coastguard Worker
506*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, context->insertRecording({ recording.get() }));
507*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
508*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
509*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 1); // VPIs fulfilled on insert
510*c8dee2aaSAndroid Build Coastguard Worker
511*c8dee2aaSAndroid Build Coastguard Worker // Test that multiple insertions will clobber prior fulfills
512*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, context->insertRecording({ recording.get() }));
513*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_two(reporter, testContext.fPromiseImageChecker,
514*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
515*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 2);
516*c8dee2aaSAndroid Build Coastguard Worker }
517*c8dee2aaSAndroid Build Coastguard Worker
518*c8dee2aaSAndroid Build Coastguard Worker testGpuContext->syncedSubmit(context);
519*c8dee2aaSAndroid Build Coastguard Worker check_all_done(reporter, testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
520*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 2);
521*c8dee2aaSAndroid Build Coastguard Worker
522*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) {
523*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter,
524*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers[i].fTextureReleaseCounts[0] == 1);
525*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter,
526*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers[i].fTextureReleaseCounts[1] == 1);
527*c8dee2aaSAndroid Build Coastguard Worker }
528*c8dee2aaSAndroid Build Coastguard Worker
529*c8dee2aaSAndroid Build Coastguard Worker {
530*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
531*c8dee2aaSAndroid Build Coastguard Worker
532*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0);
533*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0);
534*c8dee2aaSAndroid Build Coastguard Worker
535*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
536*c8dee2aaSAndroid Build Coastguard Worker // Nothing happens at snap time for volatile images
537*c8dee2aaSAndroid Build Coastguard Worker check_all_done(reporter, testContext.fPromiseImageChecker,
538*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 2);
539*c8dee2aaSAndroid Build Coastguard Worker
540*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, context->insertRecording({ recording.get() }));
541*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
542*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
543*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 3);
544*c8dee2aaSAndroid Build Coastguard Worker
545*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, context->insertRecording({ recording.get() }));
546*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_two(reporter, testContext.fPromiseImageChecker,
547*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
548*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 4);
549*c8dee2aaSAndroid Build Coastguard Worker }
550*c8dee2aaSAndroid Build Coastguard Worker
551*c8dee2aaSAndroid Build Coastguard Worker testGpuContext->syncedSubmit(context);
552*c8dee2aaSAndroid Build Coastguard Worker check_all_done(reporter, testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
553*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 4);
554*c8dee2aaSAndroid Build Coastguard Worker
555*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) {
556*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter,
557*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers[i].fTextureReleaseCounts[0] == 2);
558*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter,
559*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers[i].fTextureReleaseCounts[1] == 2);
560*c8dee2aaSAndroid Build Coastguard Worker }
561*c8dee2aaSAndroid Build Coastguard Worker
562*c8dee2aaSAndroid Build Coastguard Worker {
563*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
564*c8dee2aaSAndroid Build Coastguard Worker
565*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0);
566*c8dee2aaSAndroid Build Coastguard Worker testContext.fImg.reset();
567*c8dee2aaSAndroid Build Coastguard Worker
568*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
569*c8dee2aaSAndroid Build Coastguard Worker // Nothing happens at snap time for volatile images
570*c8dee2aaSAndroid Build Coastguard Worker check_all_done(reporter, testContext.fPromiseImageChecker,
571*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 4);
572*c8dee2aaSAndroid Build Coastguard Worker
573*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, context->insertRecording({ recording.get() }));
574*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_one(reporter, testContext.fPromiseImageChecker,
575*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
576*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 5);
577*c8dee2aaSAndroid Build Coastguard Worker
578*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, context->insertRecording({ recording.get() }));
579*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_two(reporter, testContext.fPromiseImageChecker,
580*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
581*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 6);
582*c8dee2aaSAndroid Build Coastguard Worker }
583*c8dee2aaSAndroid Build Coastguard Worker
584*c8dee2aaSAndroid Build Coastguard Worker // testContext.fImg no longer holds a ref but the last recordings are still not submitted.
585*c8dee2aaSAndroid Build Coastguard Worker check_fulfilled_ahead_by_two(reporter, testContext.fPromiseImageChecker,
586*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
587*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 6);
588*c8dee2aaSAndroid Build Coastguard Worker
589*c8dee2aaSAndroid Build Coastguard Worker testGpuContext->syncedSubmit(context);
590*c8dee2aaSAndroid Build Coastguard Worker
591*c8dee2aaSAndroid Build Coastguard Worker // Now all Releases should definitely have been called.
592*c8dee2aaSAndroid Build Coastguard Worker check_all_done(reporter, testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
593*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 6);
594*c8dee2aaSAndroid Build Coastguard Worker
595*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) {
596*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter,
597*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers[i].fTextureReleaseCounts[0] == 3);
598*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter,
599*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers[i].fTextureReleaseCounts[1] == 3);
600*c8dee2aaSAndroid Build Coastguard Worker }
601*c8dee2aaSAndroid Build Coastguard Worker }
602*c8dee2aaSAndroid Build Coastguard Worker
DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(VolatileGraphiteYUVAPromiseImageFulfillFailureTest,reporter,context,testGpuContext,true,CtsEnforcement::kApiLevel_V)603*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(
604*c8dee2aaSAndroid Build Coastguard Worker VolatileGraphiteYUVAPromiseImageFulfillFailureTest,
605*c8dee2aaSAndroid Build Coastguard Worker reporter,
606*c8dee2aaSAndroid Build Coastguard Worker context,
607*c8dee2aaSAndroid Build Coastguard Worker testGpuContext,
608*c8dee2aaSAndroid Build Coastguard Worker true,
609*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kApiLevel_V) {
610*c8dee2aaSAndroid Build Coastguard Worker constexpr SkISize kDimensions { 16, 16 };
611*c8dee2aaSAndroid Build Coastguard Worker
612*c8dee2aaSAndroid Build Coastguard Worker TestCtx testContext;
613*c8dee2aaSAndroid Build Coastguard Worker setup_test_context(context, reporter, &testContext,
614*c8dee2aaSAndroid Build Coastguard Worker kDimensions, Volatile::kYes, /* invalidBackendTex= */ true);
615*c8dee2aaSAndroid Build Coastguard Worker
616*c8dee2aaSAndroid Build Coastguard Worker // Draw the image a few different ways.
617*c8dee2aaSAndroid Build Coastguard Worker {
618*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
619*c8dee2aaSAndroid Build Coastguard Worker
620*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0);
621*c8dee2aaSAndroid Build Coastguard Worker check_unfulfilled(testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
622*c8dee2aaSAndroid Build Coastguard Worker reporter);
623*c8dee2aaSAndroid Build Coastguard Worker
624*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
625*c8dee2aaSAndroid Build Coastguard Worker check_unfulfilled(testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
626*c8dee2aaSAndroid Build Coastguard Worker reporter);
627*c8dee2aaSAndroid Build Coastguard Worker
628*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !context->insertRecording({ recording.get() }));
629*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
630*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 1);
631*c8dee2aaSAndroid Build Coastguard Worker
632*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !context->insertRecording({ recording.get() }));
633*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
634*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 2);
635*c8dee2aaSAndroid Build Coastguard Worker }
636*c8dee2aaSAndroid Build Coastguard Worker
637*c8dee2aaSAndroid Build Coastguard Worker {
638*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
639*c8dee2aaSAndroid Build Coastguard Worker
640*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
641*c8dee2aaSAndroid Build Coastguard Worker paint.setColorFilter(SkColorFilters::LinearToSRGBGamma());
642*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0, SkSamplingOptions(), &paint);
643*c8dee2aaSAndroid Build Coastguard Worker
644*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
645*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
646*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 2);
647*c8dee2aaSAndroid Build Coastguard Worker
648*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !context->insertRecording({ recording.get() }));
649*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
650*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 3);
651*c8dee2aaSAndroid Build Coastguard Worker
652*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !context->insertRecording({ recording.get() }));
653*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
654*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 4);
655*c8dee2aaSAndroid Build Coastguard Worker }
656*c8dee2aaSAndroid Build Coastguard Worker
657*c8dee2aaSAndroid Build Coastguard Worker {
658*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
659*c8dee2aaSAndroid Build Coastguard Worker
660*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkShader> shader = testContext.fImg->makeShader(SkSamplingOptions());
661*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, shader);
662*c8dee2aaSAndroid Build Coastguard Worker
663*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
664*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(std::move(shader));
665*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(SkRect::MakeWH(1, 1), paint);
666*c8dee2aaSAndroid Build Coastguard Worker
667*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
668*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
669*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 4);
670*c8dee2aaSAndroid Build Coastguard Worker
671*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !context->insertRecording({ recording.get() }));
672*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
673*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 5);
674*c8dee2aaSAndroid Build Coastguard Worker
675*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !context->insertRecording({ recording.get() }));
676*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
677*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 6);
678*c8dee2aaSAndroid Build Coastguard Worker }
679*c8dee2aaSAndroid Build Coastguard Worker
680*c8dee2aaSAndroid Build Coastguard Worker testContext.fSurface.reset();
681*c8dee2aaSAndroid Build Coastguard Worker testContext.fImg.reset();
682*c8dee2aaSAndroid Build Coastguard Worker
683*c8dee2aaSAndroid Build Coastguard Worker testGpuContext->syncedSubmit(context);
684*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
685*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 6);
686*c8dee2aaSAndroid Build Coastguard Worker }
687*c8dee2aaSAndroid Build Coastguard Worker
688*c8dee2aaSAndroid Build Coastguard Worker // Test out dropping the Recorder prior to inserting the Recording
DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(GraphiteYUVAPromiseImageRecorderLoss,reporter,context,testGpuContext,true,CtsEnforcement::kApiLevel_V)689*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(GraphiteYUVAPromiseImageRecorderLoss,
690*c8dee2aaSAndroid Build Coastguard Worker reporter,
691*c8dee2aaSAndroid Build Coastguard Worker context,
692*c8dee2aaSAndroid Build Coastguard Worker testGpuContext,
693*c8dee2aaSAndroid Build Coastguard Worker true,
694*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kApiLevel_V) {
695*c8dee2aaSAndroid Build Coastguard Worker constexpr SkISize kDimensions{ 16, 16 };
696*c8dee2aaSAndroid Build Coastguard Worker
697*c8dee2aaSAndroid Build Coastguard Worker for (Volatile isVolatile : { Volatile::kNo, Volatile::kYes }) {
698*c8dee2aaSAndroid Build Coastguard Worker TestCtx testContext;
699*c8dee2aaSAndroid Build Coastguard Worker setup_test_context(context, reporter, &testContext,
700*c8dee2aaSAndroid Build Coastguard Worker kDimensions, isVolatile, /* invalidBackendTex= */ false);
701*c8dee2aaSAndroid Build Coastguard Worker
702*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
703*c8dee2aaSAndroid Build Coastguard Worker
704*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0);
705*c8dee2aaSAndroid Build Coastguard Worker check_unfulfilled(testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
706*c8dee2aaSAndroid Build Coastguard Worker reporter);
707*c8dee2aaSAndroid Build Coastguard Worker
708*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recording = testContext.fRecorder->snap();
709*c8dee2aaSAndroid Build Coastguard Worker check_unfulfilled(testContext.fPromiseImageChecker, testContext.fPromiseTextureCheckers,
710*c8dee2aaSAndroid Build Coastguard Worker reporter);
711*c8dee2aaSAndroid Build Coastguard Worker
712*c8dee2aaSAndroid Build Coastguard Worker testContext.fRecorder.reset(); // Recorder drop
713*c8dee2aaSAndroid Build Coastguard Worker
714*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, context->insertRecording({ recording.get() }));
715*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
716*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 1);
717*c8dee2aaSAndroid Build Coastguard Worker
718*c8dee2aaSAndroid Build Coastguard Worker testGpuContext->syncedSubmit(context);
719*c8dee2aaSAndroid Build Coastguard Worker
720*c8dee2aaSAndroid Build Coastguard Worker testContext.fSurface.reset();
721*c8dee2aaSAndroid Build Coastguard Worker testContext.fImg.reset();
722*c8dee2aaSAndroid Build Coastguard Worker recording.reset();
723*c8dee2aaSAndroid Build Coastguard Worker
724*c8dee2aaSAndroid Build Coastguard Worker check_all_done(reporter, testContext.fPromiseImageChecker,
725*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 1);
726*c8dee2aaSAndroid Build Coastguard Worker }
727*c8dee2aaSAndroid Build Coastguard Worker }
728*c8dee2aaSAndroid Build Coastguard Worker
729*c8dee2aaSAndroid Build Coastguard Worker // Test out PromiseImages appearing in multiple Recordings. In particular, test that
730*c8dee2aaSAndroid Build Coastguard Worker // previous instantiations don't impact the Recording's collection of PromiseImages.
DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(GraphiteYUVAPromiseImageMultipleImgUses,reporter,context,testGpuContext,true,CtsEnforcement::kApiLevel_V)731*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(GraphiteYUVAPromiseImageMultipleImgUses,
732*c8dee2aaSAndroid Build Coastguard Worker reporter,
733*c8dee2aaSAndroid Build Coastguard Worker context,
734*c8dee2aaSAndroid Build Coastguard Worker testGpuContext,
735*c8dee2aaSAndroid Build Coastguard Worker true,
736*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kApiLevel_V) {
737*c8dee2aaSAndroid Build Coastguard Worker constexpr SkISize kDimensions{ 16, 16 };
738*c8dee2aaSAndroid Build Coastguard Worker
739*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kNumRecordings = 3;
740*c8dee2aaSAndroid Build Coastguard Worker
741*c8dee2aaSAndroid Build Coastguard Worker for (Volatile isVolatile : { Volatile::kNo, Volatile::kYes }) {
742*c8dee2aaSAndroid Build Coastguard Worker int expectedVolatile = (isVolatile == Volatile::kYes) ? 4 : 0;
743*c8dee2aaSAndroid Build Coastguard Worker int expectedNonVolatile = 4 - expectedVolatile;
744*c8dee2aaSAndroid Build Coastguard Worker
745*c8dee2aaSAndroid Build Coastguard Worker TestCtx testContext;
746*c8dee2aaSAndroid Build Coastguard Worker setup_test_context(context, reporter, &testContext,
747*c8dee2aaSAndroid Build Coastguard Worker kDimensions, isVolatile, /* invalidBackendTex= */ false);
748*c8dee2aaSAndroid Build Coastguard Worker
749*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Recording> recordings[kNumRecordings];
750*c8dee2aaSAndroid Build Coastguard Worker
751*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = testContext.fSurface->getCanvas();
752*c8dee2aaSAndroid Build Coastguard Worker
753*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kNumRecordings; ++i) {
754*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(testContext.fImg, 0, 0);
755*c8dee2aaSAndroid Build Coastguard Worker
756*c8dee2aaSAndroid Build Coastguard Worker recordings[i] = testContext.fRecorder->snap();
757*c8dee2aaSAndroid Build Coastguard Worker
758*c8dee2aaSAndroid Build Coastguard Worker if (isVolatile == Volatile::kYes) {
759*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
760*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
761*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ i);
762*c8dee2aaSAndroid Build Coastguard Worker } else {
763*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
764*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
765*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ i > 0 ? 1 : 0);
766*c8dee2aaSAndroid Build Coastguard Worker }
767*c8dee2aaSAndroid Build Coastguard Worker
768*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter,
769*c8dee2aaSAndroid Build Coastguard Worker recordings[i]->priv().numVolatilePromiseImages() == expectedVolatile);
770*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter,
771*c8dee2aaSAndroid Build Coastguard Worker recordings[i]->priv().numNonVolatilePromiseImages() ==
772*c8dee2aaSAndroid Build Coastguard Worker expectedNonVolatile);
773*c8dee2aaSAndroid Build Coastguard Worker
774*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, context->insertRecording({ recordings[i].get() }));
775*c8dee2aaSAndroid Build Coastguard Worker
776*c8dee2aaSAndroid Build Coastguard Worker if (isVolatile == Volatile::kYes) {
777*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
778*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
779*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ i+1);
780*c8dee2aaSAndroid Build Coastguard Worker } else {
781*c8dee2aaSAndroid Build Coastguard Worker check_fulfills_only(reporter, testContext.fPromiseImageChecker,
782*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
783*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ 1);
784*c8dee2aaSAndroid Build Coastguard Worker }
785*c8dee2aaSAndroid Build Coastguard Worker
786*c8dee2aaSAndroid Build Coastguard Worker // Non-volatiles are cleared out after a successful insertion
787*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, recordings[i]->priv().numNonVolatilePromiseImages() == 0);
788*c8dee2aaSAndroid Build Coastguard Worker }
789*c8dee2aaSAndroid Build Coastguard Worker
790*c8dee2aaSAndroid Build Coastguard Worker testGpuContext->syncedSubmit(context);
791*c8dee2aaSAndroid Build Coastguard Worker
792*c8dee2aaSAndroid Build Coastguard Worker testContext.fSurface.reset();
793*c8dee2aaSAndroid Build Coastguard Worker testContext.fImg.reset();
794*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kNumRecordings; ++i) {
795*c8dee2aaSAndroid Build Coastguard Worker recordings[i].reset();
796*c8dee2aaSAndroid Build Coastguard Worker }
797*c8dee2aaSAndroid Build Coastguard Worker
798*c8dee2aaSAndroid Build Coastguard Worker if (isVolatile == Volatile::kYes) {
799*c8dee2aaSAndroid Build Coastguard Worker check_all_done(reporter, testContext.fPromiseImageChecker,
800*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers,
801*c8dee2aaSAndroid Build Coastguard Worker /* expectedFulfillCnt= */ kNumRecordings);
802*c8dee2aaSAndroid Build Coastguard Worker } else {
803*c8dee2aaSAndroid Build Coastguard Worker check_all_done(reporter, testContext.fPromiseImageChecker,
804*c8dee2aaSAndroid Build Coastguard Worker testContext.fPromiseTextureCheckers, /* expectedFulfillCnt= */ 1);
805*c8dee2aaSAndroid Build Coastguard Worker }
806*c8dee2aaSAndroid Build Coastguard Worker }
807*c8dee2aaSAndroid Build Coastguard Worker }
808