Chromium代码:实现GPU->GPU的直接图片传递,不需要通过CPU进行中转

commit0c4e9d8781aea6e52fdb4a7aee978817910c67ea

authordongseong.hwang Thu Jan 08 20:11:13 2015

committerCommit bot Thu Jan 08 20:12:02 2015

media: Optimize HW Video to 2D Canvas copy.

Currently, when we draws GPU decoded Video on accelerated 2D Canvas, chromium
reads back pixel from GPU and then uploads the pixel to GPU to make a SkBitmap.
It‘s so inefficient for both speed and battery. On the other hand, only Android
copies GPU-GPU in this case, but Android doesn‘t have cache mechanism which
SkCanvasVideoRenderer provides.

This CL makes all platforms copy gpu-gpu with cache mechanism. Cache mechanism
is useful when 2d canvas draws a video frame many times.
e.g. http://craftymind.com/factory/html5video/CanvasVideo.html

In addition, fix white video background on Android when not loaded. Other platforms
draw black background thanks to SkCanvasVideoRenderer::Paint().

In detail of the changes;
1. Implement gpu-gpu copy in SkCanvasVideoRenderer::Paint() like previous
WebMediaPlayerAndroid::paint().
2. Move duplicated GPU code on WebMediaPlayerImpl and WebMediaPlayerAndroid to
SkCanvasVideoRenderer.

Perf data on i5 IvyBridge
blink_perf.all:Canvas_draw-video-to-hw-accelerated-canvas-2d
15.8x speed up: 116.27 runs/s -> 1847.23 runs/s
NOTE: measure after disabling cache in SkCanvasVideoRenderer

BUG=401058, 263667

Review URL: https://codereview.chromium.org/445013002

Cr-Commit-Position: refs/heads/[email protected]{#310577}

从视频复制到图片,GPU到GPU直接传递,不需要经过CPU内存?

// static
void SkCanvasVideoRenderer::CopyVideoFrameTextureToGLTexture(
    gpu::gles2::GLES2Interface* gl,
    VideoFrame* video_frame,
    unsigned int texture,
    unsigned int level,
    unsigned int internal_format,
    unsigned int type,
    bool premultiply_alpha,
    bool flip_y) {
  DCHECK(video_frame && video_frame->format() == VideoFrame::NATIVE_TEXTURE);
  const gpu::MailboxHolder* mailbox_holder = video_frame->mailbox_holder();
  DCHECK(mailbox_holder->texture_target == GL_TEXTURE_2D ||
         mailbox_holder->texture_target == GL_TEXTURE_EXTERNAL_OES);
  gl->WaitSyncPointCHROMIUM(mailbox_holder->sync_point);
  uint32 source_texture = gl->CreateAndConsumeTextureCHROMIUM(
      mailbox_holder->texture_target, mailbox_holder->mailbox.name);
  // The video is stored in a unmultiplied format, so premultiply
  // if necessary.
  gl->PixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, premultiply_alpha);
  // Application itself needs to take care of setting the right |flip_y|
  // value down to get the expected result.
  // "flip_y == true" means to reverse the video orientation while
  // "flip_y == false" means to keep the intrinsic orientation.
  gl->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, flip_y);
  gl->CopyTextureCHROMIUM(GL_TEXTURE_2D, source_texture, texture, level,
                          internal_format, type);
  gl->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, false);
  gl->PixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, false);
  gl->DeleteTextures(1, &source_texture);
  gl->Flush();
  SyncPointClientImpl client(gl);
  video_frame->UpdateReleaseSyncPoint(&client);
}

主要实现代码在这里,主要缺点是:从代码可以看出,仍然需要GPU内部到GPU的内存复制,做不到Zero-Copy(要是能够做到GPU内存指针的swap,或C++11里的move构造,就更好了)。但是显然比GPU-->CPU-->GPU这种中转效率上要好一点

