| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/common/gpu/client/gl_helper.h" | 5 #include "content/common/gpu/client/gl_helper.h" |
| 6 | 6 |
| 7 #include <queue> | 7 #include <queue> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 | 252 |
| 253 void InitBuffer(); | 253 void InitBuffer(); |
| 254 void InitProgram(); | 254 void InitProgram(); |
| 255 | 255 |
| 256 void CopyTextureTo(WebGLId src_texture, | 256 void CopyTextureTo(WebGLId src_texture, |
| 257 const gfx::Size& src_size, | 257 const gfx::Size& src_size, |
| 258 const gfx::Rect& src_subrect, | 258 const gfx::Rect& src_subrect, |
| 259 const gfx::Size& dst_size, | 259 const gfx::Size& dst_size, |
| 260 unsigned char* out, | 260 unsigned char* out, |
| 261 const base::Callback<void(bool)>& callback); | 261 const base::Callback<void(bool)>& callback); |
| 262 |
| 263 WebKit::WebGLId CopyTexture(WebGLId src_texture, const gfx::Size& size); |
| 264 |
| 262 private: | 265 private: |
| 263 // A single request to CopyTextureTo. | 266 // A single request to CopyTextureTo. |
| 264 // Thread-safety notes: the main thread creates instances of this class. The | 267 // Thread-safety notes: the main thread creates instances of this class. The |
| 265 // main thread can cancel the request, before it's handled by the helper | 268 // main thread can cancel the request, before it's handled by the helper |
| 266 // thread, by resetting the texture and pixels fields. Alternatively, the | 269 // thread, by resetting the texture and pixels fields. Alternatively, the |
| 267 // thread marks that it handles the request by resetting the pixels field | 270 // thread marks that it handles the request by resetting the pixels field |
| 268 // (meaning it guarantees that the callback with be called). | 271 // (meaning it guarantees that the callback with be called). |
| 269 // In either case, the callback must be called exactly once, and the texture | 272 // In either case, the callback must be called exactly once, and the texture |
| 270 // must be deleted by the main thread context. | 273 // must be deleted by the main thread context. |
| 271 struct Request : public base::RefCountedThreadSafe<Request> { | 274 struct Request : public base::RefCountedThreadSafe<Request> { |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 new Request(this, texture, dst_size, out, callback); | 507 new Request(this, texture, dst_size, out, callback); |
| 505 request_queue_.push(request); | 508 request_queue_.push(request); |
| 506 | 509 |
| 507 g_gl_helper_thread.Pointer()->message_loop_proxy()->PostTask(FROM_HERE, | 510 g_gl_helper_thread.Pointer()->message_loop_proxy()->PostTask(FROM_HERE, |
| 508 base::Bind(&ReadBackFramebuffer, | 511 base::Bind(&ReadBackFramebuffer, |
| 509 request, | 512 request, |
| 510 context_for_thread_, | 513 context_for_thread_, |
| 511 base::MessageLoopProxy::current())); | 514 base::MessageLoopProxy::current())); |
| 512 } | 515 } |
| 513 | 516 |
| 517 WebKit::WebGLId GLHelper::CopyTextureToImpl::CopyTexture( |
| 518 WebGLId src_texture, |
| 519 const gfx::Size& size) { |
| 520 if (!context_for_thread_) |
| 521 return 0; |
| 522 return ScaleTexture(src_texture, size, gfx::Rect(size), size); |
| 523 } |
| 524 |
| 514 void GLHelper::CopyTextureToImpl::ReadBackFramebuffer( | 525 void GLHelper::CopyTextureToImpl::ReadBackFramebuffer( |
| 515 scoped_refptr<Request> request, | 526 scoped_refptr<Request> request, |
| 516 WebGraphicsContext3D* context, | 527 WebGraphicsContext3D* context, |
| 517 scoped_refptr<base::TaskRunner> reply_loop) { | 528 scoped_refptr<base::TaskRunner> reply_loop) { |
| 518 DCHECK(context); | 529 DCHECK(context); |
| 519 if (!context->makeContextCurrent() || context->isContextLost()) { | 530 if (!context->makeContextCurrent() || context->isContextLost()) { |
| 520 base::AutoLock auto_lock(request->lock); | 531 base::AutoLock auto_lock(request->lock); |
| 521 if (request->pixels) { | 532 if (request->pixels) { |
| 522 // Only report failure if the request wasn't canceled (otherwise the | 533 // Only report failure if the request wasn't canceled (otherwise the |
| 523 // failure has already been reported). | 534 // failure has already been reported). |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 WebGraphicsContext3D* GLHelper::context() const { | 654 WebGraphicsContext3D* GLHelper::context() const { |
| 644 return context_; | 655 return context_; |
| 645 } | 656 } |
| 646 | 657 |
| 647 void GLHelper::CopyTextureTo(WebGLId src_texture, | 658 void GLHelper::CopyTextureTo(WebGLId src_texture, |
| 648 const gfx::Size& src_size, | 659 const gfx::Size& src_size, |
| 649 const gfx::Rect& src_subrect, | 660 const gfx::Rect& src_subrect, |
| 650 const gfx::Size& dst_size, | 661 const gfx::Size& dst_size, |
| 651 unsigned char* out, | 662 unsigned char* out, |
| 652 const base::Callback<void(bool)>& callback) { | 663 const base::Callback<void(bool)>& callback) { |
| 653 // Lazily initialize |copy_texture_to_impl_| | 664 InitCopyTextToImpl(); |
| 654 if (!copy_texture_to_impl_.get()) | |
| 655 copy_texture_to_impl_.reset(new CopyTextureToImpl(context_, | |
| 656 context_for_thread_, | |
| 657 this)); | |
| 658 | |
| 659 copy_texture_to_impl_->CopyTextureTo(src_texture, | 665 copy_texture_to_impl_->CopyTextureTo(src_texture, |
| 660 src_size, | 666 src_size, |
| 661 src_subrect, | 667 src_subrect, |
| 662 dst_size, | 668 dst_size, |
| 663 out, | 669 out, |
| 664 callback); | 670 callback); |
| 665 } | 671 } |
| 666 | 672 |
| 673 WebKit::WebGLId GLHelper::CopyTexture(WebKit::WebGLId texture, |
| 674 const gfx::Size& size) { |
| 675 InitCopyTextToImpl(); |
| 676 return copy_texture_to_impl_->CopyTexture(texture, size); |
| 677 } |
| 678 |
| 667 WebGLId GLHelper::CompileShaderFromSource( | 679 WebGLId GLHelper::CompileShaderFromSource( |
| 668 const WebKit::WGC3Dchar* source, | 680 const WebKit::WGC3Dchar* source, |
| 669 WebKit::WGC3Denum type) { | 681 WebKit::WGC3Denum type) { |
| 670 ScopedShader shader(context_, context_->createShader(type)); | 682 ScopedShader shader(context_, context_->createShader(type)); |
| 671 context_->shaderSource(shader, source); | 683 context_->shaderSource(shader, source); |
| 672 context_->compileShader(shader); | 684 context_->compileShader(shader); |
| 673 WebKit::WGC3Dint compile_status = 0; | 685 WebKit::WGC3Dint compile_status = 0; |
| 674 context_->getShaderiv(shader, GL_COMPILE_STATUS, &compile_status); | 686 context_->getShaderiv(shader, GL_COMPILE_STATUS, &compile_status); |
| 675 if (!compile_status) { | 687 if (!compile_status) { |
| 676 LOG(ERROR) << std::string(context_->getShaderInfoLog(shader).utf8()); | 688 LOG(ERROR) << std::string(context_->getShaderInfoLog(shader).utf8()); |
| 677 return 0; | 689 return 0; |
| 678 } | 690 } |
| 679 return shader.Detach(); | 691 return shader.Detach(); |
| 680 } | 692 } |
| 681 | 693 |
| 694 void GLHelper::InitCopyTextToImpl() { |
| 695 // Lazily initialize |copy_texture_to_impl_| |
| 696 if (!copy_texture_to_impl_.get()) |
| 697 copy_texture_to_impl_.reset(new CopyTextureToImpl(context_, |
| 698 context_for_thread_, |
| 699 this)); |
| 700 |
| 701 } |
| 702 |
| 682 } // namespace content | 703 } // namespace content |
| OLD | NEW |