xref: /aosp_15_r20/external/skia/tools/gpu/BackendSurfaceFactory.cpp (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 #include "tools/gpu/BackendSurfaceFactory.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/SkSurfaceGanesh.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ManagedBackendTexture.h"
16*c8dee2aaSAndroid Build Coastguard Worker 
17*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE)
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Surface.h"
19*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DAWN)
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/dawn/DawnTypes.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/dawn/DawnGraphiteTypesPriv.h"
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker #include "webgpu/webgpu_cpp.h"  // NO_G3_REWRITE
24*c8dee2aaSAndroid Build Coastguard Worker #endif
25*c8dee2aaSAndroid Build Coastguard Worker #endif
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker namespace sk_gpu_test {
28*c8dee2aaSAndroid Build Coastguard Worker 
MakeBackendTextureSurface(GrDirectContext * dContext,const SkImageInfo & ii,GrSurfaceOrigin origin,int sampleCnt,skgpu::Mipmapped mipmapped,GrProtected isProtected,const SkSurfaceProps * props)29*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> MakeBackendTextureSurface(GrDirectContext* dContext,
30*c8dee2aaSAndroid Build Coastguard Worker                                            const SkImageInfo& ii,
31*c8dee2aaSAndroid Build Coastguard Worker                                            GrSurfaceOrigin origin,
32*c8dee2aaSAndroid Build Coastguard Worker                                            int sampleCnt,
33*c8dee2aaSAndroid Build Coastguard Worker                                            skgpu::Mipmapped mipmapped,
34*c8dee2aaSAndroid Build Coastguard Worker                                            GrProtected isProtected,
35*c8dee2aaSAndroid Build Coastguard Worker                                            const SkSurfaceProps* props) {
36*c8dee2aaSAndroid Build Coastguard Worker     if (ii.alphaType() == kUnpremul_SkAlphaType) {
37*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
38*c8dee2aaSAndroid Build Coastguard Worker     }
39*c8dee2aaSAndroid Build Coastguard Worker     auto mbet = ManagedBackendTexture::MakeWithoutData(dContext,
40*c8dee2aaSAndroid Build Coastguard Worker                                                        ii.width(),
41*c8dee2aaSAndroid Build Coastguard Worker                                                        ii.height(),
42*c8dee2aaSAndroid Build Coastguard Worker                                                        ii.colorType(),
43*c8dee2aaSAndroid Build Coastguard Worker                                                        mipmapped,
44*c8dee2aaSAndroid Build Coastguard Worker                                                        GrRenderable::kYes,
45*c8dee2aaSAndroid Build Coastguard Worker                                                        isProtected);
46*c8dee2aaSAndroid Build Coastguard Worker     if (!mbet) {
47*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
48*c8dee2aaSAndroid Build Coastguard Worker     }
49*c8dee2aaSAndroid Build Coastguard Worker     return SkSurfaces::WrapBackendTexture(dContext,
50*c8dee2aaSAndroid Build Coastguard Worker                                           mbet->texture(),
51*c8dee2aaSAndroid Build Coastguard Worker                                           origin,
52*c8dee2aaSAndroid Build Coastguard Worker                                           sampleCnt,
53*c8dee2aaSAndroid Build Coastguard Worker                                           ii.colorType(),
54*c8dee2aaSAndroid Build Coastguard Worker                                           ii.refColorSpace(),
55*c8dee2aaSAndroid Build Coastguard Worker                                           props,
56*c8dee2aaSAndroid Build Coastguard Worker                                           ManagedBackendTexture::ReleaseProc,
57*c8dee2aaSAndroid Build Coastguard Worker                                           mbet->releaseContext());
58*c8dee2aaSAndroid Build Coastguard Worker }
59*c8dee2aaSAndroid Build Coastguard Worker 
MakeBackendTextureSurface(GrDirectContext * dContext,SkISize dimensions,GrSurfaceOrigin origin,int sampleCnt,SkColorType colorType,sk_sp<SkColorSpace> colorSpace,skgpu::Mipmapped mipmapped,GrProtected isProtected,const SkSurfaceProps * props)60*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> MakeBackendTextureSurface(GrDirectContext* dContext,
61*c8dee2aaSAndroid Build Coastguard Worker                                            SkISize dimensions,
62*c8dee2aaSAndroid Build Coastguard Worker                                            GrSurfaceOrigin origin,
63*c8dee2aaSAndroid Build Coastguard Worker                                            int sampleCnt,
64*c8dee2aaSAndroid Build Coastguard Worker                                            SkColorType colorType,
65*c8dee2aaSAndroid Build Coastguard Worker                                            sk_sp<SkColorSpace> colorSpace,
66*c8dee2aaSAndroid Build Coastguard Worker                                            skgpu::Mipmapped mipmapped,
67*c8dee2aaSAndroid Build Coastguard Worker                                            GrProtected isProtected,
68*c8dee2aaSAndroid Build Coastguard Worker                                            const SkSurfaceProps* props) {
69*c8dee2aaSAndroid Build Coastguard Worker     auto ii = SkImageInfo::Make(dimensions, colorType, kPremul_SkAlphaType, std::move(colorSpace));
70*c8dee2aaSAndroid Build Coastguard Worker     return MakeBackendTextureSurface(
71*c8dee2aaSAndroid Build Coastguard Worker             dContext, ii, origin, sampleCnt, mipmapped, isProtected, props);
72*c8dee2aaSAndroid Build Coastguard Worker }
MakeBackendRenderTargetSurface(GrDirectContext * dContext,const SkImageInfo & ii,GrSurfaceOrigin origin,int sampleCnt,GrProtected isProtected,const SkSurfaceProps * props)73*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> MakeBackendRenderTargetSurface(GrDirectContext* dContext,
74*c8dee2aaSAndroid Build Coastguard Worker                                                 const SkImageInfo& ii,
75*c8dee2aaSAndroid Build Coastguard Worker                                                 GrSurfaceOrigin origin,
76*c8dee2aaSAndroid Build Coastguard Worker                                                 int sampleCnt,
77*c8dee2aaSAndroid Build Coastguard Worker                                                 GrProtected isProtected,
78*c8dee2aaSAndroid Build Coastguard Worker                                                 const SkSurfaceProps* props) {
79*c8dee2aaSAndroid Build Coastguard Worker     if (ii.alphaType() == kUnpremul_SkAlphaType || ii.alphaType() == kUnknown_SkAlphaType) {
80*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
81*c8dee2aaSAndroid Build Coastguard Worker     }
82*c8dee2aaSAndroid Build Coastguard Worker     auto ct = SkColorTypeToGrColorType(ii.colorType());
83*c8dee2aaSAndroid Build Coastguard Worker 
84*c8dee2aaSAndroid Build Coastguard Worker     struct ReleaseContext {
85*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<GrDirectContext> fContext;
86*c8dee2aaSAndroid Build Coastguard Worker         GrBackendRenderTarget fRenderTarget;
87*c8dee2aaSAndroid Build Coastguard Worker     };
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker     auto bert = dContext->priv().getGpu()->createTestingOnlyBackendRenderTarget(
90*c8dee2aaSAndroid Build Coastguard Worker             ii.dimensions(), ct, sampleCnt, isProtected);
91*c8dee2aaSAndroid Build Coastguard Worker     auto rc = new ReleaseContext{sk_ref_sp(dContext), bert};
92*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!bert.isValid() || bert.sampleCnt() >= sampleCnt);
93*c8dee2aaSAndroid Build Coastguard Worker 
94*c8dee2aaSAndroid Build Coastguard Worker     auto proc = [](void* c) {
95*c8dee2aaSAndroid Build Coastguard Worker         const auto* rc = static_cast<ReleaseContext*>(c);
96*c8dee2aaSAndroid Build Coastguard Worker         if (auto gpu = rc->fContext->priv().getGpu(); gpu && rc->fRenderTarget.isValid()) {
97*c8dee2aaSAndroid Build Coastguard Worker             gpu->deleteTestingOnlyBackendRenderTarget(rc->fRenderTarget);
98*c8dee2aaSAndroid Build Coastguard Worker         }
99*c8dee2aaSAndroid Build Coastguard Worker         delete rc;
100*c8dee2aaSAndroid Build Coastguard Worker     };
101*c8dee2aaSAndroid Build Coastguard Worker 
102*c8dee2aaSAndroid Build Coastguard Worker     return SkSurfaces::WrapBackendRenderTarget(
103*c8dee2aaSAndroid Build Coastguard Worker             dContext, bert, origin, ii.colorType(), ii.refColorSpace(), props, proc, rc);
104*c8dee2aaSAndroid Build Coastguard Worker }
105*c8dee2aaSAndroid Build Coastguard Worker 
MakeBackendRenderTargetSurface(GrDirectContext * dContext,SkISize dimensions,GrSurfaceOrigin origin,int sampleCnt,SkColorType colorType,sk_sp<SkColorSpace> colorSpace,GrProtected isProtected,const SkSurfaceProps * props)106*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> MakeBackendRenderTargetSurface(GrDirectContext* dContext,
107*c8dee2aaSAndroid Build Coastguard Worker                                                 SkISize dimensions,
108*c8dee2aaSAndroid Build Coastguard Worker                                                 GrSurfaceOrigin origin,
109*c8dee2aaSAndroid Build Coastguard Worker                                                 int sampleCnt,
110*c8dee2aaSAndroid Build Coastguard Worker                                                 SkColorType colorType,
111*c8dee2aaSAndroid Build Coastguard Worker                                                 sk_sp<SkColorSpace> colorSpace,
112*c8dee2aaSAndroid Build Coastguard Worker                                                 GrProtected isProtected,
113*c8dee2aaSAndroid Build Coastguard Worker                                                 const SkSurfaceProps* props) {
114*c8dee2aaSAndroid Build Coastguard Worker     auto ii = SkImageInfo::Make(dimensions, colorType, kPremul_SkAlphaType, std::move(colorSpace));
115*c8dee2aaSAndroid Build Coastguard Worker     return MakeBackendRenderTargetSurface(dContext, ii, origin, sampleCnt, isProtected, props);
116*c8dee2aaSAndroid Build Coastguard Worker }
117*c8dee2aaSAndroid Build Coastguard Worker 
118*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_GRAPHITE
MakeBackendTextureSurface(skgpu::graphite::Recorder * recorder,const SkImageInfo & ii,skgpu::Mipmapped mipmapped,skgpu::Protected isProtected,const SkSurfaceProps * props)119*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> MakeBackendTextureSurface(skgpu::graphite::Recorder* recorder,
120*c8dee2aaSAndroid Build Coastguard Worker                                            const SkImageInfo& ii,
121*c8dee2aaSAndroid Build Coastguard Worker                                            skgpu::Mipmapped mipmapped,
122*c8dee2aaSAndroid Build Coastguard Worker                                            skgpu::Protected isProtected,
123*c8dee2aaSAndroid Build Coastguard Worker                                            const SkSurfaceProps* props) {
124*c8dee2aaSAndroid Build Coastguard Worker     if (ii.alphaType() == kUnpremul_SkAlphaType) {
125*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
126*c8dee2aaSAndroid Build Coastguard Worker     }
127*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<ManagedGraphiteTexture> mbet = ManagedGraphiteTexture::MakeUnInit(recorder,
128*c8dee2aaSAndroid Build Coastguard Worker                                                                             ii,
129*c8dee2aaSAndroid Build Coastguard Worker                                                                             mipmapped,
130*c8dee2aaSAndroid Build Coastguard Worker                                                                             skgpu::Renderable::kYes,
131*c8dee2aaSAndroid Build Coastguard Worker                                                                             isProtected);
132*c8dee2aaSAndroid Build Coastguard Worker     if (!mbet) {
133*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
134*c8dee2aaSAndroid Build Coastguard Worker     }
135*c8dee2aaSAndroid Build Coastguard Worker     return SkSurfaces::WrapBackendTexture(recorder,
136*c8dee2aaSAndroid Build Coastguard Worker                                           mbet->texture(),
137*c8dee2aaSAndroid Build Coastguard Worker                                           ii.colorType(),
138*c8dee2aaSAndroid Build Coastguard Worker                                           ii.refColorSpace(),
139*c8dee2aaSAndroid Build Coastguard Worker                                           props,
140*c8dee2aaSAndroid Build Coastguard Worker                                           ManagedGraphiteTexture::ReleaseProc,
141*c8dee2aaSAndroid Build Coastguard Worker                                           mbet->releaseContext());
142*c8dee2aaSAndroid Build Coastguard Worker }
143*c8dee2aaSAndroid Build Coastguard Worker 
144*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DAWN)
MakeBackendTextureViewSurface(skgpu::graphite::Recorder * recorder,const SkImageInfo & ii,skgpu::Mipmapped mipmapped,skgpu::Protected isProtected,const SkSurfaceProps * props)145*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> MakeBackendTextureViewSurface(skgpu::graphite::Recorder* recorder,
146*c8dee2aaSAndroid Build Coastguard Worker                                                const SkImageInfo& ii,
147*c8dee2aaSAndroid Build Coastguard Worker                                                skgpu::Mipmapped mipmapped,
148*c8dee2aaSAndroid Build Coastguard Worker                                                skgpu::Protected isProtected,
149*c8dee2aaSAndroid Build Coastguard Worker                                                const SkSurfaceProps* props) {
150*c8dee2aaSAndroid Build Coastguard Worker     if (recorder->backend() != skgpu::BackendApi::kDawn) {
151*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
152*c8dee2aaSAndroid Build Coastguard Worker     }
153*c8dee2aaSAndroid Build Coastguard Worker 
154*c8dee2aaSAndroid Build Coastguard Worker     if (ii.alphaType() == kUnpremul_SkAlphaType) {
155*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
156*c8dee2aaSAndroid Build Coastguard Worker     }
157*c8dee2aaSAndroid Build Coastguard Worker 
158*c8dee2aaSAndroid Build Coastguard Worker     auto mbet = ManagedGraphiteTexture::MakeUnInit(recorder,
159*c8dee2aaSAndroid Build Coastguard Worker                                                    ii,
160*c8dee2aaSAndroid Build Coastguard Worker                                                    mipmapped,
161*c8dee2aaSAndroid Build Coastguard Worker                                                    skgpu::Renderable::kYes,
162*c8dee2aaSAndroid Build Coastguard Worker                                                    isProtected);
163*c8dee2aaSAndroid Build Coastguard Worker     if (!mbet) {
164*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
165*c8dee2aaSAndroid Build Coastguard Worker     }
166*c8dee2aaSAndroid Build Coastguard Worker 
167*c8dee2aaSAndroid Build Coastguard Worker     wgpu::Texture texture(skgpu::graphite::BackendTextures::GetDawnTexturePtr(mbet->texture()));
168*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(texture);
169*c8dee2aaSAndroid Build Coastguard Worker 
170*c8dee2aaSAndroid Build Coastguard Worker     wgpu::TextureView view = texture.CreateView();
171*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(view);
172*c8dee2aaSAndroid Build Coastguard Worker 
173*c8dee2aaSAndroid Build Coastguard Worker     skgpu::graphite::DawnTextureInfo textureInfo;
174*c8dee2aaSAndroid Build Coastguard Worker     textureInfo.fAspect      = wgpu::TextureAspect::All;
175*c8dee2aaSAndroid Build Coastguard Worker     textureInfo.fFormat      = texture.GetFormat();
176*c8dee2aaSAndroid Build Coastguard Worker     textureInfo.fMipmapped   = mipmapped;
177*c8dee2aaSAndroid Build Coastguard Worker     textureInfo.fSampleCount = texture.GetSampleCount();
178*c8dee2aaSAndroid Build Coastguard Worker     textureInfo.fUsage       = texture.GetUsage();
179*c8dee2aaSAndroid Build Coastguard Worker 
180*c8dee2aaSAndroid Build Coastguard Worker     skgpu::graphite::BackendTexture betFromView =
181*c8dee2aaSAndroid Build Coastguard Worker             skgpu::graphite::BackendTextures::MakeDawn(ii.dimensions(), textureInfo, view.Get());
182*c8dee2aaSAndroid Build Coastguard Worker 
183*c8dee2aaSAndroid Build Coastguard Worker     auto release = [](void* ctx) { static_cast<ManagedGraphiteTexture*>(ctx)->unref(); };
184*c8dee2aaSAndroid Build Coastguard Worker 
185*c8dee2aaSAndroid Build Coastguard Worker     return SkSurfaces::WrapBackendTexture(recorder,
186*c8dee2aaSAndroid Build Coastguard Worker                                           betFromView,
187*c8dee2aaSAndroid Build Coastguard Worker                                           ii.colorType(),
188*c8dee2aaSAndroid Build Coastguard Worker                                           ii.refColorSpace(),
189*c8dee2aaSAndroid Build Coastguard Worker                                           props,
190*c8dee2aaSAndroid Build Coastguard Worker                                           release,
191*c8dee2aaSAndroid Build Coastguard Worker                                           mbet.release());
192*c8dee2aaSAndroid Build Coastguard Worker     return nullptr;
193*c8dee2aaSAndroid Build Coastguard Worker }
194*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_DAWN
195*c8dee2aaSAndroid Build Coastguard Worker 
196*c8dee2aaSAndroid Build Coastguard Worker #endif  // SK_GRAPHITE
197*c8dee2aaSAndroid Build Coastguard Worker 
198*c8dee2aaSAndroid Build Coastguard Worker }  // namespace sk_gpu_test
199