mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-13 05:15:45 +00:00
Bug 1457466 - Make the GenerateFrame transaction bypass the scene builder thread. r=nical
This allows frames to be generated by the render backend thread even while the scene builder thread is busy with a long scene build. The GenerateFrame transaction also contains APZ and OMTA information, so this allows the user to scroll and view OMTAnimations during long scene builds. MozReview-Commit-ID: KG5YC2KwIaH --HG-- extra : rebase_source : 3ba559aa22a3a036a3b3a034ea20caacdc8c864a
This commit is contained in:
parent
d3693ff0d7
commit
2b4b8a09ab
@ -1296,14 +1296,17 @@ WebRenderBridgeParent::CompositeToTarget(gfx::DrawTarget* aTarget, const gfx::In
|
|||||||
|
|
||||||
mAsyncImageManager->SetCompositionTime(TimeStamp::Now());
|
mAsyncImageManager->SetCompositionTime(TimeStamp::Now());
|
||||||
|
|
||||||
// TODO: We can improve upon this by using two transactions: one for everything that
|
{
|
||||||
// doesn't change the display list (in other words does not cause the scene to be
|
// TODO: We can improve upon this by using two transactions: one for everything that
|
||||||
// re-built), and one for the rest. This way, if an async pipeline needs to re-build
|
// doesn't change the display list (in other words does not cause the scene to be
|
||||||
// its display list, other async pipelines can still be rendered while the scene is
|
// re-built), and one for the rest. This way, if an async pipeline needs to re-build
|
||||||
// building.
|
// its display list, other async pipelines can still be rendered while the scene is
|
||||||
wr::TransactionBuilder txn;
|
// building. Those other async pipelines can go in the other transaction that
|
||||||
mAsyncImageManager->ApplyAsyncImages(txn);
|
// we create below.
|
||||||
mApi->SendTransaction(txn);
|
wr::TransactionBuilder txn;
|
||||||
|
mAsyncImageManager->ApplyAsyncImages(txn);
|
||||||
|
mApi->SendTransaction(txn);
|
||||||
|
}
|
||||||
|
|
||||||
if (!mAsyncImageManager->GetCompositeUntilTime().IsNull()) {
|
if (!mAsyncImageManager->GetCompositeUntilTime().IsNull()) {
|
||||||
// Trigger another CompositeToTarget() call because there might be another
|
// Trigger another CompositeToTarget() call because there might be another
|
||||||
@ -1319,6 +1322,11 @@ WebRenderBridgeParent::CompositeToTarget(gfx::DrawTarget* aTarget, const gfx::In
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure this GenerateFrame is handled on the render backend thread rather
|
||||||
|
// than going through the scene builder thread. That way we continue generating
|
||||||
|
// frames with the old scene even during slow scene builds.
|
||||||
|
wr::TransactionBuilder txn(/* aUseSceneBuilderThread */ false);
|
||||||
|
|
||||||
nsTArray<wr::WrOpacityProperty> opacityArray;
|
nsTArray<wr::WrOpacityProperty> opacityArray;
|
||||||
nsTArray<wr::WrTransformProperty> transformArray;
|
nsTArray<wr::WrTransformProperty> transformArray;
|
||||||
|
|
||||||
|
@ -133,8 +133,8 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
TransactionBuilder::TransactionBuilder()
|
TransactionBuilder::TransactionBuilder(bool aUseSceneBuilderThread)
|
||||||
: mUseSceneBuilderThread(gfxPrefs::WebRenderAsyncSceneBuild())
|
: mUseSceneBuilderThread(gfxPrefs::WebRenderAsyncSceneBuild() && aUseSceneBuilderThread)
|
||||||
{
|
{
|
||||||
mTxn = wr_transaction_new(mUseSceneBuilderThread);
|
mTxn = wr_transaction_new(mUseSceneBuilderThread);
|
||||||
mResourceUpdates = wr_resource_updates_new();
|
mResourceUpdates = wr_resource_updates_new();
|
||||||
|
@ -51,7 +51,7 @@ struct Line {
|
|||||||
|
|
||||||
class TransactionBuilder {
|
class TransactionBuilder {
|
||||||
public:
|
public:
|
||||||
TransactionBuilder();
|
explicit TransactionBuilder(bool aUseSceneBuilderThread = true);
|
||||||
|
|
||||||
~TransactionBuilder();
|
~TransactionBuilder();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user