理论上来讲,可以实现GPU硬件加速的WebView到View的GPU snapshot快照截图的直接传递。

时间: 2024-10-07 21:26:47

Chromium代码:实现GPU->GPU的直接图片传递,不需要通过CPU进行中转的相关文章

不幸的问题还是出现了:Chromium代码上整理patch(working目录/master分支),部分文件做了git checkout恢复,结果GYP再编译就出错了

[email protected]:~/Projects/Chromium/src$ ninja -C out/Release android_webview_apk ninja: Entering directory `out/Release' [3/24] CXX obj/android_webview/browser/android_webview_common.shared_renderer_state.o FAILED: /home/redtea/Projects/Chromium/s

一百行代码实现微信朋友圈九宫格图片显示

前言 很多时候我们都在刷微博或者微信朋友圈的时候都会看到很多图片,而这些图片的显示跟我们平时很多控件的显示方式都不一样,而且,当我们仔细去观察后就会发现,他加载的图片都是根据图片数量动态加载的,根据不同的图片数量来用不同的布局显示 当图片是4张的时候,就会形成一个2x2的正方形,除了一张的情况,另外的都是按照九宫格的方式显示和排列图片的.那么这种布局是怎么实现的呢,一开始,好多人都可能认为用原生的GridView就能搞掂,但是,却有几种特殊的情况是GridView解决不了的,例如4张图片的情况,

如何用几行代码读取目录下所有的图片

该程序同时也解决opencv中文路径,图片不能正常读取的问题. 最近写了一个,爬去了较多的妹子资源,但是需要手动的一个一个的去浏览图片,闲太麻烦了,能不能制作一个软件,能直接读取某目录下的所有图片呢?好,说干就干吧. 首先需要引入一些常用的库: import cv2 import numpy as np from matplotlib import pyplot as plt import os import time 接下来,就是所有的代码量了,直接上干货吧 ph = r"E:\image\小

Chrome for Android在Chromium代码库中的提交patch

訪问这个地址: https://codereview.chromium.org/1141283003 主要分为3类:png资源文件.java代码.C++代码,曾经以为这部分不开源的代码主要是C++,事实上不是这种.

代码code设置9.png/9-patch 图片背景后,此view中的TextView等控件显示不正常(常见于listview中)

因为需求的缘故,需要对liview显示项做黑白相间的处理: 其实就是在函数public View getView(int position, View convertView, ViewGroup parent) 中,加上: if (position % 2 == 0) { convertView.setBackgroundResource(R.drawable.list_gray_9); } else { convertView.setBackgroundResource(R.drawable

代码写个九宫格布局显示图片

不在xml中设置布局,在代码中直接写个布局,显示下载的图片,如下图所示,图片有点丑 XML中添加个linearLayout <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" an

验证码识别与生成类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数字+小写.数字+大写.数字+大小写等情况. 四位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数字+小写.数字+大写.数字+大小写等情况. 简单验证码识别:验证码类型 : 数字+字母, 纯英文, 纯数字,计算题 英数_验证码识别:纯数字,纯英文,数字+英文 中英数_验证码识别:英文.数

纯代码系列:Python实现验证码图片(PIL库经典用法用法,爬虫12306思路)

现在的网页中,为了防止机器人提交表单,图片验证码是很常见的应对手段之一.这里就不详细介绍了,相信大家都遇到过. 现在就给出用Python的PIL库实现验证码图片的代码.代码中有详细注释. #!/usr/bin/env python #coding=utf-8 import random from PIL import Image, ImageDraw, ImageFont, ImageFilter _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小

[代码]如何在选择画面中显示图片

下面通过一段代码介绍如何在选择画面中显示图片. 1, SMW0上载图片 Tcode:SMW0,选择Binary的选项 &lt;img class="alignnone size-full wp-image-5025" src="http://www.baidusap.com/wp-content/uploads/2017-07-10_14-36-29.png" width="472" height="187" /&am