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