디지털 장인정신

블로그 이미지
WebKit개발자의 혼자쓰는 블로그
스페로

Article Category

All (71)
Technology (47)
Creativity (19)
Private (4)

Recent Comment

Recent Trackback

Calendar

«   2018/06   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Archive

My Link

  • Total325,658
  • Today1
  • Yesterday70
  1. 2012.12.13
    qt의 triple buffering (2)
  2. 2012.01.28
    WebKit2 Rendering 분석 (only if using Texture Mapper) (1)
  3. 2011.09.23
    Qt Build (2)
  4. 2011.01.31
    QT WebKit Windows에서 빌드

http://qt-project.org/doc/qt-5.0/qtgui/qsurfaceformat.html#SwapBehavior-enum

https://qt.gitorious.org/qt/qtwayland/blobs/master/src/plugins/platforms/wayland/gl_integration/brcm_egl/qwaylandbrcmeglwindow.cpp

http://wayland.freedesktop.org/qt5.html

'Technology > Working Note' 카테고리의 다른 글

chromium command line  (0) 2013.05.15
webkit의 scale  (0) 2013.02.20
qt의 triple buffering  (2) 2012.12.13
Chromium build  (2) 2012.05.25
Ubuntu 11.10 reinstall  (1) 2011.11.29
Qt Build  (2) 2011.09.23
Trackback 4 and Comment 2
WebKit2의 IPC중 가장 복잡한 부분이 Rendering이다. ShareableBitmap과 scene graph정보를 적절히 massage로 주고 받아야 하기 때문이다. 이번글에서, Qt의 Accelerated Compositing인 Texture Mapper가 어떻게 IPC를 통해 브라우저에 그림을 그리는지 살펴보겠다.

특별히 Qt의 TexMap을 분석하는 이유는 WebKit에 TextureMapper의 구현코드가 모두 있기 때문이다. (OpenGL를 써서 매우 아름답게 구현되어 있다.) Chrome과 Mac은 그들의 2D Vector Graphics Library (i.e. skia, core graphics)를 써서 Accelerated Compositing을 구현했기 때문에 분석이 쉽지 않다. 그 때문에 GTK와 EFL 포트역시 TexMap을 자신들의 AC(Accelerated Compositing)로 포팅을 하고 있다.

WebKit2에서 TexMap을 enable하려면 무조건 TBS를 enable해야 한다.
TexMap을 disable하고 TBS만 enable할 수도 있다. 그러면 그림을 그리는 통신의 주체가 TiledDrawingArea가 된다. 이 글에서는 다루지 않는다.
TexMap을 enable하고 TBS를 disable할 수는 없다.
TexMap을 disable하고 TBS를 disable할 수 있다.  그러면 그림을 그리는 통신의 주체가 DrawingArea가 된다. 이 글에서는 다루지 않는다.
AC(TexMap뿐만 아니라)를 enable했을 때 그림을 그리는 통신의 주체는 LayerTreeHost이다.

이글은 TexMap과 TBS를 알고 있어야 읽을수 있다. 모르시는 분은 다음 링크부터 읽으세요.
TBS : http://ariya.ofilabs.com/2011/06/progressive-rendering-via-tiled-backing-store.html
TexMap :
http://www.sencha.com/blog/understanding-hardware-acceleration-on-mobile-browsers/
http://ariya.ofilabs.com/2011/07/fluid-animation-with-accelerated-composition.html
http://qtwebkit.blogspot.com/2010/10/texture-mapper-accelerated-compositing.html
WebKit2 : http://trac.webkit.org/wiki/WebKit2
Qt WebKit2 : http://ariya.ofilabs.com/2011/08/first-look-at-nokia-n950-web-browser.html

우선 Class Diagram부터 살펴보자
1. WebProcess
http://www.diagrammr.com/edit?key=dl7okJw6Skf
LayerTreeHostQt : UIProcess에 drawing message를 send & receive한다. WebLayerInfo struct에 ShareableBitmap과 Scene Graph 정보를 담아서 send한다.
 Receive Msg
      SetVisibleContentRectTrajectoryVectorID, : scroll
      SetVisibleContentRectAndScaleID, : scale
      RenderNextFrameID, : invalidate
      PurgeBackingStoresID, 
 Send Msg
      SyncCompositingLayerStateID, 
      SetRootCompositingLayerID,
      DeleteCompositingLayerID,
      CreateTileForLayerID, : TBS tile creation
      UpdateTileForLayerID,
      RemoveTileForLayerID,
      CreateDirectlyCompositedImageID, : Image elemene같은거는 TBS를 사용하지 않는다
      DestroyDirectlyCompositedImageID,
      DidRenderFrameID, 

Send Message의 struct
UpdateInfo : Tile 정보를 보낼때 사용
  tile의 size, scroll, updateRect 등의 정보
  ShareableBitmap::Handle

