1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "gpu/command_buffer/client/gpu_memory_buffer_tracker.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "gpu/command_buffer/client/gles2_implementation.h"
9#include "gpu/command_buffer/client/image_factory.h"
10#include "ui/gfx/gpu_memory_buffer.h"
11
12namespace gpu {
13namespace gles2 {
14
15GpuMemoryBufferTracker::GpuMemoryBufferTracker(ImageFactory* factory)
16    : buffers_(),
17      factory_(factory) {
18}
19
20GpuMemoryBufferTracker::~GpuMemoryBufferTracker() {
21  while (!buffers_.empty()) {
22    RemoveBuffer(buffers_.begin()->first);
23  }
24}
25
26GLuint GpuMemoryBufferTracker::CreateBuffer(
27    GLsizei width, GLsizei height, GLenum internalformat) {
28  GLuint image_id = 0;
29  DCHECK(factory_);
30  scoped_ptr<gfx::GpuMemoryBuffer> buffer =
31      factory_->CreateGpuMemoryBuffer(width, height, internalformat, &image_id);
32
33  if (buffer.get() == NULL)
34    return 0;
35
36  std::pair<BufferMap::iterator, bool> result =
37      buffers_.insert(std::make_pair(image_id, buffer.release()));
38  GPU_DCHECK(result.second);
39
40  return image_id;
41}
42
43gfx::GpuMemoryBuffer* GpuMemoryBufferTracker::GetBuffer(GLuint image_id) {
44  BufferMap::iterator it = buffers_.find(image_id);
45  return (it != buffers_.end()) ? it->second : NULL;
46}
47
48void GpuMemoryBufferTracker::RemoveBuffer(GLuint image_id) {
49  BufferMap::iterator buffer_it = buffers_.find(image_id);
50  if (buffer_it != buffers_.end()) {
51    gfx::GpuMemoryBuffer* buffer = buffer_it->second;
52    buffers_.erase(buffer_it);
53    delete buffer;
54  }
55  DCHECK(factory_);
56  factory_->DeleteGpuMemoryBuffer(image_id);
57}
58
59}  // namespace gles2
60}  // namespace gpu
61