1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2017 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 GrSurfaceProxyPriv_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrSurfaceProxyPriv_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrSurfaceProxy.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrResourceProvider.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Class that adds methods to GrSurfaceProxy that are only intended for use internal to Skia.
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    This class is purely a privileged window into GrSurfaceProxy. It should never have additional
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    data members or virtual methods. */
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrSurfaceProxyPriv {
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isInstantiated() const { return SkToBool(fProxy->fTarget); }
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // This should only be called after a successful call to instantiate
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrSurface* peekSurface() const {
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(fProxy->fTarget);
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fProxy->fTarget;
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // If the proxy is already instantiated, return its backing GrTexture; if not,
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // return null
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrTexture* peekTexture() const {
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fProxy->fTarget ? fProxy->fTarget->asTexture() : nullptr;
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // This should only be called after a successful call to instantiate
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrRenderTarget* peekRenderTarget() const {
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(fProxy->fTarget && fProxy->fTarget->asRenderTarget());
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fProxy->fTarget ? fProxy->fTarget->asRenderTarget() : nullptr;
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Beware! This call is only guaranteed to tell you if the proxy in question has
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // any pending IO in its current state. It won't tell you about the IO state in the
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // future when the proxy is actually used/instantiated.
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool hasPendingIO() const { return fProxy->hasPendingIO(); }
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Beware! This call is only guaranteed to tell you if the proxy in question has
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // any pending writes in its current state. It won't tell you about the IO state in the
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // future when the proxy is actually used/instantiated.
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool hasPendingWrite() const { return fProxy->hasPendingWrite(); }
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void computeScratchKey(GrScratchKey* key) const { return fProxy->computeScratchKey(key); }
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Create a GrSurface-derived class that meets the requirements (i.e, desc, renderability)
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // of the GrSurfaceProxy.
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<GrSurface> createSurface(GrResourceProvider* resourceProvider) const {
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fProxy->createSurface(resourceProvider);
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Assign this proxy the provided GrSurface as its backing surface
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void assign(sk_sp<GrSurface> surface) { fProxy->assign(std::move(surface)); }
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool requiresNoPendingIO() const {
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fProxy->fFlags & GrResourceProvider::kNoPendingIO_Flag;
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Don't abuse this call!!!!!!!
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isExact() const { return SkBackingFit::kExact == fProxy->fFit; }
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Don't. Just don't.
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void exactify();
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool doLazyInstantiation(GrResourceProvider*);
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static bool AttachStencilIfNeeded(GrResourceProvider*, GrSurface*, bool needsStencil);
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    explicit GrSurfaceProxyPriv(GrSurfaceProxy* proxy) : fProxy(proxy) {}
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrSurfaceProxyPriv(const GrSurfaceProxyPriv&) {} // unimpl
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrSurfaceProxyPriv& operator=(const GrSurfaceProxyPriv&); // unimpl
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // No taking addresses of this type.
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrSurfaceProxyPriv* operator&() const;
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrSurfaceProxyPriv* operator&();
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrSurfaceProxy* fProxy;
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    friend class GrSurfaceProxy; // to construct/copy this type.
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotinline GrSurfaceProxyPriv GrSurfaceProxy::priv() { return GrSurfaceProxyPriv(this); }
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotinline const GrSurfaceProxyPriv GrSurfaceProxy::priv () const {
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return GrSurfaceProxyPriv(const_cast<GrSurfaceProxy*>(this));
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
96