[SCM] WebKit Debian packaging branch, webkit-1.2, updated. upstream/1.1.90-6072-g9a69373

bdakin at apple.com bdakin at apple.com
Thu Apr 8 02:07:11 UTC 2010


The following commit has been merged in the webkit-1.2 branch:
commit ccddc593ba98a901668798d3132baf24c014e225
Author: bdakin at apple.com <bdakin at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Mar 3 00:48:35 2010 +0000

    WebCore: Fix for <rdar://problem/7485289> WebKit crashes on systems that
    don't support CoreAnimation
    
    Reviewed by Darin Adler and Adam Roben.
    
    WKCACFLayerRenderer::acceleratedCompositingAvailable() now creates
    a dummy HWND so that it can step through the whole setHostWindow()
    and createRenderer() process. createRenderer() also calls a new
    function, hardwareCapabilitiesIndicateCoreAnimationSupport() which
    can only be called  once we have a d3dDevice.
    
    setHostWindow() and createRenderer() now both return bools that
    indicate whether or not they have succeeded.
    
    * platform/graphics/win/WKCACFLayerRenderer.cpp:
    (WebCore::hardwareCapabilitiesIndicateCoreAnimationSupport):
    (WebCore::CoreAnimationTesterWindowWndProc):
    (WebCore::WKCACFLayerRenderer::acceleratedCompositingAvailable):
    (WebCore::WKCACFLayerRenderer::shared):
    (WebCore::WKCACFLayerRenderer::createRenderer):
    * platform/graphics/win/WKCACFLayerRenderer.h:
    (WebCore::WKCACFLayerRenderer::setHostWindow):
    
    WebKit/win: Tiny WebKit portion of fix for <rdar://problem/7485289> WebKit
    crashes on systems that don't support CoreAnimation
    
    Reviewed by Darin Adler and Adam Roben.
    
    setHostWindow() no longer calls createRenderer(), so now that has
    to be called manually.
    
    * WebView.cpp:
    (WebView::setAcceleratedCompositing):
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@55442 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 4dc1574..de450ad 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,28 @@
+2010-03-02  Beth Dakin  <bdakin at apple.com>
+
+        Reviewed by Darin Adler and Adam Roben.
+
+        Fix for <rdar://problem/7485289> WebKit crashes on systems that 
+        don't support CoreAnimation
+
+        WKCACFLayerRenderer::acceleratedCompositingAvailable() now creates 
+        a dummy HWND so that it can step through the whole setHostWindow() 
+        and createRenderer() process. createRenderer() also calls a new 
+        function, hardwareCapabilitiesIndicateCoreAnimationSupport() which 
+        can only be called  once we have a d3dDevice.
+
+        setHostWindow() and createRenderer() now both return bools that 
+        indicate whether or not they have succeeded.
+
+        * platform/graphics/win/WKCACFLayerRenderer.cpp:
+        (WebCore::hardwareCapabilitiesIndicateCoreAnimationSupport):
+        (WebCore::CoreAnimationTesterWindowWndProc):
+        (WebCore::WKCACFLayerRenderer::acceleratedCompositingAvailable):
+        (WebCore::WKCACFLayerRenderer::shared):
+        (WebCore::WKCACFLayerRenderer::createRenderer):
+        * platform/graphics/win/WKCACFLayerRenderer.h:
+        (WebCore::WKCACFLayerRenderer::setHostWindow):
+
 2010-03-02  Mark Rowe  <mrowe at apple.com>
 
         Rubber-stamped by Jon Honeycutt.
diff --git a/WebCore/platform/graphics/win/WKCACFLayerRenderer.cpp b/WebCore/platform/graphics/win/WKCACFLayerRenderer.cpp
index 78ebb9d..64a9313 100644
--- a/WebCore/platform/graphics/win/WKCACFLayerRenderer.cpp
+++ b/WebCore/platform/graphics/win/WKCACFLayerRenderer.cpp
@@ -29,6 +29,7 @@
 
 #include "WKCACFLayerRenderer.h"
 
