xref: /aosp_15_r20/external/skia/src/gpu/ganesh/SurfaceContext.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2016 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 SurfaceContext_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SurfaceContext_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColorInfo.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuBuffer.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrImageInfo.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrPixmap.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTargetProxy.h"  // IWYU pragma: keep
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTask.h"         // IWYU pragma: keep
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTextureProxy.h"  // IWYU pragma: keep
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
29*c8dee2aaSAndroid Build Coastguard Worker #include <functional>
30*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
31*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
32*c8dee2aaSAndroid Build Coastguard Worker 
33*c8dee2aaSAndroid Build Coastguard Worker class GrCaps;
34*c8dee2aaSAndroid Build Coastguard Worker class GrDirectContext;
35*c8dee2aaSAndroid Build Coastguard Worker class GrDrawingManager;
36*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext;
37*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContextPriv;
38*c8dee2aaSAndroid Build Coastguard Worker class SkColorSpace;
39*c8dee2aaSAndroid Build Coastguard Worker enum GrSurfaceOrigin : int;
40*c8dee2aaSAndroid Build Coastguard Worker enum SkColorType : int;
41*c8dee2aaSAndroid Build Coastguard Worker enum SkYUVColorSpace : int;
42*c8dee2aaSAndroid Build Coastguard Worker enum class GrColorType;
43*c8dee2aaSAndroid Build Coastguard Worker struct SkIPoint;
44*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo;
45*c8dee2aaSAndroid Build Coastguard Worker 
46*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu {
47*c8dee2aaSAndroid Build Coastguard Worker class SingleOwner;
48*c8dee2aaSAndroid Build Coastguard Worker enum class Mipmapped : bool;
49*c8dee2aaSAndroid Build Coastguard Worker }
50*c8dee2aaSAndroid Build Coastguard Worker 
51*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh {
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker class SurfaceFillContext;
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker class SurfaceContext {
56*c8dee2aaSAndroid Build Coastguard Worker public:
57*c8dee2aaSAndroid Build Coastguard Worker     // If it is known that the GrSurfaceProxy is not renderable, you can directly call the ctor
58*c8dee2aaSAndroid Build Coastguard Worker     // here to make a SurfaceContext on the stack.
59*c8dee2aaSAndroid Build Coastguard Worker     SurfaceContext(GrRecordingContext*, GrSurfaceProxyView readView, const GrColorInfo&);
60*c8dee2aaSAndroid Build Coastguard Worker 
61*c8dee2aaSAndroid Build Coastguard Worker     virtual ~SurfaceContext() = default;
62*c8dee2aaSAndroid Build Coastguard Worker 
recordingContext()63*c8dee2aaSAndroid Build Coastguard Worker     GrRecordingContext* recordingContext() const { return fContext; }
64*c8dee2aaSAndroid Build Coastguard Worker 
colorInfo()65*c8dee2aaSAndroid Build Coastguard Worker     const GrColorInfo& colorInfo() const { return fColorInfo; }
imageInfo()66*c8dee2aaSAndroid Build Coastguard Worker     GrImageInfo imageInfo() const { return {fColorInfo, fReadView.proxy()->dimensions()}; }
67*c8dee2aaSAndroid Build Coastguard Worker 
origin()68*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceOrigin origin() const { return fReadView.origin(); }
readSwizzle()69*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Swizzle readSwizzle() const { return fReadView.swizzle(); }
70*c8dee2aaSAndroid Build Coastguard Worker     // TODO: See if it makes sense for this to return a const& instead and require the callers to
71*c8dee2aaSAndroid Build Coastguard Worker     // make a copy (which refs the proxy) if needed.
readSurfaceView()72*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceProxyView readSurfaceView() { return fReadView; }
73*c8dee2aaSAndroid Build Coastguard Worker 
dimensions()74*c8dee2aaSAndroid Build Coastguard Worker     SkISize dimensions() const { return fReadView.dimensions(); }
width()75*c8dee2aaSAndroid Build Coastguard Worker     int width() const { return fReadView.proxy()->width(); }
height()76*c8dee2aaSAndroid Build Coastguard Worker     int height() const { return fReadView.proxy()->height(); }
77*c8dee2aaSAndroid Build Coastguard Worker 
mipmapped()78*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Mipmapped mipmapped() const { return fReadView.mipmapped(); }
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker     const GrCaps* caps() const;
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker     /**
83*c8dee2aaSAndroid Build Coastguard Worker      * Reads a rectangle of pixels from the surface context.
84*c8dee2aaSAndroid Build Coastguard Worker      * @param dContext      The direct context to use
85*c8dee2aaSAndroid Build Coastguard Worker      * @param dst           destination pixels for the read
86*c8dee2aaSAndroid Build Coastguard Worker      * @param srcPt         offset w/in the surface context from which to read
87*c8dee2aaSAndroid Build Coastguard Worker      *                      is a GrDirectContext and fail otherwise.
88*c8dee2aaSAndroid Build Coastguard Worker      */
89*c8dee2aaSAndroid Build Coastguard Worker     bool readPixels(GrDirectContext* dContext, GrPixmap dst, SkIPoint srcPt);
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker     using ReadPixelsCallback = SkImage::ReadPixelsCallback;
92*c8dee2aaSAndroid Build Coastguard Worker     using ReadPixelsContext  = SkImage::ReadPixelsContext;
93*c8dee2aaSAndroid Build Coastguard Worker     using RescaleGamma       = SkImage::RescaleGamma;
94*c8dee2aaSAndroid Build Coastguard Worker     using RescaleMode        = SkImage::RescaleMode;
95*c8dee2aaSAndroid Build Coastguard Worker 
96*c8dee2aaSAndroid Build Coastguard Worker     // GPU implementation for SkImage:: and SkSurface::asyncRescaleAndReadPixels.
97*c8dee2aaSAndroid Build Coastguard Worker     void asyncRescaleAndReadPixels(GrDirectContext*,
98*c8dee2aaSAndroid Build Coastguard Worker                                    const SkImageInfo& info,
99*c8dee2aaSAndroid Build Coastguard Worker                                    const SkIRect& srcRect,
100*c8dee2aaSAndroid Build Coastguard Worker                                    RescaleGamma rescaleGamma,
101*c8dee2aaSAndroid Build Coastguard Worker                                    RescaleMode,
102*c8dee2aaSAndroid Build Coastguard Worker                                    ReadPixelsCallback callback,
103*c8dee2aaSAndroid Build Coastguard Worker                                    ReadPixelsContext callbackContext);
104*c8dee2aaSAndroid Build Coastguard Worker 
105*c8dee2aaSAndroid Build Coastguard Worker     // GPU implementation for SkImage:: and SkSurface::asyncRescaleAndReadPixelsYUV420.
106*c8dee2aaSAndroid Build Coastguard Worker     void asyncRescaleAndReadPixelsYUV420(GrDirectContext*,
107*c8dee2aaSAndroid Build Coastguard Worker                                          SkYUVColorSpace yuvColorSpace,
108*c8dee2aaSAndroid Build Coastguard Worker                                          bool readAlpha,
109*c8dee2aaSAndroid Build Coastguard Worker                                          sk_sp<SkColorSpace> dstColorSpace,
110*c8dee2aaSAndroid Build Coastguard Worker                                          const SkIRect& srcRect,
111*c8dee2aaSAndroid Build Coastguard Worker                                          SkISize dstSize,
112*c8dee2aaSAndroid Build Coastguard Worker                                          RescaleGamma rescaleGamma,
113*c8dee2aaSAndroid Build Coastguard Worker                                          RescaleMode,
114*c8dee2aaSAndroid Build Coastguard Worker                                          ReadPixelsCallback callback,
115*c8dee2aaSAndroid Build Coastguard Worker                                          ReadPixelsContext context);
116*c8dee2aaSAndroid Build Coastguard Worker 
117*c8dee2aaSAndroid Build Coastguard Worker     /**
118*c8dee2aaSAndroid Build Coastguard Worker      * Writes a rectangle of pixels from src into the surfaceDrawContext at the specified position.
119*c8dee2aaSAndroid Build Coastguard Worker      * @param dContext         The direct context to use
120*c8dee2aaSAndroid Build Coastguard Worker      * @param src              source for the write
121*c8dee2aaSAndroid Build Coastguard Worker      * @param dstPt            offset w/in the surface context at which to write
122*c8dee2aaSAndroid Build Coastguard Worker      */
123*c8dee2aaSAndroid Build Coastguard Worker     bool writePixels(GrDirectContext* dContext,
124*c8dee2aaSAndroid Build Coastguard Worker                      GrCPixmap src,
125*c8dee2aaSAndroid Build Coastguard Worker                      SkIPoint dstPt);
126*c8dee2aaSAndroid Build Coastguard Worker 
127*c8dee2aaSAndroid Build Coastguard Worker     /**
128*c8dee2aaSAndroid Build Coastguard Worker      * Fully populates either the base level or all MIP levels of the GrSurface with pixel data.
129*c8dee2aaSAndroid Build Coastguard Worker      * @param dContext         The direct context to use
130*c8dee2aaSAndroid Build Coastguard Worker      * @param src              Array of pixmaps
131*c8dee2aaSAndroid Build Coastguard Worker      * @param numLevels        Number of pixmaps in src. To succeed this must be 1 or the total
132*c8dee2aaSAndroid Build Coastguard Worker      *                         number of MIP levels.
133*c8dee2aaSAndroid Build Coastguard Worker      */
134*c8dee2aaSAndroid Build Coastguard Worker     bool writePixels(GrDirectContext* dContext,
135*c8dee2aaSAndroid Build Coastguard Worker                      const GrCPixmap src[],
136*c8dee2aaSAndroid Build Coastguard Worker                      int numLevels);
137*c8dee2aaSAndroid Build Coastguard Worker 
asSurfaceProxy()138*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceProxy* asSurfaceProxy() { return fReadView.proxy(); }
asSurfaceProxy()139*c8dee2aaSAndroid Build Coastguard Worker     const GrSurfaceProxy* asSurfaceProxy() const { return fReadView.proxy(); }
asSurfaceProxyRef()140*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrSurfaceProxy> asSurfaceProxyRef() { return fReadView.refProxy(); }
141*c8dee2aaSAndroid Build Coastguard Worker 
asTextureProxy()142*c8dee2aaSAndroid Build Coastguard Worker     GrTextureProxy* asTextureProxy() { return fReadView.asTextureProxy(); }
asTextureProxy()143*c8dee2aaSAndroid Build Coastguard Worker     const GrTextureProxy* asTextureProxy() const { return fReadView.asTextureProxy(); }
asTextureProxyRef()144*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTextureProxy> asTextureProxyRef() { return fReadView.asTextureProxyRef(); }
145*c8dee2aaSAndroid Build Coastguard Worker 
asRenderTargetProxy()146*c8dee2aaSAndroid Build Coastguard Worker     GrRenderTargetProxy* asRenderTargetProxy() { return fReadView.asRenderTargetProxy(); }
asRenderTargetProxy()147*c8dee2aaSAndroid Build Coastguard Worker     const GrRenderTargetProxy* asRenderTargetProxy() const {
148*c8dee2aaSAndroid Build Coastguard Worker         return fReadView.asRenderTargetProxy();
149*c8dee2aaSAndroid Build Coastguard Worker     }
asRenderTargetProxyRef()150*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrRenderTargetProxy> asRenderTargetProxyRef() {
151*c8dee2aaSAndroid Build Coastguard Worker         return fReadView.asRenderTargetProxyRef();
152*c8dee2aaSAndroid Build Coastguard Worker     }
153*c8dee2aaSAndroid Build Coastguard Worker 
asFillContext()154*c8dee2aaSAndroid Build Coastguard Worker     virtual SurfaceFillContext* asFillContext() { return nullptr; }
155*c8dee2aaSAndroid Build Coastguard Worker 
156*c8dee2aaSAndroid Build Coastguard Worker     /**
157*c8dee2aaSAndroid Build Coastguard Worker      * Rescales the contents of srcRect. The gamma in which the rescaling occurs is controlled by
158*c8dee2aaSAndroid Build Coastguard Worker      * RescaleGamma. It is always in the original gamut. The result is converted to the color type
159*c8dee2aaSAndroid Build Coastguard Worker      * and color space of info after rescaling. Note: this currently requires that the info have a
160*c8dee2aaSAndroid Build Coastguard Worker      * different size than srcRect. Though, it could be relaxed to allow non-scaling color
161*c8dee2aaSAndroid Build Coastguard Worker      * conversions.
162*c8dee2aaSAndroid Build Coastguard Worker      */
163*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<SurfaceFillContext> rescale(const GrImageInfo& info,
164*c8dee2aaSAndroid Build Coastguard Worker                                                 GrSurfaceOrigin,
165*c8dee2aaSAndroid Build Coastguard Worker                                                 SkIRect srcRect,
166*c8dee2aaSAndroid Build Coastguard Worker                                                 SkImage::RescaleGamma,
167*c8dee2aaSAndroid Build Coastguard Worker                                                 SkImage::RescaleMode);
168*c8dee2aaSAndroid Build Coastguard Worker 
169*c8dee2aaSAndroid Build Coastguard Worker     /**
170*c8dee2aaSAndroid Build Coastguard Worker      * Like the above but allows the caller ot specify a destination fill context and
171*c8dee2aaSAndroid Build Coastguard Worker      * rect within that context. The dst rect must be contained by the dst or this will fail.
172*c8dee2aaSAndroid Build Coastguard Worker      */
173*c8dee2aaSAndroid Build Coastguard Worker     bool rescaleInto(SurfaceFillContext* dst,
174*c8dee2aaSAndroid Build Coastguard Worker                      SkIRect dstRect,
175*c8dee2aaSAndroid Build Coastguard Worker                      SkIRect srcRect,
176*c8dee2aaSAndroid Build Coastguard Worker                      SkImage::RescaleGamma,
177*c8dee2aaSAndroid Build Coastguard Worker                      SkImage::RescaleMode);
178*c8dee2aaSAndroid Build Coastguard Worker 
179*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
testCopy(sk_sp<GrSurfaceProxy> src,const SkIRect & srcRect,const SkIPoint & dstPoint)180*c8dee2aaSAndroid Build Coastguard Worker     bool testCopy(sk_sp<GrSurfaceProxy> src, const SkIRect& srcRect, const SkIPoint& dstPoint) {
181*c8dee2aaSAndroid Build Coastguard Worker         return this->copy(std::move(src), srcRect, dstPoint) != nullptr;
182*c8dee2aaSAndroid Build Coastguard Worker     }
183*c8dee2aaSAndroid Build Coastguard Worker 
testCopy(sk_sp<GrSurfaceProxy> src)184*c8dee2aaSAndroid Build Coastguard Worker     bool testCopy(sk_sp<GrSurfaceProxy> src) {
185*c8dee2aaSAndroid Build Coastguard Worker         auto rect = SkIRect::MakeSize(src->dimensions());
186*c8dee2aaSAndroid Build Coastguard Worker         return this->copy(std::move(src), rect, {0, 0}) != nullptr;
187*c8dee2aaSAndroid Build Coastguard Worker     }
188*c8dee2aaSAndroid Build Coastguard Worker #endif
189*c8dee2aaSAndroid Build Coastguard Worker 
190*c8dee2aaSAndroid Build Coastguard Worker protected:
191*c8dee2aaSAndroid Build Coastguard Worker     GrDrawingManager* drawingManager();
192*c8dee2aaSAndroid Build Coastguard Worker     const GrDrawingManager* drawingManager() const;
193*c8dee2aaSAndroid Build Coastguard Worker 
194*c8dee2aaSAndroid Build Coastguard Worker     SkDEBUGCODE(void validate() const;)
195*c8dee2aaSAndroid Build Coastguard Worker 
196*c8dee2aaSAndroid Build Coastguard Worker     SkDEBUGCODE(skgpu::SingleOwner* singleOwner() const;)
197*c8dee2aaSAndroid Build Coastguard Worker 
198*c8dee2aaSAndroid Build Coastguard Worker     GrRecordingContext* fContext;
199*c8dee2aaSAndroid Build Coastguard Worker 
200*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceProxyView fReadView;
201*c8dee2aaSAndroid Build Coastguard Worker 
202*c8dee2aaSAndroid Build Coastguard Worker     // Inserts a transfer, part of the implementation of asyncReadPixels and
203*c8dee2aaSAndroid Build Coastguard Worker     // asyncRescaleAndReadPixelsYUV420().
204*c8dee2aaSAndroid Build Coastguard Worker     struct PixelTransferResult {
205*c8dee2aaSAndroid Build Coastguard Worker         using ConversionFn = void(void* dst, const void* mappedBuffer);
206*c8dee2aaSAndroid Build Coastguard Worker         // If null then the transfer could not be performed. Otherwise this buffer will contain
207*c8dee2aaSAndroid Build Coastguard Worker         // the pixel data when the transfer is complete.
208*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<GrGpuBuffer> fTransferBuffer;
209*c8dee2aaSAndroid Build Coastguard Worker         // RowBytes for transfer buffer data
210*c8dee2aaSAndroid Build Coastguard Worker         size_t fRowBytes;
211*c8dee2aaSAndroid Build Coastguard Worker         // If this is null then the transfer buffer will contain the data in the requested
212*c8dee2aaSAndroid Build Coastguard Worker         // color type. Otherwise, when the transfer is done this must be called to convert
213*c8dee2aaSAndroid Build Coastguard Worker         // from the transfer buffer's color type to the requested color type.
214*c8dee2aaSAndroid Build Coastguard Worker         std::function<ConversionFn> fPixelConverter;
215*c8dee2aaSAndroid Build Coastguard Worker     };
216*c8dee2aaSAndroid Build Coastguard Worker     PixelTransferResult transferPixels(GrColorType colorType, const SkIRect& rect);
217*c8dee2aaSAndroid Build Coastguard Worker 
218*c8dee2aaSAndroid Build Coastguard Worker     // The async read step of asyncRescaleAndReadPixels()
219*c8dee2aaSAndroid Build Coastguard Worker     void asyncReadPixels(GrDirectContext*,
220*c8dee2aaSAndroid Build Coastguard Worker                          const SkIRect& srcRect,
221*c8dee2aaSAndroid Build Coastguard Worker                          SkColorType,
222*c8dee2aaSAndroid Build Coastguard Worker                          ReadPixelsCallback,
223*c8dee2aaSAndroid Build Coastguard Worker                          ReadPixelsContext);
224*c8dee2aaSAndroid Build Coastguard Worker 
225*c8dee2aaSAndroid Build Coastguard Worker private:
226*c8dee2aaSAndroid Build Coastguard Worker     friend class ::GrRecordingContextPriv; // for validate
227*c8dee2aaSAndroid Build Coastguard Worker     friend class ::GrSurfaceProxy; // for copy
228*c8dee2aaSAndroid Build Coastguard Worker 
229*c8dee2aaSAndroid Build Coastguard Worker     SkDEBUGCODE(virtual void onValidate() const {})
230*c8dee2aaSAndroid Build Coastguard Worker 
231*c8dee2aaSAndroid Build Coastguard Worker     /**
232*c8dee2aaSAndroid Build Coastguard Worker      * Copy 'src' into the proxy backing this context. This call will not do any draw fallback.
233*c8dee2aaSAndroid Build Coastguard Worker      * Currently only writePixels and replaceRenderTarget call this directly. All other copies
234*c8dee2aaSAndroid Build Coastguard Worker      * should go through GrSurfaceProxy::Copy.
235*c8dee2aaSAndroid Build Coastguard Worker      * @param src       src of pixels
236*c8dee2aaSAndroid Build Coastguard Worker      * @param dstPoint  the origin of the 'srcRect' in the destination coordinate space
237*c8dee2aaSAndroid Build Coastguard Worker      * @return          a task (that may be skippable by calling canSkip) if successful and
238*c8dee2aaSAndroid Build Coastguard Worker      *                  null otherwise.
239*c8dee2aaSAndroid Build Coastguard Worker      *
240*c8dee2aaSAndroid Build Coastguard Worker      * Note: Notionally, 'srcRect' is clipped to 'src's extent with 'dstPoint' being adjusted.
241*c8dee2aaSAndroid Build Coastguard Worker      *       Then the 'srcRect' offset by 'dstPoint' is clipped against the dst's extent.
242*c8dee2aaSAndroid Build Coastguard Worker      *       The end result is only valid src pixels and dst pixels will be touched but the copied
243*c8dee2aaSAndroid Build Coastguard Worker      *       regions will not be shifted. The 'src' must have the same origin as the backing proxy
244*c8dee2aaSAndroid Build Coastguard Worker      *       of fSurfaceContext.
245*c8dee2aaSAndroid Build Coastguard Worker      */
246*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrRenderTask> copy(sk_sp<GrSurfaceProxy> src, SkIRect srcRect, SkIPoint dstPoint);
247*c8dee2aaSAndroid Build Coastguard Worker 
248*c8dee2aaSAndroid Build Coastguard Worker     /**
249*c8dee2aaSAndroid Build Coastguard Worker      * Copy and scale 'src' into the proxy backing this context. This call will not do any draw
250*c8dee2aaSAndroid Build Coastguard Worker      * fallback. Currently only rescaleInto() calls this directly, which handles drawing fallback
251*c8dee2aaSAndroid Build Coastguard Worker      * automatically.
252*c8dee2aaSAndroid Build Coastguard Worker      *
253*c8dee2aaSAndroid Build Coastguard Worker      * @param src        src of pixels
254*c8dee2aaSAndroid Build Coastguard Worker      * @param srcRect    the subset of src that is copied to this proxy
255*c8dee2aaSAndroid Build Coastguard Worker      * @param dstRect    the subset of dst that receives the copied data, possibly with different
256*c8dee2aaSAndroid Build Coastguard Worker      *                   dimensions than 'srcRect'.
257*c8dee2aaSAndroid Build Coastguard Worker      * @param filterMode the filter mode to apply when scaling src
258*c8dee2aaSAndroid Build Coastguard Worker      * @return           a task (that may be skippable by calling canSkip) if successful and
259*c8dee2aaSAndroid Build Coastguard Worker      *                   null otherwise.
260*c8dee2aaSAndroid Build Coastguard Worker      *
261*c8dee2aaSAndroid Build Coastguard Worker      * Note: Unlike copy(rect,point), 'srcRect' and 'dstRect' are not adjusted to fit within the
262*c8dee2aaSAndroid Build Coastguard Worker      * surfaces. If they are not contained, then nullptr is returned. The 'src' must have the same
263*c8dee2aaSAndroid Build Coastguard Worker      * origin as the backing proxy of this context.
264*c8dee2aaSAndroid Build Coastguard Worker      */
265*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrRenderTask> copyScaled(sk_sp<GrSurfaceProxy> src, SkIRect srcRect, SkIRect dstRect,
266*c8dee2aaSAndroid Build Coastguard Worker                                    GrSamplerState::Filter filterMode);
267*c8dee2aaSAndroid Build Coastguard Worker 
268*c8dee2aaSAndroid Build Coastguard Worker     bool internalWritePixels(GrDirectContext* dContext,
269*c8dee2aaSAndroid Build Coastguard Worker                              const GrCPixmap src[],
270*c8dee2aaSAndroid Build Coastguard Worker                              int numLevels,
271*c8dee2aaSAndroid Build Coastguard Worker                              SkIPoint);
272*c8dee2aaSAndroid Build Coastguard Worker 
273*c8dee2aaSAndroid Build Coastguard Worker     GrColorInfo fColorInfo;
274*c8dee2aaSAndroid Build Coastguard Worker 
275*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkRefCnt;
276*c8dee2aaSAndroid Build Coastguard Worker };
277*c8dee2aaSAndroid Build Coastguard Worker 
278*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu::ganesh
279*c8dee2aaSAndroid Build Coastguard Worker 
280*c8dee2aaSAndroid Build Coastguard Worker #endif // SurfaceContext_DEFINED
281