OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "webkit/plugins/ppapi/ppb_graphics_3d_impl.h" | 5 #include "webkit/plugins/ppapi/ppb_graphics_3d_impl.h" |
6 | 6 |
7 #include "gpu/command_buffer/common/command_buffer.h" | 7 #include "gpu/command_buffer/common/command_buffer.h" |
8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
9 #include "base/thread_local.h" | 9 #include "base/thread_local.h" |
10 #include "ppapi/c/dev/ppb_graphics_3d_dev.h" | 10 #include "ppapi/c/dev/ppb_graphics_3d_dev.h" |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 Resource::GetAs<PPB_Graphics3D_Impl>(graphics3d)); | 90 Resource::GetAs<PPB_Graphics3D_Impl>(graphics3d)); |
91 return BoolToPPBool(context.get() && context->MakeCurrent()); | 91 return BoolToPPBool(context.get() && context->MakeCurrent()); |
92 } | 92 } |
93 } | 93 } |
94 | 94 |
95 PP_Resource GetCurrentContext() { | 95 PP_Resource GetCurrentContext() { |
96 PPB_Graphics3D_Impl* current_context = PPB_Graphics3D_Impl::GetCurrent(); | 96 PPB_Graphics3D_Impl* current_context = PPB_Graphics3D_Impl::GetCurrent(); |
97 return current_context ? current_context->GetReference() : 0; | 97 return current_context ? current_context->GetReference() : 0; |
98 } | 98 } |
99 | 99 |
100 PP_Bool SwapBuffers(PP_Resource graphics3d, PP_CompletionCallback callback) { | 100 PP_Bool SwapBuffers(PP_Resource graphics3d) { |
101 scoped_refptr<PPB_Graphics3D_Impl> context( | 101 scoped_refptr<PPB_Graphics3D_Impl> context( |
102 Resource::GetAs<PPB_Graphics3D_Impl>(graphics3d)); | 102 Resource::GetAs<PPB_Graphics3D_Impl>(graphics3d)); |
103 return BoolToPPBool(context && context->SwapBuffers(callback)); | 103 return BoolToPPBool(context && context->SwapBuffers()); |
104 } | 104 } |
105 | 105 |
106 uint32_t GetError() { | 106 uint32_t GetError() { |
107 // Technically, this should return the last error that occurred on the current | 107 // Technically, this should return the last error that occurred on the current |
108 // thread, rather than an error associated with a particular context. | 108 // thread, rather than an error associated with a particular context. |
109 // TODO(apatrick): Fix this. | 109 // TODO(apatrick): Fix this. |
110 PPB_Graphics3D_Impl* current_context = PPB_Graphics3D_Impl::GetCurrent(); | 110 PPB_Graphics3D_Impl* current_context = PPB_Graphics3D_Impl::GetCurrent(); |
111 if (!current_context) | 111 if (!current_context) |
112 return 0; | 112 return 0; |
113 | 113 |
(...skipping 11 matching lines...) Expand all Loading... |
125 &MakeCurrent, | 125 &MakeCurrent, |
126 &GetCurrentContext, | 126 &GetCurrentContext, |
127 &SwapBuffers, | 127 &SwapBuffers, |
128 &GetError | 128 &GetError |
129 }; | 129 }; |
130 | 130 |
131 } // namespace | 131 } // namespace |
132 | 132 |
133 PPB_Graphics3D_Impl::PPB_Graphics3D_Impl(PluginModule* module) | 133 PPB_Graphics3D_Impl::PPB_Graphics3D_Impl(PluginModule* module) |
134 : Resource(module), | 134 : Resource(module), |
135 bound_instance_(NULL), | 135 bound_instance_(NULL) { |
136 swap_initiated_(false), | |
137 swap_callback_(PP_BlockUntilComplete()) { | |
138 } | 136 } |
139 | 137 |
140 const PPB_Graphics3D_Dev* PPB_Graphics3D_Impl::GetInterface() { | 138 const PPB_Graphics3D_Dev* PPB_Graphics3D_Impl::GetInterface() { |
141 return &ppb_graphics3d; | 139 return &ppb_graphics3d; |
142 } | 140 } |
143 | 141 |
144 PPB_Graphics3D_Impl* PPB_Graphics3D_Impl::GetCurrent() { | 142 PPB_Graphics3D_Impl* PPB_Graphics3D_Impl::GetCurrent() { |
145 return g_current_context_key.Get().Get(); | 143 return g_current_context_key.Get().Get(); |
146 } | 144 } |
147 | 145 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 bool PPB_Graphics3D_Impl::MakeCurrent() { | 206 bool PPB_Graphics3D_Impl::MakeCurrent() { |
209 if (!platform_context_.get()) | 207 if (!platform_context_.get()) |
210 return false; | 208 return false; |
211 | 209 |
212 g_current_context_key.Get().Set(this); | 210 g_current_context_key.Get().Set(this); |
213 | 211 |
214 // TODO(apatrick): Return false on context lost. | 212 // TODO(apatrick): Return false on context lost. |
215 return true; | 213 return true; |
216 } | 214 } |
217 | 215 |
218 bool PPB_Graphics3D_Impl::SwapBuffers(PP_CompletionCallback callback) { | 216 bool PPB_Graphics3D_Impl::SwapBuffers() { |
219 if (!platform_context_.get()) | 217 if (!platform_context_.get()) |
220 return false; | 218 return false; |
221 | 219 |
222 if (swap_callback_.func) { | |
223 // Already a pending SwapBuffers that hasn't returned yet. | |
224 return false; | |
225 } | |
226 | |
227 swap_callback_ = callback; | |
228 return platform_context_->SwapBuffers(); | 220 return platform_context_->SwapBuffers(); |
229 } | 221 } |
230 | 222 |
231 unsigned PPB_Graphics3D_Impl::GetError() { | 223 unsigned PPB_Graphics3D_Impl::GetError() { |
232 if (!platform_context_.get()) | 224 if (!platform_context_.get()) |
233 return 0; | 225 return 0; |
234 | 226 |
235 return platform_context_->GetError(); | 227 return platform_context_->GetError(); |
236 } | 228 } |
237 | 229 |
238 void PPB_Graphics3D_Impl::ResizeBackingTexture(const gfx::Size& size) { | 230 void PPB_Graphics3D_Impl::ResizeBackingTexture(const gfx::Size& size) { |
239 if (!platform_context_.get()) | 231 if (!platform_context_.get()) |
240 return; | 232 return; |
241 | 233 |
242 platform_context_->ResizeBackingTexture(size); | 234 platform_context_->ResizeBackingTexture(size); |
243 } | 235 } |
244 | 236 |
245 void PPB_Graphics3D_Impl::SetSwapBuffersCallback(Callback0::Type* callback) { | 237 void PPB_Graphics3D_Impl::SetSwapBuffersCallback(Callback0::Type* callback) { |
246 if (!platform_context_.get()) | 238 if (!platform_context_.get()) |
247 return; | 239 return; |
248 | 240 |
249 platform_context_->SetSwapBuffersCallback(callback); | 241 platform_context_->SetSwapBuffersCallback(callback); |
250 } | 242 } |
251 | 243 |
252 void PPB_Graphics3D_Impl::ViewInitiatedPaint() { | |
253 if (swap_callback_.func) { | |
254 swap_initiated_ = true; | |
255 } | |
256 } | |
257 | |
258 void PPB_Graphics3D_Impl::ViewFlushedPaint() { | |
259 // Notify any "painted" callback. See |unpainted_flush_callback_| in the | |
260 // header for more. | |
261 if (swap_initiated_ && swap_callback_.func) { | |
262 // We must clear swap_callback_ before issuing the callback. It will be | |
263 // common for the plugin to issue another SwapBuffers in response to the | |
264 // callback, and we don't want to think that a callback is already pending. | |
265 PP_CompletionCallback callback = PP_BlockUntilComplete(); | |
266 std::swap(callback, swap_callback_); | |
267 swap_initiated_ = false; | |
268 PP_RunCompletionCallback(&callback, PP_OK); | |
269 } | |
270 } | |
271 | |
272 unsigned PPB_Graphics3D_Impl::GetBackingTextureId() { | 244 unsigned PPB_Graphics3D_Impl::GetBackingTextureId() { |
273 if (!platform_context_.get()) | 245 if (!platform_context_.get()) |
274 return 0; | 246 return 0; |
275 | 247 |
276 return platform_context_->GetBackingTextureId(); | 248 return platform_context_->GetBackingTextureId(); |
277 } | 249 } |
278 | 250 |
279 void PPB_Graphics3D_Impl::Destroy() { | 251 void PPB_Graphics3D_Impl::Destroy() { |
280 if (GetCurrent() == this) { | 252 if (GetCurrent() == this) { |
281 ResetCurrent(); | 253 ResetCurrent(); |
282 } | 254 } |
283 | 255 |
284 gles2_implementation_ = NULL; | 256 gles2_implementation_ = NULL; |
285 | 257 |
286 platform_context_.reset(); | 258 platform_context_.reset(); |
287 } | 259 } |
288 | 260 |
289 } // namespace ppapi | 261 } // namespace ppapi |
290 } // namespace webkit | 262 } // namespace webkit |
291 | 263 |
OLD | NEW |