1c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon
2c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon/*
3c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon * Copyright 2014 Google Inc.
4c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon *
5c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon * Use of this source code is governed by a BSD-style license that can be
6c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon * found in the LICENSE file.
7c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon */
8c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon
9c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon
10c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon#include "GrResourceCache2.h"
11c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon#include "GrGpuResource.h"
12c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon
13c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomonGrResourceCache2::~GrResourceCache2() {
14c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    this->releaseAll();
15c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon}
16c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon
17c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomonvoid GrResourceCache2::insertResource(GrGpuResource* resource) {
1849f085dddff10473b6ebf832a974288300224e60bsalomon    SkASSERT(resource);
19c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    SkASSERT(!resource->wasDestroyed());
20169612621f00b3fe9f71014079991287d311751absalomon    SkASSERT(!this->isInCache(resource));
21c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    fResources.addToHead(resource);
22c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    ++fCount;
23744998e666073166307d2522847b2536000a7619bsalomon    if (!resource->getScratchKey().isNullScratch()) {
24744998e666073166307d2522847b2536000a7619bsalomon        fScratchMap.insert(resource->getScratchKey(), resource);
25744998e666073166307d2522847b2536000a7619bsalomon    }
26c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon}
27c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon
28c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomonvoid GrResourceCache2::removeResource(GrGpuResource* resource) {
29169612621f00b3fe9f71014079991287d311751absalomon    SkASSERT(this->isInCache(resource));
30744998e666073166307d2522847b2536000a7619bsalomon    fResources.remove(resource);
31744998e666073166307d2522847b2536000a7619bsalomon    if (!resource->getScratchKey().isNullScratch()) {
32744998e666073166307d2522847b2536000a7619bsalomon        fScratchMap.remove(resource->getScratchKey(), resource);
33744998e666073166307d2522847b2536000a7619bsalomon    }
34c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    --fCount;
35c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon}
36c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon
37c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomonvoid GrResourceCache2::abandonAll() {
38c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    while (GrGpuResource* head = fResources.head()) {
39c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon        SkASSERT(!head->wasDestroyed());
40c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon        head->abandon();
41c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon        // abandon should have already removed this from the list.
42c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon        SkASSERT(head != fResources.head());
43c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    }
44744998e666073166307d2522847b2536000a7619bsalomon    SkASSERT(!fScratchMap.count());
45c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    SkASSERT(!fCount);
46c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon}
47c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon
48c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomonvoid GrResourceCache2::releaseAll() {
49c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    while (GrGpuResource* head = fResources.head()) {
50c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon        SkASSERT(!head->wasDestroyed());
51c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon        head->release();
52c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon        // release should have already removed this from the list.
53c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon        SkASSERT(head != fResources.head());
54c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    }
55744998e666073166307d2522847b2536000a7619bsalomon    SkASSERT(!fScratchMap.count());
56c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    SkASSERT(!fCount);
57c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon}
58