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

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

Issue 1105153003: Avoid EGLImage target texture reuse on PowerVR (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comments Created 5 years, 7 months 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
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/async_pixel_transfer_manager_idle.h" 5 #include "gpu/command_buffer/service/async_pixel_transfer_manager_idle.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
9 #include "base/memory/weak_ptr.h" 9 #include "base/memory/weak_ptr.h"
10 #include "base/trace_event/trace_event.h" 10 #include "base/trace_event/trace_event.h"
(...skipping 14 matching lines...) Expand all
25 } 25 }
26 26
27 } // namespace 27 } // namespace
28 28
29 // Class which handles async pixel transfers in a platform 29 // Class which handles async pixel transfers in a platform
30 // independent way. 30 // independent way.
31 class AsyncPixelTransferDelegateIdle 31 class AsyncPixelTransferDelegateIdle
32 : public AsyncPixelTransferDelegate, 32 : public AsyncPixelTransferDelegate,
33 public base::SupportsWeakPtr<AsyncPixelTransferDelegateIdle> { 33 public base::SupportsWeakPtr<AsyncPixelTransferDelegateIdle> {
34 public: 34 public:
35 typedef base::Callback<GLuint()> TextureIdCallback;
35 AsyncPixelTransferDelegateIdle( 36 AsyncPixelTransferDelegateIdle(
36 AsyncPixelTransferManagerIdle::SharedState* state, 37 AsyncPixelTransferManagerIdle::SharedState* state,
37 GLuint texture_id, 38 const TextureIdCallback& texture_id_callback,
38 const AsyncTexImage2DParams& define_params); 39 const AsyncTexImage2DParams& define_params);
39 ~AsyncPixelTransferDelegateIdle() override; 40 ~AsyncPixelTransferDelegateIdle() override;
40 41
41 // Implement AsyncPixelTransferDelegate: 42 // Implement AsyncPixelTransferDelegate:
42 void AsyncTexImage2D(const AsyncTexImage2DParams& tex_params, 43 void AsyncTexImage2D(const AsyncTexImage2DParams& tex_params,
43 const AsyncMemoryParams& mem_params, 44 const AsyncMemoryParams& mem_params,
44 const base::Closure& bind_callback) override; 45 const base::Closure& bind_callback) override;
45 void AsyncTexSubImage2D(const AsyncTexSubImage2DParams& tex_params, 46 void AsyncTexSubImage2D(const AsyncTexSubImage2DParams& tex_params,
46 const AsyncMemoryParams& mem_params) override; 47 const AsyncMemoryParams& mem_params) override;
47 bool TransferIsInProgress() override; 48 bool TransferIsInProgress() override;
48 void WaitForTransferCompletion() override; 49 void WaitForTransferCompletion() override;
49 50
50 private: 51 private:
51 void PerformAsyncTexImage2D(AsyncTexImage2DParams tex_params, 52 void PerformAsyncTexImage2D(AsyncTexImage2DParams tex_params,
52 AsyncMemoryParams mem_params, 53 AsyncMemoryParams mem_params,
53 const base::Closure& bind_callback); 54 const base::Closure& bind_callback);
54 void PerformAsyncTexSubImage2D(AsyncTexSubImage2DParams tex_params, 55 void PerformAsyncTexSubImage2D(AsyncTexSubImage2DParams tex_params,
55 AsyncMemoryParams mem_params); 56 AsyncMemoryParams mem_params);
56 57
57 uint64 id_; 58 uint64 id_;
58 GLuint texture_id_; 59 TextureIdCallback texture_id_callback_;
59 bool transfer_in_progress_; 60 bool transfer_in_progress_;
60 AsyncTexImage2DParams define_params_; 61 AsyncTexImage2DParams define_params_;
61 62
62 // Safe to hold a raw pointer because SharedState is owned by the Manager 63 // Safe to hold a raw pointer because SharedState is owned by the Manager
63 // which owns the Delegate. 64 // which owns the Delegate.
64 AsyncPixelTransferManagerIdle::SharedState* shared_state_; 65 AsyncPixelTransferManagerIdle::SharedState* shared_state_;
65 66
66 DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferDelegateIdle); 67 DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferDelegateIdle);
67 }; 68 };
68 69
69 AsyncPixelTransferDelegateIdle::AsyncPixelTransferDelegateIdle( 70 AsyncPixelTransferDelegateIdle::AsyncPixelTransferDelegateIdle(
70 AsyncPixelTransferManagerIdle::SharedState* shared_state, 71 AsyncPixelTransferManagerIdle::SharedState* shared_state,
71 GLuint texture_id, 72 const TextureIdCallback& texture_id_callback,
72 const AsyncTexImage2DParams& define_params) 73 const AsyncTexImage2DParams& define_params)
73 : id_(g_next_pixel_transfer_state_id++), 74 : id_(g_next_pixel_transfer_state_id++),
74 texture_id_(texture_id), 75 texture_id_callback_(texture_id_callback),
75 transfer_in_progress_(false), 76 transfer_in_progress_(false),
76 define_params_(define_params), 77 define_params_(define_params),
77 shared_state_(shared_state) {} 78 shared_state_(shared_state) {}
78 79
79 AsyncPixelTransferDelegateIdle::~AsyncPixelTransferDelegateIdle() {} 80 AsyncPixelTransferDelegateIdle::~AsyncPixelTransferDelegateIdle() {}
80 81
81 void AsyncPixelTransferDelegateIdle::AsyncTexImage2D( 82 void AsyncPixelTransferDelegateIdle::AsyncTexImage2D(
82 const AsyncTexImage2DParams& tex_params, 83 const AsyncTexImage2DParams& tex_params,
83 const AsyncMemoryParams& mem_params, 84 const AsyncMemoryParams& mem_params,
84 const base::Closure& bind_callback) { 85 const base::Closure& bind_callback) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 AsyncTexImage2DParams tex_params, 139 AsyncTexImage2DParams tex_params,
139 AsyncMemoryParams mem_params, 140 AsyncMemoryParams mem_params,
140 const base::Closure& bind_callback) { 141 const base::Closure& bind_callback) {
141 TRACE_EVENT2("gpu", "PerformAsyncTexImage2D", 142 TRACE_EVENT2("gpu", "PerformAsyncTexImage2D",
142 "width", tex_params.width, 143 "width", tex_params.width,
143 "height", tex_params.height); 144 "height", tex_params.height);
144 145
145 void* data = mem_params.GetDataAddress(); 146 void* data = mem_params.GetDataAddress();
146 147
147 base::TimeTicks begin_time(base::TimeTicks::Now()); 148 base::TimeTicks begin_time(base::TimeTicks::Now());
148 gfx::ScopedTextureBinder texture_binder(tex_params.target, texture_id_); 149 gfx::ScopedTextureBinder texture_binder(tex_params.target,
150 texture_id_callback_.Run());
149 151
150 { 152 {
151 TRACE_EVENT0("gpu", "glTexImage2D"); 153 TRACE_EVENT0("gpu", "glTexImage2D");
152 glTexImage2D( 154 glTexImage2D(
153 tex_params.target, 155 tex_params.target,
154 tex_params.level, 156 tex_params.level,
155 tex_params.internal_format, 157 tex_params.internal_format,
156 tex_params.width, 158 tex_params.width,
157 tex_params.height, 159 tex_params.height,
158 tex_params.border, 160 tex_params.border,
(...skipping 15 matching lines...) Expand all
174 void AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D( 176 void AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D(
175 AsyncTexSubImage2DParams tex_params, 177 AsyncTexSubImage2DParams tex_params,
176 AsyncMemoryParams mem_params) { 178 AsyncMemoryParams mem_params) {
177 TRACE_EVENT2("gpu", "PerformAsyncTexSubImage2D", 179 TRACE_EVENT2("gpu", "PerformAsyncTexSubImage2D",
178 "width", tex_params.width, 180 "width", tex_params.width,
179 "height", tex_params.height); 181 "height", tex_params.height);
180 182
181 void* data = mem_params.GetDataAddress(); 183 void* data = mem_params.GetDataAddress();
182 184
183 base::TimeTicks begin_time(base::TimeTicks::Now()); 185 base::TimeTicks begin_time(base::TimeTicks::Now());
184 gfx::ScopedTextureBinder texture_binder(tex_params.target, texture_id_); 186 gfx::ScopedTextureBinder texture_binder(tex_params.target,
187 texture_id_callback_.Run());
185 188
186 if (shared_state_->use_teximage2d_over_texsubimage2d && 189 if (shared_state_->use_teximage2d_over_texsubimage2d &&
187 tex_params.xoffset == 0 && 190 tex_params.xoffset == 0 &&
188 tex_params.yoffset == 0 && 191 tex_params.yoffset == 0 &&
189 tex_params.target == define_params_.target && 192 tex_params.target == define_params_.target &&
190 tex_params.level == define_params_.level && 193 tex_params.level == define_params_.level &&
191 tex_params.width == define_params_.width && 194 tex_params.width == define_params_.width &&
192 tex_params.height == define_params_.height) { 195 tex_params.height == define_params_.height) {
193 TRACE_EVENT0("gpu", "glTexImage2D"); 196 TRACE_EVENT0("gpu", "glTexImage2D");
194 glTexImage2D( 197 glTexImage2D(
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 313
311 const Task& task = shared_state_.tasks.back(); 314 const Task& task = shared_state_.tasks.back();
312 if (task.delegate) 315 if (task.delegate)
313 task.delegate->WaitForTransferCompletion(); 316 task.delegate->WaitForTransferCompletion();
314 } 317 }
315 318
316 AsyncPixelTransferDelegate* 319 AsyncPixelTransferDelegate*
317 AsyncPixelTransferManagerIdle::CreatePixelTransferDelegateImpl( 320 AsyncPixelTransferManagerIdle::CreatePixelTransferDelegateImpl(
318 gles2::TextureRef* ref, 321 gles2::TextureRef* ref,
319 const AsyncTexImage2DParams& define_params) { 322 const AsyncTexImage2DParams& define_params) {
320 return new AsyncPixelTransferDelegateIdle(&shared_state_, 323 return new AsyncPixelTransferDelegateIdle(
321 ref->service_id(), 324 &shared_state_,
322 define_params); 325 // Not directly passing texture_ref->service_id here because it can change
326 // if avoid_egl_image_target_texture_reuse workaround is in effect.
327 // Unretained is safe because AsyncPixelTransferManager observes
328 // TextureRef destruction and destroys the delegate before TextureRef
329 // is destroyed.
330 base::Bind(&gles2::TextureRef::service_id, base::Unretained(ref)),
331 define_params);
323 } 332 }
324 333
325 } // namespace gpu 334 } // namespace gpu
OLDNEW
« no previous file with comments | « no previous file | gpu/command_buffer/service/feature_info.cc » ('j') | gpu/command_buffer/service/texture_definition.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698