
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#include "GrResource.h"
#include "GrGpu.h"

SK_DEFINE_INST_COUNT(GrResource)

GrResource::GrResource(GrGpu* gpu) {
    fGpu        = gpu;
    fCacheEntry = NULL;
    fGpu->insertResource(this);
}

GrResource::~GrResource() {
    // subclass should have released this.
    GrAssert(!this->isValid());
}

void GrResource::release() {
    if (NULL != fGpu) {
        this->onRelease();
        fGpu->removeResource(this);
        fGpu = NULL;
    }
}

void GrResource::abandon() {
    if (NULL != fGpu) {
        this->onAbandon();
        fGpu->removeResource(this);
        fGpu = NULL;
    }
}

const GrContext* GrResource::getContext() const {
    if (NULL != fGpu) {
        return fGpu->getContext();
    } else {
        return NULL;
    }
}

GrContext* GrResource::getContext() {
    if (NULL != fGpu) {
        return fGpu->getContext();
    } else {
        return NULL;
    }
}

