GrGpuResource.h revision ac8d6193eaa29e02d1786fe56efa98eefee74e50
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon * Copyright 2014 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
68fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com */
78fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
86d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomon#ifndef GrGpuResource_DEFINED
96d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomon#define GrGpuResource_DEFINED
108fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
11c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon#include "SkInstCnt.h"
1242619d8df206b0bcd36d952909d972b8961e75debsalomon@google.com#include "SkTInternalLList.h"
13744998e666073166307d2522847b2536000a7619bsalomon#include "GrResourceKey.h"
149474ed06176fe24c77091b0d75f35442e851073frobertphillips@google.com
15c44be0e9e4cee5402909c06370a630eee188a8f3bsalomonclass GrResourceCacheEntry;
16c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomonclass GrResourceCache2;
178fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.comclass GrGpu;
18f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.comclass GrContext;
198fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
2076b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com/**
2100b76bd750e668a6989dd497313e715d1b476fdcbsalomon * Base class for GrGpuResource. Handles the various types of refs we need. Separated out as a base
2200b76bd750e668a6989dd497313e715d1b476fdcbsalomon * class to isolate the ref-cnting behavior and provide friendship without exposing all of
2300b76bd750e668a6989dd497313e715d1b476fdcbsalomon * GrGpuResource.
2400b76bd750e668a6989dd497313e715d1b476fdcbsalomon *
2500b76bd750e668a6989dd497313e715d1b476fdcbsalomon * Gpu resources can have three types of refs:
2600b76bd750e668a6989dd497313e715d1b476fdcbsalomon *   1) Normal ref (+ by ref(), - by unref()): These are used by code that is issuing draw calls
2700b76bd750e668a6989dd497313e715d1b476fdcbsalomon *      that read and write the resource via GrDrawTarget and by any object that must own a
2800b76bd750e668a6989dd497313e715d1b476fdcbsalomon *      GrGpuResource and is itself owned (directly or indirectly) by Skia-client code.
2900b76bd750e668a6989dd497313e715d1b476fdcbsalomon *   2) Pending read (+ by addPendingRead(), - by readCompleted()): GrContext has scheduled a read
3000b76bd750e668a6989dd497313e715d1b476fdcbsalomon *      of the resource by the GPU as a result of a skia API call but hasn't executed it yet.
3100b76bd750e668a6989dd497313e715d1b476fdcbsalomon *   3) Pending write (+ by addPendingWrite(), - by writeCompleted()): GrContext has scheduled a
3200b76bd750e668a6989dd497313e715d1b476fdcbsalomon *      write to the resource by the GPU as a result of a skia API call but hasn't executed it yet.
3300b76bd750e668a6989dd497313e715d1b476fdcbsalomon *
3400b76bd750e668a6989dd497313e715d1b476fdcbsalomon * The latter two ref types are private and intended only for Gr core code.
3576b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com */
3600b76bd750e668a6989dd497313e715d1b476fdcbsalomonclass GrGpuRef : public SkNoncopyable {
378fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.compublic:
3800b76bd750e668a6989dd497313e715d1b476fdcbsalomon    SK_DECLARE_INST_COUNT_ROOT(GrGpuRef)
3900b76bd750e668a6989dd497313e715d1b476fdcbsalomon
4000b76bd750e668a6989dd497313e715d1b476fdcbsalomon    virtual ~GrGpuRef();
41c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon
4200b76bd750e668a6989dd497313e715d1b476fdcbsalomon    // Some of the signatures are written to mirror SkRefCnt so that GrGpuResource can work with
4300b76bd750e668a6989dd497313e715d1b476fdcbsalomon    // templated helper classes (e.g. SkAutoTUnref). However, we have different categories of
4400b76bd750e668a6989dd497313e715d1b476fdcbsalomon    // refs (e.g. pending reads). We also don't require thread safety as GrCacheable objects are
4500b76bd750e668a6989dd497313e715d1b476fdcbsalomon    // not intended to cross thread boundaries.
46c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    // internal_dispose() exists because of GrTexture's reliance on it. It will be removed
47c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    // soon.
4800b76bd750e668a6989dd497313e715d1b476fdcbsalomon    void ref() const {
4900b76bd750e668a6989dd497313e715d1b476fdcbsalomon        ++fRefCnt;
5000b76bd750e668a6989dd497313e715d1b476fdcbsalomon        // pre-validate once internal_dispose is removed (and therefore 0 ref cnt is not allowed).
5100b76bd750e668a6989dd497313e715d1b476fdcbsalomon        this->validate();
5200b76bd750e668a6989dd497313e715d1b476fdcbsalomon    }
5300b76bd750e668a6989dd497313e715d1b476fdcbsalomon
5400b76bd750e668a6989dd497313e715d1b476fdcbsalomon    void unref() const {
5500b76bd750e668a6989dd497313e715d1b476fdcbsalomon        this->validate();
5600b76bd750e668a6989dd497313e715d1b476fdcbsalomon        --fRefCnt;
5700b76bd750e668a6989dd497313e715d1b476fdcbsalomon        if (0 == fRefCnt && 0 == fPendingReads && 0 == fPendingWrites) {
5800b76bd750e668a6989dd497313e715d1b476fdcbsalomon            this->internal_dispose();
5900b76bd750e668a6989dd497313e715d1b476fdcbsalomon        }
6000b76bd750e668a6989dd497313e715d1b476fdcbsalomon    }
6100b76bd750e668a6989dd497313e715d1b476fdcbsalomon
62c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    virtual void internal_dispose() const { SkDELETE(this); }
6300b76bd750e668a6989dd497313e715d1b476fdcbsalomon
6400b76bd750e668a6989dd497313e715d1b476fdcbsalomon    /** This is exists to service the old mechanism for recycling scratch textures. It will
6500b76bd750e668a6989dd497313e715d1b476fdcbsalomon        be removed soon. */
6600b76bd750e668a6989dd497313e715d1b476fdcbsalomon    bool unique() const { return 1 == (fRefCnt + fPendingReads + fPendingWrites); }
6700b76bd750e668a6989dd497313e715d1b476fdcbsalomon
68c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    void validate() const {
6900b76bd750e668a6989dd497313e715d1b476fdcbsalomon#ifdef SK_DEBUG
7000b76bd750e668a6989dd497313e715d1b476fdcbsalomon        SkASSERT(fRefCnt >= 0);
7100b76bd750e668a6989dd497313e715d1b476fdcbsalomon        SkASSERT(fPendingReads >= 0);
7200b76bd750e668a6989dd497313e715d1b476fdcbsalomon        SkASSERT(fPendingWrites >= 0);
7300b76bd750e668a6989dd497313e715d1b476fdcbsalomon        SkASSERT(fRefCnt + fPendingReads + fPendingWrites > 0);
74c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon#endif
7500b76bd750e668a6989dd497313e715d1b476fdcbsalomon    }
7600b76bd750e668a6989dd497313e715d1b476fdcbsalomon
7700b76bd750e668a6989dd497313e715d1b476fdcbsalomonprotected:
7800b76bd750e668a6989dd497313e715d1b476fdcbsalomon    GrGpuRef() : fRefCnt(1), fPendingReads(0), fPendingWrites(0) {}
7900b76bd750e668a6989dd497313e715d1b476fdcbsalomon
8000b76bd750e668a6989dd497313e715d1b476fdcbsalomonprivate:
8100b76bd750e668a6989dd497313e715d1b476fdcbsalomon    void addPendingRead() const {
8200b76bd750e668a6989dd497313e715d1b476fdcbsalomon        this->validate();
8300b76bd750e668a6989dd497313e715d1b476fdcbsalomon        ++fPendingReads;
8400b76bd750e668a6989dd497313e715d1b476fdcbsalomon    }
8500b76bd750e668a6989dd497313e715d1b476fdcbsalomon
8600b76bd750e668a6989dd497313e715d1b476fdcbsalomon    void completedRead() const {
8700b76bd750e668a6989dd497313e715d1b476fdcbsalomon        this->validate();
8800b76bd750e668a6989dd497313e715d1b476fdcbsalomon        --fPendingReads;
8900b76bd750e668a6989dd497313e715d1b476fdcbsalomon        if (0 == fRefCnt && 0 == fPendingReads && 0 == fPendingWrites) {
9000b76bd750e668a6989dd497313e715d1b476fdcbsalomon            this->internal_dispose();
9100b76bd750e668a6989dd497313e715d1b476fdcbsalomon        }
9200b76bd750e668a6989dd497313e715d1b476fdcbsalomon    }
9300b76bd750e668a6989dd497313e715d1b476fdcbsalomon
9400b76bd750e668a6989dd497313e715d1b476fdcbsalomon    void addPendingWrite() const {
9500b76bd750e668a6989dd497313e715d1b476fdcbsalomon        this->validate();
9600b76bd750e668a6989dd497313e715d1b476fdcbsalomon        ++fPendingWrites;
9700b76bd750e668a6989dd497313e715d1b476fdcbsalomon    }
9800b76bd750e668a6989dd497313e715d1b476fdcbsalomon
9900b76bd750e668a6989dd497313e715d1b476fdcbsalomon    void completedWrite() const {
10000b76bd750e668a6989dd497313e715d1b476fdcbsalomon        this->validate();
10100b76bd750e668a6989dd497313e715d1b476fdcbsalomon        --fPendingWrites;
10200b76bd750e668a6989dd497313e715d1b476fdcbsalomon        if (0 == fRefCnt && 0 == fPendingReads && 0 == fPendingWrites) {
10300b76bd750e668a6989dd497313e715d1b476fdcbsalomon            this->internal_dispose();
10400b76bd750e668a6989dd497313e715d1b476fdcbsalomon        }
10500b76bd750e668a6989dd497313e715d1b476fdcbsalomon    }
10600b76bd750e668a6989dd497313e715d1b476fdcbsalomon
10700b76bd750e668a6989dd497313e715d1b476fdcbsalomonprivate:
10800b76bd750e668a6989dd497313e715d1b476fdcbsalomon    mutable int32_t fRefCnt;
10900b76bd750e668a6989dd497313e715d1b476fdcbsalomon    mutable int32_t fPendingReads;
11000b76bd750e668a6989dd497313e715d1b476fdcbsalomon    mutable int32_t fPendingWrites;
11100b76bd750e668a6989dd497313e715d1b476fdcbsalomon
112ac8d6193eaa29e02d1786fe56efa98eefee74e50bsalomon    // This class is used to manage conversion of refs to pending reads/writes.
11300b76bd750e668a6989dd497313e715d1b476fdcbsalomon    friend class GrProgramResource;
11400b76bd750e668a6989dd497313e715d1b476fdcbsalomon};
11500b76bd750e668a6989dd497313e715d1b476fdcbsalomon
11600b76bd750e668a6989dd497313e715d1b476fdcbsalomon/**
11700b76bd750e668a6989dd497313e715d1b476fdcbsalomon * Base class for objects that can be kept in the GrResourceCache.
11800b76bd750e668a6989dd497313e715d1b476fdcbsalomon */
11900b76bd750e668a6989dd497313e715d1b476fdcbsalomonclass GrGpuResource : public GrGpuRef {
12000b76bd750e668a6989dd497313e715d1b476fdcbsalomonpublic:
12100b76bd750e668a6989dd497313e715d1b476fdcbsalomon    SK_DECLARE_INST_COUNT(GrGpuResource)
122977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com
1238fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    /**
124089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org     * Frees the object in the underlying 3D API. It must be safe to call this
125089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org     * when the object has been previously abandoned.
1268fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     */
1278fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    void release();
1288fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
1298fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    /**
1308fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * Removes references to objects in the underlying 3D API without freeing
1318fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * them. Used when the API context has been torn down before the GrContext.
1328fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     */
1338fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    void abandon();
1348fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
1358fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    /**
136089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org     * Tests whether a object has been abandoned or released. All objects will
137089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org     * be in this state after their creating GrContext is destroyed or has
138089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org     * contextLost called. It's up to the client to test wasDestroyed() before
139089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org     * attempting to use an object if it holds refs on objects across
1408fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * ~GrContext, freeResources with the force flag, or contextLost.
1418fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     *
142089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org     * @return true if the object has been released or abandoned,
1438fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     *         false otherwise.
1448fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     */
145089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org    bool wasDestroyed() const { return NULL == fGpu; }
1468fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
147cee661af926cc977addc6e039b7022975a448acebsalomon@google.com    /**
148089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org     * Retrieves the context that owns the object. Note that it is possible for
149089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org     * this to return NULL. When objects have been release()ed or abandon()ed
150089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org     * they no longer have an owning context. Destroying a GrContext
151089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org     * automatically releases all its resources.
152838f6e18fb13cd295f2c4d1e673cb03458f4e0a8bsalomon@google.com     */
1531f47f4f7325971dd53991e2bb02da94fa7c6d962robertphillips@google.com    const GrContext* getContext() const;
1541f47f4f7325971dd53991e2bb02da94fa7c6d962robertphillips@google.com    GrContext* getContext();
1551f47f4f7325971dd53991e2bb02da94fa7c6d962robertphillips@google.com
156c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    /**
157c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     * Retrieves the amount of GPU memory used by this resource in bytes. It is
158c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     * approximate since we aren't aware of additional padding or copies made
159c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     * by the driver.
160c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     *
161c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     * @return the amount of GPU memory used in bytes
162c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     */
163c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    virtual size_t gpuMemorySize() const = 0;
164c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon
165c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    void setCacheEntry(GrResourceCacheEntry* cacheEntry) { fCacheEntry = cacheEntry; }
166c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    GrResourceCacheEntry* getCacheEntry() { return fCacheEntry; }
167089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org
168744998e666073166307d2522847b2536000a7619bsalomon    /**
169744998e666073166307d2522847b2536000a7619bsalomon     * If this resource can be used as a scratch resource this returns a valid
170744998e666073166307d2522847b2536000a7619bsalomon     * scratch key. Otherwise it returns a key for which isNullScratch is true.
171744998e666073166307d2522847b2536000a7619bsalomon     */
172744998e666073166307d2522847b2536000a7619bsalomon    const GrResourceKey& getScratchKey() const { return fScratchKey; }
173744998e666073166307d2522847b2536000a7619bsalomon
174728302281920727b96e6cec0bfc7575900f34a8bbsalomon@google.com    /**
175c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     * Gets an id that is unique for this GrCacheable object. It is static in that it does
176c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     * not change when the content of the GrCacheable object changes. This will never return
177c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     * 0.
178728302281920727b96e6cec0bfc7575900f34a8bbsalomon@google.com     */
179c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    uint32_t getUniqueID() const { return fUniqueID; }
180c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon
181c44be0e9e4cee5402909c06370a630eee188a8f3bsalomonprotected:
182169612621f00b3fe9f71014079991287d311751absalomon    // This must be called by every GrGpuObject. It should be called once the object is fully
183169612621f00b3fe9f71014079991287d311751absalomon    // initialized (i.e. not in a base class constructor).
184169612621f00b3fe9f71014079991287d311751absalomon    void registerWithCache();
185169612621f00b3fe9f71014079991287d311751absalomon
1866d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomon    GrGpuResource(GrGpu*, bool isWrapped);
1876d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomon    virtual ~GrGpuResource();
18876b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com
189c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    bool isInCache() const { return NULL != fCacheEntry; }
190c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon
19176b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com    GrGpu* getGpu() const { return fGpu; }
1928fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
193d364554bcfd391c3b6111af8bff963a35ab87ba7robertphillips@google.com    // Derived classes should always call their parent class' onRelease
194d364554bcfd391c3b6111af8bff963a35ab87ba7robertphillips@google.com    // and onAbandon methods in their overrides.
195d364554bcfd391c3b6111af8bff963a35ab87ba7robertphillips@google.com    virtual void onRelease() {};
196d364554bcfd391c3b6111af8bff963a35ab87ba7robertphillips@google.com    virtual void onAbandon() {};
1978fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
1989ef0426e7c126f6ad6ba833d4543b92a197c95afrobertphillips@google.com    bool isWrapped() const { return kWrapped_FlagBit & fFlags; }
199a292112154f803feb9f5cc002bbfab559f7cb633bsalomon@google.com
200c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    /**
201c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     * This entry point should be called whenever gpuMemorySize() begins
202c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     * reporting a different size. If the object is in the cache, it will call
203c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     * gpuMemorySize() immediately and pass the new size on to the resource
204c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     * cache.
205c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon     */
206c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    void didChangeGpuMemorySize() const;
207c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon
208744998e666073166307d2522847b2536000a7619bsalomon    /**
209744998e666073166307d2522847b2536000a7619bsalomon     * Optionally called by the GrGpuResource subclass if the resource can be used as scratch.
210744998e666073166307d2522847b2536000a7619bsalomon     * By default resources are not usable as scratch. This should only be called once.
211744998e666073166307d2522847b2536000a7619bsalomon     **/
212744998e666073166307d2522847b2536000a7619bsalomon    void setScratchKey(const GrResourceKey& scratchKey);
213744998e666073166307d2522847b2536000a7619bsalomon
2148fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.comprivate:
215515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG
2169474ed06176fe24c77091b0d75f35442e851073frobertphillips@google.com    friend class GrGpu; // for assert in GrGpu to access getGpu
2179474ed06176fe24c77091b0d75f35442e851073frobertphillips@google.com#endif
2188fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
219c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    static uint32_t CreateUniqueID();
220c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon
221c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    // We're in an internal doubly linked list owned by GrResourceCache2
2226d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomon    SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrGpuResource);
2238fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
224c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    // This is not ref'ed but abandon() or release() will be called before the GrGpu object
225c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    // is destroyed. Those calls set will this to NULL.
226c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    GrGpu* fGpu;
227c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon
228728302281920727b96e6cec0bfc7575900f34a8bbsalomon@google.com    enum Flags {
2299ef0426e7c126f6ad6ba833d4543b92a197c95afrobertphillips@google.com        /**
230089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org         * This object wraps a GPU object given to us by the user.
231b77f0f4ae560e97cc4cd2758752d955549017c3cskia.committer@gmail.com         * Lifetime management is left up to the user (i.e., we will not
2329ef0426e7c126f6ad6ba833d4543b92a197c95afrobertphillips@google.com         * free it).
2339ef0426e7c126f6ad6ba833d4543b92a197c95afrobertphillips@google.com         */
2349ef0426e7c126f6ad6ba833d4543b92a197c95afrobertphillips@google.com        kWrapped_FlagBit         = 0x1,
235728302281920727b96e6cec0bfc7575900f34a8bbsalomon@google.com    };
236728302281920727b96e6cec0bfc7575900f34a8bbsalomon@google.com
237c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    uint32_t                fFlags;
238c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon
239c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    GrResourceCacheEntry*   fCacheEntry;  // NULL if not in cache
240c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    const uint32_t          fUniqueID;
241c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon
242744998e666073166307d2522847b2536000a7619bsalomon    GrResourceKey           fScratchKey;
243744998e666073166307d2522847b2536000a7619bsalomon
24400b76bd750e668a6989dd497313e715d1b476fdcbsalomon    typedef GrGpuRef INHERITED;
2458fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com};
2468fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
2478fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com#endif
248