WebLayerInfo : GraphicsLayer의 정보를 보낼때 사용
  scene graph 정보
  ShareableBitmap::Handle : image element만 사용 (TBS 를 사용하지 않기 때문에)

WebGraphicsLayer
  1. LayerTreeHostQt가 AC를 시작하는 entry point가 되는 rootLayer : LayerTreeHostQt가 UI Process로 부터 받는 Msg를 수행하는 entry point
  2. 모든 RenderLayer의 GraphicsLayer : 모든 RenderLayer의 변화 사항을 UI Process로 보내는 곳 (m_client 이용)
  3. TBS의 tile의 client : Tile의 변화 사항을 UI Process로 보내는 곳 (m_layerTreeTileClient 이용)

2. UIProcess
http://www.diagrammr.com/edit?key=dkTm7Ld2Ndi
LayerTreeHostProxy :
 1. WebProcess의 LayerTreeHostQt와 IPC 통신을 한다. 어떤 Msg를 주고 받는지는 위에 기술한거의 반대이다.
 2. WebView로 부터 paintToCurrentGLContext call를 받았을때 m_rootLayer인 GraphicsLayerTextureMapper에게 AC를 시작 시킴

GraphicsLayerTextureMapper
 1. LayerTreeHostProxy가 AC를 시작하는 entry point가 되는 rootLayer : Web Process로 부터 받는 Msg를 수행하는 entry point
 2. LayerTreeHostProxy의 rootLayer를 head로 GraphicsLayer tree의 가 node들



시퀀스 다이어그램을 살펴보기전 TexMap구현의 몇가지 특이점을 집고 넘어가자.

GraphicsLayer의 구현체 : GraphicsLayerTextureMapper in UI Process,  WebGraphicsLayer in Web Process.

TexMap의 위치 : UI Process

WebProcess가 UI Process로 그림을 넘기는 방법
--- WebProcess
 1. WebProcess에서 WebGraphicsLayer들은 모두 TBS(Tiled Backing Store)를 갖는다. (TBS가 여러개란 의미이다.)
 2. SetNeedsDisplay 타이밍에 각각의 WebGraphicsLayer들이 자신의 TBS에 Contents를 update한다.
--- UIProcess
 3. UIProcess로 정보를 WebLayerInfo struct로 잘 packaging하여 메세지를 전송한다.
 4. 메세지를 잘 해석하여 GraphicsLayer의 PlatformLayer구현체인 TextureMapperNode를 업데이트한다.

UI Process에서 WebView가 그림을 그리는 방법
 1. LayerTreeHostProxyQt가 WebProcess로 부터 화면갱신에 관한 메세지를 받으면 m_messagesToRenderer에 메세지를 큐잉하고 webView에 updateViewport(이것이 invalidate)를 콜한다.
 2. 일정시간후 webView가 LayerTreeHostProxyQt에 paintToCurrentGLContext를 콜한다.
 3. m_messagesToRenderer에 쌓인 메세지를 모두 처리하고 TexMap을 이용하여 그림을 그린다.

WebGraphicsLayer의 생성 시점 (WebProcess) :
 1. 각 GraphicsLayer들이 만들어 질때.  (WebGraphicsLayer는 매우 여러개가 만들어진다.)
 2. LayerTreeHost가 만들어 질때. LayerTreeHost가 own하는 WebGraphicsLayer가 rootLayer이다.
GraphicsLayerTextureMapper의 생성 시점 (UIProcess) :
 1. root GraphicsLayer를 attach할 때.
 2. LayerTreeHostProxy가 만들어 질때.  LayerTreeHostProxy가 own하는 GraphicsLayerTextureMapper가 rootLayer이다.

SharableBitmap을 IPC하는 방법:
 1. SharableBitmap는 data (shared memory + image size) + method (GraphicsContext)이다.
 2. 질문의 답은 결국 shared memory를 IPC 어떻게 하는가이다.
     - win32경우 shared memory의 file handle과 pid를 같이 다른 process에 msg를 넘긴다.
     - 다른 process에서 handle이 만들어진 pid를 알면 같은 kernel object를 가르키는 file handle을 만들수 있다.


setNeedsDisplay부터 브라우저 화면에 그림이 그려지기 까지의 시퀀스 다이어그램

