1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 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 #include "include/core/SkAlphaType.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorType.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPixmap.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSamplingOptions.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTextureCompressionType.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrContextOptions.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkAutoPixmapStorage.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkCompressedDataUtils.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/DataUtils.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/SkBackingFit.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBackendUtils.h"
36*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
37*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColorInfo.h"
38*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDataUtils.h"
39*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
40*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h"
41*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrImageInfo.h"
42*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProxyProvider.h"
43*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTarget.h"
44*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceCache.h"
45*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceProvider.h"
46*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h"
47*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurface.h"
48*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
49*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"
50*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTexture.h"
51*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTextureProxy.h"
52*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrUtil.h"
53*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SkGr.h"
54*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SurfaceContext.h"
55*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/TestFormatColorTypeCombination.h"
56*c8dee2aaSAndroid Build Coastguard Worker #include "tests/CtsEnforcement.h"
57*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
58*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ContextType.h"
59*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ManagedBackendTexture.h"
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
62*c8dee2aaSAndroid Build Coastguard Worker #include <functional>
63*c8dee2aaSAndroid Build Coastguard Worker #include <initializer_list>
64*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
65*c8dee2aaSAndroid Build Coastguard Worker #include <tuple>
66*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
67*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
68*c8dee2aaSAndroid Build Coastguard Worker
69*c8dee2aaSAndroid Build Coastguard Worker // Tests that GrSurface::asTexture(), GrSurface::asRenderTarget(), and static upcasting of texture
70*c8dee2aaSAndroid Build Coastguard Worker // and render targets to GrSurface all work as expected.
DEF_GANESH_TEST_FOR_MOCK_CONTEXT(GrSurface,reporter,ctxInfo)71*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_MOCK_CONTEXT(GrSurface, reporter, ctxInfo) {
72*c8dee2aaSAndroid Build Coastguard Worker auto context = ctxInfo.directContext();
73*c8dee2aaSAndroid Build Coastguard Worker auto resourceProvider = context->priv().resourceProvider();
74*c8dee2aaSAndroid Build Coastguard Worker
75*c8dee2aaSAndroid Build Coastguard Worker static constexpr SkISize kDesc = {256, 256};
76*c8dee2aaSAndroid Build Coastguard Worker auto format = context->priv().caps()->getDefaultBackendFormat(GrColorType::kRGBA_8888,
77*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kYes);
78*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurface> texRT1 = resourceProvider->createTexture(kDesc,
79*c8dee2aaSAndroid Build Coastguard Worker format,
80*c8dee2aaSAndroid Build Coastguard Worker GrTextureType::k2D,
81*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kYes,
82*c8dee2aaSAndroid Build Coastguard Worker 1,
83*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
84*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kNo,
85*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo,
86*c8dee2aaSAndroid Build Coastguard Worker /*label=*/{});
87*c8dee2aaSAndroid Build Coastguard Worker
88*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, texRT1.get() == texRT1->asRenderTarget());
89*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, texRT1.get() == texRT1->asTexture());
90*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT1->asRenderTarget()) ==
91*c8dee2aaSAndroid Build Coastguard Worker texRT1->asTexture());
92*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, texRT1->asRenderTarget() ==
93*c8dee2aaSAndroid Build Coastguard Worker static_cast<GrSurface*>(texRT1->asTexture()));
94*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT1->asRenderTarget()) ==
95*c8dee2aaSAndroid Build Coastguard Worker static_cast<GrSurface*>(texRT1->asTexture()));
96*c8dee2aaSAndroid Build Coastguard Worker
97*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTexture> tex1 = resourceProvider->createTexture(kDesc,
98*c8dee2aaSAndroid Build Coastguard Worker format,
99*c8dee2aaSAndroid Build Coastguard Worker GrTextureType::k2D,
100*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kNo,
101*c8dee2aaSAndroid Build Coastguard Worker 1,
102*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
103*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kNo,
104*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo,
105*c8dee2aaSAndroid Build Coastguard Worker /*label=*/{});
106*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, nullptr == tex1->asRenderTarget());
107*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, tex1.get() == tex1->asTexture());
108*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, static_cast<GrSurface*>(tex1.get()) == tex1->asTexture());
109*c8dee2aaSAndroid Build Coastguard Worker
110*c8dee2aaSAndroid Build Coastguard Worker GrBackendTexture backendTex = context->createBackendTexture(256,
111*c8dee2aaSAndroid Build Coastguard Worker 256,
112*c8dee2aaSAndroid Build Coastguard Worker kRGBA_8888_SkColorType,
113*c8dee2aaSAndroid Build Coastguard Worker SkColors::kTransparent,
114*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
115*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kNo,
116*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo);
117*c8dee2aaSAndroid Build Coastguard Worker
118*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurface> texRT2 = resourceProvider->wrapRenderableBackendTexture(
119*c8dee2aaSAndroid Build Coastguard Worker backendTex, 1, kBorrow_GrWrapOwnership, GrWrapCacheable::kNo);
120*c8dee2aaSAndroid Build Coastguard Worker
121*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, texRT2.get() == texRT2->asRenderTarget());
122*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, texRT2.get() == texRT2->asTexture());
123*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT2->asRenderTarget()) ==
124*c8dee2aaSAndroid Build Coastguard Worker texRT2->asTexture());
125*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, texRT2->asRenderTarget() ==
126*c8dee2aaSAndroid Build Coastguard Worker static_cast<GrSurface*>(texRT2->asTexture()));
127*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT2->asRenderTarget()) ==
128*c8dee2aaSAndroid Build Coastguard Worker static_cast<GrSurface*>(texRT2->asTexture()));
129*c8dee2aaSAndroid Build Coastguard Worker
130*c8dee2aaSAndroid Build Coastguard Worker context->deleteBackendTexture(backendTex);
131*c8dee2aaSAndroid Build Coastguard Worker }
132*c8dee2aaSAndroid Build Coastguard Worker
133*c8dee2aaSAndroid Build Coastguard Worker // This test checks that the isFormatTexturable and isFormatRenderable are
134*c8dee2aaSAndroid Build Coastguard Worker // consistent with createTexture's result.
DEF_GANESH_TEST_FOR_ALL_CONTEXTS(GrSurfaceRenderability,reporter,ctxInfo,CtsEnforcement::kApiLevel_T)135*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_ALL_CONTEXTS(GrSurfaceRenderability,
136*c8dee2aaSAndroid Build Coastguard Worker reporter,
137*c8dee2aaSAndroid Build Coastguard Worker ctxInfo,
138*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kApiLevel_T) {
139*c8dee2aaSAndroid Build Coastguard Worker auto context = ctxInfo.directContext();
140*c8dee2aaSAndroid Build Coastguard Worker GrProxyProvider* proxyProvider = context->priv().proxyProvider();
141*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* resourceProvider = context->priv().resourceProvider();
142*c8dee2aaSAndroid Build Coastguard Worker const GrCaps* caps = context->priv().caps();
143*c8dee2aaSAndroid Build Coastguard Worker
144*c8dee2aaSAndroid Build Coastguard Worker // TODO: Should only need format here but need to determine compression type from format
145*c8dee2aaSAndroid Build Coastguard Worker // without config.
146*c8dee2aaSAndroid Build Coastguard Worker auto createTexture = [](SkISize dimensions, GrColorType colorType,
147*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& format, GrRenderable renderable,
148*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* rp) -> sk_sp<GrTexture> {
149*c8dee2aaSAndroid Build Coastguard Worker SkTextureCompressionType compression = GrBackendFormatToCompressionType(format);
150*c8dee2aaSAndroid Build Coastguard Worker if (compression != SkTextureCompressionType::kNone) {
151*c8dee2aaSAndroid Build Coastguard Worker if (renderable == GrRenderable::kYes) {
152*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
153*c8dee2aaSAndroid Build Coastguard Worker }
154*c8dee2aaSAndroid Build Coastguard Worker auto size = SkCompressedDataSize(compression, dimensions, nullptr, false);
155*c8dee2aaSAndroid Build Coastguard Worker auto data = SkData::MakeUninitialized(size);
156*c8dee2aaSAndroid Build Coastguard Worker SkColor4f color = {0, 0, 0, 0};
157*c8dee2aaSAndroid Build Coastguard Worker skgpu::FillInCompressedData(compression,
158*c8dee2aaSAndroid Build Coastguard Worker dimensions,
159*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
160*c8dee2aaSAndroid Build Coastguard Worker (char*)data->writable_data(),
161*c8dee2aaSAndroid Build Coastguard Worker color);
162*c8dee2aaSAndroid Build Coastguard Worker return rp->createCompressedTexture(dimensions,
163*c8dee2aaSAndroid Build Coastguard Worker format,
164*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kNo,
165*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
166*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo,
167*c8dee2aaSAndroid Build Coastguard Worker data.get(),
168*c8dee2aaSAndroid Build Coastguard Worker /*label=*/{});
169*c8dee2aaSAndroid Build Coastguard Worker } else {
170*c8dee2aaSAndroid Build Coastguard Worker return rp->createTexture(dimensions,
171*c8dee2aaSAndroid Build Coastguard Worker format,
172*c8dee2aaSAndroid Build Coastguard Worker GrTextureType::k2D,
173*c8dee2aaSAndroid Build Coastguard Worker renderable,
174*c8dee2aaSAndroid Build Coastguard Worker 1,
175*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
176*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kNo,
177*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo,
178*c8dee2aaSAndroid Build Coastguard Worker /*label=*/{});
179*c8dee2aaSAndroid Build Coastguard Worker }
180*c8dee2aaSAndroid Build Coastguard Worker };
181*c8dee2aaSAndroid Build Coastguard Worker
182*c8dee2aaSAndroid Build Coastguard Worker static constexpr SkISize kDims = {64, 64};
183*c8dee2aaSAndroid Build Coastguard Worker
184*c8dee2aaSAndroid Build Coastguard Worker const std::vector<GrTest::TestFormatColorTypeCombination>& combos =
185*c8dee2aaSAndroid Build Coastguard Worker caps->getTestingCombinations();
186*c8dee2aaSAndroid Build Coastguard Worker
187*c8dee2aaSAndroid Build Coastguard Worker for (const GrTest::TestFormatColorTypeCombination& combo : combos) {
188*c8dee2aaSAndroid Build Coastguard Worker
189*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(combo.fColorType != GrColorType::kUnknown);
190*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(combo.fFormat.isValid());
191*c8dee2aaSAndroid Build Coastguard Worker
192*c8dee2aaSAndroid Build Coastguard Worker // Right now Vulkan has two backend formats that support ABGR_4444 (R4G4B4A4 and B4G4R4A4).
193*c8dee2aaSAndroid Build Coastguard Worker // Until we can create textures directly from the backend format this yields some
194*c8dee2aaSAndroid Build Coastguard Worker // ambiguity in what is actually supported and which textures can be created.
195*c8dee2aaSAndroid Build Coastguard Worker if (ctxInfo.backend() == kVulkan_GrBackend && combo.fColorType == GrColorType::kABGR_4444) {
196*c8dee2aaSAndroid Build Coastguard Worker continue;
197*c8dee2aaSAndroid Build Coastguard Worker }
198*c8dee2aaSAndroid Build Coastguard Worker
199*c8dee2aaSAndroid Build Coastguard Worker // Check if 'isFormatTexturable' agrees with 'createTexture' and that the mipmap
200*c8dee2aaSAndroid Build Coastguard Worker // support check is working
201*c8dee2aaSAndroid Build Coastguard Worker {
202*c8dee2aaSAndroid Build Coastguard Worker bool isCompressed = caps->isFormatCompressed(combo.fFormat);
203*c8dee2aaSAndroid Build Coastguard Worker bool isTexturable = caps->isFormatTexturable(combo.fFormat, GrTextureType::k2D);
204*c8dee2aaSAndroid Build Coastguard Worker
205*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurface> tex = createTexture(kDims, combo.fColorType, combo.fFormat,
206*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kNo, resourceProvider);
207*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, SkToBool(tex) == isTexturable,
208*c8dee2aaSAndroid Build Coastguard Worker "ct:%s format:%s, tex:%d, isTexturable:%d",
209*c8dee2aaSAndroid Build Coastguard Worker GrColorTypeToStr(combo.fColorType), combo.fFormat.toStr().c_str(),
210*c8dee2aaSAndroid Build Coastguard Worker SkToBool(tex), isTexturable);
211*c8dee2aaSAndroid Build Coastguard Worker
212*c8dee2aaSAndroid Build Coastguard Worker // Check that the lack of mipmap support blocks the creation of mipmapped
213*c8dee2aaSAndroid Build Coastguard Worker // proxies
214*c8dee2aaSAndroid Build Coastguard Worker bool expectedMipMapability = isTexturable && caps->mipmapSupport() && !isCompressed;
215*c8dee2aaSAndroid Build Coastguard Worker
216*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> proxy = proxyProvider->createProxy(combo.fFormat,
217*c8dee2aaSAndroid Build Coastguard Worker kDims,
218*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kNo,
219*c8dee2aaSAndroid Build Coastguard Worker 1,
220*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kYes,
221*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit::kExact,
222*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kNo,
223*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo,
224*c8dee2aaSAndroid Build Coastguard Worker /*label=*/{});
225*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, SkToBool(proxy.get()) == expectedMipMapability,
226*c8dee2aaSAndroid Build Coastguard Worker "ct:%s format:%s, tex:%d, expectedMipMapability:%d",
227*c8dee2aaSAndroid Build Coastguard Worker GrColorTypeToStr(combo.fColorType), combo.fFormat.toStr().c_str(),
228*c8dee2aaSAndroid Build Coastguard Worker SkToBool(proxy.get()), expectedMipMapability);
229*c8dee2aaSAndroid Build Coastguard Worker }
230*c8dee2aaSAndroid Build Coastguard Worker
231*c8dee2aaSAndroid Build Coastguard Worker // Check if 'isFormatAsColorTypeRenderable' agrees with 'createTexture' (w/o MSAA)
232*c8dee2aaSAndroid Build Coastguard Worker {
233*c8dee2aaSAndroid Build Coastguard Worker bool isRenderable = caps->isFormatRenderable(combo.fFormat, 1);
234*c8dee2aaSAndroid Build Coastguard Worker
235*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurface> tex = resourceProvider->createTexture(kDims,
236*c8dee2aaSAndroid Build Coastguard Worker combo.fFormat,
237*c8dee2aaSAndroid Build Coastguard Worker GrTextureType::k2D,
238*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kYes,
239*c8dee2aaSAndroid Build Coastguard Worker 1,
240*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
241*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kNo,
242*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo,
243*c8dee2aaSAndroid Build Coastguard Worker /*label=*/{});
244*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, SkToBool(tex) == isRenderable,
245*c8dee2aaSAndroid Build Coastguard Worker "ct:%s format:%s, tex:%d, isRenderable:%d",
246*c8dee2aaSAndroid Build Coastguard Worker GrColorTypeToStr(combo.fColorType), combo.fFormat.toStr().c_str(),
247*c8dee2aaSAndroid Build Coastguard Worker SkToBool(tex), isRenderable);
248*c8dee2aaSAndroid Build Coastguard Worker }
249*c8dee2aaSAndroid Build Coastguard Worker
250*c8dee2aaSAndroid Build Coastguard Worker // Check if 'isFormatAsColorTypeRenderable' agrees with 'createTexture' w/ MSAA
251*c8dee2aaSAndroid Build Coastguard Worker {
252*c8dee2aaSAndroid Build Coastguard Worker bool isRenderable = caps->isFormatRenderable(combo.fFormat, 2);
253*c8dee2aaSAndroid Build Coastguard Worker
254*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurface> tex = resourceProvider->createTexture(kDims,
255*c8dee2aaSAndroid Build Coastguard Worker combo.fFormat,
256*c8dee2aaSAndroid Build Coastguard Worker GrTextureType::k2D,
257*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kYes,
258*c8dee2aaSAndroid Build Coastguard Worker 2,
259*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
260*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kNo,
261*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo,
262*c8dee2aaSAndroid Build Coastguard Worker /*label=*/{});
263*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, SkToBool(tex) == isRenderable,
264*c8dee2aaSAndroid Build Coastguard Worker "ct:%s format:%s, tex:%d, isRenderable:%d",
265*c8dee2aaSAndroid Build Coastguard Worker GrColorTypeToStr(combo.fColorType), combo.fFormat.toStr().c_str(),
266*c8dee2aaSAndroid Build Coastguard Worker SkToBool(tex), isRenderable);
267*c8dee2aaSAndroid Build Coastguard Worker }
268*c8dee2aaSAndroid Build Coastguard Worker }
269*c8dee2aaSAndroid Build Coastguard Worker }
270*c8dee2aaSAndroid Build Coastguard Worker
271*c8dee2aaSAndroid Build Coastguard Worker // For each context, set it to always clear the textures and then run through all the
272*c8dee2aaSAndroid Build Coastguard Worker // supported formats checking that the textures are actually cleared
DEF_GANESH_TEST(InitialTextureClear,reporter,baseOptions,CtsEnforcement::kApiLevel_T)273*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(InitialTextureClear, reporter, baseOptions, CtsEnforcement::kApiLevel_T) {
274*c8dee2aaSAndroid Build Coastguard Worker GrContextOptions options = baseOptions;
275*c8dee2aaSAndroid Build Coastguard Worker options.fClearAllTextures = true;
276*c8dee2aaSAndroid Build Coastguard Worker
277*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kSize = 100;
278*c8dee2aaSAndroid Build Coastguard Worker static constexpr SkColor kClearColor = 0xABABABAB;
279*c8dee2aaSAndroid Build Coastguard Worker
280*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo imageInfo = SkImageInfo::Make(kSize, kSize, kRGBA_8888_SkColorType,
281*c8dee2aaSAndroid Build Coastguard Worker kPremul_SkAlphaType);
282*c8dee2aaSAndroid Build Coastguard Worker
283*c8dee2aaSAndroid Build Coastguard Worker SkAutoPixmapStorage readback;
284*c8dee2aaSAndroid Build Coastguard Worker readback.alloc(imageInfo);
285*c8dee2aaSAndroid Build Coastguard Worker
286*c8dee2aaSAndroid Build Coastguard Worker SkISize desc;
287*c8dee2aaSAndroid Build Coastguard Worker desc.fWidth = desc.fHeight = kSize;
288*c8dee2aaSAndroid Build Coastguard Worker
289*c8dee2aaSAndroid Build Coastguard Worker for (int ct = 0; ct < skgpu::kContextTypeCount; ++ct) {
290*c8dee2aaSAndroid Build Coastguard Worker sk_gpu_test::GrContextFactory factory(options);
291*c8dee2aaSAndroid Build Coastguard Worker auto contextType = static_cast<skgpu::ContextType>(ct);
292*c8dee2aaSAndroid Build Coastguard Worker if (!skgpu::IsRenderingContext(contextType)) {
293*c8dee2aaSAndroid Build Coastguard Worker continue;
294*c8dee2aaSAndroid Build Coastguard Worker }
295*c8dee2aaSAndroid Build Coastguard Worker auto dContext = factory.get(contextType);
296*c8dee2aaSAndroid Build Coastguard Worker if (!dContext) {
297*c8dee2aaSAndroid Build Coastguard Worker continue;
298*c8dee2aaSAndroid Build Coastguard Worker }
299*c8dee2aaSAndroid Build Coastguard Worker
300*c8dee2aaSAndroid Build Coastguard Worker GrProxyProvider* proxyProvider = dContext->priv().proxyProvider();
301*c8dee2aaSAndroid Build Coastguard Worker const GrCaps* caps = dContext->priv().caps();
302*c8dee2aaSAndroid Build Coastguard Worker
303*c8dee2aaSAndroid Build Coastguard Worker const std::vector<GrTest::TestFormatColorTypeCombination>& combos =
304*c8dee2aaSAndroid Build Coastguard Worker caps->getTestingCombinations();
305*c8dee2aaSAndroid Build Coastguard Worker
306*c8dee2aaSAndroid Build Coastguard Worker for (const GrTest::TestFormatColorTypeCombination& combo : combos) {
307*c8dee2aaSAndroid Build Coastguard Worker
308*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(combo.fColorType != GrColorType::kUnknown);
309*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(combo.fFormat.isValid());
310*c8dee2aaSAndroid Build Coastguard Worker
311*c8dee2aaSAndroid Build Coastguard Worker if (!caps->isFormatTexturable(combo.fFormat, GrTextureType::k2D)) {
312*c8dee2aaSAndroid Build Coastguard Worker continue;
313*c8dee2aaSAndroid Build Coastguard Worker }
314*c8dee2aaSAndroid Build Coastguard Worker
315*c8dee2aaSAndroid Build Coastguard Worker auto checkColor = [reporter](const GrTest::TestFormatColorTypeCombination& combo,
316*c8dee2aaSAndroid Build Coastguard Worker uint32_t readColor) {
317*c8dee2aaSAndroid Build Coastguard Worker // We expect that if there is no alpha in the src color type and we read it to a
318*c8dee2aaSAndroid Build Coastguard Worker // color type with alpha that we will get one for alpha rather than zero. We used to
319*c8dee2aaSAndroid Build Coastguard Worker // require this but the Intel Iris 6100 on Win 10 test bot doesn't put one in the
320*c8dee2aaSAndroid Build Coastguard Worker // alpha channel when reading back from GL_RG16 or GL_RG16F. So now we allow either.
321*c8dee2aaSAndroid Build Coastguard Worker uint32_t channels = GrColorTypeChannelFlags(combo.fColorType);
322*c8dee2aaSAndroid Build Coastguard Worker bool allowAlphaOne = !(channels & kAlpha_SkColorChannelFlag);
323*c8dee2aaSAndroid Build Coastguard Worker if (allowAlphaOne) {
324*c8dee2aaSAndroid Build Coastguard Worker if (readColor != 0x00000000 && readColor != 0xFF000000) {
325*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter,
326*c8dee2aaSAndroid Build Coastguard Worker "Failed on ct %s format %s 0x%08x is not 0x00000000 or 0xFF000000",
327*c8dee2aaSAndroid Build Coastguard Worker GrColorTypeToStr(combo.fColorType), combo.fFormat.toStr().c_str(),
328*c8dee2aaSAndroid Build Coastguard Worker readColor);
329*c8dee2aaSAndroid Build Coastguard Worker return false;
330*c8dee2aaSAndroid Build Coastguard Worker }
331*c8dee2aaSAndroid Build Coastguard Worker } else {
332*c8dee2aaSAndroid Build Coastguard Worker if (readColor) {
333*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "Failed on ct %s format %s 0x%08x != 0x00000000",
334*c8dee2aaSAndroid Build Coastguard Worker GrColorTypeToStr(combo.fColorType), combo.fFormat.toStr().c_str(),
335*c8dee2aaSAndroid Build Coastguard Worker readColor);
336*c8dee2aaSAndroid Build Coastguard Worker return false;
337*c8dee2aaSAndroid Build Coastguard Worker }
338*c8dee2aaSAndroid Build Coastguard Worker }
339*c8dee2aaSAndroid Build Coastguard Worker return true;
340*c8dee2aaSAndroid Build Coastguard Worker };
341*c8dee2aaSAndroid Build Coastguard Worker
342*c8dee2aaSAndroid Build Coastguard Worker for (auto renderable : {GrRenderable::kNo, GrRenderable::kYes}) {
343*c8dee2aaSAndroid Build Coastguard Worker if (renderable == GrRenderable::kYes &&
344*c8dee2aaSAndroid Build Coastguard Worker !caps->isFormatAsColorTypeRenderable(combo.fColorType, combo.fFormat)) {
345*c8dee2aaSAndroid Build Coastguard Worker continue;
346*c8dee2aaSAndroid Build Coastguard Worker }
347*c8dee2aaSAndroid Build Coastguard Worker
348*c8dee2aaSAndroid Build Coastguard Worker for (auto fit : {SkBackingFit::kApprox, SkBackingFit::kExact}) {
349*c8dee2aaSAndroid Build Coastguard Worker
350*c8dee2aaSAndroid Build Coastguard Worker // Does directly allocating a texture clear it?
351*c8dee2aaSAndroid Build Coastguard Worker {
352*c8dee2aaSAndroid Build Coastguard Worker auto proxy = proxyProvider->testingOnly_createInstantiatedProxy(
353*c8dee2aaSAndroid Build Coastguard Worker {kSize, kSize},
354*c8dee2aaSAndroid Build Coastguard Worker combo.fFormat,
355*c8dee2aaSAndroid Build Coastguard Worker renderable,
356*c8dee2aaSAndroid Build Coastguard Worker 1,
357*c8dee2aaSAndroid Build Coastguard Worker fit,
358*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kYes,
359*c8dee2aaSAndroid Build Coastguard Worker GrProtected::kNo);
360*c8dee2aaSAndroid Build Coastguard Worker if (proxy) {
361*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle swizzle = caps->getReadSwizzle(combo.fFormat,
362*c8dee2aaSAndroid Build Coastguard Worker combo.fColorType);
363*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView view(std::move(proxy), kTopLeft_GrSurfaceOrigin,
364*c8dee2aaSAndroid Build Coastguard Worker swizzle);
365*c8dee2aaSAndroid Build Coastguard Worker GrColorInfo info(combo.fColorType, kPremul_SkAlphaType, nullptr);
366*c8dee2aaSAndroid Build Coastguard Worker auto texCtx = dContext->priv().makeSC(std::move(view), info);
367*c8dee2aaSAndroid Build Coastguard Worker
368*c8dee2aaSAndroid Build Coastguard Worker readback.erase(kClearColor);
369*c8dee2aaSAndroid Build Coastguard Worker if (texCtx->readPixels(dContext, readback, {0, 0})) {
370*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kSize * kSize; ++i) {
371*c8dee2aaSAndroid Build Coastguard Worker if (!checkColor(combo, readback.addr32()[i])) {
372*c8dee2aaSAndroid Build Coastguard Worker break;
373*c8dee2aaSAndroid Build Coastguard Worker }
374*c8dee2aaSAndroid Build Coastguard Worker }
375*c8dee2aaSAndroid Build Coastguard Worker }
376*c8dee2aaSAndroid Build Coastguard Worker }
377*c8dee2aaSAndroid Build Coastguard Worker
378*c8dee2aaSAndroid Build Coastguard Worker dContext->priv().getResourceCache()->purgeUnlockedResources(
379*c8dee2aaSAndroid Build Coastguard Worker GrPurgeResourceOptions::kAllResources);
380*c8dee2aaSAndroid Build Coastguard Worker }
381*c8dee2aaSAndroid Build Coastguard Worker
382*c8dee2aaSAndroid Build Coastguard Worker // Try creating the texture as a deferred proxy.
383*c8dee2aaSAndroid Build Coastguard Worker {
384*c8dee2aaSAndroid Build Coastguard Worker GrImageInfo info(combo.fColorType,
385*c8dee2aaSAndroid Build Coastguard Worker GrColorTypeHasAlpha(combo.fColorType)
386*c8dee2aaSAndroid Build Coastguard Worker ? kPremul_SkAlphaType
387*c8dee2aaSAndroid Build Coastguard Worker : kOpaque_SkAlphaType,
388*c8dee2aaSAndroid Build Coastguard Worker nullptr,
389*c8dee2aaSAndroid Build Coastguard Worker {desc.fHeight, desc.fHeight});
390*c8dee2aaSAndroid Build Coastguard Worker
391*c8dee2aaSAndroid Build Coastguard Worker auto sc = dContext->priv().makeSC(info,
392*c8dee2aaSAndroid Build Coastguard Worker combo.fFormat,
393*c8dee2aaSAndroid Build Coastguard Worker /*label=*/{},
394*c8dee2aaSAndroid Build Coastguard Worker fit,
395*c8dee2aaSAndroid Build Coastguard Worker kTopLeft_GrSurfaceOrigin,
396*c8dee2aaSAndroid Build Coastguard Worker renderable);
397*c8dee2aaSAndroid Build Coastguard Worker if (!sc) {
398*c8dee2aaSAndroid Build Coastguard Worker continue;
399*c8dee2aaSAndroid Build Coastguard Worker }
400*c8dee2aaSAndroid Build Coastguard Worker
401*c8dee2aaSAndroid Build Coastguard Worker readback.erase(kClearColor);
402*c8dee2aaSAndroid Build Coastguard Worker if (sc->readPixels(dContext, readback, {0, 0})) {
403*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < kSize * kSize; ++i) {
404*c8dee2aaSAndroid Build Coastguard Worker if (!checkColor(combo, readback.addr32()[i])) {
405*c8dee2aaSAndroid Build Coastguard Worker break;
406*c8dee2aaSAndroid Build Coastguard Worker }
407*c8dee2aaSAndroid Build Coastguard Worker }
408*c8dee2aaSAndroid Build Coastguard Worker }
409*c8dee2aaSAndroid Build Coastguard Worker dContext->priv().getResourceCache()->purgeUnlockedResources(
410*c8dee2aaSAndroid Build Coastguard Worker GrPurgeResourceOptions::kAllResources);
411*c8dee2aaSAndroid Build Coastguard Worker }
412*c8dee2aaSAndroid Build Coastguard Worker }
413*c8dee2aaSAndroid Build Coastguard Worker }
414*c8dee2aaSAndroid Build Coastguard Worker }
415*c8dee2aaSAndroid Build Coastguard Worker }
416*c8dee2aaSAndroid Build Coastguard Worker }
417*c8dee2aaSAndroid Build Coastguard Worker
DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(ReadOnlyTexture,reporter,context_info,CtsEnforcement::kApiLevel_T)418*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(ReadOnlyTexture,
419*c8dee2aaSAndroid Build Coastguard Worker reporter,
420*c8dee2aaSAndroid Build Coastguard Worker context_info,
421*c8dee2aaSAndroid Build Coastguard Worker CtsEnforcement::kApiLevel_T) {
422*c8dee2aaSAndroid Build Coastguard Worker using namespace skgpu;
423*c8dee2aaSAndroid Build Coastguard Worker
424*c8dee2aaSAndroid Build Coastguard Worker auto fillPixels = [](SkPixmap* p, const std::function<uint32_t(int x, int y)>& f) {
425*c8dee2aaSAndroid Build Coastguard Worker for (int y = 0; y < p->height(); ++y) {
426*c8dee2aaSAndroid Build Coastguard Worker for (int x = 0; x < p->width(); ++x) {
427*c8dee2aaSAndroid Build Coastguard Worker *p->writable_addr32(x, y) = f(x, y);
428*c8dee2aaSAndroid Build Coastguard Worker }
429*c8dee2aaSAndroid Build Coastguard Worker }
430*c8dee2aaSAndroid Build Coastguard Worker };
431*c8dee2aaSAndroid Build Coastguard Worker
432*c8dee2aaSAndroid Build Coastguard Worker auto comparePixels = [](const SkPixmap& p1, const SkPixmap& p2, skiatest::Reporter* reporter) {
433*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(p1.info() == p2.info());
434*c8dee2aaSAndroid Build Coastguard Worker for (int y = 0; y < p1.height(); ++y) {
435*c8dee2aaSAndroid Build Coastguard Worker for (int x = 0; x < p1.width(); ++x) {
436*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, p1.getColor(x, y) == p2.getColor(x, y));
437*c8dee2aaSAndroid Build Coastguard Worker if (p1.getColor(x, y) != p2.getColor(x, y)) {
438*c8dee2aaSAndroid Build Coastguard Worker return;
439*c8dee2aaSAndroid Build Coastguard Worker }
440*c8dee2aaSAndroid Build Coastguard Worker }
441*c8dee2aaSAndroid Build Coastguard Worker }
442*c8dee2aaSAndroid Build Coastguard Worker };
443*c8dee2aaSAndroid Build Coastguard Worker
444*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kSize = 100;
445*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo ii = SkImageInfo::Make(kSize, kSize, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
446*c8dee2aaSAndroid Build Coastguard Worker SkAutoPixmapStorage srcPixmap;
447*c8dee2aaSAndroid Build Coastguard Worker srcPixmap.alloc(ii);
448*c8dee2aaSAndroid Build Coastguard Worker fillPixels(&srcPixmap,
449*c8dee2aaSAndroid Build Coastguard Worker [](int x, int y) {
450*c8dee2aaSAndroid Build Coastguard Worker return (0xFFU << 24) | (x << 16) | (y << 8) | uint8_t((x * y) & 0xFF);
451*c8dee2aaSAndroid Build Coastguard Worker });
452*c8dee2aaSAndroid Build Coastguard Worker
453*c8dee2aaSAndroid Build Coastguard Worker auto dContext = context_info.directContext();
454*c8dee2aaSAndroid Build Coastguard Worker GrProxyProvider* proxyProvider = dContext->priv().proxyProvider();
455*c8dee2aaSAndroid Build Coastguard Worker
456*c8dee2aaSAndroid Build Coastguard Worker Protected isProtected = Protected(dContext->priv().caps()->supportsProtectedContent());
457*c8dee2aaSAndroid Build Coastguard Worker
458*c8dee2aaSAndroid Build Coastguard Worker // We test both kRW in addition to kRead mostly to ensure that the calls are structured such
459*c8dee2aaSAndroid Build Coastguard Worker // that they'd succeed if the texture wasn't kRead. We want to be sure we're failing with
460*c8dee2aaSAndroid Build Coastguard Worker // kRead for the right reason.
461*c8dee2aaSAndroid Build Coastguard Worker for (auto ioType : {kRead_GrIOType, kRW_GrIOType}) {
462*c8dee2aaSAndroid Build Coastguard Worker auto mbet = sk_gpu_test::ManagedBackendTexture::MakeWithData(dContext,
463*c8dee2aaSAndroid Build Coastguard Worker srcPixmap,
464*c8dee2aaSAndroid Build Coastguard Worker kTopLeft_GrSurfaceOrigin,
465*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kNo,
466*c8dee2aaSAndroid Build Coastguard Worker isProtected);
467*c8dee2aaSAndroid Build Coastguard Worker if (!mbet) {
468*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "Could not make texture.");
469*c8dee2aaSAndroid Build Coastguard Worker return;
470*c8dee2aaSAndroid Build Coastguard Worker }
471*c8dee2aaSAndroid Build Coastguard Worker auto proxy = proxyProvider->wrapBackendTexture(mbet->texture(), kBorrow_GrWrapOwnership,
472*c8dee2aaSAndroid Build Coastguard Worker GrWrapCacheable::kNo, ioType,
473*c8dee2aaSAndroid Build Coastguard Worker mbet->refCountedCallback());
474*c8dee2aaSAndroid Build Coastguard Worker Swizzle swizzle = dContext->priv().caps()->getReadSwizzle(proxy->backendFormat(),
475*c8dee2aaSAndroid Build Coastguard Worker GrColorType::kRGBA_8888);
476*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView view(proxy, kTopLeft_GrSurfaceOrigin, swizzle);
477*c8dee2aaSAndroid Build Coastguard Worker auto surfContext = dContext->priv().makeSC(std::move(view), ii.colorInfo());
478*c8dee2aaSAndroid Build Coastguard Worker // Read pixels should work with a read-only texture.
479*c8dee2aaSAndroid Build Coastguard Worker {
480*c8dee2aaSAndroid Build Coastguard Worker SkAutoPixmapStorage read;
481*c8dee2aaSAndroid Build Coastguard Worker read.alloc(srcPixmap.info());
482*c8dee2aaSAndroid Build Coastguard Worker auto readResult = surfContext->readPixels(dContext, read, {0, 0});
483*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, readResult);
484*c8dee2aaSAndroid Build Coastguard Worker if (readResult) {
485*c8dee2aaSAndroid Build Coastguard Worker comparePixels(srcPixmap, read, reporter);
486*c8dee2aaSAndroid Build Coastguard Worker }
487*c8dee2aaSAndroid Build Coastguard Worker }
488*c8dee2aaSAndroid Build Coastguard Worker
489*c8dee2aaSAndroid Build Coastguard Worker // Write pixels should not work with a read-only texture.
490*c8dee2aaSAndroid Build Coastguard Worker SkAutoPixmapStorage write;
491*c8dee2aaSAndroid Build Coastguard Worker write.alloc(srcPixmap.info());
492*c8dee2aaSAndroid Build Coastguard Worker fillPixels(&write, [&srcPixmap](int x, int y) { return ~*srcPixmap.addr32(); });
493*c8dee2aaSAndroid Build Coastguard Worker auto writeResult = surfContext->writePixels(dContext, write, {0, 0});
494*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, writeResult == (ioType == kRW_GrIOType));
495*c8dee2aaSAndroid Build Coastguard Worker // Try the low level write.
496*c8dee2aaSAndroid Build Coastguard Worker dContext->flushAndSubmit();
497*c8dee2aaSAndroid Build Coastguard Worker auto gpuWriteResult = dContext->priv().getGpu()->writePixels(
498*c8dee2aaSAndroid Build Coastguard Worker proxy->peekTexture(),
499*c8dee2aaSAndroid Build Coastguard Worker SkIRect::MakeWH(kSize, kSize),
500*c8dee2aaSAndroid Build Coastguard Worker GrColorType::kRGBA_8888,
501*c8dee2aaSAndroid Build Coastguard Worker GrColorType::kRGBA_8888,
502*c8dee2aaSAndroid Build Coastguard Worker write.addr32(),
503*c8dee2aaSAndroid Build Coastguard Worker kSize*GrColorTypeBytesPerPixel(GrColorType::kRGBA_8888));
504*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, gpuWriteResult == (ioType == kRW_GrIOType));
505*c8dee2aaSAndroid Build Coastguard Worker
506*c8dee2aaSAndroid Build Coastguard Worker SkBitmap copySrcBitmap;
507*c8dee2aaSAndroid Build Coastguard Worker copySrcBitmap.installPixels(write);
508*c8dee2aaSAndroid Build Coastguard Worker copySrcBitmap.setImmutable();
509*c8dee2aaSAndroid Build Coastguard Worker
510*c8dee2aaSAndroid Build Coastguard Worker auto copySrc = std::get<0>(GrMakeUncachedBitmapProxyView(dContext, copySrcBitmap));
511*c8dee2aaSAndroid Build Coastguard Worker
512*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, copySrc);
513*c8dee2aaSAndroid Build Coastguard Worker auto copyResult = surfContext->testCopy(copySrc.refProxy());
514*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, copyResult == (ioType == kRW_GrIOType));
515*c8dee2aaSAndroid Build Coastguard Worker // Try the low level copy.
516*c8dee2aaSAndroid Build Coastguard Worker dContext->flushAndSubmit();
517*c8dee2aaSAndroid Build Coastguard Worker auto gpuCopyResult = dContext->priv().getGpu()->copySurface(
518*c8dee2aaSAndroid Build Coastguard Worker proxy->peekSurface(),
519*c8dee2aaSAndroid Build Coastguard Worker SkIRect::MakeWH(kSize, kSize),
520*c8dee2aaSAndroid Build Coastguard Worker copySrc.proxy()->peekSurface(),
521*c8dee2aaSAndroid Build Coastguard Worker SkIRect::MakeWH(kSize, kSize),
522*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::Filter::kNearest);
523*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, gpuCopyResult == (ioType == kRW_GrIOType));
524*c8dee2aaSAndroid Build Coastguard Worker
525*c8dee2aaSAndroid Build Coastguard Worker // Mip regen should not work with a read only texture.
526*c8dee2aaSAndroid Build Coastguard Worker if (dContext->priv().caps()->mipmapSupport()) {
527*c8dee2aaSAndroid Build Coastguard Worker mbet = sk_gpu_test::ManagedBackendTexture::MakeWithoutData(dContext,
528*c8dee2aaSAndroid Build Coastguard Worker kSize,
529*c8dee2aaSAndroid Build Coastguard Worker kSize,
530*c8dee2aaSAndroid Build Coastguard Worker kRGBA_8888_SkColorType,
531*c8dee2aaSAndroid Build Coastguard Worker Mipmapped::kYes,
532*c8dee2aaSAndroid Build Coastguard Worker GrRenderable::kNo,
533*c8dee2aaSAndroid Build Coastguard Worker isProtected);
534*c8dee2aaSAndroid Build Coastguard Worker proxy = proxyProvider->wrapBackendTexture(mbet->texture(), kBorrow_GrWrapOwnership,
535*c8dee2aaSAndroid Build Coastguard Worker GrWrapCacheable::kNo, ioType,
536*c8dee2aaSAndroid Build Coastguard Worker mbet->refCountedCallback());
537*c8dee2aaSAndroid Build Coastguard Worker dContext->flushAndSubmit();
538*c8dee2aaSAndroid Build Coastguard Worker proxy->peekTexture()->markMipmapsDirty(); // avoids assert in GrGpu.
539*c8dee2aaSAndroid Build Coastguard Worker auto regenResult =
540*c8dee2aaSAndroid Build Coastguard Worker dContext->priv().getGpu()->regenerateMipMapLevels(proxy->peekTexture());
541*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, regenResult == (ioType == kRW_GrIOType));
542*c8dee2aaSAndroid Build Coastguard Worker }
543*c8dee2aaSAndroid Build Coastguard Worker }
544*c8dee2aaSAndroid Build Coastguard Worker }
545