構造解析のアンドロイドGPUプロセスのためのクロム

免責事項:この記事はブロガーオリジナル記事です。ブロガーの同意なしに複製してはなりません。

https://blog.csdn.net/jaylinzhou/article/details/27517471

クライアントプロセスGPU(ブラウザプロセス、レンダリングプロセス)が作成
GPUカプセル化プロセスと通信するためのインスタンスをWebGraphicsContext3DCommandBufferImpl。


だから我々はWebGraphicsContext3DCommandBufferImpl構造からGPUプロセスをリードし始めます。


.WebGraphicsContext3DCommandBufferImplを作成します。


実質的にOpenGL ES 2.0 APIによって公開されたインターフェースに対応WebGraphicsContext3D。
WebGraphicsContext3DCommandBufferImplはWebGraphicsContext3D実装クラスです。


例ブラウザのプロセスはWebGraphicsContext3DCommandBufferImplがで発生した作成
CompositorImpl :: CreateOutputSurface()。
CompositorImpl :: CreateOutputSurfaceは()を作成する
際にWebGraphicsContext3DCommandBufferImplインスタンスをsurface_idするために導入します。
で使用されるAndroidの適切な標準コントロールSurfaceView surface_idブラウザアプリケーション識別子
バッファのネイティブ形式。


例としては、プロセスがWebGraphicsContext3DCommandBufferImplがで発生作成レンダリング
RenderWidget :: CreateOutputSurface()
RenderWidget :: CreateGraphicsContext3D()。
RenderWidget :: CreateGraphicsContext3Dは()を作成する
際にWebGraphicsContext3DCommandBufferImplインスタンスsurface_idするために導入します。


surface_idはRenderWidgetHostImplです:: RenderWidgetHostImpl()
GpuSurfaceTrackerを呼び出すことにより、::()を取得- GET> AddSurfaceForRenderer()を。

RenderWidget ::次のパスを通過するsurface_id_。

二.WebGraphicsContext3DCommandBufferImpl関連するGPUのプロセス間通信とメンバー変数が含ま:
scoped_refptr <GpuChannelHost> Host_を、
CommandBufferProxyImpl * command_buffer_;
GPU GLES2 :: :: GLES2CmdHelper * gles2_helper_;
GPU :: TransferBuffer * transfer_buffer_;
GPU GLES2 :: :: GLES2Interface * GL_;
これらの導入された1つのメンバ変数の効果を。


の<GpuChannelHost> host_を作成し、その役割scoped_refptr。
ブラウザプロセスとWebGraphicsContext3DCommandBufferImplインスタンスを作成する際のプロセスをレンダリング渡され
GpuChannelHostFactoryインスタンスに。


ブラウザの着信プロセスがBrowserGpuChannelHostFactoryです。
プロセスの着信をレンダリングRenderThreadImplです。
BrowserGpuChannelHostFactoryとRenderThreadImplがGpuChannelHostFactoryから継承されました。

::初期WebGraphicsContext3DCommandBufferImpl(){
 Host_ =工場_-> EstablishGpuChannelSync(原因である);
}
WebGraphicsContext3DCommandBufferImpl ::に渡される初期化()呼び出し
GpuChannelHostインスタンスGpuChannelHostFactoryインスタンス生成。
クライアントとGPU GpuChannelHostカプセル化プロセス間のIPCチャネル。


GPU処理は、対応GpuChannelインスタンスを生成します。
プロセスとGPUプロセス間のIPCチャネルブラウザを確立するプロセス。

