Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(122)

Side by Side Diff: gpu/command_buffer/service/async_pixel_transfer_manager_compressed.cc

Issue 793693003: Tile Compression (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 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 "base/synchronization/waitable_event.h"
6 #include "gpu/command_buffer/service/async_pixel_transfer_delegate.h"
7 #include "gpu/command_buffer/service/async_pixel_transfer_manager_compressed.h"
8 #include "gpu/command_buffer/service/async_pixel_transfer_manager_egl.h"
9 #include "gpu/command_buffer/service/async_pixel_transfer_manager_idle.h"
10
11 namespace gpu {
12
13 namespace {
14
15 class AsyncPixelTransferDelegateCompressed : public AsyncPixelTransferDelegate {
16 public:
17 AsyncPixelTransferDelegateCompressed(
18 AsyncPixelTransferManagerCompressed* manager,
19 AsyncPixelTransferDelegate* delegate,
20 AsyncPixelTransferManagerCompressed::Mode mode);
21 virtual ~AsyncPixelTransferDelegateCompressed();
22
23 // Implement AsyncPixelTransferDelegate:
24 void AsyncTexImage2D(
25 const AsyncTexImage2DParams& tex_params,
26 const AsyncMemoryParams& mem_params,
27 const base::Closure& bind_callback) override;
28 void AsyncTexSubImage2D(
29 const AsyncTexSubImage2DParams& tex_params,
30 const AsyncMemoryParams& mem_params) override;
31 void AsyncCompressedTexImage2D(
32 const AsyncCompressedTexImage2DParams& tex_params,
33 const AsyncMemoryParams& mem_params,
34 const base::Closure& bind_callback) override;
35 void AsyncCompressedTexSubImage2D(
36 const AsyncCompressedTexSubImage2DParams& tex_params,
37 const AsyncMemoryParams& mem_params) override;
38 bool TransferIsInProgress() override;
39 void WaitForTransferCompletion() override;
40
41 private:
42 void EnumerateDelegate();
43
44 AsyncPixelTransferDelegate* delegate() { return delegate_.get(); }
45
46 AsyncPixelTransferManagerCompressed* manager_;
47 scoped_ptr<AsyncPixelTransferDelegate> delegate_;
48
49 AsyncPixelTransferManagerCompressed::Mode mode_;
50
51 DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferDelegateCompressed);
52 };
53
54 AsyncPixelTransferDelegateCompressed::AsyncPixelTransferDelegateCompressed(
55 AsyncPixelTransferManagerCompressed* manager,
56 AsyncPixelTransferDelegate* delegate,
57 AsyncPixelTransferManagerCompressed::Mode mode)
58 : manager_(manager), delegate_(delegate), mode_(mode) {}
59
60 AsyncPixelTransferDelegateCompressed::~AsyncPixelTransferDelegateCompressed() {
61 manager_->shared_state().delegates.remove(this);
62 }
63
64 void AsyncPixelTransferDelegateCompressed::AsyncTexImage2D(
65 const AsyncTexImage2DParams& tex_params,
66 const AsyncMemoryParams& mem_params,
67 const base::Closure& bind_callback) {
68 DCHECK_EQ(mode_, AsyncPixelTransferManagerCompressed::MODE_EGL);
69 manager_->SwitchMode(AsyncPixelTransferManagerCompressed::MODE_EGL);
70 EnumerateDelegate();
71 delegate_->AsyncTexImage2D(tex_params, mem_params, bind_callback);
72 }
73
74 void AsyncPixelTransferDelegateCompressed::AsyncTexSubImage2D(
75 const AsyncTexSubImage2DParams& tex_params,
76 const AsyncMemoryParams& mem_params) {
77 DCHECK_EQ(mode_, AsyncPixelTransferManagerCompressed::MODE_EGL);
78 manager_->SwitchMode(AsyncPixelTransferManagerCompressed::MODE_EGL);
79 EnumerateDelegate();
80 delegate_->AsyncTexSubImage2D(tex_params, mem_params);
81 }
82
83 void AsyncPixelTransferDelegateCompressed::AsyncCompressedTexImage2D(
84 const AsyncCompressedTexImage2DParams& tex_params,
85 const AsyncMemoryParams& mem_params,
86 const base::Closure& bind_callback) {
87 DCHECK_EQ(mode_, AsyncPixelTransferManagerCompressed::MODE_IDLE);
88 manager_->SwitchMode(AsyncPixelTransferManagerCompressed::MODE_IDLE);
89 EnumerateDelegate();
90 delegate_->AsyncCompressedTexImage2D(tex_params, mem_params, bind_callback);
91 }
92
93 void AsyncPixelTransferDelegateCompressed::AsyncCompressedTexSubImage2D(
94 const AsyncCompressedTexSubImage2DParams& tex_params,
95 const AsyncMemoryParams& mem_params) {
96 DCHECK_EQ(mode_, AsyncPixelTransferManagerCompressed::MODE_IDLE);
97 manager_->SwitchMode(AsyncPixelTransferManagerCompressed::MODE_IDLE);
98 EnumerateDelegate();
99 delegate_->AsyncCompressedTexSubImage2D(tex_params, mem_params);
100 }
101
102 bool AsyncPixelTransferDelegateCompressed::TransferIsInProgress() {
103 return delegate_->TransferIsInProgress();
104 }
105
106 void AsyncPixelTransferDelegateCompressed::WaitForTransferCompletion() {
107 // Wait for all preceding delegates to complete.
108 AsyncPixelTransferManagerCompressed::SharedState::DelegateList::iterator self;
109 self = std::find(manager_->shared_state().delegates.begin(),
110 manager_->shared_state().delegates.end(),
111 this);
112 DCHECK(self != manager_->shared_state().delegates.end());
113 AsyncPixelTransferManagerCompressed::SharedState::DelegateList::iterator it;
114 for (it = manager_->shared_state().delegates.begin(); it != self; it++) {
115 reinterpret_cast<AsyncPixelTransferDelegateCompressed*>(*it)->
116 delegate()->WaitForTransferCompletion();
117 }
118 DCHECK(it != manager_->shared_state().delegates.end());
119
120 // Wait for this delegate to complete.
121 delegate_->WaitForTransferCompletion();
122 }
123
124 void AsyncPixelTransferDelegateCompressed::EnumerateDelegate() {
125 manager_->shared_state().delegates.remove(this);
126 manager_->shared_state().delegates.push_back(this);
127 }
128
129 } // namespace
130
131 AsyncPixelTransferManagerCompressed::AsyncPixelTransferManagerCompressed()
132 : mode_(MODE_EGL) {
133 egl_manager_.reset(new AsyncPixelTransferManagerEGL);
134 idle_manager_.reset(new AsyncPixelTransferManagerIdle);
135 }
136
137 AsyncPixelTransferManagerCompressed::~AsyncPixelTransferManagerCompressed() {
138 shared_state_.delegates.clear();
139 }
140
141 void AsyncPixelTransferManagerCompressed::BindCompletedAsyncTransfers() {
142 egl_manager_->BindCompletedAsyncTransfers();
143 idle_manager_->BindCompletedAsyncTransfers();
144 }
145
146 void AsyncPixelTransferManagerCompressed::AsyncNotifyCompletion(
147 const AsyncMemoryParams& mem_params,
148 AsyncPixelTransferCompletionObserver* observer) {
149 current_manager()->AsyncNotifyCompletion(mem_params, observer);
150 }
151
152 uint32 AsyncPixelTransferManagerCompressed::GetTextureUploadCount() {
153 return (egl_manager_->GetTextureUploadCount() +
154 idle_manager_->GetTextureUploadCount());
155 }
156
157 base::TimeDelta
158 AsyncPixelTransferManagerCompressed::GetTotalTextureUploadTime() {
159 return (egl_manager_->GetTotalTextureUploadTime() +
160 idle_manager_->GetTotalTextureUploadTime());
161 }
162
163 void AsyncPixelTransferManagerCompressed::ProcessMorePendingTransfers() {
164 // Only AsyncPixelTransferManagerIdle implements this and we need to do this
165 // even in EGL mode when EGL thread is suspended.
166 idle_manager_->ProcessMorePendingTransfers();
167 }
168
169 bool AsyncPixelTransferManagerCompressed::NeedsProcessMorePendingTransfers() {
170 // Only AsyncPixelTransferManagerIdle uses this.
171 DCHECK(!egl_manager_->NeedsProcessMorePendingTransfers());
172 return idle_manager_->NeedsProcessMorePendingTransfers();
173 }
174
175 void AsyncPixelTransferManagerCompressed::WaitAllAsyncTexImage2D() {
176 if (shared_state_.delegates.empty())
177 return;
178
179 shared_state_.delegates.back()->WaitForTransferCompletion();
180 }
181
182 AsyncPixelTransferDelegate*
183 AsyncPixelTransferManagerCompressed::CreatePixelTransferDelegateImpl(
184 gles2::TextureRef* ref,
185 const AsyncTexImage2DParams& define_params) {
186 AsyncPixelTransferDelegate* delegate =
187 egl_manager_->CreatePixelTransferDelegateImpl(ref, define_params);
188 DCHECK(delegate);
189 return new AsyncPixelTransferDelegateCompressed(this, delegate, MODE_EGL);
190 }
191
192 AsyncPixelTransferDelegate*
193 AsyncPixelTransferManagerCompressed::CreatePixelTransferDelegateImpl(
194 gles2::TextureRef* ref,
195 const AsyncCompressedTexImage2DParams& define_params) {
196 AsyncPixelTransferDelegate* delegate =
197 idle_manager_->CreatePixelTransferDelegateImpl(ref, define_params);
198 DCHECK(delegate);
199 return new AsyncPixelTransferDelegateCompressed(this, delegate, MODE_IDLE);
200 }
201
202 void AsyncPixelTransferManagerCompressed::SwitchMode(Mode new_mode) {
203 if (new_mode == mode_)
204 return;
205
206 if (new_mode == MODE_EGL && mode_ == MODE_IDLE) {
207 // Wait for already queued Idle tasks to finish before letting future EGL
208 // tasks run.
209 if (idle_manager_->NeedsProcessMorePendingTransfers()) {
210 base::WaitableEvent* waitable = new base::WaitableEvent(false, false);
211 egl_manager_->SuspendUploads(waitable);
212 idle_manager_->SignalWhenUploadsCompleted(waitable);
213 }
214 } else if (new_mode == MODE_IDLE && mode_ == MODE_EGL) {
215 // Wait for already queued EGL tasks to finish before letting future Idle
216 // tasks run.
217 base::WaitableEvent* waitable = new base::WaitableEvent(false, false);
218 idle_manager_->SuspendUploads(waitable);
219 egl_manager_->SignalWhenUploadsCompleted(waitable);
220 } else {
221 NOTREACHED();
222 }
223
224 mode_ = new_mode;
225 }
226
227 AsyncPixelTransferManagerCompressed::SharedState::SharedState() {}
228
229 AsyncPixelTransferManagerCompressed::SharedState::~SharedState() {}
230
231 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698