Commit Graph

171 Commits

Author SHA1 Message Date
Timothy Nikkel
5f0a95007d Bug 1353299. Make sure to invalidate when composited frame becomes valid. r=aosmond
We draw nothing when the composited frame is invalid, so when we mark it valid we should invalidate. Usually the action that causes the composited frame to be valid will invalidate (ie RequestRefresh).
2017-04-06 04:00:36 -05:00
Timothy Nikkel
eb355b3152 Bug 1353298. Don't report that an animated image with an invalid composited frame will draw opaquely. r=aosmond
We draw nothing until the composited frame is valid.

The IsFinished call lower down only considers one frame of the animation, so doesn't do what we want.
2017-04-06 04:00:36 -05:00
Timothy Nikkel
cd9ff2eb05 Bug 1351434. Don't do any work in RasterImage::OnSurfaceDiscarded because we hold the surface cache mutex in it. r=aosmond
https://hg.mozilla.org/integration/mozilla-inbound/rev/432215553953 (bug 1343341) is what caused this.

The UpdateState call does a surface cache lookup.
2017-03-28 15:46:23 -05:00
Timothy Nikkel
ae971e8070 Bug 1343341. When the animated images discarding pref is enabled Remove the lifetime lock on animated images and adjust code in RasterImage to allow animated images to be discarded. r=aosmond
Mostly asserts and simple book keeping. The complicated things were in FrameAnimator.
2017-03-27 00:17:52 -05:00
Timothy Nikkel
545ad966bd Bug 1343341. Rewrite animation state updating to derive new state purely based on SurfaceCache and RasterImage::mAnimationFinished. r=aosmond
If the SurfaceCache discards our frames on another thread, the runnable that notifies us of that discard could race with a decode complete notification. So we can't rely on any ordering of SetDiscarded and NotifyDecodeComplete. Thus we must derive our state purely from the SurfaceCache (and mAnimationFinished from RasterImage).

We also update the image state in RequestRefresh (the main place where we use the state that is updated).

The other main place we use the state is GetCompositedFrame, but we don't update the state there. It should be fine because the only time this might lag behind reality is if the frames are discarded, and it should be fine to continue drawing the composited frame until the discard notification arrives.

The way that we tell that an animated image has all of its frames complete in the surface cache is less than ideal.
2017-03-26 00:04:53 -05:00
Timothy Nikkel
487e932968 Bug 1343341. Only call AnimationState::SetDiscarded on the main thread. r=aosmond
Image::OnSurfaceDiscarded can be called on any thread. But AnimationState is a main thread only object.
2017-03-25 02:16:21 -05:00
Timothy Nikkel
08bc33cdea Bug 1343341. In FrameAnimator look up our frames once and pass them around. r=aosmond
The SurfaceCache can discard on any thread at any time. So we could be in the middle of advancing frames of a fully decoded animated image and then the frames could disappear out from under us.

Making the code deal with that kind of a situation would make the logic very complicated. So instead just look up the frames once and pass them around, that way they never change during while we are advancing the frame.
2017-03-24 00:57:30 -05:00
Carsten "Tomcat" Book
626d44b38b Merge mozilla-central to mozilla-inbound 2017-03-23 13:57:16 +01:00
Carsten "Tomcat" Book
758a758bd5 merge mozilla-inbound to mozilla-central a=merge 2017-03-23 13:44:09 +01:00
Andrew Osmond
69112dd465 Bug 1343499 - Expose native image sizes to imagelib users. r=tnikkel 2017-03-22 09:05:36 -04:00
Timothy Nikkel
db9df154e7 Bug 1347302. Add animated image specific probes for several imagelib telemetry probes. r=aosmond f=bsmedberg 2017-03-23 00:02:54 -05:00
Markus Stange
7dc30cc736 Bug 1339897 - Rename PROFILER_LABEL_PRINTF to PROFILER_LABEL_DYNAMIC and make it really cheap. r=Ehsan,njn
Instead of copying and concatenating strings into an mDest buffer in
SamplerStackFramePrintfRAII, require callers to keep the string buffer alive
for the duration of the current scope, and store the pointer to the annotation
string in the ProfileEntry. During stackwalking, concatenate the label and the
annotation (separated by a space) and store the resulting string in the
profile buffer.

