GrGpuObject.h revision 8fe72477f204b1a45393e6a64caa84fd287b805b
18fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com/*
28fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    Copyright 2011 Google Inc.
38fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
48fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    Licensed under the Apache License, Version 2.0 (the "License");
58fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    you may not use this file except in compliance with the License.
68fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    You may obtain a copy of the License at
78fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
88fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com         http://www.apache.org/licenses/LICENSE-2.0
98fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
108fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    Unless required by applicable law or agreed to in writing, software
118fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    distributed under the License is distributed on an "AS IS" BASIS,
128fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    See the License for the specific language governing permissions and
148fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    limitations under the License.
158fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com */
168fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
178fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com#ifndef GrResource_DEFINED
188fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com#define GrResource_DEFINED
198fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
208fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com#include "GrRefCnt.h"
218fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
228fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.comclass GrGpu;
238fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
248fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.comclass GrResource : public GrRefCnt {
258fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.compublic:
268fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    explicit GrResource(GrGpu* gpu);
278fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
288fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    virtual ~GrResource() {
298fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com        // subclass should have released this.
308fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com        GrAssert(!isValid());
318fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    }
328fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
338fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    /**
348fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * Frees the resource in the underlying 3D API. It must be safe to call this
358fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * when the resource has been previously abandoned.
368fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     */
378fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    void release();
388fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
398fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    /**
408fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * Removes references to objects in the underlying 3D API without freeing
418fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * them. Used when the API context has been torn down before the GrContext.
428fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     */
438fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    void abandon();
448fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
458fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    /**
468fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * Tests whether a resource has been abandoned or released. All resources
478fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * will be in this state after their creating GrContext is destroyed or has
488fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * contextLost called. It's up to the client to test isValid() before
498fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * attempting to use a resource if it holds refs on resources across
508fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * ~GrContext, freeResources with the force flag, or contextLost.
518fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     *
528fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     * @return true if the resource has been released or abandoned,
538fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     *         false otherwise.
548fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com     */
558fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    bool isValid() const { return NULL != fGpu; }
568fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
578fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.comprotected:
588fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
598fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    virtual void onRelease() = 0;
608fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    virtual void onAbandon() = 0;
618fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
628fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    GrGpu* getGpu() const { return fGpu; }
638fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
648fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.comprivate:
658fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    GrResource(); // unimpl
668fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
678fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    GrGpu* fGpu; // not reffed. This can outlive the GrGpu.
688fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
698fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    friend class GrGpu; // GrGpu manages list of resources.
708fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
718fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    GrResource* fNext;      // dl-list of resources per-GrGpu
728fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    GrResource* fPrevious;
738fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
748fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    typedef GrRefCnt INHERITED;
758fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com};
768fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com
778fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com#endif
78