Closed
Bug 775697
Opened 12 years ago
Closed 12 years ago
Cancel layer transactions that haven't ended after nsSVGFilterFrame::PaintFilteredFrame calls
Categories
(Core :: SVG, defect)
Core
SVG
Tracking
()
RESOLVED
FIXED
mozilla17
People
(Reporter: jwatt, Assigned: jwatt)
References
Details
Attachments
(1 file, 1 obsolete file)
3.07 KB,
patch
|
roc
:
review+
|
Details | Diff | Splinter Review |
After Matt's patch http://hg.mozilla.org/mozilla-central/rev/8a93aee3c7be from bug 539356 to make SVG effects painting to use a LayerManager transaction, the patches in bug 614732 to switch us to using display lists for SVG made us start hitting the "Died during transaction?" assertion in BasicLayerManager::~BasicLayerManager: http://hg.mozilla.org/mozilla-central/annotate/01929e390ba5/gfx/layers/basic/BasicLayerManager.cpp#l124 The problem is that the patches in 614732 change things so that we take the nsSVGIntegrationUtils code paths for painting SVG filters, and after Matt's patch nsSVGIntegrationUtils::PaintFramesWithEffects calls nsSVGFilterFrame::PaintFilteredFrame and assumes that the paint callback that it passes in will be called and call EndTransaction here: http://hg.mozilla.org/mozilla-central/annotate/01929e390ba5/layout/svg/base/src/nsSVGIntegrationUtils.cpp#l360 However, nsSVGFilterFrame::PaintFilteredFrame itself may return early if the nsAutoFilterInstance doesn't create an nsFilterInstance (that can happen for multiple valid reasons) or the nsSVGFilterInstance::Render() may not bother to call the callback if it's not needed (e.g. if none of the source image is required to paint the filter). Roc suggests that the best way to handle this is simply to check if the transaction has ended after the nsSVGFilterFrame::PaintFilteredFrame call in nsSVGIntegrationUtils::PaintFramesWithEffects, and if not cancel/end it.
Assignee | ||
Comment 1•12 years ago
|
||
Attachment #643975 -
Flags: review?(roc)
Comment on attachment 643975 [details] [diff] [review] patch Review of attachment 643975 [details] [diff] [review]: ----------------------------------------------------------------- ::: gfx/layers/Layers.h @@ +299,5 @@ > virtual void EndTransaction(DrawThebesLayerCallback aCallback, > void* aCallbackData, > EndTransactionFlags aFlags = END_DEFAULT) = 0; > > + virtual void AbortTransaction() {} We don't need this on all LayerManagers, since we only call it on BasicLayerManager. ::: gfx/layers/basic/BasicLayers.h @@ +93,5 @@ > virtual bool EndEmptyTransaction(); > virtual void EndTransaction(DrawThebesLayerCallback aCallback, > void* aCallbackData, > EndTransactionFlags aFlags = END_DEFAULT); > + virtual void AbortTransaction(); this doesn't need to be virtual
Assignee | ||
Comment 3•12 years ago
|
||
Attachment #643975 -
Attachment is obsolete: true
Attachment #643975 -
Flags: review?(roc)
Attachment #643985 -
Flags: review?(roc)
Attachment #643985 -
Flags: review?(roc) → review+
Assignee | ||
Comment 4•12 years ago
|
||
https://hg.mozilla.org/integration/mozilla-inbound/rev/a52f4d713da9
Target Milestone: --- → mozilla17
Comment 5•12 years ago
|
||
https://hg.mozilla.org/mozilla-central/rev/a52f4d713da9
Status: ASSIGNED → RESOLVED
Closed: 12 years ago
Resolution: --- → FIXED
You need to log in
before you can comment on or make changes to this bug.
Description
•