MozReview-Commit-ID: GEjcLrhhdvb
2017-03-22 19:37:33 -04:00
Andrew Osmond
c016bea474 Backed out changeset 619b5b27ce87 (bug 1343499) for CLOSED TREE build bustage r=backout 2017-03-22 11:04:30 -04:00
Andrew Osmond
1a0eb0da6b Bug 1343499 - Expose native image sizes to imagelib users. r=tnikkel 2017-03-22 09:05:36 -04:00
Andrew Osmond
2d2cb5a8f7 Backed out changeset 0b797601dc36 (bug 1343499) for build bustages. r=backout 2017-03-22 09:19:05 -04:00
Andrew Osmond
488575a05b Bug 1343499 - Expose native image sizes to imagelib users. r=tnikkel 2017-03-22 09:05:36 -04:00
Timothy Nikkel
2ed8a09882 Bug 1343341. Fix a bug with redecoding images whose animation is finished. r=aosmond
For animated images with finite animations we can finish running their animation. At which point we won't call RequestRefresh, and so we will never mark the composited frame as valid (since that is the only place we do that).

To fix this we mark the composited frame as valid when we finish decoding.

But we can do better than that, we can mark the composited frame as valid immediately when we create a new decoded since we are just drawing the final frame from now on.
2017-03-17 00:41:44 -05:00
Timothy Nikkel
66ff9f7f0c Bug 1343341. Only set the animation state as discarded if we discarded the animated frames (and not a static frame from a first-frame-only decode). r=aosmond
The SurfaceCache can hold the first frame of a "static" decode as well as the animated frames in two seperate entries. We only care about what happens to the animated frames, so ignore OnSurfaceDiscarded for anything else.

To accomplish this we must pass the SurfaceKey to OnSurfaceDiscarded.
2017-03-16 03:06:06 -05:00
Timothy Nikkel
effe9f8d0e Bug 1343341. Create state on the AnimationState object to track whether the image is decoded or not. r=aosmond
We end up needing to track a few different things.

The large comment in the patch explains.
2017-03-16 03:06:04 -05:00
Timothy Nikkel
7b14b71848 Backed out changeset a23edcf5b82a (bug 1343341) 2017-03-15 03:13:51 -05:00
Timothy Nikkel
cdc38c2b6a Backed out changeset 29e2e6dd82d2 (bug 1343341) 2017-03-15 03:13:33 -05:00
Timothy Nikkel
b50137511a Bug 1343341. Only set the animation state as discarded if we discarded the animated frames (and not a static frame from a first-frame-only decode). r=aosmond
The SurfaceCache can hold the first frame of a "static" decode as well as the animated frames in two seperate entries. We only care about what happens to the animated frames, so ignore OnSurfaceDiscarded for anything else.

To accomplish this we must pass the SurfaceKey to OnSurfaceDiscarded.
2017-03-15 02:47:40 -05:00
Timothy Nikkel
a21a593fbd Bug 1343341. Create state on the AnimationState object to track whether the image is decoded or not. r=aosmond
We end up needing to track a few different things.

The large comment in the patch explains.
2017-03-15 02:47:37 -05:00
Timothy Nikkel
c37cf4c817 Backed out changeset 7f13c7a84acb (bug 1343341) for hitting a fatal assert that it added in RasterImage::OnSurfaceDiscard sometimes on android reftests. 2017-03-02 02:24:29 -06:00
Timothy Nikkel
0e451a8dcb Bug 1343341. Create state on the AnimationState object to track whether the image is decoded or not. r=aosmond
We end up needing to track a few different things.

