1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2012 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SkSurface_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SkSurface_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRefCnt.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSurfaceProps.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrTypes.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkCanvas;
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkDeferredDisplayList;
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkPaint;
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkSurfaceCharacterization;
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrBackendRenderTarget;
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrBackendSemaphore;
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrContext;
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrRenderTarget;
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/**
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *  SkSurface is responsible for managing the pixels that a canvas draws into. The pixels can be
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *  allocated either in CPU memory (a Raster surface) or on the GPU (a RenderTarget surface).
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *  SkSurface takes care of allocating a SkCanvas that will draw into the surface. Call
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *  surface->getCanvas() to use that canvas (but don't delete it, it is owned by the surface).
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *  SkSurface always has non-zero dimensions. If there is a request for a new surface, and either
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *  of the requested dimensions are zero, then NULL will be returned.
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SK_API SkSurface : public SkRefCnt {
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Create a new surface, using the specified pixels/rowbytes as its
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  backend.
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  If the requested surface cannot be created, or the request is not a
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  supported configuration, NULL will be returned.
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Callers are responsible for initialiazing the surface pixels.
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeRasterDirect(const SkImageInfo& imageInfo, void* pixels,
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             size_t rowBytes,
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             const SkSurfaceProps* surfaceProps = nullptr);
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  The same as NewRasterDirect, but also accepts a call-back routine, which is invoked
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  when the surface is deleted, and is passed the pixel memory and the specified context.
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeRasterDirectReleaseProc(const SkImageInfo& imageInfo, void* pixels,
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    size_t rowBytes,
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    void (*releaseProc)(void* pixels, void* context),
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    void* context, const SkSurfaceProps* surfaceProps = nullptr);
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Return a new surface, with the memory for the pixels automatically allocated and
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  zero-initialized, but respecting the specified rowBytes. If rowBytes==0, then a default
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  value will be chosen. If a non-zero rowBytes is specified, then any images snapped off of
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  this surface (via makeImageSnapshot()) are guaranteed to have the same rowBytes.
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  If the requested surface cannot be created, or the request is not a
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  supported configuration, NULL will be returned.
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeRaster(const SkImageInfo& imageInfo, size_t rowBytes,
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                       const SkSurfaceProps* surfaceProps);
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Allocate a new surface, automatically computing the rowBytes.
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeRaster(const SkImageInfo& imageInfo,
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                       const SkSurfaceProps* props = nullptr) {
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return MakeRaster(imageInfo, 0, props);
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Helper version of NewRaster. It creates a SkImageInfo with the
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  specified width and height, and populates the rest of info to match
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  pixels in SkPMColor format.
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeRasterN32Premul(int width, int height,
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                const SkSurfaceProps* surfaceProps = nullptr) {
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return MakeRaster(SkImageInfo::MakeN32Premul(width, height), surfaceProps);
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Used to wrap a pre-existing backend 3D API texture as a SkSurface. Skia will not assume
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  ownership of the texture and the client must ensure the texture is valid for the lifetime
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  of the SkSurface. If sampleCnt > 1, then we will create an intermediate mssa surface which
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  we will use for rendering. We then resolve into the passed in texture.
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeFromBackendTexture(GrContext* context,
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   const GrBackendTexture& backendTexture,
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   GrSurfaceOrigin origin, int sampleCnt,
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   sk_sp<SkColorSpace> colorSpace,
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   const SkSurfaceProps* surfaceProps);
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Used to wrap a pre-existing backend 3D API texture as a SkSurface. Skia will not assume
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  ownership of the texture and the client must ensure the texture is valid for the lifetime
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  of the SkSurface. If sampleCnt > 1, then we will create an intermediate mssa surface which
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  we will use for rendering. We then resolve into the passed in texture.
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  The GrBackendTexture must have a valid backend format supplied (GrGLTextureInfo::fFormat,
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  GrVkImageInfo::fFormat, etc.) in it. The passed in SkColorType informs skia how it should
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  interpret the backend format supplied by the GrBackendTexture. If the format in the
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  GrBackendTexture is not compatible with the sampleCnt, SkColorType, and SkColorSpace we
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  will return nullptr.
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeFromBackendTexture(GrContext* context,
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   const GrBackendTexture& backendTexture,
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   GrSurfaceOrigin origin, int sampleCnt,
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   SkColorType colorType,
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   sk_sp<SkColorSpace> colorSpace,
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   const SkSurfaceProps* surfaceProps);
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeFromBackendRenderTarget(GrContext* context,
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                const GrBackendRenderTarget& backendRenderTarget,
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                GrSurfaceOrigin origin,
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                sk_sp<SkColorSpace> colorSpace,
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                const SkSurfaceProps* surfaceProps);
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  The GrBackendRenderTarget must have a valid backend format set (GrGLTextureInfo::fFormat,
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  GrVkImageInfo::fFormat, etc.) in it. The passed in SkColorType informs skia how it should
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  interpret the backend format supplied by the GrBackendRenderTarget. If the format in the
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  GrBackendRenderTarget is not compatible with the sampleCnt, SkColorType, and SkColorSpace
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  we will return nullptr.
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeFromBackendRenderTarget(GrContext* context,
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                const GrBackendRenderTarget& backendRenderTarget,
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                GrSurfaceOrigin origin,
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                SkColorType colorType,
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                sk_sp<SkColorSpace> colorSpace,
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                const SkSurfaceProps* surfaceProps);
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Used to wrap a pre-existing 3D API texture as a SkSurface. Skia will treat the texture as
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  a rendering target only, but unlike NewFromBackendRenderTarget, Skia will manage and own
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  the associated render target objects (but not the provided texture). Skia will not assume
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  ownership of the texture and the client must ensure the texture is valid for the lifetime
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  of the SkSurface.
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeFromBackendTextureAsRenderTarget(GrContext* context,
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            const GrBackendTexture& backendTexture,
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            GrSurfaceOrigin origin,
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            int sampleCnt,
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            sk_sp<SkColorSpace> colorSpace,
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            const SkSurfaceProps* surfaceProps);
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Used to wrap a pre-existing 3D API texture as a SkSurface. Skia will treat the texture as
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  a rendering target only, but unlike NewFromBackendRenderTarget, Skia will manage and own
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  the associated render target objects (but not the provided texture). Skia will not assume
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  ownership of the texture and the client must ensure the texture is valid for the lifetime
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  of the SkSurface.
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  The GrBackendTexture must have a valid backend format supplied (GrGLTextureInfo::fFormat,
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  GrVkImageInfo::fFormat, etc.) in it. The passed in SkColorType informs skia how it should
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  interpret the backend format supplied by the GrBackendTexture. If the format in the
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  GrBackendTexture is not compatible with the sampleCnt, SkColorType, and SkColorSpace we
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  will return nullptr.
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeFromBackendTextureAsRenderTarget(GrContext* context,
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            const GrBackendTexture& backendTexture,
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            GrSurfaceOrigin origin,
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            int sampleCnt,
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            SkColorType colorType,
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            sk_sp<SkColorSpace> colorSpace,
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            const SkSurfaceProps* surfaceProps);
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Return a new surface whose contents will be drawn to an offscreen
178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  render target, allocated by the surface. The optional shouldCreateWithMips flag is a hint
179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  that this surface may be snapped to an SkImage which will be used with mip maps so we should
180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  create the backend gpu RenderTarget with mips to avoid a copy later on.
181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeRenderTarget(GrContext* context, SkBudgeted budgeted,
183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             const SkImageInfo& imageInfo,
184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             int sampleCount, GrSurfaceOrigin surfaceOrigin,
185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             const SkSurfaceProps* surfaceProps,
186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             bool shouldCreateWithMips = false);
187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeRenderTarget(GrContext* context, SkBudgeted budgeted,
189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             const SkImageInfo& imageInfo, int sampleCount,
190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             const SkSurfaceProps* props) {
191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return MakeRenderTarget(context, budgeted, imageInfo, sampleCount,
192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                kBottomLeft_GrSurfaceOrigin, props);
193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeRenderTarget(GrContext* context, SkBudgeted budgeted,
196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             const SkImageInfo& imageInfo) {
197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!imageInfo.width() || !imageInfo.height()) {
198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return nullptr;
199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return MakeRenderTarget(context, budgeted, imageInfo, 0, kBottomLeft_GrSurfaceOrigin,
201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                nullptr);
202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Returns a surface that stores no pixels. It can be drawn to via its canvas, but that
206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  canvas does not draw anything. Calling makeImageSnapshot() will return nullptr.
207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static sk_sp<SkSurface> MakeNull(int width, int height);
209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int width() const { return fWidth; }
211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int height() const { return fHeight; }
212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Returns a unique non-zero, unique value identifying the content of this
215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  surface. Each time the content is changed changed, either by drawing
216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  into this surface, or explicitly calling notifyContentChanged()) this
217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  method will return a new value.
218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  If this surface is empty (i.e. has a zero-dimention), this will return
220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  0.
221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint32_t generationID();
223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Modes that can be passed to notifyContentWillChange
226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum ContentChangeMode {
228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        /**
229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot         *  Use this mode if it is known that the upcoming content changes will
230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot         *  clear or overwrite prior contents, thus making them discardable.
231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot         */
232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kDiscard_ContentChangeMode,
233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        /**
234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot         *  Use this mode if prior surface contents need to be preserved or
235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot         *  if in doubt.
236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot         */
237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kRetain_ContentChangeMode,
238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Call this if the contents are about to change. This will (lazily) force a new
242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  value to be returned from generationID() when it is called next.
243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  CAN WE DEPRECATE THIS?
245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void notifyContentWillChange(ContentChangeMode mode);
247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum BackendHandleAccess {
249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kFlushRead_BackendHandleAccess,     //!< caller may read from the backend object
250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kFlushWrite_BackendHandleAccess,    //!< caller may write to the backend object
251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kDiscardWrite_BackendHandleAccess,  //!< caller must over-write the entire backend object
252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * These are legacy aliases which will be removed soon
256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static const BackendHandleAccess kFlushRead_TextureHandleAccess =
258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            kFlushRead_BackendHandleAccess;
259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static const BackendHandleAccess kFlushWrite_TextureHandleAccess =
260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            kFlushWrite_BackendHandleAccess;
261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static const BackendHandleAccess kDiscardWrite_TextureHandleAccess =
262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            kDiscardWrite_BackendHandleAccess;
263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Retrieves the backend API handle of the texture used by this surface, or 0 if the surface
267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  is not backed by a GPU texture.
268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
269fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  The returned texture-handle is only valid until the next draw-call into the surface,
270fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  or the surface is deleted.
271fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
272fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrBackendObject getTextureHandle(BackendHandleAccess backendHandleAccess);
273fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
274fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
275fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Retrieves the backend API handle of the RenderTarget backing this surface.  Callers must
276fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  ensure this function returns 'true' or else the GrBackendObject will be invalid
277fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
278fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  In OpenGL this will return the FramebufferObject ID.
279fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
280fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool getRenderTargetHandle(GrBackendObject* backendObject,
281fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                               BackendHandleAccess backendHandleAccess);
282fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
283fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
284fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Return a canvas that will draw into this surface. This will always
285fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  return the same canvas for a given surface, and is manged/owned by the
286fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  surface. It should not be used when its parent surface has gone out of
287fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  scope.
288fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
289fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkCanvas* getCanvas();
290fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
291fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
292fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Return a new surface that is "compatible" with this one, in that it will
293fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  efficiently be able to be drawn into this surface. Typical calling
294fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  pattern:
295fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
296fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  SkSurface* A = SkSurface::New...();
297fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  SkCanvas* canvasA = surfaceA->newCanvas();
298fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  ...
299fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  SkSurface* surfaceB = surfaceA->newSurface(...);
300fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  SkCanvas* canvasB = surfaceB->newCanvas();
301fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  ... // draw using canvasB
302fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  canvasA->drawSurface(surfaceB); // <--- this will always be optimal!
303fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
304fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkSurface> makeSurface(const SkImageInfo& imageInfo);
305fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
306fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
307fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Returns an image of the current state of the surface pixels up to this
308fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  point. Subsequent changes to the surface (by drawing into its canvas)
309fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  will not be reflected in this image. For the GPU-backend, the budgeting
310fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  decision for the snapped image will match that of the surface.
311fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
312fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkImage> makeImageSnapshot();
313fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
314fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
315fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Though the caller could get a snapshot image explicitly, and draw that,
316fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  it seems that directly drawing a surface into another canvas might be
317fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  a common pattern, and that we could possibly be more efficient, since
318fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  we'd know that the "snapshot" need only live until we've handed it off
319fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  to the canvas.
320fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
321fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint);
322fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
323fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
324fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  If the surface has direct access to its pixels (i.e. they are in local
325fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  RAM) return true, and if not null, set the pixmap parameter to point to the information
326fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  about the surface's pixels. The pixel address in the pixmap is only valid while
327fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  the surface object is in scope, and no API call is made on the surface
328fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  or its canvas.
329fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
330fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  On failure, returns false and the pixmap parameter is ignored.
331fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
332fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool peekPixels(SkPixmap* pixmap);
333fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
334fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
335fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  Copy the pixels from the surface into the specified pixmap,
336fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  converting them into the pixmap's format. The surface pixels are read
337fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  starting at the specified (srcX,srcY) location.
338fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
339fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  The pixmap and (srcX,srcY) offset specifies a source rectangle
340fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
341fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *      srcR.setXYWH(srcX, srcY, pixmap.width(), pixmap.height());
342fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
343fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  srcR is intersected with the bounds of the base-layer. If this intersection is not empty,
344fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  then we have two sets of pixels (of equal size). Replace the dst pixels with the
345fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  corresponding src pixels, performing any colortype/alphatype transformations needed
346fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  (in the case where the src and dst have different colortypes or alphatypes).
347fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
348fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  This call can fail, returning false, for several reasons:
349fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  - If srcR does not intersect the surface bounds.
350fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *  - If the requested colortype/alphatype cannot be converted from the surface's types.
351fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
352fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool readPixels(const SkPixmap& dst, int srcX, int srcY);
353fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
354fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    int srcX, int srcY);
355fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool readPixels(const SkBitmap& dst, int srcX, int srcY);
356fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
357fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkSurfaceProps& props() const { return fProps; }
358fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
359fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
360fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Issue any pending surface IO to the current backend 3D API and resolve any surface MSAA.
361fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
362fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * The flush calls below are the new preferred way to flush calls to a surface, and this call
363fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * will eventually be removed.
364fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
365fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void prepareForExternalIO();
366fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
367fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
368fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Issue any pending surface IO to the current backend 3D API
369fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
370fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void flush();
371fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
372fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
373fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Issue any pending surface IO to the current backend 3D API. After issuing all commands,
374fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * numSemaphore semaphores will be signaled by the gpu. The client passes in an array of
375fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * numSemaphores GrBackendSemaphores. In general these GrBackendSemaphore's can be either
376fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * initialized or not. If they are initialized, the backend uses the passed in semaphore.
377fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * If it is not initialized, a new semaphore is created and the GrBackendSemaphore object
378fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * is initialized with that semaphore.
379fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
380fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * The client will own and be responsible for deleting the underlying semaphores that are stored
381fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * and returned in initialized GrBackendSemaphore objects. The GrBackendSemaphore objects
382fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * themselves can be deleted as soon as this function returns.
383fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
384fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * If the backend API is OpenGL only uninitialized GrBackendSemaphores are supported.
385fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * If the backend API is Vulkan either initialized or unitialized semaphores are supported.
386fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * If unitialized, the semaphores which are created will be valid for use only with the VkDevice
387fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * with which they were created.
388fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
389fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * If this call returns GrSemaphoresSubmited::kNo, the GPU backend will not have created or
390fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * added any semaphores to signal on the GPU. Thus the client should not have the GPU wait on
391fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * any of the semaphores. However, any pending surface IO will still be flushed.
392fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
393fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrSemaphoresSubmitted flushAndSignalSemaphores(int numSemaphores,
394fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   GrBackendSemaphore signalSemaphores[]);
395fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
396fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
397fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Inserts a list of GPU semaphores that the current backend 3D API must wait on before
398fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * executing any more commands on the GPU for this surface. Skia will take ownership of the
399fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * underlying semaphores and delete them once they have been signaled and waited on.
400fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
401fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * If this call returns false, then the GPU backend will not wait on any passed in semaphores,
402fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * and the client will still own the semaphores.
403fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
404fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool wait(int numSemaphores, const GrBackendSemaphore* waitSemaphores);
405fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
406fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
407fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * This creates a characterization of this SkSurface's properties that can
408fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * be used to perform gpu-backend preprocessing in a separate thread (via
409fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * the SkDeferredDisplayListRecorder).
410fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * It will return false on failure (e.g., if the SkSurface is cpu-backed).
411fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
412fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool characterize(SkSurfaceCharacterization* characterization) const;
413fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
414fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
415fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Draw a deferred display list (created via SkDeferredDisplayListRecorder).
416fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * The draw will be skipped if the characterization stored in the display list
417fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * isn't compatible with this surface.
418fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
419fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool draw(SkDeferredDisplayList* deferredDisplayList);
420fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
421fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
422fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkSurface(int width, int height, const SkSurfaceProps* surfaceProps);
423fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkSurface(const SkImageInfo& imageInfo, const SkSurfaceProps* surfaceProps);
424fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
425fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // called by subclass if their contents have changed
426fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void dirtyGenerationID() {
427fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fGenerationID = 0;
428fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
429fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
430fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
431fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkSurfaceProps fProps;
432fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const int            fWidth;
433fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const int            fHeight;
434fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint32_t             fGenerationID;
435fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
436fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkRefCnt INHERITED;
437fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
438fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
439fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
440