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

Side by Side Diff: content/browser/renderer_host/compositor_impl_android.cc

Issue 20185002: ContextProvider in OutputSurface (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: contextprovider: android Created 7 years, 4 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 | Annotate | Revision Log
OLDNEW
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/browser/renderer_host/compositor_impl_android.h" 5 #include "content/browser/renderer_host/compositor_impl_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 #include <android/native_window_jni.h> 8 #include <android/native_window_jni.h>
9 #include <map> 9 #include <map>
10 10
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 DCHECK(bitmap.size() == sub_rect.size()); 351 DCHECK(bitmap.size() == sub_rect.size());
352 if (bitmap.size() != sub_rect.size() || texture_id == 0) return false; 352 if (bitmap.size() != sub_rect.size() || texture_id == 0) return false;
353 353
354 GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper(); 354 GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper();
355 helper->ReadbackTextureSync(texture_id, 355 helper->ReadbackTextureSync(texture_id,
356 sub_rect, 356 sub_rect,
357 static_cast<unsigned char*> (bitmap.pixels())); 357 static_cast<unsigned char*> (bitmap.pixels()));
358 return true; 358 return true;
359 } 359 }
360 360
361 static scoped_ptr<WebKit::WebGraphicsContext3D> CreateInProcessViewContext(
362 const WebKit::WebGraphicsContext3D::Attributes attributes
363 ANativeWindow* window) {
364 using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
365 return WebGraphicsContext3DInProcessCommandBufferImpl::CreateViewContext(
366 attributes, window).PassAs<WebKit::WebGraphicsContext3D>();
367 }
368
369 static scoped_ptr<WebKit::WebGraphicsContext3D> CreateGpuProcessViewContext(
370 const WebKit::WebGraphicsContext3D::Attributes attributes
371 int surface_id) {
372 GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance();
373 GURL url("chrome://gpu/Compositor::createContext3D");
374 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context(
375 new WebGraphicsContext3DCommandBufferImpl(surface_id_,
376 url,
377 factory,
378 weak_factory_.GetWeakPtr()));
379 static const size_t kBytesPerPixel = 4;
380 gfx::DeviceDisplayInfo display_info;
381 size_t full_screen_texture_size_in_bytes =
382 display_info.GetDisplayHeight() *
383 display_info.GetDisplayWidth() *
384 kBytesPerPixel;
385 if (!context->Initialize(
386 attrs,
387 false,
388 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE,
389 64 * 1024, // command buffer size
390 std::min(full_screen_texture_size_in_bytes,
391 kDefaultStartTransferBufferSize),
392 kDefaultMinTransferBufferSize,
393 std::min(3 * full_screen_texture_size_in_bytes,
394 kDefaultMaxTransferBufferSize))) {
395 LOG(ERROR) << "Failed to create 3D context for compositor.";
396 return scoped_ptr<WebKit::WebGraphicsContext3D>();
397 }
398 return context.PassAs<WebKit::WebGraphicsContext3D>();
399 }
400
361 scoped_ptr<cc::OutputSurface> CompositorImpl::CreateOutputSurface( 401 scoped_ptr<cc::OutputSurface> CompositorImpl::CreateOutputSurface(
362 bool fallback) { 402 bool fallback) {
363 WebKit::WebGraphicsContext3D::Attributes attrs; 403 WebKit::WebGraphicsContext3D::Attributes attrs;
364 attrs.shareResources = true; 404 attrs.shareResources = true;
365 attrs.noAutomaticFlushes = true; 405 attrs.noAutomaticFlushes = true;
366 406
367 if (g_use_direct_gl) { 407 if (g_use_direct_gl) {
368 scoped_ptr<WebKit::WebGraphicsContext3D> context( 408 scoped_refptr<webkit::gpu::ContextProviderInProcess> context_provider =
369 webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl:: 409 webkit::gpu::ContextProviderInProcess::Create(
370 CreateViewContext(attrs, window_)); 410 base::Bind(&CreateInProcessViewContext, attrs, window_));
371 if (!window_) {
372 return scoped_ptr<cc::OutputSurface>(
373 new DirectOutputSurface(context.Pass()));
374 }
375 411
376 return make_scoped_ptr(new cc::OutputSurface(context.Pass())); 412 scoped_ptr<cc::OutputSurface> output_surface;
377 } else { 413 if (!window_)
378 DCHECK(window_ && surface_id_); 414 output_surface.reset(new DirectOutputSurface(context_provider));
379 GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance(); 415 else
380 GURL url("chrome://gpu/Compositor::createContext3D"); 416 output_surface.reset(new cc::OutputSurface(context_provider));
381 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context( 417 return output_surface.Pass();
382 new WebGraphicsContext3DCommandBufferImpl(surface_id_,
383 url,
384 factory,
385 weak_factory_.GetWeakPtr()));
386 static const size_t kBytesPerPixel = 4;
387 gfx::DeviceDisplayInfo display_info;
388 size_t full_screen_texture_size_in_bytes =
389 display_info.GetDisplayHeight() *
390 display_info.GetDisplayWidth() *
391 kBytesPerPixel;
392 if (!context->Initialize(
393 attrs,
394 false,
395 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE,
396 64 * 1024, // command buffer size
397 std::min(full_screen_texture_size_in_bytes,
398 kDefaultStartTransferBufferSize),
399 kDefaultMinTransferBufferSize,
400 std::min(3 * full_screen_texture_size_in_bytes,
401 kDefaultMaxTransferBufferSize))) {
402 LOG(ERROR) << "Failed to create 3D context for compositor.";
403 return scoped_ptr<cc::OutputSurface>();
404 }
405 return scoped_ptr<cc::OutputSurface>(
406 new OutputSurfaceWithoutParent(
407 context.PassAs<WebKit::WebGraphicsContext3D>()));
408 } 418 }
419
420 DCHECK(window_ && surface_id_);
421
422 scoped_refptr<ContextProviderCommandBuffer> context_provider =
423 ContextProviderCommandBuffer::Create(
424 base::Bind(&CreateGpuProcessViewContext, attrs, surface_id_));
425 if (!context_provider.get()) {
426 LOG(ERROR) << "Failed to create 3D context for compositor.";
427 return scoped_ptr<cc::OutputSurface>();
428 }
429 return scoped_ptr<cc::OutputSurface>(
no sievers 2013/08/14 20:41:05 Do you need to adjust the constructors for OutputS
danakj 2013/08/14 20:59:35 Oh yes, thanks. Can't get local android checkout t
danakj 2013/08/14 21:06:47 Done.
430 new OutputSurfaceWithoutParent(context_provider));
409 } 431 }
410 432
411 void CompositorImpl::OnLostResources() { 433 void CompositorImpl::OnLostResources() {
412 client_->DidLoseResources(); 434 client_->DidLoseResources();
413 } 435 }
414 436
415 void CompositorImpl::DidCompleteSwapBuffers() { 437 void CompositorImpl::DidCompleteSwapBuffers() {
416 client_->OnSwapBuffersCompleted(); 438 client_->OnSwapBuffersCompleted();
417 } 439 }
418 440
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 case ANDROID_BITMAP_FORMAT_RGBA_8888: 519 case ANDROID_BITMAP_FORMAT_RGBA_8888:
498 return GL_UNSIGNED_BYTE; 520 return GL_UNSIGNED_BYTE;
499 break; 521 break;
500 case ANDROID_BITMAP_FORMAT_RGB_565: 522 case ANDROID_BITMAP_FORMAT_RGB_565:
501 default: 523 default:
502 return GL_UNSIGNED_SHORT_5_6_5; 524 return GL_UNSIGNED_SHORT_5_6_5;
503 } 525 }
504 } 526 }
505 527
506 } // namespace content 528 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698