haikuwebkit/ManualTests/no-repaint-after-wake-from-...

184 lines
5.3 KiB
HTML
Raw Permalink Normal View History

Periodically try to reset a lost IDirect3DDevice9 until we succeed This is how MSDN says we must respond to a lost device (see <http://msdn.microsoft.com/en-us/library/bb174714(v=VS.85).aspx>). Only testable by a manual test, unfortunately. Fixes <rdar://problem/7986906> <http://webkit.org/b/39139> Pages that use hardware acceleration don't repaint after waking computer from sleep Reviewed by John Sullivan. * manual-tests/no-repaint-after-wake-from-sleep.html: Added. This is the Poster Circle demo from webkit.org/blog, but with instructions for putting the computer to sleep and waking it up again. * platform/graphics/win/WKCACFLayerRenderer.cpp: (WebCore::WKCACFLayerRenderer::WKCACFLayerRenderer): Initialize new member that tells us whether we need to try to reset the device before rendering. (WebCore::WKCACFLayerRenderer::resize): Changed to tell resetDevice the reason why the device needs to be reset (which is because the window's size has changed). (WebCore::WKCACFLayerRenderer::render): Before we do anything else, check if we need to reset the device before rendering. If we do, try to reset it. If that fails, bail out and set a timer to try again later. If we discover that the device is lost when calling IDirect3DDevice9::Present and resetting the device fails, bail out and set a timer to try again later. (WebCore::WKCACFLayerRenderer::resetDevice): Changed to return a boolean indicating whether resetting succeeded or not. Added a ResetReason parameter so callers can specify whey the device needs to be reset. Before trying to do anything, we call IDirect3DDevice9::TestCooperativeLevel to find out whether the device can be reset currently. If it can't, we set a flag to tell ourselves that the device must be reset before we next render, and indicate to the caller that the reset failed. If we thought the device was lost but it turns out not to be, we don't have to do anything and can tell the caller that the reset succeeded. Otherwise we go ahead and reset the device as before, and indicate to the caller that the reset succeeded. * platform/graphics/win/WKCACFLayerRenderer.h: Changed resetDevice to return a boolean and take a ResetReason parameter. Added a comment about when and why this function should be called. And added m_mustResetLostDeviceBeforeRendering. Canonical link: https://commits.webkit.org/50749@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@59610 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2010-05-17 15:04:36 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Test for Bug 39139</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=0.60, minimum-scale=0.60, maximum-scale=0.60">
<style type="text/css">
body {
font-family: 'Lucida Grande', Verdana, Arial;
font-size: 12px;
}
#stage {
margin: 150px auto;
width: 600px;
height: 400px;
/*
Setting the perspective of the contents of the stage
but not the stage itself
*/
-webkit-perspective: 800;
}
#rotate {
margin: 0 auto;
width: 600px;
height: 400px;
/* Ensure that we're in 3D space */
-webkit-transform-style: preserve-3d;
/*
Make the whole set of rows use the x-axis spin animation
for a duration of 7 seconds, running infinitely and linearly
*/
-webkit-animation-name: x-spin;
-webkit-animation-duration: 7s;
-webkit-animation-iteration-count: infinite;
-webkit-animation-timing-function: linear;
}
.ring {
margin: 0 auto;
height: 110px;
width: 600px;
-webkit-transform-style: preserve-3d;
-webkit-animation-iteration-count: infinite;
-webkit-animation-timing-function: linear;
}
.ring > :nth-child(odd) {
background-color: #995C7F;
}
.ring > :nth-child(even) {
background-color: #835A99;
}
.poster {
position: absolute;
left: 250px;
width: 100px;
height: 100px;
opacity: 0.7;
color: rgba(0,0,0,0.9);
-webkit-border-radius: 10px;
}
.poster > p {
font-family: 'Georgia', serif;
font-size: 36px;
font-weight: bold;
text-align: center;
margin-top: 28px;
}
/*
Set up each row to have a different animation duration
and alternating y-axis rotation directions.
*/
#ring-1 {
-webkit-animation-name: y-spin;
-webkit-animation-duration: 5s;
}
#ring-2 {
-webkit-animation-name: back-y-spin;
-webkit-animation-duration: 4s;
}
#ring-3 {
-webkit-animation-name: y-spin;
-webkit-animation-duration: 3s;
}
/*
Here we define each of the three individual animations that
we will be using to have our 3D rotation effect. The first
animation will perform a full rotation on the x-axis, we'll
use that on the whole set of objects. The second and third
animations will perform a full rotation on the y-axis in
opposite directions, alternating directions between rows.
Note that you currently have to specify an intermediate step
for rotations even when you are using individual transformation
constructs.
*/
@-webkit-keyframes x-spin {
0% { -webkit-transform: rotateX(0deg); }
50% { -webkit-transform: rotateX(180deg); }
100% { -webkit-transform: rotateX(360deg); }
}
@-webkit-keyframes y-spin {
0% { -webkit-transform: rotateY(0deg); }
50% { -webkit-transform: rotateY(180deg); }
100% { -webkit-transform: rotateY(360deg); }
}
@-webkit-keyframes back-y-spin {
0% { -webkit-transform: rotateY(360deg); }
50% { -webkit-transform: rotateY(180deg); }
100% { -webkit-transform: rotateY(0deg); }
}
</style>
<script type="text/javascript">
const POSTERS_PER_ROW = 12;
const RING_RADIUS = 200;
function setup_posters (row)
{
var posterAngle = 360 / POSTERS_PER_ROW;
for (var i = 0; i < POSTERS_PER_ROW; i ++) {
var poster = document.createElement('div');
poster.className = 'poster';
// compute and assign the transform for this poster
var transform = 'rotateY(' + (posterAngle * i) + 'deg) translateZ(' + RING_RADIUS + 'px)';
poster.style.webkitTransform = transform;
// setup the number to show inside the poster
var content = poster.appendChild(document.createElement('p'));
content.textContent = i;
// add the poster to the row
row.appendChild(poster);
}
}
function init ()
{
setup_posters(document.getElementById('ring-1'));
setup_posters(document.getElementById('ring-2'));
setup_posters(document.getElementById('ring-3'));
}
// call init once the document is fully loaded
window.addEventListener('load', init, false);
</script>
</head>
<body>
<p>This is a test for <a href="https://bugs.webkit.org/show_bug.cgi?id=39139">Bug 39139: Pages
that use hardware acceleration don't repaint after waking computer from sleep</a>. To test, put
your computer to sleep (or "Standby", as Windows calls it). When you wake your computer up, the
animation below should still be running.</p>
<div id="stage">
<div id="rotate">
<div id="ring-1" class="ring"></div>
<div id="ring-2" class="ring"></div>
<div id="ring-3" class="ring"></div>
</div>
</div>
</body>
</html>