GrGpuObject.h revision d364554bcfd391c3b6111af8bff963a35ab87ba7
18fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 78fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com */ 88fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 108fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com#ifndef GrResource_DEFINED 118fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com#define GrResource_DEFINED 128fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 138fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com#include "GrRefCnt.h" 148fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 159474ed06176fe24c77091b0d75f35442e851073frobertphillips@google.com#include "SkTDLinkedList.h" 169474ed06176fe24c77091b0d75f35442e851073frobertphillips@google.com 178fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.comclass GrGpu; 18f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.comclass GrContext; 191f47f4f7325971dd53991e2bb02da94fa7c6d962robertphillips@google.comclass GrResourceEntry; 208fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 2176b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com/** 2276b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com * Base class for the GPU resources created by a GrContext. 2376b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com */ 248fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.comclass GrResource : public GrRefCnt { 258fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.compublic: 264d73ac22a1b99402fc8cff78a4eb4b27aa8fe019robertphillips@google.com SK_DECLARE_INST_COUNT(GrResource) 27977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com 288fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com /** 298fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com * Frees the resource in the underlying 3D API. It must be safe to call this 308fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com * when the resource has been previously abandoned. 318fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com */ 328fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com void release(); 338fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 348fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com /** 358fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com * Removes references to objects in the underlying 3D API without freeing 368fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com * them. Used when the API context has been torn down before the GrContext. 378fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com */ 388fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com void abandon(); 398fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 408fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com /** 418fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com * Tests whether a resource has been abandoned or released. All resources 428fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com * will be in this state after their creating GrContext is destroyed or has 438fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com * contextLost called. It's up to the client to test isValid() before 448fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com * attempting to use a resource if it holds refs on resources across 458fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com * ~GrContext, freeResources with the force flag, or contextLost. 468fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com * 478fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com * @return true if the resource has been released or abandoned, 488fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com * false otherwise. 498fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com */ 508fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com bool isValid() const { return NULL != fGpu; } 518fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 52cee661af926cc977addc6e039b7022975a448acebsalomon@google.com /** 53cee661af926cc977addc6e039b7022975a448acebsalomon@google.com * Retrieves the size of the object in GPU memory. This is approximate since 54cee661af926cc977addc6e039b7022975a448acebsalomon@google.com * we aren't aware of additional padding or copies made by the driver. 55cee661af926cc977addc6e039b7022975a448acebsalomon@google.com * 56cee661af926cc977addc6e039b7022975a448acebsalomon@google.com * @return the size of the buffer in bytes 57cee661af926cc977addc6e039b7022975a448acebsalomon@google.com */ 581f47f4f7325971dd53991e2bb02da94fa7c6d962robertphillips@google.com virtual size_t sizeInBytes() const = 0; 59cee661af926cc977addc6e039b7022975a448acebsalomon@google.com 60f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com /** 61f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com * Retrieves the context that owns the resource. Note that it is possible 62f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com * for this to return NULL. When resources have been release()ed or 6376b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com * abandon()ed they no longer have an owning context. Destroying a 64f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com * GrContext automatically releases all its resources. 65f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com */ 661f47f4f7325971dd53991e2bb02da94fa7c6d962robertphillips@google.com const GrContext* getContext() const; 671f47f4f7325971dd53991e2bb02da94fa7c6d962robertphillips@google.com GrContext* getContext(); 681f47f4f7325971dd53991e2bb02da94fa7c6d962robertphillips@google.com 691f47f4f7325971dd53991e2bb02da94fa7c6d962robertphillips@google.com void setCacheEntry(GrResourceEntry* cacheEntry) { fCacheEntry = cacheEntry; } 701f47f4f7325971dd53991e2bb02da94fa7c6d962robertphillips@google.com GrResourceEntry* getCacheEntry() { return fCacheEntry; } 71f7b5c1ebfdad1a77d301d1676235e79f8006883ebsalomon@google.com 728fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.comprotected: 7376b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com explicit GrResource(GrGpu* gpu); 7476b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com virtual ~GrResource(); 7576b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com 7676b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com GrGpu* getGpu() const { return fGpu; } 778fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 78d364554bcfd391c3b6111af8bff963a35ab87ba7robertphillips@google.com // Derived classes should always call their parent class' onRelease 79d364554bcfd391c3b6111af8bff963a35ab87ba7robertphillips@google.com // and onAbandon methods in their overrides. 80d364554bcfd391c3b6111af8bff963a35ab87ba7robertphillips@google.com virtual void onRelease() {}; 81d364554bcfd391c3b6111af8bff963a35ab87ba7robertphillips@google.com virtual void onAbandon() {}; 828fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 83a292112154f803feb9f5cc002bbfab559f7cb633bsalomon@google.com bool isInCache() const { return NULL != fCacheEntry; } 84a292112154f803feb9f5cc002bbfab559f7cb633bsalomon@google.com 858fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.comprivate: 868fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 879474ed06176fe24c77091b0d75f35442e851073frobertphillips@google.com#if GR_DEBUG 889474ed06176fe24c77091b0d75f35442e851073frobertphillips@google.com friend class GrGpu; // for assert in GrGpu to access getGpu 899474ed06176fe24c77091b0d75f35442e851073frobertphillips@google.com#endif 908fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 9176b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com GrGpu* fGpu; // not reffed. The GrGpu can be deleted while there 9276b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com // are still live GrResources. It will call 9376b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com // release() on all such resources in its 9476b7fcc79ee47db6ebea4f27e0070c467684418absalomon@google.com // destructor. 959474ed06176fe24c77091b0d75f35442e851073frobertphillips@google.com 969474ed06176fe24c77091b0d75f35442e851073frobertphillips@google.com // we're a dlinklist 979474ed06176fe24c77091b0d75f35442e851073frobertphillips@google.com SK_DEFINE_DLINKEDLIST_INTERFACE(GrResource); 988fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 991f47f4f7325971dd53991e2bb02da94fa7c6d962robertphillips@google.com GrResourceEntry* fCacheEntry; // NULL if not in cache 1001f47f4f7325971dd53991e2bb02da94fa7c6d962robertphillips@google.com 1018fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com typedef GrRefCnt INHERITED; 1028fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com}; 1038fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com 1048fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com#endif 105