1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 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 #ifndef SurfaceDrawContext_v1_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define SurfaceDrawContext_v1_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkDrawable.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRegion.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStrokeRec.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurfaceProps.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkColorData.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkPoint_impl.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h" 26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColorSpaceXform.h" 27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrPaint.h" 28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTargetProxy.h" 29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h" 30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h" 31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h" 32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/SurfaceFillContext.h" 33*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/geometry/GrQuad.h" 34*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrOp.h" 35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/OpsTask.h" 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 38*c8dee2aaSAndroid Build Coastguard Worker #include <functional> 39*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 40*c8dee2aaSAndroid Build Coastguard Worker #include <string_view> 41*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker class GrBackendFormat; 44*c8dee2aaSAndroid Build Coastguard Worker class GrBackendSemaphore; 45*c8dee2aaSAndroid Build Coastguard Worker class GrBackendTexture; 46*c8dee2aaSAndroid Build Coastguard Worker class GrClip; 47*c8dee2aaSAndroid Build Coastguard Worker class GrDstProxyView; 48*c8dee2aaSAndroid Build Coastguard Worker class GrFragmentProcessor; 49*c8dee2aaSAndroid Build Coastguard Worker class GrHardClip; 50*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext; 51*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTarget; 52*c8dee2aaSAndroid Build Coastguard Worker class GrStyle; 53*c8dee2aaSAndroid Build Coastguard Worker class GrStyledShape; 54*c8dee2aaSAndroid Build Coastguard Worker class SkColorSpace; 55*c8dee2aaSAndroid Build Coastguard Worker class SkLatticeIter; 56*c8dee2aaSAndroid Build Coastguard Worker class SkMesh; 57*c8dee2aaSAndroid Build Coastguard Worker class SkPath; 58*c8dee2aaSAndroid Build Coastguard Worker class SkRRect; 59*c8dee2aaSAndroid Build Coastguard Worker class SkVertices; 60*c8dee2aaSAndroid Build Coastguard Worker enum SkAlphaType : int; 61*c8dee2aaSAndroid Build Coastguard Worker enum class SkBackingFit; 62*c8dee2aaSAndroid Build Coastguard Worker enum class SkBlendMode; 63*c8dee2aaSAndroid Build Coastguard Worker struct GrQuadSetEntry; 64*c8dee2aaSAndroid Build Coastguard Worker struct GrTextureSetEntry; 65*c8dee2aaSAndroid Build Coastguard Worker struct GrUserStencilSettings; 66*c8dee2aaSAndroid Build Coastguard Worker struct SkArc; 67*c8dee2aaSAndroid Build Coastguard Worker struct SkDrawShadowRec; 68*c8dee2aaSAndroid Build Coastguard Worker struct SkISize; 69*c8dee2aaSAndroid Build Coastguard Worker struct SkRSXform; 70*c8dee2aaSAndroid Build Coastguard Worker struct SkStrikeDeviceInfo; 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 73*c8dee2aaSAndroid Build Coastguard Worker class RefCntedCallback; 74*c8dee2aaSAndroid Build Coastguard Worker class Swizzle; 75*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker namespace sktext { 78*c8dee2aaSAndroid Build Coastguard Worker class GlyphRunList; 79*c8dee2aaSAndroid Build Coastguard Worker } 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh { 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker /** 84*c8dee2aaSAndroid Build Coastguard Worker * A helper object to orchestrate commands (draws, etc...) for GrSurfaces that are GrRenderTargets. 85*c8dee2aaSAndroid Build Coastguard Worker */ 86*c8dee2aaSAndroid Build Coastguard Worker class SurfaceDrawContext final : public SurfaceFillContext { 87*c8dee2aaSAndroid Build Coastguard Worker public: 88*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SurfaceDrawContext> Make(GrRecordingContext*, 89*c8dee2aaSAndroid Build Coastguard Worker GrColorType, 90*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurfaceProxy>, 91*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace>, 92*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin, 93*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps&); 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker /* Uses the default texture format for the color type */ 96*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SurfaceDrawContext> Make(GrRecordingContext*, 97*c8dee2aaSAndroid Build Coastguard Worker GrColorType, 98*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace>, 99*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit, 100*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions, 101*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps&, 102*c8dee2aaSAndroid Build Coastguard Worker std::string_view label, 103*c8dee2aaSAndroid Build Coastguard Worker int sampleCnt = 1, 104*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped = skgpu::Mipmapped::kNo, 105*c8dee2aaSAndroid Build Coastguard Worker skgpu::Protected = skgpu::Protected::kNo, 106*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin = kBottomLeft_GrSurfaceOrigin, 107*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted = skgpu::Budgeted::kYes); 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker /** 110*c8dee2aaSAndroid Build Coastguard Worker * Takes custom swizzles rather than determining swizzles from color type and format. 111*c8dee2aaSAndroid Build Coastguard Worker * It will have color type kUnknown. 112*c8dee2aaSAndroid Build Coastguard Worker */ 113*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SurfaceDrawContext> Make(GrRecordingContext*, 114*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace>, 115*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit, 116*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions, 117*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat&, 118*c8dee2aaSAndroid Build Coastguard Worker int sampleCnt, 119*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped, 120*c8dee2aaSAndroid Build Coastguard Worker skgpu::Protected, 121*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle readSwizzle, 122*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle writeSwizzle, 123*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin, 124*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted, 125*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps&, 126*c8dee2aaSAndroid Build Coastguard Worker std::string_view label); 127*c8dee2aaSAndroid Build Coastguard Worker 128*c8dee2aaSAndroid Build Coastguard Worker // Same as previous factory but will try to use fallback GrColorTypes if the one passed in 129*c8dee2aaSAndroid Build Coastguard Worker // fails. The fallback GrColorType will have at least the number of channels and precision per 130*c8dee2aaSAndroid Build Coastguard Worker // channel as the passed in GrColorType. It may also swizzle the changes (e.g., BGRA -> RGBA). 131*c8dee2aaSAndroid Build Coastguard Worker // SRGB-ness will be preserved. 132*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SurfaceDrawContext> MakeWithFallback( 133*c8dee2aaSAndroid Build Coastguard Worker GrRecordingContext*, 134*c8dee2aaSAndroid Build Coastguard Worker GrColorType, 135*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace>, 136*c8dee2aaSAndroid Build Coastguard Worker SkBackingFit, 137*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions, 138*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps&, 139*c8dee2aaSAndroid Build Coastguard Worker int sampleCnt, 140*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped, 141*c8dee2aaSAndroid Build Coastguard Worker skgpu::Protected, 142*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin = kBottomLeft_GrSurfaceOrigin, 143*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted = skgpu::Budgeted::kYes); 144*c8dee2aaSAndroid Build Coastguard Worker 145*c8dee2aaSAndroid Build Coastguard Worker // Creates a SurfaceDrawContext that wraps the passed in GrBackendTexture. 146*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SurfaceDrawContext> MakeFromBackendTexture( 147*c8dee2aaSAndroid Build Coastguard Worker GrRecordingContext*, 148*c8dee2aaSAndroid Build Coastguard Worker GrColorType, 149*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace>, 150*c8dee2aaSAndroid Build Coastguard Worker const GrBackendTexture&, 151*c8dee2aaSAndroid Build Coastguard Worker int sampleCnt, 152*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin, 153*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps&, 154*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skgpu::RefCntedCallback> releaseHelper); 155*c8dee2aaSAndroid Build Coastguard Worker 156*c8dee2aaSAndroid Build Coastguard Worker SurfaceDrawContext(GrRecordingContext*, 157*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView readView, 158*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView writeView, 159*c8dee2aaSAndroid Build Coastguard Worker GrColorType, 160*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace>, 161*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps&); 162*c8dee2aaSAndroid Build Coastguard Worker 163*c8dee2aaSAndroid Build Coastguard Worker ~SurfaceDrawContext() override; 164*c8dee2aaSAndroid Build Coastguard Worker 165*c8dee2aaSAndroid Build Coastguard Worker /** 166*c8dee2aaSAndroid Build Coastguard Worker * Draw everywhere (respecting the clip) with the paint. 167*c8dee2aaSAndroid Build Coastguard Worker */ 168*c8dee2aaSAndroid Build Coastguard Worker void drawPaint(const GrClip*, GrPaint&&, const SkMatrix& viewMatrix); 169*c8dee2aaSAndroid Build Coastguard Worker 170*c8dee2aaSAndroid Build Coastguard Worker /** 171*c8dee2aaSAndroid Build Coastguard Worker * Draw the rect using a paint. 172*c8dee2aaSAndroid Build Coastguard Worker * @param paint describes how to color pixels. 173*c8dee2aaSAndroid Build Coastguard Worker * @param GrAA Controls whether rect is antialiased 174*c8dee2aaSAndroid Build Coastguard Worker * @param viewMatrix transformation matrix 175*c8dee2aaSAndroid Build Coastguard Worker * @param style The style to apply. Null means fill. Currently path effects are not 176*c8dee2aaSAndroid Build Coastguard Worker * allowed. 177*c8dee2aaSAndroid Build Coastguard Worker * The rects coords are used to access the paint (through texture matrix) 178*c8dee2aaSAndroid Build Coastguard Worker */ 179*c8dee2aaSAndroid Build Coastguard Worker void drawRect(const GrClip*, 180*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint, 181*c8dee2aaSAndroid Build Coastguard Worker GrAA, 182*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 183*c8dee2aaSAndroid Build Coastguard Worker const SkRect&, 184*c8dee2aaSAndroid Build Coastguard Worker const GrStyle* style = nullptr); 185*c8dee2aaSAndroid Build Coastguard Worker 186*c8dee2aaSAndroid Build Coastguard Worker /** 187*c8dee2aaSAndroid Build Coastguard Worker * Maps a rectangle of shader coordinates to a rectangle and fills that rectangle. 188*c8dee2aaSAndroid Build Coastguard Worker * 189*c8dee2aaSAndroid Build Coastguard Worker * @param GrPaint describes how to color pixels. 190*c8dee2aaSAndroid Build Coastguard Worker * @param GrAA Controls whether rect is antialiased 191*c8dee2aaSAndroid Build Coastguard Worker * @param SkMatrix transformation matrix which applies to rectToDraw 192*c8dee2aaSAndroid Build Coastguard Worker * @param rectToDraw the rectangle to draw 193*c8dee2aaSAndroid Build Coastguard Worker * @param localRect the rectangle of shader coordinates applied to rectToDraw 194*c8dee2aaSAndroid Build Coastguard Worker */ 195*c8dee2aaSAndroid Build Coastguard Worker void fillRectToRect(const GrClip*, 196*c8dee2aaSAndroid Build Coastguard Worker GrPaint&&, 197*c8dee2aaSAndroid Build Coastguard Worker GrAA, 198*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix&, 199*c8dee2aaSAndroid Build Coastguard Worker const SkRect& rectToDraw, 200*c8dee2aaSAndroid Build Coastguard Worker const SkRect& localRect); 201*c8dee2aaSAndroid Build Coastguard Worker 202*c8dee2aaSAndroid Build Coastguard Worker /** 203*c8dee2aaSAndroid Build Coastguard Worker * Fills a block of pixels with a paint and a localMatrix, respecting the clip. 204*c8dee2aaSAndroid Build Coastguard Worker */ fillPixelsWithLocalMatrix(const GrClip * clip,GrPaint && paint,const SkIRect & bounds,const SkMatrix & localMatrix)205*c8dee2aaSAndroid Build Coastguard Worker void fillPixelsWithLocalMatrix(const GrClip* clip, 206*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint, 207*c8dee2aaSAndroid Build Coastguard Worker const SkIRect& bounds, 208*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& localMatrix) { 209*c8dee2aaSAndroid Build Coastguard Worker SkRect rect = SkRect::Make(bounds); 210*c8dee2aaSAndroid Build Coastguard Worker DrawQuad quad{GrQuad::MakeFromRect(rect, SkMatrix::I()), 211*c8dee2aaSAndroid Build Coastguard Worker GrQuad::MakeFromRect(rect, localMatrix), GrQuadAAFlags::kNone}; 212*c8dee2aaSAndroid Build Coastguard Worker this->drawFilledQuad(clip, std::move(paint), &quad); 213*c8dee2aaSAndroid Build Coastguard Worker } 214*c8dee2aaSAndroid Build Coastguard Worker 215*c8dee2aaSAndroid Build Coastguard Worker /** 216*c8dee2aaSAndroid Build Coastguard Worker * Creates an op that draws a fill rect with per-edge control over anti-aliasing. 217*c8dee2aaSAndroid Build Coastguard Worker * 218*c8dee2aaSAndroid Build Coastguard Worker * This is a specialized version of fillQuadWithEdgeAA, but is kept separate since knowing 219*c8dee2aaSAndroid Build Coastguard Worker * the geometry is a rectangle affords more optimizations. 220*c8dee2aaSAndroid Build Coastguard Worker */ 221*c8dee2aaSAndroid Build Coastguard Worker void fillRectWithEdgeAA(const GrClip* clip, GrPaint&& paint, GrQuadAAFlags edgeAA, 222*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, const SkRect& rect, 223*c8dee2aaSAndroid Build Coastguard Worker const SkRect* optionalLocalRect = nullptr) { 224*c8dee2aaSAndroid Build Coastguard Worker if (edgeAA == GrQuadAAFlags::kAll) { 225*c8dee2aaSAndroid Build Coastguard Worker this->fillRectToRect(clip, std::move(paint), GrAA::kYes, viewMatrix, rect, 226*c8dee2aaSAndroid Build Coastguard Worker (optionalLocalRect) ? *optionalLocalRect : rect); 227*c8dee2aaSAndroid Build Coastguard Worker return; 228*c8dee2aaSAndroid Build Coastguard Worker } 229*c8dee2aaSAndroid Build Coastguard Worker const SkRect& localRect = optionalLocalRect ? *optionalLocalRect : rect; 230*c8dee2aaSAndroid Build Coastguard Worker DrawQuad quad{GrQuad::MakeFromRect(rect, viewMatrix), GrQuad(localRect), edgeAA}; 231*c8dee2aaSAndroid Build Coastguard Worker this->drawFilledQuad(clip, std::move(paint), &quad); 232*c8dee2aaSAndroid Build Coastguard Worker } 233*c8dee2aaSAndroid Build Coastguard Worker 234*c8dee2aaSAndroid Build Coastguard Worker /** 235*c8dee2aaSAndroid Build Coastguard Worker * Similar to fillRectWithEdgeAA but draws an arbitrary 2D convex quadrilateral transformed 236*c8dee2aaSAndroid Build Coastguard Worker * by 'viewMatrix', with per-edge control over anti-aliasing. The quad should follow the 237*c8dee2aaSAndroid Build Coastguard Worker * ordering used by SkRect::toQuad(), which determines how the edge AA is applied: 238*c8dee2aaSAndroid Build Coastguard Worker * - "top" = points [0] and [1] 239*c8dee2aaSAndroid Build Coastguard Worker * - "right" = points[1] and [2] 240*c8dee2aaSAndroid Build Coastguard Worker * - "bottom" = points[2] and [3] 241*c8dee2aaSAndroid Build Coastguard Worker * - "left" = points[3] and [0] 242*c8dee2aaSAndroid Build Coastguard Worker * 243*c8dee2aaSAndroid Build Coastguard Worker * The last argument, 'optionalLocalQuad', can be null if no separate local coordinates are 244*c8dee2aaSAndroid Build Coastguard Worker * necessary. 245*c8dee2aaSAndroid Build Coastguard Worker */ fillQuadWithEdgeAA(const GrClip * clip,GrPaint && paint,GrQuadAAFlags edgeAA,const SkMatrix & viewMatrix,const SkPoint points[4],const SkPoint optionalLocalPoints[4])246*c8dee2aaSAndroid Build Coastguard Worker void fillQuadWithEdgeAA(const GrClip* clip, GrPaint&& paint, GrQuadAAFlags edgeAA, 247*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, const SkPoint points[4], 248*c8dee2aaSAndroid Build Coastguard Worker const SkPoint optionalLocalPoints[4]) { 249*c8dee2aaSAndroid Build Coastguard Worker const SkPoint* localPoints = optionalLocalPoints ? optionalLocalPoints : points; 250*c8dee2aaSAndroid Build Coastguard Worker DrawQuad quad{GrQuad::MakeFromSkQuad(points, viewMatrix), 251*c8dee2aaSAndroid Build Coastguard Worker GrQuad::MakeFromSkQuad(localPoints, SkMatrix::I()), edgeAA}; 252*c8dee2aaSAndroid Build Coastguard Worker this->drawFilledQuad(clip, std::move(paint), &quad); 253*c8dee2aaSAndroid Build Coastguard Worker } 254*c8dee2aaSAndroid Build Coastguard Worker 255*c8dee2aaSAndroid Build Coastguard Worker // TODO(michaelludwig) - remove if the bulk API is not useful for SkiaRenderer 256*c8dee2aaSAndroid Build Coastguard Worker void drawQuadSet(const GrClip* clip, GrPaint&& paint, const SkMatrix& viewMatrix, 257*c8dee2aaSAndroid Build Coastguard Worker const GrQuadSetEntry[], int cnt); 258*c8dee2aaSAndroid Build Coastguard Worker 259*c8dee2aaSAndroid Build Coastguard Worker /** 260*c8dee2aaSAndroid Build Coastguard Worker * Creates an op that draws a subrectangle of a texture. The passed color is modulated by the 261*c8dee2aaSAndroid Build Coastguard Worker * texture's color. 'srcRect' specifies the rectangle of the texture to draw. 'dstRect' 262*c8dee2aaSAndroid Build Coastguard Worker * specifies the rectangle to draw in local coords which will be transformed by 'viewMatrix' to 263*c8dee2aaSAndroid Build Coastguard Worker * device space. 264*c8dee2aaSAndroid Build Coastguard Worker */ 265*c8dee2aaSAndroid Build Coastguard Worker void drawTexture(const GrClip*, 266*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView, 267*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType, 268*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::Filter, 269*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::MipmapMode, 270*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode, 271*c8dee2aaSAndroid Build Coastguard Worker const SkPMColor4f&, 272*c8dee2aaSAndroid Build Coastguard Worker const SkRect& srcRect, 273*c8dee2aaSAndroid Build Coastguard Worker const SkRect& dstRect, 274*c8dee2aaSAndroid Build Coastguard Worker GrQuadAAFlags, 275*c8dee2aaSAndroid Build Coastguard Worker SkCanvas::SrcRectConstraint, 276*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix&, 277*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrColorSpaceXform>); 278*c8dee2aaSAndroid Build Coastguard Worker 279*c8dee2aaSAndroid Build Coastguard Worker /** 280*c8dee2aaSAndroid Build Coastguard Worker * Variant of drawTexture that instead draws the texture applied to 'dstQuad' transformed by 281*c8dee2aaSAndroid Build Coastguard Worker * 'viewMatrix', using the 'srcQuad' texture coordinates clamped to the optional 'subset'. If 282*c8dee2aaSAndroid Build Coastguard Worker * 'subset' is null, it's equivalent to using the fast src rect constraint. If 'subset' is 283*c8dee2aaSAndroid Build Coastguard Worker * provided, the strict src rect constraint is applied using 'subset'. 284*c8dee2aaSAndroid Build Coastguard Worker */ drawTextureQuad(const GrClip * clip,GrSurfaceProxyView view,GrColorType srcColorType,SkAlphaType srcAlphaType,GrSamplerState::Filter filter,GrSamplerState::MipmapMode mm,SkBlendMode mode,const SkPMColor4f & color,const SkPoint srcQuad[4],const SkPoint dstQuad[4],GrQuadAAFlags edgeAA,const SkRect * subset,const SkMatrix & viewMatrix,sk_sp<GrColorSpaceXform> texXform)285*c8dee2aaSAndroid Build Coastguard Worker void drawTextureQuad(const GrClip* clip, 286*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView view, 287*c8dee2aaSAndroid Build Coastguard Worker GrColorType srcColorType, 288*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType srcAlphaType, 289*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::Filter filter, 290*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::MipmapMode mm, 291*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode mode, 292*c8dee2aaSAndroid Build Coastguard Worker const SkPMColor4f& color, 293*c8dee2aaSAndroid Build Coastguard Worker const SkPoint srcQuad[4], 294*c8dee2aaSAndroid Build Coastguard Worker const SkPoint dstQuad[4], 295*c8dee2aaSAndroid Build Coastguard Worker GrQuadAAFlags edgeAA, 296*c8dee2aaSAndroid Build Coastguard Worker const SkRect* subset, 297*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 298*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrColorSpaceXform> texXform) { 299*c8dee2aaSAndroid Build Coastguard Worker DrawQuad quad{GrQuad::MakeFromSkQuad(dstQuad, viewMatrix), 300*c8dee2aaSAndroid Build Coastguard Worker GrQuad::MakeFromSkQuad(srcQuad, SkMatrix::I()), edgeAA}; 301*c8dee2aaSAndroid Build Coastguard Worker this->drawTexturedQuad(clip, std::move(view), srcAlphaType, std::move(texXform), filter, mm, 302*c8dee2aaSAndroid Build Coastguard Worker color, mode, &quad, subset); 303*c8dee2aaSAndroid Build Coastguard Worker } 304*c8dee2aaSAndroid Build Coastguard Worker 305*c8dee2aaSAndroid Build Coastguard Worker /** 306*c8dee2aaSAndroid Build Coastguard Worker * Draws a set of textures with a shared filter, color, view matrix, color xform, and 307*c8dee2aaSAndroid Build Coastguard Worker * texture color xform. The textures must all have the same GrTextureType and GrConfig. 308*c8dee2aaSAndroid Build Coastguard Worker * 309*c8dee2aaSAndroid Build Coastguard Worker * If any entries provide a non-null fDstClip array, it will be read from immediately based on 310*c8dee2aaSAndroid Build Coastguard Worker * fDstClipCount, so the pointer can become invalid after this returns. 311*c8dee2aaSAndroid Build Coastguard Worker * 312*c8dee2aaSAndroid Build Coastguard Worker * 'proxRunCnt' is the number of proxy changes encountered in the entry array. Technically this 313*c8dee2aaSAndroid Build Coastguard Worker * can be inferred from the array within this function, but the information is already known 314*c8dee2aaSAndroid Build Coastguard Worker * by SkGpuDevice, so no need to incur another iteration over the array. 315*c8dee2aaSAndroid Build Coastguard Worker */ 316*c8dee2aaSAndroid Build Coastguard Worker void drawTextureSet(const GrClip*, 317*c8dee2aaSAndroid Build Coastguard Worker GrTextureSetEntry[], 318*c8dee2aaSAndroid Build Coastguard Worker int cnt, 319*c8dee2aaSAndroid Build Coastguard Worker int proxyRunCnt, 320*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::Filter, 321*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::MipmapMode, 322*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode mode, 323*c8dee2aaSAndroid Build Coastguard Worker SkCanvas::SrcRectConstraint, 324*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 325*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrColorSpaceXform> texXform); 326*c8dee2aaSAndroid Build Coastguard Worker 327*c8dee2aaSAndroid Build Coastguard Worker /** 328*c8dee2aaSAndroid Build Coastguard Worker * Draw a roundrect using a paint. 329*c8dee2aaSAndroid Build Coastguard Worker * 330*c8dee2aaSAndroid Build Coastguard Worker * @param paint describes how to color pixels. 331*c8dee2aaSAndroid Build Coastguard Worker * @param GrAA Controls whether rrect is antialiased. 332*c8dee2aaSAndroid Build Coastguard Worker * @param viewMatrix transformation matrix 333*c8dee2aaSAndroid Build Coastguard Worker * @param rrect the roundrect to draw 334*c8dee2aaSAndroid Build Coastguard Worker * @param style style to apply to the rrect. Currently path effects are not allowed. 335*c8dee2aaSAndroid Build Coastguard Worker */ 336*c8dee2aaSAndroid Build Coastguard Worker void drawRRect(const GrClip*, 337*c8dee2aaSAndroid Build Coastguard Worker GrPaint&&, 338*c8dee2aaSAndroid Build Coastguard Worker GrAA, 339*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 340*c8dee2aaSAndroid Build Coastguard Worker const SkRRect& rrect, 341*c8dee2aaSAndroid Build Coastguard Worker const GrStyle& style); 342*c8dee2aaSAndroid Build Coastguard Worker 343*c8dee2aaSAndroid Build Coastguard Worker /** 344*c8dee2aaSAndroid Build Coastguard Worker * Use a fast method to render the ambient and spot shadows for a path. 345*c8dee2aaSAndroid Build Coastguard Worker * Will return false if not possible for the given path. 346*c8dee2aaSAndroid Build Coastguard Worker * 347*c8dee2aaSAndroid Build Coastguard Worker * @param viewMatrix transformation matrix 348*c8dee2aaSAndroid Build Coastguard Worker * @param path the path to shadow 349*c8dee2aaSAndroid Build Coastguard Worker * @param rec parameters for shadow rendering 350*c8dee2aaSAndroid Build Coastguard Worker */ 351*c8dee2aaSAndroid Build Coastguard Worker bool drawFastShadow(const GrClip*, 352*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 353*c8dee2aaSAndroid Build Coastguard Worker const SkPath& path, 354*c8dee2aaSAndroid Build Coastguard Worker const SkDrawShadowRec& rec); 355*c8dee2aaSAndroid Build Coastguard Worker 356*c8dee2aaSAndroid Build Coastguard Worker /** 357*c8dee2aaSAndroid Build Coastguard Worker * Draws a path. 358*c8dee2aaSAndroid Build Coastguard Worker * 359*c8dee2aaSAndroid Build Coastguard Worker * @param paint describes how to color pixels. 360*c8dee2aaSAndroid Build Coastguard Worker * @param GrAA Controls whether the path is antialiased. 361*c8dee2aaSAndroid Build Coastguard Worker * @param viewMatrix transformation matrix 362*c8dee2aaSAndroid Build Coastguard Worker * @param path the path to draw 363*c8dee2aaSAndroid Build Coastguard Worker * @param style style to apply to the path. 364*c8dee2aaSAndroid Build Coastguard Worker */ 365*c8dee2aaSAndroid Build Coastguard Worker void drawPath(const GrClip*, 366*c8dee2aaSAndroid Build Coastguard Worker GrPaint&&, 367*c8dee2aaSAndroid Build Coastguard Worker GrAA, 368*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 369*c8dee2aaSAndroid Build Coastguard Worker const SkPath&, 370*c8dee2aaSAndroid Build Coastguard Worker const GrStyle&); 371*c8dee2aaSAndroid Build Coastguard Worker 372*c8dee2aaSAndroid Build Coastguard Worker /** 373*c8dee2aaSAndroid Build Coastguard Worker * Draws a shape. 374*c8dee2aaSAndroid Build Coastguard Worker * 375*c8dee2aaSAndroid Build Coastguard Worker * @param paint describes how to color pixels. 376*c8dee2aaSAndroid Build Coastguard Worker * @param GrAA Controls whether the path is antialiased. 377*c8dee2aaSAndroid Build Coastguard Worker * @param viewMatrix transformation matrix 378*c8dee2aaSAndroid Build Coastguard Worker * @param shape the shape to draw 379*c8dee2aaSAndroid Build Coastguard Worker */ 380*c8dee2aaSAndroid Build Coastguard Worker void drawShape(const GrClip*, 381*c8dee2aaSAndroid Build Coastguard Worker GrPaint&&, 382*c8dee2aaSAndroid Build Coastguard Worker GrAA, 383*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 384*c8dee2aaSAndroid Build Coastguard Worker GrStyledShape&&); 385*c8dee2aaSAndroid Build Coastguard Worker 386*c8dee2aaSAndroid Build Coastguard Worker /** 387*c8dee2aaSAndroid Build Coastguard Worker * Draws vertices with a paint. 388*c8dee2aaSAndroid Build Coastguard Worker * 389*c8dee2aaSAndroid Build Coastguard Worker * @param paint describes how to color pixels. 390*c8dee2aaSAndroid Build Coastguard Worker * @param viewMatrix transformation matrix 391*c8dee2aaSAndroid Build Coastguard Worker * @param vertices specifies the mesh to draw. 392*c8dee2aaSAndroid Build Coastguard Worker * @param overridePrimType primitive type to draw. If NULL, derive prim type from vertices. 393*c8dee2aaSAndroid Build Coastguard Worker * @param skipColorXform if true, do not apply a color space transfer function 394*c8dee2aaSAndroid Build Coastguard Worker */ 395*c8dee2aaSAndroid Build Coastguard Worker void drawVertices(const GrClip*, 396*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint, 397*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 398*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkVertices> vertices, 399*c8dee2aaSAndroid Build Coastguard Worker GrPrimitiveType* overridePrimType = nullptr, 400*c8dee2aaSAndroid Build Coastguard Worker bool skipColorXform = false); 401*c8dee2aaSAndroid Build Coastguard Worker 402*c8dee2aaSAndroid Build Coastguard Worker /** 403*c8dee2aaSAndroid Build Coastguard Worker * Draws a custom mesh with a paint. 404*c8dee2aaSAndroid Build Coastguard Worker * 405*c8dee2aaSAndroid Build Coastguard Worker * @param paint describes how to color pixels. 406*c8dee2aaSAndroid Build Coastguard Worker * @param viewMatrix transformation matrix 407*c8dee2aaSAndroid Build Coastguard Worker * @param mesh the mesh to draw. 408*c8dee2aaSAndroid Build Coastguard Worker * @param children child effects referenced by SkMesh shaders 409*c8dee2aaSAndroid Build Coastguard Worker */ 410*c8dee2aaSAndroid Build Coastguard Worker void drawMesh(const GrClip*, 411*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint, 412*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 413*c8dee2aaSAndroid Build Coastguard Worker const SkMesh& mesh, 414*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<std::unique_ptr<GrFragmentProcessor>> children); 415*c8dee2aaSAndroid Build Coastguard Worker 416*c8dee2aaSAndroid Build Coastguard Worker /** 417*c8dee2aaSAndroid Build Coastguard Worker * Draws textured sprites from an atlas with a paint. This currently does not support AA for the 418*c8dee2aaSAndroid Build Coastguard Worker * sprite rectangle edges. 419*c8dee2aaSAndroid Build Coastguard Worker * 420*c8dee2aaSAndroid Build Coastguard Worker * @param paint describes how to color pixels. 421*c8dee2aaSAndroid Build Coastguard Worker * @param viewMatrix transformation matrix 422*c8dee2aaSAndroid Build Coastguard Worker * @param spriteCount number of sprites. 423*c8dee2aaSAndroid Build Coastguard Worker * @param xform array of compressed transformation data, required. 424*c8dee2aaSAndroid Build Coastguard Worker * @param texRect array of texture rectangles used to access the paint. 425*c8dee2aaSAndroid Build Coastguard Worker * @param colors optional array of per-sprite colors, supercedes 426*c8dee2aaSAndroid Build Coastguard Worker * the paint's color field. 427*c8dee2aaSAndroid Build Coastguard Worker */ 428*c8dee2aaSAndroid Build Coastguard Worker void drawAtlas(const GrClip*, 429*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint, 430*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 431*c8dee2aaSAndroid Build Coastguard Worker int spriteCount, 432*c8dee2aaSAndroid Build Coastguard Worker const SkRSXform xform[], 433*c8dee2aaSAndroid Build Coastguard Worker const SkRect texRect[], 434*c8dee2aaSAndroid Build Coastguard Worker const SkColor colors[]); 435*c8dee2aaSAndroid Build Coastguard Worker 436*c8dee2aaSAndroid Build Coastguard Worker /** 437*c8dee2aaSAndroid Build Coastguard Worker * Draws a region. 438*c8dee2aaSAndroid Build Coastguard Worker * 439*c8dee2aaSAndroid Build Coastguard Worker * @param paint describes how to color pixels 440*c8dee2aaSAndroid Build Coastguard Worker * @param viewMatrix transformation matrix 441*c8dee2aaSAndroid Build Coastguard Worker * @param aa should the rects of the region be antialiased. 442*c8dee2aaSAndroid Build Coastguard Worker * @param region the region to be drawn 443*c8dee2aaSAndroid Build Coastguard Worker * @param style style to apply to the region 444*c8dee2aaSAndroid Build Coastguard Worker */ 445*c8dee2aaSAndroid Build Coastguard Worker void drawRegion(const GrClip*, 446*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint, 447*c8dee2aaSAndroid Build Coastguard Worker GrAA aa, 448*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 449*c8dee2aaSAndroid Build Coastguard Worker const SkRegion& region, 450*c8dee2aaSAndroid Build Coastguard Worker const GrStyle& style, 451*c8dee2aaSAndroid Build Coastguard Worker const GrUserStencilSettings* ss = nullptr); 452*c8dee2aaSAndroid Build Coastguard Worker 453*c8dee2aaSAndroid Build Coastguard Worker /** 454*c8dee2aaSAndroid Build Coastguard Worker * Draws an oval. 455*c8dee2aaSAndroid Build Coastguard Worker * 456*c8dee2aaSAndroid Build Coastguard Worker * @param paint describes how to color pixels. 457*c8dee2aaSAndroid Build Coastguard Worker * @param GrAA Controls whether the oval is antialiased. 458*c8dee2aaSAndroid Build Coastguard Worker * @param viewMatrix transformation matrix 459*c8dee2aaSAndroid Build Coastguard Worker * @param oval the bounding rect of the oval. 460*c8dee2aaSAndroid Build Coastguard Worker * @param style style to apply to the oval. Currently path effects are not allowed. 461*c8dee2aaSAndroid Build Coastguard Worker */ 462*c8dee2aaSAndroid Build Coastguard Worker void drawOval(const GrClip*, 463*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint, 464*c8dee2aaSAndroid Build Coastguard Worker GrAA, 465*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 466*c8dee2aaSAndroid Build Coastguard Worker const SkRect& oval, 467*c8dee2aaSAndroid Build Coastguard Worker const GrStyle& style); 468*c8dee2aaSAndroid Build Coastguard Worker 469*c8dee2aaSAndroid Build Coastguard Worker /** 470*c8dee2aaSAndroid Build Coastguard Worker * Draws a partial arc of an oval. 471*c8dee2aaSAndroid Build Coastguard Worker * 472*c8dee2aaSAndroid Build Coastguard Worker * @param paint describes how to color pixels. 473*c8dee2aaSAndroid Build Coastguard Worker * @param GrGrAA Controls whether the arc is antialiased. 474*c8dee2aaSAndroid Build Coastguard Worker * @param viewMatrix transformation matrix. 475*c8dee2aaSAndroid Build Coastguard Worker * @param oval the bounding rect of the oval. 476*c8dee2aaSAndroid Build Coastguard Worker * @param startAngle starting angle in degrees. 477*c8dee2aaSAndroid Build Coastguard Worker * @param sweepAngle angle to sweep in degrees. Must be in (-360, 360) 478*c8dee2aaSAndroid Build Coastguard Worker * @param useCenter true means that the implied path begins at the oval center, connects as 479*c8dee2aaSAndroid Build Coastguard Worker * a line to the point indicated by the start contains the arc indicated by 480*c8dee2aaSAndroid Build Coastguard Worker * the sweep angle. If false the line beginning at the center point is 481*c8dee2aaSAndroid Build Coastguard Worker * omitted. 482*c8dee2aaSAndroid Build Coastguard Worker * @param style style to apply to the oval. 483*c8dee2aaSAndroid Build Coastguard Worker */ 484*c8dee2aaSAndroid Build Coastguard Worker void drawArc(const GrClip*, 485*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint, 486*c8dee2aaSAndroid Build Coastguard Worker GrAA, 487*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 488*c8dee2aaSAndroid Build Coastguard Worker const SkArc& arc, 489*c8dee2aaSAndroid Build Coastguard Worker const GrStyle& style); 490*c8dee2aaSAndroid Build Coastguard Worker 491*c8dee2aaSAndroid Build Coastguard Worker /** 492*c8dee2aaSAndroid Build Coastguard Worker * Draw the image as a set of rects, specified by |iter|. 493*c8dee2aaSAndroid Build Coastguard Worker */ 494*c8dee2aaSAndroid Build Coastguard Worker void drawImageLattice(const GrClip*, 495*c8dee2aaSAndroid Build Coastguard Worker GrPaint&&, 496*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 497*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView, 498*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType alphaType, 499*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrColorSpaceXform>, 500*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::Filter, 501*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkLatticeIter>, 502*c8dee2aaSAndroid Build Coastguard Worker const SkRect& dst); 503*c8dee2aaSAndroid Build Coastguard Worker 504*c8dee2aaSAndroid Build Coastguard Worker /** 505*c8dee2aaSAndroid Build Coastguard Worker * Draw the text specified by the GlyphRunList. 506*c8dee2aaSAndroid Build Coastguard Worker * 507*c8dee2aaSAndroid Build Coastguard Worker * @param viewMatrix transformation matrix 508*c8dee2aaSAndroid Build Coastguard Worker * @param glyphRunList text, text positions, and paint. 509*c8dee2aaSAndroid Build Coastguard Worker */ 510*c8dee2aaSAndroid Build Coastguard Worker void drawGlyphRunList(SkCanvas*, 511*c8dee2aaSAndroid Build Coastguard Worker const GrClip*, 512*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 513*c8dee2aaSAndroid Build Coastguard Worker const sktext::GlyphRunList& glyphRunList, 514*c8dee2aaSAndroid Build Coastguard Worker SkStrikeDeviceInfo strikeDeviceInfo, 515*c8dee2aaSAndroid Build Coastguard Worker const SkPaint& paint); 516*c8dee2aaSAndroid Build Coastguard Worker 517*c8dee2aaSAndroid Build Coastguard Worker /** 518*c8dee2aaSAndroid Build Coastguard Worker * Adds the necessary signal and wait semaphores and adds the passed in SkDrawable to the 519*c8dee2aaSAndroid Build Coastguard Worker * command stream. 520*c8dee2aaSAndroid Build Coastguard Worker */ 521*c8dee2aaSAndroid Build Coastguard Worker void drawDrawable(std::unique_ptr<SkDrawable::GpuDrawHandler>, const SkRect& bounds); 522*c8dee2aaSAndroid Build Coastguard Worker 523*c8dee2aaSAndroid Build Coastguard Worker // called to note the last clip drawn to the stencil buffer. 524*c8dee2aaSAndroid Build Coastguard Worker // TODO: remove after clipping overhaul. 525*c8dee2aaSAndroid Build Coastguard Worker void setLastClip(uint32_t clipStackGenID, 526*c8dee2aaSAndroid Build Coastguard Worker const SkIRect& devClipBounds, 527*c8dee2aaSAndroid Build Coastguard Worker int numClipAnalyticElements); 528*c8dee2aaSAndroid Build Coastguard Worker 529*c8dee2aaSAndroid Build Coastguard Worker // called to determine if we have to render the clip into SB. 530*c8dee2aaSAndroid Build Coastguard Worker // TODO: remove after clipping overhaul. 531*c8dee2aaSAndroid Build Coastguard Worker bool mustRenderClip(uint32_t clipStackGenID, 532*c8dee2aaSAndroid Build Coastguard Worker const SkIRect& devClipBounds, 533*c8dee2aaSAndroid Build Coastguard Worker int numClipAnalyticElements); 534*c8dee2aaSAndroid Build Coastguard Worker clearStencilClip(const SkIRect & scissor,bool insideStencilMask)535*c8dee2aaSAndroid Build Coastguard Worker void clearStencilClip(const SkIRect& scissor, bool insideStencilMask) { 536*c8dee2aaSAndroid Build Coastguard Worker this->internalStencilClear(&scissor, insideStencilMask); 537*c8dee2aaSAndroid Build Coastguard Worker } 538*c8dee2aaSAndroid Build Coastguard Worker 539*c8dee2aaSAndroid Build Coastguard Worker // While this can take a general clip, since ClipStack relies on this function, it must take 540*c8dee2aaSAndroid Build Coastguard Worker // care to only provide hard clips or we could get stuck in a loop. The general clip is needed 541*c8dee2aaSAndroid Build Coastguard Worker // so that path renderers can use this function. 542*c8dee2aaSAndroid Build Coastguard Worker void stencilRect(const GrClip* clip, 543*c8dee2aaSAndroid Build Coastguard Worker const GrUserStencilSettings* ss, 544*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint, 545*c8dee2aaSAndroid Build Coastguard Worker GrAA doStencilMSAA, 546*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 547*c8dee2aaSAndroid Build Coastguard Worker const SkRect& rect, 548*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix* localMatrix = nullptr) { 549*c8dee2aaSAndroid Build Coastguard Worker // Since this provides stencil settings to drawFilledQuad, it performs a different AA type 550*c8dee2aaSAndroid Build Coastguard Worker // resolution compared to regular rect draws, which is the main reason it remains separate. 551*c8dee2aaSAndroid Build Coastguard Worker DrawQuad quad{GrQuad::MakeFromRect(rect, viewMatrix), 552*c8dee2aaSAndroid Build Coastguard Worker localMatrix ? GrQuad::MakeFromRect(rect, *localMatrix) : GrQuad(rect), 553*c8dee2aaSAndroid Build Coastguard Worker doStencilMSAA == GrAA::kYes ? GrQuadAAFlags::kAll : GrQuadAAFlags::kNone}; 554*c8dee2aaSAndroid Build Coastguard Worker this->drawFilledQuad(clip, std::move(paint), &quad, ss); 555*c8dee2aaSAndroid Build Coastguard Worker } 556*c8dee2aaSAndroid Build Coastguard Worker 557*c8dee2aaSAndroid Build Coastguard Worker // Fills the user stencil bits with a non-zero value at every sample inside the path. This will 558*c8dee2aaSAndroid Build Coastguard Worker // likely be implemented with a Redbook algorithm, but it is not guaranteed. The samples being 559*c8dee2aaSAndroid Build Coastguard Worker // rendered to must be zero initially. 560*c8dee2aaSAndroid Build Coastguard Worker bool stencilPath(const GrHardClip*, 561*c8dee2aaSAndroid Build Coastguard Worker GrAA doStencilMSAA, 562*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 563*c8dee2aaSAndroid Build Coastguard Worker const SkPath&); 564*c8dee2aaSAndroid Build Coastguard Worker 565*c8dee2aaSAndroid Build Coastguard Worker /** 566*c8dee2aaSAndroid Build Coastguard Worker * Draws a path, either AA or not, and touches the stencil buffer with the user stencil settings 567*c8dee2aaSAndroid Build Coastguard Worker * for each color sample written. 568*c8dee2aaSAndroid Build Coastguard Worker */ 569*c8dee2aaSAndroid Build Coastguard Worker bool drawAndStencilPath(const GrHardClip*, 570*c8dee2aaSAndroid Build Coastguard Worker const GrUserStencilSettings*, 571*c8dee2aaSAndroid Build Coastguard Worker SkRegion::Op op, 572*c8dee2aaSAndroid Build Coastguard Worker bool invert, 573*c8dee2aaSAndroid Build Coastguard Worker GrAA doStencilMSAA, 574*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 575*c8dee2aaSAndroid Build Coastguard Worker const SkPath&); 576*c8dee2aaSAndroid Build Coastguard Worker 577*c8dee2aaSAndroid Build Coastguard Worker skgpu::Budgeted isBudgeted() const; 578*c8dee2aaSAndroid Build Coastguard Worker 579*c8dee2aaSAndroid Build Coastguard Worker int maxWindowRectangles() const; 580*c8dee2aaSAndroid Build Coastguard Worker 581*c8dee2aaSAndroid Build Coastguard Worker /* 582*c8dee2aaSAndroid Build Coastguard Worker * This unique ID will not change for a given SurfaceDrawContext. However, it is _NOT_ 583*c8dee2aaSAndroid Build Coastguard Worker * guaranteed to match the uniqueID of the underlying GrRenderTarget - beware! 584*c8dee2aaSAndroid Build Coastguard Worker */ uniqueID()585*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxy::UniqueID uniqueID() const { return this->asSurfaceProxy()->uniqueID(); } 586*c8dee2aaSAndroid Build Coastguard Worker 587*c8dee2aaSAndroid Build Coastguard Worker // Allows caller of addDrawOp to know which op list an op will be added to. 588*c8dee2aaSAndroid Build Coastguard Worker using WillAddOpFn = void(GrOp*, uint32_t opsTaskID); 589*c8dee2aaSAndroid Build Coastguard Worker // These perform processing specific to GrDrawOp-derived ops before recording them into an 590*c8dee2aaSAndroid Build Coastguard Worker // op list. Before adding the op to an op list the WillAddOpFn is called. Note that it 591*c8dee2aaSAndroid Build Coastguard Worker // will not be called in the event that the op is discarded. Moreover, the op may merge into 592*c8dee2aaSAndroid Build Coastguard Worker // another op after the function is called (either before addDrawOp returns or some time later). 593*c8dee2aaSAndroid Build Coastguard Worker // 594*c8dee2aaSAndroid Build Coastguard Worker // If the clip pointer is null, no clipping will be performed. 595*c8dee2aaSAndroid Build Coastguard Worker void addDrawOp(const GrClip*, 596*c8dee2aaSAndroid Build Coastguard Worker GrOp::Owner, 597*c8dee2aaSAndroid Build Coastguard Worker const std::function<WillAddOpFn>& = std::function<WillAddOpFn>()); addDrawOp(GrOp::Owner op)598*c8dee2aaSAndroid Build Coastguard Worker void addDrawOp(GrOp::Owner op) { this->addDrawOp(nullptr, std::move(op)); } 599*c8dee2aaSAndroid Build Coastguard Worker refsWrappedObjects()600*c8dee2aaSAndroid Build Coastguard Worker bool refsWrappedObjects() const { return this->asRenderTargetProxy()->refsWrappedObjects(); } 601*c8dee2aaSAndroid Build Coastguard Worker 602*c8dee2aaSAndroid Build Coastguard Worker /** 603*c8dee2aaSAndroid Build Coastguard Worker * The next time this SurfaceDrawContext is flushed, the gpu will wait on the passed in 604*c8dee2aaSAndroid Build Coastguard Worker * semaphores before executing any commands. 605*c8dee2aaSAndroid Build Coastguard Worker */ 606*c8dee2aaSAndroid Build Coastguard Worker bool waitOnSemaphores(int numSemaphores, const GrBackendSemaphore waitSemaphores[], 607*c8dee2aaSAndroid Build Coastguard Worker bool deleteSemaphoresAfterWait); 608*c8dee2aaSAndroid Build Coastguard Worker numSamples()609*c8dee2aaSAndroid Build Coastguard Worker int numSamples() const { return this->asRenderTargetProxy()->numSamples(); } surfaceProps()610*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; } canUseDynamicMSAA()611*c8dee2aaSAndroid Build Coastguard Worker bool canUseDynamicMSAA() const { return fCanUseDynamicMSAA; } wrapsVkSecondaryCB()612*c8dee2aaSAndroid Build Coastguard Worker bool wrapsVkSecondaryCB() const { return this->asRenderTargetProxy()->wrapsVkSecondaryCB(); } 613*c8dee2aaSAndroid Build Coastguard Worker alwaysAntialias()614*c8dee2aaSAndroid Build Coastguard Worker bool alwaysAntialias() const { 615*c8dee2aaSAndroid Build Coastguard Worker return fSurfaceProps.flags() & SkSurfaceProps::kDynamicMSAA_Flag; 616*c8dee2aaSAndroid Build Coastguard Worker } 617*c8dee2aaSAndroid Build Coastguard Worker chooseAA(const SkPaint & paint)618*c8dee2aaSAndroid Build Coastguard Worker GrAA chooseAA(const SkPaint& paint) { 619*c8dee2aaSAndroid Build Coastguard Worker return GrAA(paint.isAntiAlias() || this->alwaysAntialias()); 620*c8dee2aaSAndroid Build Coastguard Worker } 621*c8dee2aaSAndroid Build Coastguard Worker chooseAAType(GrAA aa)622*c8dee2aaSAndroid Build Coastguard Worker GrAAType chooseAAType(GrAA aa) { 623*c8dee2aaSAndroid Build Coastguard Worker if (this->numSamples() > 1 || fCanUseDynamicMSAA) { 624*c8dee2aaSAndroid Build Coastguard Worker // Always trigger DMSAA when it's available. The coverage ops that know how to handle 625*c8dee2aaSAndroid Build Coastguard Worker // both single and multisample targets without popping will do so without calling 626*c8dee2aaSAndroid Build Coastguard Worker // chooseAAType. 627*c8dee2aaSAndroid Build Coastguard Worker return GrAAType::kMSAA; 628*c8dee2aaSAndroid Build Coastguard Worker } 629*c8dee2aaSAndroid Build Coastguard Worker return (aa == GrAA::kYes) ? GrAAType::kCoverage : GrAAType::kNone; 630*c8dee2aaSAndroid Build Coastguard Worker } 631*c8dee2aaSAndroid Build Coastguard Worker 632*c8dee2aaSAndroid Build Coastguard Worker // This entry point should only be called if the backing GPU object is known to be 633*c8dee2aaSAndroid Build Coastguard Worker // instantiated. accessRenderTarget()634*c8dee2aaSAndroid Build Coastguard Worker GrRenderTarget* accessRenderTarget() { return this->asSurfaceProxy()->peekRenderTarget(); } 635*c8dee2aaSAndroid Build Coastguard Worker 636*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) testingOnly_SetPreserveOpsOnFullClear()637*c8dee2aaSAndroid Build Coastguard Worker void testingOnly_SetPreserveOpsOnFullClear() { fPreserveOpsOnFullClear_TestingOnly = true; } 638*c8dee2aaSAndroid Build Coastguard Worker #endif 639*c8dee2aaSAndroid Build Coastguard Worker 640*c8dee2aaSAndroid Build Coastguard Worker void drawStrokedLine(const GrClip*, GrPaint&&, GrAA, const SkMatrix&, const SkPoint[2], 641*c8dee2aaSAndroid Build Coastguard Worker const SkStrokeRec&); 642*c8dee2aaSAndroid Build Coastguard Worker 643*c8dee2aaSAndroid Build Coastguard Worker private: 644*c8dee2aaSAndroid Build Coastguard Worker enum class QuadOptimization; 645*c8dee2aaSAndroid Build Coastguard Worker 646*c8dee2aaSAndroid Build Coastguard Worker void willReplaceOpsTask(OpsTask* prevTask, OpsTask* nextTask) override; 647*c8dee2aaSAndroid Build Coastguard Worker 648*c8dee2aaSAndroid Build Coastguard Worker OpsTask::CanDiscardPreviousOps canDiscardPreviousOpsOnFullClear() const override; 649*c8dee2aaSAndroid Build Coastguard Worker void setNeedsStencil(); 650*c8dee2aaSAndroid Build Coastguard Worker 651*c8dee2aaSAndroid Build Coastguard Worker void internalStencilClear(const SkIRect* scissor, bool insideStencilMask); 652*c8dee2aaSAndroid Build Coastguard Worker 653*c8dee2aaSAndroid Build Coastguard Worker // 'stencilSettings' are provided merely for decision making purposes; When non-null, 654*c8dee2aaSAndroid Build Coastguard Worker // optimization strategies that submit special ops are avoided. 655*c8dee2aaSAndroid Build Coastguard Worker // 656*c8dee2aaSAndroid Build Coastguard Worker // 'quad' should be the original draw request on input, and will be updated as 657*c8dee2aaSAndroid Build Coastguard Worker // appropriate depending on the returned optimization level. 658*c8dee2aaSAndroid Build Coastguard Worker // 659*c8dee2aaSAndroid Build Coastguard Worker // If kSubmitted is returned, the provided paint was consumed. Otherwise it is left unchanged. 660*c8dee2aaSAndroid Build Coastguard Worker QuadOptimization attemptQuadOptimization(const GrClip* clip, 661*c8dee2aaSAndroid Build Coastguard Worker const GrUserStencilSettings* stencilSettings, 662*c8dee2aaSAndroid Build Coastguard Worker DrawQuad* quad, 663*c8dee2aaSAndroid Build Coastguard Worker GrPaint* paint); 664*c8dee2aaSAndroid Build Coastguard Worker 665*c8dee2aaSAndroid Build Coastguard Worker // The overall AA policy is determined by the quad's edge flags: kNone is no AA, and anything 666*c8dee2aaSAndroid Build Coastguard Worker // else uses some form of anti-aliasing. If 'ss' is non-null, that will be MSAA; otherwise it's 667*c8dee2aaSAndroid Build Coastguard Worker // MSAA or analytic coverage per chooseAAType(). This will always attempt to apply 668*c8dee2aaSAndroid Build Coastguard Worker // quad optimizations, so all quad/rect public APIs should rely on this function for consistent 669*c8dee2aaSAndroid Build Coastguard Worker // clipping behavior. 'quad' will be modified in place to reflect final rendered geometry. 670*c8dee2aaSAndroid Build Coastguard Worker void drawFilledQuad(const GrClip* clip, 671*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint, 672*c8dee2aaSAndroid Build Coastguard Worker DrawQuad* quad, 673*c8dee2aaSAndroid Build Coastguard Worker const GrUserStencilSettings* ss = nullptr); 674*c8dee2aaSAndroid Build Coastguard Worker 675*c8dee2aaSAndroid Build Coastguard Worker // Like drawFilledQuad but does not require using a GrPaint or FP for texturing. 676*c8dee2aaSAndroid Build Coastguard Worker // 'quad' may be modified in place to reflect final geometry. 677*c8dee2aaSAndroid Build Coastguard Worker void drawTexturedQuad(const GrClip* clip, 678*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView proxyView, 679*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType alphaType, 680*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrColorSpaceXform> textureXform, 681*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::Filter filter, 682*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::MipmapMode, 683*c8dee2aaSAndroid Build Coastguard Worker const SkPMColor4f& color, 684*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode blendMode, 685*c8dee2aaSAndroid Build Coastguard Worker DrawQuad* quad, 686*c8dee2aaSAndroid Build Coastguard Worker const SkRect* subset = nullptr); 687*c8dee2aaSAndroid Build Coastguard Worker 688*c8dee2aaSAndroid Build Coastguard Worker // Tries to detect if the given shape is a simple, and draws it without path rendering if 689*c8dee2aaSAndroid Build Coastguard Worker // we know how. 690*c8dee2aaSAndroid Build Coastguard Worker bool drawSimpleShape(const GrClip*, GrPaint*, GrAA, const SkMatrix&, const GrStyledShape&); 691*c8dee2aaSAndroid Build Coastguard Worker 692*c8dee2aaSAndroid Build Coastguard Worker // If 'attemptDrawSimple' is true, of if the original shape is marked as having been simplfied, 693*c8dee2aaSAndroid Build Coastguard Worker // this will attempt to re-route through drawSimpleShape() to see if we can avoid path rendering 694*c8dee2aaSAndroid Build Coastguard Worker // one more time. 695*c8dee2aaSAndroid Build Coastguard Worker void drawShapeUsingPathRenderer(const GrClip*, GrPaint&&, GrAA, const SkMatrix&, 696*c8dee2aaSAndroid Build Coastguard Worker GrStyledShape&&, bool attemptDrawSimple = false); 697*c8dee2aaSAndroid Build Coastguard Worker 698*c8dee2aaSAndroid Build Coastguard Worker // Makes a copy of the proxy if it is necessary for the draw and places the texture that should 699*c8dee2aaSAndroid Build Coastguard Worker // be used by GrXferProcessor to access the destination color in 'result'. If the return 700*c8dee2aaSAndroid Build Coastguard Worker // value is false then a texture copy could not be made. 701*c8dee2aaSAndroid Build Coastguard Worker // 702*c8dee2aaSAndroid Build Coastguard Worker // The op should have already had setClippedBounds called on it. 703*c8dee2aaSAndroid Build Coastguard Worker [[nodiscard]] bool setupDstProxyView(const SkRect& opBounds, 704*c8dee2aaSAndroid Build Coastguard Worker bool opRequiresMSAA, 705*c8dee2aaSAndroid Build Coastguard Worker GrDstProxyView* result); 706*c8dee2aaSAndroid Build Coastguard Worker 707*c8dee2aaSAndroid Build Coastguard Worker OpsTask* replaceOpsTaskIfModifiesColor(); 708*c8dee2aaSAndroid Build Coastguard Worker 709*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps fSurfaceProps; 710*c8dee2aaSAndroid Build Coastguard Worker const bool fCanUseDynamicMSAA; 711*c8dee2aaSAndroid Build Coastguard Worker 712*c8dee2aaSAndroid Build Coastguard Worker bool fNeedsStencil = false; 713*c8dee2aaSAndroid Build Coastguard Worker 714*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) 715*c8dee2aaSAndroid Build Coastguard Worker bool fPreserveOpsOnFullClear_TestingOnly = false; 716*c8dee2aaSAndroid Build Coastguard Worker #endif 717*c8dee2aaSAndroid Build Coastguard Worker }; 718*c8dee2aaSAndroid Build Coastguard Worker 719*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::ganesh 720*c8dee2aaSAndroid Build Coastguard Worker 721*c8dee2aaSAndroid Build Coastguard Worker #endif // SurfaceDrawContext_v1_DEFINED 722