Bug 602428, part 3: Implement HW-decelerating ShadowImageLayerOGL. r=joe
This commit is contained in:
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user