BrowserGpuChannelHostFactory :: EstablishGpuChannelSync()の呼び出しは、例えば、以下の3つの機能を持っている:
1.BrowserGpuChannelHostFactory :: EstablishGpuChannelOnIO()
2.gpu_channel_ =新新GpuChannelHost(これ、request.gpu_host_id、gpu_client_id_);
3.gpu_channel _-> [接続(request.channel_handle)。
1.BrowserGpuChannelHostFactory :: EstablishGpuChannelOnIOは()GPUのGpuChannelを作成するプロセスをトリガーします。

2.BrowserGpuChannelHostFactory後:: EstablishGpuChannelSyncは()、GpuChannel GPUプロセスを作成されている
作成し、ブラウザのプロセスに対応するGpuChannel段階GpuChannelHostインスタンス。
GPUプロセスGpuChannel 3.コールGpuChannelHost ::、Connect()のブラウザプロセスGpuChannelHost接続。
プロセスおよびGPUレンダリングプロセス間のIPCチャンネルを確立するプロセス。
:: CreateGraphicsContext3D RenderWidget()
WebGraphicsContext3DCommandBufferImpl ::初期化()
RenderThreadImpl :: EstablishGpuChannelSync()
RenderThreadImpl :: EstablishGpuChannelSync()例えば、三つの機能がある呼び出します。
1.RenderThreadImpl ::送る(新しい新しいGpuHostMsg_EstablishGpuChannelを());
2.gpu_channel_ =新新GpuChannelHost(これ、request.gpu_host_id、gpu_client_id_);
3.gpu_channel _->接続(request.channel_handle);
1.RenderThreadImpl ::送信(新新GpuHostMsg_EstablishGpuChannel())GPUプロセスGpuChannelの作成を開始します。


GpuMessageFilter::OnMessageReceived()
GpuMessageFilter::OnEstablishGpuChannel()
GpuProcessHost::EstablishGpuChannel()
接下来的流程就是Browser进程发送消息触发GPU进程中GpuChannel的创建。
所以Render进程相应的GpuChannel是通过Browser进程触发GPU进程创建的。
2.RenderThreadImpl::EstablishGpuChannelSync()在通过Browser进程创建完GpuChannel实例后,创建
与GpuChannel相相应的Render进程中的GpuChannelHost实例。
3.调用GpuChannelHost::Connect()连接Render进程的GpuChannelHost实例与GPU进程中的GpuChannel实例。
Browser进程CommandBufferProxyImpl* command_buffer_的创建及其作用
CommandBufferProxyImpl是GPU进程client代理,负责将消息同步给GPU进程中相应的GpuCommandBufferStub。
GpuCommandBufferStub与GPU进程中的CommandBufferProxyImpl一一相应。
Browser进程先触发GPU进程创建GpuCommandBufferStub的实例后,再创建CommandBufferProxyImpl。
GpuCommandBufferStub的实例的创建步骤例如以下。

GpuChannelHost::CreateViewCommandBuffer()在触发GPU进程创建GpuCommandBufferStub的实例后,
创建了与GpuCommandBufferStub相相应的CommandBufferProxyImpl。


Render进程CommandBufferProxyImpl* command_buffer_的创建流程例如以下。

gpu::gles2::GLES2CmdHelper* gles2_helper_;
gpu::gles2::GLES2CmdHelper帮助写入GL command buffer的辅助类。
gpu::TransferBuffer* transfer_buffer_;
gpu::TransferBuffer管理transfer buffer的类。
gpu::gles2::GLES2Interface* gl_;
gl_实际指向GLES2Implementation的实例。
GLES2Implementation在command buffers之上模拟GLES2。
GPU进程的client使用GLES2Implementation。


GLES2Implementation封装了shared memory的处理和command buffer的管理。
gles2_helper_和 transfer_buffer_都设置给gl_,在类GLES2Implementation中使用。


GPU进程client与GPU进程通信的流程是:
WebGraphicsContext3DCommandBufferImpl调用GLES2Implementation的相应接口,
GLES2Implementation调用GLES2CmdHelper将要发送给GPU进程的命令写入CommandBuffer
包括的SharedMemory中。这块SharedMemory也被映射到GPU进程中。
GPU进程中GLES2DecoderImpl负责处理GLES2Implementation发送的命令。


CommandBuffer包括的SharedMemory被映射到GPU进程中由CommandBufferService管理。
所以GLES2DecoderImpl通过操作CommandBufferService来取得命令相关的数据。
CommandBufferProxyImpl通过IPC发送消息给GPU进程,同步GPU进程中的操作。
GPU进程client通过CommandBufferProxyImpl发送的IPC消息是以GpuCommandBufferMsg_为前缀的。
GPU进程中接受这类消息的是GpuCommandBufferStub。
GpuCommandBufferStub调用CommandBufferService完毕实际的消息处理。


Gpu进程client和Gpu进程结构例如以下图:

三.GPU进程的创建
gpu_process_host.cc中定义了GpuMainThread类。


GpuMainThread::init()函数中创建GPU进程,或者在设置了in-process-gpu或single-process时。
创建GPU线程。
GPU进程是Browser进程的子进程。仅仅会在Browser进程中创建一次。


おすすめ

転載: www.cnblogs.com/ldxsuanfa/p/10958366.html