+#include "Page.h"
 #include "WKCACFContextFlusher.h"
 #include "WKCACFLayer.h"
 #include <CoreGraphics/CGSRegion.h>
@@ -95,6 +96,28 @@ static D3DPRESENT_PARAMETERS initialPresentationParameters()
     return parameters;
 }
 
+// FIXME: <rdar://6507851> Share this code with CoreAnimation.
+static bool hardwareCapabilitiesIndicateCoreAnimationSupport(const D3DCAPS9& caps)
+{
+    // CoreAnimation needs two or more texture units.
+    if (caps.MaxTextureBlendStages < 2)
+        return false;
+
+    // CoreAnimation needs non-power-of-two textures.
+    if ((caps.TextureCaps & D3DPTEXTURECAPS_POW2) && !(caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL))
+        return false;
+
+    // CoreAnimation needs vertex shader 2.0 or greater.
+    if (D3DSHADER_VERSION_MAJOR(caps.VertexShaderVersion) < 2)
+        return false;
+
+    // CoreAnimation needs pixel shader 2.0 or greater.
+    if (D3DSHADER_VERSION_MAJOR(caps.PixelShaderVersion) < 2)
+        return false;
+
+    return true;
+}
+
 bool WKCACFLayerRenderer::acceleratedCompositingAvailable()
 {
     static bool available;
@@ -104,17 +127,46 @@ bool WKCACFLayerRenderer::acceleratedCompositingAvailable()
         return available;
 
     tested = true;
+
+    // Initialize available to true since this function will be called from a 
+    // propagation within createRenderer(). We want to be able to return true 
+    // when that happens so that the test can continue.
+    available = true;
+    
     HMODULE library = LoadLibrary(TEXT("d3d9.dll"));
-    if (!library)
-        return false;
+    if (!library) {
+        available = false;
+        return available;
+    }
 
     FreeLibrary(library);
     library = LoadLibrary(TEXT("QuartzCore.dll"));
-    if (!library)
-        return false;
+    if (!library) {
+        available = false;
+        return available;
+    }
 
     FreeLibrary(library);
-    available = true;
+
+    // Make a dummy HWND.
+    WNDCLASSEX wcex = { 0 };
+    wcex.cbSize = sizeof(WNDCLASSEX);
+    wcex.lpfnWndProc = DefWindowProc;
+    wcex.hInstance = Page::instanceHandle();
+    wcex.lpszClassName = L"CoreAnimationTesterWindowClass";
+    ::RegisterClassEx(&wcex);
+    HWND testWindow = ::CreateWindow(L"CoreAnimationTesterWindowClass", L"CoreAnimationTesterWindow", WS_POPUP, -500, -500, 0, 0, 0, 0, 0, 0);
+
+    if (!testWindow) {
+        available = false;
+        return available;
+    }
+
+    OwnPtr<WKCACFLayerRenderer> testLayerRenderer = WKCACFLayerRenderer::create();
+    testLayerRenderer->setHostWindow(testWindow);
+    available = testLayerRenderer->createRenderer();
+    ::DestroyWindow(testWindow);
+
     return available;
 }
 
@@ -194,16 +246,16 @@ void WKCACFLayerRenderer::setNeedsDisplay()
     renderSoon();
 }
 
-void WKCACFLayerRenderer::createRenderer()
+bool WKCACFLayerRenderer::createRenderer()
 {
     if (m_triedToCreateD3DRenderer)
-        return;
+        return m_d3dDevice;
 
     m_triedToCreateD3DRenderer = true;
     D3DPRESENT_PARAMETERS parameters = initialPresentationParameters();
 
     if (!d3d() || !::IsWindow(m_hostWindow))
-        return;
+        return false;
 
     // D3D doesn't like to make back buffers for 0 size windows. We skirt this problem if we make the
     // passed backbuffer width and height non-zero. The window will necessarily get set to a non-zero
@@ -216,8 +268,23 @@ void WKCACFLayerRenderer::createRenderer()
         parameters.BackBufferHeight = 1;
     }
 
