blob: 70fe08503eafb50990502a894e6775ca2451800d [file] [log] [blame]
bsalomon453cf402014-11-11 14:15:57 -08001
2/*
3 * Copyright 2014 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#ifndef GrGpuResourceCacheAccess_DEFINED
10#define GrGpuResourceCacheAccess_DEFINED
11
12#include "GrGpuResource.h"
bsalomon3582d3e2015-02-13 14:20:05 -080013#include "GrGpuResourcePriv.h"
14
15namespace skiatest {
16 class Reporter;
17}
bsalomon453cf402014-11-11 14:15:57 -080018
19/**
bsalomon3582d3e2015-02-13 14:20:05 -080020 * This class allows GrResourceCache increased privileged access to GrGpuResource objects.
bsalomon453cf402014-11-11 14:15:57 -080021 */
22class GrGpuResource::CacheAccess {
bsalomon3582d3e2015-02-13 14:20:05 -080023private:
bsalomon453cf402014-11-11 14:15:57 -080024 /**
bsalomonc2f35b72015-01-23 07:19:22 -080025 * Is the resource currently cached as scratch? This means it is cached, has a valid scratch
bsalomon8718aaf2015-02-19 07:24:21 -080026 * key, and does not have a unique key.
bsalomon453cf402014-11-11 14:15:57 -080027 */
28 bool isScratch() const {
bsalomon8718aaf2015-02-19 07:24:21 -080029 return !fResource->getUniqueKey().isValid() && fResource->fScratchKey.isValid() &&
bsalomon5ec26ae2016-02-25 08:33:02 -080030 SkBudgeted::kYes == fResource->resourcePriv().isBudgeted();
bsalomon453cf402014-11-11 14:15:57 -080031 }
32
bsalomon10e23ca2014-11-25 05:52:06 -080033 /**
bsalomon84c8e622014-11-17 09:33:27 -080034 * Is the resource object wrapping an externally allocated GPU resource?
35 */
bsalomon6dc6f5f2015-06-18 09:12:16 -070036 bool isExternal() const { return fResource->isExternal(); }
37
38 /**
39 * Is the resource object wrapping an externally allocated GPU resource that Skia has not taken
40 * ownership of.
41 */
42 bool isBorrowed() const { return GrGpuResource::kBorrowed_LifeCycle == fResource->fLifeCycle; }
43
44 /**
45 * Is the resource object wrapping an externally allocated GPU resource that Skia has taken
46 * ownership of.
47 */
48 bool isAdopted() const { return GrGpuResource::kAdopted_LifeCycle == fResource->fLifeCycle; }
bsalomon3582d3e2015-02-13 14:20:05 -080049
bsalomonc2f35b72015-01-23 07:19:22 -080050 /**
bsalomon12299ab2014-11-14 13:33:09 -080051 * Called by the cache to delete the resource under normal circumstances.
52 */
53 void release() {
54 fResource->release();
halcanary385fe4d2015-08-26 13:07:48 -070055 if (fResource->isPurgeable()) {
56 delete fResource;
bsalomon12299ab2014-11-14 13:33:09 -080057 }
58 }
59
60 /**
61 * Called by the cache to delete the resource when the backend 3D context is no longer valid.
62 */
63 void abandon() {
64 fResource->abandon();
halcanary385fe4d2015-08-26 13:07:48 -070065 if (fResource->isPurgeable()) {
66 delete fResource;
bsalomon12299ab2014-11-14 13:33:09 -080067 }
68 }
69
bsalomonf99e9612015-02-19 08:24:16 -080070 /** Called by the cache to assign a new unique key. */
71 void setUniqueKey(const GrUniqueKey& key) { fResource->fUniqueKey = key; }
72
73 /** Called by the cache to make the unique key invalid. */
74 void removeUniqueKey() { fResource->fUniqueKey.reset(); }
75
bsalomon9f2d1572015-02-17 11:47:40 -080076 uint32_t timestamp() const { return fResource->fTimestamp; }
77 void setTimestamp(uint32_t ts) { fResource->fTimestamp = ts; }
78
79 int* accessCacheIndex() const { return &fResource->fCacheArrayIndex; }
80
bsalomon3582d3e2015-02-13 14:20:05 -080081 CacheAccess(GrGpuResource* resource) : fResource(resource) {}
82 CacheAccess(const CacheAccess& that) : fResource(that.fResource) {}
bsalomon453cf402014-11-11 14:15:57 -080083 CacheAccess& operator=(const CacheAccess&); // unimpl
84
85 // No taking addresses of this type.
86 const CacheAccess* operator&() const;
87 CacheAccess* operator&();
88
89 GrGpuResource* fResource;
90
91 friend class GrGpuResource; // to construct/copy this type.
bsalomon3582d3e2015-02-13 14:20:05 -080092 friend class GrResourceCache; // to use this type
93 friend void test_unbudgeted_to_scratch(skiatest::Reporter* reporter); // for unit testing
bsalomon453cf402014-11-11 14:15:57 -080094};
95
96inline GrGpuResource::CacheAccess GrGpuResource::cacheAccess() { return CacheAccess(this); }
97
98inline const GrGpuResource::CacheAccess GrGpuResource::cacheAccess() const {
99 return CacheAccess(const_cast<GrGpuResource*>(this));
100}
101
102#endif