1/*
2// Copyright (c) 2014 Intel Corporation 
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16#include <HwcTrace.h>
17#include <BufferCache.h>
18
19namespace android {
20namespace intel {
21
22BufferCache::BufferCache(int size)
23{
24    mBufferPool.setCapacity(size);
25}
26
27BufferCache::~BufferCache()
28{
29    if (mBufferPool.size() != 0) {
30        ETRACE("buffer cache is not empty");
31    }
32    mBufferPool.clear();
33}
34
35bool BufferCache::addMapper(uint64_t handle, BufferMapper* mapper)
36{
37    ssize_t index = mBufferPool.indexOfKey(handle);
38    if (index >= 0) {
39        ETRACE("buffer %#llx exists", handle);
40        return false;
41    }
42
43    // add mapper
44    index = mBufferPool.add(handle, mapper);
45    if (index < 0) {
46        ETRACE("failed to add mapper. err = %d", (int)index);
47        return false;
48    }
49
50    return true;
51}
52
53bool BufferCache::removeMapper(BufferMapper* mapper)
54{
55    ssize_t index;
56
57    if (!mapper) {
58        ETRACE("invalid mapper");
59        return false;
60    }
61
62    index = mBufferPool.removeItem(mapper->getKey());
63    if (index < 0) {
64        WTRACE("failed to remove mapper. err = %d", (int)index);
65        return false;
66    }
67
68    return true;
69}
70
71BufferMapper* BufferCache::getMapper(uint64_t handle)
72{
73    ssize_t index = mBufferPool.indexOfKey(handle);
74    if (index < 0) {
75        // don't add ETRACE here as this condition will happen frequently
76        return 0;
77    }
78    return mBufferPool.valueAt(index);
79}
80
81size_t BufferCache::getCacheSize() const
82{
83    return mBufferPool.size();
84}
85
86BufferMapper* BufferCache::getMapper(uint32_t index)
87{
88    if (index >= mBufferPool.size()) {
89        ETRACE("invalid index");
90        return 0;
91    }
92    BufferMapper* mapper = mBufferPool.valueAt(index);
93    return mapper;
94}
95
96} // namespace intel
97} // namespace android
98