xref: /aosp_15_r20/external/skia/tools/DDLPromiseImageHelper.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2018 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef PromiseImageHelper_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define PromiseImageHelper_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkYUVAPixmaps.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/chromium/GrPromiseImageTexture.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkTLazy.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkCachedData.h"
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker class GrContextThreadSafeProxy;
21*c8dee2aaSAndroid Build Coastguard Worker class GrDirectContext;
22*c8dee2aaSAndroid Build Coastguard Worker class SkImage;
23*c8dee2aaSAndroid Build Coastguard Worker class SkMipmap;
24*c8dee2aaSAndroid Build Coastguard Worker class SkPicture;
25*c8dee2aaSAndroid Build Coastguard Worker class SkTaskGroup;
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker // This class acts as a proxy for a GrBackendTexture that backs an image.
28*c8dee2aaSAndroid Build Coastguard Worker // Whenever a promise image is created for the image, the promise image receives a ref to
29*c8dee2aaSAndroid Build Coastguard Worker // potentially several of these objects. Once all the promise images receive their done
30*c8dee2aaSAndroid Build Coastguard Worker // callbacks this object is deleted - removing the GrBackendTexture from VRAM.
31*c8dee2aaSAndroid Build Coastguard Worker // Note that while the DDLs are being created in the threads, the PromiseImageHelper holds
32*c8dee2aaSAndroid Build Coastguard Worker // a ref on all the PromiseImageCallbackContexts. However, once all the threads are done
33*c8dee2aaSAndroid Build Coastguard Worker // it drops all of its refs (via "reset").
34*c8dee2aaSAndroid Build Coastguard Worker class PromiseImageCallbackContext : public SkRefCnt {
35*c8dee2aaSAndroid Build Coastguard Worker public:
PromiseImageCallbackContext(GrDirectContext * direct,GrBackendFormat backendFormat)36*c8dee2aaSAndroid Build Coastguard Worker     PromiseImageCallbackContext(GrDirectContext* direct, GrBackendFormat backendFormat)
37*c8dee2aaSAndroid Build Coastguard Worker             : fContext(direct)
38*c8dee2aaSAndroid Build Coastguard Worker             , fBackendFormat(backendFormat) {}
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker     ~PromiseImageCallbackContext() override;
41*c8dee2aaSAndroid Build Coastguard Worker 
backendFormat()42*c8dee2aaSAndroid Build Coastguard Worker     const GrBackendFormat& backendFormat() const { return fBackendFormat; }
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     void setBackendTexture(const GrBackendTexture& backendTexture);
45*c8dee2aaSAndroid Build Coastguard Worker 
46*c8dee2aaSAndroid Build Coastguard Worker     void destroyBackendTexture();
47*c8dee2aaSAndroid Build Coastguard Worker 
fulfill()48*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrPromiseImageTexture> fulfill() {
49*c8dee2aaSAndroid Build Coastguard Worker         ++fTotalFulfills;
50*c8dee2aaSAndroid Build Coastguard Worker         return fPromiseImageTexture;
51*c8dee2aaSAndroid Build Coastguard Worker     }
52*c8dee2aaSAndroid Build Coastguard Worker 
release()53*c8dee2aaSAndroid Build Coastguard Worker     void release() {
54*c8dee2aaSAndroid Build Coastguard Worker         ++fDoneCnt;
55*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fDoneCnt <= fNumImages);
56*c8dee2aaSAndroid Build Coastguard Worker     }
57*c8dee2aaSAndroid Build Coastguard Worker 
wasAddedToImage()58*c8dee2aaSAndroid Build Coastguard Worker     void wasAddedToImage() { fNumImages++; }
59*c8dee2aaSAndroid Build Coastguard Worker 
promiseImageTexture()60*c8dee2aaSAndroid Build Coastguard Worker     const GrPromiseImageTexture* promiseImageTexture() const {
61*c8dee2aaSAndroid Build Coastguard Worker         return fPromiseImageTexture.get();
62*c8dee2aaSAndroid Build Coastguard Worker     }
63*c8dee2aaSAndroid Build Coastguard Worker 
PromiseImageFulfillProc(void * textureContext)64*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<GrPromiseImageTexture> PromiseImageFulfillProc(void* textureContext) {
65*c8dee2aaSAndroid Build Coastguard Worker         auto callbackContext = static_cast<PromiseImageCallbackContext*>(textureContext);
66*c8dee2aaSAndroid Build Coastguard Worker         return callbackContext->fulfill();
67*c8dee2aaSAndroid Build Coastguard Worker     }
68*c8dee2aaSAndroid Build Coastguard Worker 
PromiseImageReleaseProc(void * textureContext)69*c8dee2aaSAndroid Build Coastguard Worker     static void PromiseImageReleaseProc(void* textureContext) {
70*c8dee2aaSAndroid Build Coastguard Worker         auto callbackContext = static_cast<PromiseImageCallbackContext*>(textureContext);
71*c8dee2aaSAndroid Build Coastguard Worker         callbackContext->release();
72*c8dee2aaSAndroid Build Coastguard Worker         callbackContext->unref();
73*c8dee2aaSAndroid Build Coastguard Worker     }
74*c8dee2aaSAndroid Build Coastguard Worker 
75*c8dee2aaSAndroid Build Coastguard Worker private:
76*c8dee2aaSAndroid Build Coastguard Worker     GrDirectContext*             fContext;
77*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat              fBackendFormat;
78*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrPromiseImageTexture> fPromiseImageTexture;
79*c8dee2aaSAndroid Build Coastguard Worker     int                          fNumImages = 0;
80*c8dee2aaSAndroid Build Coastguard Worker     int                          fTotalFulfills = 0;
81*c8dee2aaSAndroid Build Coastguard Worker     int                          fDoneCnt = 0;
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkRefCnt;
84*c8dee2aaSAndroid Build Coastguard Worker };
85*c8dee2aaSAndroid Build Coastguard Worker 
86*c8dee2aaSAndroid Build Coastguard Worker // This class consolidates tracking & extraction of the original image data from an skp,
87*c8dee2aaSAndroid Build Coastguard Worker // the upload of said data to the GPU and the fulfillment of promise images.
88*c8dee2aaSAndroid Build Coastguard Worker //
89*c8dee2aaSAndroid Build Coastguard Worker // The way this works is:
90*c8dee2aaSAndroid Build Coastguard Worker //    the original skp is converted to SkData and all its image info is extracted into this
91*c8dee2aaSAndroid Build Coastguard Worker //       class and only indices into this class are left in the SkData
92*c8dee2aaSAndroid Build Coastguard Worker //    the PromiseImageCallbackContexts are created for each image
93*c8dee2aaSAndroid Build Coastguard Worker //    the SkData is then reinflated into an SkPicture with promise images replacing all the indices
94*c8dee2aaSAndroid Build Coastguard Worker //       (all in recreateSKP)
95*c8dee2aaSAndroid Build Coastguard Worker //
96*c8dee2aaSAndroid Build Coastguard Worker //    Prior to replaying in threads, all the images are uploaded to the gpu
97*c8dee2aaSAndroid Build Coastguard Worker //       (in uploadAllToGPU)
98*c8dee2aaSAndroid Build Coastguard Worker //
99*c8dee2aaSAndroid Build Coastguard Worker //    This class is then reset - dropping all of its refs on the PromiseImageCallbackContexts
100*c8dee2aaSAndroid Build Coastguard Worker //
101*c8dee2aaSAndroid Build Coastguard Worker //    Each done callback unrefs its PromiseImageCallbackContext so, once all the promise images
102*c8dee2aaSAndroid Build Coastguard Worker //       are done, the PromiseImageCallbackContext is freed and its GrBackendTexture removed
103*c8dee2aaSAndroid Build Coastguard Worker //       from VRAM
104*c8dee2aaSAndroid Build Coastguard Worker //
105*c8dee2aaSAndroid Build Coastguard Worker // Note: if DDLs are going to be replayed multiple times, the reset call can be delayed until
106*c8dee2aaSAndroid Build Coastguard Worker // all the replaying is complete. This will pin the GrBackendTextures in VRAM.
107*c8dee2aaSAndroid Build Coastguard Worker class DDLPromiseImageHelper {
108*c8dee2aaSAndroid Build Coastguard Worker public:
DDLPromiseImageHelper(const SkYUVAPixmapInfo::SupportedDataTypes & supportedYUVADataTypes)109*c8dee2aaSAndroid Build Coastguard Worker     DDLPromiseImageHelper(const SkYUVAPixmapInfo::SupportedDataTypes& supportedYUVADataTypes)
110*c8dee2aaSAndroid Build Coastguard Worker             : fSupportedYUVADataTypes(supportedYUVADataTypes) {}
111*c8dee2aaSAndroid Build Coastguard Worker     ~DDLPromiseImageHelper() = default;
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker     // Convert the input SkPicture into a new one which has promise images rather than live
114*c8dee2aaSAndroid Build Coastguard Worker     // images.
115*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkPicture> recreateSKP(GrDirectContext*, SkPicture*);
116*c8dee2aaSAndroid Build Coastguard Worker 
117*c8dee2aaSAndroid Build Coastguard Worker     void uploadAllToGPU(SkTaskGroup*, GrDirectContext*);
118*c8dee2aaSAndroid Build Coastguard Worker     void deleteAllFromGPU(SkTaskGroup*, GrDirectContext*);
119*c8dee2aaSAndroid Build Coastguard Worker 
120*c8dee2aaSAndroid Build Coastguard Worker     // Remove this class' refs on the promise images and the PromiseImageCallbackContexts
reset()121*c8dee2aaSAndroid Build Coastguard Worker     void reset() {
122*c8dee2aaSAndroid Build Coastguard Worker         fImageInfo.clear();
123*c8dee2aaSAndroid Build Coastguard Worker         fPromiseImages.clear();
124*c8dee2aaSAndroid Build Coastguard Worker     }
125*c8dee2aaSAndroid Build Coastguard Worker 
126*c8dee2aaSAndroid Build Coastguard Worker private:
127*c8dee2aaSAndroid Build Coastguard Worker     void createCallbackContexts(GrDirectContext*);
128*c8dee2aaSAndroid Build Coastguard Worker     // reinflate a deflated SKP, replacing all the indices with promise images.
129*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkPicture> reinflateSKP(sk_sp<GrContextThreadSafeProxy>, SkData* deflatedSKP);
130*c8dee2aaSAndroid Build Coastguard Worker 
131*c8dee2aaSAndroid Build Coastguard Worker     // This is the information extracted into this class from the parsing of the skp file.
132*c8dee2aaSAndroid Build Coastguard Worker     // Once it has all been uploaded to the GPU and distributed to the promise images, it
133*c8dee2aaSAndroid Build Coastguard Worker     // is all dropped via "reset".
134*c8dee2aaSAndroid Build Coastguard Worker     class PromiseImageInfo {
135*c8dee2aaSAndroid Build Coastguard Worker     public:
136*c8dee2aaSAndroid Build Coastguard Worker         PromiseImageInfo(int index, uint32_t originalUniqueID, const SkImageInfo& ii);
137*c8dee2aaSAndroid Build Coastguard Worker         PromiseImageInfo(PromiseImageInfo&& other);
138*c8dee2aaSAndroid Build Coastguard Worker         ~PromiseImageInfo();
139*c8dee2aaSAndroid Build Coastguard Worker 
index()140*c8dee2aaSAndroid Build Coastguard Worker         int index() const { return fIndex; }
originalUniqueID()141*c8dee2aaSAndroid Build Coastguard Worker         uint32_t originalUniqueID() const { return fOriginalUniqueID; }
isYUV()142*c8dee2aaSAndroid Build Coastguard Worker         bool isYUV() const { return fYUVAPixmaps.isValid(); }
143*c8dee2aaSAndroid Build Coastguard Worker 
overallDimensions()144*c8dee2aaSAndroid Build Coastguard Worker         SkISize overallDimensions() const { return fImageInfo.dimensions(); }
overallColorType()145*c8dee2aaSAndroid Build Coastguard Worker         SkColorType overallColorType() const { return fImageInfo.colorType(); }
overallAlphaType()146*c8dee2aaSAndroid Build Coastguard Worker         SkAlphaType overallAlphaType() const { return fImageInfo.alphaType(); }
refOverallColorSpace()147*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<SkColorSpace> refOverallColorSpace() const { return fImageInfo.refColorSpace(); }
148*c8dee2aaSAndroid Build Coastguard Worker 
yuvaInfo()149*c8dee2aaSAndroid Build Coastguard Worker         const SkYUVAInfo& yuvaInfo() const { return fYUVAPixmaps.yuvaInfo(); }
150*c8dee2aaSAndroid Build Coastguard Worker 
yuvPixmap(int index)151*c8dee2aaSAndroid Build Coastguard Worker         const SkPixmap& yuvPixmap(int index) const {
152*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(this->isYUV());
153*c8dee2aaSAndroid Build Coastguard Worker             return fYUVAPixmaps.planes()[index];
154*c8dee2aaSAndroid Build Coastguard Worker         }
155*c8dee2aaSAndroid Build Coastguard Worker 
baseLevel()156*c8dee2aaSAndroid Build Coastguard Worker         const SkBitmap& baseLevel() const {
157*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(!this->isYUV());
158*c8dee2aaSAndroid Build Coastguard Worker             return fBaseLevel;
159*c8dee2aaSAndroid Build Coastguard Worker         }
160*c8dee2aaSAndroid Build Coastguard Worker         // This returns an array of all the available mipLevels - suitable for passing into
161*c8dee2aaSAndroid Build Coastguard Worker         // createBackendTexture.
162*c8dee2aaSAndroid Build Coastguard Worker         std::unique_ptr<SkPixmap[]> normalMipLevels() const;
163*c8dee2aaSAndroid Build Coastguard Worker         int numMipLevels() const;
164*c8dee2aaSAndroid Build Coastguard Worker 
setCallbackContext(int index,sk_sp<PromiseImageCallbackContext> callbackContext)165*c8dee2aaSAndroid Build Coastguard Worker         void setCallbackContext(int index, sk_sp<PromiseImageCallbackContext> callbackContext) {
166*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(index >= 0 && index < (this->isYUV() ? SkYUVAInfo::kMaxPlanes : 1));
167*c8dee2aaSAndroid Build Coastguard Worker             fCallbackContexts[index] = callbackContext;
168*c8dee2aaSAndroid Build Coastguard Worker         }
callbackContext(int index)169*c8dee2aaSAndroid Build Coastguard Worker         PromiseImageCallbackContext* callbackContext(int index) const {
170*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(index >= 0 && index < (this->isYUV() ? SkYUVAInfo::kMaxPlanes : 1));
171*c8dee2aaSAndroid Build Coastguard Worker             return fCallbackContexts[index].get();
172*c8dee2aaSAndroid Build Coastguard Worker         }
refCallbackContext(int index)173*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<PromiseImageCallbackContext> refCallbackContext(int index) const {
174*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(index >= 0 && index < (this->isYUV() ? SkYUVAInfo::kMaxPlanes : 1));
175*c8dee2aaSAndroid Build Coastguard Worker             return fCallbackContexts[index];
176*c8dee2aaSAndroid Build Coastguard Worker         }
177*c8dee2aaSAndroid Build Coastguard Worker 
mipmapped(int index)178*c8dee2aaSAndroid Build Coastguard Worker         skgpu::Mipmapped mipmapped(int index) const {
179*c8dee2aaSAndroid Build Coastguard Worker             if (this->isYUV()) {
180*c8dee2aaSAndroid Build Coastguard Worker                 return skgpu::Mipmapped::kNo;
181*c8dee2aaSAndroid Build Coastguard Worker             }
182*c8dee2aaSAndroid Build Coastguard Worker             return fMipLevels ? skgpu::Mipmapped::kYes : skgpu::Mipmapped::kNo;
183*c8dee2aaSAndroid Build Coastguard Worker         }
backendFormat(int index)184*c8dee2aaSAndroid Build Coastguard Worker         const GrBackendFormat& backendFormat(int index) const {
185*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(index >= 0 && index < (this->isYUV() ? SkYUVAInfo::kMaxPlanes : 1));
186*c8dee2aaSAndroid Build Coastguard Worker             return fCallbackContexts[index]->backendFormat();
187*c8dee2aaSAndroid Build Coastguard Worker         }
promiseTexture(int index)188*c8dee2aaSAndroid Build Coastguard Worker         const GrPromiseImageTexture* promiseTexture(int index) const {
189*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(index >= 0 && index < (this->isYUV() ? SkYUVAInfo::kMaxPlanes : 1));
190*c8dee2aaSAndroid Build Coastguard Worker             return fCallbackContexts[index]->promiseImageTexture();
191*c8dee2aaSAndroid Build Coastguard Worker         }
192*c8dee2aaSAndroid Build Coastguard Worker 
193*c8dee2aaSAndroid Build Coastguard Worker         void setMipLevels(const SkBitmap& baseLevel, std::unique_ptr<SkMipmap> mipLevels);
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker         /** Takes ownership of the plane data. */
setYUVPlanes(SkYUVAPixmaps yuvaPixmaps)196*c8dee2aaSAndroid Build Coastguard Worker         void setYUVPlanes(SkYUVAPixmaps yuvaPixmaps) { fYUVAPixmaps = std::move(yuvaPixmaps); }
197*c8dee2aaSAndroid Build Coastguard Worker 
198*c8dee2aaSAndroid Build Coastguard Worker     private:
199*c8dee2aaSAndroid Build Coastguard Worker         const int                          fIndex;                // index in the 'fImageInfo' array
200*c8dee2aaSAndroid Build Coastguard Worker         const uint32_t                     fOriginalUniqueID;     // original ID for deduping
201*c8dee2aaSAndroid Build Coastguard Worker 
202*c8dee2aaSAndroid Build Coastguard Worker         const SkImageInfo                  fImageInfo;            // info for the overarching image
203*c8dee2aaSAndroid Build Coastguard Worker 
204*c8dee2aaSAndroid Build Coastguard Worker         // CPU-side cache of a normal SkImage's mipmap levels
205*c8dee2aaSAndroid Build Coastguard Worker         SkBitmap                           fBaseLevel;
206*c8dee2aaSAndroid Build Coastguard Worker         std::unique_ptr<SkMipmap>          fMipLevels;
207*c8dee2aaSAndroid Build Coastguard Worker 
208*c8dee2aaSAndroid Build Coastguard Worker         // CPU-side cache of a YUV SkImage's contents
209*c8dee2aaSAndroid Build Coastguard Worker         SkYUVAPixmaps                      fYUVAPixmaps;
210*c8dee2aaSAndroid Build Coastguard Worker 
211*c8dee2aaSAndroid Build Coastguard Worker         // Up to SkYUVASizeInfo::kMaxCount for a YUVA image. Only one for a normal image.
212*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<PromiseImageCallbackContext> fCallbackContexts[SkYUVAInfo::kMaxPlanes];
213*c8dee2aaSAndroid Build Coastguard Worker     };
214*c8dee2aaSAndroid Build Coastguard Worker 
215*c8dee2aaSAndroid Build Coastguard Worker     struct DeserialImageProcContext {
216*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<GrContextThreadSafeProxy> fThreadSafeProxy;
217*c8dee2aaSAndroid Build Coastguard Worker         DDLPromiseImageHelper*          fHelper;
218*c8dee2aaSAndroid Build Coastguard Worker     };
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker     static void CreateBETexturesForPromiseImage(GrDirectContext*, PromiseImageInfo*);
221*c8dee2aaSAndroid Build Coastguard Worker     static void DeleteBETexturesForPromiseImage(PromiseImageInfo*);
222*c8dee2aaSAndroid Build Coastguard Worker 
223*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkImage> CreatePromiseImages(const void* rawData, size_t length, void* ctxIn);
224*c8dee2aaSAndroid Build Coastguard Worker 
isValidID(int id)225*c8dee2aaSAndroid Build Coastguard Worker     bool isValidID(int id) const { return id >= 0 && id < fImageInfo.size(); }
getInfo(int id)226*c8dee2aaSAndroid Build Coastguard Worker     const PromiseImageInfo& getInfo(int id) const { return fImageInfo[id]; }
227*c8dee2aaSAndroid Build Coastguard Worker     void uploadImage(GrDirectContext*, PromiseImageInfo*);
228*c8dee2aaSAndroid Build Coastguard Worker 
229*c8dee2aaSAndroid Build Coastguard Worker     // returns -1 if not found
230*c8dee2aaSAndroid Build Coastguard Worker     int findImage(SkImage* image) const;
231*c8dee2aaSAndroid Build Coastguard Worker 
232*c8dee2aaSAndroid Build Coastguard Worker     // returns -1 on failure
233*c8dee2aaSAndroid Build Coastguard Worker     int addImage(SkImage* image);
234*c8dee2aaSAndroid Build Coastguard Worker 
235*c8dee2aaSAndroid Build Coastguard Worker     // returns -1 on failure
236*c8dee2aaSAndroid Build Coastguard Worker     int findOrDefineImage(SkImage* image);
237*c8dee2aaSAndroid Build Coastguard Worker 
238*c8dee2aaSAndroid Build Coastguard Worker     SkYUVAPixmapInfo::SupportedDataTypes   fSupportedYUVADataTypes;
239*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<PromiseImageInfo> fImageInfo;
240*c8dee2aaSAndroid Build Coastguard Worker 
241*c8dee2aaSAndroid Build Coastguard Worker     // TODO: review the use of 'fPromiseImages' - it doesn't seem useful/necessary
242*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<sk_sp<SkImage>>   fPromiseImages;    // All the promise images in the
243*c8dee2aaSAndroid Build Coastguard Worker                                                             // reconstituted picture
244*c8dee2aaSAndroid Build Coastguard Worker };
245*c8dee2aaSAndroid Build Coastguard Worker 
246*c8dee2aaSAndroid Build Coastguard Worker #endif
247