1// Copyright 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/service/async_pixel_transfer_manager.h"
6
7#include "gpu/command_buffer/service/async_pixel_transfer_delegate.h"
8
9namespace gpu {
10
11AsyncPixelTransferCompletionObserver::AsyncPixelTransferCompletionObserver() {}
12
13AsyncPixelTransferCompletionObserver::~AsyncPixelTransferCompletionObserver() {}
14
15AsyncPixelTransferManager::AsyncPixelTransferManager() {}
16
17AsyncPixelTransferManager::~AsyncPixelTransferManager() {
18  if (manager_)
19    manager_->RemoveObserver(this);
20
21  for (TextureToDelegateMap::iterator ref = delegate_map_.begin();
22       ref != delegate_map_.end();
23       ref++) {
24    ref->first->RemoveObserver();
25  }
26}
27
28void AsyncPixelTransferManager::Initialize(gles2::TextureManager* manager) {
29  manager_ = manager;
30  manager_->AddObserver(this);
31}
32
33AsyncPixelTransferDelegate*
34AsyncPixelTransferManager::CreatePixelTransferDelegate(
35    gles2::TextureRef* ref,
36    const AsyncTexImage2DParams& define_params) {
37  DCHECK(!GetPixelTransferDelegate(ref));
38  AsyncPixelTransferDelegate* delegate =
39      CreatePixelTransferDelegateImpl(ref, define_params);
40  delegate_map_[ref] = make_linked_ptr(delegate);
41  ref->AddObserver();
42  return delegate;
43}
44
45AsyncPixelTransferDelegate*
46AsyncPixelTransferManager::GetPixelTransferDelegate(
47    gles2::TextureRef* ref) {
48  TextureToDelegateMap::iterator it = delegate_map_.find(ref);
49  if (it == delegate_map_.end()) {
50    return NULL;
51  } else {
52    return it->second.get();
53  }
54}
55
56void AsyncPixelTransferManager::ClearPixelTransferDelegateForTest(
57    gles2::TextureRef* ref) {
58  TextureToDelegateMap::iterator it = delegate_map_.find(ref);
59  if (it != delegate_map_.end()) {
60    delegate_map_.erase(it);
61    ref->RemoveObserver();
62  }
63}
64
65bool AsyncPixelTransferManager::AsyncTransferIsInProgress(
66    gles2::TextureRef* ref) {
67  AsyncPixelTransferDelegate* delegate = GetPixelTransferDelegate(ref);
68  return delegate && delegate->TransferIsInProgress();
69}
70
71void AsyncPixelTransferManager::OnTextureManagerDestroying(
72    gles2::TextureManager* manager) {
73  // TextureManager should outlive AsyncPixelTransferManager.
74  NOTREACHED();
75  manager_ = NULL;
76}
77
78void AsyncPixelTransferManager::OnTextureRefDestroying(
79    gles2::TextureRef* texture) {
80  TextureToDelegateMap::iterator it = delegate_map_.find(texture);
81  if (it != delegate_map_.end()) {
82    delegate_map_.erase(it);
83    texture->RemoveObserver();
84  }
85}
86
87}  // namespace gpu
88