The large comment in the patch explains.
2017-03-01 22:45:54 -06:00
Timothy Nikkel
2d087f29a8 Bug 1343341. Rename mDoneDecoding to mHasBeenDecoded. r=aosmond
When we allow animated images to be discarded we still want to track if the image has been fully decoded before, but it would be confusing to say that it is "done decoding" because that sounds like the image is currently decoded, even though it could be discarded at the time.
2017-03-01 22:45:54 -06:00
Bill McCloskey
f79edeabc9 Bug 1339289 - Give names to a lot of common runnables (r=ehsan)
MozReview-Commit-ID: 5IdvK6kgoAW
2017-02-15 12:30:01 -08:00
Andrew Osmond
21758b6755 Bug 1339202 - Decode images to shared surfaces for WebRender. r=tnikkel 2017-02-08 15:48:59 -05:00
Sebastian Hengst
4c2306faba Backed out changeset 45dd83a63162 (bug 1339202) for crashing in image processing related tests, e.g. xpcshell test test_imgtools.js. r=backout 2017-02-13 22:34:54 +01:00
Andrew Osmond
c03ed5beaf Bug 1339202 - Decode images to shared surfaces for WebRender. r=tnikkel 2017-02-08 15:48:59 -05:00
Andrew Osmond
a55a001132 Bug 1331938 - Part 3. Switch to using VolatileSourceSurface instead of VolatileBuffer directly in imgFrame. r=tnikkel 2017-01-18 13:31:20 -05:00
Andrew Osmond
b991d94a1f Bug 1320684 - Start metadata decoding when the first data chunk has been received. r=tnikkel 2016-11-28 08:42:55 -05:00
cku
45e5563bae Bug 1323912 - Part 2. Pass opacity down to imgIContainer::Draw. r=mstange
Each concrete class of imgIContainer is able to handle opacity already. All we
need to do is pass opacity value to them.

MozReview-Commit-ID: EMkLnG3YXA1
2017-01-03 13:53:22 +08:00
Iris Hsiao
f05dc61a9f Backed out changeset c868ab532766 (bug 1323912) 2017-01-04 21:47:12 -05:00
cku
f1ffeaa1c2 Bug 1323912 - Part 2. Pass opacity down to imgIContainer::Draw. r=mstange
Each concrete class of imgIContainer is able to handle opacity already. All we
need to do is pass opacity value to them.

MozReview-Commit-ID: EMkLnG3YXA1
2017-01-03 13:53:22 +08:00
Timothy Nikkel
2c127a3224 Bug 1325297. Create a variant of imgIContainer::StartDecoding that returns if the current image frame is complete. r=aosmond
During painting we do some image decoding, but we want to send the image progress notifications from that decoding async. The CSS image renderer checks if the image is complete before painting it. So if the decoding we did during painting resulted in the images becoming complete there is no way to tell that during the same paint. Thus making that decoding a waste of time.

So we add a limited way of telling if the result of a StartDecoding call has resulting in an image that is ready to paint so we can get that result during the same paint.

I would have prefered to change StartDecoding to just return a bool but that would have made the bool an outparam, which would make every StartDecoding call uglier with extra code. Changing it to a notxpcom function would have fixed that, but I'm not sure if that is safe.
2016-12-23 01:07:45 -06:00
Timothy Nikkel
fe02fb7d14 Bug 1325296. RasterImage::LookupFrame does not return a surface if it was created as a result of a sync decode from with the FLAG_SYNC_DECODE_IF_FAST flag. r=aosmond
The Decode call may result in synchronously creating the surface, but we only check again if the surface is there for FLAG_SYNC_DECODE, not FLAG_SYNC_DECODE_IF_FAST.

All of the decoding we do during painting is of the type FLAG_SYNC_DECODE_IF_FAST, which means it would be useless to do that decoding synchronously during painting because the paint doesn't benefit from the result of that decoding.

