Bug 862952, Re-enable Composer2D after layers refactoring. r=bjacob,f=diego
This commit is contained in:
@@ -7,7 +7,9 @@
|
||||
#define GFX_LAYERSTYPES_H
|
||||
|
||||
#include "nsPoint.h"
|
||||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
#include <ui/GraphicBuffer.h>
|
||||
#endif
|
||||
#if defined(DEBUG) || defined(PR_LOGGING)
|
||||
# include <stdio.h> // FILE
|
||||
# include "prlog.h"
|
||||
@@ -24,10 +26,13 @@ struct PRLogModuleInfo;
|
||||
# define MOZ_LAYERS_LOG_IF_SHADOWABLE(layer, _args)
|
||||
#endif // if defined(DEBUG) || defined(PR_LOGGING)
|
||||
|
||||
namespace android {
|
||||
class GraphicBuffer;
|
||||
}
|
||||
|
||||
namespace mozilla {
|
||||
namespace layers {
|
||||
|
||||
class SurfaceDescriptor;
|
||||
|
||||
typedef uint32_t TextureFlags;
|
||||
|
||||
@@ -57,37 +62,56 @@ enum MaskType {
|
||||
};
|
||||
|
||||
// LayerRenderState for Composer2D
|
||||
// We currently only support Composer2D using gralloc. If we want to be backed
|
||||
// by other surfaces we will need a more generic LayerRenderState.
|
||||
enum LayerRenderStateFlags {
|
||||
LAYER_RENDER_STATE_Y_FLIPPED = 1 << 0,
|
||||
LAYER_RENDER_STATE_BUFFER_ROTATION = 1 << 1
|
||||
};
|
||||
|
||||
// The 'ifdef MOZ_WIDGET_GONK' sadness here is because we don't want to include
|
||||
// android::sp unless we have to.
|
||||
struct LayerRenderState {
|
||||
LayerRenderState() : mSurface(nullptr), mFlags(0), mHasOwnOffset(false)
|
||||
LayerRenderState()
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
: mSurface(nullptr), mFlags(0), mHasOwnOffset(false)
|
||||
#endif
|
||||
{}
|
||||
|
||||
LayerRenderState(SurfaceDescriptor* aSurface, uint32_t aFlags = 0)
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
LayerRenderState(android::GraphicBuffer* aSurface,
|
||||
const nsIntSize& aSize,
|
||||
uint32_t aFlags)
|
||||
: mSurface(aSurface)
|
||||
, mSize(aSize)
|
||||
, mFlags(aFlags)
|
||||
, mHasOwnOffset(false)
|
||||
{}
|
||||
|
||||
LayerRenderState(SurfaceDescriptor* aSurface, nsIntPoint aOffset, uint32_t aFlags = 0)
|
||||
: mSurface(aSurface)
|
||||
, mFlags(aFlags)
|
||||
, mOffset(aOffset)
|
||||
, mHasOwnOffset(true)
|
||||
{}
|
||||
|
||||
bool YFlipped() const
|
||||
{ return mFlags & LAYER_RENDER_STATE_Y_FLIPPED; }
|
||||
|
||||
bool BufferRotated() const
|
||||
{ return mFlags & LAYER_RENDER_STATE_BUFFER_ROTATION; }
|
||||
#endif
|
||||
|
||||
SurfaceDescriptor* mSurface;
|
||||
void SetOffset(const nsIntPoint& aOffset)
|
||||
{
|
||||
mOffset = aOffset;
|
||||
mHasOwnOffset = true;
|
||||
}
|
||||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
// surface to render
|
||||
android::sp<android::GraphicBuffer> mSurface;
|
||||
// size of mSurface
|
||||
nsIntSize mSize;
|
||||
#endif
|
||||
// see LayerRenderStateFlags
|
||||
uint32_t mFlags;
|
||||
// the location of the layer's origin on mSurface
|
||||
nsIntPoint mOffset;
|
||||
// true if mOffset is applicable
|
||||
bool mHasOwnOffset;
|
||||
};
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ class ImageBridgeChild;
|
||||
class ShadowableLayer;
|
||||
class CompositableForwarder;
|
||||
class CompositableChild;
|
||||
class SurfaceDescriptor;
|
||||
|
||||
/**
|
||||
* CompositableClient manages the texture-specific logic for composite layers,
|
||||
|
||||
@@ -83,6 +83,7 @@ public:
|
||||
|
||||
result.mFlags = (mBufferRotation != nsIntPoint()) ?
|
||||
LAYER_RENDER_STATE_BUFFER_ROTATION : 0;
|
||||
result.SetOffset(GetOriginOffset());
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -78,7 +78,10 @@ public:
|
||||
|
||||
virtual LayerRenderState GetRenderState() MOZ_OVERRIDE
|
||||
{
|
||||
return mTextureHost->GetRenderState();
|
||||
if (mTextureHost) {
|
||||
return mTextureHost->GetRenderState();
|
||||
}
|
||||
return LayerRenderState();
|
||||
}
|
||||
|
||||
virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE;
|
||||
|
||||
@@ -54,10 +54,10 @@ ImageLayerComposite::Disconnect()
|
||||
LayerRenderState
|
||||
ImageLayerComposite::GetRenderState()
|
||||
{
|
||||
if (!mImageHost) {
|
||||
return LayerRenderState();
|
||||
if (mImageHost) {
|
||||
return mImageHost->GetRenderState();
|
||||
}
|
||||
return mImageHost->GetRenderState();
|
||||
return LayerRenderState();
|
||||
}
|
||||
|
||||
Layer*
|
||||
|
||||
@@ -97,8 +97,9 @@ LayerManagerComposite::~LayerManagerComposite()
|
||||
bool
|
||||
LayerManagerComposite::Initialize()
|
||||
{
|
||||
bool result = mCompositor->Initialize();
|
||||
mComposer2D = mCompositor->GetWidget()->GetComposer2D();
|
||||
return mCompositor->Initialize();
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -238,10 +238,9 @@ public:
|
||||
return GetIdentifier() != o.GetIdentifier();
|
||||
}
|
||||
|
||||
LayerRenderState GetRenderState()
|
||||
virtual LayerRenderState GetRenderState()
|
||||
{
|
||||
return LayerRenderState(mBuffer,
|
||||
mFlags & NeedsYFlip ? LAYER_RENDER_STATE_Y_FLIPPED : 0);
|
||||
return LayerRenderState();
|
||||
}
|
||||
|
||||
virtual already_AddRefed<gfxImageSurface> GetAsSurface() = 0;
|
||||
|
||||
@@ -491,14 +491,13 @@ LayerTransactionParent::Attach(ShadowLayerParent* aLayerParent, CompositablePare
|
||||
{
|
||||
LayerComposite* layer = aLayerParent->AsLayer()->AsLayerComposite();
|
||||
MOZ_ASSERT(layer);
|
||||
LayerComposite* layerComposite = aLayerParent->AsLayer()->AsLayerComposite();
|
||||
|
||||
Compositor* compositor
|
||||
= static_cast<LayerManagerComposite*>(aLayerParent->AsLayer()->Manager())->GetCompositor();
|
||||
|
||||
CompositableHost* compositable = aCompositable->GetCompositableHost();
|
||||
MOZ_ASSERT(compositable);
|
||||
layerComposite->SetCompositableHost(compositable);
|
||||
layer->SetCompositableHost(compositable);
|
||||
compositable->Attach(aLayerParent->AsLayer(), compositor);
|
||||
}
|
||||
|
||||
|
||||
@@ -450,8 +450,6 @@ public:
|
||||
|
||||
virtual Layer* GetLayer() = 0;
|
||||
|
||||
virtual LayerRenderState GetRenderState() { return LayerRenderState(); }
|
||||
|
||||
virtual void RenderLayer(int aPreviousFrameBuffer,
|
||||
const nsIntPoint& aOffset) = 0;
|
||||
|
||||
|
||||
@@ -856,6 +856,17 @@ GrallocTextureHostOGL::SetBuffer(SurfaceDescriptor* aBuffer, ISurfaceAllocator*
|
||||
RegisterTextureHostAtGrallocBufferActor(this, *mBuffer);
|
||||
}
|
||||
|
||||
LayerRenderState
|
||||
GrallocTextureHostOGL::GetRenderState()
|
||||
{
|
||||
if (mBuffer && IsSurfaceDescriptorValid(*mBuffer)) {
|
||||
return LayerRenderState(mGraphicBuffer.get(),
|
||||
mBuffer->get_SurfaceDescriptorGralloc().size(),
|
||||
mFlags & NeedsYFlip ? LAYER_RENDER_STATE_Y_FLIPPED : 0);
|
||||
}
|
||||
|
||||
return LayerRenderState();
|
||||
}
|
||||
#endif // MOZ_WIDGET_GONK
|
||||
|
||||
already_AddRefed<gfxImageSurface>
|
||||
|
||||
@@ -641,6 +641,8 @@ public:
|
||||
DeleteTextures();
|
||||
}
|
||||
|
||||
virtual LayerRenderState GetRenderState() MOZ_OVERRIDE;
|
||||
|
||||
private:
|
||||
gl::GLContext* gl() const;
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#include "libdisplay/GonkDisplay.h"
|
||||
#include "Framebuffer.h"
|
||||
#include "HwcComposer2D.h"
|
||||
#include "LayerManagerOGL.h"
|
||||
#include "mozilla/layers/LayerManagerComposite.h"
|
||||
#include "mozilla/layers/PLayerTransaction.h"
|
||||
#include "mozilla/layers/ShadowLayerUtilsGralloc.h"
|
||||
#include "mozilla/StaticPtr.h"
|
||||
@@ -340,15 +340,12 @@ HwcComposer2D::PrepareLayerList(Layer* aLayer,
|
||||
return true;
|
||||
}
|
||||
|
||||
LayerOGL* layerGL = static_cast<LayerOGL*>(aLayer->ImplData());
|
||||
LayerRenderState state = layerGL->GetRenderState();
|
||||
LayerRenderState state = aLayer->GetRenderState();
|
||||
nsIntSize surfaceSize;
|
||||
|
||||
if (state.mSurface &&
|
||||
state.mSurface->type() == SurfaceDescriptor::TSurfaceDescriptorGralloc) {
|
||||
surfaceSize = state.mSurface->get_SurfaceDescriptorGralloc().size();
|
||||
}
|
||||
else {
|
||||
if (state.mSurface.get()) {
|
||||
surfaceSize = state.mSize;
|
||||
} else {
|
||||
if (aLayer->AsColorLayer() && mColorFill) {
|
||||
fillColor = true;
|
||||
} else {
|
||||
@@ -372,8 +369,6 @@ HwcComposer2D::PrepareLayerList(Layer* aLayer,
|
||||
}
|
||||
}
|
||||
|
||||
sp<GraphicBuffer> buffer = fillColor ? nullptr : GrallocBufferActor::GetFrom(*state.mSurface);
|
||||
|
||||
nsIntRect visibleRect = visibleRegion.GetBounds();
|
||||
|
||||
nsIntRect bufferRect;
|
||||
@@ -382,10 +377,10 @@ HwcComposer2D::PrepareLayerList(Layer* aLayer,
|
||||
} else {
|
||||
if(state.mHasOwnOffset) {
|
||||
bufferRect = nsIntRect(state.mOffset.x, state.mOffset.y,
|
||||
surfaceSize.width, surfaceSize.height);
|
||||
state.mSize.width, state.mSize.height);
|
||||
} else {
|
||||
bufferRect = nsIntRect(visibleRect.x, visibleRect.y,
|
||||
surfaceSize.width, surfaceSize.height);
|
||||
state.mSize.width, state.mSize.height);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -401,7 +396,7 @@ HwcComposer2D::PrepareLayerList(Layer* aLayer,
|
||||
return true;
|
||||
}
|
||||
|
||||
buffer_handle_t handle = fillColor ? nullptr : buffer->getNativeBuffer()->handle;
|
||||
buffer_handle_t handle = fillColor ? nullptr : state.mSurface->getNativeBuffer()->handle;
|
||||
hwcLayer.handle = handle;
|
||||
|
||||
hwcLayer.flags = 0;
|
||||
|
||||
Reference in New Issue
Block a user