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 "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkColorData.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkCanvasPriv.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCanvas.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRecordingContextPriv.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SurfaceFillContext.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm { 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker // Size of each clear 23*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kSize = 64; 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GPU_GM_CAN_FAIL(clear_swizzle, rContext, canvas, errorMsg, 6*kSize, 2*kSize) { 26*c8dee2aaSAndroid Build Coastguard Worker if (rContext->abandoned()) { 27*c8dee2aaSAndroid Build Coastguard Worker *errorMsg = GM::kErrorMsg_DrawSkippedGpuOnly; 28*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kSkip; 29*c8dee2aaSAndroid Build Coastguard Worker } 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker auto sfc = skgpu::ganesh::TopDeviceSurfaceFillContext(canvas); 32*c8dee2aaSAndroid Build Coastguard Worker if (!sfc) { 33*c8dee2aaSAndroid Build Coastguard Worker *errorMsg = GM::kErrorMsg_DrawSkippedGpuOnly; 34*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kSkip; 35*c8dee2aaSAndroid Build Coastguard Worker } 36*c8dee2aaSAndroid Build Coastguard Worker __anone04877100102(const SkISize dimensions) 37*c8dee2aaSAndroid Build Coastguard Worker auto make_offscreen = [&](const SkISize dimensions) { 38*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle readSwizzle = skgpu::Swizzle::Concat(sfc->readSwizzle(), 39*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle{"bgra"}); 40*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle writeSwizzle = skgpu::Swizzle::Concat(sfc->readSwizzle(), 41*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle{"bgra"}); 42*c8dee2aaSAndroid Build Coastguard Worker return rContext->priv().makeSFC(kPremul_SkAlphaType, 43*c8dee2aaSAndroid Build Coastguard Worker sfc->colorInfo().refColorSpace(), 44*c8dee2aaSAndroid Build Coastguard Worker dimensions, 45*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit::kExact, 46*c8dee2aaSAndroid Build Coastguard Worker sfc->asSurfaceProxy()->backendFormat(), 47*c8dee2aaSAndroid Build Coastguard Worker /* sample count*/ 1, 48*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped::kNo, 49*c8dee2aaSAndroid Build Coastguard Worker sfc->asSurfaceProxy()->isProtected(), 50*c8dee2aaSAndroid Build Coastguard Worker readSwizzle, 51*c8dee2aaSAndroid Build Coastguard Worker writeSwizzle, 52*c8dee2aaSAndroid Build Coastguard Worker kTopLeft_GrSurfaceOrigin, 53*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted::kYes, 54*c8dee2aaSAndroid Build Coastguard Worker /*label=*/{}); 55*c8dee2aaSAndroid Build Coastguard Worker }; 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker struct { 58*c8dee2aaSAndroid Build Coastguard Worker SkIRect rect; 59*c8dee2aaSAndroid Build Coastguard Worker SkPMColor4f color; 60*c8dee2aaSAndroid Build Coastguard Worker } clears[] { 61*c8dee2aaSAndroid Build Coastguard Worker {{ 0, 0, kSize, kSize}, {1, 0, 0, 1}}, 62*c8dee2aaSAndroid Build Coastguard Worker {{kSize, 0, 2*kSize, kSize}, {0, 1, 0, 1}}, 63*c8dee2aaSAndroid Build Coastguard Worker {{ 0, kSize, kSize, 2*kSize}, {0, 0, 1, 1}}, 64*c8dee2aaSAndroid Build Coastguard Worker {{kSize, kSize, 2*kSize, 2*kSize}, {1, 0, 1, 1}}, 65*c8dee2aaSAndroid Build Coastguard Worker }; 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker // onscreen for reference 68*c8dee2aaSAndroid Build Coastguard Worker for (const auto& c : clears) { 69*c8dee2aaSAndroid Build Coastguard Worker sfc->clear(c.rect, c.color); 70*c8dee2aaSAndroid Build Coastguard Worker } 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker // partial clear offscreen 73*c8dee2aaSAndroid Build Coastguard Worker auto offscreen = make_offscreen({2*kSize, 2*kSize}); 74*c8dee2aaSAndroid Build Coastguard Worker for (const auto& c : clears) { 75*c8dee2aaSAndroid Build Coastguard Worker offscreen->clear(c.rect, c.color); 76*c8dee2aaSAndroid Build Coastguard Worker } 77*c8dee2aaSAndroid Build Coastguard Worker sfc->blitTexture(offscreen->readSurfaceView(), 78*c8dee2aaSAndroid Build Coastguard Worker SkIRect::MakeSize({2*kSize, 2*kSize}), 79*c8dee2aaSAndroid Build Coastguard Worker SkIPoint{2*kSize, 0}); 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker // full offscreen clears 82*c8dee2aaSAndroid Build Coastguard Worker for (const auto& c : clears) { 83*c8dee2aaSAndroid Build Coastguard Worker offscreen = make_offscreen(c.rect.size()); 84*c8dee2aaSAndroid Build Coastguard Worker offscreen->clear(SkIRect::MakeSize(c.rect.size()), c.color); 85*c8dee2aaSAndroid Build Coastguard Worker sfc->blitTexture(offscreen->readSurfaceView(), 86*c8dee2aaSAndroid Build Coastguard Worker SkIRect::MakeSize(offscreen->dimensions()), 87*c8dee2aaSAndroid Build Coastguard Worker c.rect.topLeft() + SkIPoint{4*kSize, 0}); 88*c8dee2aaSAndroid Build Coastguard Worker } 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kOk; 91*c8dee2aaSAndroid Build Coastguard Worker } 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiagm 94