-    if (FAILED(d3d()->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hostWindow, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, &parameters, &m_d3dDevice)))
-        return;
+    COMPtr<IDirect3DDevice9> device;
+    if (FAILED(d3d()->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hostWindow, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, &parameters, &device)))
+        return false;
+
+    // Now that we've created the IDirect3DDevice9 based on the capabilities we
+    // got from the IDirect3D9 global object, we requery the device for its
+    // actual capabilities. The capabilities returned by the device can
+    // sometimes be more complete, for example when using software vertex
+    // processing.
+    D3DCAPS9 deviceCaps;
+    if (FAILED(device->GetDeviceCaps(&deviceCaps)))
+        return false;
+
+    if (!hardwareCapabilitiesIndicateCoreAnimationSupport(deviceCaps))
+        return false;
+
+    m_d3dDevice = device;
 
     D3DXMATRIXA16 projection;
     D3DXMatrixOrthoOffCenterRH(&projection, rect.left, rect.right, rect.top, rect.bottom, -1.0f, 1.0f);
@@ -251,6 +318,8 @@ void WKCACFLayerRenderer::createRenderer()
 
     if (m_context)
         m_rootLayer->becomeRootLayerForContext(m_context.get());
+
+    return true;
 }
 
 void WKCACFLayerRenderer::destroyRenderer()
diff --git a/WebCore/platform/graphics/win/WKCACFLayerRenderer.h b/WebCore/platform/graphics/win/WKCACFLayerRenderer.h
index 4e76f55..851c30e 100644
--- a/WebCore/platform/graphics/win/WKCACFLayerRenderer.h
+++ b/WebCore/platform/graphics/win/WKCACFLayerRenderer.h
@@ -62,9 +62,9 @@ public:
     void setRootContents(CGImageRef);
     void setRootChildLayer(WebCore::PlatformLayer* layer);
     void setNeedsDisplay();
-    void setHostWindow(HWND window) { m_hostWindow = window; createRenderer(); }
+    void setHostWindow(HWND window) { m_hostWindow = window; }
 
-    void createRenderer();
+    bool createRenderer();
     void destroyRenderer();
     void resize();
     void renderSoon();
diff --git a/WebKit/win/ChangeLog b/WebKit/win/ChangeLog
index 9a73cb9..dc5b39d 100644
--- a/WebKit/win/ChangeLog
+++ b/WebKit/win/ChangeLog
@@ -1,3 +1,16 @@
+2010-03-02  Beth Dakin  <bdakin at apple.com>
+
+        Reviewed by Darin Adler and Adam Roben.
+
+        Tiny WebKit portion of fix for <rdar://problem/7485289> WebKit 
+        crashes on systems that don't support CoreAnimation
+
+        setHostWindow() no longer calls createRenderer(), so now that has 
+        to be called manually.
+
+        * WebView.cpp:
+        (WebView::setAcceleratedCompositing):
+
 2010-03-02  Adam Roben  <aroben at apple.com>
 
         Add IWebViewPrivate::registerURLSchemeAsSecure
diff --git a/WebKit/win/WebView.cpp b/WebKit/win/WebView.cpp
index 2ddcf4d..480d20c 100644
--- a/WebKit/win/WebView.cpp
+++ b/WebKit/win/WebView.cpp
@@ -6073,6 +6073,7 @@ void WebView::setAcceleratedCompositing(bool accelerated)
             // Create the root layer
             ASSERT(m_viewWindow);
             m_layerRenderer->setHostWindow(m_viewWindow);
+            m_layerRenderer->createRenderer();
             updateRootLayerContents();
         }
     } else {

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list