GrGpu.h revision 8ee78f31b2a29a5f76403755ea17bad9be74a3ec
1/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrGpu_DEFINED
9#define GrGpu_DEFINED
10
11#include "GrPipelineBuilder.h"
12#include "GrProgramDesc.h"
13#include "GrStencil.h"
14#include "GrSwizzle.h"
15#include "GrTextureParamsAdjuster.h"
16#include "GrTypes.h"
17#include "GrXferProcessor.h"
18#include "SkPath.h"
19#include "SkTArray.h"
20
21class GrBatchTracker;
22class GrContext;
23class GrGLContext;
24class GrIndexBuffer;
25class GrNonInstancedVertices;
26class GrPath;
27class GrPathRange;
28class GrPathRenderer;
29class GrPathRendererChain;
30class GrPathRendering;
31class GrPipeline;
32class GrPrimitiveProcessor;
33class GrRenderTarget;
34class GrStencilAttachment;
35class GrSurface;
36class GrTexture;
37class GrTransferBuffer;
38class GrVertexBuffer;
39class GrVertices;
40
41class GrGpu : public SkRefCnt {
42public:
43    /**
44     * Create an instance of GrGpu that matches the specified backend. If the requested backend is
45     * not supported (at compile-time or run-time) this returns nullptr. The context will not be
46     * fully constructed and should not be used by GrGpu until after this function returns.
47     */
48    static GrGpu* Create(GrBackend, GrBackendContext, const GrContextOptions&, GrContext* context);
49
50    ////////////////////////////////////////////////////////////////////////////
51
52    GrGpu(GrContext* context);
53    ~GrGpu() override;
54
55    GrContext* getContext() { return fContext; }
56    const GrContext* getContext() const { return fContext; }
57
58    /**
59     * Gets the capabilities of the draw target.
60     */
61    const GrCaps* caps() const { return fCaps.get(); }
62
63    GrPathRendering* pathRendering() { return fPathRendering.get();  }
64
65    // Called by GrContext when the underlying backend context has been destroyed.
66    // GrGpu should use this to ensure that no backend API calls will be made from
67    // here onward, including in its destructor. Subclasses should call
68    // INHERITED::contextAbandoned() if they override this.
69    virtual void contextAbandoned();
70
71    /**
72     * The GrGpu object normally assumes that no outsider is setting state
73     * within the underlying 3D API's context/device/whatever. This call informs
74     * the GrGpu that the state was modified and it shouldn't make assumptions
75     * about the state.
76     */
77    void markContextDirty(uint32_t state = kAll_GrBackendState) { fResetBits |= state; }
78
79    /**
80     * Creates a texture object. If kRenderTarget_GrSurfaceFlag the texture can
81     * be used as a render target by calling GrTexture::asRenderTarget(). Not all
82     * pixel configs can be used as render targets. Support for configs as textures
83     * or render targets can be checked using GrCaps.
84     *
85     * @param desc        describes the texture to be created.
86     * @param budgeted    does this texture count against the resource cache budget?
87     * @param texels      array of mipmap levels containing texel data to load.
88     *                    Each level begins with full-size palette data for paletted textures.
89     *                    For compressed formats the level contains the compressed pixel data.
90     *                    Otherwise, it contains width*height texels. If there is only one
91     *                    element and it contains nullptr fPixels, texture data is
92     *                    uninitialized.
93     * @return    The texture object if successful, otherwise nullptr.
94     */
95    GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted,
96                             const SkTArray<GrMipLevel>& texels);
97
98    /**
99     * Simplified createTexture() interface when there is no initial texel data
100     * to upload.
101     */
102    GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted) {
103        return this->createTexture(desc, budgeted, SkTArray<GrMipLevel>());
104    }
105
106    /**
107     * Implements GrTextureProvider::wrapBackendTexture
108     */
109    GrTexture* wrapBackendTexture(const GrBackendTextureDesc&, GrWrapOwnership);
110
111    /**
112     * Implements GrTextureProvider::wrapBackendRenderTarget
113     */
114    GrRenderTarget* wrapBackendRenderTarget(const GrBackendRenderTargetDesc&, GrWrapOwnership);
115
116    /**
117     * Implements GrTextureProvider::wrapBackendTextureAsRenderTarget
118     */
119    GrRenderTarget* wrapBackendTextureAsRenderTarget(const GrBackendTextureDesc&, GrWrapOwnership);
120
121    /**
122     * Creates a vertex buffer.
123     *
124     * @param size    size in bytes of the vertex buffer
125     * @param dynamic hints whether the data will be frequently changed
126     *                by either GrVertexBuffer::map() or
127     *                GrVertexBuffer::updateData().
128     *
129     * @return    The vertex buffer if successful, otherwise nullptr.
130     */
131    GrVertexBuffer* createVertexBuffer(size_t size, bool dynamic);
132
133    /**
134     * Creates an index buffer.
135     *
136     * @param size    size in bytes of the index buffer
137     * @param dynamic hints whether the data will be frequently changed
138     *                by either GrIndexBuffer::map() or
139     *                GrIndexBuffer::updateData().
140     *
141     * @return The index buffer if successful, otherwise nullptr.
142     */
143    GrIndexBuffer* createIndexBuffer(size_t size, bool dynamic);
144
145    /**
146     * Creates a transfer buffer.
147     *
148     * @param size      size in bytes of the index buffer
149     * @param toGpu     true if used to transfer from the cpu to the gpu
150     *                  otherwise to be used to transfer from the gpu to the cpu
151     *
152     * @return The transfer buffer if successful, otherwise nullptr.
153     */
154    GrTransferBuffer* createTransferBuffer(size_t size, TransferType type);
155
156    /**
157     * Resolves MSAA.
158     */
159    void resolveRenderTarget(GrRenderTarget* target);
160
161    /** Info struct returned by getReadPixelsInfo about performing intermediate draws before
162        reading pixels for performance or correctness. */
163    struct ReadPixelTempDrawInfo {
164        /** If the GrGpu is requesting that the caller do a draw to an intermediate surface then
165            this is descriptor for the temp surface. The draw should always be a rect with
166            dst 0,0,w,h. */
167        GrSurfaceDesc   fTempSurfaceDesc;
168        /** Indicates whether there is a performance advantage to using an exact match texture
169            (in terms of width and height) for the intermediate texture instead of approximate. */
170        bool            fUseExactScratch;
171        /** Swizzle to apply during the draw. This is used to compensate for either feature or
172            performance limitations in the underlying 3D API. */
173        GrSwizzle       fSwizzle;
174        /** The config that should be used to read from the temp surface after the draw. This may be
175            different than the original read config in order to compensate for swizzling. The
176            read data will effectively be in the original read config. */
177        GrPixelConfig   fReadConfig;
178    };
179
180    /** Describes why an intermediate draw must/should be performed before readPixels. */
181    enum DrawPreference {
182        /** On input means that the caller would proceed without draw if the GrGpu doesn't request
183            one.
184            On output means that the GrGpu is not requesting a draw. */
185        kNoDraw_DrawPreference,
186        /** Means that the client would prefer a draw for performance of the readback but
187            can satisfy a straight readPixels call on the inputs without an intermediate draw.
188            getReadPixelsInfo will never set the draw preference to this value but may leave
189            it set. */
190        kCallerPrefersDraw_DrawPreference,
191        /** On output means that GrGpu would prefer a draw for performance of the readback but
192            can satisfy a straight readPixels call on the inputs without an intermediate draw. The
193            caller of getReadPixelsInfo should never specify this on intput. */
194        kGpuPrefersDraw_DrawPreference,
195        /** On input means that the caller requires a draw to do a transformation and there is no
196            CPU fallback.
197            On output means that GrGpu can only satisfy the readPixels request if the intermediate
198            draw is performed.
199          */
200        kRequireDraw_DrawPreference
201    };
202
203    /**
204     * Used to negotiate whether and how an intermediate draw should or must be performed before
205     * a readPixels call. If this returns false then GrGpu could not deduce an intermediate draw
206     * that would allow a successful readPixels call. The passed width, height, and rowBytes,
207     * must be non-zero and already reflect clipping to the src bounds.
208     */
209    bool getReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight, size_t rowBytes,
210                           GrPixelConfig readConfig, DrawPreference*, ReadPixelTempDrawInfo*);
211
212    /** Info struct returned by getWritePixelsInfo about performing an intermediate draw in order
213        to write pixels to a GrSurface for either performance or correctness reasons. */
214    struct WritePixelTempDrawInfo {
215        /** If the GrGpu is requesting that the caller upload to an intermediate surface and draw
216            that to the dst then this is the descriptor for the intermediate surface. The caller
217            should upload the pixels such that the upper left pixel of the upload rect is at 0,0 in
218            the intermediate surface.*/
219        GrSurfaceDesc   fTempSurfaceDesc;
220        /** Swizzle to apply during the draw. This is used to compensate for either feature or
221            performance limitations in the underlying 3D API. */
222        GrSwizzle       fSwizzle;
223        /** The config that should be specified when uploading the *original* data to the temp
224            surface before the draw. This may be different than the original src data config in
225            order to compensate for swizzling that will occur when drawing. */
226        GrPixelConfig   fWriteConfig;
227    };
228
229    /**
230     * Used to negotiate whether and how an intermediate surface should be used to write pixels to
231     * a GrSurface. If this returns false then GrGpu could not deduce an intermediate draw
232     * that would allow a successful transfer of the src pixels to the dst. The passed width,
233     * height, and rowBytes, must be non-zero and already reflect clipping to the dst bounds.
234     */
235    bool getWritePixelsInfo(GrSurface* dstSurface, int width, int height,
236                            GrPixelConfig srcConfig, DrawPreference*, WritePixelTempDrawInfo*);
237
238    /**
239     * Reads a rectangle of pixels from a render target.
240     *
241     * @param surface       The surface to read from
242     * @param left          left edge of the rectangle to read (inclusive)
243     * @param top           top edge of the rectangle to read (inclusive)
244     * @param width         width of rectangle to read in pixels.
245     * @param height        height of rectangle to read in pixels.
246     * @param config        the pixel config of the destination buffer
247     * @param buffer        memory to read the rectangle into.
248     * @param rowBytes      the number of bytes between consecutive rows. Zero
249     *                      means rows are tightly packed.
250     * @param invertY       buffer should be populated bottom-to-top as opposed
251     *                      to top-to-bottom (skia's usual order)
252     *
253     * @return true if the read succeeded, false if not. The read can fail
254     *              because of a unsupported pixel config or because no render
255     *              target is currently set.
256     */
257    bool readPixels(GrSurface* surface,
258                    int left, int top, int width, int height,
259                    GrPixelConfig config, void* buffer, size_t rowBytes);
260
261    /**
262     * Updates the pixels in a rectangle of a surface.
263     *
264     * @param surface       The surface to write to.
265     * @param left          left edge of the rectangle to write (inclusive)
266     * @param top           top edge of the rectangle to write (inclusive)
267     * @param width         width of rectangle to write in pixels.
268     * @param height        height of rectangle to write in pixels.
269     * @param config        the pixel config of the source buffer
270     * @param texels        array of mipmap levels containing texture data
271     */
272    bool writePixels(GrSurface* surface,
273                     int left, int top, int width, int height,
274                     GrPixelConfig config,
275                     const SkTArray<GrMipLevel>& texels);
276
277    /**
278     * This function is a shim which creates a SkTArray<GrMipLevel> of size 1.
279     * It then calls writePixels with that SkTArray.
280     *
281     * @param buffer   memory to read pixels from.
282     * @param rowBytes number of bytes between consecutive rows. Zero
283     *                 means rows are tightly packed.
284     */
285    bool writePixels(GrSurface* surface,
286                     int left, int top, int width, int height,
287                     GrPixelConfig config, const void* buffer,
288                     size_t rowBytes);
289
290    /**
291     * Updates the pixels in a rectangle of a surface using a GrTransferBuffer
292     *
293     * @param surface       The surface to write to.
294     * @param left          left edge of the rectangle to write (inclusive)
295     * @param top           top edge of the rectangle to write (inclusive)
296     * @param width         width of rectangle to write in pixels.
297     * @param height        height of rectangle to write in pixels.
298     * @param config        the pixel config of the source buffer
299     * @param buffer        GrTransferBuffer to read pixels from
300     * @param offset        offset from the start of the buffer
301     * @param rowBytes      number of bytes between consecutive rows. Zero
302     *                      means rows are tightly packed.
303     */
304    bool transferPixels(GrSurface* surface,
305                        int left, int top, int width, int height,
306                        GrPixelConfig config, GrTransferBuffer* buffer,
307                        size_t offset, size_t rowBytes);
308
309    /**
310     * Clear the passed in render target. Ignores the draw state and clip.
311     */
312    void clear(const SkIRect& rect, GrColor color, GrRenderTarget* renderTarget);
313
314
315    void clearStencilClip(const SkIRect& rect, bool insideClip, GrRenderTarget* renderTarget);
316
317    /**
318     * Discards the contents render target. nullptr indicates that the current render target should
319     * be discarded.
320     **/
321    virtual void discard(GrRenderTarget* = nullptr) = 0;
322
323    /**
324     * This is can be called before allocating a texture to be a dst for copySurface. It will
325     * populate the origin, config, and flags fields of the desc such that copySurface can
326     * efficiently succeed. It should only succeed if it can allow copySurface to perform a copy
327     * that would be more effecient than drawing the src to a dst render target.
328     */
329    virtual bool initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc) const = 0;
330
331    // After the client interacts directly with the 3D context state the GrGpu
332    // must resync its internal state and assumptions about 3D context state.
333    // Each time this occurs the GrGpu bumps a timestamp.
334    // state of the 3D context
335    // At 10 resets / frame and 60fps a 64bit timestamp will overflow in about
336    // a billion years.
337    typedef uint64_t ResetTimestamp;
338
339    // This timestamp is always older than the current timestamp
340    static const ResetTimestamp kExpiredTimestamp = 0;
341    // Returns a timestamp based on the number of times the context was reset.
342    // This timestamp can be used to lazily detect when cached 3D context state
343    // is dirty.
344    ResetTimestamp getResetTimestamp() const { return fResetTimestamp; }
345
346    virtual void buildProgramDesc(GrProgramDesc*,
347                                  const GrPrimitiveProcessor&,
348                                  const GrPipeline&) const = 0;
349
350    // Called to perform a surface to surface copy. Fallbacks to issuing a draw from the src to dst
351    // take place at the GrDrawTarget level and this function implement faster copy paths. The rect
352    // and point are pre-clipped. The src rect and implied dst rect are guaranteed to be within the
353    // src/dst bounds and non-empty.
354    bool copySurface(GrSurface* dst,
355                     GrSurface* src,
356                     const SkIRect& srcRect,
357                     const SkIPoint& dstPoint);
358
359    struct DrawArgs {
360        DrawArgs(const GrPrimitiveProcessor* primProc,
361                 const GrPipeline* pipeline,
362                 const GrProgramDesc* desc)
363            : fPrimitiveProcessor(primProc)
364            , fPipeline(pipeline)
365            , fDesc(desc) {
366            SkASSERT(primProc && pipeline && desc);
367        }
368        const GrPrimitiveProcessor* fPrimitiveProcessor;
369        const GrPipeline* fPipeline;
370        const GrProgramDesc* fDesc;
371    };
372
373    void draw(const DrawArgs&, const GrVertices&);
374
375    // Called by drawtarget when flushing.
376    // Provides a hook for post-flush actions (e.g. PLS reset and Vulkan command buffer submits).
377    virtual void finishDrawTarget() {}
378
379    ///////////////////////////////////////////////////////////////////////////
380    // Debugging and Stats
381
382    class Stats {
383    public:
384#if GR_GPU_STATS
385        Stats() { this->reset(); }
386
387        void reset() {
388            fRenderTargetBinds = 0;
389            fShaderCompilations = 0;
390            fTextureCreates = 0;
391            fTextureUploads = 0;
392            fTransfersToTexture = 0;
393            fStencilAttachmentCreates = 0;
394            fNumDraws = 0;
395        }
396
397        int renderTargetBinds() const { return fRenderTargetBinds; }
398        void incRenderTargetBinds() { fRenderTargetBinds++; }
399        int shaderCompilations() const { return fShaderCompilations; }
400        void incShaderCompilations() { fShaderCompilations++; }
401        int textureCreates() const { return fTextureCreates; }
402        void incTextureCreates() { fTextureCreates++; }
403        int textureUploads() const { return fTextureUploads; }
404        void incTextureUploads() { fTextureUploads++; }
405        int transfersToTexture() const { return fTransfersToTexture; }
406        void incTransfersToTexture() { fTransfersToTexture++; }
407        void incStencilAttachmentCreates() { fStencilAttachmentCreates++; }
408        void incNumDraws() { fNumDraws++; }
409        void dump(SkString*);
410        void dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values);
411
412    private:
413        int fRenderTargetBinds;
414        int fShaderCompilations;
415        int fTextureCreates;
416        int fTextureUploads;
417        int fTransfersToTexture;
418        int fStencilAttachmentCreates;
419        int fNumDraws;
420#else
421        void dump(SkString*) {}
422        void dumpKeyValuePairs(SkTArray<SkString>*, SkTArray<double>*) {}
423        void incRenderTargetBinds() {}
424        void incShaderCompilations() {}
425        void incTextureCreates() {}
426        void incTextureUploads() {}
427        void incTransfersToTexture() {}
428        void incStencilAttachmentCreates() {}
429        void incNumDraws() {}
430#endif
431    };
432
433    Stats* stats() { return &fStats; }
434
435    /** Creates a texture directly in the backend API without wrapping it in a GrTexture. This is
436        only to be used for testing (particularly for testing the methods that import an externally
437        created texture into Skia. Must be matched with a call to deleteTestingOnlyTexture(). */
438    virtual GrBackendObject createTestingOnlyBackendTexture(void* pixels, int w, int h,
439                                                            GrPixelConfig config) = 0;
440    /** Check a handle represents an actual texture in the backend API that has not been freed. */
441    virtual bool isTestingOnlyBackendTexture(GrBackendObject) const = 0;
442    /** If ownership of the backend texture has been transferred pass true for abandonTexture. This
443        will do any necessary cleanup of the handle without freeing the texture in the backend
444        API. */
445    virtual void deleteTestingOnlyBackendTexture(GrBackendObject,
446                                                 bool abandonTexture = false) = 0;
447
448    // width and height may be larger than rt (if underlying API allows it).
449    // Returns nullptr if compatible sb could not be created, otherwise the caller owns the ref on
450    // the GrStencilAttachment.
451    virtual GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*,
452                                                                        int width,
453                                                                        int height) = 0;
454    // clears target's entire stencil buffer to 0
455    virtual void clearStencil(GrRenderTarget* target) = 0;
456
457    // draws an outline rectangle for debugging/visualization purposes.
458    virtual void drawDebugWireRect(GrRenderTarget*, const SkIRect&, GrColor) = 0;
459
460    // Determines whether a texture will need to be rescaled in order to be used with the
461    // GrTextureParams. This variation is called when the caller will create a new texture using the
462    // texture provider from a non-texture src (cpu-backed image, ...).
463    bool makeCopyForTextureParams(int width, int height, const GrTextureParams&,
464                                 GrTextureProducer::CopyParams*) const;
465
466    // Like the above but this variation should be called when the caller is not creating the
467    // original texture but rather was handed the original texture. It adds additional checks
468    // relevant to original textures that were created external to Skia via
469    // GrTextureProvider::wrap methods.
470    bool makeCopyForTextureParams(GrTexture* texture, const GrTextureParams& params,
471                                  GrTextureProducer::CopyParams* copyParams) const {
472        if (this->makeCopyForTextureParams(texture->width(), texture->height(), params,
473                                           copyParams)) {
474            return true;
475        }
476        return this->onMakeCopyForTextureParams(texture, params, copyParams);
477    }
478
479    // This is only to be used in GL-specific tests.
480    virtual const GrGLContext* glContextForTesting() const { return nullptr; }
481
482    // This is only to be used by testing code
483    virtual void resetShaderCacheForTesting() const {}
484
485protected:
486    // Functions used to map clip-respecting stencil tests into normal
487    // stencil funcs supported by GPUs.
488    static GrStencilFunc ConvertStencilFunc(bool stencilInClip,
489                                            GrStencilFunc func);
490    static void ConvertStencilFuncAndMask(GrStencilFunc func,
491                                          bool clipInStencil,
492                                          unsigned int clipBit,
493                                          unsigned int userBits,
494                                          unsigned int* ref,
495                                          unsigned int* mask);
496
497    static void ElevateDrawPreference(GrGpu::DrawPreference* preference,
498                                      GrGpu::DrawPreference elevation) {
499        GR_STATIC_ASSERT(GrGpu::kCallerPrefersDraw_DrawPreference > GrGpu::kNoDraw_DrawPreference);
500        GR_STATIC_ASSERT(GrGpu::kGpuPrefersDraw_DrawPreference >
501                         GrGpu::kCallerPrefersDraw_DrawPreference);
502        GR_STATIC_ASSERT(GrGpu::kRequireDraw_DrawPreference >
503                         GrGpu::kGpuPrefersDraw_DrawPreference);
504        *preference = SkTMax(*preference, elevation);
505    }
506
507    void handleDirtyContext() {
508        if (fResetBits) {
509            this->resetContext();
510        }
511    }
512
513    Stats                                   fStats;
514    SkAutoTDelete<GrPathRendering>          fPathRendering;
515    // Subclass must initialize this in its constructor.
516    SkAutoTUnref<const GrCaps>    fCaps;
517
518private:
519    // called when the 3D context state is unknown. Subclass should emit any
520    // assumed 3D context state and dirty any state cache.
521    virtual void onResetContext(uint32_t resetBits) = 0;
522
523    // Called before certain draws in order to guarantee coherent results from dst reads.
524    virtual void xferBarrier(GrRenderTarget*, GrXferBarrierType) = 0;
525
526    // overridden by backend-specific derived class to create objects.
527    // Texture size and sample size will have already been validated in base class before
528    // onCreateTexture/CompressedTexture are called.
529    virtual GrTexture* onCreateTexture(const GrSurfaceDesc& desc,
530                                       GrGpuResource::LifeCycle lifeCycle,
531                                       const SkTArray<GrMipLevel>& texels) = 0;
532    virtual GrTexture* onCreateCompressedTexture(const GrSurfaceDesc& desc,
533                                                 GrGpuResource::LifeCycle lifeCycle,
534                                                 const SkTArray<GrMipLevel>& texels) = 0;
535
536    virtual GrTexture* onWrapBackendTexture(const GrBackendTextureDesc&, GrWrapOwnership) = 0;
537    virtual GrRenderTarget* onWrapBackendRenderTarget(const GrBackendRenderTargetDesc&,
538                                                      GrWrapOwnership) = 0;
539    virtual GrRenderTarget* onWrapBackendTextureAsRenderTarget(const GrBackendTextureDesc&,
540                                                               GrWrapOwnership) = 0;
541    virtual GrVertexBuffer* onCreateVertexBuffer(size_t size, bool dynamic) = 0;
542    virtual GrIndexBuffer* onCreateIndexBuffer(size_t size, bool dynamic) = 0;
543    virtual GrTransferBuffer* onCreateTransferBuffer(size_t size, TransferType type) = 0;
544
545    // overridden by backend-specific derived class to perform the clear.
546    virtual void onClear(GrRenderTarget*, const SkIRect& rect, GrColor color) = 0;
547
548
549    // Overridden by backend specific classes to perform a clear of the stencil clip bits.  This is
550    // ONLY used by the the clip target
551    virtual void onClearStencilClip(GrRenderTarget*, const SkIRect& rect, bool insideClip) = 0;
552
553    // overridden by backend-specific derived class to perform the draw call.
554    virtual void onDraw(const DrawArgs&, const GrNonInstancedVertices&) = 0;
555
556    virtual bool onMakeCopyForTextureParams(GrTexture* texture, const GrTextureParams&,
557                                            GrTextureProducer::CopyParams*) const { return false; }
558
559    virtual bool onGetReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight,
560                                     size_t rowBytes, GrPixelConfig readConfig, DrawPreference*,
561                                     ReadPixelTempDrawInfo*) = 0;
562    virtual bool onGetWritePixelsInfo(GrSurface* dstSurface, int width, int height,
563                                      GrPixelConfig srcConfig, DrawPreference*,
564                                      WritePixelTempDrawInfo*) = 0;
565
566    // overridden by backend-specific derived class to perform the surface read
567    virtual bool onReadPixels(GrSurface*,
568                              int left, int top,
569                              int width, int height,
570                              GrPixelConfig,
571                              void* buffer,
572                              size_t rowBytes) = 0;
573
574    // overridden by backend-specific derived class to perform the surface write
575    virtual bool onWritePixels(GrSurface*,
576                               int left, int top, int width, int height,
577                               GrPixelConfig config,
578                               const SkTArray<GrMipLevel>& texels) = 0;
579
580    // overridden by backend-specific derived class to perform the surface write
581    virtual bool onTransferPixels(GrSurface*,
582                                  int left, int top, int width, int height,
583                                  GrPixelConfig config, GrTransferBuffer* buffer,
584                                  size_t offset, size_t rowBytes) = 0;
585
586    // overridden by backend-specific derived class to perform the resolve
587    virtual void onResolveRenderTarget(GrRenderTarget* target) = 0;
588
589    // overridden by backend specific derived class to perform the copy surface
590    virtual bool onCopySurface(GrSurface* dst,
591                               GrSurface* src,
592                               const SkIRect& srcRect,
593                               const SkIPoint& dstPoint) = 0;
594
595    void resetContext() {
596        this->onResetContext(fResetBits);
597        fResetBits = 0;
598        ++fResetTimestamp;
599    }
600
601    ResetTimestamp                                                      fResetTimestamp;
602    uint32_t                                                            fResetBits;
603    // The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu.
604    GrContext*                                                          fContext;
605
606    friend class GrPathRendering;
607    typedef SkRefCnt INHERITED;
608};
609
610#endif
611