Bug 626962. Implement empty transactions for GL. r=bas,a=blocking

This commit is contained in:
Robert O'Callahan 2011-01-25 21:45:17 +13:00
Родитель 46d71e308e
Коммит 50259b5af5
4 изменённых файлов: 26 добавлений и 16 удалений

Просмотреть файл

@ -301,10 +301,8 @@ public:
* returns false, and the caller must proceed with a normal layer tree
* update and EndTransaction.
*/
virtual bool EndEmptyTransaction()
{
return false;
}
virtual bool EndEmptyTransaction() = 0;
/**
* Function called to draw the contents of each ThebesLayer.
* aRegionToDraw contains the region that needs to be drawn.

Просмотреть файл

@ -392,6 +392,16 @@ LayerManagerOGL::BeginTransactionWithTarget(gfxContext *aTarget)
mTarget = aTarget;
}
bool
LayerManagerOGL::EndEmptyTransaction()
{
if (!mRoot)
return false;
EndTransaction(nsnull, nsnull);
return true;
}
void
LayerManagerOGL::EndTransaction(DrawThebesLayerCallback aCallback,
void* aCallbackData)
@ -413,10 +423,7 @@ LayerManagerOGL::EndTransaction(DrawThebesLayerCallback aCallback,
mThebesLayerCallback = aCallback;
mThebesLayerCallbackData = aCallbackData;
// NULL callback means "non-painting transaction"
if (aCallback) {
Render();
}
Render();
mThebesLayerCallback = nsnull;
mThebesLayerCallbackData = nsnull;

Просмотреть файл

@ -136,6 +136,7 @@ public:
void EndConstruction();
virtual bool EndEmptyTransaction();
virtual void EndTransaction(DrawThebesLayerCallback aCallback,
void* aCallbackData);

Просмотреть файл

@ -693,14 +693,18 @@ ThebesLayerOGL::RenderLayer(int aPreviousFrameBuffer,
LayerManager::DrawThebesLayerCallback callback =
mOGLManager->GetThebesLayerCallback();
void* callbackData = mOGLManager->GetThebesLayerCallbackData();
callback(this, state.mContext, state.mRegionToDraw,
state.mRegionToInvalidate, callbackData);
// Everything that's visible has been validated. Do this instead of
// OR-ing with aRegionToDraw, since that can lead to a very complex region
// here (OR doesn't automatically simplify to the simplest possible
// representation of a region.)
mValidRegion.Or(mValidRegion, mVisibleRegion);
if (!callback) {
NS_ERROR("GL should never need to update ThebesLayers in an empty transaction");
} else {
void* callbackData = mOGLManager->GetThebesLayerCallbackData();
callback(this, state.mContext, state.mRegionToDraw,
state.mRegionToInvalidate, callbackData);
// Everything that's visible has been validated. Do this instead of
// OR-ing with aRegionToDraw, since that can lead to a very complex region
// here (OR doesn't automatically simplify to the simplest possible
// representation of a region.)
mValidRegion.Or(mValidRegion, mVisibleRegion);
}
}
DEBUG_GL_ERROR_CHECK(gl());