1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 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 "tests/TestUtils.h"
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkAlphaType.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/SkImageInfo.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPixmap.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrRecordingContext.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTemplates.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkAutoPixmapStorage.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDataUtils.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrImageInfo.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRecordingContextPriv.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SkGr.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SurfaceContext.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkCharToGlyphCache.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
34*c8dee2aaSAndroid Build Coastguard Worker
35*c8dee2aaSAndroid Build Coastguard Worker #include <cmath>
36*c8dee2aaSAndroid Build Coastguard Worker #include <cstdlib>
37*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
38*c8dee2aaSAndroid Build Coastguard Worker
TestReadPixels(skiatest::Reporter * reporter,GrDirectContext * dContext,skgpu::ganesh::SurfaceContext * srcContext,uint32_t expectedPixelValues[],const char * testName)39*c8dee2aaSAndroid Build Coastguard Worker void TestReadPixels(skiatest::Reporter* reporter,
40*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* dContext,
41*c8dee2aaSAndroid Build Coastguard Worker skgpu::ganesh::SurfaceContext* srcContext,
42*c8dee2aaSAndroid Build Coastguard Worker uint32_t expectedPixelValues[],
43*c8dee2aaSAndroid Build Coastguard Worker const char* testName) {
44*c8dee2aaSAndroid Build Coastguard Worker int pixelCnt = srcContext->width() * srcContext->height();
45*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo ii = SkImageInfo::Make(srcContext->dimensions(),
46*c8dee2aaSAndroid Build Coastguard Worker kRGBA_8888_SkColorType,
47*c8dee2aaSAndroid Build Coastguard Worker kPremul_SkAlphaType);
48*c8dee2aaSAndroid Build Coastguard Worker SkAutoPixmapStorage pm;
49*c8dee2aaSAndroid Build Coastguard Worker pm.alloc(ii);
50*c8dee2aaSAndroid Build Coastguard Worker pm.erase(SK_ColorTRANSPARENT);
51*c8dee2aaSAndroid Build Coastguard Worker
52*c8dee2aaSAndroid Build Coastguard Worker bool read = srcContext->readPixels(dContext, pm, {0, 0});
53*c8dee2aaSAndroid Build Coastguard Worker if (!read) {
54*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "%s: Error reading from texture.", testName);
55*c8dee2aaSAndroid Build Coastguard Worker }
56*c8dee2aaSAndroid Build Coastguard Worker
57*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < pixelCnt; ++i) {
58*c8dee2aaSAndroid Build Coastguard Worker if (pm.addr32()[i] != expectedPixelValues[i]) {
59*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "%s: Error, pixel value %d should be 0x%08x, got 0x%08x.",
60*c8dee2aaSAndroid Build Coastguard Worker testName, i, expectedPixelValues[i], pm.addr32()[i]);
61*c8dee2aaSAndroid Build Coastguard Worker break;
62*c8dee2aaSAndroid Build Coastguard Worker }
63*c8dee2aaSAndroid Build Coastguard Worker }
64*c8dee2aaSAndroid Build Coastguard Worker }
65*c8dee2aaSAndroid Build Coastguard Worker
TestWritePixels(skiatest::Reporter * reporter,GrDirectContext * dContext,skgpu::ganesh::SurfaceContext * dstContext,bool expectedToWork,const char * testName)66*c8dee2aaSAndroid Build Coastguard Worker void TestWritePixels(skiatest::Reporter* reporter,
67*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* dContext,
68*c8dee2aaSAndroid Build Coastguard Worker skgpu::ganesh::SurfaceContext* dstContext,
69*c8dee2aaSAndroid Build Coastguard Worker bool expectedToWork,
70*c8dee2aaSAndroid Build Coastguard Worker const char* testName) {
71*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo ii = SkImageInfo::Make(dstContext->dimensions(),
72*c8dee2aaSAndroid Build Coastguard Worker kRGBA_8888_SkColorType,
73*c8dee2aaSAndroid Build Coastguard Worker kPremul_SkAlphaType);
74*c8dee2aaSAndroid Build Coastguard Worker SkAutoPixmapStorage pm;
75*c8dee2aaSAndroid Build Coastguard Worker pm.alloc(ii);
76*c8dee2aaSAndroid Build Coastguard Worker for (int y = 0; y < dstContext->height(); ++y) {
77*c8dee2aaSAndroid Build Coastguard Worker for (int x = 0; x < dstContext->width(); ++x) {
78*c8dee2aaSAndroid Build Coastguard Worker *pm.writable_addr32(x, y) = SkColorToPremulGrColor(SkColorSetARGB(2*y, x, y, x + y));
79*c8dee2aaSAndroid Build Coastguard Worker }
80*c8dee2aaSAndroid Build Coastguard Worker }
81*c8dee2aaSAndroid Build Coastguard Worker
82*c8dee2aaSAndroid Build Coastguard Worker bool write = dstContext->writePixels(dContext, pm, {0, 0});
83*c8dee2aaSAndroid Build Coastguard Worker if (!write) {
84*c8dee2aaSAndroid Build Coastguard Worker if (expectedToWork) {
85*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "%s: Error writing to texture.", testName);
86*c8dee2aaSAndroid Build Coastguard Worker }
87*c8dee2aaSAndroid Build Coastguard Worker return;
88*c8dee2aaSAndroid Build Coastguard Worker }
89*c8dee2aaSAndroid Build Coastguard Worker
90*c8dee2aaSAndroid Build Coastguard Worker if (write && !expectedToWork) {
91*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "%s: writePixels succeeded when it wasn't supposed to.", testName);
92*c8dee2aaSAndroid Build Coastguard Worker return;
93*c8dee2aaSAndroid Build Coastguard Worker }
94*c8dee2aaSAndroid Build Coastguard Worker
95*c8dee2aaSAndroid Build Coastguard Worker TestReadPixels(reporter, dContext, dstContext, pm.writable_addr32(0, 0), testName);
96*c8dee2aaSAndroid Build Coastguard Worker }
97*c8dee2aaSAndroid Build Coastguard Worker
TestCopyFromSurface(skiatest::Reporter * reporter,GrDirectContext * dContext,sk_sp<GrSurfaceProxy> proxy,GrSurfaceOrigin origin,GrColorType colorType,uint32_t expectedPixelValues[],const char * testName)98*c8dee2aaSAndroid Build Coastguard Worker void TestCopyFromSurface(skiatest::Reporter* reporter,
99*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* dContext,
100*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurfaceProxy> proxy,
101*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin origin,
102*c8dee2aaSAndroid Build Coastguard Worker GrColorType colorType,
103*c8dee2aaSAndroid Build Coastguard Worker uint32_t expectedPixelValues[],
104*c8dee2aaSAndroid Build Coastguard Worker const char* testName) {
105*c8dee2aaSAndroid Build Coastguard Worker auto copy = GrSurfaceProxy::Copy(dContext,
106*c8dee2aaSAndroid Build Coastguard Worker std::move(proxy),
107*c8dee2aaSAndroid Build Coastguard Worker origin,
108*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo,
109*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit::kExact,
110*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kYes,
111*c8dee2aaSAndroid Build Coastguard Worker /*label=*/"CopyFromSurface_Test");
112*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(copy && copy->asTextureProxy());
113*c8dee2aaSAndroid Build Coastguard Worker auto swizzle = dContext->priv().caps()->getReadSwizzle(copy->backendFormat(), colorType);
114*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView view(std::move(copy), origin, swizzle);
115*c8dee2aaSAndroid Build Coastguard Worker auto dstContext = dContext->priv().makeSC(std::move(view),
116*c8dee2aaSAndroid Build Coastguard Worker {colorType, kPremul_SkAlphaType, nullptr});
117*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(dstContext);
118*c8dee2aaSAndroid Build Coastguard Worker
119*c8dee2aaSAndroid Build Coastguard Worker TestReadPixels(reporter, dContext, dstContext.get(), expectedPixelValues, testName);
120*c8dee2aaSAndroid Build Coastguard Worker }
121*c8dee2aaSAndroid Build Coastguard Worker
compare_colors(int x,int y,const float rgbaA[],const float rgbaB[],const float tolRGBA[4],std::function<ComparePixmapsErrorReporter> & error)122*c8dee2aaSAndroid Build Coastguard Worker static bool compare_colors(int x, int y,
123*c8dee2aaSAndroid Build Coastguard Worker const float rgbaA[],
124*c8dee2aaSAndroid Build Coastguard Worker const float rgbaB[],
125*c8dee2aaSAndroid Build Coastguard Worker const float tolRGBA[4],
126*c8dee2aaSAndroid Build Coastguard Worker std::function<ComparePixmapsErrorReporter>& error) {
127*c8dee2aaSAndroid Build Coastguard Worker float diffs[4];
128*c8dee2aaSAndroid Build Coastguard Worker bool bad = false;
129*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) {
130*c8dee2aaSAndroid Build Coastguard Worker diffs[i] = rgbaB[i] - rgbaA[i];
131*c8dee2aaSAndroid Build Coastguard Worker if (std::abs(diffs[i]) > std::abs(tolRGBA[i])) {
132*c8dee2aaSAndroid Build Coastguard Worker bad = true;
133*c8dee2aaSAndroid Build Coastguard Worker }
134*c8dee2aaSAndroid Build Coastguard Worker }
135*c8dee2aaSAndroid Build Coastguard Worker if (bad) {
136*c8dee2aaSAndroid Build Coastguard Worker error(x, y, diffs);
137*c8dee2aaSAndroid Build Coastguard Worker return false;
138*c8dee2aaSAndroid Build Coastguard Worker }
139*c8dee2aaSAndroid Build Coastguard Worker return true;
140*c8dee2aaSAndroid Build Coastguard Worker }
141*c8dee2aaSAndroid Build Coastguard Worker
ComparePixels(const GrCPixmap & a,const GrCPixmap & b,const float tolRGBA[4],std::function<ComparePixmapsErrorReporter> & error)142*c8dee2aaSAndroid Build Coastguard Worker bool ComparePixels(const GrCPixmap& a,
143*c8dee2aaSAndroid Build Coastguard Worker const GrCPixmap& b,
144*c8dee2aaSAndroid Build Coastguard Worker const float tolRGBA[4],
145*c8dee2aaSAndroid Build Coastguard Worker std::function<ComparePixmapsErrorReporter>& error) {
146*c8dee2aaSAndroid Build Coastguard Worker if (a.dimensions() != b.dimensions()) {
147*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kEmptyDiffs[4] = {};
148*c8dee2aaSAndroid Build Coastguard Worker error(-1, -1, kEmptyDiffs);
149*c8dee2aaSAndroid Build Coastguard Worker return false;
150*c8dee2aaSAndroid Build Coastguard Worker }
151*c8dee2aaSAndroid Build Coastguard Worker
152*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType floatAlphaType = a.alphaType();
153*c8dee2aaSAndroid Build Coastguard Worker // If one is premul and the other is unpremul we do the comparison in premul space.
154*c8dee2aaSAndroid Build Coastguard Worker if ((a.alphaType() == kPremul_SkAlphaType || b.alphaType() == kPremul_SkAlphaType) &&
155*c8dee2aaSAndroid Build Coastguard Worker (a.alphaType() == kUnpremul_SkAlphaType || b.alphaType() == kUnpremul_SkAlphaType)) {
156*c8dee2aaSAndroid Build Coastguard Worker floatAlphaType = kPremul_SkAlphaType;
157*c8dee2aaSAndroid Build Coastguard Worker }
158*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> floatCS;
159*c8dee2aaSAndroid Build Coastguard Worker if (SkColorSpace::Equals(a.colorSpace(), b.colorSpace())) {
160*c8dee2aaSAndroid Build Coastguard Worker floatCS = a.refColorSpace();
161*c8dee2aaSAndroid Build Coastguard Worker } else {
162*c8dee2aaSAndroid Build Coastguard Worker floatCS = SkColorSpace::MakeSRGBLinear();
163*c8dee2aaSAndroid Build Coastguard Worker }
164*c8dee2aaSAndroid Build Coastguard Worker GrImageInfo floatInfo(GrColorType::kRGBA_F32,
165*c8dee2aaSAndroid Build Coastguard Worker floatAlphaType,
166*c8dee2aaSAndroid Build Coastguard Worker std::move(floatCS),
167*c8dee2aaSAndroid Build Coastguard Worker a.dimensions());
168*c8dee2aaSAndroid Build Coastguard Worker
169*c8dee2aaSAndroid Build Coastguard Worker GrPixmap floatA = GrPixmap::Allocate(floatInfo);
170*c8dee2aaSAndroid Build Coastguard Worker GrPixmap floatB = GrPixmap::Allocate(floatInfo);
171*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(GrConvertPixels(floatA, a));
172*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(GrConvertPixels(floatB, b));
173*c8dee2aaSAndroid Build Coastguard Worker
174*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(floatA.rowBytes() == floatB.rowBytes());
175*c8dee2aaSAndroid Build Coastguard Worker auto at = [rb = floatA.rowBytes()](const void* base, int x, int y) {
176*c8dee2aaSAndroid Build Coastguard Worker return SkTAddOffset<const float>(base, y*rb + x*sizeof(float)*4);
177*c8dee2aaSAndroid Build Coastguard Worker };
178*c8dee2aaSAndroid Build Coastguard Worker
179*c8dee2aaSAndroid Build Coastguard Worker for (int y = 0; y < floatA.height(); ++y) {
180*c8dee2aaSAndroid Build Coastguard Worker for (int x = 0; x < floatA.width(); ++x) {
181*c8dee2aaSAndroid Build Coastguard Worker const float* rgbaA = at(floatA.addr(), x, y);
182*c8dee2aaSAndroid Build Coastguard Worker const float* rgbaB = at(floatB.addr(), x, y);
183*c8dee2aaSAndroid Build Coastguard Worker if (!compare_colors(x, y, rgbaA, rgbaB, tolRGBA, error)) {
184*c8dee2aaSAndroid Build Coastguard Worker return false;
185*c8dee2aaSAndroid Build Coastguard Worker }
186*c8dee2aaSAndroid Build Coastguard Worker }
187*c8dee2aaSAndroid Build Coastguard Worker }
188*c8dee2aaSAndroid Build Coastguard Worker return true;
189*c8dee2aaSAndroid Build Coastguard Worker }
190*c8dee2aaSAndroid Build Coastguard Worker
CheckSolidPixels(const SkColor4f & col,const SkPixmap & pixmap,const float tolRGBA[4],std::function<ComparePixmapsErrorReporter> & error)191*c8dee2aaSAndroid Build Coastguard Worker bool CheckSolidPixels(const SkColor4f& col,
192*c8dee2aaSAndroid Build Coastguard Worker const SkPixmap& pixmap,
193*c8dee2aaSAndroid Build Coastguard Worker const float tolRGBA[4],
194*c8dee2aaSAndroid Build Coastguard Worker std::function<ComparePixmapsErrorReporter>& error) {
195*c8dee2aaSAndroid Build Coastguard Worker size_t floatBpp = GrColorTypeBytesPerPixel(GrColorType::kRGBA_F32);
196*c8dee2aaSAndroid Build Coastguard Worker
197*c8dee2aaSAndroid Build Coastguard Worker // First convert 'col' to be compatible with 'pixmap'
198*c8dee2aaSAndroid Build Coastguard Worker GrPixmap colorPixmap;
199*c8dee2aaSAndroid Build Coastguard Worker {
200*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> srcCS = SkColorSpace::MakeSRGBLinear();
201*c8dee2aaSAndroid Build Coastguard Worker GrImageInfo srcInfo(GrColorType::kRGBA_F32,
202*c8dee2aaSAndroid Build Coastguard Worker kUnpremul_SkAlphaType,
203*c8dee2aaSAndroid Build Coastguard Worker std::move(srcCS),
204*c8dee2aaSAndroid Build Coastguard Worker {1, 1});
205*c8dee2aaSAndroid Build Coastguard Worker GrCPixmap srcPixmap(srcInfo, col.vec(), floatBpp);
206*c8dee2aaSAndroid Build Coastguard Worker GrImageInfo dstInfo =
207*c8dee2aaSAndroid Build Coastguard Worker srcInfo.makeAlphaType(pixmap.alphaType()).makeColorSpace(pixmap.refColorSpace());
208*c8dee2aaSAndroid Build Coastguard Worker colorPixmap = GrPixmap::Allocate(dstInfo);
209*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(GrConvertPixels(colorPixmap, srcPixmap));
210*c8dee2aaSAndroid Build Coastguard Worker }
211*c8dee2aaSAndroid Build Coastguard Worker
212*c8dee2aaSAndroid Build Coastguard Worker size_t floatRowBytes = floatBpp * pixmap.width();
213*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<char[]> floatB(new char[floatRowBytes * pixmap.height()]);
214*c8dee2aaSAndroid Build Coastguard Worker // Then convert 'pixmap' to RGBA_F32
215*c8dee2aaSAndroid Build Coastguard Worker GrPixmap f32Pixmap = GrPixmap::Allocate(pixmap.info().makeColorType(kRGBA_F32_SkColorType));
216*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(GrConvertPixels(f32Pixmap, pixmap));
217*c8dee2aaSAndroid Build Coastguard Worker
218*c8dee2aaSAndroid Build Coastguard Worker for (int y = 0; y < f32Pixmap.height(); ++y) {
219*c8dee2aaSAndroid Build Coastguard Worker for (int x = 0; x < f32Pixmap.width(); ++x) {
220*c8dee2aaSAndroid Build Coastguard Worker auto rgbaA = SkTAddOffset<const float>(f32Pixmap.addr(),
221*c8dee2aaSAndroid Build Coastguard Worker f32Pixmap.rowBytes()*y + floatBpp*x);
222*c8dee2aaSAndroid Build Coastguard Worker auto rgbaB = static_cast<const float*>(colorPixmap.addr());
223*c8dee2aaSAndroid Build Coastguard Worker if (!compare_colors(x, y, rgbaA, rgbaB, tolRGBA, error)) {
224*c8dee2aaSAndroid Build Coastguard Worker return false;
225*c8dee2aaSAndroid Build Coastguard Worker }
226*c8dee2aaSAndroid Build Coastguard Worker }
227*c8dee2aaSAndroid Build Coastguard Worker }
228*c8dee2aaSAndroid Build Coastguard Worker return true;
229*c8dee2aaSAndroid Build Coastguard Worker }
230*c8dee2aaSAndroid Build Coastguard Worker
CheckSingleThreadedProxyRefs(skiatest::Reporter * reporter,GrSurfaceProxy * proxy,int32_t expectedProxyRefs,int32_t expectedBackingRefs)231*c8dee2aaSAndroid Build Coastguard Worker void CheckSingleThreadedProxyRefs(skiatest::Reporter* reporter,
232*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxy* proxy,
233*c8dee2aaSAndroid Build Coastguard Worker int32_t expectedProxyRefs,
234*c8dee2aaSAndroid Build Coastguard Worker int32_t expectedBackingRefs) {
235*c8dee2aaSAndroid Build Coastguard Worker int32_t actualBackingRefs = proxy->testingOnly_getBackingRefCnt();
236*c8dee2aaSAndroid Build Coastguard Worker
237*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, proxy->refCntGreaterThan(expectedProxyRefs - 1) &&
238*c8dee2aaSAndroid Build Coastguard Worker !proxy->refCntGreaterThan(expectedProxyRefs));
239*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, actualBackingRefs == expectedBackingRefs);
240*c8dee2aaSAndroid Build Coastguard Worker }
241*c8dee2aaSAndroid Build Coastguard Worker
CreateSurfaceContext(GrRecordingContext * rContext,const GrImageInfo & info,SkBackingFit fit,GrSurfaceOrigin origin,GrRenderable renderable,int sampleCount,skgpu::Mipmapped mipmapped,GrProtected isProtected,skgpu::Budgeted budgeted)242*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<skgpu::ganesh::SurfaceContext> CreateSurfaceContext(GrRecordingContext* rContext,
243*c8dee2aaSAndroid Build Coastguard Worker const GrImageInfo& info,
244*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit fit,
245*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin origin,
246*c8dee2aaSAndroid Build Coastguard Worker GrRenderable renderable,
247*c8dee2aaSAndroid Build Coastguard Worker int sampleCount,
248*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped,
249*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
250*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted budgeted) {
251*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat format = rContext->priv().caps()->getDefaultBackendFormat(info.colorType(),
252*c8dee2aaSAndroid Build Coastguard Worker renderable);
253*c8dee2aaSAndroid Build Coastguard Worker return rContext->priv().makeSC(info,
254*c8dee2aaSAndroid Build Coastguard Worker format,
255*c8dee2aaSAndroid Build Coastguard Worker /*label=*/{},
256*c8dee2aaSAndroid Build Coastguard Worker fit,
257*c8dee2aaSAndroid Build Coastguard Worker origin,
258*c8dee2aaSAndroid Build Coastguard Worker renderable,
259*c8dee2aaSAndroid Build Coastguard Worker sampleCount,
260*c8dee2aaSAndroid Build Coastguard Worker mipmapped,
261*c8dee2aaSAndroid Build Coastguard Worker isProtected,
262*c8dee2aaSAndroid Build Coastguard Worker budgeted);
263*c8dee2aaSAndroid Build Coastguard Worker }
264*c8dee2aaSAndroid Build Coastguard Worker
hash_to_glyph(uint32_t value)265*c8dee2aaSAndroid Build Coastguard Worker static SkGlyphID hash_to_glyph(uint32_t value) {
266*c8dee2aaSAndroid Build Coastguard Worker return SkToU16(((value >> 16) ^ value) & 0xFFFF);
267*c8dee2aaSAndroid Build Coastguard Worker }
268*c8dee2aaSAndroid Build Coastguard Worker
269*c8dee2aaSAndroid Build Coastguard Worker namespace {
270*c8dee2aaSAndroid Build Coastguard Worker class UnicharGen {
271*c8dee2aaSAndroid Build Coastguard Worker SkUnichar fU;
272*c8dee2aaSAndroid Build Coastguard Worker const int fStep;
273*c8dee2aaSAndroid Build Coastguard Worker public:
UnicharGen(int step)274*c8dee2aaSAndroid Build Coastguard Worker UnicharGen(int step) : fU(0), fStep(step) {}
275*c8dee2aaSAndroid Build Coastguard Worker
next()276*c8dee2aaSAndroid Build Coastguard Worker SkUnichar next() {
277*c8dee2aaSAndroid Build Coastguard Worker fU += fStep;
278*c8dee2aaSAndroid Build Coastguard Worker return fU;
279*c8dee2aaSAndroid Build Coastguard Worker }
280*c8dee2aaSAndroid Build Coastguard Worker };
281*c8dee2aaSAndroid Build Coastguard Worker } // namespace
282*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(chartoglyph_cache,reporter)283*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(chartoglyph_cache, reporter) {
284*c8dee2aaSAndroid Build Coastguard Worker SkCharToGlyphCache cache;
285*c8dee2aaSAndroid Build Coastguard Worker const int step = 3;
286*c8dee2aaSAndroid Build Coastguard Worker
287*c8dee2aaSAndroid Build Coastguard Worker UnicharGen gen(step);
288*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 500; ++i) {
289*c8dee2aaSAndroid Build Coastguard Worker SkUnichar c = gen.next();
290*c8dee2aaSAndroid Build Coastguard Worker SkGlyphID glyph = hash_to_glyph(c);
291*c8dee2aaSAndroid Build Coastguard Worker
292*c8dee2aaSAndroid Build Coastguard Worker int index = cache.findGlyphIndex(c);
293*c8dee2aaSAndroid Build Coastguard Worker if (index >= 0) {
294*c8dee2aaSAndroid Build Coastguard Worker index = cache.findGlyphIndex(c);
295*c8dee2aaSAndroid Build Coastguard Worker }
296*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, index < 0);
297*c8dee2aaSAndroid Build Coastguard Worker cache.insertCharAndGlyph(~index, c, glyph);
298*c8dee2aaSAndroid Build Coastguard Worker
299*c8dee2aaSAndroid Build Coastguard Worker UnicharGen gen2(step);
300*c8dee2aaSAndroid Build Coastguard Worker for (int j = 0; j <= i; ++j) {
301*c8dee2aaSAndroid Build Coastguard Worker c = gen2.next();
302*c8dee2aaSAndroid Build Coastguard Worker glyph = hash_to_glyph(c);
303*c8dee2aaSAndroid Build Coastguard Worker index = cache.findGlyphIndex(c);
304*c8dee2aaSAndroid Build Coastguard Worker if ((unsigned)index != glyph) {
305*c8dee2aaSAndroid Build Coastguard Worker index = cache.findGlyphIndex(c);
306*c8dee2aaSAndroid Build Coastguard Worker }
307*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, (unsigned)index == glyph);
308*c8dee2aaSAndroid Build Coastguard Worker }
309*c8dee2aaSAndroid Build Coastguard Worker }
310*c8dee2aaSAndroid Build Coastguard Worker }
311