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