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 #ifndef TestUtils_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define TestUtils_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/SkBackingFit.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrImageInfo.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrPixmap.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 21*c8dee2aaSAndroid Build Coastguard Worker #include <functional> 22*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker class GrDirectContext; 25*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext; 26*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy; 27*c8dee2aaSAndroid Build Coastguard Worker class SkPixmap; 28*c8dee2aaSAndroid Build Coastguard Worker enum class GrColorType; 29*c8dee2aaSAndroid Build Coastguard Worker namespace skiatest { class Reporter; } 30*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh { 31*c8dee2aaSAndroid Build Coastguard Worker class SurfaceContext; 32*c8dee2aaSAndroid Build Coastguard Worker } 33*c8dee2aaSAndroid Build Coastguard Worker typedef uint32_t GrColor; 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker // Ensure that reading back from 'srcContext' as RGBA 8888 matches 'expectedPixelValues 36*c8dee2aaSAndroid Build Coastguard Worker void TestReadPixels(skiatest::Reporter*, 37*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext*, 38*c8dee2aaSAndroid Build Coastguard Worker skgpu::ganesh::SurfaceContext*, 39*c8dee2aaSAndroid Build Coastguard Worker uint32_t expectedPixelValues[], 40*c8dee2aaSAndroid Build Coastguard Worker const char* testName); 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker // See if trying to write RGBA 8888 pixels to 'dstContext' matches the 43*c8dee2aaSAndroid Build Coastguard Worker // expectation ('expectedToWork') 44*c8dee2aaSAndroid Build Coastguard Worker void TestWritePixels(skiatest::Reporter*, 45*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext*, 46*c8dee2aaSAndroid Build Coastguard Worker skgpu::ganesh::SurfaceContext*, 47*c8dee2aaSAndroid Build Coastguard Worker bool expectedToWork, 48*c8dee2aaSAndroid Build Coastguard Worker const char* testName); 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker // Ensure that the pixels can be copied from 'proxy' viewed as colorType, to an RGBA 8888 51*c8dee2aaSAndroid Build Coastguard Worker // destination (both texture-backed and rendertarget-backed). 52*c8dee2aaSAndroid Build Coastguard Worker void TestCopyFromSurface(skiatest::Reporter*, 53*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext*, 54*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurfaceProxy> proxy, 55*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin origin, 56*c8dee2aaSAndroid Build Coastguard Worker GrColorType colorType, 57*c8dee2aaSAndroid Build Coastguard Worker uint32_t expectedPixelValues[], 58*c8dee2aaSAndroid Build Coastguard Worker const char* testName); 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker /** Used by compare_pixels. */ 61*c8dee2aaSAndroid Build Coastguard Worker using ComparePixmapsErrorReporter = void(int x, int y, const float diffs[4]); 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker /** 64*c8dee2aaSAndroid Build Coastguard Worker * Compares pixels pointed to by 'a' to pixels pointed to by 'b'. 65*c8dee2aaSAndroid Build Coastguard Worker * 66*c8dee2aaSAndroid Build Coastguard Worker * If the pixmaps have different dimensions error is called with negative coordinate values and 67*c8dee2aaSAndroid Build Coastguard Worker * zero diffs and no comparisons are made. 68*c8dee2aaSAndroid Build Coastguard Worker * 69*c8dee2aaSAndroid Build Coastguard Worker * Before comparison pixels are converted to a common color type, alpha type, and color space. 70*c8dee2aaSAndroid Build Coastguard Worker * The color type is always 32 bit float. The alpha type is premul if one of the pixmaps is 71*c8dee2aaSAndroid Build Coastguard Worker * premul and the other is unpremul. The color space is linear sRGB if the pixmaps have 72*c8dee2aaSAndroid Build Coastguard Worker * different colorspaces, otherwise their common color space is used. 73*c8dee2aaSAndroid Build Coastguard Worker * 74*c8dee2aaSAndroid Build Coastguard Worker * 'tolRGBA' expresses the allowed difference between pixels in the comparison space per channel. If 75*c8dee2aaSAndroid Build Coastguard Worker * pixel components differ more than by 'tolRGBA' in absolute value in any channel then 'error' is 76*c8dee2aaSAndroid Build Coastguard Worker * called with the coordinate and difference in the comparison space (B - A). 77*c8dee2aaSAndroid Build Coastguard Worker * 78*c8dee2aaSAndroid Build Coastguard Worker * The function quits after a single error is reported and returns false if 'error' was called and 79*c8dee2aaSAndroid Build Coastguard Worker * true otherwise. 80*c8dee2aaSAndroid Build Coastguard Worker */ 81*c8dee2aaSAndroid Build Coastguard Worker bool ComparePixels(const GrCPixmap& a, 82*c8dee2aaSAndroid Build Coastguard Worker const GrCPixmap& b, 83*c8dee2aaSAndroid Build Coastguard Worker const float tolRGBA[4], 84*c8dee2aaSAndroid Build Coastguard Worker std::function<ComparePixmapsErrorReporter>& error); 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker /** 87*c8dee2aaSAndroid Build Coastguard Worker * Convenience version that checks that 'pixmap' is a solid field of 'col' 88*c8dee2aaSAndroid Build Coastguard Worker */ 89*c8dee2aaSAndroid Build Coastguard Worker bool CheckSolidPixels(const SkColor4f& col, 90*c8dee2aaSAndroid Build Coastguard Worker const SkPixmap& pixmap, 91*c8dee2aaSAndroid Build Coastguard Worker const float tolRGBA[4], 92*c8dee2aaSAndroid Build Coastguard Worker std::function<ComparePixmapsErrorReporter>& error); 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker /** 95*c8dee2aaSAndroid Build Coastguard Worker * Checks the ref cnt on a proxy and its backing store. This is only valid if the proxy and the 96*c8dee2aaSAndroid Build Coastguard Worker * resource are both used on a single thread. 97*c8dee2aaSAndroid Build Coastguard Worker */ 98*c8dee2aaSAndroid Build Coastguard Worker void CheckSingleThreadedProxyRefs(skiatest::Reporter* reporter, 99*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxy* proxy, 100*c8dee2aaSAndroid Build Coastguard Worker int32_t expectedProxyRefs, 101*c8dee2aaSAndroid Build Coastguard Worker int32_t expectedBackingRefs); 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Worker // Makes either a SurfaceContext, SurfaceFillContext, or a SurfaceDrawContext, depending on 104*c8dee2aaSAndroid Build Coastguard Worker // GrRenderable and the GrImageInfo. 105*c8dee2aaSAndroid Build Coastguard Worker // The texture format is the default for the provided color type. 106*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<skgpu::ganesh::SurfaceContext> CreateSurfaceContext( 107*c8dee2aaSAndroid Build Coastguard Worker GrRecordingContext*, 108*c8dee2aaSAndroid Build Coastguard Worker const GrImageInfo&, 109*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit = SkBackingFit::kExact, 110*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin = kTopLeft_GrSurfaceOrigin, 111*c8dee2aaSAndroid Build Coastguard Worker GrRenderable = GrRenderable::kNo, 112*c8dee2aaSAndroid Build Coastguard Worker int sampleCount = 1, 113*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped = skgpu::Mipmapped::kNo, 114*c8dee2aaSAndroid Build Coastguard Worker GrProtected = GrProtected::kNo, 115*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted = skgpu::Budgeted::kYes); 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker #endif 118