Bug 862952, Re-enable Composer2D after layers refactoring. r=bjacob,f=diego

This commit is contained in:
Nicholas Cameron
2013-06-06 10:14:51 +12:00
parent 0885fa0a58
commit 8b82c0bda5
12 changed files with 71 additions and 37 deletions

View File

@@ -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;
};

View File

@@ -20,6 +20,7 @@ class ImageBridgeChild;
class ShadowableLayer;
class CompositableForwarder;
class CompositableChild;
class SurfaceDescriptor;
/**
* CompositableClient manages the texture-specific logic for composite layers,

View File

@@ -83,6 +83,7 @@ public:
result.mFlags = (mBufferRotation != nsIntPoint()) ?
LAYER_RENDER_STATE_BUFFER_ROTATION : 0;
result.SetOffset(GetOriginOffset());
return result;
}

View File

@@ -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;

View File

@@ -54,10 +54,10 @@ ImageLayerComposite::Disconnect()
LayerRenderState
ImageLayerComposite::GetRenderState()
{
if (!mImageHost) {
return LayerRenderState();
if (mImageHost) {
return mImageHost->GetRenderState();
}
return mImageHost->GetRenderState();
return LayerRenderState();
}
Layer*

View File

@@ -97,8 +97,9 @@ LayerManagerComposite::~LayerManagerComposite()
bool
LayerManagerComposite::Initialize()
{
bool result = mCompositor->Initialize();
mComposer2D = mCompositor->GetWidget()->GetComposer2D();
return mCompositor->Initialize();
return result;
}
void

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -450,8 +450,6 @@ public:
virtual Layer* GetLayer() = 0;
virtual LayerRenderState GetRenderState() { return LayerRenderState(); }
virtual void RenderLayer(int aPreviousFrameBuffer,
const nsIntPoint& aOffset) = 0;

View File

@@ -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>

View File

@@ -641,6 +641,8 @@ public:
DeleteTextures();
}
virtual LayerRenderState GetRenderState() MOZ_OVERRIDE;
private:
gl::GLContext* gl() const;

View File

@@ -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;