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