Bug 602428, part 3: Implement HW-decelerating ShadowImageLayerOGL. r=joe

This commit is contained in:
Chris Jones
2010-10-13 17:55:45 -05:00
parent 36ee9728cc
commit e47cb7c7c1
2 changed files with 142 additions and 0 deletions

View File

@@ -36,6 +36,8 @@
*
* ***** END LICENSE BLOCK ***** */
#include "gfxSharedImageSurface.h"
#include "ImageLayerOGL.h"
#include "gfxImageSurface.h"
#include "yuv_convert.h"
@@ -711,5 +713,102 @@ CairoImageOGL::SetData(const CairoImage::Data &aData)
imageSurface->Data());
}
#ifdef MOZ_IPC
ShadowImageLayerOGL::ShadowImageLayerOGL(LayerManagerOGL* aManager)
: ShadowImageLayer(aManager, nsnull)
, LayerOGL(aManager)
{
mImplData = static_cast<LayerOGL*>(this);
}
ShadowImageLayerOGL::~ShadowImageLayerOGL()
{}
PRBool
ShadowImageLayerOGL::Init(gfxSharedImageSurface* aFront,
const nsIntSize& aSize)
{
mDeadweight = aFront;
gfxSize sz = mDeadweight->GetSize();
mTexImage = gl()->CreateTextureImage(nsIntSize(sz.width, sz.height),
mDeadweight->GetContentType(),
LOCAL_GL_CLAMP_TO_EDGE);
return PR_TRUE;
}
already_AddRefed<gfxSharedImageSurface>
ShadowImageLayerOGL::Swap(gfxSharedImageSurface* aNewFront)
{
if (!mDestroyed && mTexImage) {
// XXX this is always just ridiculously slow
gfxSize sz = aNewFront->GetSize();
nsIntRegion updateRegion(nsIntRect(0, 0, sz.width, sz.height));
// NB: this gfxContext must not escape EndUpdate() below
nsRefPtr<gfxContext> dest = mTexImage->BeginUpdate(updateRegion);
dest->SetOperator(gfxContext::OPERATOR_SOURCE);
dest->DrawSurface(aNewFront, aNewFront->GetSize());
mTexImage->EndUpdate();
}
return aNewFront;
}
void
ShadowImageLayerOGL::DestroyFrontBuffer()
{
mTexImage = nsnull;
if (mDeadweight) {
mOGLManager->DestroySharedSurface(mDeadweight, mAllocator);
mDeadweight = nsnull;
}
}
void
ShadowImageLayerOGL::Destroy()
{
if (!mDestroyed) {
mDestroyed = PR_TRUE;
mTexImage = nsnull;
}
}
Layer*
ShadowImageLayerOGL::GetLayer()
{
return this;
}
void
ShadowImageLayerOGL::RenderLayer(int aPreviousFrameBuffer,
const nsIntPoint& aOffset)
{
mOGLManager->MakeCurrent();
gl()->fActiveTexture(LOCAL_GL_TEXTURE0);
gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, mTexImage->Texture());
ColorTextureLayerProgram *program = mOGLManager->GetBGRALayerProgram();
ApplyFilter(mFilter);
program->Activate();
program->SetLayerQuadRect(nsIntRect(nsIntPoint(0, 0), mTexImage->GetSize()));
program->SetLayerTransform(mTransform);
program->SetLayerOpacity(GetOpacity());
program->SetRenderOffset(aOffset);
program->SetTextureUnit(0);
mOGLManager->BindAndDrawQuad(program);
DEBUG_GL_ERROR_CHECK(gl());
}
#endif // MOZ_IPC
} /* layers */
} /* mozilla */