xref: /aosp_15_r20/external/skia/tools/gpu/ManagedBackendTexture.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2020 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 #ifndef ManagedBackendTexture_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define ManagedBackendTexture_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkYUVAInfo.h"
13*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_GANESH
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
16*c8dee2aaSAndroid Build Coastguard Worker #endif
17*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_GRAPHITE
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/BackendTexture.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Context.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/RecorderPriv.h"
21*c8dee2aaSAndroid Build Coastguard Worker #endif
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu {
24*c8dee2aaSAndroid Build Coastguard Worker class RefCntedCallback;
25*c8dee2aaSAndroid Build Coastguard Worker }
26*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
27*c8dee2aaSAndroid Build Coastguard Worker class Recorder;
28*c8dee2aaSAndroid Build Coastguard Worker }
29*c8dee2aaSAndroid Build Coastguard Worker class SkBitmap;
30*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo;
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_GRAPHITE
33*c8dee2aaSAndroid Build Coastguard Worker using Recorder = skgpu::graphite::Recorder;
34*c8dee2aaSAndroid Build Coastguard Worker #endif
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker namespace sk_gpu_test {
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_GANESH
39*c8dee2aaSAndroid Build Coastguard Worker class ManagedBackendTexture : public SkNVRefCnt<ManagedBackendTexture> {
40*c8dee2aaSAndroid Build Coastguard Worker public:
41*c8dee2aaSAndroid Build Coastguard Worker     /**
42*c8dee2aaSAndroid Build Coastguard Worker      * Make a managed backend texture with initial pixmap/color data. The 'Args' are any valid set
43*c8dee2aaSAndroid Build Coastguard Worker      * of arguments to GrDirectContext::createBackendTexture that takes data but with the release
44*c8dee2aaSAndroid Build Coastguard Worker      * proc/context omitted as the ManagedBackendTexture will provide them.
45*c8dee2aaSAndroid Build Coastguard Worker      */
46*c8dee2aaSAndroid Build Coastguard Worker     template <typename... Args>
47*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<ManagedBackendTexture> MakeWithData(GrDirectContext*, Args&&...);
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker     /**
50*c8dee2aaSAndroid Build Coastguard Worker      * Make a managed backend texture without initial data. The 'Args' are any valid set of
51*c8dee2aaSAndroid Build Coastguard Worker      * arguments to GrDirectContext::createBackendTexture that does not take data. Because our
52*c8dee2aaSAndroid Build Coastguard Worker      * createBackendTexture methods that *do* take data also use default args for the proc/context
53*c8dee2aaSAndroid Build Coastguard Worker      * this can be used to make a texture with data but then the MBET won't be able to ensure that
54*c8dee2aaSAndroid Build Coastguard Worker      * the upload has completed before the texture is deleted. Use the WithData variant instead to
55*c8dee2aaSAndroid Build Coastguard Worker      * avoid this issue.
56*c8dee2aaSAndroid Build Coastguard Worker      */
57*c8dee2aaSAndroid Build Coastguard Worker     template <typename... Args>
58*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<ManagedBackendTexture> MakeWithoutData(GrDirectContext*, Args&&...);
59*c8dee2aaSAndroid Build Coastguard Worker 
60*c8dee2aaSAndroid Build Coastguard Worker 
61*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<ManagedBackendTexture> MakeFromInfo(GrDirectContext* dContext,
62*c8dee2aaSAndroid Build Coastguard Worker                                                      const SkImageInfo&,
63*c8dee2aaSAndroid Build Coastguard Worker                                                      skgpu::Mipmapped = skgpu::Mipmapped::kNo,
64*c8dee2aaSAndroid Build Coastguard Worker                                                      skgpu::Renderable = skgpu::Renderable::kNo,
65*c8dee2aaSAndroid Build Coastguard Worker                                                      skgpu::Protected = skgpu::Protected::kNo);
66*c8dee2aaSAndroid Build Coastguard Worker 
67*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<ManagedBackendTexture> MakeFromBitmap(GrDirectContext*,
68*c8dee2aaSAndroid Build Coastguard Worker                                                        const SkBitmap&,
69*c8dee2aaSAndroid Build Coastguard Worker                                                        skgpu::Mipmapped,
70*c8dee2aaSAndroid Build Coastguard Worker                                                        skgpu::Renderable,
71*c8dee2aaSAndroid Build Coastguard Worker                                                        skgpu::Protected = skgpu::Protected::kNo);
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<ManagedBackendTexture> MakeFromPixmap(GrDirectContext*,
74*c8dee2aaSAndroid Build Coastguard Worker                                                        const SkPixmap&,
75*c8dee2aaSAndroid Build Coastguard Worker                                                        skgpu::Mipmapped,
76*c8dee2aaSAndroid Build Coastguard Worker                                                        skgpu::Renderable,
77*c8dee2aaSAndroid Build Coastguard Worker                                                        skgpu::Protected = skgpu::Protected::kNo);
78*c8dee2aaSAndroid Build Coastguard Worker 
79*c8dee2aaSAndroid Build Coastguard Worker     /** GrGpuFinishedProc or image/surface release proc. */
80*c8dee2aaSAndroid Build Coastguard Worker     static void ReleaseProc(void* context);
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker     ~ManagedBackendTexture();
83*c8dee2aaSAndroid Build Coastguard Worker 
84*c8dee2aaSAndroid Build Coastguard Worker     /**
85*c8dee2aaSAndroid Build Coastguard Worker      * The context to use with ReleaseProc. This adds a ref so it *must* be balanced by a call to
86*c8dee2aaSAndroid Build Coastguard Worker      * ReleaseProc. If a wrappedProc is provided then it will be called by ReleaseProc.
87*c8dee2aaSAndroid Build Coastguard Worker      */
88*c8dee2aaSAndroid Build Coastguard Worker     void* releaseContext(GrGpuFinishedProc wrappedProc = nullptr,
89*c8dee2aaSAndroid Build Coastguard Worker                          GrGpuFinishedContext wrappedContext = nullptr) const;
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<skgpu::RefCntedCallback> refCountedCallback() const;
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker     /**
94*c8dee2aaSAndroid Build Coastguard Worker      * Call if the underlying GrBackendTexture was adopted by a GrContext. This clears this out the
95*c8dee2aaSAndroid Build Coastguard Worker      * MBET without deleting the texture.
96*c8dee2aaSAndroid Build Coastguard Worker      */
97*c8dee2aaSAndroid Build Coastguard Worker     void wasAdopted();
98*c8dee2aaSAndroid Build Coastguard Worker 
99*c8dee2aaSAndroid Build Coastguard Worker     /**
100*c8dee2aaSAndroid Build Coastguard Worker      * SkImages::TextureFromYUVATextures takes a single release proc that is called once for all the
101*c8dee2aaSAndroid Build Coastguard Worker      * textures. This makes a single release context for the group of textures. It's used with the
102*c8dee2aaSAndroid Build Coastguard Worker      * standard ReleaseProc. Like releaseContext(), it must be balanced by a ReleaseProc call for
103*c8dee2aaSAndroid Build Coastguard Worker      * proper ref counting.
104*c8dee2aaSAndroid Build Coastguard Worker      */
105*c8dee2aaSAndroid Build Coastguard Worker     static void* MakeYUVAReleaseContext(const sk_sp<ManagedBackendTexture>[SkYUVAInfo::kMaxPlanes]);
106*c8dee2aaSAndroid Build Coastguard Worker 
texture()107*c8dee2aaSAndroid Build Coastguard Worker     const GrBackendTexture& texture() { return fTexture; }
108*c8dee2aaSAndroid Build Coastguard Worker 
109*c8dee2aaSAndroid Build Coastguard Worker private:
110*c8dee2aaSAndroid Build Coastguard Worker     ManagedBackendTexture() = default;
111*c8dee2aaSAndroid Build Coastguard Worker     ManagedBackendTexture(const ManagedBackendTexture&) = delete;
112*c8dee2aaSAndroid Build Coastguard Worker     ManagedBackendTexture(ManagedBackendTexture&&) = delete;
113*c8dee2aaSAndroid Build Coastguard Worker 
114*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrDirectContext> fDContext;
115*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture fTexture;
116*c8dee2aaSAndroid Build Coastguard Worker };
117*c8dee2aaSAndroid Build Coastguard Worker 
118*c8dee2aaSAndroid Build Coastguard Worker template <typename... Args>
MakeWithData(GrDirectContext * dContext,Args &&...args)119*c8dee2aaSAndroid Build Coastguard Worker inline sk_sp<ManagedBackendTexture> ManagedBackendTexture::MakeWithData(GrDirectContext* dContext,
120*c8dee2aaSAndroid Build Coastguard Worker                                                                         Args&&... args) {
121*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<ManagedBackendTexture> mbet(new ManagedBackendTexture);
122*c8dee2aaSAndroid Build Coastguard Worker     mbet->fDContext = sk_ref_sp(dContext);
123*c8dee2aaSAndroid Build Coastguard Worker     mbet->fTexture = dContext->createBackendTexture(std::forward<Args>(args)...,
124*c8dee2aaSAndroid Build Coastguard Worker                                                     ReleaseProc,
125*c8dee2aaSAndroid Build Coastguard Worker                                                     mbet->releaseContext());
126*c8dee2aaSAndroid Build Coastguard Worker     if (!mbet->fTexture.isValid()) {
127*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
128*c8dee2aaSAndroid Build Coastguard Worker     }
129*c8dee2aaSAndroid Build Coastguard Worker     return mbet;
130*c8dee2aaSAndroid Build Coastguard Worker }
131*c8dee2aaSAndroid Build Coastguard Worker 
132*c8dee2aaSAndroid Build Coastguard Worker template <typename... Args>
MakeWithoutData(GrDirectContext * dContext,Args &&...args)133*c8dee2aaSAndroid Build Coastguard Worker inline sk_sp<ManagedBackendTexture> ManagedBackendTexture::MakeWithoutData(
134*c8dee2aaSAndroid Build Coastguard Worker         GrDirectContext* dContext,
135*c8dee2aaSAndroid Build Coastguard Worker         Args&&... args) {
136*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture texture =
137*c8dee2aaSAndroid Build Coastguard Worker             dContext->createBackendTexture(std::forward<Args>(args)...);
138*c8dee2aaSAndroid Build Coastguard Worker     if (!texture.isValid()) {
139*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
140*c8dee2aaSAndroid Build Coastguard Worker     }
141*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<ManagedBackendTexture> mbet(new ManagedBackendTexture);
142*c8dee2aaSAndroid Build Coastguard Worker     mbet->fDContext = sk_ref_sp(dContext);
143*c8dee2aaSAndroid Build Coastguard Worker     mbet->fTexture = std::move(texture);
144*c8dee2aaSAndroid Build Coastguard Worker     return mbet;
145*c8dee2aaSAndroid Build Coastguard Worker }
146*c8dee2aaSAndroid Build Coastguard Worker #endif  // SK_GANESH
147*c8dee2aaSAndroid Build Coastguard Worker 
148*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_GRAPHITE
149*c8dee2aaSAndroid Build Coastguard Worker /*
150*c8dee2aaSAndroid Build Coastguard Worker  * Graphite version of ManagedBackendTexture
151*c8dee2aaSAndroid Build Coastguard Worker  */
152*c8dee2aaSAndroid Build Coastguard Worker class ManagedGraphiteTexture : public SkNVRefCnt<ManagedGraphiteTexture> {
153*c8dee2aaSAndroid Build Coastguard Worker public:
154*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<ManagedGraphiteTexture> MakeUnInit(Recorder*,
155*c8dee2aaSAndroid Build Coastguard Worker                                                     const SkImageInfo&,
156*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Mipmapped,
157*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Renderable,
158*c8dee2aaSAndroid Build Coastguard Worker                                                     skgpu::Protected = skgpu::Protected::kNo);
159*c8dee2aaSAndroid Build Coastguard Worker 
160*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<ManagedGraphiteTexture> MakeFromPixmap(Recorder*,
161*c8dee2aaSAndroid Build Coastguard Worker                                                         const SkPixmap&,
162*c8dee2aaSAndroid Build Coastguard Worker                                                         skgpu::Mipmapped,
163*c8dee2aaSAndroid Build Coastguard Worker                                                         skgpu::Renderable,
164*c8dee2aaSAndroid Build Coastguard Worker                                                         skgpu::Protected = skgpu::Protected::kNo);
165*c8dee2aaSAndroid Build Coastguard Worker 
166*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<ManagedGraphiteTexture> MakeMipmappedFromPixmaps(
167*c8dee2aaSAndroid Build Coastguard Worker             Recorder*,
168*c8dee2aaSAndroid Build Coastguard Worker             SkSpan<const SkPixmap> levels,
169*c8dee2aaSAndroid Build Coastguard Worker             skgpu::Renderable,
170*c8dee2aaSAndroid Build Coastguard Worker             skgpu::Protected = skgpu::Protected::kNo);
171*c8dee2aaSAndroid Build Coastguard Worker 
172*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<ManagedGraphiteTexture> MakeFromCompressedData(
173*c8dee2aaSAndroid Build Coastguard Worker             Recorder*,
174*c8dee2aaSAndroid Build Coastguard Worker             SkISize dimmensions,
175*c8dee2aaSAndroid Build Coastguard Worker             SkTextureCompressionType,
176*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<SkData>,
177*c8dee2aaSAndroid Build Coastguard Worker             skgpu::Mipmapped,
178*c8dee2aaSAndroid Build Coastguard Worker             skgpu::Protected = skgpu::Protected::kNo);
179*c8dee2aaSAndroid Build Coastguard Worker 
180*c8dee2aaSAndroid Build Coastguard Worker     /** finished and image/surface release procs */
181*c8dee2aaSAndroid Build Coastguard Worker     static void FinishedProc(void* context, skgpu::CallbackResult);
182*c8dee2aaSAndroid Build Coastguard Worker     static void ReleaseProc(void* context);
183*c8dee2aaSAndroid Build Coastguard Worker     static void ImageReleaseProc(void* context);
184*c8dee2aaSAndroid Build Coastguard Worker 
185*c8dee2aaSAndroid Build Coastguard Worker     ~ManagedGraphiteTexture();
186*c8dee2aaSAndroid Build Coastguard Worker 
187*c8dee2aaSAndroid Build Coastguard Worker     /**
188*c8dee2aaSAndroid Build Coastguard Worker      * The context to use with the ReleaseProcs. This adds a ref so it *must* be balanced by a call
189*c8dee2aaSAndroid Build Coastguard Worker      * to TextureReleaseProc or ImageReleaseProc.
190*c8dee2aaSAndroid Build Coastguard Worker      */
191*c8dee2aaSAndroid Build Coastguard Worker     void* releaseContext() const;
192*c8dee2aaSAndroid Build Coastguard Worker 
193*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<skgpu::RefCntedCallback> refCountedCallback() const;
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker     /**
196*c8dee2aaSAndroid Build Coastguard Worker      * SkImage::MakeGraphiteFromYUVABackendTextures takes a single release proc that is called once
197*c8dee2aaSAndroid Build Coastguard Worker      * for all the textures. This makes a single release context for the group of textures. It's
198*c8dee2aaSAndroid Build Coastguard Worker      * used with the standard ReleaseProc. Like releaseContext(), it must be balanced by a
199*c8dee2aaSAndroid Build Coastguard Worker      * ReleaseProc call for proper ref counting.
200*c8dee2aaSAndroid Build Coastguard Worker      */
201*c8dee2aaSAndroid Build Coastguard Worker     static void* MakeYUVAReleaseContext(const sk_sp<ManagedGraphiteTexture>[SkYUVAInfo::kMaxPlanes]);
202*c8dee2aaSAndroid Build Coastguard Worker 
texture()203*c8dee2aaSAndroid Build Coastguard Worker     const skgpu::graphite::BackendTexture& texture() { return fTexture; }
204*c8dee2aaSAndroid Build Coastguard Worker 
205*c8dee2aaSAndroid Build Coastguard Worker private:
206*c8dee2aaSAndroid Build Coastguard Worker     ManagedGraphiteTexture() = default;
207*c8dee2aaSAndroid Build Coastguard Worker     ManagedGraphiteTexture(const ManagedGraphiteTexture&) = delete;
208*c8dee2aaSAndroid Build Coastguard Worker     ManagedGraphiteTexture(ManagedGraphiteTexture&&) = delete;
209*c8dee2aaSAndroid Build Coastguard Worker 
210*c8dee2aaSAndroid Build Coastguard Worker     skgpu::graphite::Context* fContext;
211*c8dee2aaSAndroid Build Coastguard Worker     skgpu::graphite::BackendTexture fTexture;
212*c8dee2aaSAndroid Build Coastguard Worker };
213*c8dee2aaSAndroid Build Coastguard Worker 
214*c8dee2aaSAndroid Build Coastguard Worker #endif  // SK_GRAPHITE
215*c8dee2aaSAndroid Build Coastguard Worker 
216*c8dee2aaSAndroid Build Coastguard Worker }  // namespace sk_gpu_test
217*c8dee2aaSAndroid Build Coastguard Worker 
218*c8dee2aaSAndroid Build Coastguard Worker #endif  // ManagedBackendTexture_DEFINED
219