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 #ifndef skgpu_ganesh_TextureOp_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_ganesh_TextureOp_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkColorData.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrOp.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 17*c8dee2aaSAndroid Build Coastguard Worker #include <tuple> 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker class GrClip; 20*c8dee2aaSAndroid Build Coastguard Worker class GrColorSpaceXform; 21*c8dee2aaSAndroid Build Coastguard Worker class GrQuad; 22*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext; 23*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxyView; 24*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix; 25*c8dee2aaSAndroid Build Coastguard Worker enum SkAlphaType : int; 26*c8dee2aaSAndroid Build Coastguard Worker enum class GrAAType : unsigned int; 27*c8dee2aaSAndroid Build Coastguard Worker enum class SkBlendMode; 28*c8dee2aaSAndroid Build Coastguard Worker struct DrawQuad; 29*c8dee2aaSAndroid Build Coastguard Worker struct GrTextureSetEntry; 30*c8dee2aaSAndroid Build Coastguard Worker struct SkRect; 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh { 33*c8dee2aaSAndroid Build Coastguard Worker class SurfaceDrawContext; 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker /** 36*c8dee2aaSAndroid Build Coastguard Worker * Tests if filtering will have any effect in the drawing of the 'srcQuad' to the 'dstquad'. 37*c8dee2aaSAndroid Build Coastguard Worker * We return false when filtering has no impact drawing operations as they are effectively blits. 38*c8dee2aaSAndroid Build Coastguard Worker */ 39*c8dee2aaSAndroid Build Coastguard Worker std::tuple<bool /* filter */, bool /* mipmap */> FilterAndMipmapHaveNoEffect(const GrQuad& srcQuad, 40*c8dee2aaSAndroid Build Coastguard Worker const GrQuad& dstQuad); 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker class TextureOp { 43*c8dee2aaSAndroid Build Coastguard Worker public: 44*c8dee2aaSAndroid Build Coastguard Worker /** 45*c8dee2aaSAndroid Build Coastguard Worker * Controls whether saturate() is called after the texture is color-converted to ensure all 46*c8dee2aaSAndroid Build Coastguard Worker * color values are in 0..1 range. 47*c8dee2aaSAndroid Build Coastguard Worker */ 48*c8dee2aaSAndroid Build Coastguard Worker enum class Saturate : bool { kNo = false, kYes = true }; 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker /** 51*c8dee2aaSAndroid Build Coastguard Worker * Creates an op that draws a sub-quadrilateral of a texture. The passed color is modulated by 52*c8dee2aaSAndroid Build Coastguard Worker * the texture's color. 'deviceQuad' specifies the device-space coordinates to draw, using 53*c8dee2aaSAndroid Build Coastguard Worker * 'localQuad' to map into the proxy's texture space. If non-null, 'subset' represents the 54*c8dee2aaSAndroid Build Coastguard Worker * boundary for the strict src rect constraint. If GrAAType is kCoverage then AA is applied to 55*c8dee2aaSAndroid Build Coastguard Worker * the edges indicated by GrQuadAAFlags. Otherwise, GrQuadAAFlags is ignored. 56*c8dee2aaSAndroid Build Coastguard Worker * 57*c8dee2aaSAndroid Build Coastguard Worker * This is functionally very similar to FillRectOp::Make, except that the GrPaint has been 58*c8dee2aaSAndroid Build Coastguard Worker * deconstructed into the texture, filter, modulating color, and blend mode. When blend mode is 59*c8dee2aaSAndroid Build Coastguard Worker * src over, this will return a FillRectOp with a paint that samples the proxy. 60*c8dee2aaSAndroid Build Coastguard Worker */ 61*c8dee2aaSAndroid Build Coastguard Worker static GrOp::Owner Make(GrRecordingContext*, 62*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView, 63*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType srcAlphaType, 64*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrColorSpaceXform>, 65*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::Filter, 66*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::MipmapMode, 67*c8dee2aaSAndroid Build Coastguard Worker const SkPMColor4f&, 68*c8dee2aaSAndroid Build Coastguard Worker Saturate, 69*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode, 70*c8dee2aaSAndroid Build Coastguard Worker GrAAType, 71*c8dee2aaSAndroid Build Coastguard Worker DrawQuad*, 72*c8dee2aaSAndroid Build Coastguard Worker const SkRect* subset = nullptr); 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker // Automatically falls back to using one FillRectOp per entry if dynamic states are not 75*c8dee2aaSAndroid Build Coastguard Worker // supported, or if the blend mode is not src-over. 'cnt' is the size of the entry array. 76*c8dee2aaSAndroid Build Coastguard Worker // 'proxyCnt' <= 'cnt' and represents the number of proxy switches within the array. 77*c8dee2aaSAndroid Build Coastguard Worker static void AddTextureSetOps(skgpu::ganesh::SurfaceDrawContext*, 78*c8dee2aaSAndroid Build Coastguard Worker const GrClip*, 79*c8dee2aaSAndroid Build Coastguard Worker GrRecordingContext*, 80*c8dee2aaSAndroid Build Coastguard Worker GrTextureSetEntry[], 81*c8dee2aaSAndroid Build Coastguard Worker int cnt, 82*c8dee2aaSAndroid Build Coastguard Worker int proxyRunCnt, 83*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::Filter, 84*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::MipmapMode, 85*c8dee2aaSAndroid Build Coastguard Worker Saturate, 86*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode, 87*c8dee2aaSAndroid Build Coastguard Worker GrAAType, 88*c8dee2aaSAndroid Build Coastguard Worker SkCanvas::SrcRectConstraint, 89*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, 90*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrColorSpaceXform> textureXform); 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) 93*c8dee2aaSAndroid Build Coastguard Worker static uint32_t ClassID(); 94*c8dee2aaSAndroid Build Coastguard Worker #endif 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker private: 97*c8dee2aaSAndroid Build Coastguard Worker class BatchSizeLimiter; 98*c8dee2aaSAndroid Build Coastguard Worker }; 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::ganesh 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_ganesh_TextureOp_DEFINED 103