xref: /aosp_15_r20/external/skia/tests/graphite/GraphiteYUVAPromiseImageTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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