Looking at the history of this code it looks like https://hg.mozilla.org/mozilla-central/rev/435df926eb10 (part 6 of bug 1119774) was where this bug was introduced. Before that changeset we always did another LookupFrameInternal call after the Decode (called WantDecodedFrames back then). But that changeset changed it to only be done for standard sync decodes, not "sync decode if fast".
2016-12-22 13:15:41 -06:00
Timothy Nikkel
f90053b67c Bug 1317837. RasterImage::RequestDecodeForSize should set mWantFullDecode just like StartDecoding if we don't have our size yet. r=aosmond 2016-12-01 15:52:06 -06:00
Timothy Nikkel
557952e6b0 Bug 1317907. Refactor FrameAnimator::GetCompositedFrame to be a bit simpler. r=aosmond
FrameAnimator::GetCompositedFrame is only ever called with the current animation frame index. This is good because it can return invalid results if it is called for some other frame number.
2016-11-29 01:01:43 -06:00
Timothy Nikkel
9a90c8dd14 Bug 1317562. Allow flags to be passed to StartDecoding for the sole purpose of allowing async notifications to be requested. r=aosmond 2016-11-26 01:56:26 -06:00
Timothy Nikkel
16cc77da27 Bug 1317552. Send unlocked draw notifications for images async when asked to. r=aosmond 2016-11-17 00:25:53 -06:00
Ehsan Akhgari
5a0aa00c2b Bug 1311246 - Remove support for the -moz-samplesize media fragment; r=jrmuizel
This removes the feature added in bug 854795 for Tarako b2g devices.
2016-11-16 08:18:56 -05:00
Andrew Osmond
a1f45db66c Bug 1284117 - Make RasterImage and SourceBuffer handle input stream read errors. r=edwin 2016-10-13 10:09:35 -04:00
Andrew Osmond
b03319232c Bug 1258741 - Part 2. Ensure we consistently render partially decoded images. r=tnikkel 2016-09-26 14:18:37 -04:00
Andrew Osmond
f4dafe1aa1 Bug 1258741 - Part 1. Remove dead/unused image decoder aborted flag. r=tnikkel 2016-09-21 07:13:08 -04:00
Phil Ringnalda
1a29dfb4ca Backed out changeset c0021d576b3a (bug 1120279) for multiple reftest failures 2016-09-17 09:54:25 -07:00
Andrew Osmond
a2b89af1ce Bug 1120279 - Ensure the animated image state is consistent if redecoding fails or is asynchronous. r=edwin 2016-09-15 15:13:48 -04:00
Timothy Nikkel
1491cc0380 Bug 1260324. Don't draw garbage to the screen if an image doesn't happen to be decoded. r=seth
Layout has been using imgIContainer::IsOpaque to determine if the image will draw opaquely to all pixels it covers, and doing culling based on this.

However imgIContainer::IsOpaque doesn't guarantee anything. It only describes if the image, when in a decoded state, has all opaque pixels. So if the image doesn't have fully decoded frames around (because they got discarded) it may not draw opaquely to all of its pixels.

So we create a new function that first checks if there is a fully decoded frame.
2016-08-22 21:15:38 -05:00
Wes Kocher
b60cddc542 Backed out changeset 54933b5b96f1 (bug 1260324) for frequent windows reftest failures a=backout CLOSED TREE 2016-08-23 13:50:14 -07:00
Timothy Nikkel
8b16d4ef08 Bug 1260324. Don't draw garbage to the screen if an image doesn't happen to be decoded. r=seth
Layout has been using imgIContainer::IsOpaque to determine if the image will draw opaquely to all pixels it covers, and doing culling based on this.

However imgIContainer::IsOpaque doesn't guarantee anything. It only describes if the image, when in a decoded state, has all opaque pixels. So if the image doesn't have fully decoded frames around (because they got discarded) it may not draw opaquely to all of its pixels.

So we create a new function that first checks if there is a fully decoded frame.
2016-08-22 21:15:38 -05:00