1. Invalidate
http://www.diagrammr.com/edit?key=dEJUawO7FFj
 1. RenderTree에서 자기가 소속된 RenderLayer에 setNeedsDisplay를 콜한다.
 2. 각 WebGraphicsLayer는 자신이 가진 TBS에 invalidate를 콜한다.
 3. TBS는 각 Tile에 updateBackBuffer를 콜한다.
 4. 각 Tile은 TileClient(WebGraphicsLayer)에 tiledBackingStorePaint를 콜한다.
 5. WebGraphicsLayer는 자신에게 소속된 RenderTree를 traversal하면서 Tile에 그림을 그린다.
 6. 각 Tile은 그림을 완성했으므로 UI Process에 그림과 세부정보를 UpdateInfo struct로 싸서 메세지를 보낸다.
 7. UI Process의 LayerTreeHostProxyQt는 m_messagesToRenderer에 메세지를 큐잉하고 webView에 updateViewport를 콜한다.

2. Update
http://www.diagrammr.com/edit?key=d0udlR9XYKS
 1. 여러가지 이유(i.e. UI Process의 여러 화면 바뀜 MSG들, RenderTree의 뭔가 바뀌었다는 notify들) 때문에 LayerTreeHostQt::scheduleLayerFlush()가 콜된다.
 2. LayerTreeHostQt는 자신이 가지고 있는 rootLayer와 nonCompositedContentLayer에 syncCompositingState를 콜한다.
 3. WebGraphicsLayer는 TBS를 업데이드 해야하면 업데이트하고 모든 pendingInfo를 LayerInfo로 만든후 UI Process에 메세지를 보낸다.
 4. UI Process의 LayerTreeHostProxyQt는 m_messagesToRenderer에 메세지를 큐잉하고 webView에 updateViewport를 콜한다.

3. Paint
http://www.diagrammr.com/edit?key=du1XRpcWn01
 1. WebView가 LayerTreeHostProxyQt에 paintToCurrentGLContext를 콜한다.
 2. m_messagesToRenderer에 쌓인 메세지를 처리하기 위해 GraphicsLayerTextureMapper::setSomething과 TextureMapperNode::syncCompositingState를 콜한다.
 3. 이렇게 TexMap Tree과 Web Process의 RenderLayer Tree가 sync되었다.
 4. LayerTreeHostProxyQt가 자신이 가진 rootNode(TextureMapperNode)에 paint를 콜한다.
 5. TexMap이 그림을 GLContext에 그린다.


'Technology > Webkit' 카테고리의 다른 글

WebKit Filters Animation Internal  (1) 2012.10.20
WebKit2 Injected Bundle  (1) 2012.10.15
oprofile  (2) 2012.06.02
massif 메모리 사용량을 측정하자  (0) 2012.05.31
cachegrind in valgrind  (5) 2012.05.31
WebKit2 Rendering 분석 (only if using Texture Mapper)  (1) 2012.01.28
Trackback 3 and Comment 1
- get source : git://gitorious.org/qt/qt.git
- apt-get build-dep qt4-qmake
- make confclean
- ./configure -static -opengl -no-sql-sqlite -no-sql-sqlite2 -no-sql-sqlite_symbian -developer-build -debug
- make

http://www.qtcentre.org/wiki/index.php?title=Building_static_Qt_on_Linux
http://developer.qt.nokia.com/wiki/Build_Qt_For_Linux
http://lists.qt.nokia.com/pipermail/qt-3d/2011-August/000641.html

Qt5 는 다음과 같이
http://developer.qt.nokia.com/wiki/Building_Qt_5_from_Git

> export PATH=$PWD/qtbase/bin:$PATH
> ./configure -developer-build -opensource -nomake examples -nomake tests -no-gtkstyle -no-webkit -confirm-license -prefix-install -prefix /usr/local/Trolltech/Qt-5.0.0
> make -j 7

clean은 다음과 같이
> git submodule foreach --recursive 'git clean -dfx'
> git clean -dfx
> git submodule foreach --recursive 'git reset --hard'
> git reset --hard

최근 빌드가 안된다.
https://bugreports.qt-project.org/browse/QTBUG-24276
참조

WebKit build bot에서 도는 qt5빌드 스크립트
https://github.com/ossy-szeged/qt5-tools 

'Technology > Working Note' 카테고리의 다른 글

Chromium build  (2) 2012.05.25
Ubuntu 11.10 reinstall  (1) 2011.11.29
Qt Build  (2) 2011.09.23
Regular Expression  (1) 2011.06.06
kcachegrind 없이 코딩 어떻게 해?  (0) 2011.05.25
Wiki 문법  (0) 2011.03.08
Trackback 1 and Comment 2
http://blog.paran.com/blog/detail/postBoard.kth?pmcId=breadval&blogDataId=38171882&hrefMark=

'Technology > Working Note' 카테고리의 다른 글

JNI inside  (0) 2011.02.12
Garbage collector  (0) 2011.02.12
QT WebKit Windows에서 빌드  (0) 2011.01.31
IDE 자주쓰는 단축키  (0) 2010.11.26
좋은 기술 문서 링크 페이지  (0) 2010.11.25
라이브러리 만들기  (0) 2010.11.22
Trackback 0 and Comment 0