1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2018 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 GrProxyProvider_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrProxyProvider_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrResourceKey.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrTextureProxy.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrTypes.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRefCnt.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTDynamicHash.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrCaps;
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrResourceProvider;
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrSingleOwner;
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrBackendRenderTarget;
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkImage;
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * A factory for creating GrSurfaceProxy-derived objects.
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrProxyProvider {
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrProxyProvider(GrResourceProvider*, GrResourceCache*, sk_sp<const GrCaps>, GrSingleOwner*);
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ~GrProxyProvider();
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Assigns a unique key to a proxy. The proxy will be findable via this key using
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * findProxyByUniqueKey(). It is an error if an existing proxy already has a key.
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool assignUniqueKeyToProxy(const GrUniqueKey&, GrTextureProxy*);
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Sets the unique key of the provided proxy to the unique key of the surface. The surface must
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * have a valid unique key.
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void adoptUniqueKeyFromSurface(GrTextureProxy* proxy, const GrSurface*);
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Removes a unique key from a proxy. If the proxy has already been instantiated, it will
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * also remove the unique key from the target GrSurface.
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void removeUniqueKeyFromProxy(const GrUniqueKey&, GrTextureProxy*);
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Finds a proxy by unique key.
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> findProxyByUniqueKey(const GrUniqueKey&, GrSurfaceOrigin);
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Finds a proxy by unique key or creates a new one that wraps a resource matching the unique
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * key.
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> findOrCreateProxyByUniqueKey(const GrUniqueKey&, GrSurfaceOrigin);
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Create a texture proxy that is backed by an instantiated GrSurface. This is almost entirely
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * used by Skia's testing code.
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * DDL TODO: remove the remaining Skia-internal use of this method and make it truly
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * testing-only.
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> createInstantiatedProxy(const GrSurfaceDesc&, SkBackingFit, SkBudgeted,
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                  uint32_t flags = 0);
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Create an un-mipmapped texture proxy with data.
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * DDL TODO: need to refine ownership semantics of 'srcData' if we're in completely
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * deferred mode
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> createTextureProxy(const GrSurfaceDesc&, SkBudgeted,
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             const void* srcData, size_t rowBytes);
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Create an un-mipmapped texture proxy with data. The SkImage must be a raster backend image.
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Since the SkImage is ref counted, we simply take a ref on it to keep the data alive until we
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * actually upload the data to the gpu.
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> createTextureProxy(sk_sp<SkImage> srcImage,
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             GrSurfaceFlags flags,
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             GrSurfaceOrigin origin,
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             int sampleCnt,
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             SkBudgeted budgeted);
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Create a mipmapped texture proxy with data.
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * @param desc          Description of the texture properties.
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * @param budgeted      Does the texture count against the resource cache budget?
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * @param texels        A contiguous array of mipmap levels
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * @param mipLevelCount The amount of elements in the texels array
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> createMipMapProxy(const GrSurfaceDesc&, SkBudgeted,
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            const GrMipLevel texels[], int mipLevelCount,
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            SkDestinationSurfaceColorMode mipColorMode =
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            SkDestinationSurfaceColorMode::kLegacy);
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Create a mipmapped texture proxy without any data.
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Like the call above but there are no texels to upload. A texture proxy is returned that
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * simply has space allocated for the mips. We will allocated the full amount of mip levels
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * based on the width and height in the GrSurfaceDesc.
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> createMipMapProxy(const GrSurfaceDesc&, SkBudgeted);
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Create a GrSurfaceProxy without any data.
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> createProxy(const GrSurfaceDesc&, SkBackingFit, SkBudgeted,
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      uint32_t flags = 0);
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // These match the definitions in SkImage & GrTexture.h, for whence they came
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef void* ReleaseContext;
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef void (*ReleaseProc)(ReleaseContext);
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Create a texture proxy that wraps a (non-renderable) backend texture.
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> createWrappedTextureProxy(const GrBackendTexture&, GrSurfaceOrigin,
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    GrWrapOwnership = kBorrow_GrWrapOwnership,
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    ReleaseProc = nullptr,
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    ReleaseContext = nullptr);
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Create a texture proxy that wraps a backend texture and is both texture-able and renderable
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> createWrappedTextureProxy(const GrBackendTexture&,
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    GrSurfaceOrigin,
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    int sampleCnt);
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Create a render target proxy that wraps a backend rendertarget
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrSurfaceProxy> createWrappedRenderTargetProxy(const GrBackendRenderTarget&,
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                         GrSurfaceOrigin);
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Create a render target proxy that wraps a backend texture?
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrSurfaceProxy> createWrappedRenderTargetProxy(const GrBackendTexture& tex,
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                         GrSurfaceOrigin origin,
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                         int sampleCnt);
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    using LazyInstantiateCallback = std::function<sk_sp<GrTexture>(GrResourceProvider*,
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                   GrSurfaceOrigin* outOrigin)>;
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum class Renderable : bool {
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kNo = false,
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kYes = true
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Creates a texture proxy that will be instantiated by a user-supplied callback during flush.
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * (Stencil is not supported by this method.) The width and height must either both be greater
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * than 0 or both less than or equal to zero. A non-positive value is a signal that the width
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * and height are currently unknown.
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * When called, the callback must be able to cleanup any resources that it captured at creation.
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * It also must support being passed in a null GrResourceProvider. When this happens, the
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * callback should cleanup any resources it captured and return an empty sk_sp<GrTextureProxy>.
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> createLazyProxy(LazyInstantiateCallback&&, const GrSurfaceDesc&,
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                          GrMipMapped, SkBackingFit, SkBudgeted);
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> createFullyLazyProxy(LazyInstantiateCallback&&,
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                               Renderable, GrPixelConfig);
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // 'proxy' is about to be used as a texture src or drawn to. This query can be used to
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // determine if it is going to need a texture domain or a full clear.
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static bool IsFunctionallyExact(GrSurfaceProxy* proxy);
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Either the proxy attached to the unique key is being deleted (in which case we
179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * don't want it cluttering up the hash table) or the client has indicated that
180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * it will never refer to the unique key again. In either case, remove the key
181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * from the hash table.
182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Note: this does not, by itself, alter unique key attached to the underlying GrTexture.
183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void processInvalidProxyUniqueKey(const GrUniqueKey&);
185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Same as above, but you must pass in a GrTextureProxy to save having to search for it. The
188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * GrUniqueKey of the proxy must be valid and it must match the passed in key. This function
189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * also gives the option to invalidate the GrUniqueKey on the underlying GrTexture.
190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void processInvalidProxyUniqueKey(const GrUniqueKey&, GrTextureProxy*, bool invalidateSurface);
192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrCaps* caps() const { return fCaps.get(); }
194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void abandon() {
196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fResourceCache = nullptr;
197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fResourceProvider = nullptr;
198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fAbandoned = true;
199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isAbandoned() const {
202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifdef SK_DEBUG
203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fAbandoned) {
204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkASSERT(!fResourceCache && !fResourceProvider);
205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fAbandoned;
208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int numUniqueKeyProxies_TestOnly() const;
211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void removeAllUniqueKeys();
213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    friend class GrAHardwareBufferImageGenerator; // for createWrapped
216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrTextureProxy> createWrapped(sk_sp<GrTexture> tex, GrSurfaceOrigin origin);
218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    struct UniquelyKeyedProxyHashTraits {
220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static const GrUniqueKey& GetKey(const GrTextureProxy& p) { return p.getUniqueKey(); }
221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static uint32_t Hash(const GrUniqueKey& key) { return key.hash(); }
223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkTDynamicHash<GrTextureProxy, GrUniqueKey, UniquelyKeyedProxyHashTraits> UniquelyKeyedProxyHash;
225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // This holds the texture proxies that have unique keys. The resourceCache does not get a ref
227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // on these proxies but they must send a message to the resourceCache when they are deleted.
228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    UniquelyKeyedProxyHash fUniquelyKeyedProxies;
229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrResourceProvider*    fResourceProvider;
231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrResourceCache*       fResourceCache;
232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool                   fAbandoned;
233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<const GrCaps>    fCaps;
234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // In debug builds we guard against improper thread handling
236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkDEBUGCODE(mutable GrSingleOwner* fSingleOwner;)
237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
240