| Index: webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
|
| diff --git a/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc b/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
|
| index c63e85585557856c6eb46ac035fe8ebd2aa2bb37..a2d366c6c7e6209c3094dc27a11f5919fcf81ba6 100644
|
| --- a/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
|
| +++ b/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
|
| @@ -33,8 +33,10 @@
|
| #include "gpu/command_buffer/service/context_group.h"
|
| #include "gpu/command_buffer/service/gl_context_virtual.h"
|
| #include "gpu/command_buffer/service/gpu_scheduler.h"
|
| +#include "gpu/command_buffer/service/image_manager.h"
|
| #include "gpu/command_buffer/service/transfer_buffer_manager.h"
|
| #include "ui/gl/gl_context.h"
|
| +#include "ui/gl/gl_image.h"
|
| #include "ui/gl/gl_share_group.h"
|
| #include "ui/gl/gl_surface.h"
|
| #include "webkit/gpu/gl_bindings_skia_cmd_buffer.h"
|
| @@ -143,6 +145,8 @@ class GLInProcessContext {
|
|
|
| ::gpu::gles2::GLES2Decoder* GetDecoder();
|
|
|
| + ::gpu::gles2::ImageManager* GetImageManager();
|
| +
|
| private:
|
| explicit GLInProcessContext(bool share_resources);
|
|
|
| @@ -385,6 +389,10 @@ GLES2Implementation* GLInProcessContext::GetImplementation() {
|
| return gles2_implementation_.get();
|
| }
|
|
|
| +::gpu::gles2::ImageManager* GLInProcessContext::GetImageManager() {
|
| + return decoder_->GetContextGroup()->image_manager();
|
| +}
|
| +
|
| GLInProcessContext::GLInProcessContext(bool share_resources)
|
| : last_error_(SUCCESS),
|
| share_resources_(share_resources),
|
| @@ -1644,6 +1652,11 @@ WebGLId WebGraphicsContext3DInProcessCommandBufferImpl::createTexture() {
|
| void WebGraphicsContext3DInProcessCommandBufferImpl::deleteBuffer(
|
| WebGLId buffer) {
|
| ClearContext();
|
| + // It is safe to call this method even though the buffer being deleted
|
| + // isn't a GPU memory buffer as it eventually translates to a
|
| + // hash_map::erase() which doesn't throw an exception if the key
|
| + // isn't in the hash_map
|
| + DeleteImageForGpuMemoryBuffer(buffer);
|
| gl_->DeleteBuffers(1, &buffer);
|
| }
|
|
|
| @@ -1777,6 +1790,50 @@ void WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost() {
|
| }
|
| }
|
|
|
| +void WebGraphicsContext3DInProcessCommandBufferImpl::
|
| + CreateImageForGpuMemoryBuffer(WGC3Dsizei width, WGC3Dsizei height) {
|
| + gl_->Flush();
|
| + gfx::GpuMemoryBufferHandle buffer =
|
| + const_cast<GLubyte*>(
|
| + gl_->GetString(GL_BOUND_GPU_MEMORY_BUFFER_CHROMIUM_POINTER));
|
| + DCHECK(buffer);
|
| +
|
| + scoped_refptr<gfx::GLImage> gl_image =
|
| + gfx::GLImage::CreateGLImageForGpuMemoryBuffer(
|
| + buffer, gfx::Size(width, height));
|
| +
|
| + GLint buffer_id = 0;
|
| + gl_->GetIntegerv(GL_BOUND_GPU_MEMORY_BUFFER_CHROMIUM, &buffer_id);
|
| + DCHECK(buffer_id != 0);
|
| + context_->GetImageManager()->AddImage(gl_image, buffer_id);
|
| +}
|
| +
|
| +void WebGraphicsContext3DInProcessCommandBufferImpl::
|
| + DeleteImageForGpuMemoryBuffer() {
|
| + gl_->Flush();
|
| + GLint buffer_id = 0;
|
| + gl_->GetIntegerv(GL_BOUND_GPU_MEMORY_BUFFER_CHROMIUM, &buffer_id);
|
| + DCHECK(buffer_id != 0);
|
| + context_->GetImageManager()->RemoveImage(buffer_id);
|
| +}
|
| +
|
| +void WebGraphicsContext3DInProcessCommandBufferImpl::
|
| + DeleteImageForGpuMemoryBuffer(WebGLId buffer_id) {
|
| + gl_->Flush();
|
| + context_->GetImageManager()->RemoveImage(buffer_id);
|
| +}
|
| +
|
| +void WebGraphicsContext3DInProcessCommandBufferImpl::imageBufferDataCHROMIUM(
|
| + WGC3Denum target, WGC3Dsizei width, WGC3Dsizei height) {
|
| + ClearContext();
|
| + gl_->ImageBufferDataCHROMIUM(target, width, height);
|
| + if (width == 0 && height == 0) {
|
| + DeleteImageForGpuMemoryBuffer();
|
| + } else {
|
| + CreateImageForGpuMemoryBuffer(width, height);
|
| + }
|
| +}
|
| +
|
| DELEGATE_TO_GL_3(bindUniformLocationCHROMIUM, BindUniformLocationCHROMIUM,
|
| WebGLId, WGC3Dint, const WGC3Dchar*)
|
|
|
|
|