Changeset 83552 in webkit
- Timestamp:
- Apr 11, 2011 7:30:01 PM (13 years ago)
- Location:
- trunk/Source
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r83551 r83552 1 2011-04-11 John Bates <jbates@google.com> 2 3 Reviewed by Kenneth Russell. 4 5 chromium support for glSetLatch and glWaitLatch between 3D contexts 6 https://bugs.webkit.org/show_bug.cgi?id=58003 7 8 * platform/graphics/chromium/Canvas2DLayerChromium.cpp: 9 (WebCore::Canvas2DLayerChromium::~Canvas2DLayerChromium): 10 (WebCore::Canvas2DLayerChromium::setDrawingBuffer): 11 (WebCore::Canvas2DLayerChromium::setLayerRenderer): 12 * platform/graphics/chromium/Canvas2DLayerChromium.h: 13 * platform/graphics/chromium/Extensions3DChromium.h: 14 * platform/graphics/chromium/GLES2Canvas.cpp: 15 (WebCore::Cubic::Cubic): 16 * platform/graphics/chromium/LayerRendererChromium.cpp: 17 (WebCore::LayerRendererChromium::LayerRendererChromium): 18 (WebCore::LayerRendererChromium::updateAndDrawLayers): 19 (WebCore::LayerRendererChromium::updateLayers): 20 (WebCore::LayerRendererChromium::addChildContext): 21 (WebCore::LayerRendererChromium::removeChildContext): 22 * platform/graphics/chromium/LayerRendererChromium.h: 23 * platform/graphics/chromium/WebGLLayerChromium.cpp: 24 (WebCore::WebGLLayerChromium::~WebGLLayerChromium): 25 (WebCore::WebGLLayerChromium::updateCompositorResources): 26 (WebCore::WebGLLayerChromium::setContext): 27 (WebCore::WebGLLayerChromium::setLayerRenderer): 28 * platform/graphics/chromium/WebGLLayerChromium.h: 29 1 30 2011-04-11 Alexey Marinichev <amarinichev@chromium.org> 2 31 -
trunk/Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp
r82006 r83552 37 37 #include "DrawingBuffer.h" 38 38 #include "GraphicsContext3D.h" 39 #include "LayerRendererChromium.h" 39 40 40 41 namespace WebCore { … … 55 56 if (m_textureId) 56 57 layerRendererContext()->deleteTexture(m_textureId); 58 if (m_drawingBuffer && layerRenderer()) 59 layerRenderer()->removeChildContext(m_drawingBuffer->graphicsContext3D()); 57 60 } 58 61 … … 104 107 { 105 108 if (drawingBuffer != m_drawingBuffer) { 109 if (m_drawingBuffer && layerRenderer()) 110 layerRenderer()->removeChildContext(m_drawingBuffer->graphicsContext3D()); 111 106 112 m_drawingBuffer = drawingBuffer; 107 113 m_textureChanged = true; 114 115 if (drawingBuffer && layerRenderer()) 116 layerRenderer()->addChildContext(m_drawingBuffer->graphicsContext3D()); 117 } 118 } 119 120 void Canvas2DLayerChromium::setLayerRenderer(LayerRendererChromium* newLayerRenderer) 121 { 122 if (layerRenderer() != newLayerRenderer) { 123 if (m_drawingBuffer->graphicsContext3D()) { 124 if (layerRenderer()) 125 layerRenderer()->removeChildContext(m_drawingBuffer->graphicsContext3D()); 126 if (newLayerRenderer) 127 newLayerRenderer->addChildContext(m_drawingBuffer->graphicsContext3D()); 128 } 129 130 LayerChromium::setLayerRenderer(newLayerRenderer); 108 131 } 109 132 } -
trunk/Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.h
r82006 r83552 53 53 void setDrawingBuffer(DrawingBuffer*); 54 54 55 virtual void setLayerRenderer(LayerRendererChromium*); 56 55 57 private: 56 58 explicit Canvas2DLayerChromium(DrawingBuffer*, GraphicsLayerChromium* owner); -
trunk/Source/WebCore/platform/graphics/chromium/Extensions3DChromium.h
r79011 r83552 67 67 void copyTextureToParentTextureCHROMIUM(unsigned texture, unsigned parentTexture); 68 68 69 // Latch support 70 void getParentToChildLatchCHROMIUM(GC3Duint* latchId); 71 void getChildToParentLatchCHROMIUM(GC3Duint* latchId); 72 void waitLatchCHROMIUM(GC3Duint latchId); 73 void setLatchCHROMIUM(GC3Duint latchId); 74 69 75 private: 70 76 // Instances of this class are strictly owned by the GraphicsContext3D implementation and do not -
trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp
r83511 r83552 37 37 #include "cc/CCLayerImpl.h" 38 38 #include "Canvas2DLayerChromium.h" 39 #include "Extensions3DChromium.h" 39 40 #include "FloatQuad.h" 40 41 #include "GeometryBinding.h" … … 116 117 , m_compositeOffscreen(false) 117 118 , m_context(context) 119 , m_childContextsWereCopied(false) 120 , m_contextSupportsLatch(false) 118 121 , m_defaultRenderSurface(0) 119 122 { 123 m_contextSupportsLatch = m_context->getExtensions()->supports("GL_CHROMIUM_latch"); 120 124 m_hardwareCompositing = initializeSharedObjects(); 121 125 m_rootLayerContentTiler = LayerTilerChromium::create(this, IntSize(256, 256), LayerTilerChromium::NoBorderTexels); … … 272 276 updateLayers(renderSurfaceLayerList); 273 277 278 // Before drawLayers: 279 if (hardwareCompositing() && m_contextSupportsLatch) { 280 // FIXME: The multithreaded compositor case will not work as long as 281 // copyTexImage2D resolves to the parent texture, because the main 282 // thread can execute WebGL calls on the child context at any time, 283 // potentially clobbering the parent texture that is being renderered 284 // by the compositor thread. 285 if (m_childContextsWereCopied) { 286 Extensions3DChromium* parentExt = static_cast<Extensions3DChromium*>(m_context->getExtensions()); 287 // For each child context: 288 // glWaitLatch(Offscreen->Compositor); 289 ChildContextMap::iterator i = m_childContexts.begin(); 290 for (; i != m_childContexts.end(); ++i) { 291 Extensions3DChromium* childExt = static_cast<Extensions3DChromium*>(i->first->getExtensions()); 292 GC3Duint latchId; 293 childExt->getChildToParentLatchCHROMIUM(&latchId); 294 parentExt->waitLatchCHROMIUM(latchId); 295 } 296 } 297 // Reset to false to indicate that we have consumed the dirty child 298 // contexts' parent textures. (This is only useful when the compositor 299 // is multithreaded.) 300 m_childContextsWereCopied = false; 301 } 302 274 303 drawLayers(renderSurfaceLayerList); 304 305 // After drawLayers: 306 if (hardwareCompositing() && m_contextSupportsLatch) { 307 Extensions3DChromium* parentExt = static_cast<Extensions3DChromium*>(m_context->getExtensions()); 308 // For each child context: 309 // glSetLatch(Compositor->Offscreen); 310 ChildContextMap::iterator i = m_childContexts.begin(); 311 for (; i != m_childContexts.end(); ++i) { 312 Extensions3DChromium* childExt = static_cast<Extensions3DChromium*>(i->first->getExtensions()); 313 GC3Duint latchId; 314 childExt->getParentToChildLatchCHROMIUM(&latchId); 315 parentExt->setLatchCHROMIUM(latchId); 316 } 317 } 275 318 276 319 if (isCompositingOffscreen()) … … 310 353 paintContentsRecursive(m_rootLayer.get()); 311 354 355 // FIXME: Before updateCompositorResourcesRecursive, when the compositor runs in 356 // its own thread, and when the copyTexImage2D bug is fixed, insert 357 // a glWaitLatch(Compositor->Offscreen) on all child contexts here instead 358 // of after updateCompositorResourcesRecursive. 359 // Also uncomment the glSetLatch(Compositor->Offscreen) code in addChildContext. 360 // if (hardwareCompositing() && m_contextSupportsLatch) { 361 // // For each child context: 362 // // glWaitLatch(Compositor->Offscreen); 363 // ChildContextMap::iterator i = m_childContexts.begin(); 364 // for (; i != m_childContexts.end(); ++i) { 365 // Extensions3DChromium* ext = static_cast<Extensions3DChromium*>(i->first->getExtensions()); 366 // GC3Duint childToParentLatchId, parentToChildLatchId; 367 // ext->getParentToChildLatchCHROMIUM(&parentToChildLatchId); 368 // ext->waitLatchCHROMIUM(parentToChildLatchId); 369 // } 370 // } 371 312 372 updateCompositorResourcesRecursive(m_rootLayer.get()); 373 374 // After updateCompositorResourcesRecursive, set/wait latches for all child 375 // contexts. This will prevent the compositor from using any of the child 376 // parent textures while WebGL commands are executing from javascript *and* 377 // while the final parent texture is being blit'd. copyTexImage2D 378 // uses the parent texture as a temporary resolve buffer, so that's why the 379 // waitLatch is below, to block the compositor from using the parent texture 380 // until the next WebGL SwapBuffers (or copyTextureToParentTexture for 381 // Canvas2D). 382 if (hardwareCompositing() && m_contextSupportsLatch) { 383 m_childContextsWereCopied = true; 384 // For each child context: 385 // glSetLatch(Offscreen->Compositor); 386 // glWaitLatch(Compositor->Offscreen); 387 ChildContextMap::iterator i = m_childContexts.begin(); 388 for (; i != m_childContexts.end(); ++i) { 389 Extensions3DChromium* ext = static_cast<Extensions3DChromium*>(i->first->getExtensions()); 390 GC3Duint childToParentLatchId, parentToChildLatchId; 391 ext->getParentToChildLatchCHROMIUM(&parentToChildLatchId); 392 ext->getChildToParentLatchCHROMIUM(&childToParentLatchId); 393 ext->setLatchCHROMIUM(childToParentLatchId); 394 ext->waitLatchCHROMIUM(parentToChildLatchId); 395 } 396 } 313 397 } 314 398 … … 1030 1114 } 1031 1115 1116 void LayerRendererChromium::addChildContext(PassRefPtr<GraphicsContext3D> pctx) 1117 { 1118 RefPtr<GraphicsContext3D> ctx = pctx; 1119 if (!ctx->getExtensions()->supports("GL_CHROMIUM_latch")) 1120 return; 1121 1122 // This is a ref-counting map, because some contexts are shared by multiple 1123 // layers (specifically, Canvas2DLayerChromium). 1124 1125 // Insert the ctx with a count of 1, or return the existing iterator. 1126 std::pair<ChildContextMap::iterator, bool> insert_result = m_childContexts.add(ctx, 1); 1127 if (!insert_result.second) { 1128 // Already present in map, so increment. 1129 ++insert_result.first->second; 1130 } else { 1131 // FIXME(jbates): when compositor is multithreaded and copyTexImage2D bug is fixed, 1132 // uncomment this block: 1133 // // This is a new child context - set the parentToChild latch so that it 1134 // // can continue past its first wait latch. 1135 // Extensions3DChromium* ext = static_cast<Extensions3DChromium*>(ctx->getExtensions()); 1136 // GC3Duint latchId; 1137 // ext->getParentToChildLatchCHROMIUM(&latchId); 1138 // ext->setLatchCHROMIUM(0, latchId); 1139 } 1140 } 1141 1142 void LayerRendererChromium::removeChildContext(PassRefPtr<GraphicsContext3D> pctx) 1143 { 1144 RefPtr<GraphicsContext3D> ctx = pctx; 1145 if (!ctx->getExtensions()->supports("GL_CHROMIUM_latch")) 1146 return; 1147 1148 ChildContextMap::iterator i = m_childContexts.find(ctx); 1149 if (i != m_childContexts.end()) { 1150 if (--i->second <= 0) { 1151 // Count reached zero, so remove from map. 1152 m_childContexts.remove(i); 1153 } 1154 } else { 1155 // error 1156 ASSERT(0 && "m_childContexts map has mismatched add/remove calls"); 1157 } 1158 } 1159 1032 1160 void LayerRendererChromium::dumpRenderSurfaces(TextStream& ts, int indent, LayerChromium* layer) const 1033 1161 { -
trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h
r83511 r83552 132 132 String layerTreeAsText() const; 133 133 134 void addChildContext(PassRefPtr<GraphicsContext3D>); 135 void removeChildContext(PassRefPtr<GraphicsContext3D>); 136 134 137 private: 135 138 typedef Vector<RefPtr<CCLayerImpl> > LayerList; 139 typedef HashMap<RefPtr<GraphicsContext3D>, int> ChildContextMap; 136 140 137 141 explicit LayerRendererChromium(PassRefPtr<GraphicsContext3D>, PassOwnPtr<TilePaintInterface> contentPaint, PassOwnPtr<TilePaintInterface> scrollbarPaint); … … 223 227 224 228 RefPtr<GraphicsContext3D> m_context; 229 ChildContextMap m_childContexts; 230 231 // If true, the child contexts were copied to the compositor texture targets 232 // and the compositor will need to wait on the proper latches before using 233 // the target textures. If false, the compositor is reusing the textures 234 // from last frame. 235 bool m_childContextsWereCopied; 236 237 bool m_contextSupportsLatch; 225 238 226 239 RenderSurfaceChromium* m_defaultRenderSurface; -
trunk/Source/WebCore/platform/graphics/chromium/WebGLLayerChromium.cpp
r82006 r83552 52 52 } 53 53 54 WebGLLayerChromium::~WebGLLayerChromium() 55 { 56 if (m_context && layerRenderer()) 57 layerRenderer()->removeChildContext(m_context); 58 } 59 54 60 void WebGLLayerChromium::updateCompositorResources() 55 61 { … … 71 77 // Update the contents of the texture used by the compositor. 72 78 if (m_contentsDirty && m_textureUpdated) { 79 // prepareTexture copies the contents of the off-screen render target into the texture 80 // used by the compositor. 81 // 73 82 m_context->prepareTexture(); 74 83 m_context->markLayerComposited(); … … 85 94 void WebGLLayerChromium::setContext(const GraphicsContext3D* context) 86 95 { 96 if (m_context != context && layerRenderer()) { 97 if (m_context) 98 layerRenderer()->removeChildContext(m_context); 99 if (context) 100 layerRenderer()->addChildContext(m_context); 101 } 102 87 103 m_context = const_cast<GraphicsContext3D*>(context); 88 104 … … 96 112 } 97 113 114 void WebGLLayerChromium::setLayerRenderer(LayerRendererChromium* newLayerRenderer) 115 { 116 if (layerRenderer() != newLayerRenderer) { 117 if (m_context) { 118 if (layerRenderer()) 119 layerRenderer()->removeChildContext(m_context); 120 if (newLayerRenderer) 121 newLayerRenderer->addChildContext(m_context); 122 } 123 124 LayerChromium::setLayerRenderer(newLayerRenderer); 125 } 126 } 127 98 128 } 99 129 #endif // USE(ACCELERATED_COMPOSITING) -
trunk/Source/WebCore/platform/graphics/chromium/WebGLLayerChromium.h
r82006 r83552 45 45 public: 46 46 static PassRefPtr<WebGLLayerChromium> create(GraphicsLayerChromium* owner = 0); 47 48 virtual ~WebGLLayerChromium(); 49 47 50 virtual bool drawsContent() const { return m_context; } 48 51 virtual void updateCompositorResources(); … … 50 53 51 54 void setContext(const GraphicsContext3D* context); 55 56 virtual void setLayerRenderer(LayerRendererChromium*); 52 57 53 58 protected: -
trunk/Source/WebKit/chromium/ChangeLog
r83548 r83552 1 2011-04-11 John Bates <jbates@google.com> 2 3 Reviewed by Kenneth Russell. 4 5 chromium support for glSetLatch and glWaitLatch between 3D contexts 6 https://bugs.webkit.org/show_bug.cgi?id=58003 7 8 * public/WebGraphicsContext3D.h: 9 (WebKit::WebGraphicsContext3D::getParentToChildLatchCHROMIUM): 10 (WebKit::WebGraphicsContext3D::getChildToParentLatchCHROMIUM): 11 (WebKit::WebGraphicsContext3D::waitLatchCHROMIUM): 12 (WebKit::WebGraphicsContext3D::setLatchCHROMIUM): 13 * src/Extensions3DChromium.cpp: 14 (WebCore::Extensions3DChromium::waitLatchCHROMIUM): 15 (WebCore::Extensions3DChromium::setLatchCHROMIUM): 16 * src/GraphicsContext3DChromium.cpp: 17 * src/GraphicsContext3DInternal.h: 18 1 19 2011-04-11 Ryosuke Niwa <rniwa@webkit.org> 2 20 -
trunk/Source/WebKit/chromium/public/WebGraphicsContext3D.h
r77900 r83552 169 169 virtual void renderbufferStorageMultisampleCHROMIUM(WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat, WGC3Dsizei width, WGC3Dsizei height) = 0; 170 170 171 // GL_CHROMIUM_latch 172 virtual void getParentToChildLatchCHROMIUM(WGC3Duint* latchId) {} // FIXME: = 0; 173 virtual void getChildToParentLatchCHROMIUM(WGC3Duint* latchId) {} // FIXME: = 0; 174 virtual void waitLatchCHROMIUM(WGC3Duint latchId) {} // FIXME: = 0; 175 virtual void setLatchCHROMIUM(WGC3Duint latchId) {} // FIXME: = 0; 176 171 177 // The entry points below map directly to the OpenGL ES 2.0 API. 172 178 // See: http://www.khronos.org/registry/gles/ -
trunk/Source/WebKit/chromium/src/Extensions3DChromium.cpp
r79011 r83552 98 98 } 99 99 100 void Extensions3DChromium::getParentToChildLatchCHROMIUM(GC3Duint* latchId) 101 { 102 m_internal->getParentToChildLatchCHROMIUM(latchId); 103 } 104 105 void Extensions3DChromium::getChildToParentLatchCHROMIUM(GC3Duint* latchId) 106 { 107 m_internal->getChildToParentLatchCHROMIUM(latchId); 108 } 109 110 void Extensions3DChromium::waitLatchCHROMIUM(GC3Duint latchId) 111 { 112 m_internal->waitLatchCHROMIUM(latchId); 113 } 114 115 void Extensions3DChromium::setLatchCHROMIUM(GC3Duint latchId) 116 { 117 m_internal->setLatchCHROMIUM(latchId); 118 } 119 100 120 Platform3DObject Extensions3DChromium::createVertexArrayOES() 101 121 { -
trunk/Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp
r81740 r83552 801 801 DELEGATE_TO_IMPL_10(blitFramebufferCHROMIUM, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dbitfield, GC3Denum) 802 802 DELEGATE_TO_IMPL_5(renderbufferStorageMultisampleCHROMIUM, GC3Denum, GC3Dsizei, GC3Denum, GC3Dsizei, GC3Dsizei) 803 DELEGATE_TO_IMPL_1(getParentToChildLatchCHROMIUM, GC3Duint*) 804 DELEGATE_TO_IMPL_1(getChildToParentLatchCHROMIUM, GC3Duint*) 805 DELEGATE_TO_IMPL_1(waitLatchCHROMIUM, GC3Duint) 806 DELEGATE_TO_IMPL_1(setLatchCHROMIUM, GC3Duint) 803 807 804 808 //---------------------------------------------------------------------- -
trunk/Source/WebKit/chromium/src/GraphicsContext3DInternal.h
r81740 r83552 271 271 void renderbufferStorageMultisampleCHROMIUM(GC3Denum target, GC3Dsizei samples, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height); 272 272 273 // Latch support 274 void getParentToChildLatchCHROMIUM(GC3Duint* latchId); 275 void getChildToParentLatchCHROMIUM(GC3Duint* latchId); 276 void waitLatchCHROMIUM(GC3Duint latchId); 277 void setLatchCHROMIUM(GC3Duint latchId); 278 273 279 private: 274 280 OwnPtr<WebKit::WebGraphicsContext3D> m_impl;
Note: See TracChangeset
for help on using the changeset viewer.