1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2010 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 skgpu_v1_Device_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_v1_Device_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkClipOp.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.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/SkShader.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMacros.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkDevice.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkMatrixPriv.h" 26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ClipStack.h" 27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColorInfo.h" 28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h" 29*c8dee2aaSAndroid Build Coastguard Worker #include "src/text/gpu/SubRunControl.h" 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 32*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 33*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker class GrBackendSemaphore; 36*c8dee2aaSAndroid Build Coastguard Worker class GrClip; 37*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext; 38*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTargetProxy; 39*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy; 40*c8dee2aaSAndroid Build Coastguard Worker class SkBitmap; 41*c8dee2aaSAndroid Build Coastguard Worker class SkBlender; 42*c8dee2aaSAndroid Build Coastguard Worker class SkColorSpace; 43*c8dee2aaSAndroid Build Coastguard Worker class SkDrawable; 44*c8dee2aaSAndroid Build Coastguard Worker class SkLatticeIter; 45*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix; 46*c8dee2aaSAndroid Build Coastguard Worker class SkMesh; 47*c8dee2aaSAndroid Build Coastguard Worker class SkPaint; 48*c8dee2aaSAndroid Build Coastguard Worker class SkPath; 49*c8dee2aaSAndroid Build Coastguard Worker class SkPixmap; 50*c8dee2aaSAndroid Build Coastguard Worker class SkRRect; 51*c8dee2aaSAndroid Build Coastguard Worker class SkRegion; 52*c8dee2aaSAndroid Build Coastguard Worker class SkSpecialImage; 53*c8dee2aaSAndroid Build Coastguard Worker class SkSurfaceProps; 54*c8dee2aaSAndroid Build Coastguard Worker class SkSurface_Ganesh; 55*c8dee2aaSAndroid Build Coastguard Worker class SkVertices; 56*c8dee2aaSAndroid Build Coastguard Worker enum SkAlphaType : int; 57*c8dee2aaSAndroid Build Coastguard Worker enum SkColorType : int; 58*c8dee2aaSAndroid Build Coastguard Worker enum class GrAA : bool; 59*c8dee2aaSAndroid Build Coastguard Worker enum class GrColorType; 60*c8dee2aaSAndroid Build Coastguard Worker enum class SkBackingFit; 61*c8dee2aaSAndroid Build Coastguard Worker enum class SkBlendMode; 62*c8dee2aaSAndroid Build Coastguard Worker enum class SkTileMode; 63*c8dee2aaSAndroid Build Coastguard Worker struct SkArc; 64*c8dee2aaSAndroid Build Coastguard Worker struct SkDrawShadowRec; 65*c8dee2aaSAndroid Build Coastguard Worker struct SkISize; 66*c8dee2aaSAndroid Build Coastguard Worker struct SkPoint; 67*c8dee2aaSAndroid Build Coastguard Worker struct SkRSXform; 68*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 69*c8dee2aaSAndroid Build Coastguard Worker enum class Budgeted : bool; 70*c8dee2aaSAndroid Build Coastguard Worker enum class Mipmapped : bool; 71*c8dee2aaSAndroid Build Coastguard Worker class TiledTextureUtils; 72*c8dee2aaSAndroid Build Coastguard Worker } 73*c8dee2aaSAndroid Build Coastguard Worker namespace skif { 74*c8dee2aaSAndroid Build Coastguard Worker class Backend; 75*c8dee2aaSAndroid Build Coastguard Worker } 76*c8dee2aaSAndroid Build Coastguard Worker namespace sktext { 77*c8dee2aaSAndroid Build Coastguard Worker class GlyphRunList; 78*c8dee2aaSAndroid Build Coastguard Worker namespace gpu { 79*c8dee2aaSAndroid Build Coastguard Worker class Slug; 80*c8dee2aaSAndroid Build Coastguard Worker }} 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh { 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker class SurfaceContext; 86*c8dee2aaSAndroid Build Coastguard Worker class SurfaceFillContext; 87*c8dee2aaSAndroid Build Coastguard Worker class SurfaceDrawContext; 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker /** 90*c8dee2aaSAndroid Build Coastguard Worker * Subclass of SkDevice, which directs all drawing to the GrGpu owned by the canvas. 91*c8dee2aaSAndroid Build Coastguard Worker */ 92*c8dee2aaSAndroid Build Coastguard Worker class Device final : public SkDevice { 93*c8dee2aaSAndroid Build Coastguard Worker public: 94*c8dee2aaSAndroid Build Coastguard Worker enum class InitContents { 95*c8dee2aaSAndroid Build Coastguard Worker kClear, 96*c8dee2aaSAndroid Build Coastguard Worker kUninit 97*c8dee2aaSAndroid Build Coastguard Worker }; 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView readSurfaceView(); 100*c8dee2aaSAndroid Build Coastguard Worker GrRenderTargetProxy* targetProxy(); 101*c8dee2aaSAndroid Build Coastguard Worker recordingContext()102*c8dee2aaSAndroid Build Coastguard Worker GrRecordingContext* recordingContext() const override { return fContext.get(); } 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker bool wait(int numSemaphores, 105*c8dee2aaSAndroid Build Coastguard Worker const GrBackendSemaphore* waitSemaphores, 106*c8dee2aaSAndroid Build Coastguard Worker bool deleteSemaphoresAfterWait); 107*c8dee2aaSAndroid Build Coastguard Worker 108*c8dee2aaSAndroid Build Coastguard Worker void discard(); 109*c8dee2aaSAndroid Build Coastguard Worker void resolveMSAA(); 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker bool replaceBackingProxy(SkSurface::ContentChangeMode, 112*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrRenderTargetProxy>, 113*c8dee2aaSAndroid Build Coastguard Worker GrColorType, 114*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace>, 115*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin, 116*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps&); 117*c8dee2aaSAndroid Build Coastguard Worker bool replaceBackingProxy(SkSurface::ContentChangeMode); 118*c8dee2aaSAndroid Build Coastguard Worker 119*c8dee2aaSAndroid Build Coastguard Worker using RescaleGamma = SkImage::RescaleGamma; 120*c8dee2aaSAndroid Build Coastguard Worker using RescaleMode = SkImage::RescaleMode; 121*c8dee2aaSAndroid Build Coastguard Worker using ReadPixelsCallback = SkImage::ReadPixelsCallback; 122*c8dee2aaSAndroid Build Coastguard Worker using ReadPixelsContext = SkImage::ReadPixelsContext; 123*c8dee2aaSAndroid Build Coastguard Worker 124*c8dee2aaSAndroid Build Coastguard Worker void asyncRescaleAndReadPixels(const SkImageInfo& info, 125*c8dee2aaSAndroid Build Coastguard Worker const SkIRect& srcRect, 126*c8dee2aaSAndroid Build Coastguard Worker RescaleGamma rescaleGamma, 127*c8dee2aaSAndroid Build Coastguard Worker RescaleMode rescaleMode, 128*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsCallback callback, 129*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsContext context); 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker void asyncRescaleAndReadPixelsYUV420(SkYUVColorSpace yuvColorSpace, 132*c8dee2aaSAndroid Build Coastguard Worker bool readAlpha, 133*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> dstColorSpace, 134*c8dee2aaSAndroid Build Coastguard Worker const SkIRect& srcRect, 135*c8dee2aaSAndroid Build Coastguard Worker SkISize dstSize, 136*c8dee2aaSAndroid Build Coastguard Worker RescaleGamma rescaleGamma, 137*c8dee2aaSAndroid Build Coastguard Worker RescaleMode, 138*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsCallback callback, 139*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsContext context); 140*c8dee2aaSAndroid Build Coastguard Worker 141*c8dee2aaSAndroid Build Coastguard Worker /** 142*c8dee2aaSAndroid Build Coastguard Worker * This factory uses the color space, origin, surface properties, and initialization 143*c8dee2aaSAndroid Build Coastguard Worker * method along with the provided proxy to create the gpu device. 144*c8dee2aaSAndroid Build Coastguard Worker */ 145*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<Device> Make(GrRecordingContext*, 146*c8dee2aaSAndroid Build Coastguard Worker GrColorType, 147*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurfaceProxy>, 148*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace>, 149*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin, 150*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps&, 151*c8dee2aaSAndroid Build Coastguard Worker InitContents); 152*c8dee2aaSAndroid Build Coastguard Worker 153*c8dee2aaSAndroid Build Coastguard Worker /** 154*c8dee2aaSAndroid Build Coastguard Worker * This factory uses the budgeted, imageInfo, fit, sampleCount, mipmapped, and isProtected 155*c8dee2aaSAndroid Build Coastguard Worker * parameters to create a proxy to back the gpu device. The color space (from the image info), 156*c8dee2aaSAndroid Build Coastguard Worker * origin, surface properties, and initialization method are then used (with the created proxy) 157*c8dee2aaSAndroid Build Coastguard Worker * to create the device. 158*c8dee2aaSAndroid Build Coastguard Worker */ 159*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<Device> Make(GrRecordingContext*, 160*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted, 161*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo&, 162*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit, 163*c8dee2aaSAndroid Build Coastguard Worker int sampleCount, 164*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped, 165*c8dee2aaSAndroid Build Coastguard Worker GrProtected, 166*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin, 167*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps&, 168*c8dee2aaSAndroid Build Coastguard Worker InitContents); 169*c8dee2aaSAndroid Build Coastguard Worker 170*c8dee2aaSAndroid Build Coastguard Worker ~Device() override; 171*c8dee2aaSAndroid Build Coastguard Worker 172*c8dee2aaSAndroid Build Coastguard Worker SurfaceDrawContext* surfaceDrawContext(); 173*c8dee2aaSAndroid Build Coastguard Worker const SurfaceDrawContext* surfaceDrawContext() const; 174*c8dee2aaSAndroid Build Coastguard Worker SurfaceFillContext* surfaceFillContext(); 175*c8dee2aaSAndroid Build Coastguard Worker 176*c8dee2aaSAndroid Build Coastguard Worker SkStrikeDeviceInfo strikeDeviceInfo() const override; 177*c8dee2aaSAndroid Build Coastguard Worker 178*c8dee2aaSAndroid Build Coastguard Worker // set all pixels to 0 179*c8dee2aaSAndroid Build Coastguard Worker void clearAll(); 180*c8dee2aaSAndroid Build Coastguard Worker 181*c8dee2aaSAndroid Build Coastguard Worker void drawPaint(const SkPaint& paint) override; 182*c8dee2aaSAndroid Build Coastguard Worker void drawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint[], 183*c8dee2aaSAndroid Build Coastguard Worker const SkPaint& paint) override; 184*c8dee2aaSAndroid Build Coastguard Worker void drawRect(const SkRect& r, const SkPaint& paint) override; 185*c8dee2aaSAndroid Build Coastguard Worker void drawRRect(const SkRRect& r, const SkPaint& paint) override; 186*c8dee2aaSAndroid Build Coastguard Worker void drawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) override; 187*c8dee2aaSAndroid Build Coastguard Worker void drawRegion(const SkRegion& r, const SkPaint& paint) override; 188*c8dee2aaSAndroid Build Coastguard Worker void drawOval(const SkRect& oval, const SkPaint& paint) override; 189*c8dee2aaSAndroid Build Coastguard Worker void drawArc(const SkArc& arc, const SkPaint& paint) override; 190*c8dee2aaSAndroid Build Coastguard Worker void drawPath(const SkPath& path, const SkPaint& paint, bool pathIsMutable) override; 191*c8dee2aaSAndroid Build Coastguard Worker 192*c8dee2aaSAndroid Build Coastguard Worker void drawVertices(const SkVertices*, sk_sp<SkBlender>, const SkPaint&, bool) override; 193*c8dee2aaSAndroid Build Coastguard Worker void drawMesh(const SkMesh&, sk_sp<SkBlender>, const SkPaint&) override; 194*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ENABLE_OPTIMIZE_SIZE) 195*c8dee2aaSAndroid Build Coastguard Worker void drawShadow(const SkPath&, const SkDrawShadowRec&) override; 196*c8dee2aaSAndroid Build Coastguard Worker #endif 197*c8dee2aaSAndroid Build Coastguard Worker void drawAtlas(const SkRSXform[], const SkRect[], const SkColor[], int count, sk_sp<SkBlender>, 198*c8dee2aaSAndroid Build Coastguard Worker const SkPaint&) override; 199*c8dee2aaSAndroid Build Coastguard Worker 200*c8dee2aaSAndroid Build Coastguard Worker void drawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, 201*c8dee2aaSAndroid Build Coastguard Worker const SkSamplingOptions&, const SkPaint&, 202*c8dee2aaSAndroid Build Coastguard Worker SkCanvas::SrcRectConstraint) override; shouldDrawAsTiledImageRect()203*c8dee2aaSAndroid Build Coastguard Worker bool shouldDrawAsTiledImageRect() const override { return true; } 204*c8dee2aaSAndroid Build Coastguard Worker bool drawAsTiledImageRect(SkCanvas*, 205*c8dee2aaSAndroid Build Coastguard Worker const SkImage*, 206*c8dee2aaSAndroid Build Coastguard Worker const SkRect* src, 207*c8dee2aaSAndroid Build Coastguard Worker const SkRect& dst, 208*c8dee2aaSAndroid Build Coastguard Worker const SkSamplingOptions&, 209*c8dee2aaSAndroid Build Coastguard Worker const SkPaint&, 210*c8dee2aaSAndroid Build Coastguard Worker SkCanvas::SrcRectConstraint) override; 211*c8dee2aaSAndroid Build Coastguard Worker void drawImageLattice(const SkImage*, const SkCanvas::Lattice&, 212*c8dee2aaSAndroid Build Coastguard Worker const SkRect& dst, SkFilterMode, const SkPaint&) override; 213*c8dee2aaSAndroid Build Coastguard Worker 214*c8dee2aaSAndroid Build Coastguard Worker void drawDrawable(SkCanvas*, SkDrawable*, const SkMatrix*) override; 215*c8dee2aaSAndroid Build Coastguard Worker 216*c8dee2aaSAndroid Build Coastguard Worker void drawDevice(SkDevice*, const SkSamplingOptions&, const SkPaint&) override; 217*c8dee2aaSAndroid Build Coastguard Worker void drawSpecial(SkSpecialImage*, const SkMatrix& localToDevice, const SkSamplingOptions&, 218*c8dee2aaSAndroid Build Coastguard Worker const SkPaint&, SkCanvas::SrcRectConstraint) override; 219*c8dee2aaSAndroid Build Coastguard Worker 220*c8dee2aaSAndroid Build Coastguard Worker void drawEdgeAAQuad(const SkRect& rect, const SkPoint clip[4], SkCanvas::QuadAAFlags aaFlags, 221*c8dee2aaSAndroid Build Coastguard Worker const SkColor4f& color, SkBlendMode mode) override; 222*c8dee2aaSAndroid Build Coastguard Worker void drawEdgeAAImageSet(const SkCanvas::ImageSetEntry[], int count, const SkPoint dstClips[], 223*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix preViewMatrices[], const SkSamplingOptions&, 224*c8dee2aaSAndroid Build Coastguard Worker const SkPaint&, SkCanvas::SrcRectConstraint) override; 225*c8dee2aaSAndroid Build Coastguard Worker 226*c8dee2aaSAndroid Build Coastguard Worker // Assumes the src and dst rects have already been optimized to fit the proxy. 227*c8dee2aaSAndroid Build Coastguard Worker // Only implemented by the gpu devices. 228*c8dee2aaSAndroid Build Coastguard Worker // This method is the lowest level draw used for tiled bitmap draws. It doesn't attempt to 229*c8dee2aaSAndroid Build Coastguard Worker // modify its parameters (e.g., adjust src & dst) but just draws the image however it can. It 230*c8dee2aaSAndroid Build Coastguard Worker // could, almost, be replaced with a drawEdgeAAImageSet call for the tiled bitmap draw use 231*c8dee2aaSAndroid Build Coastguard Worker // case but the extra tilemode requirement and the intermediate parameter processing (e.g., 232*c8dee2aaSAndroid Build Coastguard Worker // trying to alter the SrcRectConstraint) currently block that. 233*c8dee2aaSAndroid Build Coastguard Worker void drawEdgeAAImage(const SkImage*, 234*c8dee2aaSAndroid Build Coastguard Worker const SkRect& src, 235*c8dee2aaSAndroid Build Coastguard Worker const SkRect& dst, 236*c8dee2aaSAndroid Build Coastguard Worker const SkPoint dstClip[4], 237*c8dee2aaSAndroid Build Coastguard Worker SkCanvas::QuadAAFlags, 238*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& localToDevice, 239*c8dee2aaSAndroid Build Coastguard Worker const SkSamplingOptions&, 240*c8dee2aaSAndroid Build Coastguard Worker const SkPaint&, 241*c8dee2aaSAndroid Build Coastguard Worker SkCanvas::SrcRectConstraint, 242*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& srcToDst, 243*c8dee2aaSAndroid Build Coastguard Worker SkTileMode); 244*c8dee2aaSAndroid Build Coastguard Worker 245*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sktext::gpu::Slug> convertGlyphRunListToSlug(const sktext::GlyphRunList& glyphRunList, 246*c8dee2aaSAndroid Build Coastguard Worker const SkPaint& paint) override; 247*c8dee2aaSAndroid Build Coastguard Worker 248*c8dee2aaSAndroid Build Coastguard Worker void drawSlug(SkCanvas*, const sktext::gpu::Slug* slug, const SkPaint& paint) override; 249*c8dee2aaSAndroid Build Coastguard Worker 250*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSpecialImage> makeSpecial(const SkBitmap&) override; 251*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSpecialImage> makeSpecial(const SkImage*) override; 252*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSpecialImage> snapSpecial(const SkIRect& subset, bool forceCopy = false) override; 253*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSpecialImage> snapSpecialScaled(const SkIRect& subset, const SkISize& dstDims) override; 254*c8dee2aaSAndroid Build Coastguard Worker 255*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkDevice> createDevice(const CreateInfo&, const SkPaint*) override; 256*c8dee2aaSAndroid Build Coastguard Worker 257*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> makeSurface(const SkImageInfo&, const SkSurfaceProps&) override; 258*c8dee2aaSAndroid Build Coastguard Worker asGaneshDevice()259*c8dee2aaSAndroid Build Coastguard Worker Device* asGaneshDevice() override { return this; } 260*c8dee2aaSAndroid Build Coastguard Worker devClipBounds()261*c8dee2aaSAndroid Build Coastguard Worker SkIRect devClipBounds() const override { return fClip.getConservativeBounds(); } 262*c8dee2aaSAndroid Build Coastguard Worker pushClipStack()263*c8dee2aaSAndroid Build Coastguard Worker void pushClipStack() override { fClip.save(); } popClipStack()264*c8dee2aaSAndroid Build Coastguard Worker void popClipStack() override { fClip.restore(); } 265*c8dee2aaSAndroid Build Coastguard Worker clipRect(const SkRect & rect,SkClipOp op,bool aa)266*c8dee2aaSAndroid Build Coastguard Worker void clipRect(const SkRect& rect, SkClipOp op, bool aa) override { 267*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(op == SkClipOp::kIntersect || op == SkClipOp::kDifference); 268*c8dee2aaSAndroid Build Coastguard Worker fClip.clipRect(this->localToDevice(), rect, GrAA(aa), op); 269*c8dee2aaSAndroid Build Coastguard Worker } clipRRect(const SkRRect & rrect,SkClipOp op,bool aa)270*c8dee2aaSAndroid Build Coastguard Worker void clipRRect(const SkRRect& rrect, SkClipOp op, bool aa) override { 271*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(op == SkClipOp::kIntersect || op == SkClipOp::kDifference); 272*c8dee2aaSAndroid Build Coastguard Worker fClip.clipRRect(this->localToDevice(), rrect, GrAA(aa), op); 273*c8dee2aaSAndroid Build Coastguard Worker } 274*c8dee2aaSAndroid Build Coastguard Worker void clipPath(const SkPath& path, SkClipOp op, bool aa) override; 275*c8dee2aaSAndroid Build Coastguard Worker replaceClip(const SkIRect & rect)276*c8dee2aaSAndroid Build Coastguard Worker void replaceClip(const SkIRect& rect) override { 277*c8dee2aaSAndroid Build Coastguard Worker // Transform from "global/canvas" coordinates to relative to this device 278*c8dee2aaSAndroid Build Coastguard Worker SkRect deviceRect = SkMatrixPriv::MapRect(this->globalToDevice(), SkRect::Make(rect)); 279*c8dee2aaSAndroid Build Coastguard Worker fClip.replaceClip(deviceRect.round()); 280*c8dee2aaSAndroid Build Coastguard Worker } 281*c8dee2aaSAndroid Build Coastguard Worker void clipRegion(const SkRegion& globalRgn, SkClipOp op) override; 282*c8dee2aaSAndroid Build Coastguard Worker 283*c8dee2aaSAndroid Build Coastguard Worker bool isClipAntiAliased() const override; 284*c8dee2aaSAndroid Build Coastguard Worker isClipEmpty()285*c8dee2aaSAndroid Build Coastguard Worker bool isClipEmpty() const override { 286*c8dee2aaSAndroid Build Coastguard Worker return fClip.clipState() == ClipStack::ClipState::kEmpty; 287*c8dee2aaSAndroid Build Coastguard Worker } 288*c8dee2aaSAndroid Build Coastguard Worker isClipRect()289*c8dee2aaSAndroid Build Coastguard Worker bool isClipRect() const override { 290*c8dee2aaSAndroid Build Coastguard Worker return fClip.clipState() == ClipStack::ClipState::kDeviceRect || 291*c8dee2aaSAndroid Build Coastguard Worker fClip.clipState() == ClipStack::ClipState::kWideOpen; 292*c8dee2aaSAndroid Build Coastguard Worker } 293*c8dee2aaSAndroid Build Coastguard Worker isClipWideOpen()294*c8dee2aaSAndroid Build Coastguard Worker bool isClipWideOpen() const override { 295*c8dee2aaSAndroid Build Coastguard Worker return fClip.clipState() == ClipStack::ClipState::kWideOpen; 296*c8dee2aaSAndroid Build Coastguard Worker } 297*c8dee2aaSAndroid Build Coastguard Worker 298*c8dee2aaSAndroid Build Coastguard Worker void android_utils_clipAsRgn(SkRegion*) const override; 299*c8dee2aaSAndroid Build Coastguard Worker bool android_utils_clipWithStencil() override; 300*c8dee2aaSAndroid Build Coastguard Worker 301*c8dee2aaSAndroid Build Coastguard Worker private: 302*c8dee2aaSAndroid Build Coastguard Worker enum class DeviceFlags { 303*c8dee2aaSAndroid Build Coastguard Worker kNone = 0, 304*c8dee2aaSAndroid Build Coastguard Worker kNeedClear = 1 << 0, //!< Surface requires an initial clear 305*c8dee2aaSAndroid Build Coastguard Worker kIsOpaque = 1 << 1, //!< Hint from client that rendering to this device will be 306*c8dee2aaSAndroid Build Coastguard Worker // opaque even if the config supports alpha. 307*c8dee2aaSAndroid Build Coastguard Worker }; 308*c8dee2aaSAndroid Build Coastguard Worker SK_DECL_BITFIELD_CLASS_OPS_FRIENDS(DeviceFlags); 309*c8dee2aaSAndroid Build Coastguard Worker 310*c8dee2aaSAndroid Build Coastguard Worker static SkImageInfo MakeInfo(SurfaceContext*, DeviceFlags); 311*c8dee2aaSAndroid Build Coastguard Worker static bool CheckAlphaTypeAndGetFlags(SkAlphaType, InitContents, DeviceFlags*); 312*c8dee2aaSAndroid Build Coastguard Worker 313*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrRecordingContext> fContext; 314*c8dee2aaSAndroid Build Coastguard Worker 315*c8dee2aaSAndroid Build Coastguard Worker const sktext::gpu::SubRunControl fSubRunControl; 316*c8dee2aaSAndroid Build Coastguard Worker 317*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SurfaceDrawContext> fSurfaceDrawContext; 318*c8dee2aaSAndroid Build Coastguard Worker 319*c8dee2aaSAndroid Build Coastguard Worker ClipStack fClip; 320*c8dee2aaSAndroid Build Coastguard Worker 321*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<Device> Make(std::unique_ptr<SurfaceDrawContext>, 322*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType, 323*c8dee2aaSAndroid Build Coastguard Worker InitContents); 324*c8dee2aaSAndroid Build Coastguard Worker 325*c8dee2aaSAndroid Build Coastguard Worker Device(std::unique_ptr<SurfaceDrawContext>, DeviceFlags); 326*c8dee2aaSAndroid Build Coastguard Worker 327*c8dee2aaSAndroid Build Coastguard Worker void onDrawGlyphRunList(SkCanvas*, const sktext::GlyphRunList&, const SkPaint& paint) override; 328*c8dee2aaSAndroid Build Coastguard Worker 329*c8dee2aaSAndroid Build Coastguard Worker bool onReadPixels(const SkPixmap&, int, int) override; 330*c8dee2aaSAndroid Build Coastguard Worker bool onWritePixels(const SkPixmap&, int, int) override; 331*c8dee2aaSAndroid Build Coastguard Worker bool onAccessPixels(SkPixmap*) override; 332*c8dee2aaSAndroid Build Coastguard Worker 333*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skif::Backend> createImageFilteringBackend(const SkSurfaceProps& surfaceProps, 334*c8dee2aaSAndroid Build Coastguard Worker SkColorType colorType) const override; 335*c8dee2aaSAndroid Build Coastguard Worker onClipShader(sk_sp<SkShader> shader)336*c8dee2aaSAndroid Build Coastguard Worker void onClipShader(sk_sp<SkShader> shader) override { 337*c8dee2aaSAndroid Build Coastguard Worker fClip.clipShader(std::move(shader)); 338*c8dee2aaSAndroid Build Coastguard Worker } 339*c8dee2aaSAndroid Build Coastguard Worker clip()340*c8dee2aaSAndroid Build Coastguard Worker const GrClip* clip() const { return &fClip; } 341*c8dee2aaSAndroid Build Coastguard Worker 342*c8dee2aaSAndroid Build Coastguard Worker // If not null, dstClip must be contained inside dst and will also respect the edge AA flags. 343*c8dee2aaSAndroid Build Coastguard Worker // If 'preViewMatrix' is not null, final CTM will be this->ctm() * preViewMatrix. 344*c8dee2aaSAndroid Build Coastguard Worker void drawImageQuadDirect(const SkImage*, 345*c8dee2aaSAndroid Build Coastguard Worker const SkRect& src, 346*c8dee2aaSAndroid Build Coastguard Worker const SkRect& dst, 347*c8dee2aaSAndroid Build Coastguard Worker const SkPoint dstClip[4], 348*c8dee2aaSAndroid Build Coastguard Worker SkCanvas::QuadAAFlags, 349*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix* preViewMatrix, 350*c8dee2aaSAndroid Build Coastguard Worker const SkSamplingOptions&, 351*c8dee2aaSAndroid Build Coastguard Worker const SkPaint&, 352*c8dee2aaSAndroid Build Coastguard Worker SkCanvas::SrcRectConstraint); 353*c8dee2aaSAndroid Build Coastguard Worker 354*c8dee2aaSAndroid Build Coastguard Worker // FIXME(michaelludwig) - Should be removed in favor of using drawImageQuad with edge flags to 355*c8dee2aaSAndroid Build Coastguard Worker // for every element in the SkLatticeIter. 356*c8dee2aaSAndroid Build Coastguard Worker void drawViewLattice(GrSurfaceProxyView, 357*c8dee2aaSAndroid Build Coastguard Worker const GrColorInfo& colorInfo, 358*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkLatticeIter>, 359*c8dee2aaSAndroid Build Coastguard Worker const SkRect& dst, 360*c8dee2aaSAndroid Build Coastguard Worker SkFilterMode, 361*c8dee2aaSAndroid Build Coastguard Worker const SkPaint&); 362*c8dee2aaSAndroid Build Coastguard Worker 363*c8dee2aaSAndroid Build Coastguard Worker friend class ::SkSurface_Ganesh; // for access to surfaceProps 364*c8dee2aaSAndroid Build Coastguard Worker friend class skgpu::TiledTextureUtils; // for access to clip() 365*c8dee2aaSAndroid Build Coastguard Worker }; 366*c8dee2aaSAndroid Build Coastguard Worker 367*c8dee2aaSAndroid Build Coastguard Worker SK_MAKE_BITFIELD_CLASS_OPS(Device::DeviceFlags) 368*c8dee2aaSAndroid Build Coastguard Worker 369*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::ganesh 370*c8dee2aaSAndroid Build Coastguard Worker 371*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_v1_Device_DEFINED 372