[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.22-985-g3c00f00
bdakin at apple.com
bdakin at apple.com
Wed Mar 17 18:11:03 UTC 2010
The following commit has been merged in the webkit-1.1 branch:
commit 3191e341898f335a6868a23cdf67138b7bf89378
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, ¶meters, &m_d3dDevice)))
- return;
+ COMPtr<IDirect3DDevice9> device;
+ if (FAILED(d3d()->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hostWindow, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, ¶meters, &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