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 * returns false, and the caller must proceed with a normal layer tree
* update and EndTransaction. * update and EndTransaction.
*/ */
virtual bool EndEmptyTransaction() virtual bool EndEmptyTransaction() = 0;
{
return false;
}
/** /**
* Function called to draw the contents of each ThebesLayer. * Function called to draw the contents of each ThebesLayer.
* aRegionToDraw contains the region that needs to be drawn. * aRegionToDraw contains the region that needs to be drawn.

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

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

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

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

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

@ -693,6 +693,9 @@ ThebesLayerOGL::RenderLayer(int aPreviousFrameBuffer,
LayerManager::DrawThebesLayerCallback callback = LayerManager::DrawThebesLayerCallback callback =
mOGLManager->GetThebesLayerCallback(); mOGLManager->GetThebesLayerCallback();
if (!callback) {
NS_ERROR("GL should never need to update ThebesLayers in an empty transaction");
} else {
void* callbackData = mOGLManager->GetThebesLayerCallbackData(); void* callbackData = mOGLManager->GetThebesLayerCallbackData();
callback(this, state.mContext, state.mRegionToDraw, callback(this, state.mContext, state.mRegionToDraw,
state.mRegionToInvalidate, callbackData); state.mRegionToInvalidate, callbackData);
@ -702,6 +705,7 @@ ThebesLayerOGL::RenderLayer(int aPreviousFrameBuffer,
// representation of a region.) // representation of a region.)
mValidRegion.Or(mValidRegion, mVisibleRegion); mValidRegion.Or(mValidRegion, mVisibleRegion);
} }
}
DEBUG_GL_ERROR_CHECK(gl()); DEBUG_GL_ERROR_CHECK(gl());