Index: content/browser/renderer_host/compositor_impl_android.cc |
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc |
index b85de07a858272d6ce8e1a523530c228c6e47a45..7fe5fed2651507d79b2ecf5e8e64086440466ca3 100644 |
--- a/content/browser/renderer_host/compositor_impl_android.cc |
+++ b/content/browser/renderer_host/compositor_impl_android.cc |
@@ -38,6 +38,7 @@ |
#include "gpu/command_buffer/client/gles2_interface.h" |
#include "third_party/khronos/GLES2/gl2.h" |
#include "third_party/khronos/GLES2/gl2ext.h" |
+#include "third_party/skia/include/core/SkMallocPixelRef.h" |
#include "ui/base/android/window_android.h" |
#include "ui/gfx/android/device_display_info.h" |
#include "ui/gfx/android/java_bitmap.h" |
@@ -90,6 +91,46 @@ class OutputSurfaceWithoutParent : public cc::OutputSurface { |
} |
}; |
+class TransientUIResource : public cc::ScopedUIResource { |
+ public: |
+ static scoped_ptr<TransientUIResource> Create( |
+ cc::LayerTreeHost* host, |
+ const cc::UIResourceBitmap& bitmap) { |
+ return make_scoped_ptr(new TransientUIResource(host, bitmap)); |
+ } |
+ |
+ virtual cc::UIResourceBitmap GetBitmap(cc::UIResourceId uid, |
+ bool resource_lost) OVERRIDE { |
+ if (!retrieved_) { |
+ cc::UIResourceBitmap old_bitmap(bitmap_); |
+ |
+ // Return a place holder for all following calls to GetBitmap. |
+ SkBitmap tiny_bitmap; |
+ SkCanvas canvas(tiny_bitmap); |
+ tiny_bitmap.setConfig( |
+ SkBitmap::kARGB_8888_Config, 1, 1, 0, kOpaque_SkAlphaType); |
+ tiny_bitmap.allocPixels(); |
+ canvas.drawColor(SK_ColorWHITE); |
+ tiny_bitmap.setImmutable(); |
+ |
+ // Release our reference of the true bitmap. |
+ bitmap_ = cc::UIResourceBitmap(tiny_bitmap); |
+ |
+ retrieved_ = true; |
+ return old_bitmap; |
+ } |
+ return bitmap_; |
+ } |
+ |
+ protected: |
+ TransientUIResource(cc::LayerTreeHost* host, |
+ const cc::UIResourceBitmap& bitmap) |
+ : cc::ScopedUIResource(host, bitmap), retrieved_(false) {} |
+ |
+ private: |
+ bool retrieved_; |
+}; |
+ |
static bool g_initialized = false; |
} // anonymous namespace |
@@ -266,90 +307,60 @@ bool CompositorImpl::CompositeAndReadback(void *pixels, const gfx::Rect& rect) { |
return false; |
} |
-cc::UIResourceId CompositorImpl::GenerateUIResource( |
- const cc::UIResourceBitmap& bitmap) { |
+cc::UIResourceId CompositorImpl::GenerateUIResourceFromUIResourceBitmap( |
+ const cc::UIResourceBitmap& bitmap, |
+ bool is_transient) { |
if (!host_) |
return 0; |
- scoped_ptr<cc::ScopedUIResource> ui_resource = |
- cc::ScopedUIResource::Create(host_.get(), bitmap); |
- cc::UIResourceId id = ui_resource->id(); |
- ui_resource_map_.set(id, ui_resource.Pass()); |
- return id; |
-} |
-void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) { |
- UIResourceMap::iterator it = ui_resource_map_.find(resource_id); |
- if (it != ui_resource_map_.end()) |
- ui_resource_map_.erase(it); |
-} |
+ cc::UIResourceId id = 0; |
+ scoped_ptr<cc::UIResourceClient> resource; |
+ if (is_transient) { |
+ scoped_ptr<TransientUIResource> transient_resource = |
+ TransientUIResource::Create(host_.get(), bitmap); |
+ id = transient_resource->id(); |
+ resource = transient_resource.Pass(); |
+ } else { |
+ scoped_ptr<cc::ScopedUIResource> scoped_resource = |
+ cc::ScopedUIResource::Create(host_.get(), bitmap); |
+ id = scoped_resource->id(); |
+ resource = scoped_resource.Pass(); |
+ } |
-GLuint CompositorImpl::GenerateTexture(gfx::JavaBitmap& bitmap) { |
- unsigned int texture_id = BuildBasicTexture(); |
- gpu::gles2::GLES2Interface* gl = |
- ImageTransportFactoryAndroid::GetInstance()->GetContextGL(); |
- if (texture_id == 0u) |
- return 0u; |
- GLenum format = GetGLFormatForBitmap(bitmap); |
- GLenum type = GetGLTypeForBitmap(bitmap); |
- |
- gl->TexImage2D(GL_TEXTURE_2D, |
- 0, |
- format, |
- bitmap.size().width(), |
- bitmap.size().height(), |
- 0, |
- format, |
- type, |
- bitmap.pixels()); |
- gl->ShallowFlushCHROMIUM(); |
- return texture_id; |
+ ui_resource_map_.set(id, resource.Pass()); |
+ return id; |
} |
-GLuint CompositorImpl::GenerateCompressedTexture(gfx::Size& size, |
- int data_size, |
- void* data) { |
- unsigned int texture_id = BuildBasicTexture(); |
- gpu::gles2::GLES2Interface* gl = |
- ImageTransportFactoryAndroid::GetInstance()->GetContextGL(); |
- if (texture_id == 0u) |
- return 0u; |
- gl->CompressedTexImage2D(GL_TEXTURE_2D, |
- 0, |
- GL_ETC1_RGB8_OES, |
- size.width(), |
- size.height(), |
- 0, |
- data_size, |
- data); |
- gl->ShallowFlushCHROMIUM(); |
- return texture_id; |
+cc::UIResourceId CompositorImpl::GenerateUIResource(const SkBitmap& bitmap, |
+ bool is_transient) { |
+ return GenerateUIResourceFromUIResourceBitmap(cc::UIResourceBitmap(bitmap), |
+ is_transient); |
} |
-void CompositorImpl::DeleteTexture(GLuint texture_id) { |
- gpu::gles2::GLES2Interface* gl = |
- ImageTransportFactoryAndroid::GetInstance()->GetContextGL(); |
- gl->DeleteTextures(1, &texture_id); |
- gl->ShallowFlushCHROMIUM(); |
-} |
+cc::UIResourceId CompositorImpl::GenerateCompressedUIResource( |
+ const gfx::Size& size, |
+ void* pixels, |
+ bool is_transient) { |
+ DCHECK_LT(0, size.width()); |
+ DCHECK_LT(0, size.height()); |
+ DCHECK_EQ(0, size.width() % 4); |
+ DCHECK_EQ(0, size.height() % 4); |
-bool CompositorImpl::CopyTextureToBitmap(GLuint texture_id, |
- gfx::JavaBitmap& bitmap) { |
- return CopyTextureToBitmap(texture_id, gfx::Rect(bitmap.size()), bitmap); |
+ size_t data_size = size.width() * size.height() / 2; |
+ SkImageInfo info = {size.width(), size.height() / 2, kAlpha_8_SkColorType, |
+ kPremul_SkAlphaType}; |
+ skia::RefPtr<SkMallocPixelRef> etc1_pixel_ref = |
+ skia::AdoptRef(SkMallocPixelRef::NewAllocate(info, 0, 0)); |
+ memcpy(etc1_pixel_ref->getAddr(), pixels, data_size); |
+ etc1_pixel_ref->setImmutable(); |
+ return GenerateUIResourceFromUIResourceBitmap( |
+ cc::UIResourceBitmap(etc1_pixel_ref, size), is_transient); |
} |
-bool CompositorImpl::CopyTextureToBitmap(GLuint texture_id, |
- const gfx::Rect& sub_rect, |
- gfx::JavaBitmap& bitmap) { |
- // The sub_rect should match the bitmap size. |
- DCHECK(bitmap.size() == sub_rect.size()); |
- if (bitmap.size() != sub_rect.size() || texture_id == 0) return false; |
- |
- GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper(); |
- helper->ReadbackTextureSync(texture_id, |
- sub_rect, |
- static_cast<unsigned char*> (bitmap.pixels()), |
- SkBitmap::kARGB_8888_Config); |
- return true; |
+void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) { |
+ UIResourceMap::iterator it = ui_resource_map_.find(resource_id); |
+ if (it != ui_resource_map_.end()) |
+ ui_resource_map_.erase(it); |
} |
static scoped_ptr<WebGraphicsContext3DCommandBufferImpl> |
@@ -443,53 +454,6 @@ void CompositorImpl::DidAbortSwapBuffers() { |
client_->OnSwapBuffersCompleted(); |
} |
-GLuint CompositorImpl::BuildBasicTexture() { |
- gpu::gles2::GLES2Interface* gl = |
- ImageTransportFactoryAndroid::GetInstance()->GetContextGL(); |
- GLuint texture_id = 0u; |
- gl->GenTextures(1, &texture_id); |
- gl->BindTexture(GL_TEXTURE_2D, texture_id); |
- gl->TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
- gl->TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
- gl->TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
- gl->TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
- return texture_id; |
-} |
- |
-GLenum CompositorImpl::GetGLFormatForBitmap(gfx::JavaBitmap& bitmap) { |
- switch (bitmap.format()) { |
- case ANDROID_BITMAP_FORMAT_A_8: |
- return GL_ALPHA; |
- break; |
- case ANDROID_BITMAP_FORMAT_RGBA_4444: |
- return GL_RGBA; |
- break; |
- case ANDROID_BITMAP_FORMAT_RGBA_8888: |
- return GL_RGBA; |
- break; |
- case ANDROID_BITMAP_FORMAT_RGB_565: |
- default: |
- return GL_RGB; |
- } |
-} |
- |
-GLenum CompositorImpl::GetGLTypeForBitmap(gfx::JavaBitmap& bitmap) { |
- switch (bitmap.format()) { |
- case ANDROID_BITMAP_FORMAT_A_8: |
- return GL_UNSIGNED_BYTE; |
- break; |
- case ANDROID_BITMAP_FORMAT_RGBA_4444: |
- return GL_UNSIGNED_SHORT_4_4_4_4; |
- break; |
- case ANDROID_BITMAP_FORMAT_RGBA_8888: |
- return GL_UNSIGNED_BYTE; |
- break; |
- case ANDROID_BITMAP_FORMAT_RGB_565: |
- default: |
- return GL_UNSIGNED_SHORT_5_6_5; |
- } |
-} |
- |
void CompositorImpl::DidCommit() { |
root_window_->OnCompositingDidCommit(); |
} |