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