13582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon/*
23582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon * Copyright 2015 Google Inc.
33582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon *
43582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon * Use of this source code is governed by a BSD-style license that can be
53582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon * found in the LICENSE file.
63582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon */
73582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
83582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon#ifndef GrGpuResourcePriv_DEFINED
93582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon#define GrGpuResourcePriv_DEFINED
103582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
113582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon#include "GrGpuResource.h"
123582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
133582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon/**
143582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon * This class allows code internal to Skia privileged access to manage the cache keys and budget
153582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon * status of a GrGpuResource object.
163582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon */
173582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomonclass GrGpuResource::ResourcePriv {
183582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomonpublic:
195d2de08494a912db9d1ca9038deb900de8cbf38eChris Dalton    SkDEBUGCODE(bool hasPendingIO_debugOnly() const { return fResource->internalHasPendingIO(); })
205d2de08494a912db9d1ca9038deb900de8cbf38eChris Dalton
213582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    /**
228718aafec239c93485e45bbe8fed19d9a8def079bsalomon     * Sets a unique key for the resource. If the resource was previously cached as scratch it will
23f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomon     * be converted to a uniquely-keyed resource. If the key is invalid then this is equivalent to
24f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomon     * removeUniqueKey(). If another resource is using the key then its unique key is removed and
25f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomon     * this resource takes over the key.
263582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     */
27f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomon    void setUniqueKey(const GrUniqueKey& key) { fResource->setUniqueKey(key); }
283582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
29f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomon    /** Removes the unique key from a resource. If the resource has a scratch key, it may be
30f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomon        preserved for recycling as scratch. */
31f99e961f55bb603d099c8cb57d05a2ae52a4e9cabsalomon    void removeUniqueKey() { fResource->removeUniqueKey(); }
323582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
333582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    /**
343582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     * If the resource is uncached make it cached. Has no effect on resources that are wrapped or
353582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     * already cached.
363582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     */
373582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    void makeBudgeted() { fResource->makeBudgeted(); }
383582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
393582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    /**
403582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     * If the resource is cached make it uncached. Has no effect on resources that are wrapped or
418718aafec239c93485e45bbe8fed19d9a8def079bsalomon     * already uncached. Furthermore, resources with unique keys cannot be made unbudgeted.
423582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     */
433582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    void makeUnbudgeted() { fResource->makeUnbudgeted(); }
443582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
453582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    /**
463582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     * Does the resource count against the resource budget?
473582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     */
485ec26ae9bfca635ccc98283aad5deda11519d826bsalomon    SkBudgeted isBudgeted() const {
492e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen        bool ret = SkBudgeted::kYes == fResource->fBudgeted;
500562eb9c6c98f07732ca96a1dd4e986f1ca089b8Brian Osman        SkASSERT(ret || !fResource->getUniqueKey().isValid() || fResource->fRefsWrappedObjects);
515ec26ae9bfca635ccc98283aad5deda11519d826bsalomon        return SkBudgeted(ret);
523582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    }
533582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
54b2c0133caf0f03462385c19634281c351355c979bsalomon    /**
55b2c0133caf0f03462385c19634281c351355c979bsalomon     * Is the resource object wrapping an externally allocated GPU resource?
56b2c0133caf0f03462385c19634281c351355c979bsalomon     */
572e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen    bool refsWrappedObjects() const { return fResource->fRefsWrappedObjects; }
58b2c0133caf0f03462385c19634281c351355c979bsalomon
59b2c0133caf0f03462385c19634281c351355c979bsalomon    /**
603582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     * If this resource can be used as a scratch resource this returns a valid scratch key.
613582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     * Otherwise it returns a key for which isNullScratch is true. The resource may currently be
628718aafec239c93485e45bbe8fed19d9a8def079bsalomon     * used as a uniquely keyed resource rather than scratch. Check isScratch().
633582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     */
643582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    const GrScratchKey& getScratchKey() const { return fResource->fScratchKey; }
653582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
663582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    /**
673582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     * If the resource has a scratch key, the key will be removed. Since scratch keys are installed
683582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     * at resource creation time, this means the resource will never again be used as scratch.
693582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon     */
703582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    void removeScratchKey() const { fResource->removeScratchKey();  }
713582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
723582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomonprotected:
733582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    ResourcePriv(GrGpuResource* resource) : fResource(resource) {   }
743582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    ResourcePriv(const ResourcePriv& that) : fResource(that.fResource) {}
753582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    ResourcePriv& operator=(const CacheAccess&); // unimpl
763582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
773582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    // No taking addresses of this type.
783582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    const ResourcePriv* operator&() const;
793582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    ResourcePriv* operator&();
803582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
813582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    GrGpuResource* fResource;
823582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
833582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    friend class GrGpuResource; // to construct/copy this type.
843582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon};
853582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
863582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomoninline GrGpuResource::ResourcePriv GrGpuResource::resourcePriv() { return ResourcePriv(this); }
873582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
883582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomoninline const GrGpuResource::ResourcePriv GrGpuResource::resourcePriv() const {
893582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon    return ResourcePriv(const_cast<GrGpuResource*>(this));
903582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon}
913582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon
923582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon#endif
93